Index: ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java (revision 1433220) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java (working copy) @@ -2168,13 +2168,23 @@ if (!supportedJDOFuncs(func)) { return "Expression " + expr.getExprString() + " cannot be evaluated"; } + boolean allChildrenConstant = true; List children = funcDesc.getChildExprs(); for (ExprNodeDesc child: children) { + if (!(child instanceof ExprNodeConstantDesc)) { + allChildrenConstant = false; + } String message = checkJDOPushDown(tab, child); if (message != null) { return message; } } + + // If all the children of the expression are constants then JDO cannot parse the expression + // see Filter.g + if (allChildrenConstant) { + return "Expression " + expr.getExprString() + " has only constants as children."; + } return null; } return "Expression " + expr.getExprString() + " cannot be evaluated"; Index: ql/src/test/queries/clientpositive/ppd_constant_where.q =================================================================== --- ql/src/test/queries/clientpositive/ppd_constant_where.q (revision 0) +++ ql/src/test/queries/clientpositive/ppd_constant_where.q (working copy) @@ -0,0 +1,5 @@ +-- Test that the partition pruner does not fail when there is a constant expression in the filter + +EXPLAIN SELECT COUNT(*) FROM srcpart WHERE ds = '2008-04-08' and 'a' = 'a'; + +SELECT COUNT(*) FROM srcpart WHERE ds = '2008-04-08' and 'a' = 'a'; Index: ql/src/test/results/clientpositive/ppd_constant_where.q.out =================================================================== --- ql/src/test/results/clientpositive/ppd_constant_where.q.out (revision 0) +++ ql/src/test/results/clientpositive/ppd_constant_where.q.out (working copy) @@ -0,0 +1,76 @@ +PREHOOK: query: -- Test that the partition pruner does not fail when there is a constant expression in the filter + +EXPLAIN SELECT COUNT(*) FROM srcpart WHERE ds = '2008-04-08' and 'a' = 'a' +PREHOOK: type: QUERY +POSTHOOK: query: -- Test that the partition pruner does not fail when there is a constant expression in the filter + +EXPLAIN SELECT COUNT(*) FROM srcpart WHERE ds = '2008-04-08' and 'a' = 'a' +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME srcpart))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTIONSTAR COUNT))) (TOK_WHERE (and (= (TOK_TABLE_OR_COL ds) '2008-04-08') (= 'a' 'a'))))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + srcpart + TableScan + alias: srcpart + Filter Operator + predicate: + expr: ('a' = 'a') + type: boolean + Select Operator + Group By Operator + aggregations: + expr: count() + bucketGroup: false + mode: hash + outputColumnNames: _col0 + Reduce Output Operator + sort order: + tag: -1 + value expressions: + expr: _col0 + type: bigint + Reduce Operator Tree: + Group By Operator + aggregations: + expr: count(VALUE._col0) + bucketGroup: false + mode: mergepartial + outputColumnNames: _col0 + Select Operator + expressions: + expr: _col0 + type: bigint + outputColumnNames: _col0 + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: -1 + + +PREHOOK: query: SELECT COUNT(*) FROM srcpart WHERE ds = '2008-04-08' and 'a' = 'a' +PREHOOK: type: QUERY +PREHOOK: Input: default@srcpart +PREHOOK: Input: default@srcpart@ds=2008-04-08/hr=11 +PREHOOK: Input: default@srcpart@ds=2008-04-08/hr=12 +#### A masked pattern was here #### +POSTHOOK: query: SELECT COUNT(*) FROM srcpart WHERE ds = '2008-04-08' and 'a' = 'a' +POSTHOOK: type: QUERY +POSTHOOK: Input: default@srcpart +POSTHOOK: Input: default@srcpart@ds=2008-04-08/hr=11 +POSTHOOK: Input: default@srcpart@ds=2008-04-08/hr=12 +#### A masked pattern was here #### +1000