Skip to content

Commit 34227a6

Browse files
authored
planner: fix gen-col mistakenly resolved after duplicate expression index substitution (#67692) (#68132)
ref #67552
1 parent 4f911ef commit 34227a6

2 files changed

Lines changed: 30 additions & 1 deletion

File tree

pkg/expression/column.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -696,11 +696,22 @@ func (col *Column) ResolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema)
696696
}
697697

698698
func (col *Column) resolveIndicesByVirtualExpr(ctx EvalContext, schema *Schema) bool {
699+
fallbackIdx := -1
699700
for i, c := range schema.Columns {
700-
if c.EqualByExprAndID(ctx, col) {
701+
if c.EqualColumn(col) {
701702
col.Index = i
702703
return true
703704
}
705+
// Different expression indexes may create hidden generated columns with the same
706+
// virtual expression. Prefer the exact column ID when it exists; only fall back
707+
// to expression equality when the selected schema has no exact column match.
708+
if fallbackIdx == -1 && c.EqualByExprAndID(ctx, col) {
709+
fallbackIdx = i
710+
}
711+
}
712+
if fallbackIdx != -1 {
713+
col.Index = fallbackIdx
714+
return true
704715
}
705716
return false
706717
}

pkg/expression/column_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,24 @@ func TestColumn(t *testing.T) {
9494
require.Zero(t, timeVal.Compare(tm))
9595
require.False(t, isNull)
9696
require.NoError(t, err)
97+
98+
t.Run("resolve virtual expression prefers exact column ID", func(t *testing.T) {
99+
strTp := types.NewFieldType(mysql.TypeVarchar)
100+
baseCol := &Column{UniqueID: 10, RetType: strTp}
101+
virtualExpr := NewFunctionInternal(ctx, ast.Lower, strTp, baseCol)
102+
exprOnlyMatchedCol := &Column{UniqueID: 12, RetType: strTp, VirtualExpr: virtualExpr.Clone()}
103+
exactMatchedCol := &Column{UniqueID: 11, RetType: strTp, VirtualExpr: virtualExpr.Clone()}
104+
targetCol := &Column{UniqueID: exactMatchedCol.UniqueID, RetType: strTp, VirtualExpr: virtualExpr.Clone()}
105+
106+
resolvedExpr, ok := targetCol.ResolveIndicesByVirtualExpr(ctx.GetEvalCtx(), NewSchema(exprOnlyMatchedCol, exactMatchedCol))
107+
require.True(t, ok)
108+
require.Equal(t, 1, resolvedExpr.(*Column).Index)
109+
110+
ambiguousTargetCol := &Column{UniqueID: 13, RetType: strTp, VirtualExpr: virtualExpr.Clone()}
111+
resolvedExpr, ok = ambiguousTargetCol.ResolveIndicesByVirtualExpr(ctx.GetEvalCtx(), NewSchema(exprOnlyMatchedCol, exactMatchedCol))
112+
require.True(t, ok)
113+
require.Equal(t, 0, resolvedExpr.(*Column).Index)
114+
})
97115
}
98116

99117
func TestColumnHashCode(t *testing.T) {

0 commit comments

Comments
 (0)