You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by ma...@apache.org on 2023/02/04 10:16:01 UTC
[spark] branch branch-3.4 updated: [SPARK-42238][SQL] Introduce new error class: `INCOMPATIBLE_JOIN_TYPES`
This is an automated email from the ASF dual-hosted git repository.
maxgekk pushed a commit to branch branch-3.4
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.4 by this push:
new 5b40e8feb56 [SPARK-42238][SQL] Introduce new error class: `INCOMPATIBLE_JOIN_TYPES`
5b40e8feb56 is described below
commit 5b40e8feb56a3a595bee03e0c5c096266f5c3c63
Author: itholic <ha...@databricks.com>
AuthorDate: Sat Feb 4 13:15:25 2023 +0300
[SPARK-42238][SQL] Introduce new error class: `INCOMPATIBLE_JOIN_TYPES`
### What changes were proposed in this pull request?
This PR proposes to introduce new error class `INCOMPATIBLE_JOIN_TYPES` to improve the error message for incompatible join type usage.
### Why are the changes needed?
The existing error classes `LATERAL_NATURAL_JOIN` and `NATURAL_CROSS_JOIN` are not logically belong under `UNSUPPORTED_FEATURE`, and their error message is not very clear to understand for end-users.
### Does this PR introduce _any_ user-facing change?
No.
### How was this patch tested?
Updated UTs.
Closes #39805 from itholic/NATURAL_CROSS_JOIN.
Authored-by: itholic <ha...@databricks.com>
Signed-off-by: Max Gekk <ma...@gmail.com>
(cherry picked from commit d9c0e8754d1c24ee49f9ee13efa60a5e78b18172)
Signed-off-by: Max Gekk <ma...@gmail.com>
---
core/src/main/resources/error/error-classes.json | 16 ++++++----------
.../apache/spark/sql/catalyst/parser/AstBuilder.scala | 8 ++++++--
.../apache/spark/sql/errors/QueryParsingErrors.scala | 18 ++++++++----------
.../spark/sql/catalyst/parser/PlanParserSuite.scala | 5 +++--
.../resources/sql-tests/results/join-lateral.sql.out | 8 ++++++--
.../spark/sql/errors/QueryParsingErrorsSuite.scala | 10 ++++++----
6 files changed, 35 insertions(+), 30 deletions(-)
diff --git a/core/src/main/resources/error/error-classes.json b/core/src/main/resources/error/error-classes.json
index 8bcfc527eaa..069f10423a5 100644
--- a/core/src/main/resources/error/error-classes.json
+++ b/core/src/main/resources/error/error-classes.json
@@ -586,6 +586,12 @@
"Detected an incompatible DataSourceRegister. Please remove the incompatible library from classpath or upgrade it. Error: <message>"
]
},
+ "INCOMPATIBLE_JOIN_TYPES" : {
+ "message" : [
+ "The join types <joinType1> and <joinType2> are incompatible."
+ ],
+ "sqlState" : "42613"
+ },
"INCOMPATIBLE_VIEW_SCHEMA_CHANGE" : {
"message" : [
"The SQL query of view <viewName> has an incompatible schema change and column <colName> cannot be resolved. Expected <expectedNum> columns named <colName> but got <actualCols>.",
@@ -1559,11 +1565,6 @@
"JOIN USING with LATERAL correlation."
]
},
- "LATERAL_NATURAL_JOIN" : {
- "message" : [
- "NATURAL join with LATERAL correlation."
- ]
- },
"LITERAL_TYPE" : {
"message" : [
"Literal for '<value>' of <type>."
@@ -1579,11 +1580,6 @@
"The target JDBC server hosting table <tableName> does not support ALTER TABLE with multiple actions. Split the ALTER TABLE up into individual actions to avoid this error."
]
},
- "NATURAL_CROSS_JOIN" : {
- "message" : [
- "NATURAL CROSS JOIN."
- ]
- },
"ORC_TYPE_CAST" : {
"message" : [
"Unable to convert <orcType> of Orc to data type <toType>."
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
index d2a1cb1eb16..dfc6e21d4a0 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
@@ -1331,10 +1331,14 @@ class AstBuilder extends SqlBaseParserBaseVisitor[AnyRef] with SQLConfHelper wit
throw new IllegalStateException(s"Unimplemented joinCriteria: $c")
case None if ctx.NATURAL != null =>
if (ctx.LATERAL != null) {
- throw QueryParsingErrors.lateralJoinWithNaturalJoinUnsupportedError(ctx)
+ throw QueryParsingErrors.incompatibleJoinTypesError(
+ joinType1 = ctx.LATERAL.toString, joinType2 = ctx.NATURAL.toString, ctx = ctx
+ )
}
if (baseJoinType == Cross) {
- throw QueryParsingErrors.naturalCrossJoinUnsupportedError(ctx)
+ throw QueryParsingErrors.incompatibleJoinTypesError(
+ joinType1 = ctx.NATURAL.toString, joinType2 = baseJoinType.toString, ctx = ctx
+ )
}
(NaturalJoin(baseJoinType), None)
case None =>
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala
index e54bbb9c9d1..accf5363d6c 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/errors/QueryParsingErrors.scala
@@ -17,6 +17,8 @@
package org.apache.spark.sql.errors
+import java.util.Locale
+
import org.antlr.v4.runtime.ParserRuleContext
import org.apache.spark.sql.catalyst.parser.ParseException
@@ -111,13 +113,6 @@ private[sql] object QueryParsingErrors extends QueryErrorsBase {
new ParseException("LATERAL cannot be used together with UNPIVOT in FROM clause", ctx)
}
- def lateralJoinWithNaturalJoinUnsupportedError(ctx: ParserRuleContext): Throwable = {
- new ParseException(
- errorClass = "UNSUPPORTED_FEATURE.LATERAL_NATURAL_JOIN",
- messageParameters = Map.empty,
- ctx)
- }
-
def lateralJoinWithUsingJoinUnsupportedError(ctx: ParserRuleContext): Throwable = {
new ParseException(
errorClass = "UNSUPPORTED_FEATURE.LATERAL_JOIN_USING",
@@ -165,10 +160,13 @@ private[sql] object QueryParsingErrors extends QueryErrorsBase {
ctx)
}
- def naturalCrossJoinUnsupportedError(ctx: ParserRuleContext): Throwable = {
+ def incompatibleJoinTypesError(
+ joinType1: String, joinType2: String, ctx: ParserRuleContext): Throwable = {
new ParseException(
- errorClass = "UNSUPPORTED_FEATURE.NATURAL_CROSS_JOIN",
- messageParameters = Map.empty,
+ errorClass = "INCOMPATIBLE_JOIN_TYPES",
+ messageParameters = Map(
+ "joinType1" -> joinType1.toUpperCase(Locale.ROOT),
+ "joinType2" -> joinType2.toUpperCase(Locale.ROOT)),
ctx = ctx)
}
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala
index 4eae44c0007..a079cc62440 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/parser/PlanParserSuite.scala
@@ -642,8 +642,9 @@ class PlanParserSuite extends AnalysisTest {
val sql1 = "select * from a natural cross join b"
checkError(
exception = parseException(sql1),
- errorClass = "UNSUPPORTED_FEATURE.NATURAL_CROSS_JOIN",
- parameters = Map.empty,
+ errorClass = "INCOMPATIBLE_JOIN_TYPES",
+ parameters = Map("joinType1" -> "NATURAL", "joinType2" -> "CROSS"),
+ sqlState = "42613",
context = ExpectedContext(
fragment = "natural cross join b",
start = 16,
diff --git a/sql/core/src/test/resources/sql-tests/results/join-lateral.sql.out b/sql/core/src/test/resources/sql-tests/results/join-lateral.sql.out
index 32dd4e1ad6f..9431714fecf 100644
--- a/sql/core/src/test/resources/sql-tests/results/join-lateral.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/join-lateral.sql.out
@@ -179,8 +179,12 @@ struct<>
-- !query output
org.apache.spark.sql.catalyst.parser.ParseException
{
- "errorClass" : "UNSUPPORTED_FEATURE.LATERAL_NATURAL_JOIN",
- "sqlState" : "0A000",
+ "errorClass" : "INCOMPATIBLE_JOIN_TYPES",
+ "sqlState" : "42613",
+ "messageParameters" : {
+ "joinType1" : "LATERAL",
+ "joinType2" : "NATURAL"
+ },
"queryContext" : [ {
"objectType" : "",
"objectName" : "",
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryParsingErrorsSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryParsingErrorsSuite.scala
index b30998b6aa0..26644401f41 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryParsingErrorsSuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/errors/QueryParsingErrorsSuite.scala
@@ -33,8 +33,9 @@ class QueryParsingErrorsSuite extends QueryTest with SharedSparkSession {
test("UNSUPPORTED_FEATURE: LATERAL join with NATURAL join not supported") {
checkError(
exception = parseException("SELECT * FROM t1 NATURAL JOIN LATERAL (SELECT c1 + c2 AS c2)"),
- errorClass = "UNSUPPORTED_FEATURE.LATERAL_NATURAL_JOIN",
- sqlState = "0A000",
+ errorClass = "INCOMPATIBLE_JOIN_TYPES",
+ parameters = Map("joinType1" -> "LATERAL", "joinType2" -> "NATURAL"),
+ sqlState = "42613",
context = ExpectedContext(
fragment = "NATURAL JOIN LATERAL (SELECT c1 + c2 AS c2)",
start = 17,
@@ -90,8 +91,9 @@ class QueryParsingErrorsSuite extends QueryTest with SharedSparkSession {
test("UNSUPPORTED_FEATURE: NATURAL CROSS JOIN is not supported") {
checkError(
exception = parseException("SELECT * FROM a NATURAL CROSS JOIN b"),
- errorClass = "UNSUPPORTED_FEATURE.NATURAL_CROSS_JOIN",
- sqlState = "0A000",
+ errorClass = "INCOMPATIBLE_JOIN_TYPES",
+ parameters = Map("joinType1" -> "NATURAL", "joinType2" -> "CROSS"),
+ sqlState = "42613",
context = ExpectedContext(
fragment = "NATURAL CROSS JOIN b",
start = 16,
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org