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();
         


Reply via email to