cockroachdb / cockroach

CockroachDB — the cloud native, distributed SQL database designed for high availability, effortless scale, and control over data placement.
https://www.cockroachlabs.com
Other
30.05k stars 3.8k forks source link

v22.1.8: opt: FoldFunction called `array_length` builtin with a string argument; needed array argument #89969

Open cockroach-teamcity opened 2 years ago

cockroach-teamcity commented 2 years ago

This issue was autofiled by Sentry. It represents a crash or reported error on a live cluster with telemetry enabled.

Sentry link: https://sentry.io/organizations/cockroach-labs/issues/3670620999/?referrer=webhooks_plugin

Panic message:

datum.go:4202: expected DArray, found tree.DString (1) assertion failure Wraps: (2) attached stack trace -- stack trace: | github.com/cockroachdb/cockroach/pkg/sql/sem/tree.MustBeDArray | github.com/cockroachdb/cockroach/pkg/sql/sem/tree/datum.go:4202 | github.com/cockroachdb/cockroach/pkg/sql/sem/builtins.glob..func200 | github.com/cockroachdb/cockroach/pkg/sql/sem/builtins/builtins.go:3478 | github.com/cockroachdb/cockroach/pkg/sql/sem/tree.(FuncExpr).Eval | github.com/cockroachdb/cockroach/pkg/sql/sem/tree/eval.go:4393 | github.com/cockroachdb/cockroach/pkg/sql/opt/norm.(CustomFuncs).FoldFunction | github.com/cockroachdb/cockroach/pkg/sql/opt/norm/fold_constants_funcs.go:623 | github.com/cockroachdb/cockroach/pkg/sql/opt/norm.(Factory).ConstructFunction | github.com/cockroachdb/cockroach/bazel-out/k8-opt/bin/pkg/sql/opt/norm/factory.og.go:19858 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildFunction | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/scalar.go:543 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildScalar | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/scalar.go:322 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildProjectionList | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/project.go:181 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildSelectClause | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1009 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildSelectStmtWithoutParens | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:928 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildSelect.func1 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:901 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).processWiths | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/with.go:115 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildSelect | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:900 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildStmt | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:281 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).buildStmtAtRoot | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:241 | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder.(Builder).Build | github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:215 | github.com/cockroachdb/cockroach/pkg/sql.(optPlanningCtx).buildReusableMemo | github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:412 | github.com/cockroachdb/cockroach/pkg/sql.(planner).prepareUsingOptimizer | github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:152 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).populatePrepared | github.com/cockroachdb/cockroach/pkg/sql/conn_executor_prepare.go:287 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).prepare.func2 | github.com/cockroachdb/cockroach/pkg/sql/conn_executor_prepare.go:239 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).prepare | github.com/cockroachdb/cockroach/pkg/sql/conn_executor_prepare.go:244 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).addPreparedStmt | github.com/cockroachdb/cockroach/pkg/sql/conn_executor_prepare.go:107 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).execPrepare | github.com/cockroachdb/cockroach/pkg/sql/conn_executor_prepare.go:68 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).execCmd | github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1993 | github.com/cockroachdb/cockroach/pkg/sql.(connExecutor).run | github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1817 | github.com/cockroachdb/cockroach/pkg/sql.(Server).ServeConn | github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:763 | github.com/cockroachdb/cockroach/pkg/sql/pgwire.(conn).processCommandsAsync.func1 | github.com/cockroachdb/cockroach/pkg/sql/pgwire/conn.go:728 | runtime.goexit | GOROOT/src/runtime/asm_amd64.s:1581 Wraps: (3) expected DArray, found tree.DString Error types: (1) assert.withAssertionFailure (2) withstack.withStack (3) errutil.leafError -- report composition: errutil.leafError: expected DArray, found tree.DString datum.go:4202: withstack.withStack (top exception) *assert.withAssertionFailure

