Parser SQL em java

gente estou a fazer um programa no qual o usuário pode escrever suas consultas no banco de dados, e eu preciso validar isso (sua sintaxe somente) tem algum parse que faz isso em java? alguém tem uma dica?

Olá

Acho que você usar expressao regular deve ficar interessante a validação
http://www.piazinho.com.br/

Ps. Algumas adaptações devem ser feita, mas em termos todos os conceitos são válidos

Espero ter ajudado
Flwsss

[quote=thiago.filadelfo]Olá

Acho que você usar expressao regular deve ficar interessante a validação
http://www.piazinho.com.br/

Ps. Algumas adaptações devem ser feita, mas em termos todos os conceitos são válidos

Espero ter ajudado
Flwsss [/quote]

bom desculpa pergunta, mas meu conhecimento de expressões regulares é bem baixo, como o uso de expressões regulares pode ser útil para o meu caso? compensa comprar este livro que vc me passou realmente?

Olá

Então não precisa comprar o livro, tem uma sessão de exemplos que explica sua funcionalidade.

Como a expressão regular pode fazer para te ajudar é validar “sintaxicamente”.
Por exemplo:

REGEX: SELECT\s(*|\w+)\sFROM\s(\w+);
O que validaria: SELECT * FROM tabela; ou SELECT nome FROM tabela

Caso você escreva SELEC * FROM tabela, ele acusa erro de sintaxe. Por dois motivos não terminou com ponto e virgula (:wink: e escreveu SELEC ao invez de SELECT…
assim por diante…

No site que passei tem o livro, mas tem uma parte bastante vasta de exemplo, acho legal dar uma olhada.

ok!?

[quote=thiago.filadelfo]Olá

Então não precisa comprar o livro, tem uma sessão de exemplos que explica sua funcionalidade.

Como a expressão regular pode fazer para te ajudar é validar “sintaxicamente”.
Por exemplo:

REGEX: SELECT\s(*|\w+)\sFROM\s(\w+);
O que validaria: SELECT * FROM tabela; ou SELECT nome FROM tabela;

Caso você escreva SELEC * FROM tabela, ele acusa erro de sintaxe. Por dois motivos não terminou com ponto e virgula (:wink: e escreveu SELEC ao invez de SELECT…
assim por diante…

No site que passei tem o livro, mas tem uma parte bastante vasta de exemplo, acho legal dar uma olhada.

ok!?
[/quote]

humm estou compreendendo, parece ser mesmo interessante! no livro ele fala sobre o SQLite, quer dizer q ele implementa regex pra ele é isso?

Primeiramente desculpe por responder duas vezes, acabei apertando o botao errado.

Infelizamente não aborda SQLite como banco de dados, mas ele aborda somente expressao regular.

Que pode ser usado para fazer validações ou até mesmo “splits”.
Expressao regular é bem poderosa, mas custa bastante para o processamento.

Fiz uma projeto em ME os scripts sql são validados e processados através de expressão regular.

humm entendi, acho que vou comprar este livro!

enfim com expressões regulares eu saberia se ele tentou consultar tabela que não existia, erros de sintaxe como: não fechamento de parameteses, aspas, uso errado do and, not, or e xor… e outras coisas mais?

Sim… pode ser feito isso!!

Basta usar esses parenteses… no exemplo que passei
REGEX: SELECT\sb[/b]\sFROM\sb[/b];

Para expressao regular casa parenteses quer dizer um agrupamento… dai se fizer assim

agrupamento 1 terá: * ou nome,sobrenome
agrupamento 2 terá: tabela <- quer dizer qual tabela esta querendo buscar…

Mas torna mais complexo a medida que for querendo mais detalhes da expressao (String - script)…

Espero que goste e até que sirva a dica…

Flwsss

Que tal:

PreparedStatement st = conn.prepareStatement(stringPassadaPeloUsuario);

Se seu banco de dados suportar, este passo já irá validar a sintaxe da consulta SQL ou, se ela estiver errada, lançar uma exceção. RegEx só vai resolver os casos das consultas mais simples. Se for o seu caso, tudo bem, mas lembre-se de que cada banco tem funções próprias, extensões ao SQL, etc. Capturar e manter as expressões regulares provavelmente vai ser um pesadelo.

No meu caso não estou trabalhando com SGBD, e sim “montando” uma sintaxe para enviar ao um programa externo que trabalha com uma linguagem bem parecida com a SQL (só com algumas diferenças básicas como por exemplo a ausencia da clausula GROUP BY)

então creio que REGEX seja a melhor saída… ou vc propõe outra alternativa?

[quote=anderson_lp789]No meu caso não estou trabalhando com SGBD, e sim “montando” uma sintaxe para enviar ao um programa externo que trabalha com uma linguagem bem parecida com a SQL (só com algumas diferenças básicas como por exemplo a ausencia da clausula GROUP BY)

então creio que REGEX seja a melhor saída… ou vc propõe outra alternativa?[/quote]

O melhor é vc. definir o subset SQL de maneira formal e usar uma ferramenta que gere o parser para vc. Veja o link abaixo para um exemplo de como isto pode ser feito em Java:

http://www.antlr.org/

Na página abaixo existem vários exemplos de gramáticas já criadas, inclusive de SQL:

http://www.antlr.org/grammar/list

humm parece ser interessante, com a gramática definida como eu faço pra validar se está tudo correto…

por exemplo eu escrevo a consulta que eu quero, e vou validar ela como daih? não entendi isso… vi alguns exemplos em C mas e em java? obrigado pela atenção e dica

humm legal, vou ler todo o conteúdo. Qualquer coisa eu aviso! serve pra eu pegar idéias de como implementar, porém acho que vou fazer isso usando regex e idéias deste material que me passaste. Obrigado