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