Biblioteca Analisadora SQL para Java [fechada]

141

Existe uma biblioteca Java de código aberto para analisar instruções SQL?

Se possível, ele deve ser personalizável ou flexível o suficiente para também ser capaz de analisar (ou pelo menos ignorar) sintaxe específica do fornecedor (como definições de espaço de tabela Oracle ou cláusula LIMIT do MySQL).

Caso contrário, a adesão estrita ao padrão SQL também é adequada.

Atualização: preciso disso para duas coisas:

  • fornecendo uma interface SQL para um banco de dados não-SQL (mapeamento para chamadas de API internas)
  • reescrevendo o SQL antes de ir para o banco de dados real (por exemplo, Oracle)
Thilo
fonte
109
como essa pergunta não é construtiva? o que há de errado com você, Stackoverflow?
anton1980
11
Esta questão deve ser reaberta. Além disso, found Foundationdb.github.io/sql-parser
kervin
2
Isso não é tópico - solicitações de bibliotecas, ferramentas, tutoriais e outros recursos externos não são considerados tópicos no StackOverflow.
precisa
Eu acho que isso deve ser solicitado em outro site SE #
peterchaula
4
Eu acho que essa pergunta é construtiva !!
Casualet 5/17

Respostas:

51

O ANTLR3 tem uma gramática SQL ANSI disponível. Você pode usar isso para criar seu próprio analisador.

O ANTLR4 possui uma gramática SQL .

duffymo
fonte
5
Por que usar o ANTLR quando você pode implementar seu próprio gerador de analisador?
IAdapter 17/05/10
127
Por que gerar seu próprio gerador de analisador quando você pode usar o ANTLR?
Duffymo 17/05
Algum link para como se pode usar a Antlr SQL Grammar para analisar essas consultas? Examinei a gramática de alguns Analisadores PL / SQL e Lexers e Parsers, mas não consegui entender como usá-lo. Gostaria de receber todos os links.
Abhishek
Você alimenta a gramática com o ANTLR, que cospe as classes lexer / parser que você compila e executa. A melhor fonte que eu posso pensar é a referência ANTLR: amazon.com/...
duffymo
Estamos com a ANTLR 4 agora. Talvez as gramáticas antigas não sejam executadas na nova versão.
Duffymo
34
  • JSqlParser
  • O analisador do Presto é gravado usando ANTLR4 e possui suas próprias classes AST imutáveis, criadas a partir do analisador. O AST tem um visitante e uma impressora bonita.
David Phillips
fonte
Eu tenho uma pergunta para o Presto, se eu tiver a instrução Statement = SQL_PARSER.createStatement (query); Como posso obter o corpo da consulta, ou seja, os valores Select, From, Where, etc?
quarks
Instrução é uma classe base. Uma instrução SELECT será do tipo Consulta. Ele contém um QueryBody que possui a subclasse QuerySpecification. A estrutura é mais complexa do que você espera para oferecer suporte a UNION, TABLE, VALUES, operações de conjunto etc. Você pode criar um visitante estendendo o AstVisitor ou o DefaultTraversalVisitor. Veja SqlFormatter para obter um exemplo de como andar na árvore.
David Phillips
Seria possível obter a estrutura da árvore de consultas de uma determinada consulta usando o Presto?
MockedMan.Object
Não tenho certeza do que você está perguntando. Você pode criar uma nova pergunta com mais detalhes?
David Phillips
9

Analisador

Se você precisar de um analisador, deve haver um analisador na base de código do Apache Derby .

Lidando com SQL específico do fornecedor

Você pode querer examinar o método .native () no objeto Connection do jdbc, que pode ser transmitido a consultas neutras do fornecedor que serão processadas posteriormente em consultas específicas do fornecedor.

Elijah
fonte
Esse método native () parece interessante. Existem exemplos de como ele pode ser usado? Que tipo de conversão é possível lá?
Thilo
@Thilo, por exemplo, SQL Server 2014, Método nativeSQL (SQLServerConnection) : "Este método não é suportado atualmente pelo Driver Microsoft JDBC para SQL Server."
Gerold Broser 22/09
O OracleConnectionWrapper do @Thilo OJDBC parece apoiá-lo.
Gerold Broser 22/09
5

Experimente o Zql

jagamota
fonte
4
O zql é bom para consultas básicas, mas quando você tenta analisar uma consulta que contém a instrução join, ela explode. então eu não sugerir isso
zato
3

O Hibernate usa ANTLR para análise de sql e hql.

O JSqlParser também é uma boa opção. Embora tenha alguns bugs (ou alguns recursos não implementados) ao analisar o oracle pl / sql. consulte o fórum para obter detalhes.

portanto, se você estiver analisando o oracle pl / sql, o ANTLR é recomendado.

Han Zheng
fonte
btw, anltr está sob BSD.
Han Zheng
2

O que você deseja fazer com o SQL analisado? Posso recomendar algumas implementações Java do Lex / Yacc ( BYACC / J , Java Cup ) com as quais você pode usar uma gramática SQL existente.

Se você realmente deseja fazer algo com a gramática analisada resultante, sugiro examinar o Derby , um banco de dados SQL de código aberto escrito em Java.

Thomas Jones-Low
fonte
O analisador SQL usado no Derby está disponível como um JAR independente?
11339 Lluis Martinez
1
Eu não sei. Eu nunca procurei a fonte do Derby.
9788 Thomas Jones-Low
1
Agora eu sei a resposta para esta pergunta: Não, o analisador SQL para Derby não é um projeto separado. Você precisará separá-lo para usá-lo para algo diferente de Derby.
Thomas Jones-Low
1
Voltei novamente após 10 anos :-)
Lluis Martinez