From 1bcfadc29b02b1716f9c35f2fc835721d6219e3e Mon Sep 17 00:00:00 2001 From: Mihailo Timotic Date: Wed, 19 Nov 2025 16:29:57 +0100 Subject: [PATCH] fix --- .../sql/catalyst/analysis/CheckAnalysis.scala | 6 + .../identifier-clause-legacy.sql.out | 118 ++++++++++++++++ .../identifier-clause.sql.out | 118 ++++++++++++++++ .../sql-tests/inputs/identifier-clause.sql | 8 ++ .../results/identifier-clause-legacy.sql.out | 131 ++++++++++++++++++ .../results/identifier-clause.sql.out | 131 ++++++++++++++++++ 6 files changed, 512 insertions(+) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala index 2ff842553bee6..04451162276fb 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/CheckAnalysis.scala @@ -340,6 +340,12 @@ trait CheckAnalysis extends LookupCatalog with QueryErrorsBase with PlanToString errorClass = "UNSUPPORTED_FEATURE.OVERWRITE_BY_SUBQUERY", messageParameters = Map.empty) + case p: PlanWithUnresolvedIdentifier if !p.identifierExpr.resolved => + p.identifierExpr.failAnalysis( + errorClass = "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + messageParameters = Map("name" -> "IDENTIFIER", "expr" -> p.identifierExpr.sql) + ) + case operator: LogicalPlan => operator transformExpressionsDown { case hof: HigherOrderFunction if hof.arguments.exists { diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause-legacy.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause-legacy.sql.out index 17fcc9b47729e..2d7d551f51ca5 100644 --- a/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause-legacy.sql.out +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause-legacy.sql.out @@ -735,6 +735,124 @@ org.apache.spark.sql.AnalysisException } +-- !query +CREATE TABLE t(col1 INT) +-- !query analysis +CreateDataSourceTableCommand `spark_catalog`.`default`.`t`, false + + +-- !query +SELECT * FROM IDENTIFIER((SELECT 't')) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 26, + "stopIndex" : 37, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT * FROM (SELECT IDENTIFIER((SELECT 'col1')) FROM IDENTIFIER((SELECT 't'))) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 67, + "stopIndex" : 78, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1')) FROM VALUES(1) +-- !query analysis +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 19, + "stopIndex" : 33, + "fragment" : "(SELECT 'col1')" + } ] +} + + +-- !query +SELECT col1, IDENTIFIER((SELECT col1)) FROM VALUES(1) +-- !query analysis +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery(col1)", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 25, + "stopIndex" : 37, + "fragment" : "(SELECT col1)" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1', 'col2')) FROM VALUES(1,2) +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "UNSUPPORTED_TYPED_LITERAL", + "sqlState" : "0A000", + "messageParameters" : { + "supportedTypes" : "\"DATE\", \"TIMESTAMP_NTZ\", \"TIMESTAMP_LTZ\", \"TIMESTAMP\", \"INTERVAL\", \"X\", \"TIME\"", + "unsupportedType" : "\"SELECT\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 20, + "stopIndex" : 32, + "fragment" : "SELECT 'col1'" + } ] +} + + +-- !query +DROP TABLE t +-- !query analysis +DropTable false, false ++- ResolvedIdentifier V2SessionCatalog(spark_catalog), default.t + + -- !query CREATE TABLE IDENTIFIER(1)(c1 INT) USING csv -- !query analysis diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause.sql.out index fc8d225e22714..9adecd5e53733 100644 --- a/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause.sql.out +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/identifier-clause.sql.out @@ -735,6 +735,124 @@ org.apache.spark.sql.AnalysisException } +-- !query +CREATE TABLE t(col1 INT) +-- !query analysis +CreateDataSourceTableCommand `spark_catalog`.`default`.`t`, false + + +-- !query +SELECT * FROM IDENTIFIER((SELECT 't')) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 26, + "stopIndex" : 37, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT * FROM (SELECT IDENTIFIER((SELECT 'col1')) FROM IDENTIFIER((SELECT 't'))) +-- !query analysis +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 67, + "stopIndex" : 78, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1')) FROM VALUES(1) +-- !query analysis +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 19, + "stopIndex" : 33, + "fragment" : "(SELECT 'col1')" + } ] +} + + +-- !query +SELECT col1, IDENTIFIER((SELECT col1)) FROM VALUES(1) +-- !query analysis +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery(col1)", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 25, + "stopIndex" : 37, + "fragment" : "(SELECT col1)" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1', 'col2')) FROM VALUES(1,2) +-- !query analysis +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "UNSUPPORTED_TYPED_LITERAL", + "sqlState" : "0A000", + "messageParameters" : { + "supportedTypes" : "\"DATE\", \"TIMESTAMP_NTZ\", \"TIMESTAMP_LTZ\", \"TIMESTAMP\", \"INTERVAL\", \"X\", \"TIME\"", + "unsupportedType" : "\"SELECT\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 20, + "stopIndex" : 32, + "fragment" : "SELECT 'col1'" + } ] +} + + +-- !query +DROP TABLE t +-- !query analysis +DropTable false, false ++- ResolvedIdentifier V2SessionCatalog(spark_catalog), default.t + + -- !query CREATE TABLE IDENTIFIER(1)(c1 INT) USING csv -- !query analysis diff --git a/sql/core/src/test/resources/sql-tests/inputs/identifier-clause.sql b/sql/core/src/test/resources/sql-tests/inputs/identifier-clause.sql index c90165d31e90d..10d14eebc1d47 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/identifier-clause.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/identifier-clause.sql @@ -119,6 +119,14 @@ VALUES(IDENTIFIER(1)); VALUES(IDENTIFIER(SUBSTR('HELLO', 1, RAND() + 1))); SELECT `IDENTIFIER`('abs')(c1) FROM VALUES(-1) AS T(c1); +CREATE TABLE t(col1 INT); +SELECT * FROM IDENTIFIER((SELECT 't')); +SELECT * FROM (SELECT IDENTIFIER((SELECT 'col1')) FROM IDENTIFIER((SELECT 't'))); +SELECT IDENTIFIER((SELECT 'col1')) FROM VALUES(1); +SELECT col1, IDENTIFIER((SELECT col1)) FROM VALUES(1); +SELECT IDENTIFIER((SELECT 'col1', 'col2')) FROM VALUES(1,2); +DROP TABLE t; + CREATE TABLE IDENTIFIER(1)(c1 INT) USING csv; CREATE TABLE IDENTIFIER('a.b.c')(c1 INT) USING csv; CREATE VIEW IDENTIFIER('a.b.c')(c1) AS VALUES(1); diff --git a/sql/core/src/test/resources/sql-tests/results/identifier-clause-legacy.sql.out b/sql/core/src/test/resources/sql-tests/results/identifier-clause-legacy.sql.out index ad351074692f5..79f0f8e77c767 100644 --- a/sql/core/src/test/resources/sql-tests/results/identifier-clause-legacy.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/identifier-clause-legacy.sql.out @@ -846,6 +846,137 @@ org.apache.spark.sql.AnalysisException } +-- !query +CREATE TABLE t(col1 INT) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT * FROM IDENTIFIER((SELECT 't')) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 26, + "stopIndex" : 37, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT * FROM (SELECT IDENTIFIER((SELECT 'col1')) FROM IDENTIFIER((SELECT 't'))) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 67, + "stopIndex" : 78, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1')) FROM VALUES(1) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 19, + "stopIndex" : 33, + "fragment" : "(SELECT 'col1')" + } ] +} + + +-- !query +SELECT col1, IDENTIFIER((SELECT col1)) FROM VALUES(1) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery(col1)", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 25, + "stopIndex" : 37, + "fragment" : "(SELECT col1)" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1', 'col2')) FROM VALUES(1,2) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "UNSUPPORTED_TYPED_LITERAL", + "sqlState" : "0A000", + "messageParameters" : { + "supportedTypes" : "\"DATE\", \"TIMESTAMP_NTZ\", \"TIMESTAMP_LTZ\", \"TIMESTAMP\", \"INTERVAL\", \"X\", \"TIME\"", + "unsupportedType" : "\"SELECT\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 20, + "stopIndex" : 32, + "fragment" : "SELECT 'col1'" + } ] +} + + +-- !query +DROP TABLE t +-- !query schema +struct<> +-- !query output + + + -- !query CREATE TABLE IDENTIFIER(1)(c1 INT) USING csv -- !query schema diff --git a/sql/core/src/test/resources/sql-tests/results/identifier-clause.sql.out b/sql/core/src/test/resources/sql-tests/results/identifier-clause.sql.out index 4a0f9abe56394..2e2efa2fdc27b 100644 --- a/sql/core/src/test/resources/sql-tests/results/identifier-clause.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/identifier-clause.sql.out @@ -846,6 +846,137 @@ org.apache.spark.sql.AnalysisException } +-- !query +CREATE TABLE t(col1 INT) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT * FROM IDENTIFIER((SELECT 't')) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 26, + "stopIndex" : 37, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT * FROM (SELECT IDENTIFIER((SELECT 'col1')) FROM IDENTIFIER((SELECT 't'))) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.ExtendedAnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 67, + "stopIndex" : 78, + "fragment" : "(SELECT 't')" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1')) FROM VALUES(1) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery()", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 19, + "stopIndex" : 33, + "fragment" : "(SELECT 'col1')" + } ] +} + + +-- !query +SELECT col1, IDENTIFIER((SELECT col1)) FROM VALUES(1) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.AnalysisException +{ + "errorClass" : "NOT_A_CONSTANT_STRING.NOT_CONSTANT", + "sqlState" : "42601", + "messageParameters" : { + "expr" : "scalarsubquery(col1)", + "name" : "IDENTIFIER" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 25, + "stopIndex" : 37, + "fragment" : "(SELECT col1)" + } ] +} + + +-- !query +SELECT IDENTIFIER((SELECT 'col1', 'col2')) FROM VALUES(1,2) +-- !query schema +struct<> +-- !query output +org.apache.spark.sql.catalyst.parser.ParseException +{ + "errorClass" : "UNSUPPORTED_TYPED_LITERAL", + "sqlState" : "0A000", + "messageParameters" : { + "supportedTypes" : "\"DATE\", \"TIMESTAMP_NTZ\", \"TIMESTAMP_LTZ\", \"TIMESTAMP\", \"INTERVAL\", \"X\", \"TIME\"", + "unsupportedType" : "\"SELECT\"" + }, + "queryContext" : [ { + "objectType" : "", + "objectName" : "", + "startIndex" : 20, + "stopIndex" : 32, + "fragment" : "SELECT 'col1'" + } ] +} + + +-- !query +DROP TABLE t +-- !query schema +struct<> +-- !query output + + + -- !query CREATE TABLE IDENTIFIER(1)(c1 INT) USING csv -- !query schema