Thanks for the references Julian and Jim!

On Tuesday, November 26, 2024 at 8:26:07 AM UTC-8 Jim Idle wrote:

I revamped the Go code generation not so long ago - performance is sound 
with reasonably well written grammars, and very good with good grammars. 
Unfortunately the sample grammars for SQL are poor and will give massive 
performance problems with all targets (Java, C++, etc). I decided not to 
spend too much time on optimizing bad grammar specifications. The Go target 
is used extensively within Google.

Writing grammars looks easy because ANTLR will make a parser out of almost 
anything - but when it is written with huge ambiguities, it will explore 
every possible way that an input could be parsed and the performance will 
suffer. Unfortunately, SQL is the type of input where it is very easy to 
write a very ambiguous grammar, and so people have done so. I do not 
recommend using them. The MySQL grammar by Mike Lischke is performant - the 
MySQL one in grammars-v4 should not be used.

I have this available though:

jimidle/tsqlparser: An implementation of an ANTLR4 TSQL grammar at the 
2008R2 spec <https://github.com/jimidle/tsqlparser>
github.com <https://github.com/jimidle/tsqlparser>
[image: apple-touch-icon-180x180-a80b8e11abe2.png] 
<https://github.com/jimidle/tsqlparser> 
<https://github.com/jimidle/tsqlparser>

It should be a reasonable task to cut down to SQLlite from the full TSQL 
spec.

That said, I have not tried the sample grammar for sqlite so I do not know 
what state it is in. You might try it and see what the performance is like 
before changing an existing grammar... [EDIT] - I see that Mike has worked 
on the sqlite grammar, so you may well have a good starting point there,

Jim





On Nov 25, 2024, at 21:30, Julian Peterson <jul...@mantid.org> wrote:

Hi,

For lexer/parser generation, I've used antlr with some success. 
https://www.antlr.org/
The go code generation is a little rough atm, but not a show stopper.

Also, they have grammars for many languages, so they might be useful even 
on their own: https://github.com/antlr/grammars-v4 (sqlite is in there)


Cheers,

Julian



On Tue, 26 Nov 2024 at 05:44, 'Jacob Shandling' via golang-nuts <
golan...@googlegroups.com> wrote:

*> parse the SQLite command, create an AST*

Hello Mr. O'Toole,

This is precisely the task I am looking to carry out, followed by walking 
the AST. Did you ever end up finding a good Go parser for SQLite, or 
building one yourself? I see your rqlite/sql 
<https://pkg.go.dev/github.com/rqlite/sql> package, but am unclear as to 
whether it has this functionality.

Thank you,
Jacob Shandling 

On Tuesday, January 31, 2017 at 10:33:38 PM UTC-8 Philip O'Toole wrote:

Great -- thanks for the reference, I'll take a look.

Philip

On Tue, Jan 31, 2017 at 10:02 AM, Vasiliy Tolstov <v.to...@selfip.ru> wrote:

cznic/ql have own lexer for SQL and it syntax very similar.

31 Янв 2017 г. 16:33 пользователь <phi...@percolate.com> написал:

Hello,

I am the creator of rqlite (https://github.com/rqlite/rqlite), a 
distributed relational database built on SQLite.

I'm looking for a lexer and parser for SQL -- specifically SQLite, to 
improve the ease-of-use of rqlite. I've thought about looking into using 
the C code exposed by the SQLite source itself (which is what 
https://github.com/mattn/go-sqlite3 does more generally). But someone might 
know of a lexer and parser written in Go. I know how to build it myself, 
but would rather avoid the effort if possible.

What I am really trying to do is to determine, for the end-user, whether 
the Exec() (https://golang.org/pkg/database/sql/#DB.Exec)  or Query() (
https://golang.org/pkg/database/sql/#DB.Query) method should be called on 
the standard Go SQL interface, given a user-supplied SQL statement. Right 
now the user must know what type of statement she is executing, and send 
the statements to the right endpoint. I'd really like rqlite to just do the 
right thing, and determine this automatically. Hence my idea to parse the 
SQLite command, create an AST, and work it out.

Or perhaps there is another way of thinking about this?

Thanks,

Philip

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to golang-nuts...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.




-- 
Philip O'Toole
Director, Engineering
Get inspired. See what's new on the Percolate blog: blog.percolate.com


-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to golang-nuts...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/4b82f10e-1790-47f8-9506-9bd996f497bfn%40googlegroups.com
 
<https://groups.google.com/d/msgid/golang-nuts/4b82f10e-1790-47f8-9506-9bd996f497bfn%40googlegroups.com?utm_medium=email&utm_source=footer>
.


-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to golang-nuts...@googlegroups.com.

To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/CALGF0hWTGU8Pa%2BXOPH4XzmGw-c4SBPc2wX6JXVXTUO%3Df5Gukiw%40mail.gmail.com
 
<https://groups.google.com/d/msgid/golang-nuts/CALGF0hWTGU8Pa%2BXOPH4XzmGw-c4SBPc2wX6JXVXTUO%3Df5Gukiw%40mail.gmail.com?utm_medium=email&utm_source=footer>
.


-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/golang-nuts/18ac9a24-f40b-4bd5-b824-9a5a5d9b454an%40googlegroups.com.

Reply via email to