Skip to content

Commit d0b2a09

Browse files
committed
workload/schemachange: allow self deps in tableHasDependencies for DROP TABLE
This change updates tableHasDependencies to optionally include self-referencing dependencies when skipSelfRef is false. This is needed for DROP TABLE, where self-dependencies (e.g., from triggers) are safe to ignore because they are cleaned up as part of the drop. In contrast, RENAME TABLE must still block on these, since the dependent reference would not be updated by the rename. The function now takes a skipSelfRef flag to distinguish these cases, and excludes only self-dependencies when skipSelfRef is true. Informs #147514 Epic: None Release note: none
1 parent 3afeb1b commit d0b2a09

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

pkg/workload/schemachange/error_screening.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,16 @@ func (og *operationGenerator) fnExists(
9898
)`, fnName, argTypes)
9999
}
100100

101+
// tableHasDependencies reports whether the given table has any schema dependencies,
102+
// optionally excluding foreign keys and/or self-references.
103+
//
104+
// A dependency is ignored if:
105+
// 1. It is a foreign key and includeFKs is false.
106+
// 2. It is a self-dependency (i.e., the table depends on itself) and:
107+
// a) It is a foreign key, or
108+
// b) skipSelfRef is true (regardless of dependency type).
101109
func (og *operationGenerator) tableHasDependencies(
102-
ctx context.Context, tx pgx.Tx, tableName *tree.TableName, includeFKs bool,
110+
ctx context.Context, tx pgx.Tx, tableName *tree.TableName, includeFKs, skipSelfRef bool,
103111
) (bool, error) {
104112
fkFilter := ""
105113
if !includeFKs {
@@ -117,12 +125,18 @@ func (og *operationGenerator) tableHasDependencies(
117125
ns.oid = c.relnamespace
118126
WHERE c.relname = $1 AND ns.nspname = $2
119127
)
120-
AND NOT (fd.descriptor_id = fd.dependedonby_id AND fd.dependedonby_type = 'fk')
128+
AND NOT (
129+
fd.descriptor_id = fd.dependedonby_id
130+
AND (
131+
fd.dependedonby_type = 'fk'
132+
OR $3::BOOL = true
133+
)
134+
)
121135
AND fd.dependedonby_type != 'sequence'
122136
%s
123137
)
124138
`, fkFilter)
125-
return og.scanBool(ctx, tx, q, tableName.Object(), tableName.Schema())
139+
return og.scanBool(ctx, tx, q, tableName.Object(), tableName.Schema(), skipSelfRef)
126140
}
127141

128142
// columnRemovalWillDropFKBackingIndexes determines if dropping this column

pkg/workload/schemachange/operation_generator.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,7 +2049,8 @@ func (og *operationGenerator) dropTable(ctx context.Context, tx pgx.Tx) (*opStmt
20492049
if err != nil {
20502050
return nil, err
20512051
}
2052-
tableHasDependencies, err := og.tableHasDependencies(ctx, tx, tableName, true /* includeFKs */)
2052+
tableHasDependencies, err := og.tableHasDependencies(ctx, tx, tableName, true, /* includeFKs */
2053+
true /* skipSelfRef */)
20532054
if err != nil {
20542055
return nil, err
20552056
}
@@ -2081,7 +2082,8 @@ func (og *operationGenerator) dropView(ctx context.Context, tx pgx.Tx) (*opStmt,
20812082
if err != nil {
20822083
return nil, err
20832084
}
2084-
viewHasDependencies, err := og.tableHasDependencies(ctx, tx, viewName, true /* includeFKs */)
2085+
viewHasDependencies, err := og.tableHasDependencies(ctx, tx, viewName, true, /* includeFKs */
2086+
true /* skipSelfRef */)
20852087
if err != nil {
20862088
return nil, err
20872089
}
@@ -2348,7 +2350,8 @@ func (og *operationGenerator) renameTable(ctx context.Context, tx pgx.Tx) (*opSt
23482350
return nil, err
23492351
}
23502352

2351-
srcTableHasDependencies, err := og.tableHasDependencies(ctx, tx, srcTableName, false /* includeFKs */)
2353+
srcTableHasDependencies, err := og.tableHasDependencies(ctx, tx, srcTableName, false, /* includeFKs */
2354+
false /* skipSelfRef */)
23522355
if err != nil {
23532356
return nil, err
23542357
}
@@ -2398,7 +2401,8 @@ func (og *operationGenerator) renameView(ctx context.Context, tx pgx.Tx) (*opStm
23982401
return nil, err
23992402
}
24002403

2401-
srcTableHasDependencies, err := og.tableHasDependencies(ctx, tx, srcViewName, true /* includeFKs */)
2404+
srcTableHasDependencies, err := og.tableHasDependencies(ctx, tx, srcViewName, true, /* includeFKs */
2405+
false /* skipSelfRef */)
24022406
if err != nil {
24032407
return nil, err
24042408
}

0 commit comments

Comments
 (0)