Skip to content

Commit e8fd2fc

Browse files
committed
scbuild: handle trigger/procedure dependencies for table renames
Release note: None
1 parent a1a41db commit e8fd2fc

File tree

8 files changed

+40
-16
lines changed

8 files changed

+40
-16
lines changed

pkg/backup/testdata/backup-restore/plpgsql_procedures

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,10 @@ DROP TABLE sc1.tbl1
182182
----
183183
pq: cannot drop table tbl1 because other objects depend on it
184184

185-
# TODO(mgartner): The error message should say "procedure".
186185
exec-sql
187186
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
188187
----
189-
pq: cannot rename relation "sc1.tbl1" because function "p1" depends on it
188+
pq: cannot rename relation "db1_new.sc1.tbl1" because procedure "p1" depends on it
190189
HINT: consider dropping "p1" first.
191190

192191
# TODO(mgartner): The error message should say "procedure".
@@ -384,7 +383,7 @@ pq: cannot drop table tbl1 because other objects depend on it
384383
exec-sql
385384
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
386385
----
387-
pq: cannot rename relation "sc1.tbl1" because function "p1" depends on it
386+
pq: cannot rename relation "db1.sc1.tbl1" because procedure "p1" depends on it
388387
HINT: consider dropping "p1" first.
389388

390389
exec-sql

pkg/backup/testdata/backup-restore/plpgsql_user_defined_functions

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ pq: cannot drop table tbl1 because other objects depend on it
247247
exec-sql
248248
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
249249
----
250-
pq: cannot rename relation "sc1.tbl1" because function "f1" depends on it
250+
pq: cannot rename relation "db1_new.sc1.tbl1" because function "f1" depends on it
251251
HINT: consider dropping "f1" first.
252252

253253
exec-sql
@@ -463,7 +463,7 @@ pq: cannot drop table tbl1 because other objects depend on it
463463
exec-sql
464464
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
465465
----
466-
pq: cannot rename relation "sc1.tbl1" because function "f1" depends on it
466+
pq: cannot rename relation "db1.sc1.tbl1" because function "f1" depends on it
467467
HINT: consider dropping "f1" first.
468468

469469
exec-sql

pkg/backup/testdata/backup-restore/procedures

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,10 @@ DROP TABLE sc1.tbl1
168168
----
169169
pq: cannot drop table tbl1 because other objects depend on it
170170

171-
# TODO(mgartner): The error message should say "procedure".
172171
exec-sql
173172
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
174173
----
175-
pq: cannot rename relation "sc1.tbl1" because function "p1" depends on it
174+
pq: cannot rename relation "db1_new.sc1.tbl1" because procedure "p1" depends on it
176175
HINT: consider dropping "p1" first.
177176

178177
# TODO(mgartner): The error message should say "procedure".
@@ -356,7 +355,7 @@ pq: cannot drop table tbl1 because other objects depend on it
356355
exec-sql
357356
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
358357
----
359-
pq: cannot rename relation "sc1.tbl1" because function "p1" depends on it
358+
pq: cannot rename relation "db1.sc1.tbl1" because procedure "p1" depends on it
360359
HINT: consider dropping "p1" first.
361360

362361
exec-sql

pkg/backup/testdata/backup-restore/triggers

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ pq: cannot drop table tbl1 because other objects depend on it
218218
exec-sql
219219
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
220220
----
221-
pq: cannot rename relation "sc1.tbl1" because trigger "tr1" on table "tbl1" depends on it
221+
pq: cannot rename relation "db1_new.sc1.tbl1" because trigger "tr1" on table "tbl1" depends on it
222222

223223
exec-sql
224224
ALTER TABLE sc1.tbl1 SET SCHEMA sc2;

pkg/backup/testdata/backup-restore/user-defined-functions

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ pq: cannot drop table tbl1 because other objects depend on it
165165
exec-sql
166166
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
167167
----
168-
pq: cannot rename relation "sc1.tbl1" because function "f1" depends on it
168+
pq: cannot rename relation "db1_new.sc1.tbl1" because function "f1" depends on it
169169
HINT: consider dropping "f1" first.
170170