Stacktrace (expand for inline code snippets): https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/sem/tree/datum.go#L4201-L4203 in pkg/sql/sem/tree.MustBeDArray https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/sem/builtins/builtins.go#L3477-L3479 in pkg/sql/sem/builtins.glob..func200 https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/sem/tree/eval.go#L4392-L4394 in pkg/sql/sem/tree.(*FuncExpr).Eval https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/norm/fold_constants_funcs.go#L622-L624 in pkg/sql/opt/norm.(*CustomFuncs).FoldFunction https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/bazel-out/k8-opt/bin/pkg/sql/opt/norm/factory.og.go#L19857-L19859 in pkg/sql/opt/norm.(*Factory).ConstructFunction https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/scalar.go#L542-L544 in pkg/sql/opt/optbuilder.(*Builder).buildFunction https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/scalar.go#L321-L323 in pkg/sql/opt/optbuilder.(*Builder).buildScalar https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/project.go#L180-L182 in pkg/sql/opt/optbuilder.(*Builder).buildProjectionList https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/select.go#L1008-L1010 in pkg/sql/opt/optbuilder.(*Builder).buildSelectClause https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/select.go#L927-L929 in pkg/sql/opt/optbuilder.(*Builder).buildSelectStmtWithoutParens https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/select.go#L900-L902 in pkg/sql/opt/optbuilder.(*Builder).buildSelect.func1 https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/with.go#L114-L116 in pkg/sql/opt/optbuilder.(*Builder).processWiths https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/select.go#L899-L901 in pkg/sql/opt/optbuilder.(*Builder).buildSelect https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/builder.go#L280-L282 in pkg/sql/opt/optbuilder.(*Builder).buildStmt https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/builder.go#L240-L242 in pkg/sql/opt/optbuilder.(*Builder).buildStmtAtRoot https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/opt/optbuilder/builder.go#L214-L216 in pkg/sql/opt/optbuilder.(*Builder).Build https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/plan_opt.go#L411-L413 in pkg/sql.(*optPlanningCtx).buildReusableMemo https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/plan_opt.go#L151-L153 in pkg/sql.(*planner).prepareUsingOptimizer https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor_prepare.go#L286-L288 in pkg/sql.(*connExecutor).populatePrepared https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor_prepare.go#L238-L240 in pkg/sql.(*connExecutor).prepare.func2 https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor_prepare.go#L243-L245 in pkg/sql.(*connExecutor).prepare https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor_prepare.go#L106-L108 in pkg/sql.(*connExecutor).addPreparedStmt https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor_prepare.go#L67-L69 in pkg/sql.(*connExecutor).execPrepare https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor.go#L1992-L1994 in pkg/sql.(*connExecutor).execCmd https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor.go#L1816-L1818 in pkg/sql.(*connExecutor).run https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/conn_executor.go#L762-L764 in pkg/sql.(*Server).ServeConn https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/pgwire/conn.go#L727-L729 in pkg/sql/pgwire.(*conn).processCommandsAsync.func1 GOROOT/src/runtime/asm_amd64.s#L1580-L1582 in runtime.goexit
pkg/sql/sem/tree/datum.go in pkg/sql/sem/tree.MustBeDArray at line 4202
pkg/sql/sem/builtins/builtins.go in pkg/sql/sem/builtins.glob..func200 at line 3478
pkg/sql/sem/tree/eval.go in pkg/sql/sem/tree.(*FuncExpr).Eval at line 4393
pkg/sql/opt/norm/fold_constants_funcs.go in pkg/sql/opt/norm.(*CustomFuncs).FoldFunction at line 623
bazel-out/k8-opt/bin/pkg/sql/opt/norm/factory.og.go in pkg/sql/opt/norm.(*Factory).ConstructFunction at line 19858
pkg/sql/opt/optbuilder/scalar.go in pkg/sql/opt/optbuilder.(*Builder).buildFunction at line 543
pkg/sql/opt/optbuilder/scalar.go in pkg/sql/opt/optbuilder.(*Builder).buildScalar at line 322
pkg/sql/opt/optbuilder/project.go in pkg/sql/opt/optbuilder.(*Builder).buildProjectionList at line 181
pkg/sql/opt/optbuilder/select.go in pkg/sql/opt/optbuilder.(*Builder).buildSelectClause at line 1009
pkg/sql/opt/optbuilder/select.go in pkg/sql/opt/optbuilder.(*Builder).buildSelectStmtWithoutParens at line 928
pkg/sql/opt/optbuilder/select.go in pkg/sql/opt/optbuilder.(*Builder).buildSelect.func1 at line 901
pkg/sql/opt/optbuilder/with.go in pkg/sql/opt/optbuilder.(*Builder).processWiths at line 115
pkg/sql/opt/optbuilder/select.go in pkg/sql/opt/optbuilder.(*Builder).buildSelect at line 900
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).buildStmt at line 281
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).buildStmtAtRoot at line 241
pkg/sql/opt/optbuilder/builder.go in pkg/sql/opt/optbuilder.(*Builder).Build at line 215
pkg/sql/plan_opt.go in pkg/sql.(*optPlanningCtx).buildReusableMemo at line 412
pkg/sql/plan_opt.go in pkg/sql.(*planner).prepareUsingOptimizer at line 152
pkg/sql/conn_executor_prepare.go in pkg/sql.(*connExecutor).populatePrepared at line 287
pkg/sql/conn_executor_prepare.go in pkg/sql.(*connExecutor).prepare.func2 at line 239
pkg/sql/conn_executor_prepare.go in pkg/sql.(*connExecutor).prepare at line 244
pkg/sql/conn_executor_prepare.go in pkg/sql.(*connExecutor).addPreparedStmt at line 107
pkg/sql/conn_executor_prepare.go in pkg/sql.(*connExecutor).execPrepare at line 68
pkg/sql/conn_executor.go in pkg/sql.(*connExecutor).execCmd at line 1993
pkg/sql/conn_executor.go in pkg/sql.(*connExecutor).run at line 1817
pkg/sql/conn_executor.go in pkg/sql.(*Server).ServeConn at line 763
pkg/sql/pgwire/conn.go in pkg/sql/pgwire.(*conn).processCommandsAsync.func1 at line 728
GOROOT/src/runtime/asm_amd64.s in runtime.goexit at line 1581
Tag Value
Cockroach Release v22.1.8
Cockroach SHA: bdcab67f778617515597f1012f37f14f622b15a0
Platform linux amd64
Distribution CCL
Environment v22.1.8
Command server
Go Version ``
# of CPUs
# of Goroutines

