diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java index 4058dcf..d39a3f9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java @@ -39,8 +39,11 @@ import org.apache.calcite.rex.RexWindowBound; import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.type.SqlTypeUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hive.common.type.HiveChar; import org.apache.hadoop.hive.common.type.HiveVarchar; +import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.optimizer.calcite.translator.ASTConverter.Schema; import org.apache.hadoop.hive.ql.parse.ASTNode; import org.apache.hadoop.hive.ql.parse.PTFInvocationSpec.Order; @@ -76,6 +79,7 @@ boolean partitioningExpr; WindowFunctionSpec wfs; private final RelDataTypeFactory dTFactory; + protected final Log LOG = LogFactory.getLog(this.getClass().getName()); public ExprNodeConverter(String tabAlias, RelDataType inputRowType, boolean partitioningExpr, RelDataTypeFactory dTFactory) { @@ -128,29 +132,42 @@ public ExprNodeDesc visitCall(RexCall call) { call.operands.get(0).getType())) { return args.get(0); } else if (ASTConverter.isFlat(call)) { - // If Expr is flat (and[p,q,r,s] or[p,q,r,s]) then recursively build the - // exprnode + // If Expr is flat (and[p,q,r,s] or[p,q,r,s]) then recursively build the + // exprnode + GenericUDF hiveUdf = SqlFunctionConverter.getHiveUDF(call.getOperator(), call.getType(), 2); ArrayList tmpExprArgs = new ArrayList(); tmpExprArgs.addAll(args.subList(0, 2)); - gfDesc = new ExprNodeGenericFuncDesc(TypeConverter.convert(call.getType()), - SqlFunctionConverter.getHiveUDF(call.getOperator(), call.getType(), 2), tmpExprArgs); + try { + gfDesc = ExprNodeGenericFuncDesc.newInstance(hiveUdf, tmpExprArgs); + } catch (UDFArgumentException e) { + LOG.error(e); + throw new RuntimeException(e); + } for (int i = 2; i < call.operands.size(); i++) { tmpExprArgs = new ArrayList(); tmpExprArgs.add(gfDesc); tmpExprArgs.add(args.get(i)); - gfDesc = new ExprNodeGenericFuncDesc(TypeConverter.convert(call.getType()), - SqlFunctionConverter.getHiveUDF(call.getOperator(), call.getType(), 2), tmpExprArgs); + try { + gfDesc = ExprNodeGenericFuncDesc.newInstance(hiveUdf, tmpExprArgs); + } catch (UDFArgumentException e) { + LOG.error(e); + throw new RuntimeException(e); + } } } else { - GenericUDF hiveUdf = SqlFunctionConverter.getHiveUDF( - call.getOperator(), call.getType(), args.size()); + GenericUDF hiveUdf = SqlFunctionConverter.getHiveUDF(call.getOperator(), call.getType(), + args.size()); if (hiveUdf == null) { - throw new RuntimeException("Cannot find UDF for " + call.getType() + " " + call.getOperator() - + "[" + call.getOperator().getKind() + "]/" + args.size()); + throw new RuntimeException("Cannot find UDF for " + call.getType() + " " + + call.getOperator() + "[" + call.getOperator().getKind() + "]/" + args.size()); + } + try { + gfDesc = ExprNodeGenericFuncDesc.newInstance(hiveUdf, args); + } catch (UDFArgumentException e) { + LOG.error(e); + throw new RuntimeException(e); } - gfDesc = new ExprNodeGenericFuncDesc(TypeConverter.convert(call.getType()), hiveUdf, args); } - return gfDesc; } diff --git a/ql/src/test/queries/clientpositive/cbo_simple_select.q b/ql/src/test/queries/clientpositive/cbo_simple_select.q index bbfcd34..92c0e72 100644 --- a/ql/src/test/queries/clientpositive/cbo_simple_select.q +++ b/ql/src/test/queries/clientpositive/cbo_simple_select.q @@ -9,7 +9,8 @@ select * from cbo_t1; select * from cbo_t1 as cbo_t1; select * from cbo_t1 as cbo_t2; -select cbo_t1.key as x, c_int as c_int, (((c_int+c_float)*10)+5) as y from cbo_t1; +select cbo_t1.key as x, c_int as c_int, (((c_int+c_float)*10)+5) as y from cbo_t1; +select * from cbo_t1 where (((key=1) and (c_float=10)) and (c_int=20)); -- 2. Test Select + TS + FIL select * from cbo_t1 where cbo_t1.c_int >= 0; diff --git a/ql/src/test/results/clientpositive/cbo_simple_select.q.out b/ql/src/test/results/clientpositive/cbo_simple_select.q.out index b392637..d161d9f 100644 --- a/ql/src/test/results/clientpositive/cbo_simple_select.q.out +++ b/ql/src/test/results/clientpositive/cbo_simple_select.q.out @@ -120,6 +120,16 @@ POSTHOOK: Input: default@cbo_t1@dt=2014 1 1 25.0 NULL NULL NULL NULL NULL NULL +PREHOOK: query: select * from cbo_t1 where (((key=1) and (c_float=10)) and (c_int=20)) +PREHOOK: type: QUERY +PREHOOK: Input: default@cbo_t1 +PREHOOK: Input: default@cbo_t1@dt=2014 +#### A masked pattern was here #### +POSTHOOK: query: select * from cbo_t1 where (((key=1) and (c_float=10)) and (c_int=20)) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@cbo_t1 +POSTHOOK: Input: default@cbo_t1@dt=2014 +#### A masked pattern was here #### PREHOOK: query: -- 2. Test Select + TS + FIL select * from cbo_t1 where cbo_t1.c_int >= 0 PREHOOK: type: QUERY