Author: xedin Date: Tue Oct 18 22:21:17 2011 New Revision: 1185905 URL: http://svn.apache.org/viewvc?rev=1185905&view=rev Log: (CQL) SELECT query should allow CF name to be qualified by keyspace patch by Pavel Yaskevich; reviewed by Jonathan Ellis for CASSANDRA-3130
Modified: cassandra/branches/cassandra-1.0/CHANGES.txt cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/SelectStatement.java cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/ClientState.java Modified: cassandra/branches/cassandra-1.0/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1185905&r1=1185904&r2=1185905&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/CHANGES.txt (original) +++ cassandra/branches/cassandra-1.0/CHANGES.txt Tue Oct 18 22:21:17 2011 @@ -17,6 +17,7 @@ successfully acquired the compaction lock (CASSANDRA-3344) * Fix CLI `show schema` to include "compression_options" (CASSANDRA-3368) * Snapshot to include manifest under LeveledCompactionStrategy (CASSANDRA-3359) + * (CQL) SELECT query should allow CF name to be qualified by keyspace (CASSANDRA-3130) 1.0.0-final * close scrubbed sstable fd before deleting it (CASSANDRA-3318) Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g?rev=1185905&r1=1185904&r2=1185905&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/Cql.g Tue Oct 18 22:21:17 2011 @@ -147,7 +147,7 @@ selectStatement returns [SelectStatement ( s1=selectExpression { expression = s1; } | K_COUNT '(' s2=selectExpression ')' { expression = s2; isCountOp = true; } ) - K_FROM columnFamily=( IDENT | STRING_LITERAL | INTEGER ) + K_FROM (keyspace=(IDENT | STRING_LITERAL | INTEGER) '.')? columnFamily=( IDENT | STRING_LITERAL | INTEGER ) ( K_USING K_CONSISTENCY K_LEVEL { cLevel = ConsistencyLevel.valueOf($K_LEVEL.text); } )? ( K_WHERE whereClause )? ( K_LIMIT rows=INTEGER { numRecords = Integer.parseInt($rows.text); } )? @@ -155,6 +155,7 @@ selectStatement returns [SelectStatement { return new SelectStatement(expression, isCountOp, + $keyspace.text, $columnFamily.text, cLevel, $whereClause.clause, Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1185905&r1=1185904&r2=1185905&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/QueryProcessor.java Tue Oct 18 22:21:17 2011 @@ -499,7 +499,7 @@ public class QueryProcessor String keyspace = null; // Some statements won't have (or don't need) a keyspace (think USE, or CREATE). - if (StatementType.requiresKeyspace.contains(statement.type)) + if (statement.type != StatementType.SELECT && StatementType.requiresKeyspace.contains(statement.type)) keyspace = clientState.getKeyspace(); CqlResult result = new CqlResult(); @@ -510,7 +510,20 @@ public class QueryProcessor { case SELECT: SelectStatement select = (SelectStatement)statement.statement; - clientState.hasColumnFamilyAccess(select.getColumnFamily(), Permission.READ); + + final String oldKeyspace = clientState.getRawKeyspace(); + + if (select.isSetKeyspace()) + { + keyspace = CliUtils.unescapeSQLString(select.getKeyspace()); + ThriftValidation.validateTable(keyspace); + } + else if (oldKeyspace == null) + throw new InvalidRequestException("no keyspace has been specified"); + else + keyspace = oldKeyspace; + + clientState.hasColumnFamilyAccess(keyspace, select.getColumnFamily(), Permission.READ); metadata = validateColumnFamily(keyspace, select.getColumnFamily()); // need to do this in here because we need a CFMD.getKeyName() Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/SelectStatement.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/SelectStatement.java?rev=1185905&r1=1185904&r2=1185905&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/SelectStatement.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/cql/SelectStatement.java Tue Oct 18 22:21:17 2011 @@ -39,15 +39,17 @@ public class SelectStatement private final SelectExpression expression; private final boolean isCountOper; private final String columnFamily; + private final String keyspace; private final ConsistencyLevel cLevel; private final WhereClause clause; private final int numRecords; - public SelectStatement(SelectExpression expression, boolean isCountOper, String columnFamily, + public SelectStatement(SelectExpression expression, boolean isCountOper, String keyspace, String columnFamily, ConsistencyLevel cLevel, WhereClause clause, int numRecords) { this.expression = expression; this.isCountOper = isCountOper; + this.keyspace = keyspace; this.columnFamily = columnFamily; this.cLevel = cLevel; this.clause = (clause != null) ? clause : new WhereClause(); @@ -103,7 +105,17 @@ public class SelectStatement { return expression.getFinish(); } - + + public boolean isSetKeyspace() + { + return keyspace != null; + } + + public String getKeyspace() + { + return keyspace; + } + public String getColumnFamily() { return columnFamily; Modified: cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/ClientState.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/ClientState.java?rev=1185905&r1=1185904&r2=1185905&view=diff ============================================================================== --- cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/ClientState.java (original) +++ cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/service/ClientState.java Tue Oct 18 22:21:17 2011 @@ -57,7 +57,12 @@ public class ClientState { reset(); } - + + public String getRawKeyspace() + { + return keyspace; + } + public String getKeyspace() throws InvalidRequestException { if (keyspace == null) @@ -150,6 +155,11 @@ public class ClientState */ public void hasColumnFamilyAccess(String columnFamily, Permission perm) throws InvalidRequestException { + hasColumnFamilyAccess(keyspace, columnFamily, perm); + } + + public void hasColumnFamilyAccess(String keyspace, String columnFamily, Permission perm) throws InvalidRequestException + { validateLogin(); validateKeyspace();