You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sa...@apache.org on 2016/04/01 15:48:11 UTC

cassandra git commit: Make value of LIKE relations a Term

Repository: cassandra
Updated Branches:
  refs/heads/trunk 21448c508 -> bdae4520c


Make value of LIKE relations a Term

Patch by Sam Tunnicliffe; reviewed by Pavel Yaskevich for
CASSANDRA-11456


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/bdae4520
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/bdae4520
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/bdae4520

Branch: refs/heads/trunk
Commit: bdae4520c5bd19caf607ed92eea3e8c02a694bd0
Parents: 21448c5
Author: Sam Tunnicliffe <sa...@beobal.com>
Authored: Thu Mar 31 15:08:36 2016 +0100
Committer: Sam Tunnicliffe <sa...@beobal.com>
Committed: Fri Apr 1 14:45:47 2016 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 src/antlr/Parser.g                              | 41 +------------
 .../org/apache/cassandra/cql3/Operator.java     | 15 +++--
 .../org/apache/cassandra/cql3/Relation.java     |  4 +-
 .../cassandra/cql3/SingleColumnRelation.java    |  3 -
 .../restrictions/SingleColumnRestriction.java   | 62 ++++++++++++++++++-
 .../restrictions/StatementRestrictions.java     |  4 +-
 .../apache/cassandra/db/filter/RowFilter.java   | 10 +--
 .../cassandra/index/sasi/conf/ColumnIndex.java  |  3 +
 .../validation/entities/SecondaryIndexTest.java | 64 ++++++++++++++++++++
 .../cql3/validation/operations/SelectTest.java  |  3 +-
 .../cassandra/index/sasi/SASIIndexTest.java     |  4 +-
 .../index/sasi/plan/OperationTest.java          |  2 +-
 13 files changed, 155 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 0401357..cf05d7b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.6
+ * Support LIKE operator in prepared statements (CASSANDRA-11456)
  * Add a command to see if a Materialized View has finished building (CASSANDRA-9967)
  * Log endpoint and port associated with streaming operation (CASSANDRA-8777)
  * Print sensible units for all log messages (CASSANDRA-9692)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/antlr/Parser.g
----------------------------------------------------------------------
diff --git a/src/antlr/Parser.g b/src/antlr/Parser.g
index b4aa235..78a2d0d 100644
--- a/src/antlr/Parser.g
+++ b/src/antlr/Parser.g
@@ -156,45 +156,6 @@ options {
         return filtered;
     }
 
-    public void buildLIKERelation(WhereClause.Builder whereClause, ColumnIdentifier.Raw name, String likeValue)
-    {
-        Operator operator;
-        int beginIndex = 0;
-        int endIndex = likeValue.length() - 1;
-
-        if (likeValue.charAt(endIndex) == '\%')
-        {
-            if (likeValue.charAt(beginIndex) == '\%')
-            {
-                operator = Operator.LIKE_CONTAINS;
-                beginIndex =+ 1;
-            }
-            else
-            {
-                operator = Operator.LIKE_PREFIX;
-            }
-        }
-        else if (likeValue.charAt(beginIndex) == '\%')
-        {
-            operator = Operator.LIKE_SUFFIX;
-            beginIndex += 1;
-            endIndex += 1;
-        }
-        else
-        {
-            operator = Operator.LIKE_MATCHES;
-            endIndex += 1;
-        }
-
-        if (endIndex == 0 || beginIndex == endIndex)
-        {
-            addRecognitionError("LIKE value can't be empty.");
-            return;
-        }
-
-        String value = likeValue.substring(beginIndex, endIndex);
-        whereClause.add(new SingleColumnRelation(name, operator, Constants.Literal.string(value)));
-    }
 }
 
 /** STATEMENTS **/
@@ -1402,7 +1363,7 @@ relationType returns [Operator op]
 
 relation[WhereClause.Builder clauses]
     : name=cident type=relationType t=term { $clauses.add(new SingleColumnRelation(name, type, t)); }
