From 4855d2fa274c672bc1c85c3aad6643f048480caa Mon Sep 17 00:00:00 2001 From: Xuesen Liang Date: Tue, 13 Dec 2016 00:28:20 +0800 Subject: [PATCH] HBASE-17297 Single Filter in parenthesis cannot be parsed correctly --- .../java/org/apache/hadoop/hbase/filter/ParseFilter.java | 7 +++++++ .../org/apache/hadoop/hbase/filter/TestParseFilter.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java index 5089308..f59ddb5 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/ParseFilter.java @@ -161,6 +161,10 @@ public class ParseFilter { throw new IllegalArgumentException("Mismatched parenthesis"); } ByteBuffer argumentOnTopOfStack = operatorStack.peek(); + if (argumentOnTopOfStack.equals(ParseConstants.LPAREN_BUFFER)) { + operatorStack.pop(); + continue; + } while (!(argumentOnTopOfStack.equals(ParseConstants.LPAREN_BUFFER))) { filterStack.push(popArguments(operatorStack, filterStack)); if (operatorStack.empty()) { @@ -181,6 +185,9 @@ public class ParseFilter { while (!operatorStack.empty()) { filterStack.push(popArguments(operatorStack, filterStack)); } + if (filterStack.empty()) { + throw new IllegalArgumentException("Incorrect Filter String"); + } filter = filterStack.pop(); if (!filterStack.empty()) { throw new IllegalArgumentException("Incorrect Filter String"); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java index 4b2df33..b6d8bc1 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestParseFilter.java @@ -509,6 +509,22 @@ public class TestParseFilter { } @Test + public void testCompoundFilter5() throws IOException { + String filterStr = "(ValueFilter(!=, 'substring:pre'))"; + ValueFilter valueFilter = doTestFilter(filterStr, ValueFilter.class); + assertTrue(valueFilter.getComparator() instanceof SubstringComparator); + + filterStr = "(ValueFilter(>=,'binary:x') AND (ValueFilter(<=,'binary:y')))" + + " OR ValueFilter(=,'binary:ab')"; + filter = f.parseFilterString(filterStr); + assertTrue(filter instanceof FilterList); + List list = ((FilterList) filter).getFilters(); + assertEquals(2, list.size()); + assertTrue(list.get(0) instanceof FilterList); + assertTrue(list.get(1) instanceof ValueFilter); + } + + @Test public void testIncorrectCompareOperator() throws IOException { String filterString = "RowFilter ('>>' , 'binary:region')"; try { -- 2.10.0