You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by xe...@apache.org on 2011/10/19 00:21:18 UTC
svn commit: r1185905 - in /cassandra/branches/cassandra-1.0: ./
src/java/org/apache/cassandra/cql/ src/java/org/apache/cassandra/service/
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();