Skip to content

Commit d354c0e

Browse files
authored
feat(sql/catalog): Support ALTER TABLE IF EXISTS (#2542)
* feat(sql/catalog): ALTER TABLE IF EXISTS * Remove debug statements * Remove print statement
1 parent 05bae41 commit d354c0e

File tree

23 files changed

+272
-17
lines changed

23 files changed

+272
-17
lines changed

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/pgx/v4/go/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/pgx/v4/go/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/pgx/v4/go/query.sql.go

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: Placeholder :exec
2+
SELECT 1;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ALTER TABLE IF EXISTS foo ADD COLUMN bar integer;
2+
ALTER TABLE IF EXISTS bar RENAME COLUMN bar TO baz;
3+
ALTER TABLE IF EXISTS bat RENAME CONSTRAINT bar TO baz;
4+
ALTER TABLE IF EXISTS baz RENAME TO bar;
5+
ALTER TABLE IF EXISTS goo SET SCHEMA bar;
6+
ALTER TABLE IF EXISTS gob ATTACH PARTITION partition_name DEFAULT;
7+
ALTER TABLE IF EXISTS doo DETACH PARTITION partition_name;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"sql_package": "pgx/v4",
8+
"name": "querytest",
9+
"schema": "schema.sql",
10+
"queries": "query.sql"
11+
}
12+
]
13+
}

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/pgx/v5/go/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/pgx/v5/go/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/pgx/v5/go/query.sql.go

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: Placeholder :exec
2+
SELECT 1;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ALTER TABLE IF EXISTS foo ADD COLUMN bar integer;
2+
ALTER TABLE IF EXISTS bar RENAME COLUMN bar TO baz;
3+
ALTER TABLE IF EXISTS bat RENAME CONSTRAINT bar TO baz;
4+
ALTER TABLE IF EXISTS baz RENAME TO bar;
5+
ALTER TABLE IF EXISTS goo SET SCHEMA bar;
6+
ALTER TABLE IF EXISTS gob ATTACH PARTITION partition_name DEFAULT;
7+
ALTER TABLE IF EXISTS doo DETACH PARTITION partition_name;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"sql_package": "pgx/v5",
8+
"name": "querytest",
9+
"schema": "schema.sql",
10+
"queries": "query.sql"
11+
}
12+
]
13+
}

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/stdlib/go/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/stdlib/go/models.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_table_if_exists/postgresql/stdlib/go/query.sql.go

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- name: Placeholder :exec
2+
SELECT 1;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ALTER TABLE IF EXISTS foo ADD COLUMN bar integer;
2+
ALTER TABLE IF EXISTS bar RENAME COLUMN bar TO baz;
3+
ALTER TABLE IF EXISTS bat RENAME CONSTRAINT bar TO baz;
4+
ALTER TABLE IF EXISTS baz RENAME TO bar;
5+
ALTER TABLE IF EXISTS goo SET SCHEMA bar;
6+
ALTER TABLE IF EXISTS gob ATTACH PARTITION partition_name DEFAULT;
7+
ALTER TABLE IF EXISTS doo DETACH PARTITION partition_name;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"name": "querytest",
8+
"schema": "schema.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/engine/postgresql/parse.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ func translate(node *nodes.Node) (ast.Node, error) {
241241
return &ast.AlterTableSetSchemaStmt{
242242
Table: rel.TableName(),
243243
NewSchema: makeString(n.Newschema),
244+
MissingOk: n.MissingOk,
244245
}, nil
245246

