Skip to content

Commit 45340d6

Browse files
committed
sql: refactor render function for ShowCreateTrigger()
Moved `renderCreateTriggerStatement()` into `show_trigger.go` and used it in `ShowCreateTrigger()` to avoid repeating the code for generating trigger create statements. Also, removes the work-around explicitly iterating over query, as the SQL query execution bug is fixed. Release note: None Epic: CRDB-49582
1 parent 2341388 commit 45340d6

File tree

6 files changed

+110
-198
lines changed

6 files changed

+110
-198
lines changed

pkg/sql/conn_executor_exec.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3458,8 +3458,7 @@ func (ex *connExecutor) makeExecPlan(
34583458
// session var is set to 'true' ('false' is the default).
34593459
catalog = planner.optPlanningCtx.catalog
34603460
}
3461-
planStr := ih.planGist.String()
3462-
_, err := explain.DecodePlanGistToRows(ctx, &planner.extendedEvalCtx.Context, planStr, catalog)
3461+
_, err := explain.DecodePlanGistToRows(ctx, &planner.extendedEvalCtx.Context, ih.planGist.String(), catalog)
34633462
if err != nil {
34643463
return ctx, errors.NewAssertionErrorWithWrappedErrf(err, "failed to decode plan gist: %q", ih.planGist.String())
34653464
}

pkg/sql/crdb_internal.go

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -3944,91 +3944,6 @@ CREATE TABLE crdb_internal.create_procedure_statements (
39443944
populate: createRoutinePopulate(true /* procedure */),
39453945
}
39463946

