Skip to content

Commit adf4921

Browse files
committed
sql/schemachanger: handle trigger dependents properly
Previously, trigger dependents used the NotImplementedForPublicObjects operation to indicate that no operations were needed. Sadly because triggers are not descriptors, this could lead to assertions in more complex plans, when schema_locked is involved. To address this, this patch modifies this operation to accept a trigger ID to detect if the trigger is dropped. Release note: None
1 parent df2f941 commit adf4921

11 files changed

+36
-7
lines changed

pkg/sql/schemachanger/scexec/scmutationexec/scmutationexec.go

+7
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package scmutationexec
88
import (
99
"context"
1010

11+
"github.com/cockroachdb/cockroach/pkg/sql/catalog"
1112
"github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scop"
1213
"github.com/cockroachdb/errors"
1314
)
@@ -55,6 +56,12 @@ func (i *immediateVisitor) NotImplementedForPublicObjects(
5556
if desc == nil || desc.Dropped() {
5657
return nil
5758
}
59+
if op.TriggerID != 0 {
60+
// Validate that the trigger is dropped.
61+
if catalog.FindTriggerByID(desc.(catalog.TableDescriptor), op.TriggerID) == nil {
62+
return nil
63+
}
64+
}
5865
return errors.AssertionFailedf("not implemented operation was hit "+
5966
"unexpectedly, no dropped descriptor was found. %v", op.ElementType)
6067
}

pkg/sql/schemachanger/scop/immediate_mutation.go

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type NotImplementedForPublicObjects struct {
3838
immediateMutationOp
3939
ElementType string
4040
DescID catid.DescID
41+
TriggerID catid.TriggerID
4142
}
4243

4344
// UndoAllInTxnImmediateMutationOpSideEffects undoes the side effects of all

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_enabled.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func init() {
2525
scpb.Status_PUBLIC,
2626
to(scpb.Status_ABSENT,
2727
emit(func(this *scpb.TriggerEnabled) *scop.NotImplementedForPublicObjects {
28-
return notImplementedForPublicObjects(this)
28+
return notImplementedForPublicTriggers(this, this.TriggerID)
2929
}),
3030
),
3131
),

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_events.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func init() {
2525
scpb.Status_PUBLIC,
2626
to(scpb.Status_ABSENT,
2727
emit(func(this *scpb.TriggerEvents) *scop.NotImplementedForPublicObjects {
28-
return notImplementedForPublicObjects(this)
28+
return notImplementedForPublicTriggers(this, this.TriggerID)
2929
}),
3030
),
3131
),

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_function_call.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func init() {
2727
scpb.Status_PUBLIC,
2828
to(scpb.Status_ABSENT,
2929
emit(func(this *scpb.TriggerFunctionCall) *scop.NotImplementedForPublicObjects {
30-
return notImplementedForPublicObjects(this)
30+
return notImplementedForPublicTriggers(this, this.TriggerID)
3131
}),
3232
),
3333
),

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_name.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func init() {
2525
scpb.Status_PUBLIC,
2626
to(scpb.Status_ABSENT,
2727
emit(func(this *scpb.TriggerName) *scop.NotImplementedForPublicObjects {
28-
return notImplementedForPublicObjects(this)
28+
return notImplementedForPublicTriggers(this, this.TriggerID)
2929
}),
3030
),
3131
),

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_timing.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func init() {
2525
scpb.Status_PUBLIC,
2626
to(scpb.Status_ABSENT,
2727
emit(func(this *scpb.TriggerTiming) *scop.NotImplementedForPublicObjects {
28-
return notImplementedForPublicObjects(this)
28+
return notImplementedForPublicTriggers(this, this.TriggerID)
2929
}),
3030
),
3131
),

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_transition.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func init() {
2727
scpb.Status_PUBLIC,
2828
to(scpb.Status_ABSENT,
2929
emit(func(this *scpb.TriggerTransition) *scop.NotImplementedForPublicObjects {
30-
return notImplementedForPublicObjects(this)
30+
return notImplementedForPublicTriggers(this, this.TriggerID)
3131
}),
3232
),
3333
),