246247
case nodes.ObjectType_OBJECT_TYPE:
@@ -259,8 +260,9 @@ func translate(node *nodes.Node) (ast.Node, error) {
259260
n := inner.AlterTableStmt
260261
rel := parseRelationFromRangeVar(n.Relation)
261262
at := &ast.AlterTableStmt{
262-
Table: rel.TableName(),
263-
Cmds: &ast.List{},
263+
Table: rel.TableName(),
264+
Cmds: &ast.List{},
265+
MissingOk: n.MissingOk,
264266
}
265267
for _, cmd := range n.Cmds {
266268
switch cmdOneOf := cmd.Node.(type) {
@@ -600,16 +602,18 @@ func translate(node *nodes.Node) (ast.Node, error) {
600602
case nodes.ObjectType_OBJECT_COLUMN:
601603
rel := parseRelationFromRangeVar(n.Relation)
602604
return &ast.RenameColumnStmt{
603-
Table: rel.TableName(),
604-
Col: &ast.ColumnRef{Name: n.Subname},
605-
NewName: makeString(n.Newname),
605+
Table: rel.TableName(),
606+
Col: &ast.ColumnRef{Name: n.Subname},
607+
NewName: makeString(n.Newname),
608+
MissingOk: n.MissingOk,
606609
}, nil
607610

608611
case nodes.ObjectType_OBJECT_TABLE:
609612
rel := parseRelationFromRangeVar(n.Relation)
610613
return &ast.RenameTableStmt{
611-
Table: rel.TableName(),
612-
NewName: makeString(n.Newname),
614+
Table: rel.TableName(),
615+
NewName: makeString(n.Newname),
616+
MissingOk: n.MissingOk,
613617
}, nil
614618

615619
case nodes.ObjectType_OBJECT_TYPE:

internal/sql/ast/alter_table_set_schema_stmt.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package ast
33
type AlterTableSetSchemaStmt struct {
44
Table *TableName
55
NewSchema *string
6+
MissingOk bool
67
}
78

89
func (n *AlterTableSetSchemaStmt) Pos() int {

internal/sql/ast/rename_column_stmt.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package ast
22

33
type RenameColumnStmt struct {
4-
Table *TableName
5-
Col *ColumnRef
6-
NewName *string
4+
Table *TableName
5+
Col *ColumnRef
6+
NewName *string
7+
MissingOk bool
78
}
89

910
func (n *RenameColumnStmt) Pos() int {

internal/sql/ast/rename_table_stmt.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package ast
22

33
type RenameTableStmt struct {
4-
Table *TableName
5-
NewName *string
4+
Table *TableName
5+
NewName *string
6+
MissingOk bool
67
}
78

89
func (n *RenameTableStmt) Pos() int {

internal/sql/catalog/table.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ type Table struct {
1818
Comment string
1919
}
2020

21+
func checkMissing(err error, missingOK bool) error {
22+
var serr *sqlerr.Error
23+
if errors.As(err, &serr) {
24+
if serr.Err == sqlerr.NotFound && missingOK {
25+
return nil
26+
}
27+
}
28+
return err
29+
}
30+
2131
func (table *Table) isExistColumn(cmd *ast.AlterTableCmd) (int, error) {
2232
for i, c := range table.Columns {
2333
if c.Name == *cmd.Name {
@@ -167,7 +177,7 @@ func (c *Catalog) alterTable(stmt *ast.AlterTableStmt) error {
167177
}
168178
_, table, err := c.getTable(stmt.Table)
169179
if err != nil {
170-
return err
180+
return checkMissing(err, stmt.MissingOk)
171181
}
172182
for _, item := range stmt.Cmds.Items {
173183
switch cmd := item.(type) {
@@ -206,11 +216,11 @@ func (c *Catalog) alterTableSetSchema(stmt *ast.AlterTableSetSchemaStmt) error {
206216
}
207217
oldSchema, err := c.getSchema(ns)
208218
if err != nil {
209-
return err
219+
return checkMissing(err, stmt.MissingOk)
210220
}
211221
tbl, idx, err := oldSchema.getTable(stmt.Table)
212222
if err != nil {
213-
return err
223+
return checkMissing(err, stmt.MissingOk)
214224
}
215225
tbl.Rel.Schema = *stmt.NewSchema
216226
newSchema, err := c.getSchema(*stmt.NewSchema)
@@ -354,7 +364,7 @@ func (c *Catalog) dropTable(stmt *ast.DropTableStmt) error {
354364
func (c *Catalog) renameColumn(stmt *ast.RenameColumnStmt) error {
355365
_, tbl, err := c.getTable(stmt.Table)
356366
if err != nil {
357-
return err
367+
return checkMissing(err, stmt.MissingOk)
358368
}
359369
idx := -1
360370
for i := range tbl.Columns {
@@ -375,7 +385,7 @@ func (c *Catalog) renameColumn(stmt *ast.RenameColumnStmt) error {
375385
func (c *Catalog) renameTable(stmt *ast.RenameTableStmt) error {
376386
sch, tbl, err := c.getTable(stmt.Table)
377387
if err != nil {
378-
return err
388+
return checkMissing(err, stmt.MissingOk)
379389
}
380390
if _, _, err := sch.getTable(&ast.TableName{Name: *stmt.NewName}); err == nil {
381391
return sqlerr.RelationExists(*stmt.NewName)

0 commit comments

Comments
 (0)