Index: ql/src/test/results/clientpositive/udf_notop.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_notop.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_notop.q.out (revision 0) @@ -0,0 +1,25 @@ +PREHOOK: query: SELECT 1 NOT IN (1, 2, 3), + 4 NOT IN (1, 2, 3), + "abc" NOT LIKE "a%", + "abc" NOT LIKE "b%", + "abc" NOT RLIKE "^ab", + "abc" NOT RLIKE "^bc", + "abc" NOT REGEXP "^ab", + "abc" NOT REGEXP "^bc", + 1 IN (1, 2) AND "abc" NOT LIKE "bc%" FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/tmp/ehassold/hive_2011-05-27_14-53-31_508_8766637815195438758/-mr-10000 +POSTHOOK: query: SELECT 1 NOT IN (1, 2, 3), + 4 NOT IN (1, 2, 3), + "abc" NOT LIKE "a%", + "abc" NOT LIKE "b%", + "abc" NOT RLIKE "^ab", + "abc" NOT RLIKE "^bc", + "abc" NOT REGEXP "^ab", + "abc" NOT REGEXP "^bc", + 1 IN (1, 2) AND "abc" NOT LIKE "bc%" FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/tmp/ehassold/hive_2011-05-27_14-53-31_508_8766637815195438758/-mr-10000 +false true false true false true false true true Index: ql/src/test/queries/clientpositive/udf_notop.q =================================================================== --- ql/src/test/queries/clientpositive/udf_notop.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_notop.q (revision 0) @@ -0,0 +1,9 @@ +SELECT 1 NOT IN (1, 2, 3), + 4 NOT IN (1, 2, 3), + "abc" NOT LIKE "a%", + "abc" NOT LIKE "b%", + "abc" NOT RLIKE "^ab", + "abc" NOT RLIKE "^bc", + "abc" NOT REGEXP "^ab", + "abc" NOT REGEXP "^bc", + 1 IN (1, 2) AND "abc" NOT LIKE "bc%" FROM src LIMIT 1; Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1128408) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (working copy) @@ -1933,20 +1933,30 @@ ; -precedenceEqualOperator +// Equal operators supporting NOT prefix +precedenceEqualNegatableOperator : - EQUAL | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN - | KW_LIKE | KW_RLIKE | KW_REGEXP + KW_LIKE | KW_RLIKE | KW_REGEXP ; -precedenceEqualExpression +precedenceEqualOperator : - precedenceBitwiseOrExpression ( (precedenceEqualOperator^ precedenceBitwiseOrExpression) | (inOperator^ expressions) )* + precedenceEqualNegatableOperator | EQUAL | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN | GREATERTHANOREQUALTO | GREATERTHAN ; -inOperator +precedenceEqualExpression : - KW_IN -> ^(TOK_FUNCTION KW_IN) + (left=precedenceBitwiseOrExpression -> $left) + ( + (KW_NOT precedenceEqualNegatableOperator notExpr=precedenceBitwiseOrExpression) + -> ^(KW_NOT ^(precedenceEqualNegatableOperator $left $notExpr)) + | (precedenceEqualOperator equalExpr=precedenceBitwiseOrExpression) + -> ^(precedenceEqualOperator $left $equalExpr) + | (KW_NOT KW_IN expressions) + -> ^(KW_NOT ^(TOK_FUNCTION KW_IN $left expressions)) + | (KW_IN expressions) + -> ^(TOK_FUNCTION KW_IN $left expressions) + )* ; expressions