Index: metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java =================================================================== --- metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (revision 1329210) +++ metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (working copy) @@ -1836,9 +1836,17 @@ checkFilter(client, dbName, tblName, "p2 >= \"p21\"", 3); checkFilter(client, dbName, tblName, "p2 <= \"p21\"", 2); checkFilter(client, dbName, tblName, "p2 <> \"p12\"", 3); + checkFilter(client, dbName, tblName, "p2 != \"p12\"", 3); checkFilter(client, dbName, tblName, "p2 like \"p2.*\"", 3); checkFilter(client, dbName, tblName, "p2 like \"p.*2\"", 1); + try { + checkFilter(client, dbName, tblName, "p2 !< 'dd'", 0); + fail("Invalid operator not detected"); + } catch (MetaException e) { + // expected exception due to lexer error + } + cleanUp(dbName, tblName, null); } @@ -1974,6 +1982,12 @@ tableNames = client.listTableNamesByFilter(dbName, filter, (short) 2); assertEquals(2, tableNames.size()); + filter = org.apache.hadoop.hive.metastore.api.Constants.HIVE_FILTER_FIELD_PARAMS + + "test_param_1 != \"yellow\""; + + tableNames = client.listTableNamesByFilter(dbName, filter, (short) 2); + assertEquals(2, tableNames.size()); + //owner = "testOwner1" and (lastAccessTime = 30 or test_param_1 = "hi") filter = org.apache.hadoop.hive.metastore.api.Constants.HIVE_FILTER_FIELD_OWNER + " = \"testOwner1\" and (" + Index: metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java (revision 1329210) +++ metastore/src/java/org/apache/hadoop/hive/metastore/parser/ExpressionTree.java (working copy) @@ -17,8 +17,11 @@ */ package org.apache.hadoop.hive.metastore.parser; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Stack; import org.antlr.runtime.ANTLRStringStream; @@ -29,6 +32,8 @@ import org.apache.hadoop.hive.metastore.api.MetaException; import org.apache.hadoop.hive.metastore.api.Table; +import com.google.common.collect.Sets; + /** * The Class representing the filter as a binary tree. The tree has TreeNode's * at intermediate level and the leaf level nodes are of type LeafNode. @@ -49,6 +54,7 @@ LESSTHANOREQUALTO ("<="), GREATERTHANOREQUALTO (">="), LIKE ("LIKE", "matches"), + NOTEQUALS2 ("!=", "!="), NOTEQUALS ("<>", "!="); private final String op; @@ -83,6 +89,12 @@ throw new Error("Invalid value " + inputOperator + " for " + Operator.class.getSimpleName()); } + + @Override + public String toString() { + return op; + } + } @@ -161,6 +173,11 @@ } } + //can only support "=" and "!=" for now, because our JDO lib is buggy when + // using objects from map.get() + private static final Set TABLE_FILTER_OPS = Sets.newHashSet( + Operator.EQUALS, Operator.NOTEQUALS, Operator.NOTEQUALS2); + private String generateJDOFilterOverTables(Map params) throws MetaException { if (keyName.equals(Constants.HIVE_FILTER_FIELD_OWNER)) { @@ -172,11 +189,9 @@ } keyName = "this.lastAccessTime"; } else if (keyName.startsWith(Constants.HIVE_FILTER_FIELD_PARAMS)) { - //can only support "=" and "<>" for now, because our JDO lib is buggy when - // using objects from map.get() - if (!(operator == Operator.EQUALS || operator == Operator.NOTEQUALS)) { - throw new MetaException("Only = and <> are supported " + - "opreators for HIVE_FILTER_FIELD_PARAMS"); + if (!TABLE_FILTER_OPS.contains(operator)) { + throw new MetaException("Only " + TABLE_FILTER_OPS + " are supported " + + "operators for HIVE_FILTER_FIELD_PARAMS"); } String paramKeyName = keyName.substring(Constants.HIVE_FILTER_FIELD_PARAMS.length()); keyName = "this.parameters.get(\"" + paramKeyName + "\")"; @@ -185,7 +200,7 @@ value = value.toString(); } else { throw new MetaException("Invalid key name in filter. " + - "Use constants from org.apache.hadoop.hive.metastore.api"); + "Use constants from org.apache.hadoop.hive.metastore.api"); } return generateJDOFilterGeneral(params); } Index: metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g (revision 1329210) +++ metastore/src/java/org/apache/hadoop/hive/metastore/parser/Filter.g (working copy) @@ -33,6 +33,16 @@ } @lexer::header {package org.apache.hadoop.hive.metastore.parser;} +@lexer::members { + public String errorMsg; + + @Override + public void emitErrorMessage(String msg) { + // save for caller to detect invalid filter + errorMsg = msg; + } +} + @members { public ExpressionTree tree = new ExpressionTree(); @@ -121,7 +131,7 @@ LPAREN : '(' ; RPAREN : ')' ; EQUAL : '='; -NOTEQUAL : '<>'; +NOTEQUAL : '<>' | '!='; LESSTHANOREQUALTO : '<='; LESSTHAN : '<'; GREATERTHANOREQUALTO : '>='; Index: metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (revision 1329210) +++ metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (working copy) @@ -1617,6 +1617,11 @@ } catch(RecognitionException re) { throw new MetaException("Error parsing partition filter : " + re); } + + if (lexer.errorMsg != null) { + throw new MetaException("Error parsing partition filter : " + lexer.errorMsg); + } + return parser; }