From 562720a573edc960ad7b583c60e5d26f2b994eae Mon Sep 17 00:00:00 2001 From: Eunbin Son Date: Thu, 6 Aug 2026 16:04:44 +0900 Subject: [PATCH] [hive] Fix Hive read failure for CHAR/VARCHAR columns exceeding Hive length limits Generated-by: Claude Code --- .../PaimonObjectInspectorFactory.java | 10 ++++- .../PaimonObjectInspectorFactoryTest.java | 39 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/paimon-hive/paimon-hive-connector-common/src/main/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactory.java b/paimon-hive/paimon-hive-connector-common/src/main/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactory.java index 09301cfd3230..dde533afddba 100644 --- a/paimon-hive/paimon-hive-connector-common/src/main/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactory.java +++ b/paimon-hive/paimon-hive-connector-common/src/main/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactory.java @@ -32,6 +32,8 @@ import org.apache.paimon.types.VarCharType; import org.apache.paimon.types.VectorType; +import org.apache.hadoop.hive.common.type.HiveChar; +import org.apache.hadoop.hive.common.type.HiveVarchar; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; @@ -64,10 +66,14 @@ public static ObjectInspector create(DataType logicalType) { decimalType.getPrecision(), decimalType.getScale()); case CHAR: CharType charType = (CharType) logicalType; - return new PaimonCharObjectInspector(charType.getLength()); + if (charType.getLength() > HiveChar.MAX_CHAR_LENGTH) { + return new PaimonStringObjectInspector(); + } else { + return new PaimonCharObjectInspector(charType.getLength()); + } case VARCHAR: VarCharType varCharType = (VarCharType) logicalType; - if (varCharType.getLength() == VarCharType.MAX_LENGTH) { + if (varCharType.getLength() > HiveVarchar.MAX_VARCHAR_LENGTH) { return new PaimonStringObjectInspector(); } else { return new PaimonVarcharObjectInspector(varCharType.getLength()); diff --git a/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactoryTest.java b/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactoryTest.java index 712382279e72..4246e30a8cae 100644 --- a/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactoryTest.java +++ b/paimon-hive/paimon-hive-connector-common/src/test/java/org/apache/paimon/hive/objectinspector/PaimonObjectInspectorFactoryTest.java @@ -21,7 +21,10 @@ import org.apache.paimon.data.BinaryString; import org.apache.paimon.data.GenericMap; import org.apache.paimon.types.DataTypes; +import org.apache.paimon.types.VarCharType; +import org.apache.hadoop.hive.common.type.HiveChar; +import org.apache.hadoop.hive.common.type.HiveVarchar; import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.junit.jupiter.api.Test; @@ -68,4 +71,40 @@ public void testCreateRowInspectorContainingMultiset() { assertThat(inspector.getStructFieldRef("tags").getFieldObjectInspector().getTypeName()) .isEqualTo("map"); } + + @Test + public void testCreateCharVarcharObjectInspectorExceedingHiveLimit() { + assertThat( + PaimonObjectInspectorFactory.create( + DataTypes.CHAR(HiveChar.MAX_CHAR_LENGTH + 1)) + .getTypeName()) + .isEqualTo("string"); + assertThat( + PaimonObjectInspectorFactory.create( + DataTypes.VARCHAR(HiveVarchar.MAX_VARCHAR_LENGTH + 1)) + .getTypeName()) + .isEqualTo("string"); + // the reproducing case of issue #1565 + assertThat( + PaimonObjectInspectorFactory.create( + DataTypes.VARCHAR(VarCharType.MAX_LENGTH - 1)) + .getTypeName()) + .isEqualTo("string"); + } + + @Test + public void testCreateCharVarcharObjectInspectorWithinHiveLimit() { + assertThat( + PaimonObjectInspectorFactory.create( + DataTypes.CHAR(HiveChar.MAX_CHAR_LENGTH)) + .getTypeName()) + .isEqualTo("char(" + HiveChar.MAX_CHAR_LENGTH + ")"); + assertThat( + PaimonObjectInspectorFactory.create( + DataTypes.VARCHAR(HiveVarchar.MAX_VARCHAR_LENGTH)) + .getTypeName()) + .isEqualTo("varchar(" + HiveVarchar.MAX_VARCHAR_LENGTH + ")"); + assertThat(PaimonObjectInspectorFactory.create(DataTypes.STRING()).getTypeName()) + .isEqualTo("string"); + } }