commit c7c775e2dd3b0d062d53f6da5305e359d6e0e902 Author: Janaki Lahorani Date: Wed Oct 11 18:58:32 2017 -0700 Fix for HIVE-17764: Allow changing column definitions in a view as it is derived from the sql used to define the view. diff --git metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java index 65551ad169d8151fce297d8a44fd30168a682ad0..70d33ff93e1118f151327d21969bf06a1c21b0ff 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java @@ -154,9 +154,13 @@ public void alterTable(RawStore msdb, Warehouse wh, String dbname, isPartitionedTable = true; } + // Views derive the column type from the base table definition. So the view definition + // can be altered to change the column types. The column type compatibility checks should + // be done only for non-views. if (HiveConf.getBoolVar(hiveConf, HiveConf.ConfVars.METASTORE_DISALLOW_INCOMPATIBLE_COL_TYPE_CHANGES, - false)) { + false) && + !oldt.getTableType().equals(TableType.VIRTUAL_VIEW.toString())) { // Throws InvalidOperationException if the new column types are not // compatible with the current column types. checkColTypeChangeCompatible(oldt.getSd().getCols(), newt.getSd().getCols()); diff --git ql/src/test/queries/clientpositive/alter_view_col_type.q ql/src/test/queries/clientpositive/alter_view_col_type.q new file mode 100644 index 0000000000000000000000000000000000000000..5f5f414a699779c443400b921ff986bc337bb6e1 --- /dev/null +++ ql/src/test/queries/clientpositive/alter_view_col_type.q @@ -0,0 +1,16 @@ +create table at1 (c1 int, c2 varchar(1), c3 varchar(10)); + +insert into at1 values (1, 'a', 'one'); +insert into at1 values (2, 'b', 'two'); +insert into at1 values (3, 'c', 'three'); +insert into at1 values (4, 'd', 'four'); +insert into at1 values (5, 'e', 'five'); + +create view av1 as select c1, c2 from at1; +DESCRIBE FORMATTED av1; +select * from av1; + +alter view av1 as select c2, c3 from at1; +DESCRIBE FORMATTED av1; +select * from av1; + diff --git ql/src/test/results/clientpositive/alter_view_col_type.q.out ql/src/test/results/clientpositive/alter_view_col_type.q.out new file mode 100644 index 0000000000000000000000000000000000000000..8ac94371f51dc6c640ded2759820f261ebcd558c --- /dev/null +++ ql/src/test/results/clientpositive/alter_view_col_type.q.out @@ -0,0 +1,167 @@ +PREHOOK: query: create table at1 (c1 int, c2 varchar(1), c3 varchar(10)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@at1 +POSTHOOK: query: create table at1 (c1 int, c2 varchar(1), c3 varchar(10)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@at1 +PREHOOK: query: insert into at1 values (1, 'a', 'one') +PREHOOK: type: QUERY +PREHOOK: Output: default@at1 +POSTHOOK: query: insert into at1 values (1, 'a', 'one') +POSTHOOK: type: QUERY +POSTHOOK: Output: default@at1 +POSTHOOK: Lineage: at1.c1 EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: at1.c2 EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: at1.c3 EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: insert into at1 values (2, 'b', 'two') +PREHOOK: type: QUERY +PREHOOK: Output: default@at1 +POSTHOOK: query: insert into at1 values (2, 'b', 'two') +POSTHOOK: type: QUERY +POSTHOOK: Output: default@at1 +POSTHOOK: Lineage: at1.c1 EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: at1.c2 EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: at1.c3 EXPRESSION [(values__tmp__table__2)values__tmp__table__2.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: insert into at1 values (3, 'c', 'three') +PREHOOK: type: QUERY +PREHOOK: Output: default@at1 +POSTHOOK: query: insert into at1 values (3, 'c', 'three') +POSTHOOK: type: QUERY +POSTHOOK: Output: default@at1 +POSTHOOK: Lineage: at1.c1 EXPRESSION [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: at1.c2 EXPRESSION [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: at1.c3 EXPRESSION [(values__tmp__table__3)values__tmp__table__3.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: insert into at1 values (4, 'd', 'four') +PREHOOK: type: QUERY +PREHOOK: Output: default@at1 +POSTHOOK: query: insert into at1 values (4, 'd', 'four') +POSTHOOK: type: QUERY +POSTHOOK: Output: default@at1 +POSTHOOK: Lineage: at1.c1 EXPRESSION [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: at1.c2 EXPRESSION [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: at1.c3 EXPRESSION [(values__tmp__table__4)values__tmp__table__4.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: insert into at1 values (5, 'e', 'five') +PREHOOK: type: QUERY +PREHOOK: Output: default@at1 +POSTHOOK: query: insert into at1 values (5, 'e', 'five') +POSTHOOK: type: QUERY +POSTHOOK: Output: default@at1 +POSTHOOK: Lineage: at1.c1 EXPRESSION [(values__tmp__table__5)values__tmp__table__5.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: at1.c2 EXPRESSION [(values__tmp__table__5)values__tmp__table__5.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +POSTHOOK: Lineage: at1.c3 EXPRESSION [(values__tmp__table__5)values__tmp__table__5.FieldSchema(name:tmp_values_col3, type:string, comment:), ] +PREHOOK: query: create view av1 as select c1, c2 from at1 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@at1 +PREHOOK: Output: database:default +PREHOOK: Output: default@av1 +POSTHOOK: query: create view av1 as select c1, c2 from at1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@at1 +POSTHOOK: Output: database:default +POSTHOOK: Output: default@av1 +POSTHOOK: Lineage: av1.c1 SIMPLE [(at1)at1.FieldSchema(name:c1, type:int, comment:null), ] +POSTHOOK: Lineage: av1.c2 SIMPLE [(at1)at1.FieldSchema(name:c2, type:varchar(1), comment:null), ] +PREHOOK: query: DESCRIBE FORMATTED av1 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@av1 +POSTHOOK: query: DESCRIBE FORMATTED av1 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@av1 +# col_name data_type comment +c1 int +c2 varchar(1) + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +Table Type: VIRTUAL_VIEW +Table Parameters: +#### A masked pattern was here #### + +# Storage Information +SerDe Library: null +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] + +# View Information +View Original Text: select c1, c2 from at1 +View Expanded Text: select `at1`.`c1`, `at1`.`c2` from `default`.`at1` +View Rewrite Enabled: No +PREHOOK: query: select * from av1 +PREHOOK: type: QUERY +PREHOOK: Input: default@at1 +PREHOOK: Input: default@av1 +#### A masked pattern was here #### +POSTHOOK: query: select * from av1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@at1 +POSTHOOK: Input: default@av1 +#### A masked pattern was here #### +1 a +2 b +3 c +4 d +5 e +PREHOOK: query: alter view av1 as select c2, c3 from at1 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@at1 +PREHOOK: Output: database:default +PREHOOK: Output: default@av1 +POSTHOOK: query: alter view av1 as select c2, c3 from at1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@at1 +POSTHOOK: Output: database:default +POSTHOOK: Output: default@av1 +PREHOOK: query: DESCRIBE FORMATTED av1 +PREHOOK: type: DESCTABLE +PREHOOK: Input: default@av1 +POSTHOOK: query: DESCRIBE FORMATTED av1 +POSTHOOK: type: DESCTABLE +POSTHOOK: Input: default@av1 +# col_name data_type comment +c2 varchar(1) +c3 varchar(10) + +# Detailed Table Information +Database: default +#### A masked pattern was here #### +Retention: 0 +Table Type: VIRTUAL_VIEW +Table Parameters: +#### A masked pattern was here #### + +# Storage Information +SerDe Library: null +InputFormat: org.apache.hadoop.mapred.TextInputFormat +OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat +Compressed: No +Num Buckets: -1 +Bucket Columns: [] +Sort Columns: [] + +# View Information +View Original Text: select c2, c3 from at1 +View Expanded Text: select `at1`.`c2`, `at1`.`c3` from `default`.`at1` +View Rewrite Enabled: No +PREHOOK: query: select * from av1 +PREHOOK: type: QUERY +PREHOOK: Input: default@at1 +PREHOOK: Input: default@av1 +#### A masked pattern was here #### +POSTHOOK: query: select * from av1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@at1 +POSTHOOK: Input: default@av1 +#### A masked pattern was here #### +a one +b two +c three +d four +e five