diff --git a/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java b/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java index da2bffc0d77d..f147af71d2ff 100644 --- a/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java +++ b/paimon-hive/paimon-hive-common/src/main/java/org/apache/paimon/hive/HiveTypeUtils.java @@ -28,6 +28,8 @@ import org.apache.paimon.types.RowType; 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.typeinfo.CharTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.ListTypeInfo; @@ -75,10 +77,14 @@ public static TypeInfo logicalTypeToTypeInfo(DataType logicalType) { decimalType.getPrecision(), decimalType.getScale()); case CHAR: CharType charType = (CharType) logicalType; - return TypeInfoFactory.getCharTypeInfo(charType.getLength()); + if (charType.getLength() > HiveChar.MAX_CHAR_LENGTH) { + return TypeInfoFactory.stringTypeInfo; + } else { + return TypeInfoFactory.getCharTypeInfo(charType.getLength()); + } case VARCHAR: VarCharType varCharType = (VarCharType) logicalType; - if (varCharType.getLength() == VarCharType.MAX_LENGTH) { + if (varCharType.getLength() > HiveVarchar.MAX_VARCHAR_LENGTH) { return TypeInfoFactory.stringTypeInfo; } else { return TypeInfoFactory.getVarcharTypeInfo(varCharType.getLength()); diff --git a/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java b/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java index ff5b1e9b354a..590cc950da15 100644 --- a/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java +++ b/paimon-hive/paimon-hive-common/src/test/java/org/apache/paimon/hive/HiveTypeUtilsTest.java @@ -18,6 +18,7 @@ package org.apache.paimon.hive; +import org.apache.paimon.types.CharType; import org.apache.paimon.types.DataField; import org.apache.paimon.types.DataTypes; import org.apache.paimon.types.IntType; @@ -63,9 +64,17 @@ public void testLogicalTypeToTypeInfo() { TypeInfo charTypeInfo = HiveTypeUtils.logicalTypeToTypeInfo(DataTypes.CHAR(1)); assertThat(charTypeInfo.getTypeName()).isEqualTo("char(1)"); + TypeInfo maxLengthCharType = + HiveTypeUtils.logicalTypeToTypeInfo(DataTypes.CHAR(CharType.MAX_LENGTH)); + assertThat(maxLengthCharType.getTypeName()).isEqualTo("string"); + TypeInfo varcharTypeInfo = HiveTypeUtils.logicalTypeToTypeInfo(DataTypes.VARCHAR(10)); assertThat(varcharTypeInfo.getTypeName()).isEqualTo("varchar(10)"); + TypeInfo maxLengthVarcharType = + HiveTypeUtils.logicalTypeToTypeInfo(DataTypes.VARCHAR(VarCharType.MAX_LENGTH)); + assertThat(maxLengthVarcharType.getTypeName()).isEqualTo("string"); + TypeInfo binaryTypeInfo = HiveTypeUtils.logicalTypeToTypeInfo(DataTypes.BINARY(10)); assertThat(binaryTypeInfo.getTypeName()).isEqualTo("binary");