This is an automated email from the ASF dual-hosted git repository.

ayushsaxena pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new eaa8189600c HIVE-28518: Iceberg: Fix ClassCastException during 
in-place migration to Iceberg tables with timestamp columns (#5590). (Gopinath, 
reviewed by Ayush Saxena, Shohei Okumiya)
eaa8189600c is described below

commit eaa8189600c74efa35cc9975eea0f81df59e5088
Author: gopigowtham <ggangadha...@cloudera.com>
AuthorDate: Mon Jan 27 21:54:39 2025 +0530

    HIVE-28518: Iceberg: Fix ClassCastException during in-place migration to 
Iceberg tables with timestamp columns (#5590). (Gopinath, reviewed by Ayush 
Saxena, Shohei Okumiya)
---
 .../IcebergTimestampObjectInspectorHive3.java      | 12 +++++-
 ...eberg_inplace_migration_with_timestamp_column.q |  7 ++++
 ...g_inplace_migration_with_timestamp_column.q.out | 45 ++++++++++++++++++++++
 3 files changed, 63 insertions(+), 1 deletion(-)

diff --git 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java
 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java
index 86ecc929a5f..f2e5c12dab8 100644
--- 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java
+++ 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java
@@ -20,6 +20,7 @@
 package org.apache.iceberg.mr.hive.serde.objectinspector;
 
 import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import org.apache.hadoop.hive.common.type.Timestamp;
 import org.apache.hadoop.hive.serde2.io.TimestampWritableV2;
@@ -55,7 +56,16 @@ public Timestamp getPrimitiveJavaObject(Object o) {
     if (o == null) {
       return null;
     }
-    LocalDateTime time = (LocalDateTime) o;
+    LocalDateTime time;
+    if (o instanceof LocalDateTime) {
+      time = (LocalDateTime) o;
+    } else if (o instanceof OffsetDateTime) {
+      OffsetDateTime odt = (OffsetDateTime) o;
+      time = 
odt.atZoneSameInstant(TypeInfoFactory.timestampLocalTZTypeInfo.getTimeZone()).toLocalDateTime();
+    } else {
+      throw new ClassCastException(String.format("An unexpected type %s was 
passed as timestamp. " +
+              "Expected LocalDateTime/OffsetDateTime", 
o.getClass().getName()));
+    }
     return 
Timestamp.ofEpochMilli(time.toInstant(ZoneOffset.UTC).toEpochMilli(), 
time.getNano());
   }
 
diff --git 
a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_inplace_migration_with_timestamp_column.q
 
b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_inplace_migration_with_timestamp_column.q
new file mode 100644
index 00000000000..c5a5af3d095
--- /dev/null
+++ 
b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_inplace_migration_with_timestamp_column.q
@@ -0,0 +1,7 @@
+CREATE EXTERNAL TABLE hive_28518_test(`id` int,`name` string,`dt` timestamp) 
STORED AS PARQUET;
+insert into hive_28518_test values (1, "test name" , cast('2024-08-09 
14:08:26.326107' as timestamp));
+ALTER TABLE hive_28518_test SET TBLPROPERTIES 
('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler', 
'format-version' = '2');
+set hive.fetch.task.conversion=more;
+select * from hive_28518_test;
+set hive.fetch.task.conversion=none;
+select * from hive_28518_test;
\ No newline at end of file
diff --git 
a/iceberg/iceberg-handler/src/test/results/positive/iceberg_inplace_migration_with_timestamp_column.q.out
 
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_inplace_migration_with_timestamp_column.q.out
new file mode 100644
index 00000000000..609ccc949d7
--- /dev/null
+++ 
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_inplace_migration_with_timestamp_column.q.out
@@ -0,0 +1,45 @@
+PREHOOK: query: CREATE EXTERNAL TABLE hive_28518_test(`id` int,`name` 
string,`dt` timestamp) STORED AS PARQUET
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@hive_28518_test
+POSTHOOK: query: CREATE EXTERNAL TABLE hive_28518_test(`id` int,`name` 
string,`dt` timestamp) STORED AS PARQUET
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@hive_28518_test
+PREHOOK: query: insert into hive_28518_test values (1, "test name" , 
cast('2024-08-09 14:08:26.326107' as timestamp))
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@hive_28518_test
+POSTHOOK: query: insert into hive_28518_test values (1, "test name" , 
cast('2024-08-09 14:08:26.326107' as timestamp))
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@hive_28518_test
+POSTHOOK: Lineage: hive_28518_test.dt SCRIPT []
+POSTHOOK: Lineage: hive_28518_test.id SCRIPT []
+POSTHOOK: Lineage: hive_28518_test.name SCRIPT []
+PREHOOK: query: ALTER TABLE hive_28518_test SET TBLPROPERTIES 
('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler', 
'format-version' = '2')
+PREHOOK: type: ALTERTABLE_PROPERTIES
+PREHOOK: Input: default@hive_28518_test
+PREHOOK: Output: default@hive_28518_test
+POSTHOOK: query: ALTER TABLE hive_28518_test SET TBLPROPERTIES 
('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler', 
'format-version' = '2')
+POSTHOOK: type: ALTERTABLE_PROPERTIES
+POSTHOOK: Input: default@hive_28518_test
+POSTHOOK: Output: default@hive_28518_test
+PREHOOK: query: select * from hive_28518_test
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hive_28518_test
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from hive_28518_test
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hive_28518_test
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1      test name       2024-08-09 14:08:26.326107
+PREHOOK: query: select * from hive_28518_test
+PREHOOK: type: QUERY
+PREHOOK: Input: default@hive_28518_test
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from hive_28518_test
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@hive_28518_test
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+1      test name       2024-08-09 14:08:26.326107

Reply via email to