-    | name=cident K_LIKE v=STRING_LITERAL { buildLIKERelation($clauses, name, $v.text); }
+    | name=cident K_LIKE t=term { $clauses.add(new SingleColumnRelation(name, Operator.LIKE, t)); }
     | name=cident K_IS K_NOT K_NULL { $clauses.add(new SingleColumnRelation(name, Operator.IS_NOT, Constants.NULL_LITERAL)); }
     | K_TOKEN l=tupleOfIdentifiers type=relationType t=term
         { $clauses.add(new TokenRelation(l, type, t)); }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/cql3/Operator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Operator.java b/src/java/org/apache/cassandra/cql3/Operator.java
index accb786..07c92f0 100644
--- a/src/java/org/apache/cassandra/cql3/Operator.java
+++ b/src/java/org/apache/cassandra/cql3/Operator.java
@@ -25,10 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.ListType;
-import org.apache.cassandra.db.marshal.MapType;
-import org.apache.cassandra.db.marshal.SetType;
+import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 public enum Operator
@@ -134,6 +131,14 @@ public enum Operator
         {
             return "LIKE '<term>'";
         }
+    },
+    LIKE(14)
+    {
+        @Override
+        public String toString()
+        {
+            return "LIKE";
+        }
     };
 
     /**
@@ -234,7 +239,7 @@ public enum Operator
             case LIKE_CONTAINS:
                 return ByteBufferUtil.contains(leftOperand, rightOperand);
             default:
-                // we shouldn't get CONTAINS, CONTAINS KEY, or IS NOT here
+                // we shouldn't get LIKE, CONTAINS, CONTAINS KEY, or IS NOT here
                 throw new AssertionError();
         }
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/cql3/Relation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/Relation.java b/src/java/org/apache/cassandra/cql3/Relation.java
index 616fd30..bc986f6 100644
--- a/src/java/org/apache/cassandra/cql3/Relation.java
+++ b/src/java/org/apache/cassandra/cql3/Relation.java
@@ -113,7 +113,8 @@ public abstract class Relation {
         return relationType == Operator.LIKE_PREFIX
                 || relationType == Operator.LIKE_SUFFIX
                 || relationType == Operator.LIKE_CONTAINS
-                || relationType == Operator.LIKE_MATCHES;
+                || relationType == Operator.LIKE_MATCHES
+                || relationType == Operator.LIKE;
     }
 
     /**
@@ -155,6 +156,7 @@ public abstract class Relation {
             case LIKE_SUFFIX:
             case LIKE_CONTAINS:
             case LIKE_MATCHES:
+            case LIKE:
                 return newLikeRestriction(cfm, boundNames, relationType);
             default: throw invalidRequest("Unsupported \"!=\" relation: %s", this);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
index f61225b..3cb07b9 100644
--- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
+++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
@@ -151,9 +151,6 @@ public final class SingleColumnRelation extends Relation
         if (isIN())
             return String.format("%s IN %s", entityAsString, inValues);
 
-        if (isLIKE())
-            return String.format("%s %s", entityAsString, relationType);
-
         return String.format("%s %s %s", entityAsString, relationType, value);
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
index ab4815a..a5804be 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
@@ -18,7 +18,9 @@
 package org.apache.cassandra.cql3.restrictions;
 
 import java.nio.ByteBuffer;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import com.google.common.collect.Iterables;
 
@@ -32,6 +34,8 @@ import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.Index;
 import org.apache.cassandra.index.SecondaryIndexManager;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.Pair;
 
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkBindValueSet;
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
@@ -653,6 +657,7 @@ public abstract class SingleColumnRestriction extends AbstractRestriction
 
     public static final class LikeRestriction extends SingleColumnRestriction
     {
+        private static final ByteBuffer LIKE_WILDCARD = ByteBufferUtil.bytes("%");
         private final Operator operator;
         private final Term value;
 
@@ -698,7 +703,14 @@ public abstract class SingleColumnRestriction extends AbstractRestriction
                                    SecondaryIndexManager indexManager,
                                    QueryOptions options)
         {
-            filter.add(columnDef, operator, value.bindAndGet(options));
+            Pair<Operator, ByteBuffer> operation = makeSpecific(value.bindAndGet(options));
+
+            // there must be a suitable INDEX for LIKE_XXX expressions
+            RowFilter.SimpleExpression expression = filter.add(columnDef, operation.left, operation.right);
+            indexManager.getBestIndexFor(expression)
+                        .orElseThrow(() -> new InvalidRequestException(expression.toString() +
+                                                                       " is only supported on properly" +
+                                                                       " indexed columns"));
         }
 
         @Override
@@ -727,5 +739,51 @@ public abstract class SingleColumnRestriction extends AbstractRestriction
         {
             return index.supportsExpression(columnDef, operator);
         }
+
+        /**
+         * As the specific subtype of LIKE (LIKE_PREFIX, LIKE_SUFFIX, LIKE_CONTAINS, LIKE_MATCHES) can only be
+         * determined by examining the value, which in turn can only be known after binding, all LIKE restrictions
+         * are initially created with the generic LIKE operator. This function takes the bound value, trims the
+         * wildcard '%' chars from it and returns a tuple of the inferred operator subtype and the final value
+         * @param value the bound value for the LIKE operation
+         * @return  Pair containing the inferred LIKE subtype and the value with wildcards removed
+         */
+        private static Pair<Operator, ByteBuffer> makeSpecific(ByteBuffer value)
+        {
+            Operator operator;
+            int beginIndex = value.position();
+            int endIndex = value.limit() - 1;
+            if (ByteBufferUtil.endsWith(value, LIKE_WILDCARD))
+            {
+                if (ByteBufferUtil.startsWith(value, LIKE_WILDCARD))
+                {
+                    operator = Operator.LIKE_CONTAINS;
+                    beginIndex =+ 1;
+                }
+                else
+                {
+                    operator = Operator.LIKE_PREFIX;
+                }
+            }
+            else if (ByteBufferUtil.startsWith(value, LIKE_WILDCARD))
+            {
+                operator = Operator.LIKE_SUFFIX;
+                beginIndex += 1;
+                endIndex += 1;
+            }
+            else
+            {
+                operator = Operator.LIKE_MATCHES;
+                endIndex += 1;
+            }
+
+            if (endIndex == 0 || beginIndex == endIndex)
+                throw new InvalidRequestException("LIKE value can't be empty.");
+
+            ByteBuffer newValue = value.duplicate();
+            newValue.position(beginIndex);
+            newValue.limit(endIndex);
+            return Pair.create(operator, newValue);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
index 0672a99..a35d86b 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
@@ -164,7 +164,9 @@ public final class StatementRestrictions
                 Restriction restriction = relation.toRestriction(cfm, boundNames);
 
                 if (!type.allowUseOfSecondaryIndices() || !restriction.hasSupportingIndex(secondaryIndexManager))
-                    throw new InvalidRequestException(relation + " restriction is only supported on properly indexed columns");
+                    throw new InvalidRequestException(String.format("LIKE restriction is only supported on properly " +
+                                                                    "indexed columns. %s is not valid.",
+                                                                    relation.toString()));
 
                 addRestriction(restriction);
             }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/db/filter/RowFilter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/filter/RowFilter.java b/src/java/org/apache/cassandra/db/filter/RowFilter.java