Jira issue: CRDB-20524

rafiss commented 2 years ago

This is the code that panic'd https://github.com/cockroachdb/cockroach/blob/bdcab67f778617515597f1012f37f14f622b15a0/pkg/sql/sem/builtins/builtins.go#L3473-L3487

michae2 commented 2 years ago

Repro:

SELECT array_length('{}', 1);
rafiss commented 2 years ago

Let me know if I can help with this. To convert that to an array, we need to use the tree.ParseDArrayFromString function which my team has done work on.

michae2 commented 2 years ago

I think throwing an error would be ok. Here's PostgreSQL 14.5:

michae2=# SELECT array_length('{a}'::text[], 1);
 array_length
--------------
            1
(1 row)

michae2=# SELECT array_length('{}'::text[], 1);
 array_length
--------------

(1 row)

michae2=# SELECT array_length('{a}', 1);
2022-10-17 14:04:57.274 PDT [15585] ERROR:  could not determine polymorphic type because input has type unknown
2022-10-17 14:04:57.274 PDT [15585] STATEMENT:  SELECT array_length('{a}', 1);
ERROR:  could not determine polymorphic type because input has type unknown

michae2=# SELECT array_length('{}', 1);
2022-10-17 14:03:47.327 PDT [15585] ERROR:  could not determine polymorphic type because input has type unknown
2022-10-17 14:03:47.327 PDT [15585] STATEMENT:  SELECT array_length('{}', 1);
ERROR:  could not determine polymorphic type because input has type unknown

And here's tip of master (v22.2.0-alpha.3-1196-g7be0b20edb):

demo@127.0.0.1:26257/defaultdb> SELECT array_length('{a}'::string[], 1);
  array_length
----------------
             1
(1 row)

Time: 1ms total (execution 1ms / network 0ms)

demo@127.0.0.1:26257/defaultdb> SELECT array_length('{}'::string[], 1);
  array_length
----------------
          NULL
(1 row)

Time: 1ms total (execution 0ms / network 0ms)

demo@127.0.0.1:26257/defaultdb> SELECT array_length('{a}', 1);
ERROR: unknown signature: array_length(string, int)
SQLSTATE: 42883

demo@127.0.0.1:26257/defaultdb> SELECT array_length('{}', 1);
ERROR: internal error: expected *DArray, found *tree.DString
SQLSTATE: XX000
DETAIL: stack trace:
github.com/cockroachdb/cockroach/pkg/sql/sem/tree/datum.go:4359: MustBeDArray()
github.com/cockroachdb/cockroach/pkg/sql/sem/builtins/builtins.go:3473: func179()
github.com/cockroachdb/cockroach/pkg/sql/sem/eval/expr.go:479: EvalFuncExpr()
github.com/cockroachdb/cockroach/bazel-out/darwin-fastbuild/bin/pkg/sql/sem/tree/eval_expr_generated.go:266: Eval()
github.com/cockroachdb/cockroach/pkg/sql/sem/eval/expr.go:26: Expr()
github.com/cockroachdb/cockroach/pkg/sql/opt/norm/fold_constants_funcs.go:636: FoldFunction()
github.com/cockroachdb/cockroach/bazel-out/darwin-fastbuild/bin/pkg/sql/opt/norm/factory.og.go:19928: ConstructFunction()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/scalar.go:560: buildFunction()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/scalar.go:333: buildScalar()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/project.go:181: buildProjectionList()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1081: buildSelectClause()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1000: buildSelectStmtWithoutParens()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:969: func1()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/with.go:116: processWiths()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:968: buildSelect()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:305: buildStmt()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:252: buildStmtAtRoot()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:226: Build()
github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:563: buildExecMemo()
github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:231: makeOptimizerPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1477: makeExecPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1102: dispatchToExecutionEngine()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:731: execStmtInOpenState()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:129: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:2423: execWithProfiling()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:128: execStmt()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1921: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1926: execCmd()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1846: run()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:828: ServeConn()
github.com/cockroachdb/cockroach/pkg/sql/pgwire/conn.go:728: func1()
GOROOT/src/runtime/asm_amd64.s:1594: goexit()

HINT: You have encountered an unexpected error.

Please check the public issue tracker to check whether this problem is
already tracked. If you cannot find it there, please report the error
with details by creating a new issue.

If you would rather not post publicly, please contact us directly
using the support form.

We appreciate your feedback.
michae2 commented 2 years ago

This is a regression in 22.1.0. On 21.2.17 we return an error instead of asserting:

demo@127.0.0.1:26257/defaultdb> SELECT array_length('{}', 1);
ERROR: unknown signature: array_length(string, int)
SQLSTATE: 42883
github-actions[bot] commented 4 months ago

We have marked this issue as stale because it has been inactive for 12 months. If this issue is still relevant, removing the stale label or adding a comment will keep it active. Otherwise, we'll close it in 10 days to keep the issue queue tidy.