Bibliothèque d'analyseur SQL pour Java [fermé]

141

Existe-t-il une bibliothèque Java open source pour analyser les instructions SQL?

Si possible, il doit être personnalisable ou suffisamment flexible pour pouvoir également analyser (ou au moins ignorer) la syntaxe spécifique au fournisseur (comme les définitions d'espace de table Oracle ou la clause LIMIT de MySQL).

Sinon, le strict respect de la norme SQL est également très bien.

Mise à jour: j'en ai besoin pour deux choses:

  • fournir une interface SQL à une base de données non SQL (mappage vers des appels d'API internes)
  • réécriture de SQL avant qu'il n'aille dans la base de données réelle (par exemple, Oracle)
Thilo
la source
109
en quoi cette question n'est-elle pas constructive? quel est le problème avec vous, Stackoverflow?
anton1980
11
Cette question devrait être rouverte. Aussi, trouvé foundationdb.github.io/sql-parser
kervin
2
C'est hors sujet - les demandes de bibliothèques, d'outils, de didacticiels et d'autres ressources hors site ne sont pas considérées comme pertinentes pour StackOverflow.
Toby Speight
Je pense que cela devrait être demandé sur un autre site SE
peterchaula
4
Je pense que cette question est constructive !!
Casualet

Réponses:

51

ANTLR3 a une grammaire ANSI SQL disponible. Vous pouvez l'utiliser pour créer votre propre analyseur.

ANTLR4 a une grammaire SQL .

duffymo
la source
5
Pourquoi utiliser ANTLR lorsque vous pouvez implémenter votre propre générateur d'analyseur?
IAdapter
127
Pourquoi générer votre propre générateur d'analyseur quand vous pouvez utiliser ANTLR?
duffymo
Des liens vers comment utiliser Antlr SQL Grammar pour analyser ces requêtes? J'ai regardé la grammaire de certains analyseurs PL / SQL ainsi que des Lexers et des analyseurs, mais je n'ai pas pu comprendre comment en utiliser un. J'apprécierais tous les liens.
Abhishek le
Vous transmettez la grammaire à ANTLR, qui crache les classes lexer / parser que vous compilerez et exécuterez ensuite. La meilleure source à laquelle je puisse penser est la référence ANTLR: amazon.com
...
Nous en sommes à ANTLR 4 maintenant. Peut-être que les anciennes grammaires ne fonctionnent pas sur la nouvelle version.
duffymo
34
  • JSqlParser
  • L'analyseur de Presto est écrit en utilisant ANTLR4 et possède ses propres classes AST immuables qui sont construites à partir de l'analyseur. L'AST a un visiteur et une jolie imprimante.
David Phillips
la source
J'ai une question pour Presto, si j'ai Statement statement = SQL_PARSER.createStatement (query); Comment puis-je obtenir le corps de la requête, c'est-à-dire les valeurs Select, From, Where, etc.?
quarks
Statement est une classe de base. Une instruction SELECT sera de type Requête. Il contient un QueryBody qui a la sous-classe QuerySpecification. La structure est plus complexe que ce à quoi vous pourriez vous attendre afin de prendre en charge UNION, TABLE, VALUES, les opérations d'ensemble, etc. Vous pouvez créer un visiteur en étendant AstVisitor ou DefaultTraversalVisitor. Regardez SqlFormatter pour un exemple de comment marcher dans l'arbre.
David Phillips
Serait-il possible d'obtenir l'arborescence des requêtes à partir d'une requête donnée à l'aide de Presto?
MockedMan.Object
Je ne sais pas ce que vous demandez. Pouvez-vous créer une nouvelle question avec plus de détails?
David Phillips
9

Analyseur

Si vous avez besoin d'un analyseur, il devrait y avoir un analyseur dans la base de code d' Apache Derby .

Gérer le SQL spécifique au fournisseur

Vous pouvez consulter la méthode .native () sur l'objet Connection jdbc à laquelle vous pouvez lui transmettre des requêtes indépendantes du fournisseur qui seront post-traitées en requêtes spécifiques au fournisseur.

Élie
la source
Cette méthode native () semble intéressante. Y a-t-il des exemples de la manière dont il peut être utilisé? Quels types de conversions sont possibles là-bas?
Thilo
@Thilo par exemple SQL Server 2014, méthode nativeSQL (SQLServerConnection) : "Cette méthode n'est actuellement pas prise en charge par le pilote Microsoft JDBC pour SQL Server."
Gerold Broser
OracleConnectionWrapper de @Thilo OJDBC semble le supporter.
Gerold Broser
5

Essayez Zql

jagamot
la source
4
zql convient aux requêtes de base, mais lorsque vous essayez d'analyser une requête contenant une instruction de jointure, elle explose. donc je ne le suggère pas
zato
3

Hibernate utilise ANTLR pour l'analyse SQL et hql.

JSqlParser est également une bonne option, bien qu'il ait quelques bogues (ou certaines fonctionnalités non implémentées) lors de l'analyse d'Oracle pl / sql. voir son forum pour plus de détails.

donc si vous analysez oracle pl / sql, ANTLR est recommandé.

Han Zheng
la source
btw, anltr est sous BSD.
Han Zheng
2

Que voulez-vous faire avec le SQL analysé? Je peux recommander quelques implémentations Java de Lex / Yacc ( BYACC / J , Java Cup ) avec lesquelles vous pouvez utiliser une grammaire SQL existante.

Si vous voulez réellement faire quelque chose avec la grammaire analysée résultante, je pourrais suggérer de regarder Derby , une base de données SQL open source écrite en Java.

Thomas Jones-Low
la source
L'analyseur SQL utilisé dans Derby est-il disponible en tant que JAR indépendant?
Lluis Martinez
1
Je ne sais pas. Je n'ai jamais regardé la source de Derby.
Thomas Jones-Low
1
Je connais maintenant la réponse à cette question: non, l'analyseur SQL pour Derby n'est pas un projet séparé. Vous aurez besoin de le séparer pour l'utiliser pour autre chose que Derby.
Thomas Jones-Low
1
Je suis revenu après 10 ans :-)
Lluis Martinez