Go package for parsing MySQL SQL queries.
The backbone of this repo is extracted from vitessio/vitess.
Inside vitessio/vitess there is a very nicely written sql parser. However as it's not a self-contained application, I created this one. It applies the same LICENSE as vitessio/vitess.
import ( "github.com/sandeepone/sqlparser" )Then use:
sql:="SELECT * FROM table WHERE a = 'abc'"stmt, err:=sqlparser.Parse(sql) iferr!=nil{// Do something with the err } // Otherwise do something with stmtswitchstmt:=stmt.(type){case*sqlparser.Select: _=stmtcase*sqlparser.Insert: }Alternative to read many queries from a io.Reader:
r:=strings.NewReader("INSERT INTO table1 VALUES (1, 'a'); INSERT INTO table2 VALUES (3, 4);") tokens:=sqlparser.NewTokenizer(r) for{stmt, err:=sqlparser.ParseNext(tokens) iferr==io.EOF{break } // Do something with stmt or err. }See parse_test.go for more examples, or read the godoc.
You only need the below if you plan to try and keep this library up to date with vitessio/vitess.
shopt -s nullglob VITESS=${GOPATH?}/src/vitess.io/vitess/go/ XWB1989=${GOPATH?}/src/github.com/sandeepone/sqlparser/ # Create patches for everything that changed LASTIMPORT=7583ad90af8183cf4393f7fe8bf1774d61578dfc forpathin${VITESS?}/{vt/sqlparser,sqltypes,bytes2,hack};docd${path} git format-patch ${LASTIMPORT?}.done;# Apply patches to the dependenciescd${XWB1989?} git am --directory dependency -p2 ${VITESS?}/{sqltypes,bytes2,hack}/*.patch # Apply the main patches to the repocd${XWB1989?} git am -p4 ${VITESS?}/vt/sqlparser/*.patch # If you encounter diff failures, manually fix them with patch -p4 < .git/rebase-apply/patch ... git add name_of_files git am --continue # Cleanup rm ${VITESS?}/{sqltypes,bytes2,hack}/*.patch ${VITESS?}/*.patch # and Finally update the LASTIMPORT in this README.TODO: Change these instructions to use git to copy the files, that'll make later patching easier.
VITESS=${GOPATH?}/src/vitess.io/vitess/go/ XWB1989=${GOPATH?}/src/github.com/sandeepone/sqlparser/ cd${XWB1989?}# Copy all the code cp -pr ${VITESS?}/vt/sqlparser/ . cp -pr ${VITESS?}/sqltypes dependency cp -pr ${VITESS?}/bytes2 dependency cp -pr ${VITESS?}/hack dependency # Delete some code we haven't ported rm dependency/sqltypes/arithmetic.go dependency/sqltypes/arithmetic_test.go dependency/sqltypes/event_token.go dependency/sqltypes/event_token_test.go dependency/sqltypes/proto3.go dependency/sqltypes/proto3_test.go dependency/sqltypes/query_response.go dependency/sqltypes/result.go dependency/sqltypes/result_test.go # Some automated fixes# Fix imports sed -i '.bak''s_vitess.io/vitess/go/vt/proto/query_github.com/sandeepone/sqlparser/dependency/querypb_g'*.go dependency/sqltypes/*.go sed -i '.bak''s_vitess.io/vitess/go/_github.com/sandeepone/sqlparser/dependency/_g'*.go dependency/sqltypes/*.go # Copy the proto, but basically drop everything we don't want cp -pr ${VITESS?}/vt/proto/query dependency/querypb sed -i '.bak''s_.*Descriptor.*__g' dependency/querypb/*.go sed -i '.bak''s_.*ProtoMessage.*__g' dependency/querypb/*.go sed -i '.bak''s/proto.CompactTextString(m)/"TODO"/g' dependency/querypb/*.go sed -i '.bak''s/proto.EnumName/EnumName/g' dependency/querypb/*.go sed -i '.bak''s/proto.Equal/reflect.DeepEqual/g' dependency/sqltypes/*.go # Remove the error library sed -i '.bak''s/vterrors.Errorf([^,]*, /fmt.Errorf(/g'*.go dependency/sqltypes/*.go sed -i '.bak''s/vterrors.New([^,]*, /errors.New(/g'*.go dependency/sqltypes/*.goVITESS=${GOPATH?}/src/vitess.io/vitess/go/ XWB1989=${GOPATH?}/src/github.com/xwb1989/sqlparser/ cd${XWB1989?}# Test, fix and repeat go test ./... # Finally make some diffs (for later reference) diff -u ${VITESS?}/sqltypes/ ${XWB1989?}/dependency/sqltypes/ >${XWB1989?}/patches/sqltypes.patch diff -u ${VITESS?}/bytes2/ ${XWB1989?}/dependency/bytes2/ >${XWB1989?}/patches/bytes2.patch diff -u ${VITESS?}/vt/proto/query/ ${XWB1989?}/dependency/querypb/ >${XWB1989?}/patches/querypb.patch diff -u ${VITESS?}/vt/sqlparser/ ${XWB1989?}/ >${XWB1989?}/patches/sqlparser.patch