Biblioteka parsera SQL dla języka Java [zamknięta]

141

Czy istnieje biblioteka Java typu open source do analizowania instrukcji SQL?

Jeśli to możliwe, powinien być dostosowywalny lub wystarczająco elastyczny, aby móc analizować (lub przynajmniej ignorować) składnię specyficzną dla dostawcy (na przykład definicje obszarów tabel Oracle lub klauzulę LIMIT MySQL).

Jeśli nie, ścisłe przestrzeganie standardu SQL również jest w porządku.

Aktualizacja: potrzebuję tego z dwóch powodów:

  • udostępnianie interfejsu SQL do bazy danych innej niż SQL (mapowanie na wewnętrzne wywołania API)
  • przepisywanie SQL zanim trafi do aktualnej bazy danych (np. Oracle)
Thilo
źródło
109
dlaczego to pytanie nie jest konstruktywne? co się z tobą dzieje, Stackoverflow?
anton1980
11
To pytanie powinno zostać ponownie otwarte. Znaleziono również Foundationdb.github.io/sql-parser
kervin
2
To nie jest temat - prośby o biblioteki, narzędzia, samouczki i inne zasoby zewnętrzne nie są uznawane za tematyczne dla StackOverflow.
Toby Speight,
Myślę, że należy zadać to pytanie na innej stronie SE
peterchaula
4
Myślę, że to pytanie jest konstruktywne !!
Casualet

Odpowiedzi:

51

ANTLR3 ma dostępną gramatykę ANSI SQL. Możesz użyć tego do stworzenia własnego parsera.

ANTLR4 ma gramatykę SQL .

duffymo
źródło
5
Po co używać ANTLR, skoro można zaimplementować własny generator parserów?
IAdapter
127
Po co generować własny generator parserów, skoro można używać ANTLR?
duffymo
Jakieś linki do tego, jak można użyć gramatyki języka Antlr SQL do analizowania tych zapytań? Przyjrzałem się gramatyce niektórych parserów PL / SQL, a także lekserów i parserów, ale nie byłem w stanie pojąć, jak ich używać. Byłby wdzięczny za wszelkie linki.
Abhishek
Podajesz gramatykę do ANTLR, który wypluwa klasy leksera / parsera, które następnie skompilujesz i uruchomisz. Najlepszym źródłem, jakie
przychodzi mi do głowy,
Jesteśmy teraz do ANTLR 4. Być może stara gramatyka nie działa w nowej wersji.
duffymo
34
  • JSqlParser
  • Parser Presto jest napisany przy użyciu ANTLR4 i ma własne niezmienne klasy AST, które są zbudowane na podstawie parsera. AST ma gościa i ładną drukarkę.
David Phillips
źródło
Mam pytanie do Presto, jeśli mam instrukcję Statement = SQL_PARSER.createStatement (zapytanie); Jak mogę uzyskać treść zapytania, tj. Wartości Wybierz, Od, Gdzie itd.?
kwarki
Instrukcja jest klasą bazową. Instrukcja SELECT będzie typu Query. Zawiera QueryBody, która ma podklasę QuerySpecification. Struktura jest bardziej złożona niż można by się spodziewać w celu obsługi UNION, TABLE, VALUES, operacji na zbiorach itp. Możesz utworzyć gościa, rozszerzając AstVisitor lub DefaultTraversalVisitor. Spójrz na SqlFormatter, aby zobaczyć przykład, jak chodzić po drzewie.
David Phillips,
Czy byłoby możliwe uzyskanie struktury drzewa zapytań z danego zapytania przy użyciu Presto?
MockedMan.Object
Nie jestem pewien, o co pytasz. Czy możesz utworzyć nowe pytanie z bardziej szczegółowymi informacjami?
David Phillips
9

Parser

Jeśli potrzebujesz parsera, w bazie kodu Apache Derby powinien znajdować się parser .

Radzenie sobie z językiem SQL specyficznym dla dostawcy

Możesz przyjrzeć się metodzie .native () w obiekcie jdbc Connection, do której możesz przekazać zapytania niezależne od dostawcy, które zostaną przetworzone na zapytania specyficzne dla dostawców.

Eliasz
źródło
Ta metoda native () wygląda interesująco. Czy są jakieś przykłady, jak można go używać? Jakie rodzaje konwersji są tam możliwe?
Thilo,
@Thilo, np. SQL Server 2014, metoda nativeSQL (SQLServerConnection) : „Ta metoda nie jest obecnie obsługiwana przez sterownik Microsoft JDBC dla programu SQL Server”.
Gerold Broser,
Wygląda na to, że OracleConnectionWrapper firmy @Thilo OJDBC wspiera go.
Gerold Broser,
5

Wypróbuj Zql

jagamot
źródło
4
zql jest dobry w przypadku podstawowych zapytań, ale kiedy próbujesz przeanalizować zapytanie zawierające instrukcję złączenia, wysadza się. więc nie sugeruję tego
zato
3

Hibernate używa ANTLR do analizowania sql i hql.

JSqlParser jest również dobrą opcją, chociaż ma kilka błędów (lub niektóre funkcje nie zaimplementowane) podczas parsowania oracle pl / sql. zobacz jego forum po szczegóły.

więc jeśli analizujesz oracle pl / sql, zalecany jest ANTLR.

Han Zheng
źródło
btw, anltr jest pod BSD.
Han Zheng,
2

Co chcesz zrobić z przeanalizowanym kodem SQL? Mogę polecić kilka implementacji Lex / Yacc w Javie ( BYACC / J , Java Cup ), z którymi możesz wykorzystać istniejącą gramatykę SQL.

Jeśli chcesz coś zrobić z wynikową przeanalizowaną gramatyką, mogę zasugerować przyjrzenie się Derby , otwartej bazie danych SQL napisanej w Javie.

Thomas Jones-Low
źródło
Czy parser SQL używany w Derby jest dostępny jako niezależny plik JAR?
Lluis Martinez
1
Nie wiem Nigdy nie szukałem źródła Derby.
Thomas Jones-Low
1
Teraz znam odpowiedź na to pytanie: Nie, parser SQL dla Derby nie jest oddzielnym projektem. Będziesz musiał go rozebrać, aby użyć go do czegoś innego niż Derby.
Thomas Jones-Low
1
Wróciłem po 10 latach :-)
Lluis Martinez