Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions core/src/main/resources/error/error-classes.json
Original file line number Diff line number Diff line change
Expand Up @@ -251,12 +251,6 @@
"Key <keyValue> does not exist. Use `try_element_at` to tolerate non-existent key and return NULL instead. If necessary set <config> to \"false\" to bypass this error."
]
},
"MISSING_COLUMN" : {
"message" : [
"Column '<columnName>' does not exist. Did you mean one of the following? [<proposal>]"
],
"sqlState" : "42000"
},
"MISSING_STATIC_PARTITION_COLUMN" : {
"message" : [
"Unknown static partition column: <columnName>"
Expand Down Expand Up @@ -352,6 +346,12 @@
],
"sqlState" : "42000"
},
"UNRESOLVED_COLUMN" : {
"message" : [
"A column or function parameter with name <objectName> cannot be resolved. Did you mean one of the following? [<objectList>]"
],
"sqlState" : "42000"
},
"UNSUPPORTED_DATATYPE" : {
"message" : [
"Unsupported data type <typeName>"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ class SparkThrowableSuite extends SparkFunSuite {
test("Check if message parameters match message format") {
// Requires 2 args
intercept[IllegalFormatException] {
getMessage("MISSING_COLUMN", null, Array.empty)
getMessage("UNRESOLVED_COLUMN", null, Array.empty)
}

// Does not fail with too many args (expects 0 args)
Expand All @@ -172,8 +172,9 @@ class SparkThrowableSuite extends SparkFunSuite {
}

test("Error message is formatted") {
assert(getMessage("MISSING_COLUMN", null, Array("foo", "bar, baz")) ==
"[MISSING_COLUMN] Column 'foo' does not exist. Did you mean one of the following? [bar, baz]")
assert(getMessage("UNRESOLVED_COLUMN", null, Array("`foo`", "`bar`, `baz`")) ==
"[UNRESOLVED_COLUMN] A column or function parameter with name `foo` cannot be resolved. " +
"Did you mean one of the following? [`bar`, `baz`]")
}

test("Try catching legacy SparkError") {
Expand Down
4 changes: 2 additions & 2 deletions python/pyspark/pandas/tests/test_indexops_spark.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def test_series_transform_negative(self):
):
self.psser.spark.transform(lambda scol: 1)

with self.assertRaisesRegex(AnalysisException, "Column.*non-existent.*does not exist"):
with self.assertRaisesRegex(AnalysisException, ".*UNRESOLVED_COLUMN.*`non-existent`.*"):
self.psser.spark.transform(lambda scol: F.col("non-existent"))

def test_multiindex_transform_negative(self):
Expand All @@ -59,7 +59,7 @@ def test_series_apply_negative(self):
):
self.psser.spark.apply(lambda scol: 1)

with self.assertRaisesRegex(AnalysisException, "Column.*non-existent.*does not exist"):
with self.assertRaisesRegex(AnalysisException, ".*UNRESOLVED_COLUMN.*`non-existent`.*"):
self.psser.spark.transform(lambda scol: F.col("non-existent"))


Expand Down
4 changes: 2 additions & 2 deletions python/pyspark/sql/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def test_capture_user_friendly_exception(self):
try:
self.spark.sql("select `中文字段`")
except AnalysisException as e:
self.assertRegex(str(e), "Column '`中文字段`' does not exist")
self.assertRegex(str(e), ".*UNRESOLVED_COLUMN.*`中文字段`.*")

def test_spark_upgrade_exception(self):
# SPARK-32161 : Test case to Handle SparkUpgradeException in pythonic way
Expand Down Expand Up @@ -72,7 +72,7 @@ def test_get_error_class_state(self):
try:
self.spark.sql("""SELECT a""")
except AnalysisException as e:
self.assertEquals(e.getErrorClass(), "MISSING_COLUMN")
self.assertEquals(e.getErrorClass(), "UNRESOLVED_COLUMN")
self.assertEquals(e.getSqlState(), "42000")


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3419,10 +3419,9 @@ class Analyzer(override val catalogManager: CatalogManager)
i.userSpecifiedCols, "in the column list", resolver)

i.userSpecifiedCols.map { col =>
i.table.resolve(Seq(col), resolver)
.getOrElse(i.failAnalysis(
errorClass = "MISSING_COLUMN",
messageParameters = Array(col, i.table.output.map(_.name).mkString(", "))))
i.table.resolve(Seq(col), resolver).getOrElse(
throw QueryCompilationErrors.unresolvedColumnError(
col, i.table.output.map(_.name), i.origin))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,8 @@ trait CheckAnalysis extends PredicateHelper with LookupCatalog {
val missingCol = a.sql
val candidates = operator.inputSet.toSeq.map(_.qualifiedName)
val orderedCandidates = StringUtils.orderStringsBySimilarity(missingCol, candidates)
a.failAnalysis(
errorClass = "MISSING_COLUMN",
messageParameters = Array(missingCol, orderedCandidates.mkString(", ")))
throw QueryCompilationErrors.unresolvedColumnError(
missingCol, orderedCandidates, a.origin)

case s: Star =>
withPosition(s) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,15 @@ private[sql] object QueryCompilationErrors extends QueryErrorsBase {
s"side of the join. The $side-side columns: [${plan.output.map(_.name).mkString(", ")}]")
}

def unresolvedColumnError(
colName: String, candidates: Seq[String], origin: Origin): Throwable = {
val candidateIds = candidates.map(candidate => toSQLId(candidate))
new AnalysisException(
errorClass = "UNRESOLVED_COLUMN",
messageParameters = Array(toSQLId(colName), candidateIds.mkString(", ")),
origin = origin)
}

def dataTypeMismatchForDeserializerError(
dataType: DataType, desiredType: String): Throwable = {
new AnalysisException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package org.apache.spark.sql.errors

import java.util.Locale

import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute
import org.apache.spark.sql.catalyst.expressions.{Expression, Literal}
import org.apache.spark.sql.catalyst.util.{quoteIdentifier, toPrettySQL}
import org.apache.spark.sql.types.{DataType, DoubleType, FloatType}
Expand Down Expand Up @@ -72,7 +73,7 @@ private[sql] trait QueryErrorsBase {
}

def toSQLId(parts: String): String = {
toSQLId(parts.split("\\."))
toSQLId(UnresolvedAttribute.parseAttributeName(parts))
}

def toSQLType(t: DataType): String = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -297,16 +297,16 @@ class AnalysisErrorSuite extends AnalysisTest {
errorClassTest(
"unresolved attributes",
testRelation.select($"abcd"),
"MISSING_COLUMN",
Array("abcd", "a"))
"UNRESOLVED_COLUMN",
Array("`abcd`", "`a`"))

errorClassTest(
"unresolved attributes with a generated name",
testRelation2.groupBy($"a")(max($"b"))
.where(sum($"b") > 0)
.orderBy($"havingCondition".asc),
"MISSING_COLUMN",
Array("havingCondition", "max(b)"))
"UNRESOLVED_COLUMN",
Array("`havingCondition`", "`max(b)`"))

errorTest(
"unresolved star expansion in max",
Expand All @@ -321,8 +321,8 @@ class AnalysisErrorSuite extends AnalysisTest {
errorClassTest(
"sorting by attributes are not from grouping expressions",
testRelation2.groupBy($"a", $"c")($"a", $"c", count($"a").as("a3")).orderBy($"b".asc),
"MISSING_COLUMN",
Array("b", "a, c, a3"))
"UNRESOLVED_COLUMN",
Array("`b`", "`a`, `c`, `a3`"))

errorTest(
"non-boolean filters",
Expand Down Expand Up @@ -415,8 +415,8 @@ class AnalysisErrorSuite extends AnalysisTest {
"SPARK-9955: correct error message for aggregate",
// When parse SQL string, we will wrap aggregate expressions with UnresolvedAlias.
testRelation2.where($"bad_column" > 1).groupBy($"a")(UnresolvedAlias(max($"b"))),
"MISSING_COLUMN",
Array("bad_column", "a, b, c, d, e"))
"UNRESOLVED_COLUMN",
Array("`bad_column`", "`a`, `b`, `c`, `d`, `e`"))

errorTest(
"slide duration greater than window in time window",
Expand Down Expand Up @@ -836,7 +836,8 @@ class AnalysisErrorSuite extends AnalysisTest {
errorTest(
"SPARK-34920: error code to error message",
testRelation2.where($"bad_column" > 1).groupBy($"a")(UnresolvedAlias(max($"b"))),
"Column 'bad_column' does not exist. Did you mean one of the following? [a, b, c, d, e]"
"[UNRESOLVED_COLUMN] A column or function parameter with name `bad_column` cannot be " +
"resolved. Did you mean one of the following? [`a`, `b`, `c`, `d`, `e`]"
:: Nil)

test("SPARK-35080: Unsupported correlated equality predicates in subquery") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ class AnalysisSuite extends AnalysisTest with Matchers {
assertAnalysisErrorClass(
Project(Seq(UnresolvedAttribute("tBl.a")),
SubqueryAlias("TbL", UnresolvedRelation(TableIdentifier("TaBlE")))),
"MISSING_COLUMN",
Array("tBl.a", "TbL.a"))
"UNRESOLVED_COLUMN",
Array("`tBl`.`a`", "`TbL`.`a`"))

checkAnalysisWithoutViewWrapper(
Project(Seq(UnresolvedAttribute("TbL.a")),
Expand Down Expand Up @@ -711,8 +711,8 @@ class AnalysisSuite extends AnalysisTest with Matchers {

test("CTE with non-existing column alias") {
assertAnalysisErrorClass(parsePlan("WITH t(x) AS (SELECT 1) SELECT * FROM t WHERE y = 1"),
"MISSING_COLUMN",
Array("y", "t.x"))
"UNRESOLVED_COLUMN",
Array("`y`", "`t`.`x`"))
}

test("CTE with non-matching column alias") {
Expand Down Expand Up @@ -1149,8 +1149,8 @@ class AnalysisSuite extends AnalysisTest with Matchers {
|GROUP BY c.x
|ORDER BY c.x + c.y
|""".stripMargin),
"MISSING_COLUMN",
Array("c.y", "x"))
"UNRESOLVED_COLUMN",
Array("`c`.`y`", "`x`"))
}

test("SPARK-38118: Func(wrong_type) in the HAVING clause should throw data mismatch error") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,34 +133,34 @@ class ResolveSubquerySuite extends AnalysisTest {
// TODO: support accessing columns from outer outer query.
assertAnalysisErrorClass(
lateralJoin(t1, lateralJoin(t2, t0.select($"a", $"b", $"c"))),
"MISSING_COLUMN",
Array("a", ""))
"UNRESOLVED_COLUMN",
Array("`a`", ""))
}

test("lateral subquery with unresolvable attributes") {
// SELECT * FROM t1, LATERAL (SELECT a, c)
assertAnalysisErrorClass(
lateralJoin(t1, t0.select($"a", $"c")),
"MISSING_COLUMN",
Array("c", "")
"UNRESOLVED_COLUMN",
Array("`c`", "")
)
// SELECT * FROM t1, LATERAL (SELECT a, b, c, d FROM t2)
assertAnalysisErrorClass(
lateralJoin(t1, t2.select($"a", $"b", $"c", $"d")),
"MISSING_COLUMN",
Array("d", "b, c")
"UNRESOLVED_COLUMN",
Array("`d`", "`b`, `c`")
)
// SELECT * FROM t1, LATERAL (SELECT * FROM t2, LATERAL (SELECT t1.a))
assertAnalysisErrorClass(
lateralJoin(t1, lateralJoin(t2, t0.select($"t1.a"))),
"MISSING_COLUMN",
Array("t1.a", "")
"UNRESOLVED_COLUMN",
Array("`t1`.`a`", "")
)
// SELECT * FROM t1, LATERAL (SELECT * FROM t2, LATERAL (SELECT a, b))
assertAnalysisErrorClass(
lateralJoin(t1, lateralJoin(t2, t0.select($"a", $"b"))),
"MISSING_COLUMN",
Array("a", "")
"UNRESOLVED_COLUMN",
Array("`a`", "")
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -688,7 +688,7 @@ abstract class V2WriteAnalysisSuiteBase extends AnalysisTest {
LessThanOrEqual(UnresolvedAttribute(Seq("a")), Literal(15.0d)))

assertNotResolved(parsedPlan)
assertAnalysisErrorClass(parsedPlan, "MISSING_COLUMN", Array("a", "x, y"))
assertAnalysisErrorClass(parsedPlan, "UNRESOLVED_COLUMN", Array("`a`", "`x`, `y`"))

val tableAcceptAnySchema = TestRelationAcceptAnySchema(StructType(Seq(
StructField("x", DoubleType, nullable = false),
Expand All @@ -697,7 +697,7 @@ abstract class V2WriteAnalysisSuiteBase extends AnalysisTest {
val parsedPlan2 = OverwriteByExpression.byPosition(tableAcceptAnySchema, query,
LessThanOrEqual(UnresolvedAttribute(Seq("a")), Literal(15.0d)))
assertNotResolved(parsedPlan2)
assertAnalysisErrorClass(parsedPlan2, "MISSING_COLUMN", Array("a", "x, y"))
assertAnalysisErrorClass(parsedPlan2, "UNRESOLVED_COLUMN", Array("`a`", "`x`, `y`"))
}

test("SPARK-36498: reorder inner fields with byName mode") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ SELECT db1.t1.i1 FROM t1, mydb2.t1
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'db1.t1.i1' does not exist. Did you mean one of the following? [spark_catalog.mydb2.t1.i1, spark_catalog.mydb2.t1.i1]; line 1 pos 7
[UNRESOLVED_COLUMN] A column or function parameter with name `db1`.`t1`.`i1` cannot be resolved. Did you mean one of the following? [`spark_catalog`.`mydb2`.`t1`.`i1`, `spark_catalog`.`mydb2`.`t1`.`i1`]; line 1 pos 7


-- !query
Expand All @@ -183,7 +183,7 @@ SELECT mydb1.t1 FROM t1
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'mydb1.t1' does not exist. Did you mean one of the following? [spark_catalog.mydb1.t1.i1]; line 1 pos 7
[UNRESOLVED_COLUMN] A column or function parameter with name `mydb1`.`t1` cannot be resolved. Did you mean one of the following? [`spark_catalog`.`mydb1`.`t1`.`i1`]; line 1 pos 7


-- !query
Expand All @@ -201,7 +201,7 @@ SELECT t1 FROM mydb1.t1
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 't1' does not exist. Did you mean one of the following? [spark_catalog.mydb1.t1.i1]; line 1 pos 7
[UNRESOLVED_COLUMN] A column or function parameter with name `t1` cannot be resolved. Did you mean one of the following? [`spark_catalog`.`mydb1`.`t1`.`i1`]; line 1 pos 7


-- !query
Expand All @@ -218,7 +218,7 @@ SELECT mydb1.t1.i1 FROM t1
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'mydb1.t1.i1' does not exist. Did you mean one of the following? [spark_catalog.mydb2.t1.i1]; line 1 pos 7
[UNRESOLVED_COLUMN] A column or function parameter with name `mydb1`.`t1`.`i1` cannot be resolved. Did you mean one of the following? [`spark_catalog`.`mydb2`.`t1`.`i1`]; line 1 pos 7


-- !query
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ SELECT a AS k, COUNT(non_existing) FROM testData GROUP BY k
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'non_existing' does not exist. Did you mean one of the following? [testdata.a, testdata.b]; line 1 pos 21
[UNRESOLVED_COLUMN] A column or function parameter with name `non_existing` cannot be resolved. Did you mean one of the following? [`testdata`.`a`, `testdata`.`b`]; line 1 pos 21


-- !query
Expand Down Expand Up @@ -208,7 +208,7 @@ SELECT a AS k, COUNT(b) FROM testData GROUP BY k
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'k' does not exist. Did you mean one of the following? [testdata.a, testdata.b]; line 1 pos 47
[UNRESOLVED_COLUMN] A column or function parameter with name `k` cannot be resolved. Did you mean one of the following? [`testdata`.`a`, `testdata`.`b`]; line 1 pos 47


-- !query
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ SELECT * FROM t1 JOIN LATERAL (SELECT t1.c1 AS a, t2.c1 AS b) s JOIN t2 ON s.b =
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 't2.c1' does not exist. Did you mean one of the following? []; line 1 pos 50
[UNRESOLVED_COLUMN] A column or function parameter with name `t2`.`c1` cannot be resolved. Did you mean one of the following? []; line 1 pos 50


-- !query
Expand Down Expand Up @@ -384,7 +384,7 @@ SELECT * FROM t1, LATERAL (SELECT * FROM t2, LATERAL (SELECT t1.c1 + t2.c1))
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 't1.c1' does not exist. Did you mean one of the following? []; line 1 pos 61
[UNRESOLVED_COLUMN] A column or function parameter with name `t1`.`c1` cannot be resolved. Did you mean one of the following? []; line 1 pos 61


-- !query
Expand All @@ -393,7 +393,7 @@ SELECT * FROM t1, LATERAL (SELECT * FROM (SELECT c1), LATERAL (SELECT c2))
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'c2' does not exist. Did you mean one of the following? []; line 1 pos 70
[UNRESOLVED_COLUMN] A column or function parameter with name `c2` cannot be resolved. Did you mean one of the following? []; line 1 pos 70


-- !query
Expand All @@ -420,7 +420,7 @@ SELECT * FROM t1, LATERAL (SELECT c1, (SELECT SUM(c2) FROM t2 WHERE c1 = t1.c1))
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 't1.c1' does not exist. Did you mean one of the following? [spark_catalog.default.t2.c1, spark_catalog.default.t2.c2]; line 1 pos 73
[UNRESOLVED_COLUMN] A column or function parameter with name `t1`.`c1` cannot be resolved. Did you mean one of the following? [`spark_catalog`.`default`.`t2`.`c1`, `spark_catalog`.`default`.`t2`.`c2`]; line 1 pos 73


-- !query
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ SELECT nt2.k FROM (SELECT * FROM nt1 natural join nt2)
struct<>
-- !query output
org.apache.spark.sql.AnalysisException
[MISSING_COLUMN] Column 'nt2.k' does not exist. Did you mean one of the following? [__auto_generated_subquery_name.k, __auto_generated_subquery_name.v1, __auto_generated_subquery_name.v2]; line 1 pos 7
[UNRESOLVED_COLUMN] A column or function parameter with name `nt2`.`k` cannot be resolved. Did you mean one of the following? [`__auto_generated_subquery_name`.`k`, `__auto_generated_subquery_name`.`v1`, `__auto_generated_subquery_name`.`v2`]; line 1 pos 7


-- !query
Expand Down
Loading