diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartExprEvalUtils.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartExprEvalUtils.java index dc5d2df..438f766 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartExprEvalUtils.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartExprEvalUtils.java @@ -39,7 +39,6 @@ import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; -import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; public class PartExprEvalUtils { @@ -104,16 +103,15 @@ static synchronized public Object evalExprWithPart(ExprNodeDesc expr, } static synchronized public ObjectPair prepareExpr( - ExprNodeGenericFuncDesc expr, List partNames, - List partColumnTypeInfos) throws HiveException { + ExprNodeGenericFuncDesc expr, List partColumnNames) throws HiveException { // Create the row object List partObjectInspectors = new ArrayList(); - for (int i = 0; i < partNames.size(); i++) { - partObjectInspectors.add(PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector( - partColumnTypeInfos.get(i))); + for (int i = 0; i < partColumnNames.size(); i++) { + partObjectInspectors.add( + PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(TypeInfoFactory.stringTypeInfo)); } StructObjectInspector objectInspector = ObjectInspectorFactory - .getStandardStructObjectInspector(partNames, partObjectInspectors); + .getStandardStructObjectInspector(partColumnNames, partObjectInspectors); ExprNodeEvaluator evaluator = ExprNodeEvaluatorFactory.get(expr); ObjectInspector evaluateResultOI = evaluator.initialize(objectInspector); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java index 26e936e..f807e37 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ppr/PartitionPruner.java @@ -62,6 +62,7 @@ import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters; import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; @@ -521,7 +522,7 @@ public static boolean prunePartitionNames(List partColumnNames, String defaultPartitionName, List partNames) throws HiveException, MetaException { // Prepare the expression to filter on the columns. ObjectPair handle = - PartExprEvalUtils.prepareExpr(prunerExpr, partColumnNames, partColumnTypeInfos); + PartExprEvalUtils.prepareExpr(prunerExpr, partColumnNames); // Filter the name list. Removing elements one by one can be slow on e.g. ArrayList, // so let's create a new list and copy it if we don't have a linked list @@ -542,10 +543,14 @@ public static boolean prunePartitionNames(List partColumnNames, ArrayList convertedValues = new ArrayList(values.size()); for(int i=0; i> getFullPartitionSpecs( CommonTree ast, Table tab, boolean canGroupExprs) throws SemanticException { + String defaultPartitionName = HiveConf.getVar(conf, HiveConf.ConfVars.DEFAULTPARTITIONNAME); Map colTypes = new HashMap(); for (FieldSchema fs : tab.getPartitionKeys()) { colTypes.put(fs.getName().toLowerCase(), fs.getType()); @@ -3123,6 +3124,9 @@ private void analyzeMetastoreCheck(CommonTree ast) throws SemanticException { PrimitiveTypeInfo pti = TypeInfoFactory.getPrimitiveTypeInfo(type); Object val = valExpr.getValue(); if (!valExpr.getTypeString().equals(type)) { + if (val.equals(defaultPartitionName)) { + pti = TypeInfoFactory.stringTypeInfo; + } Converter converter = ObjectInspectorConverters.getConverter( TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(valExpr.getTypeInfo()), TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(pti)); diff --git a/ql/src/test/queries/clientpositive/drop_partitions_filter4.q b/ql/src/test/queries/clientpositive/drop_partitions_filter4.q new file mode 100644 index 0000000..f0e5e19 --- /dev/null +++ b/ql/src/test/queries/clientpositive/drop_partitions_filter4.q @@ -0,0 +1,29 @@ +SET hive.exec.dynamic.partition.mode=nonstrict; + +create table ptestfilter (a string, b int) partitioned by (c double); +INSERT OVERWRITE TABLE ptestfilter PARTITION (c) select 'Col1', 1, null; +alter table ptestfilter add partition (c=3.4); +alter table ptestfilter add partition (c=5.55); +show partitions ptestfilter; + +alter table ptestfilter drop partition(c = '__HIVE_DEFAULT_PARTITION__'); +alter table ptestfilter drop partition(c = 3.40); +show partitions ptestfilter; + +drop table ptestfilter; + +create table ptestfilter (a string, b int) partitioned by (c string, d int); +INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col1', 1, null, null; +INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col2', 2, null, 2; +INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col3', 3, 'Uganda', null; +alter table ptestfilter add partition (c='Germany', d=2); +show partitions ptestfilter; + +alter table ptestfilter drop partition (c='__HIVE_DEFAULT_PARTITION__'); +alter table ptestfilter drop partition (c='Uganda', d='__HIVE_DEFAULT_PARTITION__'); +alter table ptestfilter drop partition (c='Germany', d=2); +show partitions ptestfilter; + +drop table ptestfilter; + + diff --git a/ql/src/test/results/clientpositive/drop_partitions_filter4.q.out b/ql/src/test/results/clientpositive/drop_partitions_filter4.q.out new file mode 100644 index 0000000..0e6d41a --- /dev/null +++ b/ql/src/test/results/clientpositive/drop_partitions_filter4.q.out @@ -0,0 +1,167 @@ +PREHOOK: query: create table ptestfilter (a string, b int) partitioned by (c double) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: create table ptestfilter (a string, b int) partitioned by (c double) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@ptestfilter +PREHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c) select 'Col1', 1, null +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c) select 'Col1', 1, null +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__ +POSTHOOK: Lineage: ptestfilter PARTITION(c=__HIVE_DEFAULT_PARTITION__).a SIMPLE [] +POSTHOOK: Lineage: ptestfilter PARTITION(c=__HIVE_DEFAULT_PARTITION__).b SIMPLE [] +PREHOOK: query: alter table ptestfilter add partition (c=3.4) +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: alter table ptestfilter add partition (c=3.4) +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Output: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=3.4 +PREHOOK: query: alter table ptestfilter add partition (c=5.55) +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: alter table ptestfilter add partition (c=5.55) +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Output: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=5.55 +PREHOOK: query: show partitions ptestfilter +PREHOOK: type: SHOWPARTITIONS +PREHOOK: Input: default@ptestfilter +POSTHOOK: query: show partitions ptestfilter +POSTHOOK: type: SHOWPARTITIONS +POSTHOOK: Input: default@ptestfilter +c=3.4 +c=5.55 +c=__HIVE_DEFAULT_PARTITION__ +PREHOOK: query: alter table ptestfilter drop partition(c = '__HIVE_DEFAULT_PARTITION__') +PREHOOK: type: ALTERTABLE_DROPPARTS +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__ +POSTHOOK: query: alter table ptestfilter drop partition(c = '__HIVE_DEFAULT_PARTITION__') +POSTHOOK: type: ALTERTABLE_DROPPARTS +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__ +PREHOOK: query: alter table ptestfilter drop partition(c = 3.40) +PREHOOK: type: ALTERTABLE_DROPPARTS +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter@c=3.4 +POSTHOOK: query: alter table ptestfilter drop partition(c = 3.40) +POSTHOOK: type: ALTERTABLE_DROPPARTS +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=3.4 +PREHOOK: query: show partitions ptestfilter +PREHOOK: type: SHOWPARTITIONS +PREHOOK: Input: default@ptestfilter +POSTHOOK: query: show partitions ptestfilter +POSTHOOK: type: SHOWPARTITIONS +POSTHOOK: Input: default@ptestfilter +c=5.55 +PREHOOK: query: drop table ptestfilter +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: drop table ptestfilter +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter +PREHOOK: query: create table ptestfilter (a string, b int) partitioned by (c string, d int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: create table ptestfilter (a string, b int) partitioned by (c string, d int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@ptestfilter +PREHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col1', 1, null, null +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col1', 1, null, null +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__/d=__HIVE_DEFAULT_PARTITION__ +POSTHOOK: Lineage: ptestfilter PARTITION(c=__HIVE_DEFAULT_PARTITION__,d=__HIVE_DEFAULT_PARTITION__).a SIMPLE [] +POSTHOOK: Lineage: ptestfilter PARTITION(c=__HIVE_DEFAULT_PARTITION__,d=__HIVE_DEFAULT_PARTITION__).b SIMPLE [] +PREHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col2', 2, null, 2 +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col2', 2, null, 2 +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__/d=2 +POSTHOOK: Lineage: ptestfilter PARTITION(c=__HIVE_DEFAULT_PARTITION__,d=2).a SIMPLE [] +POSTHOOK: Lineage: ptestfilter PARTITION(c=__HIVE_DEFAULT_PARTITION__,d=2).b SIMPLE [] +PREHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col3', 3, 'Uganda', null +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: INSERT OVERWRITE TABLE ptestfilter PARTITION (c,d) select 'Col3', 3, 'Uganda', null +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@ptestfilter@c=Uganda/d=__HIVE_DEFAULT_PARTITION__ +POSTHOOK: Lineage: ptestfilter PARTITION(c=Uganda,d=__HIVE_DEFAULT_PARTITION__).a SIMPLE [] +POSTHOOK: Lineage: ptestfilter PARTITION(c=Uganda,d=__HIVE_DEFAULT_PARTITION__).b SIMPLE [] +PREHOOK: query: alter table ptestfilter add partition (c='Germany', d=2) +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: alter table ptestfilter add partition (c='Germany', d=2) +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Output: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=Germany/d=2 +PREHOOK: query: show partitions ptestfilter +PREHOOK: type: SHOWPARTITIONS +PREHOOK: Input: default@ptestfilter +POSTHOOK: query: show partitions ptestfilter +POSTHOOK: type: SHOWPARTITIONS +POSTHOOK: Input: default@ptestfilter +c=Germany/d=2 +c=Uganda/d=__HIVE_DEFAULT_PARTITION__ +c=__HIVE_DEFAULT_PARTITION__/d=2 +c=__HIVE_DEFAULT_PARTITION__/d=__HIVE_DEFAULT_PARTITION__ +PREHOOK: query: alter table ptestfilter drop partition (c='__HIVE_DEFAULT_PARTITION__') +PREHOOK: type: ALTERTABLE_DROPPARTS +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__/d=2 +PREHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__/d=__HIVE_DEFAULT_PARTITION__ +POSTHOOK: query: alter table ptestfilter drop partition (c='__HIVE_DEFAULT_PARTITION__') +POSTHOOK: type: ALTERTABLE_DROPPARTS +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__/d=2 +POSTHOOK: Output: default@ptestfilter@c=__HIVE_DEFAULT_PARTITION__/d=__HIVE_DEFAULT_PARTITION__ +PREHOOK: query: alter table ptestfilter drop partition (c='Uganda', d='__HIVE_DEFAULT_PARTITION__') +PREHOOK: type: ALTERTABLE_DROPPARTS +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter@c=Uganda/d=__HIVE_DEFAULT_PARTITION__ +POSTHOOK: query: alter table ptestfilter drop partition (c='Uganda', d='__HIVE_DEFAULT_PARTITION__') +POSTHOOK: type: ALTERTABLE_DROPPARTS +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=Uganda/d=__HIVE_DEFAULT_PARTITION__ +PREHOOK: query: alter table ptestfilter drop partition (c='Germany', d=2) +PREHOOK: type: ALTERTABLE_DROPPARTS +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter@c=Germany/d=2 +POSTHOOK: query: alter table ptestfilter drop partition (c='Germany', d=2) +POSTHOOK: type: ALTERTABLE_DROPPARTS +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter@c=Germany/d=2 +PREHOOK: query: show partitions ptestfilter +PREHOOK: type: SHOWPARTITIONS +PREHOOK: Input: default@ptestfilter +POSTHOOK: query: show partitions ptestfilter +POSTHOOK: type: SHOWPARTITIONS +POSTHOOK: Input: default@ptestfilter +PREHOOK: query: drop table ptestfilter +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@ptestfilter +PREHOOK: Output: default@ptestfilter +POSTHOOK: query: drop table ptestfilter +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@ptestfilter +POSTHOOK: Output: default@ptestfilter