You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2011/02/07 20:05:56 UTC
svn commit: r1068052 -
/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
Author: eevans
Date: Mon Feb 7 19:05:56 2011
New Revision: 1068052
URL: http://svn.apache.org/viewvc?rev=1068052&view=rev
Log:
column name validation
Patch by eevans for CASSANDRA-2027
Modified:
cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1068052&r1=1068051&r2=1068052&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Mon Feb 7 19:05:56 2011
@@ -41,6 +41,8 @@ import org.apache.cassandra.db.*;
import org.apache.cassandra.db.filter.QueryPath;
import org.apache.cassandra.db.migration.AddKeyspace;
import org.apache.cassandra.db.migration.Migration;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.MarshalException;
import org.apache.cassandra.dht.AbstractBounds;
import org.apache.cassandra.dht.Bounds;
import org.apache.cassandra.dht.IPartitioner;
@@ -77,11 +79,16 @@ public class QueryProcessor
for (Term column : select.getColumnNames())
columnNames.add(column.getByteBuffer());
+ validateColumns(keyspace, select.getColumnFamily(), columnNames);
commands.add(new SliceByNamesReadCommand(keyspace, key, queryPath, columnNames));
}
// ...a range (slice) of column names
else
{
+ validateColumns(keyspace,
+ select.getColumnFamily(),
+ select.getColumnStart().getByteBuffer(),
+ select.getColumnFinish().getByteBuffer());
commands.add(new SliceFromReadCommand(keyspace,
key,
queryPath,
@@ -108,7 +115,7 @@ public class QueryProcessor
}
private static List<org.apache.cassandra.db.Row> multiRangeSlice(String keyspace, SelectStatement select)
- throws TimedOutException, UnavailableException
+ throws TimedOutException, UnavailableException, InvalidRequestException
{
List<org.apache.cassandra.db.Row> rows = null;
@@ -119,6 +126,7 @@ public class QueryProcessor
// XXX: Our use of Thrift structs internally makes me Sad. :(
SlicePredicate thriftSlicePredicate = slicePredicateFromSelect(select);
+ validateSlicePredicate(keyspace, select.getColumnFamily(), thriftSlicePredicate);
try
{
@@ -147,10 +155,11 @@ public class QueryProcessor
}
private static List<org.apache.cassandra.db.Row> getIndexedSlices(String keyspace, SelectStatement select)
- throws TimedOutException, UnavailableException
+ throws TimedOutException, UnavailableException, InvalidRequestException
{
// XXX: Our use of Thrift structs internally (still) makes me Sad. :~(
SlicePredicate thriftSlicePredicate = slicePredicateFromSelect(select);
+ validateSlicePredicate(keyspace, select.getColumnFamily(), thriftSlicePredicate);
List<IndexExpression> expressions = new ArrayList<IndexExpression>();
for (Relation columnRelation : select.getColumnRelations())
@@ -198,6 +207,7 @@ public class QueryProcessor
RowMutation rm = new RowMutation(keyspace, key);
for (Map.Entry<Term, Term> column : update.getColumns().entrySet())
{
+ validateColumn(keyspace, update.getColumnFamily(), column.getKey().getByteBuffer());
rm.add(new QueryPath(update.getColumnFamily(), null, column.getKey().getByteBuffer()),
column.getValue().getByteBuffer(),
System.currentTimeMillis());
@@ -220,7 +230,7 @@ public class QueryProcessor
}
}
- private static SlicePredicate slicePredicateFromSelect(SelectStatement select)
+ private static SlicePredicate slicePredicateFromSelect(SelectStatement select) throws InvalidRequestException
{
SlicePredicate thriftSlicePredicate = new SlicePredicate();
@@ -316,6 +326,48 @@ public class QueryProcessor
}
}
+ private static void validateColumns(String keyspace, String columnFamily, Iterable<ByteBuffer> columns)
+ throws InvalidRequestException
+ {
+ AbstractType comparator = ColumnFamily.getComparatorFor(keyspace, columnFamily, null);
+ for (ByteBuffer name : columns)
+ {
+ if (name.remaining() > IColumn.MAX_NAME_LENGTH)
+ throw new InvalidRequestException();
+ if (name.remaining() == 0)
+ throw new InvalidRequestException();
+ try
+ {
+ comparator.validate(name);
+ }
+ catch (MarshalException e)
+ {
+ throw new InvalidRequestException(e.getMessage());
+ }
+ }
+ }
+
+ private static void validateColumns(String keyspace, String columnFamily, ByteBuffer start, ByteBuffer end)
+ throws InvalidRequestException
+ {
+ validateColumns(keyspace, columnFamily, Arrays.asList(start, end));
+ }
+
+ private static void validateColumn(String keyspace, String columnFamily, ByteBuffer column)
+ throws InvalidRequestException
+ {
+ validateColumns(keyspace, columnFamily, Arrays.asList(column));
+ }
+
+ private static void validateSlicePredicate(String keyspace, String columnFamily, SlicePredicate predicate)
+ throws InvalidRequestException
+ {
+ if (predicate.slice_range != null)
+ validateColumns(keyspace, columnFamily, predicate.slice_range.start, predicate.slice_range.finish);
+ else
+ validateColumns(keyspace, columnFamily, predicate.column_names);
+ }
+
public static CqlResult process(String queryString, ClientState clientState)
throws RecognitionException, UnavailableException, InvalidRequestException, TimedOutException
{
@@ -459,8 +511,11 @@ public class QueryProcessor
else // Delete specific columns
{
for (Term column : delete.getColumns())
+ {
+ validateColumn(keyspace, delete.getColumnFamily(), column.getByteBuffer());
rm.delete(new QueryPath(delete.getColumnFamily(), null, column.getByteBuffer()),
System.currentTimeMillis());
+ }
}
rowMutations.add(rm);
}