diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index ee59307c4d50e..fb3c7c85bfbcf 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -2024,6 +2024,18 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { er.ctxStackAppend(column, er.names[idx]) return } + if _, ok := er.p.(*LogicalUnionAll); ok && v.Table.O != "" { + er.err = ErrTablenameNotAllowedHere.GenWithStackByArgs(v.Table.O, "SELECT", clauseMsg[er.b.curClause]) + return + } + col, name, err := findFieldNameFromNaturalUsingJoin(er.p, v) + if err != nil { + er.err = err + return + } else if col != nil { + er.ctxStackAppend(col, name) + return + } for i := len(er.b.outerSchemas) - 1; i >= 0; i-- { outerSchema, outerName := er.b.outerSchemas[i], er.b.outerNames[i] idx, err = expression.FindFieldName(outerName, v) @@ -2037,18 +2049,6 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { return } } - if _, ok := er.p.(*LogicalUnionAll); ok && v.Table.O != "" { - er.err = ErrTablenameNotAllowedHere.GenWithStackByArgs(v.Table.O, "SELECT", clauseMsg[er.b.curClause]) - return - } - col, name, err := findFieldNameFromNaturalUsingJoin(er.p, v) - if err != nil { - er.err = err - return - } else if col != nil { - er.ctxStackAppend(col, name) - return - } if er.b.curClause == globalOrderByClause { er.b.curClause = orderByClause } diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 93a9d72bfcc3a..a8357bf94ed04 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -392,3 +392,16 @@ func TestConvertIfNullToCast(t *testing.T) { "[ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", )) } + +func TestColResolutionPriBetweenOuterAndNatureJoin(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("DROP TABLE if exists t0;") + tk.MustExec("DROP VIEW if exists t0;") + tk.MustExec("CREATE TABLE t0(c0 TEXT(328) );") + tk.MustExec("CREATE definer='root'@'localhost' VIEW v0(c0) AS SELECT 'c' FROM t0;") + tk.MustExec("INSERT INTO t0 VALUES (-12);") + tk.MustQuery("SELECT v0.c0 AS c0 FROM v0 NATURAL RIGHT JOIN t0 WHERE (1 !=((v0.c0)REGEXP(-7)));").Check(testkit.Rows()) + tk.MustQuery("SELECT COUNT(v0.c0) AS c0 FROM v0 WHERE EXISTS(SELECT v0.c0 AS c0 FROM v0 NATURAL RIGHT JOIN t0 WHERE (1 !=((v0.c0)REGEXP(-7))));").Check(testkit.Rows("0")) +}