cockroachdb / cockroachdb/cockroach
sql: v25.2.6: nil pointer when building the trigger with composite types
- Dominant language
- Go
- Stars
- 32.5k
- Forks
- 4.1k
- PR merge metrics
- PR metrics pending
Description
Reproduction courtesy of claude:
```sql
DROP TABLE IF EXISTS test_table CASCADE;
DROP TYPE IF EXISTS coord;
CREATE TABLE test_table (
id INT PRIMARY KEY,
value STRING
);
CREATE TYPE coord AS (x INT, y INT);
-- Create a trigger function that uses unnest on array of composite types
CREATE OR REPLACE FUNCTION test_trigger_func()
RETURNS TRIGGER AS $$
DECLARE
arr coord[];
elem coord;
BEGIN
arr := ARRAY[ROW(1,2)::coord, ROW(3,4)::coord];
-- unnest of composite type array might trigger the bug
elem := unnest(arr);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER test_trigger
BEFORE INSERT ON test_table
FOR EACH ROW
EXECUTE FUNCTION test_trigger_func();
```
This issue was auto filed by Sentry. It represents a crash or reported error on a live cluster with telemetry enabled.
Sentry Link: [https://cockroach-labs.sentry.io/issues/7065831133/?referrer=webhooks_plugin](https://cockroach-labs.sentry.io/issues/7065831133/?referrer=webhooks_plugin)
Panic Message:
```
catch.go:24: runtime error: invalid memory address or nil pointer dereference
(1) assertion failure
Wraps: (2) attached stack trace
-- stack trace:
| github.com/cockroachdb/cockroach/pkg/util/errorutil.ShouldCatch
| pkg/util/errorutil/catch.go:24
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).Build.func1
| pkg/sql/opt/optbuilder/builder.go:247
| runtime.gopanic
| GOROOT/src/runtime/panic.go:791
| runtime.panicmem
| GOROOT/src/runtime/panic.go:262
| runtime.sigpanic
| GOROOT/src/runtime/signal_unix.go:917
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).synthesizeColumn
| pkg/sql/opt/optbuilder/util.go:203
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).finishBuildGeneratorFunction
| pkg/sql/opt/optbuilder/srfs.go:203
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildFunction
| pkg/sql/opt/optbuilder/scalar.go:581
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildScalar
| pkg/sql/opt/optbuilder/scalar.go:329
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildSQLExpr
| pkg/sql/opt/optbuilder/plpgsql.go:2404
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*plpgsqlBuilder).addPLpgSQLAssign
| pkg/sql/opt/optbuilder/plpgsql.go:1561
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildPLpgSQLStatements
| pkg/sql/opt/optbuilder/plpgsql.go:727
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildBlock
| pkg/sql/opt/optbuilder/plpgsql.go:578
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildRootBlock
| pkg/sql/opt/optbuilder/plpgsql.go:442
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildFunctionForTrigger.func3
| pkg/sql/opt/optbuilder/create_trigger.go:250
| github.com/cockroachdb/cockroach/pkg/sql/opt/norm.(*FoldingControl).TemporarilyDisallowStableFolds
| pkg/sql/opt/norm/fold_constants_funcs.go:109
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildFunctionForTrigger
| pkg/sql/opt/optbuilder/create_trigger.go:245
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildCreateTrigger
| pkg/sql/opt/optbuilder/create_trigger.go:96
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildStmt
| pkg/sql/opt/optbuilder/builder.go:413
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildStmtAtRootWithScope
| pkg/sql/opt/optbuilder/builder.go:321
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).buildStmtAtRoot
| pkg/sql/opt/optbuilder/builder.go:302
| github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(*Builder).Build
| pkg/sql/opt/optbuilder/builder.go:281
| github.com/cockroachdb/cockroach/pkg/sql.(*optPlanningCtx).buildExecMemo
| pkg/sql/plan_opt.go:846
| github.com/cockroachdb/cockroach/pkg/sql.(*planner).makeOptimizerPlan
| pkg/sql/plan_opt.go:260
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).makeExecPlan
| pkg/sql/conn_executor_exec.go:3358
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).dispatchToExecutionEngine
| pkg/sql/conn_executor_exec.go:2905
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).execStmtInOpenState
| pkg/sql/conn_executor_exec.go:1087
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).execStmt.func2
| pkg/sql/conn_executor_exec.go:172
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).execWithProfiling
| pkg/sql/conn_executor_exec.go:4531
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).execStmt
| pkg/sql/conn_executor_exec.go:171
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).execCmd.func1
| pkg/sql/conn_executor.go:2461
| github.com/cockroachdb/cockroach/pkg/sql.(*connExecutor).execCmd
| pkg/sql/conn_executor.go:2466
Wraps: (3) runtime error: invalid memory address or nil pointer dereference
| -- cause hidden behind barrier
| runtime error: invalid memory address or nil pointer dereference
| (1) runtime error: invalid memory address or nil pointer dereference
| Error types: (1) runtime.errorString
Error types: (1) *assert.withAssertionFailure (2) *withstack.withStack (3) *barriers.barrierErr
-- report composition:
*barriers.barrierErr: masked error: runtime error: invalid memory address or nil pointer dereference
catch.go:24: *withstack.withStack (top exception)
*assert.withAssertionFailure
```
Stacktrace (expand for inline code snippets):
[pkg/sql/conn_executor.go#L2465-L2467](pkg/sql/conn_executor.go#L2465-L2467)
[pkg/sql/conn_executor.go#L2460-L2462](pkg/sql/conn_executor.go#L2460-L2462)
[pkg/sql/conn_executor_exec.go#L170-L172](pkg/sql/conn_executor_exec.go#L170-L172)
[pkg/sql/conn_executor_exec.go#L4530-L4532](pkg/sql/conn_executor_exec.go#L4530-L4532)
[pkg/sql/conn_executor_exec.go#L171-L173](pkg/sql/conn_executor_exec.go#L171-L173)
[pkg/sql/conn_executor_exec.go#L1086-L1088](pkg/sql/conn_executor_exec.go#L1086-L1088)
[pkg/sql/conn_executor_exec.go#L2904-L2906](pkg/sql/conn_executor_exec.go#L2904-L2906)
[pkg/sql/conn_executor_exec.go#L3357-L3359](pkg/sql/conn_executor_exec.go#L3357-L3359)
[pkg/sql/plan_opt.go#L259-L261](pkg/sql/plan_opt.go#L259-L261)
[pkg/sql/plan_opt.go#L845-L847](pkg/sql/plan_opt.go#L845-L847)
[pkg/sql/opt/optbuilder/builder.go#L280-L282](pkg/sql/opt/optbuilder/builder.go#L280-L282)
[pkg/sql/opt/optbuilder/builder.go#L301-L303](pkg/sql/opt/optbuilder/builder.go#L301-L303)
[pkg/sql/opt/optbuilder/builder.go#L320-L322](pkg/sql/opt/optbuilder/builder.go#L320-L322)
[pkg/sql/opt/optbuilder/builder.go#L412-L414](pkg/sql/opt/optbuilder/builder.go#L412-L414)
[pkg/sql/opt/optbuilder/create_trigger.go#L95-L97](pkg/sql/opt/optbuilder/create_trigger.go#L95-L97)
[pkg/sql/opt/optbuilder/create_trigger.go#L244-L246](pkg/sql/opt/optbuilder/create_trigger.go#L244-L246)
[pkg/sql/opt/norm/fold_constants_funcs.go#L108-L110](pkg/sql/opt/norm/fold_constants_funcs.go#L108-L110)
[pkg/sql/opt/optbuilder/create_trigger.go#L249-L251](pkg/sql/opt/optbuilder/create_trigger.go#L249-L251)
[pkg/sql/opt/optbuilder/plpgsql.go#L441-L443](pkg/sql/opt/optbuilder/plpgsql.go#L441-L443)
[pkg/sql/opt/optbuilder/plpgsql.go#L577-L579](pkg/sql/opt/optbuilder/plpgsql.go#L577-L579)
[pkg/sql/opt/optbuilder/plpgsql.go#L726-L728](pkg/sql/opt/optbuilder/plpgsql.go#L726-L728)
[pkg/sql/opt/optbuilder/plpgsql.go#L1560-L1562](pkg/sql/opt/optbuilder/plpgsql.go#L1560-L1562)
[pkg/sql/opt/optbuilder/plpgsql.go#L2403-L2405](pkg/sql/opt/optbuilder/plpgsql.go#L2403-L2405)
[pkg/sql/opt/optbuilder/scalar.go#L328-L330](pkg/sql/opt/optbuilder/scalar.go#L328-L330)
[pkg/sql/opt/optbuilder/scalar.go#L580-L582](pkg/sql/opt/optbuilder/scalar.go#L580-L582)
[pkg/sql/opt/optbuilder/srfs.go#L202-L204](pkg/sql/opt/optbuilder/srfs.go#L202-L204)
[pkg/sql/opt/optbuilder/util.go#L202-L204](pkg/sql/opt/optbuilder/util.go#L202-L204)
[GOROOT/src/runtime/signal_unix.go#L916-L918](GOROOT/src/runtime/signal_unix.go#L916-L918)
[GOROOT/src/runtime/panic.go#L261-L263](GOROOT/src/runtime/panic.go#L261-L263)
[GOROOT/src/runtime/panic.go#L790-L792](GOROOT/src/runtime/panic.go#L790-L792)
[pkg/sql/opt/optbuilder/builder.go#L246-L248](pkg/sql/opt/optbuilder/builder.go#L246-L248)
[pkg/util/errorutil/catch.go#L23-L25](pkg/util/errorutil/catch.go#L23-L25)
```
pkg/sql/conn_executor.go in pkg/sql.(*connExecutor).execCmd at line 2466
pkg/sql/conn_executor.go in pkg/sql.(*connExecutor).execCmd.func1 at line 2461
pkg/sql/conn_executor_exec.go in pkg/sql.(*connExecutor).execStmt at line 171
pkg/sql/conn_executor_exec.go in pkg/sql.(*connExecutor).execWithProfiling at line 4531
pkg/sql/conn_executor_exec.go in pkg/sql.(*connExecutor).execStmt.func2 at line 172
pkg/sql/conn_executor_exec.go in pkg/sql.(*connExecutor).execStmtInOpenState at line 1087
pkg/sql/conn_executor_exec.go in pkg/sql.(*connExecutor).dispatchToExecutionEngine at line 2905
pkg/sql/conn_executor_exec.go in pkg/sql.(*connExecutor).makeExecPlan at line 3358
pkg/sql/plan_opt.go in pkg/sql.(*planner).makeOptimizerPlan at line 260
pkg/sql/plan_opt.go in pkg/sql.(*optPlanningCtx).buildExecMemo at line 846
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).Build at line 281
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).buildStmtAtRoot at line 302
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).buildStmtAtRootWithScope at line 321
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).buildStmt at line 413
pkg/sql/opt/optbuilder/create_trigger.go in pkg/sql/opt/optbuilder.(*Builder).buildCreateTrigger at line 96
pkg/sql/opt/optbuilder/create_trigger.go in pkg/sql/opt/optbuilder.(*Builder).buildFunctionForTrigger at line 245
pkg/sql/opt/norm/fold_constants_funcs.go in pkg/sql/opt/norm.(*FoldingControl).TemporarilyDisallowStableFolds at line 109
pkg/sql/opt/optbuilder/create_trigger.go in pkg/sql/opt/optbuilder.(*Builder).buildFunctionForTrigger.func3 at line 250
pkg/sql/opt/optbuilder/plpgsql.go in pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildRootBlock at line 442
pkg/sql/opt/optbuilder/plpgsql.go in pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildBlock at line 578
pkg/sql/opt/optbuilder/plpgsql.go in pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildPLpgSQLStatements at line 727
pkg/sql/opt/optbuilder/plpgsql.go in pkg/sql/opt/optbuilder.(*plpgsqlBuilder).addPLpgSQLAssign at line 1561
pkg/sql/opt/optbuilder/plpgsql.go in pkg/sql/opt/optbuilder.(*plpgsqlBuilder).buildSQLExpr at line 2404
pkg/sql/opt/optbuilder/scalar.go in pkg/sql/opt/optbuilder.(*Builder).buildScalar at line 329
pkg/sql/opt/optbuilder/scalar.go in pkg/sql/opt/optbuilder.(*Builder).buildFunction at line 581
pkg/sql/opt/optbuilder/srfs.go in pkg/sql/opt/optbuilder.(*Builder).finishBuildGeneratorFunction at line 203
pkg/sql/opt/optbuilder/util.go in pkg/sql/opt/optbuilder.(*Builder).synthesizeColumn at line 203
GOROOT/src/runtime/signal_unix.go in runtime.sigpanic at line 917
GOROOT/src/runtime/panic.go in runtime.panicmem at line 262
GOROOT/src/runtime/panic.go in runtime.gopanic at line 791
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).Build.func1 at line 247
pkg/util/errorutil/catch.go in pkg/util/errorutil.ShouldCatch at line 24
```
### Tags
| Tag | Value |
| --- | --- |
| Command | mt start-sql |
| Environment | v25.2.6 |
| Go Version | go1.23.12 X:nocoverageredesign |
| Platform | linux amd64 |
| Distribution | CCL |
| Cockroach Release | v25.2.6 |
| Cockroach SHA | e9b11cf62097fae46d98b46d128f47e88b4fac55 |
| # of CPUs | 32 |
| # of Goroutines | 377 |
Jira issue: CRDB-57257
Contributor guide
Assessment
This issue has not been assessed yet.