Skip to content

Commit 4ed46b5

Browse files
craig[bot]rafiss
andcommitted
Merge #154608
154608: scbuild: implement RENAME CONSTRAINT in declarative schema changer r=rafiss a=rafiss This patch implements full support for RENAME CONSTRAINT in the declarative schema changer. The implementation handles two types of constraints: 1. Index-backed constraints (PRIMARY KEY, UNIQUE with index): These rename by dropping the old IndexName element and adding a new one with the updated name. 2. Non-index constraints (CHECK, FK, UNIQUE without index): These rename by dropping the old ConstraintWithoutIndexName element and adding a new one with the updated name. The implementation includes proper validation: - Checks for constraint existence - Validates the constraint is not being added/dropped concurrently - Prevents name conflicts with existing constraints and indexes - Ensures views don't depend on index-backed constraints being renamed New dependency rules ensure the old name element reaches ABSENT before the new name element becomes PUBLIC, preventing conflicts and ensuring correct rollback behavior. ### scplan: add dependency rules for cross-constraint name conflicts during rename This commit enhances the RENAME CONSTRAINT implementation by adding dependency rules to handle name conflicts that occur when multiple constraints are renamed in the same schema change operation. Previously, the dependency rules only handled simple single-constraint renames (A → B). However, when multiple constraints are renamed such that names are swapped or reused (e.g., C1: "old" → "new" while C2: "new" → "other"), the original rules could allow conflicting names to exist simultaneously during execution. This adds two new Precedence rules: 1. For index-backed constraints: Ensures old IndexName elements reach ABSENT before new IndexName elements with the same name become PUBLIC. Includes special handling to exclude secondary index swaps during ALTER PRIMARY KEY operations. 2. For cross-type conflicts: Handles name conflicts between any combination of ConstraintWithoutIndexName and IndexName elements, preventing CHECK constraints from conflicting with UNIQUE constraint names, for example. --- fixes #148341 Release note: None Co-authored-by: Rafi Shamim <rafi@cockroachlabs.com>
2 parents 6b3da84 + ae52f55 commit 4ed46b5

File tree

98 files changed

+1146
-158
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+1146
-158
lines changed