index c96820e..fea8ea8 100644
--- a/src/java/org/apache/cassandra/db/filter/RowFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/RowFilter.java
@@ -78,9 +78,11 @@ public abstract class RowFilter implements Iterable<RowFilter.Expression>
         return new ThriftFilter(new ArrayList<>(capacity));
     }
 
-    public void add(ColumnDefinition def, Operator op, ByteBuffer value)
+    public SimpleExpression add(ColumnDefinition def, Operator op, ByteBuffer value)
     {
-        add(new SimpleExpression(def, op, value));
+        SimpleExpression expression = new SimpleExpression(def, op, value);
+        add(expression);
+        return expression;
     }
 
     public void addMapEquality(ColumnDefinition def, ByteBuffer key, Operator op, ByteBuffer value)
@@ -593,9 +595,9 @@ public abstract class RowFilter implements Iterable<RowFilter.Expression>
     /**
      * An expression of the form 'column' 'op' 'value'.
      */
-    private static class SimpleExpression extends Expression
+    public static class SimpleExpression extends Expression
     {
-        public SimpleExpression(ColumnDefinition column, Operator operator, ByteBuffer value)
+        SimpleExpression(ColumnDefinition column, Operator operator, ByteBuffer value)
         {
             super(column, operator, value);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java b/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
index 76ab968..89129e7 100644
--- a/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
@@ -212,6 +212,9 @@ public class ColumnIndex
 
     public boolean supports(Operator op)
     {
+        if (op == Operator.LIKE)
+            return isLiteral();
+
         Op operator = Op.valueOf(op);
         return !(isTokenized && operator == Op.EQ) // EQ is only applicable to non-tokenized indexes
             && !(isLiteral() && operator == Op.RANGE) // RANGE only applicable to indexes non-literal indexes

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
index b6c786e..e357d74 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
@@ -44,6 +44,7 @@ import org.apache.cassandra.index.IndexNotAvailableException;
 import org.apache.cassandra.index.SecondaryIndexManager;
 import org.apache.cassandra.index.StubIndex;
 import org.apache.cassandra.index.internal.CustomCassandraIndex;
+import org.apache.cassandra.index.sasi.SASIIndex;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.transport.messages.ResultMessage;
@@ -685,6 +686,69 @@ public class SecondaryIndexTest extends CQLTester
                    "APPLY BATCH", map);
     }
 
+    @Test
+    public void prepareStatementsWithLIKEClauses() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, c1 text, c2 text, v1 text, v2 text, v3 int, PRIMARY KEY (a, c1, c2))");
+        createIndex(String.format("CREATE CUSTOM INDEX c1_idx on %%s(c1) USING '%s' WITH OPTIONS = {'mode' : 'PREFIX'}",
+                                  SASIIndex.class.getName()));
+        createIndex(String.format("CREATE CUSTOM INDEX c2_idx on %%s(c2) USING '%s' WITH OPTIONS = {'mode' : 'CONTAINS'}",
+                                  SASIIndex.class.getName()));
+        createIndex(String.format("CREATE CUSTOM INDEX v1_idx on %%s(v1) USING '%s' WITH OPTIONS = {'mode' : 'PREFIX'}",
+                                  SASIIndex.class.getName()));
+        createIndex(String.format("CREATE CUSTOM INDEX v2_idx on %%s(v2) USING '%s' WITH OPTIONS = {'mode' : 'CONTAINS'}",
+                                  SASIIndex.class.getName()));
+        createIndex(String.format("CREATE CUSTOM INDEX v3_idx on %%s(v3) USING '%s'", SASIIndex.class.getName()));
+
+        forcePreparedValues();
+        // prefix mode indexes support prefix/contains/matches
+        assertInvalidMessage("c1 LIKE '%<term>' abc is only supported on properly indexed columns",
+                             "SELECT * FROM %s WHERE c1 LIKE ?",
+                             "%abc");
+        assertInvalidMessage("c1 LIKE '%<term>%' abc is only supported on properly indexed columns",
+                             "SELECT * FROM %s WHERE c1 LIKE ?",
+                             "%abc%");
+        execute("SELECT * FROM %s WHERE c1 LIKE ?", "abc%");
+        execute("SELECT * FROM %s WHERE c1 LIKE ?", "abc");
+        assertInvalidMessage("v1 LIKE '%<term>' abc is only supported on properly indexed columns",
+                             "SELECT * FROM %s WHERE v1 LIKE ?",
+                             "%abc");
+        assertInvalidMessage("v1 LIKE '%<term>%' abc is only supported on properly indexed columns",
+                             "SELECT * FROM %s WHERE v1 LIKE ?",
+                             "%abc%");
+        execute("SELECT * FROM %s WHERE v1 LIKE ?", "abc%");
+        execute("SELECT * FROM %s WHERE v1 LIKE ?", "abc");
+
+        // contains mode indexes support suffix/contains/matches
+        assertInvalidMessage("c2 LIKE '<term>%' abc is only supported on properly indexed columns",
+                             "SELECT * FROM %s WHERE c2 LIKE ?",
+                             "abc%");
+        execute("SELECT * FROM %s WHERE c2 LIKE ?", "%abc");
+        execute("SELECT * FROM %s WHERE c2 LIKE ?", "%abc%");
+        execute("SELECT * FROM %s WHERE c2 LIKE ?", "abc");
+        assertInvalidMessage("v2 LIKE '<term>%' abc is only supported on properly indexed columns",
+                             "SELECT * FROM %s WHERE v2 LIKE ?",
+                             "abc%");
+        execute("SELECT * FROM %s WHERE v2 LIKE ?", "%abc");
+        execute("SELECT * FROM %s WHERE v2 LIKE ?", "%abc%");
+        execute("SELECT * FROM %s WHERE v2 LIKE ?", "abc");
+
+        // LIKE is not supported on indexes of non-literal values
+        // this is rejected before binding, so the value isn't available in the error message
+        assertInvalidMessage("LIKE restriction is only supported on properly indexed columns. v3 LIKE ? is not valid",
+                             "SELECT * FROM %s WHERE v3 LIKE ?",
+                             "%abc");
+        assertInvalidMessage("LIKE restriction is only supported on properly indexed columns. v3 LIKE ? is not valid",
+                             "SELECT * FROM %s WHERE v3 LIKE ?",
+                             "%abc%");
+        assertInvalidMessage("LIKE restriction is only supported on properly indexed columns. v3 LIKE ? is not valid",
+                             "SELECT * FROM %s WHERE v3 LIKE ?",
+                             "%abc%");
+        assertInvalidMessage("LIKE restriction is only supported on properly indexed columns. v3 LIKE ? is not valid",
+                             "SELECT * FROM %s WHERE v3 LIKE ?",
+                             "abc");
+    }
+
     public void failInsert(String insertCQL, Object...args) throws Throwable
     {
         try

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
index c5feccb..077712e 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
@@ -23,10 +23,10 @@ import java.util.UUID;
 import org.junit.Test;
 
 import junit.framework.Assert;
+import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.cql3.CQLTester;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -2353,5 +2353,4 @@ public class SelectTest extends CQLTester
                              "SELECT * FROM %s WHERE c CONTAINS KEY ? ALLOW FILTERING",
                              unset());
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
index 4b9c3f9..b3d641c 100644
--- a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
@@ -1694,7 +1694,7 @@ public class SASIIndexTest
             executeCQL(CLUSTERING_CF_NAME_1 ,"SELECT * FROM %s.%s WHERE location LIKE '%%' ALLOW FILTERING");
             Assert.fail();
         }
-        catch (SyntaxException e)
+        catch (InvalidRequestException e)
         {
             Assert.assertTrue(e.getMessage().contains("empty"));
             // expected
@@ -1705,7 +1705,7 @@ public class SASIIndexTest
             executeCQL(CLUSTERING_CF_NAME_1 ,"SELECT * FROM %s.%s WHERE location LIKE '%%%%' ALLOW FILTERING");
             Assert.fail();
         }
-        catch (SyntaxException e)
+        catch (InvalidRequestException e)
         {
             Assert.assertTrue(e.getMessage().contains("empty"));
             // expected

http://git-wip-us.apache.org/repos/asf/cassandra/blob/bdae4520/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java b/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
index 22d5c88..52cee3b 100644
--- a/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
@@ -577,7 +577,7 @@ public class OperationTest extends SchemaLoader
 
     private static class SimpleExpression extends RowFilter.Expression
     {
-        protected SimpleExpression(ColumnDefinition column, Operator operator, ByteBuffer value)
+        SimpleExpression(ColumnDefinition column, Operator operator, ByteBuffer value)
         {
             super(column, operator, value);
         }