diff --git itests/src/test/resources/testconfiguration.properties itests/src/test/resources/testconfiguration.properties index 3a5aec7..dbdddf9 100644 --- itests/src/test/resources/testconfiguration.properties +++ itests/src/test/resources/testconfiguration.properties @@ -688,6 +688,7 @@ minillaplocal.query.files=\ schema_evol_text_vecrow_part_all_primitive.q,\ schema_evol_text_vecrow_table_llap_io.q,\ schema_evol_text_vecrow_table.q,\ + schema_evol_undecorated.q,\ selectDistinctStar.q,\ semijoin.q,\ semijoin6.q,\ diff --git ql/src/test/queries/clientpositive/schema_evol_undecorated.q ql/src/test/queries/clientpositive/schema_evol_undecorated.q new file mode 100644 index 0000000..1fe5c08 --- /dev/null +++ ql/src/test/queries/clientpositive/schema_evol_undecorated.q @@ -0,0 +1,14 @@ + +set hive.metastore.disallow.incompatible.col.type.changes=true; + +create external table new_char_decimal (c1 char(20)); +alter table new_char_decimal change c1 c1 decimal(31,0); + +create external table new_varchar_decimal (c1 varchar(25)); +alter table new_varchar_decimal change c1 c1 decimal(12,5); + +create external table new_char_double (c1 char(20)); +alter table new_char_double change c1 c1 double; + +create external table new_varchar_double (c1 varchar(25)); +alter table new_varchar_double change c1 c1 double; \ No newline at end of file diff --git ql/src/test/results/clientpositive/llap/schema_evol_undecorated.q.out ql/src/test/results/clientpositive/llap/schema_evol_undecorated.q.out new file mode 100644 index 0000000..2cbdb4c --- /dev/null +++ ql/src/test/results/clientpositive/llap/schema_evol_undecorated.q.out @@ -0,0 +1,64 @@ +PREHOOK: query: create external table new_char_decimal (c1 char(20)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@new_char_decimal +POSTHOOK: query: create external table new_char_decimal (c1 char(20)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@new_char_decimal +PREHOOK: query: alter table new_char_decimal change c1 c1 decimal(31,0) +PREHOOK: type: ALTERTABLE_RENAMECOL +PREHOOK: Input: default@new_char_decimal +PREHOOK: Output: default@new_char_decimal +POSTHOOK: query: alter table new_char_decimal change c1 c1 decimal(31,0) +POSTHOOK: type: ALTERTABLE_RENAMECOL +POSTHOOK: Input: default@new_char_decimal +POSTHOOK: Output: default@new_char_decimal +PREHOOK: query: create external table new_varchar_decimal (c1 varchar(25)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@new_varchar_decimal +POSTHOOK: query: create external table new_varchar_decimal (c1 varchar(25)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@new_varchar_decimal +PREHOOK: query: alter table new_varchar_decimal change c1 c1 decimal(12,5) +PREHOOK: type: ALTERTABLE_RENAMECOL +PREHOOK: Input: default@new_varchar_decimal +PREHOOK: Output: default@new_varchar_decimal +POSTHOOK: query: alter table new_varchar_decimal change c1 c1 decimal(12,5) +POSTHOOK: type: ALTERTABLE_RENAMECOL +POSTHOOK: Input: default@new_varchar_decimal +POSTHOOK: Output: default@new_varchar_decimal +PREHOOK: query: create external table new_char_double (c1 char(20)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@new_char_double +POSTHOOK: query: create external table new_char_double (c1 char(20)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@new_char_double +PREHOOK: query: alter table new_char_double change c1 c1 double +PREHOOK: type: ALTERTABLE_RENAMECOL +PREHOOK: Input: default@new_char_double +PREHOOK: Output: default@new_char_double +POSTHOOK: query: alter table new_char_double change c1 c1 double +POSTHOOK: type: ALTERTABLE_RENAMECOL +POSTHOOK: Input: default@new_char_double +POSTHOOK: Output: default@new_char_double +PREHOOK: query: create external table new_varchar_double (c1 varchar(25)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@new_varchar_double +POSTHOOK: query: create external table new_varchar_double (c1 varchar(25)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@new_varchar_double +PREHOOK: query: alter table new_varchar_double change c1 c1 double +PREHOOK: type: ALTERTABLE_RENAMECOL +PREHOOK: Input: default@new_varchar_double +PREHOOK: Output: default@new_varchar_double +POSTHOOK: query: alter table new_varchar_double change c1 c1 double +POSTHOOK: type: ALTERTABLE_RENAMECOL +POSTHOOK: Input: default@new_varchar_double +POSTHOOK: Output: default@new_varchar_double diff --git standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/ColumnType.java standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/ColumnType.java index d5dea4d..39d2b2f 100644 --- standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/ColumnType.java +++ standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/metastore/ColumnType.java @@ -22,6 +22,7 @@ import org.apache.hadoop.hive.metastore.utils.StringUtils; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -144,6 +145,14 @@ NumericCastOrder.put(DOUBLE_TYPE_NAME, 7); } + private static final Set decoratedTypeNames = new HashSet<>(); + + static { + decoratedTypeNames.add("char"); + decoratedTypeNames.add("decimal"); + decoratedTypeNames.add("varchar"); + } + private static final Map alternateTypeNames = new HashMap<>(); static { @@ -199,6 +208,9 @@ public static String getTypeName(String typeString) { if (typeString == null) return null; String protoType = typeString.toLowerCase().split("\\W")[0]; + if (decoratedTypeNames.contains(protoType)) { + return protoType; + } String realType = alternateTypeNames.get(protoType); return realType == null ? protoType : realType; } @@ -217,8 +229,9 @@ public static boolean areColTypesCompatible(String from, String to) { return NumericCastOrder.get(from) < NumericCastOrder.get(to); } - // Allow string to double conversion - if (StringTypes.contains(from) && to.equals(DOUBLE_TYPE_NAME)) return true; + // Allow string to double/decimal conversion + if (StringTypes.contains(from) && + (to.equals(DOUBLE_TYPE_NAME) || to.equals(DECIMAL_TYPE_NAME))) return true; // Void can go to anything if (from.equals(VOID_TYPE_NAME)) return true;