pkg/ccl/schemachangerccl/sctestbackupccl/backup_base_generated_test.go

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

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_10_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -85,9 +84,10 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8584
│ ├── RefreshStats {"TableID":108}
8685
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8786
│ ├── RefreshStats {"TableID":108}
88-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
87+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8988
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
9089
│ ├── MakeIndexAbsent {"IndexID":8,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_11_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -85,9 +84,10 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8584
│ ├── RefreshStats {"TableID":108}
8685
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8786
│ ├── RefreshStats {"TableID":108}
88-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
87+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8988
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
9089
│ ├── MakeIndexAbsent {"IndexID":8,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_12_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -85,9 +84,10 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8584
│ ├── RefreshStats {"TableID":108}
8685
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8786
│ ├── RefreshStats {"TableID":108}
88-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
87+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8988
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
9089
│ ├── MakeIndexAbsent {"IndexID":8,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_13_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -81,13 +80,14 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8180
│ ├── RefreshStats {"TableID":108}
8281
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8382
│ ├── RefreshStats {"TableID":108}
84-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
83+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8584
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
8685
│ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":8,"TableID":108}
8786
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":8,"TableID":108}
8887
│ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":8,"Ordinal":1,"TableID":108}
8988
│ ├── RemoveColumnFromIndex {"ColumnID":5,"IndexID":8,"Kind":2,"TableID":108}
9089
│ ├── RemoveColumnFromIndex {"ColumnID":6,"IndexID":8,"Kind":2,"Ordinal":1,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_14_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -81,13 +80,14 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8180
│ ├── RefreshStats {"TableID":108}
8281
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8382
│ ├── RefreshStats {"TableID":108}
84-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
83+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8584
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
8685
│ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":8,"TableID":108}
8786
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":8,"TableID":108}
8887
│ ├── RemoveColumnFromIndex {"ColumnID":1,"IndexID":8,"Ordinal":1,"TableID":108}
8988
│ ├── RemoveColumnFromIndex {"ColumnID":5,"IndexID":8,"Kind":2,"TableID":108}
9089
│ ├── RemoveColumnFromIndex {"ColumnID":6,"IndexID":8,"Kind":2,"Ordinal":1,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_15_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -85,9 +84,10 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8584
│ ├── RefreshStats {"TableID":108}
8685
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8786
│ ├── RefreshStats {"TableID":108}
88-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
87+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8988
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
9089
│ ├── MakeIndexAbsent {"IndexID":9,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_16_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
5656
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
5757
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
5858
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
59-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
6059
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
6160
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
6261
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -85,9 +84,10 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
8584
│ ├── RefreshStats {"TableID":108}
8685
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
8786
│ ├── RefreshStats {"TableID":108}
88-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
87+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8988
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
9089
│ ├── MakeIndexAbsent {"IndexID":9,"TableID":108}
90+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
9191
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
9292
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
9393
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_17_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
7878
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
7979
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
8080
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
81-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8281
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
8382
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
8483
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -116,7 +115,7 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
116115
│ ├── RefreshStats {"TableID":108}
117116
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
118117
│ ├── RefreshStats {"TableID":108}
119-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
118+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
120119
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
121120
│ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":8,"TableID":108}
122121
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":8,"TableID":108}
@@ -128,6 +127,7 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
128127
│ ├── RemoveColumnFromIndex {"ColumnID":6,"IndexID":8,"Kind":2,"Ordinal":1,"TableID":108}
129128
│ ├── MakeIndexAbsent {"IndexID":4,"TableID":108}
130129
│ ├── MakeIndexAbsent {"IndexID":5,"TableID":108}
130+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
131131
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
132132
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
133133
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

pkg/ccl/schemachangerccl/testdata/end_to_end/add_column_multiple_regional_by_row/add_column_multiple_regional_by_row__rollback_18_of_23.explain

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
7878
│ ├── SetColumnName {"ColumnID":2,"Name":"v","TableID":108}
7979
│ ├── SetColumnName {"ColumnID":3,"Name":"m","TableID":108}
8080
│ ├── AddIndexPartitionInfo {"Partitioning":{"IndexID":1,"TableID":108}}
81-
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
8281
│ ├── MakePublicPrimaryIndexWriteOnly {"IndexID":6,"TableID":108}
8382
│ ├── SetIndexName {"IndexID":6,"Name":"crdb_internal_in...","TableID":108}
8483
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":7,"TableID":108}
@@ -118,7 +117,7 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
118117
│ ├── RefreshStats {"TableID":108}
119118
│ ├── MakeWriteOnlyColumnPublic {"ColumnID":3,"TableID":108}
120119
│ ├── RefreshStats {"TableID":108}
121-
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
120+
│ ├── SetIndexName {"IndexID":1,"Name":"table_regional_b...","TableID":108}
122121
│ ├── MakeIndexAbsent {"IndexID":7,"TableID":108}
123122
│ ├── MakeWriteOnlyIndexDeleteOnly {"IndexID":8,"TableID":108}
124123
│ ├── RemoveColumnFromIndex {"ColumnID":4,"IndexID":8,"TableID":108}
@@ -128,6 +127,7 @@ Schema change plan for rolling back ALTER TABLE multiregion_db.public.table_regi
128127
│ ├── MakeIndexAbsent {"IndexID":2,"TableID":108}
129128
│ ├── RemoveColumnFromIndex {"ColumnID":6,"IndexID":8,"Kind":2,"Ordinal":1,"TableID":108}
130129
│ ├── MakeIndexAbsent {"IndexID":4,"TableID":108}
130+
│ ├── MakeValidatedPrimaryIndexPublic {"IndexID":1,"TableID":108}
131131
│ ├── SetJobStateOnDescriptor {"DescriptorID":108}
132132
│ └── UpdateSchemaChangerJob {"IsNonCancelable":true,"RunningStatus":"Pending: Updatin..."}
133133
├── Stage 2 of 4 in PostCommitNonRevertiblePhase

0 commit comments

Comments
 (0)