From 889330105fa151a463ddb0e0fbb0bc118cec04c8 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Mon, 4 Jan 2021 21:03:11 +0800 Subject: [PATCH 1/2] [SPARK-33992][SQL] Add allowInvokingTransformsInAnalyzer for resolveOperatorsUpWithNewOutput --- .../catalyst/plans/logical/AnalysisHelper.scala | 4 +++- .../apache/spark/sql/CharVarcharTestSuite.scala | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala index ffd1f784e467..78c0ad364f29 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala @@ -127,7 +127,9 @@ trait AnalysisHelper extends QueryPlan[LogicalPlan] { self: LogicalPlan => rule: PartialFunction[LogicalPlan, (LogicalPlan, Seq[(Attribute, Attribute)])]) : LogicalPlan = { if (!analyzed) { - transformUpWithNewOutput(rule, skipCond = _.analyzed, canGetOutput = _.resolved) + AnalysisHelper.allowInvokingTransformsInAnalyzer { + transformUpWithNewOutput(rule, skipCond = _.analyzed, canGetOutput = _.resolved) + } } else { self } diff --git a/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala index 9d4b7c4f82ed..62bfee0f036c 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala @@ -451,6 +451,21 @@ trait CharVarcharTestSuite extends QueryTest with SQLTestUtils { Seq(Row("char(5)"), Row("varchar(3)"))) } } + + test("SPARK-33992: char/varchar resolution in correlated sub query ") { + withTable("t1", "t2") { + sql(s"CREATE TABLE t1(v VARCHAR(3), c CHAR(5)) USING $format") + sql(s"CREATE TABLE t2(v VARCHAR(3), c CHAR(5)) USING $format") + sql("INSERT INTO t1 VALUES ('c', 'b')") + sql("INSERT INTO t2 VALUES ('a', 'b')") + + checkAnswer(sql( + """ + |SELECT v FROM t1 + | WHERE 'a' IN (SELECT v FROM t2 WHERE t1.c = t2.c )""".stripMargin), + Row("c")) + } + } } // Some basic char/varchar tests which doesn't rely on table implementation. From b8755663410c284f65368788992d18aca54e1383 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Mon, 4 Jan 2021 22:20:34 +0800 Subject: [PATCH 2/2] override --- .../sql/catalyst/plans/logical/AnalysisHelper.scala | 13 ++++++++++--- .../org/apache/spark/sql/CharVarcharTestSuite.scala | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala index 78c0ad364f29..54b01416381c 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/AnalysisHelper.scala @@ -127,14 +127,21 @@ trait AnalysisHelper extends QueryPlan[LogicalPlan] { self: LogicalPlan => rule: PartialFunction[LogicalPlan, (LogicalPlan, Seq[(Attribute, Attribute)])]) : LogicalPlan = { if (!analyzed) { - AnalysisHelper.allowInvokingTransformsInAnalyzer { - transformUpWithNewOutput(rule, skipCond = _.analyzed, canGetOutput = _.resolved) - } + transformUpWithNewOutput(rule, skipCond = _.analyzed, canGetOutput = _.resolved) } else { self } } + override def transformUpWithNewOutput( + rule: PartialFunction[LogicalPlan, (LogicalPlan, Seq[(Attribute, Attribute)])], + skipCond: LogicalPlan => Boolean, + canGetOutput: LogicalPlan => Boolean): LogicalPlan = { + AnalysisHelper.allowInvokingTransformsInAnalyzer { + super.transformUpWithNewOutput(rule, skipCond, canGetOutput) + } + } + /** * Recursively transforms the expressions of a tree, skipping nodes that have already * been analyzed. diff --git a/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala index 62bfee0f036c..2f68f94f76a3 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/CharVarcharTestSuite.scala @@ -452,7 +452,7 @@ trait CharVarcharTestSuite extends QueryTest with SQLTestUtils { } } - test("SPARK-33992: char/varchar resolution in correlated sub query ") { + test("SPARK-33992: char/varchar resolution in correlated sub query") { withTable("t1", "t2") { sql(s"CREATE TABLE t1(v VARCHAR(3), c CHAR(5)) USING $format") sql(s"CREATE TABLE t2(v VARCHAR(3), c CHAR(5)) USING $format") @@ -462,7 +462,7 @@ trait CharVarcharTestSuite extends QueryTest with SQLTestUtils { checkAnswer(sql( """ |SELECT v FROM t1 - | WHERE 'a' IN (SELECT v FROM t2 WHERE t1.c = t2.c )""".stripMargin), + |WHERE 'a' IN (SELECT v FROM t2 WHERE t1.c = t2.c )""".stripMargin), Row("c")) } }