Index: ql/src/test/results/clientpositive/cbo_correctness.q.out =================================================================== --- ql/src/test/results/clientpositive/cbo_correctness.q.out (revision 1619831) +++ ql/src/test/results/clientpositive/cbo_correctness.q.out (working copy) @@ -17879,3 +17879,15 @@ NULL NULL NULL +PREHOOK: query: -- 14. unary operator +select key from t1 where c_int = -6 or c_int = +6 +PREHOOK: type: QUERY +PREHOOK: Input: default@t1 +PREHOOK: Input: default@t1@dt=2014 +#### A masked pattern was here #### +POSTHOOK: query: -- 14. unary operator +select key from t1 where c_int = -6 or c_int = +6 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@t1 +POSTHOOK: Input: default@t1@dt=2014 +#### A masked pattern was here #### Index: ql/src/test/queries/clientpositive/cbo_correctness.q =================================================================== --- ql/src/test/queries/clientpositive/cbo_correctness.q (revision 1619831) +++ ql/src/test/queries/clientpositive/cbo_correctness.q (working copy) @@ -217,3 +217,6 @@ -- 13. null expr in select list select null from t3; + +-- 14. unary operator +select key from t1 where c_int = -6 or c_int = +6; Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java (revision 1619831) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java (working copy) @@ -12,6 +12,8 @@ import org.apache.hadoop.hive.ql.parse.ParseDriver; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNegative; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPPositive; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; import org.eigenbase.reltype.RelDataType; @@ -49,6 +51,12 @@ public static SqlOperator getOptiqOperator(GenericUDF hiveUDF, ImmutableList optiqArgTypes, RelDataType retType) { + // handle overloaded methods first + if (hiveUDF instanceof GenericUDFOPNegative) { + return SqlStdOperatorTable.UNARY_MINUS; + } else if (hiveUDF instanceof GenericUDFOPPositive) { + return SqlStdOperatorTable.UNARY_PLUS; + } // do genric lookup return getOptiqFn(getName(hiveUDF), optiqArgTypes, retType); } @@ -111,9 +119,16 @@ node = (ASTNode) ParseDriver.adaptor.create(hToken.type, hToken.text); } else { node = (ASTNode) ParseDriver.adaptor.create(HiveParser.TOK_FUNCTION, "TOK_FUNCTION"); - if (op.kind != SqlKind.CAST) + if (op.kind != SqlKind.CAST) { + if (op.kind == SqlKind.MINUS_PREFIX) { + node = (ASTNode) ParseDriver.adaptor.create(HiveParser.MINUS, "MINUS"); + } else if (op.kind == SqlKind.PLUS_PREFIX) { + node = (ASTNode) ParseDriver.adaptor.create(HiveParser.PLUS, "PLUS"); + } else { node.addChild((ASTNode) ParseDriver.adaptor.create(HiveParser.Identifier, op.getName())); } + } + } for (ASTNode c : children) { ParseDriver.adaptor.addChild(node, c); @@ -144,7 +159,7 @@ if (hiveUDF instanceof GenericUDFBridge) { udfName = ((GenericUDFBridge) hiveUDF).getUdfName(); } else { - Class udfClass = hiveUDF.getClass(); + Class udfClass = hiveUDF.getClass(); Annotation udfAnnotation = udfClass.getAnnotation(Description.class); if (udfAnnotation != null && udfAnnotation instanceof Description) {