3947-
func renderCreateTriggerStatement(
3948-
ctx context.Context,
3949-
p *planner,
3950-
trigger *descpb.TriggerDescriptor,
3951-
tableDesc catalog.TableDescriptor,
3952-
) (string, error) {
3953-
tableTyp, err := p.ResolveTypeByOID(ctx, typedesc.TableIDToImplicitTypeOID(tableDesc.GetID()))
3954-
if err != nil {
3955-
return "", err
3956-
}
3957-
3958-
funcName, err := p.GetQualifiedFunctionNameByID(ctx, int64(trigger.FuncID))
3959-
if err != nil {
3960-
return "", err
3961-
}
3962-
3963-
tableName, err := p.getQualifiedTableName(ctx, tableDesc)
3964-
if err != nil {
3965-
return "", err
3966-
}
3967-
3968-
events := make([]*tree.TriggerEvent, len(trigger.Events))
3969-
for j := range events {
3970-
descEvent := trigger.Events[j]
3971-
events[j] = &tree.TriggerEvent{
3972-
EventType: tree.TriggerEventTypeToTree[descEvent.Type],
3973-
Columns: make(tree.NameList, 0, len(descEvent.ColumnNames)),
3974-
}
3975-
for _, colName := range descEvent.ColumnNames {
3976-
events[j].Columns = append(events[j].Columns, tree.Name(colName))
3977-
}
3978-
}
3979-
3980-
var transitions []*tree.TriggerTransition
3981-
if trigger.NewTransitionAlias != "" {
3982-
transitions = append(transitions, &tree.TriggerTransition{
3983-
IsNew: true,
3984-
Name: tree.Name(trigger.NewTransitionAlias),
3985-
})
3986-
}
3987-
if trigger.OldTransitionAlias != "" {
3988-
transitions = append(transitions, &tree.TriggerTransition{
3989-
IsNew: false,
3990-
Name: tree.Name(trigger.OldTransitionAlias),
3991-
})
3992-
}
3993-
3994-
forEach := tree.TriggerForEachStatement
3995-
if trigger.ForEachRow {
3996-
forEach = tree.TriggerForEachRow
3997-
}
3998-
3999-
var whenExpr tree.Expr
4000-
if trigger.WhenExpr != "" {
4001-
whenExpr, err = schemaexpr.ParseTriggerWhenExprForDisplay(
4002-
ctx, tableTyp, trigger.WhenExpr, p.EvalContext(), p.SemaCtx(), tree.FmtParsable,
4003-
)
4004-
if err != nil {
4005-
return "", err
4006-
}
4007-
}
4008-
4009-
createTrigger := &tree.CreateTrigger{
4010-
Replace: false,
4011-
Name: tree.Name(trigger.Name),
4012-
ActionTime: tree.TriggerActionTimeToTree[trigger.ActionTime],
4013-
Events: events,
4014-
TableName: tableName.ToUnresolvedObjectName(),
4015-
Transitions: transitions,
4016-
ForEach: forEach,
4017-
When: whenExpr,
4018-
FuncName: funcName.ToUnresolvedObjectName().ToUnresolvedName(),
4019-
FuncArgs: trigger.FuncArgs,
4020-
}
4021-
4022-
f := tree.NewFmtCtx(
4023-
tree.FmtParsable,
4024-
tree.FmtDataConversionConfig(p.SessionData().DataConversionConfig),
4025-
tree.FmtLocation(p.SessionData().Location),
4026-
)
4027-
f.FormatNode(createTrigger)
4028-
4029-
return f.CloseAndGetString(), nil
4030-
}
4031-
40323947
func createTriggerPopulate(
40333948
ctx context.Context, p *planner, db catalog.DatabaseDescriptor, addRow func(...tree.Datum) error,
40343949
) error {

pkg/sql/sem/builtins/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ go_library(
2424
"show_create_all_routines_builtin.go",
2525
"show_create_all_schemas_builtin.go",
2626
"show_create_all_tables_builtin.go",
27-
"show_create_all_triggers.go",
27+
"show_create_all_triggers_builtin.go",
2828
"show_create_all_types_builtin.go",
2929
"trigram_builtins.go",
3030
"tsearch_builtins.go",

pkg/sql/sem/builtins/generator_builtins.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,7 @@ The output can be used to recreate a database.'
583583
},
584584
showCreateAllTriggersGeneratorType,
585585
makeShowCreateAllTriggersGenerator,
586-
`Returns rows of CREATE trigger statements.
587-
The output can be used to recreate a database.`,
586+
`Returns rows of CREATE trigger statements. The output can be used to recreate a database.`,
588587
volatility.Volatile,
589588
),
590589
),
@@ -3097,7 +3096,7 @@ func makeShowCreateAllTablesGenerator(
30973096
type showCreateAllTriggersGenerator struct {
30983097
evalPlanner eval.Planner
30993098
txn *kv.Txn
3100-
ids []triggerIdPair
3099+
ids []tableTriggerPair
31013100
dbName string
31023101
acc mon.BoundAccount
31033102

pkg/sql/sem/builtins/show_create_all_triggers.go renamed to pkg/sql/sem/builtins/show_create_all_triggers_builtin.go

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@ import (
1919
"github.com/cockroachdb/errors"
2020
)
2121

22-
type triggerIdPair struct {
22+
type tableTriggerPair struct {
2323
triggerID int64
2424
tableID int64
2525
}
2626

2727
func getTriggerIds(
2828
ctx context.Context, evalPlanner eval.Planner, txn *kv.Txn, dbName string, acc *mon.BoundAccount,
29-
) (triggerIds []triggerIdPair, retErr error) { //TODO: Check up on ID field names etc
30-
//TODO: Want to get (trigger_id, table_id)
29+
) (triggerIds []tableTriggerPair, retErr error) { //TODO: Check up on ID field names etc
3130
query := fmt.Sprintf(`
3231
SELECT trigger_id, table_id
3332
FROM %s.crdb_internal.create_trigger_statements
@@ -50,7 +49,7 @@ WHERE database_name=$1`, lexbase.EscapeSQLIdent(dbName))
5049
for ok, err = it.Next(ctx); ok; ok, err = it.Next(ctx) {
5150
triggerID := tree.MustBeDInt(it.Cur()[0])
5251
tableID := tree.MustBeDInt(it.Cur()[1])
53-
pair := triggerIdPair{int64(triggerID), int64(tableID)}
52+
pair := tableTriggerPair{int64(triggerID), int64(tableID)}
5453
triggerIds = append(triggerIds, pair)
5554
if err = acc.Grow(ctx, int64(unsafe.Sizeof(pair))); err != nil {
5655
return nil, err
@@ -66,47 +65,27 @@ func getTriggerCreateStatement(
6665
ctx context.Context,
6766
evalPlanner eval.Planner,
6867
txn *kv.Txn,
69-
triggerIDPair triggerIdPair,
68+
tableTriggerIds tableTriggerPair,
7069
dbName string,
7170
) (_ tree.Datum, err error) {
71+
// Here, we query by `table_id` and 'trigger_id' but the query is only actually indexed by 'table_id'.
72+
// This is because the `crdb_internal.create_trigger_statements` table only has a virtual index on `table_id`
73+
// due to the fact that internal virtual tables do not support multi-column indexes
74+
// and `trigger_id` values are only unique within a table, not between tables.
7275
query := fmt.Sprintf(`
7376
SELECT create_statement, trigger_id
7477
FROM %s.crdb_internal.create_trigger_statements
75-
WHERE table_id = $1`, lexbase.EscapeSQLIdent(dbName))
78+
WHERE table_id = $1 AND trigger_id=$2`, lexbase.EscapeSQLIdent(dbName))
7679

77-
iter, err := evalPlanner.QueryIteratorEx(ctx,
80+
row, err := evalPlanner.QueryRowEx(
81+
ctx,
7882
"crdb_internal.show_create_all_triggers",
7983
sessiondata.NoSessionDataOverride,
8084
query,
81-
triggerIDPair.tableID)
85+
tableTriggerIds.tableID, tableTriggerIds.triggerID)
8286
if err != nil {
8387
return nil, err
8488
}
8589

86-
defer func() {
87-
closeErr := iter.Close()
88-
err = errors.CombineErrors(err, closeErr)
89-
}()
90-
for {
91-
next, err := iter.Next(ctx)
92-
if err != nil {
93-
return nil, err
94-
}
95-
if !next {
96-
break
97-
}
98-
row := iter.Cur()
99-
if len(row) != 2 {
100-
return nil, errors.Newf("expected 2 columns in result, got %d", len(row))
101-
}
102-
if tree.MustBeDInt(row[1]) != tree.DInt(triggerIDPair.triggerID) {
103-
continue
104-
}
105-
return row[0], nil
106-
}
107-
108-
if err != nil {
109-
return nil, err
110-
}
111-
return nil, nil
90+
return row[0], nil
11291
}

0 commit comments

Comments
 (0)