diff --git a/go.mod b/go.mod index 5e1d55fe72..6e7a495561 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,18 @@ require ( github.com/lib/pq v1.10.6 github.com/mattn/go-sqlite3 v1.14.13 github.com/pganalyze/pg_query_go/v2 v2.1.2 - github.com/pingcap/parser v0.0.0-20210914110036-002913dd28ec github.com/spf13/cobra v1.5.0 github.com/spf13/pflag v1.0.5 google.golang.org/protobuf v1.28.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) +require ( + github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect + golang.org/x/exp v0.0.0-20220428152302-39d4317da171 // indirect +) + require ( github.com/golang/protobuf v1.5.2 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect @@ -33,6 +38,7 @@ require ( github.com/kr/pretty v0.2.1 // indirect github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 // indirect github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 // indirect + github.com/pingcap/tidb/parser v0.0.0-20220725134311-c80026e61f00 github.com/pkg/errors v0.9.1 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.7.0 // indirect diff --git a/go.sum b/go.sum index a937e71836..2e2f7d3647 100644 --- a/go.sum +++ b/go.sum @@ -13,18 +13,13 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM= -github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= -github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= -github.com/cznic/y v0.0.0-20170802143616-045f81c6662a/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -123,21 +118,19 @@ github.com/mattn/go-sqlite3 v1.14.13 h1:1tj15ngiFfcZzii7yd82foL+ks+ouQcj8j/TPq3f github.com/mattn/go-sqlite3 v1.14.13/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/pganalyze/pg_query_go/v2 v2.1.2 h1:LiNm3WoBV/cc144X6jlVKD5DPL+fI2wfvCXT7z25B8U= github.com/pganalyze/pg_query_go/v2 v2.1.2/go.mod h1:XAxmVqz1tEGqizcQ3YSdN90vCOHBWjJi8URL1er5+cA= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= -github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 h1:SvWCbCPh1YeHd9yQLksvJYAgft6wLTY1aNG81tpyscQ= github.com/pingcap/log v0.0.0-20210906054005-afc726e70354/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= -github.com/pingcap/parser v0.0.0-20210914110036-002913dd28ec h1:tUcualrzARkmDCM4OGT27cEnjDyAN1MW5AoZqmTCITA= -github.com/pingcap/parser v0.0.0-20210914110036-002913dd28ec/go.mod h1:+xcMiiZzdIktT/Nqdfm81dkECJ2EPuoAYywd57py4Pk= +github.com/pingcap/tidb/parser v0.0.0-20220725134311-c80026e61f00 h1:aDC/yAGx/jPEyrX+UPKV3GWg+4A4yG8ifuP6jBEhDi0= +github.com/pingcap/tidb/parser v0.0.0-20220725134311-c80026e61f00/go.mod h1:wjvp+T3/T9XYt0nKqGX3Kc1AKuyUcfno6LTc6b2A6ew= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -185,7 +178,6 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= @@ -203,6 +195,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= diff --git a/internal/engine/dolphin/catalog_test.go b/internal/engine/dolphin/catalog_test.go new file mode 100644 index 0000000000..e7aab70754 --- /dev/null +++ b/internal/engine/dolphin/catalog_test.go @@ -0,0 +1,96 @@ +package dolphin + +import ( + "errors" + "strconv" + "strings" + "testing" + + "github.com/kyleconroy/sqlc/internal/sql/sqlerr" + + "github.com/google/go-cmp/cmp" +) + +func TestUpdateErrors(t *testing.T) { + p := NewParser() + for i, tc := range []struct { + stmt string + err *sqlerr.Error + }{ + { + ` + CREATE TABLE foo (bar int); + CREATE TABLE foo (bar int); + `, + sqlerr.RelationExists("foo"), + }, + } { + test := tc + t.Run(strconv.Itoa(i), func(t *testing.T) { + stmts, err := p.Parse(strings.NewReader(test.stmt)) + if err != nil { + t.Log(test.stmt) + t.Fatal(err) + } + + c := NewCatalog() + err = c.Build(stmts) + if err == nil { + t.Log(test.stmt) + t.Fatal("err was nil") + } + + var actual *sqlerr.Error + if !errors.As(err, &actual) { + t.Fatalf("err is not *sqlerr.Error: %#v", err) + } + + if diff := cmp.Diff(test.err.Error(), actual.Error()); diff != "" { + t.Log(test.stmt) + t.Errorf("error mismatch: \n%s", diff) + } + }) + } +} + +func TestSuccessfulUpdate(t *testing.T) { + p := NewParser() + for i, tc := range []struct { + stmt string + }{ + { + ` + CREATE TABLE authors ( + id INT PRIMARY KEY, + name text NOT NULL, + bio text NOT NULL DEFAULT (bio_func()) + ); + `, + }, + { + ` + CREATE TABLE IF NOT EXISTS organizations +( + id VARCHAR(36) DEFAULT (UUID()) NOT NULL PRIMARY KEY +); + `, + }, + } { + test := tc + t.Run(strconv.Itoa(i), func(t *testing.T) { + stmts, err := p.Parse(strings.NewReader(test.stmt)) + if err != nil { + t.Log(test.stmt) + t.Fatal(err) + } + + c := NewCatalog() + err = c.Build(stmts) + if err != nil { + t.Log(test.stmt) + t.Log(err) + t.Fatal("err should have been nil") + } + }) + } +} diff --git a/internal/engine/dolphin/convert.go b/internal/engine/dolphin/convert.go index da1050551a..c2b3464f98 100644 --- a/internal/engine/dolphin/convert.go +++ b/internal/engine/dolphin/convert.go @@ -5,10 +5,10 @@ import ( "log" "strings" - pcast "github.com/pingcap/parser/ast" - "github.com/pingcap/parser/opcode" - driver "github.com/pingcap/parser/test_driver" - "github.com/pingcap/parser/types" + pcast "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/opcode" + driver "github.com/pingcap/tidb/parser/test_driver" + "github.com/pingcap/tidb/parser/types" "github.com/kyleconroy/sqlc/internal/debug" "github.com/kyleconroy/sqlc/internal/sql/ast" @@ -45,11 +45,11 @@ func (c *cc) convertAlterTableStmt(n *pcast.AlterTableStmt) ast.Node { name := def.Name.String() columnDef := ast.ColumnDef{ Colname: def.Name.String(), - TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.Tp)}, + TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.GetType())}, IsNotNull: isNotNull(def), } - if def.Tp.Flen >= 0 { - length := def.Tp.Flen + if def.Tp.GetFlen() >= 0 { + length := def.Tp.GetFlen() columnDef.Length = &length } alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{ @@ -78,11 +78,11 @@ func (c *cc) convertAlterTableStmt(n *pcast.AlterTableStmt) ast.Node { name := def.Name.String() columnDef := ast.ColumnDef{ Colname: def.Name.String(), - TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.Tp)}, + TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.GetType())}, IsNotNull: isNotNull(def), } - if def.Tp.Flen >= 0 { - length := def.Tp.Flen + if def.Tp.GetFlen() >= 0 { + length := def.Tp.GetFlen() columnDef.Length = &length } alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{ @@ -97,11 +97,11 @@ func (c *cc) convertAlterTableStmt(n *pcast.AlterTableStmt) ast.Node { name := def.Name.String() columnDef := ast.ColumnDef{ Colname: def.Name.String(), - TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.Tp)}, + TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.GetType())}, IsNotNull: isNotNull(def), } - if def.Tp.Flen >= 0 { - length := def.Tp.Flen + if def.Tp.GetFlen() >= 0 { + length := def.Tp.GetFlen() columnDef.Length = &length } alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{ @@ -247,11 +247,11 @@ func (c *cc) convertCreateTableStmt(n *pcast.CreateTableStmt) ast.Node { } for _, def := range n.Cols { var vals *ast.List - if len(def.Tp.Elems) > 0 { + if len(def.Tp.GetElems()) > 0 { vals = &ast.List{} - for i := range def.Tp.Elems { + for i := range def.Tp.GetElems() { vals.Items = append(vals.Items, &ast.String{ - Str: def.Tp.Elems[i], + Str: def.Tp.GetElems()[i], }) } } @@ -266,13 +266,13 @@ func (c *cc) convertCreateTableStmt(n *pcast.CreateTableStmt) ast.Node { } columnDef := ast.ColumnDef{ Colname: def.Name.String(), - TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.Tp)}, + TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.GetType())}, IsNotNull: isNotNull(def), Comment: comment, Vals: vals, } - if def.Tp.Flen >= 0 { - length := def.Tp.Flen + if def.Tp.GetFlen() >= 0 { + length := def.Tp.GetFlen() columnDef.Length = &length } create.Cols = append(create.Cols, &columnDef) @@ -763,7 +763,7 @@ func (c *cc) convertCreateBindingStmt(n *pcast.CreateBindingStmt) ast.Node { func (c *cc) convertCreateDatabaseStmt(n *pcast.CreateDatabaseStmt) ast.Node { return &ast.CreateSchemaStmt{ - Name: &n.Name, + Name: &n.Name.O, IfNotExists: n.IfNotExists, } } @@ -819,7 +819,7 @@ func (c *cc) convertDropDatabaseStmt(n *pcast.DropDatabaseStmt) ast.Node { return &ast.DropSchemaStmt{ MissingOk: !n.IfExists, Schemas: []*ast.String{ - NewIdentifier(n.Name), + NewIdentifier(n.Name.O), }, } } @@ -1076,10 +1076,6 @@ func (c *cc) convertPatternRegexpExpr(n *pcast.PatternRegexpExpr) ast.Node { return todo(n) } -func (c *cc) convertPlacementSpec(n *pcast.PlacementSpec) ast.Node { - return todo(n) -} - func (c *cc) convertPositionExpr(n *pcast.PositionExpr) ast.Node { return todo(n) } @@ -1626,9 +1622,6 @@ func (c *cc) convert(node pcast.Node) ast.Node { case *pcast.PatternRegexpExpr: return c.convertPatternRegexpExpr(n) - case *pcast.PlacementSpec: - return c.convertPlacementSpec(n) - case *pcast.PositionExpr: return c.convertPositionExpr(n) diff --git a/internal/engine/dolphin/parse.go b/internal/engine/dolphin/parse.go index 5bcf524a24..3635d4cb11 100644 --- a/internal/engine/dolphin/parse.go +++ b/internal/engine/dolphin/parse.go @@ -7,8 +7,8 @@ import ( "strconv" "strings" - "github.com/pingcap/parser" - _ "github.com/pingcap/parser/test_driver" + "github.com/pingcap/tidb/parser" + _ "github.com/pingcap/tidb/parser/test_driver" "github.com/kyleconroy/sqlc/internal/metadata" "github.com/kyleconroy/sqlc/internal/sql/ast" diff --git a/internal/engine/dolphin/utils.go b/internal/engine/dolphin/utils.go index 6ea8021c5d..d39d189afc 100644 --- a/internal/engine/dolphin/utils.go +++ b/internal/engine/dolphin/utils.go @@ -1,7 +1,7 @@ package dolphin import ( - pcast "github.com/pingcap/parser/ast" + pcast "github.com/pingcap/tidb/parser/ast" "github.com/kyleconroy/sqlc/internal/sql/ast" )