You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/03/17 03:55:27 UTC

svn commit: r1082387 - in /cassandra/branches/cassandra-0.7: src/java/org/apache/cassandra/thrift/ThriftValidation.java test/system/__init__.py test/system/test_thrift_server.py

Author: jbellis
Date: Thu Mar 17 02:55:26 2011
New Revision: 1082387

URL: http://svn.apache.org/viewvc?rev=1082387&view=rev
Log:
validate index predicates
patch by Aaron Morton; reviewed by jbellis for CASSANDRA-2328

Modified:
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java
    cassandra/branches/cassandra-0.7/test/system/__init__.py
    cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1082387&r1=1082386&r2=1082387&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java Thu Mar 17 02:55:26 2011
@@ -394,12 +394,41 @@ public class ThriftValidation
         if (index_clause.expressions.isEmpty())
             throw new InvalidRequestException("index clause list may not be empty");
         Set<ByteBuffer> indexedColumns = Table.open(keyspace).getColumnFamilyStore(columnFamily).getIndexedColumns();
+        AbstractType nameValidator =  ColumnFamily.getComparatorFor(keyspace, columnFamily, null);
+
+        boolean isIndexed = false;
         for (IndexExpression expression : index_clause.expressions)
         {
-            if (expression.op.equals(IndexOperator.EQ) && indexedColumns.contains(expression.column_name))
-                return;
+            try
+            {
+                nameValidator.validate(expression.column_name);
+            }
+            catch (MarshalException me)
+            {
+                throw new InvalidRequestException(String.format("[%s]=[%s] failed name validation (%s)",
+                                                                ByteBufferUtil.bytesToHex(expression.column_name),
+                                                                ByteBufferUtil.bytesToHex(expression.value),
+                                                                me.getMessage()));
+            }
+
+            AbstractType valueValidator = DatabaseDescriptor.getValueValidator(keyspace, columnFamily, expression.column_name);
+            try
+            {
+                valueValidator.validate(expression.value);
+            }
+            catch (MarshalException me)
+            {
+                throw new InvalidRequestException(String.format("[%s]=[%s] failed value validation (%s)",
+                                                                ByteBufferUtil.bytesToHex(expression.column_name),
+                                                                ByteBufferUtil.bytesToHex(expression.value),
+                                                                me.getMessage()));
+            }
+
+            isIndexed |= expression.op.equals(IndexOperator.EQ) && indexedColumns.contains(expression.column_name);
         }
-        throw new InvalidRequestException("No indexed columns present in index clause with operator EQ");
+
+        if (!isIndexed)
+            throw new InvalidRequestException("No indexed columns present in index clause with operator EQ");
     }
 
     public static void validateCfDef(CfDef cf_def) throws InvalidRequestException

Modified: cassandra/branches/cassandra-0.7/test/system/__init__.py
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/system/__init__.py?rev=1082387&r1=1082386&r2=1082387&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/system/__init__.py (original)
+++ cassandra/branches/cassandra-0.7/test/system/__init__.py Thu Mar 17 02:55:26 2011
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import os, sys, time, signal, httplib, errno
+import os, sys, time, signal, httplib, errno, uuid
 
 __all__ = ['root', 'thrift_client']
 
@@ -171,6 +171,8 @@ class ThriftTester(BaseTester):
             Cassandra.CfDef('Keyspace1', 'Super3', column_type='Super', subcomparator_type='LongType'), 
             Cassandra.CfDef('Keyspace1', 'Super4', column_type='Super', subcomparator_type='UTF8Type'),
             Cassandra.CfDef('Keyspace1', 'Indexed1', column_metadata=[Cassandra.ColumnDef('birthdate', 'LongType', Cassandra.IndexType.KEYS, 'birthdate')]),
+            Cassandra.CfDef('Keyspace1', 'Indexed2', comparator_type='TimeUUIDType', column_metadata=[Cassandra.ColumnDef(uuid.UUID('00000000-0000-1000-0000-000000000000').bytes, 'LongType', Cassandra.IndexType.KEYS, 'birthdate')]),
+
         ])
 
         keyspace2 = Cassandra.KsDef('Keyspace2', 'org.apache.cassandra.locator.SimpleStrategy', None, 1,

Modified: cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py?rev=1082387&r1=1082386&r2=1082387&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py (original)
+++ cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py Thu Mar 17 02:55:26 2011
@@ -17,7 +17,7 @@
 # to run a single test, run from trunk/:
 # PYTHONPATH=test nosetests --tests=system.test_thrift_server:TestMutations.test_empty_range
 
-import os, sys, time, struct
+import os, sys, time, struct, uuid
 
 from __init__ import root, ThriftTester
 from __init__ import thrift_client as client
@@ -1122,7 +1122,10 @@ class TestMutations(ThriftTester):
 
         ks1 = client.describe_keyspace("Keyspace1")
         assert ks1.replication_factor == 1
-        cf0 = ks1.cf_defs[0]
+        for cf in ks1.cf_defs:
+            if cf.name == "Standard1":
+                cf0 = cf
+                break;
         assert cf0.comparator_type == "org.apache.cassandra.db.marshal.BytesType"
 
     def test_describe(self):
@@ -1515,6 +1518,15 @@ class TestMutations(ThriftTester):
         assert result[0].key == 'key3'
         assert len(result[0].columns) == 2, result[0].columns
         
+        cp = ColumnParent('Indexed2')
+        # name must be valid (TimeUUID)
+        clause = IndexClause([IndexExpression('foo', IndexOperator.EQ, uuid.UUID('00000000-0000-1000-0000-000000000000').bytes)], '')
+        _expect_exception(lambda: client.get_indexed_slices(cp, clause, sp, ConsistencyLevel.ONE), InvalidRequestException)
+        
+        # value must be valid (TimeUUID)
+        clause = IndexClause([IndexExpression(uuid.UUID('00000000-0000-1000-0000-000000000000').bytes, IndexOperator.EQ, "foo")], '')
+        _expect_exception(lambda: client.get_indexed_slices(cp, clause, sp, ConsistencyLevel.ONE), InvalidRequestException)
+        
     def test_index_scan_expiring(self):
         """ Test that column ttled expires from KEYS index"""
         _set_keyspace('Keyspace1')