Index: src/test/results/clientpositive/udf_notop.q.out =================================================================== --- src/test/results/clientpositive/udf_notop.q.out (revision 0) +++ src/test/results/clientpositive/udf_notop.q.out (revision 0) @@ -0,0 +1,27 @@ +PREHOOK: query: SELECT 1 NOT IN (1, 2, 3), + 4 NOT IN (1, 2, 3), + 1 = 2 NOT IN (true, false), + "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-06-02_14-36-13_085_5783843972339431665/-mr-10000 +POSTHOOK: query: SELECT 1 NOT IN (1, 2, 3), + 4 NOT IN (1, 2, 3), + 1 = 2 NOT IN (true, false), + "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-06-02_14-36-13_085_5783843972339431665/-mr-10000 +false true false false true false true false true true Index: src/test/queries/clientpositive/udf_notop.q =================================================================== --- src/test/queries/clientpositive/udf_notop.q (revision 0) +++ src/test/queries/clientpositive/udf_notop.q (revision 0) @@ -0,0 +1,10 @@ +SELECT 1 NOT IN (1, 2, 3), + 4 NOT IN (1, 2, 3), + 1 = 2 NOT IN (true, false), + "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: src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1130680) +++ 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 $precedenceEqualExpression $notExpr)) + | (precedenceEqualOperator equalExpr=precedenceBitwiseOrExpression) + -> ^(precedenceEqualOperator $precedenceEqualExpression $equalExpr) + | (KW_NOT KW_IN expressions) + -> ^(KW_NOT ^(TOK_FUNCTION KW_IN $precedenceEqualExpression expressions)) + | (KW_IN expressions) + -> ^(TOK_FUNCTION KW_IN $precedenceEqualExpression expressions) + )* ; expressions