Skip to content

Commit b0d6f13

Browse files
authored
Bug fix to index relation creation bug (#1640)
1 parent 895f4e1 commit b0d6f13

File tree

13 files changed

+190
-27
lines changed

13 files changed

+190
-27
lines changed

internal/endtoend/testdata/ddl_alter_table_index/postgresql/pgx/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_index/postgresql/pgx/go/models.go

Lines changed: 13 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_index/postgresql/pgx/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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE temp(a TEXT);
2+
3+
CREATE INDEX temp_idx ON temp(a);
4+
ALTER INDEX temp_idx ATTACH PARTITION temp_partition_idx;
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_index/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_index/postgresql/stdlib/go/models.go

Lines changed: 13 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_index/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: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE TABLE temp(a TEXT);
2+
3+
CREATE INDEX temp_idx ON temp(a);
4+
ALTER INDEX temp_idx ATTACH PARTITION temp_partition_idx;
5+
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/sql/catalog/table.go

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,94 +19,76 @@ type Table struct {
1919
}
2020

2121
func (table *Table) isExistColumn(cmd *ast.AlterTableCmd) (int, error) {
22-
2322
for i, c := range table.Columns {
2423
if c.Name == *cmd.Name {
2524
return i, nil
2625
}
2726
}
28-
2927
if !cmd.MissingOk {
3028
return -1, sqlerr.ColumnNotFound(table.Rel.Name, *cmd.Name)
3129
}
32-
3330
// Missing column is allowed
3431
return -1, nil
3532
}
3633

3734
func (table *Table) addColumn(cmd *ast.AlterTableCmd) error {
38-
3935
for _, c := range table.Columns {
4036
if c.Name == cmd.Def.Colname {
4137
return sqlerr.ColumnExists(table.Rel.Name, c.Name)
4238
}
4339
}
44-
4540
table.Columns = append(table.Columns, &Column{
4641
Name: cmd.Def.Colname,
4742
Type: *cmd.Def.TypeName,
4843
IsNotNull: cmd.Def.IsNotNull,
4944
IsArray: cmd.Def.IsArray,
5045
Length: cmd.Def.Length,
5146
})
52-
5347
return nil
5448
}
5549

5650
func (table *Table) alterColumnType(cmd *ast.AlterTableCmd) error {
57-
5851
index, err := table.isExistColumn(cmd)
5952
if err != nil {
6053
return err
6154
}
62-
6355
if index >= 0 {
6456
table.Columns[index].Type = *cmd.Def.TypeName
6557
table.Columns[index].IsArray = cmd.Def.IsArray
6658
}
67-
6859
return nil
6960
}
7061

7162
func (table *Table) dropColumn(cmd *ast.AlterTableCmd) error {
72-
7363
index, err := table.isExistColumn(cmd)
7464
if err != nil {
7565
return err
7666
}
77-
7867
if index >= 0 {
7968
table.Columns = append(table.Columns[:index], table.Columns[index+1:]...)
8069
}
81-
8270
return nil
8371
}
8472

8573
func (table *Table) dropNotNull(cmd *ast.AlterTableCmd) error {
86-
8774
index, err := table.isExistColumn(cmd)
8875
if err != nil {
8976
return err
9077
}
91-
9278
if index >= 0 {
9379
table.Columns[index].IsNotNull = false
9480
}
95-
9681
return nil
9782
}
9883

9984
func (table *Table) setNotNull(cmd *ast.AlterTableCmd) error {
100-
10185
index, err := table.isExistColumn(cmd)
10286
if err != nil {
10387
return err
10488
}
105-
10689
if index >= 0 {
10790
table.Columns[index].IsNotNull = true
10891
}
109-
11092
return nil
11193
}
11294

@@ -130,41 +112,57 @@ type columnGenerator interface {
130112
}
131113

132114
func (c *Catalog) getTable(tableName *ast.TableName) (*Schema, *Table, error) {
133-
134115
schemaName := tableName.Schema
135-
136116
if schemaName == "" {
137117
schemaName = c.DefaultSchema
138118
}
139-
140119
var schema *Schema
141-
142120
for i := range c.Schemas {
143121
if c.Schemas[i].Name == schemaName {
144122
schema = c.Schemas[i]
145123
break
146124
}
147125
}
148-
149126
if schema == nil {
150127
return nil, nil, sqlerr.SchemaNotFound(schemaName)
151128
}
152-
153129
table, _, err := schema.getTable(tableName)
154130
if err != nil {
155131
return nil, nil, err
156132
}
157-
158133
return schema, table, nil
159134
}
160135

161-
func (c *Catalog) alterTable(stmt *ast.AlterTableStmt) error {
136+
func isStmtImplemented(stmt *ast.AlterTableStmt) bool {
137+
var implemented bool
138+
for _, item := range stmt.Cmds.Items {
139+
switch cmd := item.(type) {
140+
case *ast.AlterTableCmd:
141+
switch cmd.Subtype {
142+
case ast.AT_AddColumn:
143+
implemented = true
144+
case ast.AT_AlterColumnType:
145+
implemented = true
146+
case ast.AT_DropColumn:
147+
implemented = true
148+
case ast.AT_DropNotNull:
149+
implemented = true
150+
case ast.AT_SetNotNull:
151+
implemented = true
152+
}
153+
}
154+
}
155+
return implemented
156+
}
162157

158+
func (c *Catalog) alterTable(stmt *ast.AlterTableStmt) error {
159+
if !isStmtImplemented(stmt) {
160+
return nil
161+
}
163162
_, table, err := c.getTable(stmt.Table)
164163
if err != nil {
165164
return err
166165
}
167-
168166
for _, item := range stmt.Cmds.Items {
169167
switch cmd := item.(type) {
170168
case *ast.AlterTableCmd:

0 commit comments

Comments
 (0)