diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveShim.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveShim.scala index 3a53a2a8dadd..351cde58427c 100644 --- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveShim.scala +++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveShim.scala @@ -101,10 +101,19 @@ private[hive] object HiveShim { def toCatalystDecimal(hdoi: HiveDecimalObjectInspector, data: Any): Decimal = { if (hdoi.preferWritable()) { - Decimal(hdoi.getPrimitiveWritableObject(data).getHiveDecimal().bigDecimalValue, - hdoi.precision(), hdoi.scale()) + val value = hdoi.getPrimitiveWritableObject(data) + if (value == null) { + null + } else { + Decimal(value.getHiveDecimal().bigDecimalValue, hdoi.precision(), hdoi.scale()) + } } else { - Decimal(hdoi.getPrimitiveJavaObject(data).bigDecimalValue(), hdoi.precision(), hdoi.scale()) + val value = hdoi.getPrimitiveJavaObject(data) + if (value == null) { + null + } else { + Decimal(value.bigDecimalValue(), hdoi.precision(), hdoi.scale()) + } } } diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala index 5db705036e9f..8d248bb387df 100644 --- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala +++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/execution/SQLQuerySuite.scala @@ -2642,6 +2642,23 @@ abstract class SQLQuerySuiteBase extends QueryTest with SQLTestUtils with TestHi } } } + + test("SPARK-37196: HiveDecimal Precision Scale match failed should return null") { + withTempDir { dir => + withSQLConf(HiveUtils.CONVERT_METASTORE_PARQUET.key -> "false") { + withTable("test_precision") { + val df = sql(s"SELECT 'dummy' AS name, ${"1" * 20}.${"2" * 18} AS value") + df.write.mode("Overwrite").parquet(dir.getAbsolutePath) + sql( + s""" + |CREATE EXTERNAL TABLE test_precision(name STRING, value DECIMAL(18,6)) + |STORED AS PARQUET LOCATION '${dir.getAbsolutePath}' + |""".stripMargin) + checkAnswer(sql("SELECT * FROM test_precision"), Row("dummy", null)) + } + } + } + } } @SlowHiveTest