From eb5266df7a09ee0c5e5f25c09c1d8821259d77af Mon Sep 17 00:00:00 2001 From: Daniel Simmons Date: Tue, 10 May 2022 11:15:49 +0200 Subject: [PATCH] Add support for CHANGE COLUMN in MySQL --- .../mysql/go/db.go | 31 +++++++++++++++++++ .../mysql/go/models.go | 13 ++++++++ .../mysql/go/query.sql.go | 19 ++++++++++++ .../mysql/query.sql | 2 ++ .../mysql/schema.sql | 2 ++ .../mysql/sqlc.json | 12 +++++++ internal/engine/dolphin/convert.go | 24 +++++++++++++- 7 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/db.go create mode 100644 internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/models.go create mode 100644 internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/query.sql.go create mode 100644 internal/endtoend/testdata/ddl_alter_table_change_column/mysql/query.sql create mode 100644 internal/endtoend/testdata/ddl_alter_table_change_column/mysql/schema.sql create mode 100644 internal/endtoend/testdata/ddl_alter_table_change_column/mysql/sqlc.json diff --git a/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/db.go b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/db.go new file mode 100644 index 0000000000..36ef5f4f45 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.13.0 + +package querytest + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/models.go b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/models.go new file mode 100644 index 0000000000..c6ada582c3 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/models.go @@ -0,0 +1,13 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.13.0 + +package querytest + +import ( + "database/sql" +) + +type Foo struct { + Baz sql.NullString +} diff --git a/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/query.sql.go b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/query.sql.go new file mode 100644 index 0000000000..6070d0b2f4 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/go/query.sql.go @@ -0,0 +1,19 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.13.0 +// source: query.sql + +package querytest + +import ( + "context" +) + +const placeholder = `-- name: Placeholder :exec +SELECT 1 +` + +func (q *Queries) Placeholder(ctx context.Context) error { + _, err := q.db.ExecContext(ctx, placeholder) + return err +} diff --git a/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/query.sql b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/query.sql new file mode 100644 index 0000000000..bb628f9251 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/query.sql @@ -0,0 +1,2 @@ +/* name: Placeholder :exec */ +SELECT 1; diff --git a/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/schema.sql b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/schema.sql new file mode 100644 index 0000000000..df60e48b23 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/schema.sql @@ -0,0 +1,2 @@ +CREATE TABLE foo (bar text); +ALTER TABLE foo CHANGE COLUMN bar baz text; diff --git a/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/sqlc.json b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/sqlc.json new file mode 100644 index 0000000000..e41c39e8b3 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_change_column/mysql/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "mysql", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/engine/dolphin/convert.go b/internal/engine/dolphin/convert.go index 053b1f549c..632b38ea1f 100644 --- a/internal/engine/dolphin/convert.go +++ b/internal/engine/dolphin/convert.go @@ -68,7 +68,29 @@ func (c *cc) convertAlterTableStmt(n *pcast.AlterTableStmt) ast.Node { }) case pcast.AlterTableChangeColumn: - // spew.Dump("change column", spec) + oldName := spec.OldColumnName.String() + alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{ + Name: &oldName, + Subtype: ast.AT_DropColumn, + }) + + for _, def := range spec.NewColumns { + name := def.Name.String() + columnDef := ast.ColumnDef{ + Colname: def.Name.String(), + TypeName: &ast.TypeName{Name: types.TypeStr(def.Tp.Tp)}, + IsNotNull: isNotNull(def), + } + if def.Tp.Flen >= 0 { + length := def.Tp.Flen + columnDef.Length = &length + } + alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{ + Name: &name, + Subtype: ast.AT_AddColumn, + Def: &columnDef, + }) + } case pcast.AlterTableModifyColumn: for _, def := range spec.NewColumns {