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