pkg/sql/schemachanger/scplan/internal/opgen/opgen_trigger_when.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func init() {
2525
scpb.Status_PUBLIC,
2626
to(scpb.Status_ABSENT,
2727
emit(func(this *scpb.TriggerWhen) *scop.NotImplementedForPublicObjects {
28-
return notImplementedForPublicObjects(this)
28+
return notImplementedForPublicTriggers(this, this.TriggerID)
2929
}),
3030
),
3131
),

pkg/sql/schemachanger/scplan/internal/opgen/register.go

+11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scop"
1212
"github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scpb"
1313
"github.com/cockroachdb/cockroach/pkg/sql/schemachanger/screl"
14+
"github.com/cockroachdb/cockroach/pkg/sql/sem/catid"
1415
"github.com/cockroachdb/errors"
1516
)
1617

@@ -32,6 +33,16 @@ func notImplementedForPublicObjects(e scpb.Element) *scop.NotImplementedForPubli
3233
}
3334
}
3435

36+
func notImplementedForPublicTriggers(
37+
e scpb.Element, triggerID catid.TriggerID,
38+
) *scop.NotImplementedForPublicObjects {
39+
return &scop.NotImplementedForPublicObjects{
40+
ElementType: reflect.ValueOf(e).Type().Elem().String(),
41+
DescID: screl.GetDescID(e),
42+
TriggerID: triggerID,
43+
}
44+
}
45+
3546
func toPublic(initialStatus scpb.Status, specs ...transitionSpec) targetSpec {
3647
return asTargetSpec(scpb.Status_PUBLIC, initialStatus, specs...)
3748
}

pkg/sql/schemachanger/scplan/testdata/drop_table

+10
Original file line numberDiff line numberDiff line change
@@ -432,18 +432,23 @@ StatementPhase stage 1 of 1 with 141 MutationType ops
432432
*scop.NotImplementedForPublicObjects
433433
DescID: 109
434434
ElementType: scpb.TriggerName
435+
TriggerID: 1
435436
*scop.NotImplementedForPublicObjects
436437
DescID: 109
437438
ElementType: scpb.TriggerEnabled
439+
TriggerID: 1
438440
*scop.NotImplementedForPublicObjects
439441
DescID: 109
440442
ElementType: scpb.TriggerTiming
443+
TriggerID: 1
441444
*scop.NotImplementedForPublicObjects
442445
DescID: 109
443446
ElementType: scpb.TriggerEvents
447+
TriggerID: 1
444448
*scop.NotImplementedForPublicObjects
445449
DescID: 109
446450
ElementType: scpb.TriggerFunctionCall
451+
TriggerID: 1
447452
*scop.UpdateTableBackReferencesInTypes
448453
BackReferencedTableID: 109
449454
TypeIDs:
@@ -1136,18 +1141,23 @@ PreCommitPhase stage 2 of 2 with 152 MutationType ops
11361141
*scop.NotImplementedForPublicObjects
11371142
DescID: 109
11381143
ElementType: scpb.TriggerName
1144+
TriggerID: 1
11391145
*scop.NotImplementedForPublicObjects
11401146
DescID: 109
11411147
ElementType: scpb.TriggerEnabled
1148+
TriggerID: 1
11421149
*scop.NotImplementedForPublicObjects
11431150
DescID: 109
11441151
ElementType: scpb.TriggerTiming
1152+
TriggerID: 1
11451153
*scop.NotImplementedForPublicObjects
11461154
DescID: 109
11471155
ElementType: scpb.TriggerEvents
1156+
TriggerID: 1
11481157
*scop.NotImplementedForPublicObjects
11491158
DescID: 109
11501159
ElementType: scpb.TriggerFunctionCall
1160+
TriggerID: 1
11511161
*scop.UpdateTableBackReferencesInTypes
11521162
BackReferencedTableID: 109
11531163
TypeIDs:

0 commit comments

Comments
 (0)