171171
exec-sql
@@ -352,7 +352,7 @@ pq: cannot drop table tbl1 because other objects depend on it
352352
exec-sql
353353
ALTER TABLE sc1.tbl1 RENAME TO tbl1_new
354354
----
355-
pq: cannot rename relation "sc1.tbl1" because function "f1" depends on it
355+
pq: cannot rename relation "db1.sc1.tbl1" because function "f1" depends on it
356356
HINT: consider dropping "f1" first.
357357

358358
exec-sql

pkg/ccl/logictestccl/testdata/logic_test/triggers

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,9 +929,14 @@ statement ok
929929
CREATE TRIGGER foo AFTER INSERT ON xy FOR EACH ROW EXECUTE FUNCTION trigger_func();
930930

931931
# Relations are referenced by name, so renaming the table is not allowed.
932+
onlyif config local-legacy-schema-changer local-mixed-25.2 local-mixed-25.3
932933
statement error pgcode 2BP01 cannot rename relation "t" because trigger "foo" on table "xy" depends on it
933934
ALTER TABLE t RENAME TO t2;
934935

936+
skipif config local-legacy-schema-changer local-mixed-25.2 local-mixed-25.3
937+
statement error pgcode 2BP01 cannot rename relation "test.public.t" because trigger "foo" on table "xy" depends on it
938+
ALTER TABLE t RENAME TO t2;
939+
935940
# Sequences are remapped to their IDs, so renaming is allowed.
936941
statement ok
937942
ALTER SEQUENCE s RENAME TO s2;

pkg/sql/schemachanger/scbuild/internal/scbuildstmt/rename_table.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,27 @@ func checkNameBasedDependencies(
240240
_, _, viewNS := scpb.FindNamespace(viewElts)
241241
panic(sqlerrors.NewDependentBlocksOpError("rename", "relation", objectName.String(), "view", viewNS.Name))
242242
case *scpb.FunctionName:
243-
panic(sqlerrors.NewDependentBlocksOpError("rename", "relation", objectName.String(), "function", backRefElem.Name))
243+
funcElem := b.QueryByID(backRefElem.FunctionID).FilterFunction().MustGetOneElement()
244+
funcType := "function"
245+
if funcElem.IsProcedure {
246+
funcType = "procedure"
247+
}
248+
panic(sqlerrors.NewDependentBlocksOpError("rename", "relation", objectName.String(), funcType, backRefElem.Name))
249+
case *scpb.TriggerDeps:
250+
for _, usesRelation := range backRefElem.UsesRelations {
251+
if usesRelation.ID == descriptorID {
252+
dependentTableID := backRefElem.TableID
253+
dependentTriggerID := backRefElem.TriggerID
254+
dependentTableNS := b.QueryByID(dependentTableID).FilterNamespace().MustGetOneElement()
255+
dependentTriggerName := backRefs.FilterTriggerName().Filter(func(_ scpb.Status, _ scpb.TargetStatus, e *scpb.TriggerName) bool {
256+
return e.TriggerID == dependentTriggerID && e.TableID == dependentTableID
257+
}).MustGetOneElement()
258+
panic(sqlerrors.NewDependentObjectErrorf(
259+
"cannot rename relation %q because trigger %q on table %q depends on it",
260+
objectName.String(), dependentTriggerName.Name, dependentTableNS.Name,
261+
))
262+
}
263+
}
244264
}
245265
})
246266
}

pkg/sql/schemachanger/scdecomp/decomp.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,10 +1028,11 @@ func (w *walkCtx) walkForeignKeyConstraint(
10281028
func (w *walkCtx) walkFunction(fnDesc catalog.FunctionDescriptor) {
10291029
typeT := newTypeT(fnDesc.GetReturnType().Type)
10301030
fn := &scpb.Function{
1031-
FunctionID: fnDesc.GetID(),
1032-
ReturnSet: fnDesc.GetReturnType().ReturnSet,
1033-
ReturnType: *typeT,
1034-
Params: make([]scpb.Function_Parameter, len(fnDesc.GetParams())),
1031+
FunctionID: fnDesc.GetID(),
1032+
ReturnSet: fnDesc.GetReturnType().ReturnSet,
1033+
ReturnType: *typeT,
1034+
Params: make([]scpb.Function_Parameter, len(fnDesc.GetParams())),
1035+
IsProcedure: fnDesc.IsProcedure(),
10351036
}
10361037
for i, param := range fnDesc.GetParams() {
10371038
typeT := newTypeT(param.Type)

0 commit comments

Comments
 (0)