Skip to content

Commit

Permalink
sql: rearchitecture ALTER TABLE RENAME, add support for renaming cons…
Browse files Browse the repository at this point in the history
…traints

Release note (sql change): This patch changes RENAME COLUMN to become
a "table command", which can be used alongside other table commands in
a single ALTER TABLE statement. This makes it possible to e.g. atomically
add a computed column based on an existing column, and rename the
columns so that the computed column "replaces" the original column.

Release note (sql change): CockroachDB now supports ALTER TABLE RENAME
CONSTRAINT. Only indexes that are not depended on by views can be
renamed.
  • Loading branch information
knz committed Mar 7, 2019
1 parent 630cdc6 commit 11a7d81
Show file tree
Hide file tree
Showing 16 changed files with 413 additions and 113 deletions.
4 changes: 2 additions & 2 deletions docs/generated/sql/bnf/alter_table.bnf
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
alter_onetable_stmt ::=
'ALTER' 'TABLE' table_name ( ( ( 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) ( ( ',' ( 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) )* )
| 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name ( ( ( 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) ( ( ',' ( 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) )* )
'ALTER' 'TABLE' table_name ( ( ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) ( ( ',' ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) )* )
| 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name ( ( ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) ( ( ',' ( 'RENAME' ( 'COLUMN' | ) column_name 'TO' column_name | 'RENAME' 'CONSTRAINT' column_name 'TO' column_name | 'ADD' ( column_name typename col_qual_list ) | 'ADD' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' ( column_name typename col_qual_list ) | 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' ( column_name typename col_qual_list ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DEFAULT' a_expr | 'DROP' 'DEFAULT' ) | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'NOT' 'NULL' | 'ALTER' ( 'COLUMN' | ) column_name 'DROP' 'STORED' | 'DROP' ( 'COLUMN' | ) 'IF' 'EXISTS' column_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' ( 'COLUMN' | ) column_name ( 'CASCADE' | 'RESTRICT' | ) | 'ALTER' ( 'COLUMN' | ) column_name ( 'SET' 'DATA' | ) 'TYPE' typename ( 'COLLATE' collation_name | ) ( 'USING' a_expr | ) | 'ADD' ( 'CONSTRAINT' constraint_name constraint_elem | constraint_elem ) | 'VALIDATE' 'CONSTRAINT' constraint_name | 'DROP' 'CONSTRAINT' 'IF' 'EXISTS' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'DROP' 'CONSTRAINT' constraint_name ( 'CASCADE' | 'RESTRICT' | ) | 'EXPERIMENTAL_AUDIT' 'SET' audit_mode | partition_by ) ) )* )
2 changes: 0 additions & 2 deletions docs/generated/sql/bnf/rename_column.bnf
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
alter_rename_table_stmt ::=
'ALTER' 'TABLE' table_name 'RENAME' 'COLUMN' column_current_name 'TO' column_name
| 'ALTER' 'TABLE' 'IF' 'EXISTS' table_name 'RENAME' 'COLUMN' column_current_name 'TO' column_name
20 changes: 10 additions & 10 deletions docs/generated/sql/bnf/stmt_block.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -1216,8 +1216,6 @@ alter_zone_table_stmt ::=
alter_rename_table_stmt ::=
'ALTER' 'TABLE' relation_expr 'RENAME' 'TO' table_name
| 'ALTER' 'TABLE' 'IF' 'EXISTS' relation_expr 'RENAME' 'TO' table_name
| 'ALTER' 'TABLE' relation_expr 'RENAME' opt_column column_name 'TO' column_name
| 'ALTER' 'TABLE' 'IF' 'EXISTS' relation_expr 'RENAME' opt_column column_name 'TO' column_name

alter_oneindex_stmt ::=
'ALTER' 'INDEX' table_index_name alter_index_cmds
Expand Down Expand Up @@ -1626,13 +1624,6 @@ set_zone_config ::=
'CONFIGURE' 'ZONE' 'USING' var_set_list
| 'CONFIGURE' 'ZONE' 'DISCARD'

opt_column ::=
'COLUMN'
|

column_name ::=
name

alter_index_cmds ::=
( alter_index_cmd ) ( ( ',' alter_index_cmd ) )*

Expand Down Expand Up @@ -1684,6 +1675,9 @@ signed_iconst ::=
target_name ::=
unrestricted_name

column_name ::=
name

col_qual_list ::=
( ) ( ( col_qualification ) )*

Expand Down Expand Up @@ -1833,7 +1827,9 @@ user_priority ::=
| 'HIGH'

alter_table_cmd ::=
'ADD' column_def
'RENAME' opt_column column_name 'TO' column_name
| 'RENAME' 'CONSTRAINT' column_name 'TO' column_name
| 'ADD' column_def
| 'ADD' 'IF' 'NOT' 'EXISTS' column_def
| 'ADD' 'COLUMN' column_def
| 'ADD' 'COLUMN' 'IF' 'NOT' 'EXISTS' column_def
Expand Down Expand Up @@ -2040,6 +2036,10 @@ func_table ::=
func_expr_windowless
| 'ROWS' 'FROM' '(' rowsfrom_list ')'

opt_column ::=
'COLUMN'
|

alter_column_default ::=
'SET' 'DEFAULT' a_expr
| 'DROP' 'DEFAULT'
Expand Down
4 changes: 2 additions & 2 deletions pkg/server/updates_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ func TestReportUsage(t *testing.T) {
) {
t.Fatal(err)
}
if _, err := db.Exec(`ALTER TABLE foo RENAME CONSTRAINT x TO y`); !testutils.IsError(
if _, err := db.Exec(`ALTER TABLE foo ALTER COLUMN x SET NOT NULL`); !testutils.IsError(
err, "unimplemented",
) {
t.Fatal(err)
Expand Down Expand Up @@ -541,7 +541,7 @@ func TestReportUsage(t *testing.T) {

"unimplemented.#33285.json_object_agg": 10,
"unimplemented.pg_catalog.pg_stat_wal_receiver": 10,
"unimplemented.syntax.#32555": 10,
"unimplemented.syntax.#28751": 10,
"unimplemented.syntax.#32564": 10,
"unimplemented.#9148": 10,
"internalerror.": 10,
Expand Down
75 changes: 47 additions & 28 deletions pkg/sql/alter_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -449,35 +449,14 @@ func (n *alterTableNode) startExec(params runParams) error {
}
return fmt.Errorf("constraint %q does not exist", t.Constraint)
}
switch details.Kind {
case sqlbase.ConstraintTypePK:
return fmt.Errorf("cannot drop primary key")
case sqlbase.ConstraintTypeUnique:
return fmt.Errorf("UNIQUE constraint depends on index %q, use DROP INDEX with CASCADE if you really want to drop it", t.Constraint)
case sqlbase.ConstraintTypeCheck:
for i, c := range n.tableDesc.Checks {
if c.Name == name {
if c.Validity == sqlbase.ConstraintValidity_Validating {
return fmt.Errorf("constraint %q in the middle of being added, try again later", t.Constraint)
}
n.tableDesc.Checks = append(n.tableDesc.Checks[:i], n.tableDesc.Checks[i+1:]...)
descriptorChanged = true
break
}
}
case sqlbase.ConstraintTypeFK:
idx, err := n.tableDesc.FindIndexByID(details.Index.ID)
if err != nil {
return err
}
if err := params.p.removeFKBackReference(params.ctx, n.tableDesc, idx); err != nil {
return err
}
idx.ForeignKey = sqlbase.ForeignKeyReference{}
descriptorChanged = true
default:
return errors.Errorf("dropping %s constraint %q unsupported", details.Kind, t.Constraint)
if err := n.tableDesc.DropConstraint(
name, details,
func(desc *sqlbase.MutableTableDescriptor, idx *sqlbase.IndexDescriptor) error {
return params.p.removeFKBackReference(params.ctx, desc, idx)
}); err != nil {
return err
}
descriptorChanged = true

case *tree.AlterTableValidateConstraint:
info, err := n.tableDesc.GetConstraintInfo(params.ctx, nil)
Expand Down Expand Up @@ -599,6 +578,46 @@ func (n *alterTableNode) startExec(params runParams) error {
return err
}

case *tree.AlterTableRenameColumn:
descChanged, err := params.p.renameColumn(params.ctx, n.tableDesc, &t.Column, &t.NewName)
if err != nil {
return err
}
descriptorChanged = descChanged

case *tree.AlterTableRenameConstraint:
info, err := n.tableDesc.GetConstraintInfo(params.ctx, nil)
if err != nil {
return err
}
details, ok := info[string(t.Constraint)]
if !ok {
return fmt.Errorf("constraint %q does not exist", tree.ErrString(&t.Constraint))
}
if t.Constraint == t.NewName {
// Nothing to do.
break
}

if _, ok := info[string(t.NewName)]; ok {
return errors.Errorf("duplicate constraint name: %q", tree.ErrString(&t.NewName))
}

if err := params.p.CheckPrivilege(params.ctx, n.tableDesc, privilege.CREATE); err != nil {
return err
}

depViewRenameError := func(objType string, refTableID sqlbase.ID) error {
return params.p.dependentViewRenameError(params.ctx,
objType, tree.ErrString(&t.NewName), n.tableDesc.ParentID, refTableID)
}

if err := n.tableDesc.RenameConstraint(
details, string(t.Constraint), string(t.NewName), depViewRenameError); err != nil {
return err
}
descriptorChanged = true

default:
return pgerror.NewAssertionErrorf("unsupported alter command: %T", cmd)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/sql/logictest/testdata/logic_test/alter_table
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ ALTER TABLE t DROP CONSTRAINT bar
statement ok
ALTER TABLE t DROP CONSTRAINT IF EXISTS bar

statement error UNIQUE constraint depends on index "foo", use DROP INDEX with CASCADE if you really want to drop it
statement error cannot drop UNIQUE constraint \"foo\" using ALTER TABLE DROP CONSTRAINT, use DROP INDEX CASCADE instead
ALTER TABLE t DROP CONSTRAINT foo

statement ok
Expand Down
16 changes: 15 additions & 1 deletion pkg/sql/logictest/testdata/logic_test/rename_column
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ ALTER TABLE users RENAME COLUMN id TO uid
# statement ok
# ALTER TABLE users RENAME COLUMN username TO name

statement ok
DROP VIEW v2

query T
SELECT column_name FROM [SHOW COLUMNS FROM users]
----
Expand All @@ -119,7 +122,7 @@ species
query TTT
EXPLAIN ALTER TABLE users RENAME COLUMN species TO woo
----
rename column · ·
alter table · ·

# Verify that EXPLAIN did not actually rename the column
query T
Expand All @@ -128,3 +131,14 @@ SELECT column_name FROM [SHOW COLUMNS FROM users]
id
username
species

# Check that a column can be added and renamed in the same statement
statement ok
ALTER TABLE users RENAME COLUMN species TO species_old,
ADD COLUMN species STRING AS (species_old || ' woo') STORED

query T
SELECT species FROM users
----
cat woo
rat woo
104 changes: 104 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/rename_constraint
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# LogicTest: local local-opt local-parallel-stmts fakedist fakedist-opt fakedist-metadata

statement ok
CREATE TABLE t (
x INT, y INT,
CONSTRAINT cu UNIQUE (x),
CONSTRAINT cc CHECK (x > 10),
CONSTRAINT cf FOREIGN KEY (x) REFERENCES t(x)
)

query T
SELECT create_statement FROM [SHOW CREATE t]
----
CREATE TABLE t (
x INT8 NULL,
y INT8 NULL,
CONSTRAINT cf FOREIGN KEY (x) REFERENCES t (x),
UNIQUE INDEX cu (x ASC),
FAMILY "primary" (x, y, rowid),
CONSTRAINT cc CHECK (x > 10)
)

query TT
SELECT conname, contype FROM pg_catalog.pg_constraint ORDER BY conname
----
cc c
cf f
cu u

subtest rename_works

statement ok
ALTER TABLE t RENAME CONSTRAINT cu TO cu2,
RENAME CONSTRAINT cf TO cf2,
RENAME CONSTRAINT cc TO cc2

query T
SELECT create_statement FROM [SHOW CREATE t]
----
CREATE TABLE t (
x INT8 NULL,
y INT8 NULL,
CONSTRAINT cf2 FOREIGN KEY (x) REFERENCES t (x),
UNIQUE INDEX cu2 (x ASC),
FAMILY "primary" (x, y, rowid),
CONSTRAINT cc2 CHECK (x > 10)
)

query TT
SELECT conname, contype FROM pg_catalog.pg_constraint ORDER BY conname
----
cc2 c
cf2 f
cu2 u


subtest duplicate_constraints

statement error duplicate constraint
ALTER TABLE t RENAME CONSTRAINT cu2 TO cf2

statement error duplicate constraint
ALTER TABLE t RENAME CONSTRAINT cu2 TO cc2

statement error duplicate constraint
ALTER TABLE t RENAME CONSTRAINT cf2 TO cu2

statement error duplicate constraint
ALTER TABLE t RENAME CONSTRAINT cf2 TO cc2

statement error duplicate constraint
ALTER TABLE t RENAME CONSTRAINT cc2 TO cf2

statement error duplicate constraint
ALTER TABLE t RENAME CONSTRAINT cc2 TO cu2

subtest multiple_renames

statement ok
ALTER TABLE t RENAME CONSTRAINT cu2 TO cu3,
RENAME CONSTRAINT cc2 TO cc3,
RENAME CONSTRAINT cf2 TO cf3,
RENAME CONSTRAINT cu3 TO cu4,
RENAME CONSTRAINT cc3 TO cc4,
RENAME CONSTRAINT cf3 TO cf4

query T
SELECT create_statement FROM [SHOW CREATE t]
----
CREATE TABLE t (
x INT8 NULL,
y INT8 NULL,
CONSTRAINT cf4 FOREIGN KEY (x) REFERENCES t (x),
UNIQUE INDEX cu4 (x ASC),
FAMILY "primary" (x, y, rowid),
CONSTRAINT cc4 CHECK (x > 10)
)

query TT
SELECT conname, contype FROM pg_catalog.pg_constraint ORDER BY conname
----
cc4 c
cf4 f
cu4 u
36 changes: 36 additions & 0 deletions pkg/sql/logictest/testdata/logic_test/schema_change_in_txn
Original file line number Diff line number Diff line change
Expand Up @@ -894,6 +894,42 @@ COMMIT
statement ok
DROP TABLE check_table

subtest check_rename

statement ok
CREATE TABLE check_table (k INT PRIMARY KEY)

statement ok
BEGIN

statement ok
ALTER TABLE check_table ADD f INT

statement ok
ALTER TABLE check_table ADD CONSTRAINT f_0 CHECK (f > 0)

statement error pq: constraint "f_0" in the middle of being added
ALTER TABLE check_table RENAME CONSTRAINT f_0 to f_1

statement ok
COMMIT

statement ok
BEGIN

statement ok
ALTER TABLE check_table ADD f INT

statement error pq: constraint "f_0" in the middle of being added
ALTER TABLE check_table ADD CONSTRAINT f_0 CHECK (f > 0),
RENAME CONSTRAINT f_0 to f_1

statement ok
COMMIT

statement ok
DROP TABLE check_table

# Test adding a check constraint to a table that was created in the same transaction
subtest check_on_new_table

Expand Down
4 changes: 0 additions & 4 deletions pkg/sql/logictest/testdata/logic_test/unimplemented

This file was deleted.

0 comments on commit 11a7d81

Please sign in to comment.