diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index 87928ee930b5ee974d5e4144a584773a243f8d6f..9691cd3c7ca09c7964193ff2d961296297a2be2f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -3829,6 +3829,17 @@ private int alterTableOrSinglePartition(AlterTableDesc alterTbl, Table tbl, Part throw new HiveException(ErrorMsg.REPLACE_CANNOT_DROP_COLUMNS, alterTbl.getOldName()); } } + + boolean partitioned = tbl.isPartitioned(); + boolean droppingColumns = alterTbl.getNewCols().size() < sd.getCols().size(); + if (ParquetHiveSerDe.isParquetTable(tbl) && + isSchemaEvolutionEnabled(tbl) && + !alterTbl.getIsCascade() && + droppingColumns && partitioned) { + LOG.warn("Cannot drop columns from a partitioned parquet table without the CASCADE option"); + throw new HiveException(ErrorMsg.REPLACE_CANNOT_DROP_COLUMNS, + alterTbl.getOldName()); + } sd.setCols(alterTbl.getNewCols()); } else if (alterTbl.getOp() == AlterTableDesc.AlterTableTypes.ADDPROPS) { if (StatsSetupConst.USER.equals(environmentContext.getProperties() diff --git ql/src/test/queries/clientnegative/parquet_alter_part_table_drop_columns.q ql/src/test/queries/clientnegative/parquet_alter_part_table_drop_columns.q new file mode 100644 index 0000000000000000000000000000000000000000..8fd389e8f8b4330d3fbec8a91eb1af77f287eb8f --- /dev/null +++ ql/src/test/queries/clientnegative/parquet_alter_part_table_drop_columns.q @@ -0,0 +1,22 @@ +CREATE TABLE myparquettable_parted +( + name string, + favnumber int, + favcolor string +) +PARTITIONED BY (day string) +STORED AS PARQUET; + +INSERT OVERWRITE TABLE myparquettable_parted +PARTITION(day='2017-04-04') +SELECT + 'mary' as name, + 5 AS favnumber, + 'blue' AS favcolor; + +alter table myparquettable_parted +REPLACE COLUMNS +( +name string, +favnumber int +); diff --git ql/src/test/results/clientnegative/parquet_alter_part_table_drop_columns.q.out ql/src/test/results/clientnegative/parquet_alter_part_table_drop_columns.q.out new file mode 100644 index 0000000000000000000000000000000000000000..d22d9c8763870974b5663b5d2e00c35f0db58f62 --- /dev/null +++ ql/src/test/results/clientnegative/parquet_alter_part_table_drop_columns.q.out @@ -0,0 +1,53 @@ +PREHOOK: query: CREATE TABLE myparquettable_parted +( + name string, + favnumber int, + favcolor string +) +PARTITIONED BY (day string) +STORED AS PARQUET +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@myparquettable_parted +POSTHOOK: query: CREATE TABLE myparquettable_parted +( + name string, + favnumber int, + favcolor string +) +PARTITIONED BY (day string) +STORED AS PARQUET +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@myparquettable_parted +PREHOOK: query: INSERT OVERWRITE TABLE myparquettable_parted +PARTITION(day='2017-04-04') +SELECT + 'mary' as name, + 5 AS favnumber, + 'blue' AS favcolor +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@myparquettable_parted@day=2017-04-04 +POSTHOOK: query: INSERT OVERWRITE TABLE myparquettable_parted +PARTITION(day='2017-04-04') +SELECT + 'mary' as name, + 5 AS favnumber, + 'blue' AS favcolor +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@myparquettable_parted@day=2017-04-04 +POSTHOOK: Lineage: myparquettable_parted PARTITION(day=2017-04-04).favcolor SIMPLE [] +POSTHOOK: Lineage: myparquettable_parted PARTITION(day=2017-04-04).favnumber SIMPLE [] +POSTHOOK: Lineage: myparquettable_parted PARTITION(day=2017-04-04).name SIMPLE [] +PREHOOK: query: alter table myparquettable_parted +REPLACE COLUMNS +( +name string, +favnumber int +) +PREHOOK: type: ALTERTABLE_REPLACECOLS +PREHOOK: Input: default@myparquettable_parted +PREHOOK: Output: default@myparquettable_parted +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cannot drop columns for table default.myparquettable_parted. SerDe may be incompatible