From 2a0b84e7e4c566c0fb30209ccfe6fc25da6506ad Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 19 May 2025 16:05:34 -0700 Subject: [PATCH] fix explain plan on server engine --- enginetest/queries/queries.go | 16 ++++++++++++---- enginetest/server_engine.go | 2 +- sql/analyzer/analyzer.go | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 444b7c3daf..d754fdef67 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -10260,6 +10260,16 @@ from typestable`, {false}, }, }, + { + Query: "explain plan select count(*) from mytable", + Expected: []sql.Row{ + {"Project"}, + {" ├─ columns: [count(1)]"}, + {" └─ Project"}, + {" ├─ columns: [mytable.COUNT(1) as COUNT(1)]"}, + {" └─ table_count(mytable) as COUNT(1)"}, + }, + }, { Query: "explain select 1", SkipServerEngine: true, @@ -10268,8 +10278,7 @@ from typestable`, }, }, { - Query: "explain plan select 1", - SkipServerEngine: true, + Query: "explain plan select 1", Expected: []sql.Row{ {"Project"}, {" ├─ columns: [1]"}, @@ -10278,8 +10287,7 @@ from typestable`, }, }, { - Query: "explain format=tree select 1", - SkipServerEngine: true, + Query: "explain format=tree select 1", Expected: []sql.Row{ {"Project"}, {" ├─ columns: [1]"}, diff --git a/enginetest/server_engine.go b/enginetest/server_engine.go index 868042d45e..0a222ef534 100644 --- a/enginetest/server_engine.go +++ b/enginetest/server_engine.go @@ -216,7 +216,7 @@ func (s *ServerQueryEngine) queryOrExec(ctx *sql.Context, stmt *gosql.Stmt, pars var err error switch parsed.(type) { // TODO: added `FLUSH` stmt here (should be `exec`) because we don't support `FLUSH BINARY LOGS` or `FLUSH ENGINE LOGS`, so nil schema is returned. - case *sqlparser.Select, *sqlparser.SetOp, *sqlparser.Show, *sqlparser.Set, *sqlparser.Call, *sqlparser.Begin, *sqlparser.Use, *sqlparser.Load, *sqlparser.Execute, *sqlparser.Analyze, *sqlparser.Flush: + case *sqlparser.Select, *sqlparser.SetOp, *sqlparser.Show, *sqlparser.Set, *sqlparser.Call, *sqlparser.Begin, *sqlparser.Use, *sqlparser.Load, *sqlparser.Execute, *sqlparser.Analyze, *sqlparser.Flush, *sqlparser.Explain: var rows *gosql.Rows if stmt != nil { rows, err = stmt.Query(args...) diff --git a/sql/analyzer/analyzer.go b/sql/analyzer/analyzer.go index 9cead15f5a..1aa36ee58c 100644 --- a/sql/analyzer/analyzer.go +++ b/sql/analyzer/analyzer.go @@ -477,6 +477,7 @@ func (a *Analyzer) Analyze(ctx *sql.Context, node sql.Node, scope *plan.Scope, q switch n := node.(type) { case *plan.DescribeQuery: child, _, err := a.analyzeWithSelector(ctx, n.Query(), scope, SelectAllBatches, DefaultRuleSelector, qFlags) + qFlags.Unset(sql.QFlagMax1Row) // the rule replaceCountStar can set this incorrectly for queries containing count(*). return n.WithQuery(child), err } node, _, err := a.analyzeWithSelector(ctx, node, scope, SelectAllBatches, DefaultRuleSelector, qFlags)