Perpustakaan parser SQL untuk Java [ditutup]

141

Apakah ada perpustakaan Java open-source untuk parsing pernyataan SQL?

Jika mungkin, itu harus disesuaikan atau cukup fleksibel untuk juga dapat mengurai (atau setidaknya mengabaikan) sintaksis khusus vendor (seperti definisi tablespace Oracle atau klausa LIMIT MySQL).

Jika tidak, kepatuhan ketat terhadap standar SQL juga baik-baik saja.

Pembaruan: Saya memerlukan ini untuk dua hal:

  • menyediakan antarmuka SQL ke basis data non-SQL (pemetaan ke panggilan API internal)
  • menulis ulang SQL sebelum masuk ke database aktual (mis. Oracle)
Thilo
sumber
109
bagaimana pertanyaan ini tidak konstruktif? apa yang salah denganmu, Stackoverflow?
anton1980
11
Pertanyaan ini harus dibuka kembali. Juga, ditemukan foundationdb.github.io/sql-parser
kervin
2
Ini di luar topik - permintaan untuk perpustakaan, alat, tutorial, dan sumber daya di luar situs lainnya tidak dianggap sebagai topik untuk StackOverflow.
Toby Speight
Saya pikir ini harus ditanyakan di situs SE lain
peterchaula
4
Saya pikir pertanyaan ini konstruktif !!
Casualet

Jawaban:

51

ANTLR3 memiliki tata bahasa SQL ANSI yang tersedia. Anda dapat menggunakannya untuk membuat parser Anda sendiri.

ANTLR4 memiliki tata bahasa SQL .

Duffymo
sumber
5
Mengapa menggunakan ANTLR ketika Anda dapat mengimplementasikan generator parser Anda sendiri?
IAdapter
127
Mengapa menghasilkan generator parser Anda sendiri saat Anda dapat menggunakan ANTLR?
duffymo
Adakah tautan ke bagaimana seseorang dapat menggunakan Antlr SQL Grammar untuk mem-parsing kueri ini? Saya melihat tata bahasa dari beberapa PL / SQL Parsers serta Lexers dan Parsers tetapi tidak dapat memahami bagaimana cara menggunakannya. Sangat menghargai tautan apa pun.
Abhishek
Anda memberi makan tata bahasa ke ANTLR, yang memuntahkan kelas lexer / parser yang kemudian akan Anda kompilasi dan jalankan. Sumber terbaik yang dapat saya pikirkan adalah referensi ANTLR: amazon.com/…
duffymo
Kami hingga ANTLR 4 sekarang. Mungkin tata bahasa lama tidak berjalan di versi baru.
duffymo
34
  • JSqlParser
  • Parser Presto ditulis menggunakan ANTLR4 dan memiliki kelas AST abadi yang dibangun dari parser. AST memiliki pengunjung dan printer cantik.
David Phillips
sumber
Saya punya pertanyaan untuk Presto, Jika saya memiliki Pernyataan pernyataan = SQL_PARSER.createStatement (permintaan); Bagaimana saya bisa mendapatkan badan Query, yaitu nilai Select, From, Where, dll?
quark
Pernyataan adalah kelas dasar. Pernyataan SELECT akan bertipe Query. Ini berisi QueryBody yang memiliki subclass QuerySpecification. Struktur ini lebih kompleks daripada yang Anda harapkan untuk mendukung UNION, TABLE, VALUES, mengatur operasi, dll. Anda dapat membuat pengunjung dengan memperluas AstVisitor atau DefaultTraversalVisitor. Lihatlah SqlFormatter untuk contoh cara berjalan pohon.
David Phillips
Apakah mungkin untuk mendapatkan struktur hierarki permintaan dari kueri yang diberikan menggunakan Presto?
MockedMan.Object
Saya tidak yakin apa yang Anda tanyakan. Bisakah Anda membuat pertanyaan baru dengan lebih detail?
David Phillips
9

Parser

Jika Anda membutuhkan parser, harus ada parser di basis kode Apache Derby .

Berurusan dengan SQL khusus vendor

Anda mungkin ingin melihat metode .native () pada objek Koneksi jdbc yang dapat Anda berikan kepada vendor query netral yang akan mendapatkan postprocessed ke dalam query spesifik vendor.

Elia
sumber
Metode asli () itu terlihat menarik. Apakah ada contoh bagaimana cara menggunakannya? Konversi macam apa yang mungkin ada di sana?
Thilo
@ Thilo misalnya SQL Server 2014, Metode nativeSQL (SQLServerConnection) : "Metode ini saat ini tidak didukung oleh Microsoft JDBC Driver untuk SQL Server."
Gerold Broser
@Thilo OJDBC's OracleConnectionWrapper sepertinya mendukungnya.
Gerold Broser
5

Coba Zql

jagamot
sumber
4
zql bagus untuk kueri dasar tetapi ketika Anda mencoba mengurai kueri yang berisi pernyataan bergabung, itu meledak. jadi saya tidak menyarankan itu
zato
3

Hibernate menggunakan ANTLR untuk parsing sql dan hql.

JSqlParser juga merupakan pilihan yang baik. Meskipun memiliki beberapa bug (atau beberapa fitur tidak diimplementasikan) saat mengurai oracle pl / sql. lihat forumnya untuk detail.

jadi jika Anda parsing oracle pl / sql, ANTLR disarankan.

Han Zheng
sumber
btw, anltr berada di bawah BSD.
Han Zheng
2

Apa yang ingin Anda lakukan dengan SQL yang diuraikan? Saya dapat merekomendasikan beberapa implementasi Java dari Lex / Yacc ( BYACC / J , Java Cup ) agar Anda dapat menggunakan tata bahasa SQL yang sudah ada.

Jika Anda ingin benar-benar melakukan sesuatu dengan tata bahasa parsing yang dihasilkan, saya mungkin menyarankan untuk melihat Derby , sumber SQL database terbuka yang ditulis dalam Java.

Thomas Jones-Low
sumber
Apakah parser SQL yang digunakan dalam Derby tersedia sebagai JAR independen?
Lluis Martinez
1
Saya tidak tahu Saya tidak pernah melihat sumber untuk Derby.
Thomas Jones-Low
1
Saya sekarang tahu jawaban untuk pertanyaan ini: Tidak, parser SQL untuk Derby bukan proyek terpisah. Anda harus memisahkannya untuk menggunakannya selain Derby.
Thomas Jones-Low
1
Saya kembali lagi setelah 10 tahun :-)
Lluis Martinez