diff --git a/executor/analyzetest/analyze_test.go b/executor/analyzetest/analyze_test.go index cae564758b6be..224f7582cf40b 100644 --- a/executor/analyzetest/analyze_test.go +++ b/executor/analyzetest/analyze_test.go @@ -3270,3 +3270,12 @@ func TestAnalyzeColumnsSkipMVIndexJsonCol(t *testing.T) { require.True(t, stats.Indices[tblInfo.Indices[0].ID].IsStatsInitialized()) require.False(t, stats.Indices[tblInfo.Indices[1].ID].IsStatsInitialized()) } + +func TestIssue55438(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t0(c0 NUMERIC , c1 BIGINT UNSIGNED AS ((CASE 0 WHEN false THEN 1358571571 ELSE TRIM(c0) END )));") + tk.MustExec("CREATE INDEX i0 ON t0(c1);") + tk.MustExec("analyze table t0") +} diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 80c310dedde8a..ac6c8dbd50c3e 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -2045,6 +2045,16 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { } er.ctxStackAppend(column, er.names[idx]) return + } else if er.planCtx == nil && er.sourceTable != nil && + (v.Table.L == "" || er.sourceTable.Name.L == v.Table.L) { + colInfo := er.sourceTable.FindPublicColumnByName(v.Name.L) + if colInfo == nil || colInfo.Hidden { + er.err = plannererrors.ErrUnknownColumn.GenWithStackByArgs(v.Name, clauseMsg[er.clause()]) + return + } + er.ctxStackAppend(&expression.Column{RetType: &colInfo.FieldType, ID: colInfo.ID, UniqueID: colInfo.ID}, + &types.FieldName{ColName: v.Name}) + return } for i := len(er.b.outerSchemas) - 1; i >= 0; i-- { outerSchema, outerName := er.b.outerSchemas[i], er.b.outerNames[i]