diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala index 2ba9ce66c3a55..49a3331ba3643 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeExpressions.scala @@ -5199,7 +5199,7 @@ case class TimeBucket( ts: Expression, originTs: Expression, timeZoneId: Option[String] = None) - extends TernaryExpression with ExpectsInputTypes with TimeZoneAwareExpression { + extends TernaryExpression with ImplicitCastInputTypes with TimeZoneAwareExpression { override def nullIntolerant: Boolean = true @@ -5380,7 +5380,7 @@ object TimeBucketExpressionBuilder extends ExpressionBuilder { expressions match { case Seq(rawBucketSize, rawTs) => val bucketSize = retypeNull(rawBucketSize, DayTimeIntervalType()) - // Fall back to TimestampType for bad ts types; ExpectsInputTypes will report it. + // Fall back to TimestampType when ts is not a recognized timestamp type. val tsType = rawTs.dataType match { case t if acceptsTsType(t) => t case _ => TimestampType diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercionSuite.scala index c222655525eca..107ca4300e8cd 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercionSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnsiTypeCoercionSuite.scala @@ -61,6 +61,9 @@ class AnsiTypeCoercionSuite extends TypeCoercionSuiteBase { override def implicitCast(e: Expression, expectedType: AbstractDataType): Option[Expression] = AnsiTypeCoercion.implicitCast(e, expectedType) + override protected def implicitTypeCastsRule: TypeCoercionRule = + AnsiTypeCoercion.ImplicitTypeCasts + override def dateTimeOperationsRule: TypeCoercionRule = AnsiTypeCoercion.DateTimeOperations private def checkWidenType( diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala index 80cdf90fc9735..af20391bc87b9 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/TypeCoercionSuite.scala @@ -45,6 +45,8 @@ abstract class TypeCoercionSuiteBase extends AnalysisTest { protected def implicitCast(e: Expression, expectedType: AbstractDataType): Option[Expression] + protected def implicitTypeCastsRule: TypeCoercionRule + protected def dateTimeOperationsRule: TypeCoercionRule protected def shouldCast(from: DataType, to: AbstractDataType, expected: DataType): Unit = { @@ -218,6 +220,34 @@ abstract class TypeCoercionSuiteBase extends AnalysisTest { shouldNotCast(checkedType, IntegralType) } + test("time_bucket implicitly casts date and string timestamp arguments") { + val bucketSize = Literal(Duration.ofMinutes(15)) + val date = Literal(0, DateType) + val string = Literal("2024-01-01 00:00:00") + + ruleTest( + rule = implicitTypeCastsRule, + initial = TimeBucket(bucketSize = bucketSize, ts = date, originTs = string), + transformed = TimeBucket( + bucketSize = bucketSize, + ts = Cast(date, TimestampType), + originTs = Cast(string, TimestampType))) + } + + test("time_bucket does not implicitly cast string bucket size") { + val bucketSize = Literal("0 00:15:00") + val timestamp = Literal(Timestamp.valueOf("2024-01-01 00:00:00")) + val timeBucket = TimeBucket( + bucketSize = bucketSize, + ts = timestamp, + originTs = timestamp) + + ruleTest( + rule = implicitTypeCastsRule, + initial = timeBucket, + transformed = timeBucket) + } + test("SPARK-56152: implicit type cast - TimeType") { val checkedType = TimeType() checkTypeCasting(checkedType, castableTypes = Seq(checkedType, StringType) ++ datetimeTypes) @@ -600,6 +630,9 @@ class TypeCoercionSuite extends TypeCoercionSuiteBase { override def implicitCast(e: Expression, expectedType: AbstractDataType): Option[Expression] = TypeCoercion.implicitCast(e, expectedType) + override protected def implicitTypeCastsRule: TypeCoercionRule = + TypeCoercion.ImplicitTypeCasts + override def dateTimeOperationsRule: TypeCoercionRule = TypeCoercion.DateTimeOperations private def checkWidenType( diff --git a/sql/core/src/test/resources/sql-tests/analyzer-results/time-bucket.sql.out b/sql/core/src/test/resources/sql-tests/analyzer-results/time-bucket.sql.out index 2bc6cc2be0f1d..954b7e82b4bbf 100644 --- a/sql/core/src/test/resources/sql-tests/analyzer-results/time-bucket.sql.out +++ b/sql/core/src/test/resources/sql-tests/analyzer-results/time-bucket.sql.out @@ -310,95 +310,119 @@ org.apache.spark.sql.catalyst.ExtendedAnalysisException -- !query SELECT time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15') -- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00') +-- !query analysis +[Analyzer test output redacted due to nondeterminism] + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01') +-- !query analysis org.apache.spark.sql.catalyst.ExtendedAnalysisException { "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"DATE '2024-01-15'\"", - "inputType" : "\"DATE\"", - "paramIndex" : "second", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP '1970-01-01 00:00:00')\"" + "inputSql" : "\"DATE '2024-01-01'\"", + "inputType" : "\"TIMESTAMP\"", + "paramIndex" : "third", + "requiredType" : "\"TIMESTAMP_NTZ\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01')\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 59, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15')" + "stopIndex" : 96, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01')" } ] } -- !query -SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00') +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', '2024-01-01 00:00:00') -- !query analysis org.apache.spark.sql.catalyst.ExtendedAnalysisException { "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"2024-01-15 10:23:00\"", - "inputType" : "\"STRING\"", - "paramIndex" : "second", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, 2024-01-15 10:23:00, TIMESTAMP '1970-01-01 00:00:00')\"" + "inputSql" : "\"2024-01-01 00:00:00\"", + "inputType" : "\"TIMESTAMP\"", + "paramIndex" : "third", + "requiredType" : "\"TIMESTAMP_NTZ\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', 2024-01-01 00:00:00)\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 63, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00')" + "stopIndex" : 100, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', '2024-01-01 00:00:00')" } ] } -- !query -SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01') +SELECT time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00') -- !query analysis org.apache.spark.sql.catalyst.ExtendedAnalysisException { "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"DATE '2024-01-01'\"", - "inputType" : "\"DATE\"", + "inputSql" : "\"TIMESTAMP_NTZ '2024-01-01 00:00:00'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", "paramIndex" : "third", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01')\"" + "requiredType" : "\"TIMESTAMP\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00')\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 92, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01')" + "stopIndex" : 96, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00')" } ] } -- !query -SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00') +SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00', TIMESTAMP_NTZ '2024-01-01 00:00:00') -- !query analysis org.apache.spark.sql.catalyst.ExtendedAnalysisException { "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"2024-01-01 00:00:00\"", - "inputType" : "\"STRING\"", + "inputSql" : "\"TIMESTAMP_NTZ '2024-01-01 00:00:00'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", "paramIndex" : "third", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', 2024-01-01 00:00:00)\"" + "requiredType" : "\"TIMESTAMP\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, 2024-01-15 10:23:00, TIMESTAMP_NTZ '2024-01-01 00:00:00')\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 96, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00')" + "stopIndex" : 100, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00', TIMESTAMP_NTZ '2024-01-01 00:00:00')" } ] } diff --git a/sql/core/src/test/resources/sql-tests/inputs/time-bucket.sql b/sql/core/src/test/resources/sql-tests/inputs/time-bucket.sql index d13ad227a0eaf..52cad7bae8484 100644 --- a/sql/core/src/test/resources/sql-tests/inputs/time-bucket.sql +++ b/sql/core/src/test/resources/sql-tests/inputs/time-bucket.sql @@ -37,14 +37,23 @@ SELECT time_bucket(INTERVAL '1' HOUR, TIMESTAMP_NTZ '2024-01-01 11:27:00', TIMES -- bucket_size must be an interval (not a string) SELECT time_bucket('15 minutes', TIMESTAMP '2024-01-15 10:23:00'); --- ts must be TIMESTAMP or TIMESTAMP_NTZ (not DATE or string) +-- Implicit casts for timestamp arguments + +-- DATE and string ts values cast to TIMESTAMP SELECT time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15'); SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00'); --- origin must be TIMESTAMP or TIMESTAMP_NTZ (not DATE or string) +-- DATE and string origin values cast to TIMESTAMP SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01'); SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00'); +-- DATE and string cast to TIMESTAMP (LTZ). Mixing them with TIMESTAMP_NTZ +-- makes ts and origin different types, so the call is rejected. +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01'); +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', '2024-01-01 00:00:00'); +SELECT time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00'); +SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00', TIMESTAMP_NTZ '2024-01-01 00:00:00'); + -- Error: bucket_size and origin must be foldable diff --git a/sql/core/src/test/resources/sql-tests/results/time-bucket.sql.out b/sql/core/src/test/resources/sql-tests/results/time-bucket.sql.out index 7e59efc9c1e01..b5f734aa98409 100644 --- a/sql/core/src/test/resources/sql-tests/results/time-bucket.sql.out +++ b/sql/core/src/test/resources/sql-tests/results/time-bucket.sql.out @@ -338,6 +338,38 @@ org.apache.spark.sql.catalyst.ExtendedAnalysisException -- !query SELECT time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15') -- !query schema +struct +-- !query output +2024-01-15 00:00:00 + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00') +-- !query schema +struct +-- !query output +2024-01-15 10:15:00 + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01') +-- !query schema +struct +-- !query output +2024-01-15 10:15:00 + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00') +-- !query schema +struct +-- !query output +2024-01-15 10:15:00 + + +-- !query +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01') +-- !query schema struct<> -- !query output org.apache.spark.sql.catalyst.ExtendedAnalysisException @@ -345,24 +377,24 @@ org.apache.spark.sql.catalyst.ExtendedAnalysisException "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"DATE '2024-01-15'\"", - "inputType" : "\"DATE\"", - "paramIndex" : "second", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP '1970-01-01 00:00:00')\"" + "inputSql" : "\"DATE '2024-01-01'\"", + "inputType" : "\"TIMESTAMP\"", + "paramIndex" : "third", + "requiredType" : "\"TIMESTAMP_NTZ\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01')\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 59, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15')" + "stopIndex" : 96, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', DATE '2024-01-01')" } ] } -- !query -SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00') +SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', '2024-01-01 00:00:00') -- !query schema struct<> -- !query output @@ -371,24 +403,24 @@ org.apache.spark.sql.catalyst.ExtendedAnalysisException "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"2024-01-15 10:23:00\"", - "inputType" : "\"STRING\"", - "paramIndex" : "second", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, 2024-01-15 10:23:00, TIMESTAMP '1970-01-01 00:00:00')\"" + "inputSql" : "\"2024-01-01 00:00:00\"", + "inputType" : "\"TIMESTAMP\"", + "paramIndex" : "third", + "requiredType" : "\"TIMESTAMP_NTZ\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', 2024-01-01 00:00:00)\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 63, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00')" + "stopIndex" : 100, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP_NTZ '2024-01-15 10:23:00', '2024-01-01 00:00:00')" } ] } -- !query -SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01') +SELECT time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00') -- !query schema struct<> -- !query output @@ -397,24 +429,24 @@ org.apache.spark.sql.catalyst.ExtendedAnalysisException "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"DATE '2024-01-01'\"", - "inputType" : "\"DATE\"", + "inputSql" : "\"TIMESTAMP_NTZ '2024-01-01 00:00:00'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", "paramIndex" : "third", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01')\"" + "requiredType" : "\"TIMESTAMP\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00')\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 92, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', DATE '2024-01-01')" + "stopIndex" : 96, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, DATE '2024-01-15', TIMESTAMP_NTZ '2024-01-01 00:00:00')" } ] } -- !query -SELECT time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00') +SELECT time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00', TIMESTAMP_NTZ '2024-01-01 00:00:00') -- !query schema struct<> -- !query output @@ -423,18 +455,18 @@ org.apache.spark.sql.catalyst.ExtendedAnalysisException "errorClass" : "DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE", "sqlState" : "42K09", "messageParameters" : { - "inputSql" : "\"2024-01-01 00:00:00\"", - "inputType" : "\"STRING\"", + "inputSql" : "\"TIMESTAMP_NTZ '2024-01-01 00:00:00'\"", + "inputType" : "\"TIMESTAMP_NTZ\"", "paramIndex" : "third", - "requiredType" : "(\"(TIMESTAMP OR TIMESTAMP WITHOUT TIME ZONE)\" or \"(TIMESTAMP_LTZ(P) OR TIMESTAMP_NTZ(P) WITH P IN [7, 9])\")", - "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', 2024-01-01 00:00:00)\"" + "requiredType" : "\"TIMESTAMP\"", + "sqlExpr" : "\"time_bucket(INTERVAL '15' MINUTE, 2024-01-15 10:23:00, TIMESTAMP_NTZ '2024-01-01 00:00:00')\"" }, "queryContext" : [ { "objectType" : "", "objectName" : "", "startIndex" : 8, - "stopIndex" : 96, - "fragment" : "time_bucket(INTERVAL '15' MINUTE, TIMESTAMP '2024-01-15 10:23:00', '2024-01-01 00:00:00')" + "stopIndex" : 100, + "fragment" : "time_bucket(INTERVAL '15' MINUTE, '2024-01-15 10:23:00', TIMESTAMP_NTZ '2024-01-01 00:00:00')" } ] }