Biblioteca del analizador SQL para Java [cerrado]

141

¿Existe una biblioteca Java de código abierto para analizar sentencias SQL?

Si es posible, debe ser personalizable o lo suficientemente flexible como para poder analizar (o al menos ignorar) la sintaxis específica del proveedor (como las definiciones de espacios de tabla de Oracle o la cláusula LIMIT de MySQL).

Si no, la estricta adherencia al estándar SQL también está bien.

Actualización: necesito esto para dos cosas:

  • Proporcionar una interfaz SQL a una base de datos que no sea SQL (asignación a llamadas API internas)
  • reescribir SQL antes de que vaya a la base de datos real (por ejemplo, Oracle)
Thilo
fuente
109
¿Cómo es que esta pregunta no es constructiva? ¿Qué te pasa, Stackoverflow?
anton1980
11
Esta pregunta debe ser reabierta. Además, se encontró foundationdb.github.io/sql-parser
kervin
2
Esto está fuera del tema: las solicitudes de bibliotecas, herramientas, tutoriales y otros recursos fuera del sitio no se consideran en el tema para StackOverflow.
Toby Speight
Creo que esto debería hacerse en otro sitio de SE
peterchaula
44
¡Creo que esta pregunta es constructiva!
Casualet

Respuestas:

51

ANTLR3 tiene una gramática ANSI SQL disponible. Puede usar eso para crear su propio analizador.

ANTLR4 tiene una gramática SQL .

duffymo
fuente
55
¿Por qué usar ANTLR cuando puede implementar su propio generador de analizadores?
IAdapter
127
¿Por qué generar su propio generador de analizador cuando puede usar ANTLR?
duffymo
¿Algún enlace a cómo se puede usar Antlr SQL Grammar para analizar estas consultas? Miré la gramática de algunos analizadores PL / SQL, así como Lexers y analizadores, pero no pude entender cómo usar uno. Agradecería cualquier enlace.
Abhishek
Alimenta la gramática a ANTLR, que escupe las clases lexer / parser que luego compilará y ejecutará. La mejor fuente que se me ocurre es la referencia de ANTLR: amazon.com/…
duffymo
Estamos hasta ANTLR 4 ahora. Quizás las viejas gramáticas no se ejecutan en la nueva versión.
duffymo
34
  • JSqlParser
  • El analizador de Presto se escribe utilizando ANTLR4 y tiene sus propias clases de AST inmutables que se crean a partir del analizador. El AST tiene un visitante y una bonita impresora.
David Phillips
fuente
Tengo una pregunta para Presto, si tengo instrucción Statement = SQL_PARSER.createStatement (query); ¿Cómo puedo obtener el cuerpo de la consulta, es decir, los valores Seleccionar, De, Dónde, etc.?
Quarks
La declaración es una clase base. Una instrucción SELECT será de tipo Consulta. Contiene un QueryBody que tiene la subclase QuerySpecification. La estructura es más compleja de lo que cabría esperar para admitir UNION, TABLE, VALUES, establecer operaciones, etc. Puede crear un visitante extendiendo AstVisitor o DefaultTraversalVisitor. Mire SqlFormatter para ver un ejemplo de cómo caminar por el árbol.
David Phillips
¿Sería posible obtener la estructura de árbol de consulta de una consulta dada usando Presto?
MockedMan.Object
No estoy seguro de lo que estás preguntando. ¿Puedes crear una nueva pregunta con más detalle?
David Phillips
9

Analizador

Si necesita un analizador, debe haber un analizador en la base de código de Apache Derby .

Tratar con SQL específico del proveedor

Es posible que desee ver el método .native () en el objeto de conexión jdbc, al que puede pasar consultas neutrales del proveedor que se procesarán posteriormente en consultas específicas del proveedor.

Elijah
fuente
Ese método native () parece interesante. ¿Hay ejemplos de cómo se puede usar? ¿Qué tipo de conversiones son posibles allí?
Thilo
@ Thilo, por ejemplo, SQL Server 2014, método nativeSQL (SQLServerConnection) : "Este método no es compatible actualmente con el controlador JDBC de Microsoft para SQL Server".
Gerold Broser
El OracleConnectionWrapper de @Thilo OJDBC parece apoyarlo.
Gerold Broser
5

Prueba Zql

jagamot
fuente
44
zql es bueno para consultas básicas, pero cuando intenta analizar una consulta que contiene una instrucción de unión, explota. así que no lo sugiero
zato
3

Hibernate usa ANTLR para el análisis de sql y hql.

JSqlParser también es una buena opción, aunque tiene algunos errores (o algunas características no implementadas) al analizar oracle pl / sql. ver su foro para más detalles.

así que si está analizando oracle pl / sql, se recomienda ANTLR.

Han Zheng
fuente
por cierto, anltr está bajo BSD.
Han Zheng
2

¿Qué quieres hacer con el SQL analizado? Puedo recomendar algunas implementaciones Java de Lex / Yacc ( BYACC / J , Java Cup ) con las que puede usar una gramática SQL existente.

Si realmente quiere hacer algo con la gramática analizada resultante, podría sugerir que busque en Derby , una base de datos SQL de código abierto escrita en Java.

Thomas Jones-Low
fuente
¿El analizador SQL utilizado en Derby está disponible como un JAR independiente?
Lluis Martinez
1
No lo sé. Nunca he visto la fuente de Derby.
Thomas Jones-Low
1
Ahora sé la respuesta a esta pregunta: No, el analizador SQL para Derby no es un proyecto separado. Necesitarás separarlo para usarlo para algo que no sea Derby.
Thomas Jones-Low
1
Regresé nuevamente después de 10 años :-)
Lluis Martinez