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 f8141d487d9 HIVE-29510: Iceberg: [V3] Handle null in case of column 
defaults (#6368)
f8141d487d9 is described below

commit f8141d487d960b24bf9fbefa12c79d955e4d384e
Author: Ayush Saxena <[email protected]>
AuthorDate: Wed Mar 18 00:57:52 2026 +0530

    HIVE-29510: Iceberg: [V3] Handle null in case of column defaults (#6368)
---
 .../apache/iceberg/hive/HiveSchemaConverter.java   |  4 +++-
 .../org/apache/iceberg/hive/HiveSchemaUtil.java    |  2 +-
 .../iceberg/mr/hive/HiveIcebergMetaHook.java       |  6 ++++--
 .../test/queries/positive/iceberg_default_column.q |  6 ++++++
 .../results/positive/iceberg_default_column.q.out  | 25 ++++++++++++++++++++++
 5 files changed, 39 insertions(+), 4 deletions(-)

diff --git 
a/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaConverter.java
 
b/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaConverter.java
index 22d49556fa9..0f993714284 100644
--- 
a/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaConverter.java
+++ 
b/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaConverter.java
@@ -85,7 +85,9 @@ List<Types.NestedField> convertInternal(List<String> names, 
List<TypeInfo> typeI
       if (defaultValues.containsKey(columnName)) {
         if (type.isPrimitiveType()) {
           Object icebergDefaultValue = 
HiveSchemaUtil.getDefaultValue(defaultValues.get(columnName), type);
-          fieldBuilder.withWriteDefault(Expressions.lit(icebergDefaultValue));
+          if (icebergDefaultValue != null) {
+            
fieldBuilder.withWriteDefault(Expressions.lit(icebergDefaultValue));
+          }
         } else if (!type.isStructType()) {
           throw new UnsupportedOperationException(
               "Default values for " + columnName + " of type " + type + " are 
not supported");
diff --git 
a/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaUtil.java
 
b/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaUtil.java
index ddcdc150928..1fbbb9c68dd 100644
--- 
a/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaUtil.java
+++ 
b/iceberg/iceberg-catalog/src/main/java/org/apache/iceberg/hive/HiveSchemaUtil.java
@@ -549,7 +549,7 @@ public static String stripQuotes(String val) {
   }
 
   public static Object getDefaultValue(String defaultValue, Type type) {
-    if (defaultValue == null) {
+    if (defaultValue == null || defaultValue.equalsIgnoreCase("NULL")) {
       return null;
     }
     return switch (type.typeId()) {
diff --git 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
index 8944e8619db..1e197d62e89 100644
--- 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
+++ 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergMetaHook.java
@@ -893,8 +893,10 @@ private void handleDefaultValues(Map<String, String> 
defaultValues, Map<String,
           Map<String, String> structDefaults = 
HiveSchemaUtil.getDefaultValuesMap(field.getValue());
           handleDefaultValues(structDefaults, renameMapping, 
fieldType.asStructType().fields(), qualifiedName + ".");
         } else {
-          updateSchema.updateColumnDefault(qualifiedName,
-              Expressions.lit(HiveSchemaUtil.getDefaultValue(field.getValue(), 
fieldType)));
+          Object defaultValue = 
HiveSchemaUtil.getDefaultValue(field.getValue(), fieldType);
+          updateSchema.updateColumnDefault(qualifiedName, defaultValue != null 
?
+              Expressions.lit(HiveSchemaUtil.getDefaultValue(field.getValue(), 
fieldType)) :
+              null);
         }
       }
     }
diff --git 
a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_default_column.q 
b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_default_column.q
index 66e1b87d559..e8ff63c6aa6 100644
--- a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_default_column.q
+++ b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_default_column.q
@@ -28,4 +28,10 @@ INSERT INTO t3 (id, name, age) VALUES (5, 'custom_name', 30);
 -- Case 5: Complex struct with nested nulls
 INSERT INTO t3 (id, point) VALUES (6, named_struct('x', CAST(null AS INT), 
'y', CAST(null AS INT)));
 
+-- Case 6: ALTER AND SET NULL and 'null' string
+ALTER TABLE t3 CHANGE COLUMN age age int DEFAULT null;
+ALTER TABLE t3 CHANGE COLUMN name name string DEFAULT 'null';
+
+INSERT INTO t3 (id) VALUES (7);
+
 SELECT * FROM t3 ORDER BY id;
\ No newline at end of file
diff --git 
a/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out
 
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out
index 856ddf4f823..9874e2911c2 100644
--- 
a/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out
+++ 
b/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out
@@ -72,6 +72,30 @@ POSTHOOK: query: INSERT INTO t3 (id, point) VALUES (6, 
named_struct('x', CAST(nu
 POSTHOOK: type: QUERY
 POSTHOOK: Input: _dummy_database@_dummy_table
 POSTHOOK: Output: default@t3
+PREHOOK: query: ALTER TABLE t3 CHANGE COLUMN age age int DEFAULT null
+PREHOOK: type: ALTERTABLE_RENAMECOL
+PREHOOK: Input: default@t3
+PREHOOK: Output: default@t3
+POSTHOOK: query: ALTER TABLE t3 CHANGE COLUMN age age int DEFAULT null
+POSTHOOK: type: ALTERTABLE_RENAMECOL
+POSTHOOK: Input: default@t3
+POSTHOOK: Output: default@t3
+PREHOOK: query: ALTER TABLE t3 CHANGE COLUMN name name string DEFAULT 'null'
+PREHOOK: type: ALTERTABLE_RENAMECOL
+PREHOOK: Input: default@t3
+PREHOOK: Output: default@t3
+POSTHOOK: query: ALTER TABLE t3 CHANGE COLUMN name name string DEFAULT 'null'
+POSTHOOK: type: ALTERTABLE_RENAMECOL
+POSTHOOK: Input: default@t3
+POSTHOOK: Output: default@t3
+PREHOOK: query: INSERT INTO t3 (id) VALUES (7)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@t3
+POSTHOOK: query: INSERT INTO t3 (id) VALUES (7)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@t3
 PREHOOK: query: SELECT * FROM t3 ORDER BY id
 PREHOOK: type: QUERY
 PREHOOK: Input: default@t3
@@ -85,3 +109,4 @@ POSTHOOK: Output: hdfs://### HDFS PATH ###
 4      {"x":100,"y":99}        NULL    25      50000.0 true    2024-01-01      
2024-01-01 10:00:00     100.00  general
 5      {"x":100,"y":99}        custom_name     30      50000.0 true    
2024-01-01      2024-01-01 10:00:00     100.00  general
 6      {"x":100,"y":99}        unknown 25      50000.0 true    2024-01-01      
2024-01-01 10:00:00     100.00  general
+7      {"x":100,"y":99}        null    NULL    50000.0 true    2024-01-01      
2024-01-01 10:00:00     100.00  general

Reply via email to