Skip to content

Panic when Using INNER JOIN #7235

Description

@suyZhong

The following test case caused runtime error: invalid memory address or nil pointer dereference.

CREATE TABLE t0(c1 INT);
CREATE TABLE t1(c1 BOOL);
SELECT * FROM t0 INNER  JOIN t1 ON (t1.c1 IN (false IN ('(')));

Here's my error trace:

ERRO[0014] mysql_server caught panic:
runtime error: invalid memory address or nil pointer dereference
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/indexed_joins.go:117 (0x1c5f75a)
        com/dolthub/go-mysql-server/sql/analyzer.replanJoin.func1: panic(r)
/home/suyang/go/src/runtime/panic.go:914 (0x43ce1e)
        gopanic: done = runOpenDeferFrame(d)
/home/suyang/go/src/runtime/panic.go:261 (0x454617)
        panicmem: panic(memoryError)
/home/suyang/go/src/runtime/signal_unix.go:861 (0x4545e5)
        sigpanic: panicmem()
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/expression/in.go:339 (0x17d8af1)
        com/dolthub/go-mysql-server/sql/expression.convertOrTruncate: ctx.Session.Warn(&warning)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/expression/in.go:120 (0x17d75c4)
        com/dolthub/go-mysql-server/sql/expression.(*InTuple).Eval: right, err := convertOrTruncate(ctx, originalRight, typ)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/costed_index_scan.go:1372 (0x1c54af5)
        com/dolthub/go-mysql-server/sql/analyzer.newLeaf: value, err := lit.Eval(nil, nil)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/costed_index_scan.go:576 (0x1c50c96)
        com/dolthub/go-mysql-server/sql/analyzer.(*indexCoster).flatten: leaf, ok := newLeaf(c.i, e, c.underlyingName)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/costed_index_scan.go:124 (0x1c4dc19)
        com/dolthub/go-mysql-server/sql/analyzer.getCostedIndexScan: root, leftover, imprecise := c.flatten(expression.JoinAnd(filters...))
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/costed_index_scan.go:315 (0x1c4f1ba)
        com/dolthub/go-mysql-server/sql/analyzer.addIndexScans.func1: ita, stat, filters, err := getCostedIndexScan(m.Ctx, m.StatsProvider(), rt, sqlIndexes, filter.Filters)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/memo/dfs.go:37 (0x1b83b03)
        com/dolthub/go-mysql-server/sql/memo.dfsRelHelper: err := cb(n)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/memo/dfs.go:32 (0x1b83b46)
        com/dolthub/go-mysql-server/sql/memo.dfsRelHelper: err := dfsRelHelper(c, seen, cb)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/memo/dfs.go:16 (0x1b839cb)
        com/dolthub/go-mysql-server/sql/memo.DfsRel: err := dfsRelHelper(grp, seen, cb)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/costed_index_scan.go:262 (0x1c4ebf5)
        com/dolthub/go-mysql-server/sql/analyzer.addIndexScans: return memo.DfsRel(m.Root(), func(e memo.RelExpr) error {
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/indexed_joins.go:125 (0x1c5f0a4)
        com/dolthub/go-mysql-server/sql/analyzer.replanJoin: err = addIndexScans(m)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/indexed_joins.go:93 (0x1c5e795)
        com/dolthub/go-mysql-server/sql/analyzer.inOrderReplanJoin: ret, err := replanJoin(ctx, j, a, scope)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/indexed_joins.go:68 (0x1c5e932)
        com/dolthub/go-mysql-server/sql/analyzer.inOrderReplanJoin: newChild, same, err := inOrderReplanJoin(ctx, a, scope, sch, children[i], isUpdate)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/indexed_joins.go:46 (0x1c5e3b1)
        com/dolthub/go-mysql-server/sql/analyzer.optimizeJoins: ret, same, err := inOrderReplanJoin(ctx, a, scope, nil, n, isUpdate)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/batch.go:89 (0x1c491ca)
        com/dolthub/go-mysql-server/sql/analyzer.(*Batch).evalOnce: next, same, err = rule.Apply(ctx, a, prev, scope, sel)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/batch.go:63 (0x1c48ece)
        com/dolthub/go-mysql-server/sql/analyzer.(*Batch).EvalWithSelector: cur, _, err := b.evalOnce(ctx, a, n, scope, sel)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/batch.go:55 (0x1c3f824)
        com/dolthub/go-mysql-server/sql/analyzer.(*Batch).Eval: return b.EvalWithSelector(ctx, a, n, scope, sel)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/analyzer.go:527 (0x1c3f487)
        com/dolthub/go-mysql-server/sql/analyzer.(*Analyzer).analyzeWithSelector: n, same, err = batch.Eval(ctx, a, n, scope, ruleSelector)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/sql/analyzer/analyzer.go:487 (0x1cca1d5)
        com/dolthub/go-mysql-server/sql/analyzer.(*Analyzer).Analyze: n, _, err := a.analyzeWithSelector(ctx, n, scope, SelectAllBatches, DefaultRuleSelector)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/engine.go:599 (0x1cca1b8)
        com/dolthub/go-mysql-server.(*Engine).analyzeQuery: analyzed, err = e.Analyzer.Analyze(ctx, parsed, nil)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/engine.go:495 (0x1cc9586)
        com/dolthub/go-mysql-server.(*Engine).QueryWithBindings: analyzed, err = e.analyzeQuery(ctx, query, bound)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/server/handler.go:265 (0x1f40ed6)
        com/dolthub/go-mysql-server/server.(*Handler).doQuery: schema, rowIter, err := h.e.QueryWithBindings(ctx, query, parsed, bindings)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/server/handler.go:463 (0x1f42cde)
        com/dolthub/go-mysql-server/server.(*Handler).errorWrappedDoQuery: remainder, err := h.doQuery(c, query, parsed, mode, bindings, callback)
/home/suyang/go/pkg/mod/github.com/dolthub/go-mysql-server@v0.17.1-0.20240102214603-370a08737bbb/server/handler.go:177 (0x1f40508)
        com/dolthub/go-mysql-server/server.(*Handler).ComMultiQuery: return h.errorWrappedDoQuery(c, query, nil, MultiStmtModeOn, nil, callback)
/home/suyang/go/pkg/mod/github.com/dolthub/vitess@v0.0.0-20231220170902-3729729e89b1/go/mysql/conn.go:1456 (0x9d3a69)
        com/dolthub/vitess/go/mysql.(*Conn).execQuery: remainder, err = handler.ComMultiQuery(c, query, resultsCB)
/home/suyang/go/pkg/mod/github.com/dolthub/vitess@v0.0.0-20231220170902-3729729e89b1/go/mysql/conn.go:972 (0x9cf119)
        com/dolthub/vitess/go/mysql.(*Conn).handleNextCommand: for query, err = c.execQuery(query, handler, multiStatements); err == nil && query != ""; {
/home/suyang/go/pkg/mod/github.com/dolthub/vitess@v0.0.0-20231220170902-3729729e89b1/go/mysql/server.go:499 (0x9eb938)
        com/dolthub/vitess/go/mysql.(*Listener).handle: err := c.handleNextCommand(l.handler)
/home/suyang/go/src/runtime/asm_amd64.s:1650 (0x4738c0)
        goexit: BYTE    $0x90   // NOP

I originally find this by building dolt from source version 6f3f5f2

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions