diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/db.go b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/db.go new file mode 100644 index 0000000000..b0157bd009 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/db.go @@ -0,0 +1,32 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.13.0 + +package querytest + +import ( + "context" + + "github.com/jackc/pgconn" + "github.com/jackc/pgx/v4" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/models.go b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/models.go new file mode 100644 index 0000000000..b2839d9b81 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/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 Temp struct { + A sql.NullString +} diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/go/query.sql.go new file mode 100644 index 0000000000..98f12b1d40 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/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.Exec(ctx, placeholder) + return err +} diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/query.sql b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/query.sql new file mode 100644 index 0000000000..6520aef4b6 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/query.sql @@ -0,0 +1,2 @@ +-- name: Placeholder :exec +SELECT 1; diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/schema.sql b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/schema.sql new file mode 100644 index 0000000000..ead14d04ee --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE temp(a TEXT); + +CREATE INDEX temp_idx ON temp(a); +ALTER INDEX temp_idx ATTACH PARTITION temp_partition_idx; diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/sqlc.json b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/sqlc.json new file mode 100644 index 0000000000..d1244c9e7a --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/sqlc.json @@ -0,0 +1,13 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "sql_package": "pgx/v4", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/go/db.go b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/go/db.go new file mode 100644 index 0000000000..36ef5f4f45 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/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_index/postgresql/stdlib/go/models.go b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/go/models.go new file mode 100644 index 0000000000..b2839d9b81 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/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 Temp struct { + A sql.NullString +} diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/go/query.sql.go b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/go/query.sql.go new file mode 100644 index 0000000000..6070d0b2f4 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/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_index/postgresql/stdlib/query.sql b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/query.sql new file mode 100644 index 0000000000..6520aef4b6 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/query.sql @@ -0,0 +1,2 @@ +-- name: Placeholder :exec +SELECT 1; diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/schema.sql b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/schema.sql new file mode 100644 index 0000000000..b74a806845 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE temp(a TEXT); + +CREATE INDEX temp_idx ON temp(a); +ALTER INDEX temp_idx ATTACH PARTITION temp_partition_idx; + diff --git a/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/sqlc.json b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/sqlc.json new file mode 100644 index 0000000000..f717ca2e66 --- /dev/null +++ b/internal/endtoend/testdata/ddl_alter_table_index/postgresql/stdlib/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "name": "querytest", + "schema": "schema.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/sql/catalog/table.go b/internal/sql/catalog/table.go index 2b9df6597e..6595fcbace 100644 --- a/internal/sql/catalog/table.go +++ b/internal/sql/catalog/table.go @@ -19,29 +19,24 @@ type Table struct { } func (table *Table) isExistColumn(cmd *ast.AlterTableCmd) (int, error) { - for i, c := range table.Columns { if c.Name == *cmd.Name { return i, nil } } - if !cmd.MissingOk { return -1, sqlerr.ColumnNotFound(table.Rel.Name, *cmd.Name) } - // Missing column is allowed return -1, nil } func (table *Table) addColumn(cmd *ast.AlterTableCmd) error { - for _, c := range table.Columns { if c.Name == cmd.Def.Colname { return sqlerr.ColumnExists(table.Rel.Name, c.Name) } } - table.Columns = append(table.Columns, &Column{ Name: cmd.Def.Colname, Type: *cmd.Def.TypeName, @@ -49,64 +44,51 @@ func (table *Table) addColumn(cmd *ast.AlterTableCmd) error { IsArray: cmd.Def.IsArray, Length: cmd.Def.Length, }) - return nil } func (table *Table) alterColumnType(cmd *ast.AlterTableCmd) error { - index, err := table.isExistColumn(cmd) if err != nil { return err } - if index >= 0 { table.Columns[index].Type = *cmd.Def.TypeName table.Columns[index].IsArray = cmd.Def.IsArray } - return nil } func (table *Table) dropColumn(cmd *ast.AlterTableCmd) error { - index, err := table.isExistColumn(cmd) if err != nil { return err } - if index >= 0 { table.Columns = append(table.Columns[:index], table.Columns[index+1:]...) } - return nil } func (table *Table) dropNotNull(cmd *ast.AlterTableCmd) error { - index, err := table.isExistColumn(cmd) if err != nil { return err } - if index >= 0 { table.Columns[index].IsNotNull = false } - return nil } func (table *Table) setNotNull(cmd *ast.AlterTableCmd) error { - index, err := table.isExistColumn(cmd) if err != nil { return err } - if index >= 0 { table.Columns[index].IsNotNull = true } - return nil } @@ -130,41 +112,57 @@ type columnGenerator interface { } func (c *Catalog) getTable(tableName *ast.TableName) (*Schema, *Table, error) { - schemaName := tableName.Schema - if schemaName == "" { schemaName = c.DefaultSchema } - var schema *Schema - for i := range c.Schemas { if c.Schemas[i].Name == schemaName { schema = c.Schemas[i] break } } - if schema == nil { return nil, nil, sqlerr.SchemaNotFound(schemaName) } - table, _, err := schema.getTable(tableName) if err != nil { return nil, nil, err } - return schema, table, nil } -func (c *Catalog) alterTable(stmt *ast.AlterTableStmt) error { +func isStmtImplemented(stmt *ast.AlterTableStmt) bool { + var implemented bool + for _, item := range stmt.Cmds.Items { + switch cmd := item.(type) { + case *ast.AlterTableCmd: + switch cmd.Subtype { + case ast.AT_AddColumn: + implemented = true + case ast.AT_AlterColumnType: + implemented = true + case ast.AT_DropColumn: + implemented = true + case ast.AT_DropNotNull: + implemented = true + case ast.AT_SetNotNull: + implemented = true + } + } + } + return implemented +} +func (c *Catalog) alterTable(stmt *ast.AlterTableStmt) error { + if !isStmtImplemented(stmt) { + return nil + } _, table, err := c.getTable(stmt.Table) if err != nil { return err } - for _, item := range stmt.Cmds.Items { switch cmd := item.(type) { case *ast.AlterTableCmd: