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
29.97k stars 3.79k forks source link

sql: empty tuple comparison triggers Internal Error from optimizer #94087

Open SteveLeungYL opened 1 year ago

SteveLeungYL commented 1 year ago

Describe the problem

The latest version of the CockroachDB (ce9c9bc9b0bb) shows Internal Error when executing the following query:

CREATE TABLE v0 (c1 INT, c2 INT);
SELECT * FROM v0 WHERE (c1, c2) < (());

To Reproduce

Here is the detail steps to reproduce the bug.

  1. In operating system Ubuntu 20.04, download the CockroachDB source code from the github source.
  2. Use the latest version of the CockroachDB code (tested version: ce9c9bc9b0bb)
  3. Directly make install in the root repository folder.
  4. Run ./cockroach demo, and then paste the PoC query to the cockroach cli environment.
  5. Observe the Internal Error and log the stack information.

Expected behavior The SELECT statement should return an empty result.

Additional data / screenshots

Here is the outputted stack trace:

ERROR: internal error: runtime error: index out of range [0] with length 0
SQLSTATE: XX000
DETAIL: stack trace:
github.com/cockroachdb/cockroach/pkg/util/errorutil/catch.go:29: ShouldCatch()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/builder.go:192: func1()
runtime/panic.go:884: gopanic()
runtime/panic.go:113: goPanicIndex()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/constraint_builder.go:368: buildConstraintForTupleInequality()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/constraint_builder.go:580: buildConstraints()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/logical_props_builder.go:1534: buildFiltersItemProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/expr.og.go:9270: PopulateProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/norm/factory.og.go:12470: ConstructFiltersItem()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1190: buildWhere()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1061: buildSelectClause()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1006: buildSelectStmtWithoutParens()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:975: func1()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/with.go:117: processWiths()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:974: 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:570: buildExecMemo()
github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:237: makeOptimizerPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1518: makeExecPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1125: dispatchToExecutionEngine()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:737: execStmtInOpenState()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:130: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:2514: execWithProfiling()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:129: execStmt()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1955: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1960: execCmd()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1878: run()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:834: ServeConn()
github.com/cockroachdb/cockroach/pkg/sql/pgwire/conn.go:728: func1()
runtime/asm_amd64.s:1594: goexit()

HINT: You have encountered an unexpected error.

Environment:

cockroach version details:
Build Tag:        v23.1.0-alpha.1-255-gce9c9bc9b0
Build Time:       2022/12/21 18:42:53
Distribution:     CCL
Platform:         linux amd64 (x86_64-linux-gnu)
Go Version:       go1.19
C Compiler:       gcc 9.4.0
Build Commit ID:  ce9c9bc9b0bb3d2226d6326240d57539b4c99648
Build Type:       development

Additional context

The Internal Error problem is reproducible on version v23.1 alpha, v22.2.0 Production Releases and v22.1.*.

Jira issue: CRDB-22686

blathers-crl[bot] commented 1 year ago

Hello, I am Blathers. I am here to help you get the issue triaged.

Hoot - a bug! Though bugs are the bane of my existence, rest assured the wretched thing will get the best of care here.

I have CC'd a few people who may be able to assist you:

If we have not gotten back to your issue within a few business days, you can try the following:

:owl: Hoot! I am a Blathers, a bot for CockroachDB. My owner is otan.

mgartner commented 1 year ago

Thanks for this report.

This is present all the way back in v19.2.

mgartner commented 1 year ago

Here's a similar bug with sort-of the same root cause:

In CRDB:

defaultdb> SELECT (1, 2) < CASE WHEN true THEN (1, 2, 3) ELSE (1, 2, 3) END;
  ?column?
------------
     f
(1 row)

In Postgres:

marcus=# SELECT (1, 2) < CASE WHEN true THEN (1, 2, 3) ELSE (1, 2, 3) END;
ERROR:  42804: cannot compare record types with different numbers of columns
LOCATION:  record_cmp, rowtypes.c:1023
SteveLeungYL commented 1 year ago

Here is a bug that shares potentially the same root cause:

CREATE TABLE v0 (c1 INT);
SELECT * FROM v0 WHERE (()) = 'dwt8t24fv';

Stack trace:

demo@127.0.0.1:26257/movr> CREATE TABLE v0 (c1 INT);

CREATE TABLE

Time: 20ms total (execution 19ms / network 1ms)

demo@127.0.0.1:26257/movr> SELECT * FROM v0 WHERE (()) = 'dwt8t24fv';

ERROR: internal error: comparison overload not found (eq, tuple, string)
SQLSTATE: XX000
DETAIL: stack trace:
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/logical_props_builder.go:1682: BuildSharedProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/logical_props_builder.go:1529: buildFiltersItemProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/expr.og.go:9270: PopulateProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/norm/factory.og.go:12470: ConstructFiltersItem()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1190: buildWhere()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1061: buildSelectClause()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1006: buildSelectStmtWithoutParens()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:975: func1()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/with.go:117: processWiths()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:974: 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:570: buildExecMemo()
github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:237: makeOptimizerPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1518: makeExecPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1125: dispatchToExecutionEngine()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:737: execStmtInOpenState()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:130: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:2514: execWithProfiling()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:129: execStmt()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1955: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1960: execCmd()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1878: run()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:834: ServeConn()
github.com/cockroachdb/cockroach/pkg/sql/pgwire/conn.go:728: func1()
runtime/asm_arm64.s:1165: goexit()

HINT: You have encountered an unexpected error.
SteveLeungYL commented 1 year ago

Another bug that shares potentially the same root cause:

create table v0 (v1 int);
SELECT * FROM v0 WHERE (SELECT () FROM (VALUES (-61.309167, 'csf5ytz20', '22:51:37.5110+2'::TIMETZ, '65p9eb', '05-04-0858 BC 22:46:23.7669-5'::TIMESTAMPTZ)) AS ta65) = '0tnj8ir';
demo@127.0.0.1:26257/movr> SELECT * FROM v0 WHERE (SELECT () FROM (VALUES (-61.309167, 'csf5ytz20', '22:51:37.5110+2'::TIMETZ, '65p9eb', '05-04-0858 BC
                        -> 22:46:23.7669-5'::TIMESTAMPTZ)) AS ta65) = '0tnj8ir';

ERROR: internal error: comparison overload not found (eq, tuple, string)
SQLSTATE: XX000
DETAIL: stack trace:
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/logical_props_builder.go:1682: BuildSharedProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/logical_props_builder.go:1529: buildFiltersItemProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/memo/expr.og.go:9270: PopulateProps()
github.com/cockroachdb/cockroach/pkg/sql/opt/norm/factory.og.go:12470: ConstructFiltersItem()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1190: buildWhere()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1061: buildSelectClause()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:1006: buildSelectStmtWithoutParens()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:975: func1()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/with.go:117: processWiths()
github.com/cockroachdb/cockroach/pkg/sql/opt/optbuilder/select.go:974: 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:570: buildExecMemo()
github.com/cockroachdb/cockroach/pkg/sql/plan_opt.go:237: makeOptimizerPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1518: makeExecPlan()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:1125: dispatchToExecutionEngine()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:737: execStmtInOpenState()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:130: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:2514: execWithProfiling()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor_exec.go:129: execStmt()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1955: func1()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1960: execCmd()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:1878: run()
github.com/cockroachdb/cockroach/pkg/sql/conn_executor.go:834: ServeConn()
github.com/cockroachdb/cockroach/pkg/sql/pgwire/conn.go:728: func1()
runtime/asm_arm64.s:1165: goexit()

HINT: You have encountered an unexpected error.