http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/service/ClientState.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/ClientState.java 
b/src/java/org/apache/cassandra/service/ClientState.java
index 234ac4f..688df91 100644
--- a/src/java/org/apache/cassandra/service/ClientState.java
+++ b/src/java/org/apache/cassandra/service/ClientState.java
@@ -46,7 +46,6 @@ import org.apache.cassandra.exceptions.UnauthorizedException;
 import org.apache.cassandra.schema.SchemaKeyspace;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.CassandraVersion;
 
 /**
  * State related to a client connection.
@@ -54,7 +53,6 @@ import org.apache.cassandra.utils.CassandraVersion;
 public class ClientState
 {
     private static final Logger logger = 
LoggerFactory.getLogger(ClientState.class);
-    public static final CassandraVersion DEFAULT_CQL_VERSION = 
org.apache.cassandra.cql3.QueryProcessor.CQL_VERSION;
 
     private static final Set<IResource> READABLE_SYSTEM_RESOURCES = new 
HashSet<>();
     private static final Set<IResource> PROTECTED_AUTH_RESOURCES = new 
HashSet<>();
@@ -158,6 +156,13 @@ public class ClientState
         return new ClientState();
     }
 
+    public static ClientState forInternalCalls(String keyspace)
+    {
+        ClientState state = new ClientState();
+        state.setKeyspace(keyspace);
+        return state;
+    }
+
     /**
      * @return a ClientState object for external clients (native protocol 
users).
      */
@@ -298,7 +303,7 @@ public class ClientState
         return keyspace;
     }
 
-    public void setKeyspace(String ks) throws InvalidRequestException
+    public void setKeyspace(String ks)
     {
         // Skip keyspace validation for non-authenticated users. Apparently, 
some client libraries
         // call set_keyspace() before calling login(), and we have to handle 
that.
@@ -310,7 +315,7 @@ public class ClientState
     /**
      * Attempts to login the given user.
      */
-    public void login(AuthenticatedUser user) throws AuthenticationException
+    public void login(AuthenticatedUser user)
     {
         // Login privilege is not inherited via granted roles, so just
         // verify that the role with the credentials that were actually
@@ -321,40 +326,35 @@ public class ClientState
             throw new AuthenticationException(String.format("%s is not 
permitted to log in", user.getName()));
     }
 
-    public void hasAllKeyspacesAccess(Permission perm) throws 
UnauthorizedException
+    public void ensureAllKeyspacesPermission(Permission perm)
     {
         if (isInternal)
             return;
         validateLogin();
-        ensureHasPermission(perm, DataResource.root());
+        ensurePermission(perm, DataResource.root());
     }
 
-    public void hasKeyspaceAccess(String keyspace, Permission perm) throws 
UnauthorizedException, InvalidRequestException
+    public void ensureKeyspacePermission(String keyspace, Permission perm)
     {
-        hasAccess(keyspace, perm, DataResource.keyspace(keyspace));
+        ensurePermission(keyspace, perm, DataResource.keyspace(keyspace));
     }
 
-    public void hasColumnFamilyAccess(String keyspace, String columnFamily, 
Permission perm)
-    throws UnauthorizedException, InvalidRequestException
+    public void ensureTablePermission(String keyspace, String table, 
Permission perm)
     {
-        Schema.instance.validateTable(keyspace, columnFamily);
-        hasAccess(keyspace, perm, DataResource.table(keyspace, columnFamily));
+        ensurePermission(keyspace, perm, DataResource.table(keyspace, table));
     }
 
-    public void hasColumnFamilyAccess(TableMetadataRef tableRef, Permission 
perm)
-    throws UnauthorizedException, InvalidRequestException
+    public void ensureTablePermission(TableMetadataRef tableRef, Permission 
perm)
     {
-        hasColumnFamilyAccess(tableRef.get(), perm);
+        ensureTablePermission(tableRef.get(), perm);
     }
 
-    public void hasColumnFamilyAccess(TableMetadata table, Permission perm)
-    throws UnauthorizedException, InvalidRequestException
+    public void ensureTablePermission(TableMetadata table, Permission perm)
     {
-        hasAccess(table.keyspace, perm, table.resource);
+        ensurePermission(table.keyspace, perm, table.resource);
     }
 
-    private void hasAccess(String keyspace, Permission perm, DataResource 
resource)
-    throws UnauthorizedException, InvalidRequestException
+    private void ensurePermission(String keyspace, Permission perm, 
DataResource resource)
     {
         validateKeyspace(keyspace);
 
@@ -371,11 +371,10 @@ public class ClientState
         if (PROTECTED_AUTH_RESOURCES.contains(resource))
             if ((perm == Permission.CREATE) || (perm == Permission.ALTER) || 
(perm == Permission.DROP))
                 throw new UnauthorizedException(String.format("%s schema is 
protected", resource));
-
-        ensureHasPermission(perm, resource);
+        ensurePermission(perm, resource);
     }
 
-    public void ensureHasPermission(Permission perm, IResource resource) 
throws UnauthorizedException
+    public void ensurePermission(Permission perm, IResource resource)
     {
         if (!DatabaseDescriptor.getAuthorizer().requireAuthorization())
             return;
@@ -385,12 +384,12 @@ public class ClientState
             if 
(((FunctionResource)resource).getKeyspace().equals(SchemaConstants.SYSTEM_KEYSPACE_NAME))
                 return;
 
-        checkPermissionOnResourceChain(perm, resource);
+        ensurePermissionOnResourceChain(perm, resource);
     }
 
-    // Convenience method called from checkAccess method of CQLStatement
+    // Convenience method called from authorize method of CQLStatement
     // Also avoids needlessly creating lots of FunctionResource objects
-    public void ensureHasPermission(Permission permission, Function function)
+    public void ensurePermission(Permission permission, Function function)
     {
         // Save creating a FunctionResource is we don't need to
         if (!DatabaseDescriptor.getAuthorizer().requireAuthorization())
@@ -400,12 +399,12 @@ public class ClientState
         if (function.isNative())
             return;
 
-        checkPermissionOnResourceChain(permission, 
FunctionResource.function(function.name().keyspace,
-                                                                             
function.name().name,
-                                                                             
function.argTypes()));
+        ensurePermissionOnResourceChain(permission, 
FunctionResource.function(function.name().keyspace,
+                                                                              
function.name().name,
+                                                                              
function.argTypes()));
     }
 
-    private void checkPermissionOnResourceChain(Permission perm, IResource 
resource)
+    private void ensurePermissionOnResourceChain(Permission perm, IResource 
resource)
     {
         for (IResource r : Resources.chain(resource))
             if (authorize(r).contains(perm))
@@ -417,7 +416,7 @@ public class ClientState
                                                       resource));
     }
 
-    private void preventSystemKSSchemaModification(String keyspace, 
DataResource resource, Permission perm) throws UnauthorizedException
+    private void preventSystemKSSchemaModification(String keyspace, 
DataResource resource, Permission perm)
     {
         // we only care about DDL statements
         if (perm != Permission.ALTER && perm != Permission.DROP && perm != 
Permission.CREATE)
@@ -438,7 +437,7 @@ public class ClientState
         }
     }
 
-    public void validateLogin() throws UnauthorizedException
+    public void validateLogin()
     {
         if (user == null)
         {
@@ -450,20 +449,20 @@ public class ClientState
         }
     }
 
-    public void ensureNotAnonymous() throws UnauthorizedException
+    public void ensureNotAnonymous()
     {
         validateLogin();
         if (user.isAnonymous())
             throw new UnauthorizedException("You have to be logged in and not 
anonymous to perform this request");
     }
 
-    public void ensureIsSuper(String message) throws UnauthorizedException
+    public void ensureIsSuperuser(String message)
     {
         if (DatabaseDescriptor.getAuthenticator().requireAuthentication() && 
(user == null || !user.isSuper()))
             throw new UnauthorizedException(message);
     }
 
-    private static void validateKeyspace(String keyspace) throws 
InvalidRequestException
+    private static void validateKeyspace(String keyspace)
     {
         if (keyspace == null)
             throw new InvalidRequestException("You have not set a keyspace for 
this session");
@@ -474,11 +473,6 @@ public class ClientState
         return user;
     }
 
-    public static CassandraVersion[] getCQLSupportedVersion()
-    {
-        return new CassandraVersion[]{ QueryProcessor.CQL_VERSION };
-    }
-
     private Set<Permission> authorize(IResource resource)
     {
         return user.getPermissions(resource);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageService.java 
b/src/java/org/apache/cassandra/service/StorageService.java
index 96fd63f..cc02e17 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -65,6 +65,7 @@ import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.concurrent.StageManager;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.compaction.CompactionManager;
@@ -631,8 +632,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
     public synchronized void initServer(int delay) throws 
ConfigurationException
     {
         logger.info("Cassandra version: {}", 
FBUtilities.getReleaseVersionString());
-        logger.info("CQL supported versions: {} (default: {})",
-                StringUtils.join(ClientState.getCQLSupportedVersion(), ", "), 
ClientState.DEFAULT_CQL_VERSION);
+        logger.info("CQL version: {}", QueryProcessor.CQL_VERSION);
         logger.info("Native protocol supported versions: {} (default: {})",
                     StringUtils.join(ProtocolVersion.supportedVersions(), ", 
"), ProtocolVersion.CURRENT);
 
@@ -1590,7 +1590,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
         for (String keyspace : Schema.instance.getUserKeyspaces())
         {
             for (ViewMetadata view: 
Schema.instance.getKeyspaceMetadata(keyspace).views)
-                SystemKeyspace.finishViewBuildStatus(view.keyspace, view.name);
+                SystemKeyspace.finishViewBuildStatus(view.keyspace(), 
view.name());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java 
b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
index 1116575..b88bf0a 100644
--- a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
+++ b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
@@ -93,7 +93,7 @@ public class SSTableOfflineRelevel
         Schema.instance.loadFromDisk(false);
 
         if (Schema.instance.getTableMetadataRef(keyspace, columnfamily) == 
null)
-            throw new IllegalArgumentException(String.format("Unknown 
keyspace/columnFamily %s.%s",
+            throw new IllegalArgumentException(String.format("Unknown 
keyspace/table %s.%s",
                     keyspace,
                     columnfamily));
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java 
b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
index c29760e..6477d8c 100644
--- a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
+++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
@@ -22,7 +22,7 @@ import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.cassandra.cql3.statements.CreateTableStatement;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.rows.Row;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/Event.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/Event.java 
b/src/java/org/apache/cassandra/transport/Event.java
index 77edf8a..254e1e1 100644
--- a/src/java/org/apache/cassandra/transport/Event.java
+++ b/src/java/org/apache/cassandra/transport/Event.java
@@ -23,7 +23,10 @@ import java.util.Iterator;
 import java.util.List;
 
 import com.google.common.base.Objects;
+
 import io.netty.buffer.ByteBuf;
+import org.apache.cassandra.cql3.functions.UDAggregate;
+import org.apache.cassandra.cql3.functions.UDFunction;
 import org.apache.cassandra.locator.InetAddressAndPort;
 
 public abstract class Event
@@ -268,6 +271,16 @@ public abstract class Event
             this(change, Target.KEYSPACE, keyspace, null);
         }
 
+        public static SchemaChange forFunction(Change change, UDFunction 
function)
+        {
+            return new SchemaChange(change, Target.FUNCTION, 
function.name().keyspace, function.name().name, function.argumentsList());
+        }
+
+        public static SchemaChange forAggregate(Change change, UDAggregate 
aggregate)
+        {
+            return new SchemaChange(change, Target.AGGREGATE, 
aggregate.name().keyspace, aggregate.name().name, aggregate.argumentsList());
+        }
+
         // Assumes the type has already been deserialized
         public static SchemaChange deserializeEvent(ByteBuf cb, 
ProtocolVersion version)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java 
b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
index 5ffadac..29f92f7 100644
--- a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
@@ -29,12 +29,13 @@ import org.apache.cassandra.audit.AuditLogEntry;
 import org.apache.cassandra.audit.AuditLogEntryType;
 import org.apache.cassandra.cql3.Attributes;
 import org.apache.cassandra.cql3.BatchQueryOptions;
+import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryHandler;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.VariableSpecifications;
 import org.apache.cassandra.cql3.statements.BatchStatement;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.PreparedQueryNotFoundException;
 import org.apache.cassandra.service.ClientState;
@@ -182,27 +183,28 @@ public class BatchMessage extends Message.Request
             }
 
             QueryHandler handler = ClientState.getCQLQueryHandler();
-            List<ParsedStatement.Prepared> prepared = new 
ArrayList<>(queryOrIdList.size());
+            List<QueryHandler.Prepared> prepared = new 
ArrayList<>(queryOrIdList.size());
             for (int i = 0; i < queryOrIdList.size(); i++)
             {
                 Object query = queryOrIdList.get(i);
-                ParsedStatement.Prepared p;
+                CQLStatement statement;
+                QueryHandler.Prepared p;
                 if (query instanceof String)
                 {
-                    p = QueryProcessor.parseStatement((String)query,
-                                                      
state.getClientState().cloneWithKeyspaceIfSet(options.getKeyspace()));
+                    statement = QueryProcessor.parseStatement((String)query, 
state.getClientState().cloneWithKeyspaceIfSet(options.getKeyspace()));
+                    p = new QueryHandler.Prepared(statement, (String) query);
                 }
                 else
                 {
                     p = handler.getPrepared((MD5Digest)query);
-                    if (p == null)
+                    if (null == p)
                         throw new 
PreparedQueryNotFoundException((MD5Digest)query);
                 }
 
                 List<ByteBuffer> queryValues = values.get(i);
-                if (queryValues.size() != p.statement.getBoundTerms())
+                if (queryValues.size() != 
p.statement.getBindVariables().size())
                     throw new InvalidRequestException(String.format("There 
were %d markers(?) in CQL but %d bound variables",
-                                                                    
p.statement.getBoundTerms(),
+                                                                    
p.statement.getBindVariables().size(),
                                                                     
queryValues.size()));
 
                 prepared.add(p);
@@ -212,18 +214,18 @@ public class BatchMessage extends Message.Request
             List<ModificationStatement> statements = new 
ArrayList<>(prepared.size());
             for (int i = 0; i < prepared.size(); i++)
             {
-                ParsedStatement.Prepared p = prepared.get(i);
-                batchOptions.prepareStatement(i, p.boundNames);
+                CQLStatement statement = prepared.get(i).statement;
+                batchOptions.prepareStatement(i, statement.getBindVariables());
 
-                if (!(p.statement instanceof ModificationStatement))
+                if (!(statement instanceof ModificationStatement))
                     throw new InvalidRequestException("Invalid statement in 
batch: only UPDATE, INSERT and DELETE statements are allowed.");
 
-                statements.add((ModificationStatement)p.statement);
+                statements.add((ModificationStatement) statement);
             }
 
             // Note: It's ok at this point to pass a bogus value for the 
number of bound terms in the BatchState ctor
             // (and no value would be really correct, so we prefer passing a 
clearly wrong one).
-            BatchStatement batch = new BatchStatement(-1, batchType, 
statements, Attributes.none());
+            BatchStatement batch = new BatchStatement(batchType, 
VariableSpecifications.empty(), statements, Attributes.none());
 
             long fqlTime = isLoggingEnabled ? System.currentTimeMillis() : 0;
             Message.Response response = handler.processBatch(batch, state, 
batchOptions, getCustomPayload(), queryStartNanoTime);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java 
b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
index cd7f300..6c0b77a 100644
--- a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
@@ -28,8 +28,8 @@ import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryHandler;
 import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.ResultSet;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.exceptions.PreparedQueryNotFoundException;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
@@ -113,12 +113,12 @@ public class ExecuteMessage extends Message.Request
         try
         {
             QueryHandler handler = ClientState.getCQLQueryHandler();
-            ParsedStatement.Prepared prepared = 
handler.getPrepared(statementId);
+            QueryProcessor.Prepared prepared = 
handler.getPrepared(statementId);
             if (prepared == null)
                 throw new PreparedQueryNotFoundException(statementId);
 
-            options.prepare(prepared.boundNames);
             CQLStatement statement = prepared.statement;
+            options.prepare(statement.getBindVariables());
 
             if (options.getPageSize() == 0)
                 throw new ProtocolException("The page size cannot be 0");
@@ -143,9 +143,9 @@ public class ExecuteMessage extends Message.Request
                     builder.put("serial_consistency_level", 
options.getSerialConsistency().name());
                 builder.put("query", prepared.rawCQLStatement);
 
-                for(int i=0;i<prepared.boundNames.size();i++)
+                for(int i = 0; i < statement.getBindVariables().size(); i++)
                 {
-                    ColumnSpecification cs = prepared.boundNames.get(i);
+                    ColumnSpecification cs = 
statement.getBindVariables().get(i);
                     String boundName = cs.name.toString();
                     String boundValue = 
cs.type.asCQL3Type().toCQLLiteral(options.getValues().get(i), 
options.getProtocolVersion());
                     if ( boundValue.length() > 1000 )
@@ -163,7 +163,7 @@ public class ExecuteMessage extends Message.Request
 
             // Some custom QueryHandlers are interested by the bound names. We 
provide them this information
             // by wrapping the QueryOptions.
-            QueryOptions queryOptions = 
QueryOptions.addColumnSpecifications(options, prepared.boundNames);
+            QueryOptions queryOptions = 
QueryOptions.addColumnSpecifications(options, 
prepared.statement.getBindVariables());
 
             long fqlTime = isLoggingEnabled ? System.currentTimeMillis() : 0;
             Message.Response response = handler.processPrepared(statement, 
state, queryOptions, getCustomPayload(), queryStartNanoTime);
@@ -230,7 +230,7 @@ public class ExecuteMessage extends Message.Request
                 }
                 else
                 {
-                    ParsedStatement.Prepared prepared = 
ClientState.getCQLQueryHandler().getPrepared(statementId);
+                    QueryHandler.Prepared prepared = 
ClientState.getCQLQueryHandler().getPrepared(statementId);
                     if (prepared != null)
                     {
                         AuditLogEntry auditLogEntry = new 
AuditLogEntry.Builder(state.getClientState())

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java 
b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
index e5e5248..4ab6e0b 100644
--- a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
@@ -24,8 +24,8 @@ import com.google.common.collect.ImmutableMap;
 import io.netty.buffer.ByteBuf;
 import org.apache.cassandra.audit.AuditLogEntry;
 import org.apache.cassandra.audit.AuditLogEntryType;
+import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.tracing.Tracing;
@@ -119,12 +119,12 @@ public class PrepareMessage extends Message.Request
                                                                                
  getCustomPayload());
             if (auditLogEnabled)
             {
-                ParsedStatement.Prepared parsedStmt = 
QueryProcessor.parseStatement(query, state.getClientState());
+                CQLStatement parsedStmt = QueryProcessor.parseStatement(query, 
state.getClientState());
                 AuditLogEntry auditLogEntry = new 
AuditLogEntry.Builder(state.getClientState())
                                               .setOperation(query)
                                               
.setType(AuditLogEntryType.PREPARE_STATEMENT)
-                                              .setScope(parsedStmt.statement)
-                                              
.setKeyspace(parsedStmt.statement)
+                                              .setScope(parsedStmt)
+                                              .setKeyspace(parsedStmt)
                                               .build();
                 auditLogManager.log(auditLogEntry);
             }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java 
b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
index 9df9205..4f42b85 100644
--- a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
@@ -24,9 +24,9 @@ import com.google.common.collect.ImmutableMap;
 import io.netty.buffer.ByteBuf;
 import org.apache.cassandra.audit.AuditLogEntry;
 import org.apache.cassandra.audit.AuditLogManager;
+import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.service.ClientState;
@@ -122,13 +122,13 @@ public class QueryMessage extends Message.Request
 
             if (isLoggingEnabled)
             {
-                ParsedStatement.Prepared parsedStatement = 
QueryProcessor.parseStatement(query, state.getClientState());
+                CQLStatement parsedStatement = 
QueryProcessor.parseStatement(query, state.getClientState());
                 AuditLogEntry auditEntry = new 
AuditLogEntry.Builder(state.getClientState())
-                                           
.setType(parsedStatement.statement.getAuditLogContext().auditLogEntryType)
+                                           
.setType(parsedStatement.getAuditLogContext().auditLogEntryType)
                                            .setOperation(query)
                                            .setTimestamp(fqlTime)
-                                           .setScope(parsedStatement.statement)
-                                           .setKeyspace(state, 
parsedStatement.statement)
+                                           .setScope(parsedStatement)
+                                           .setKeyspace(state, parsedStatement)
                                            .setOptions(options)
                                            .build();
                 AuditLogManager.getInstance().log(auditEntry);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/ResultMessage.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java 
b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java
index b989a7d..4485849 100644
--- a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java
@@ -22,10 +22,7 @@ import com.google.common.annotations.VisibleForTesting;
 
 import io.netty.buffer.ByteBuf;
 
-import org.apache.cassandra.cql3.ColumnSpecification;
-import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.ResultSet;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.transport.*;
 import org.apache.cassandra.utils.MD5Digest;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java 
b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
index 754183f..295003f 100644
--- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
+++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
@@ -252,11 +252,11 @@ public class TriggerExecutor
         }
     }
 
-    public synchronized ITrigger loadTriggerInstance(String triggerName) 
throws Exception
+    public synchronized ITrigger loadTriggerInstance(String triggerClass) 
throws Exception
     {
         // double check.
-        if (cachedTriggers.get(triggerName) != null)
-            return cachedTriggers.get(triggerName);
-        return (ITrigger) 
customClassLoader.loadClass(triggerName).getConstructor().newInstance();
+        if (cachedTriggers.get(triggerClass) != null)
+            return cachedTriggers.get(triggerClass);
+        return (ITrigger) 
customClassLoader.loadClass(triggerClass).getConstructor().newInstance();
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
----------------------------------------------------------------------
diff --git 
a/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java 
b/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
index 45ad258..4a0e646 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
@@ -25,7 +25,7 @@ import java.util.Collection;
 import java.util.concurrent.*;
 
 import org.apache.cassandra.UpdateBuilder;
-import org.apache.cassandra.cql3.statements.CreateTableStatement;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.Schema;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/SchemaLoader.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java 
b/test/unit/org/apache/cassandra/SchemaLoader.java
index eddaa1e..62b9670 100644
--- a/test/unit/org/apache/cassandra/SchemaLoader.java
+++ b/test/unit/org/apache/cassandra/SchemaLoader.java
@@ -27,29 +27,29 @@ import org.apache.cassandra.auth.IAuthenticator;
 import org.apache.cassandra.auth.IAuthorizer;
 import org.apache.cassandra.auth.INetworkAuthorizer;
 import org.apache.cassandra.auth.IRoleManager;
-import org.apache.cassandra.cql3.statements.CreateTableStatement;
-import org.apache.cassandra.dht.Murmur3Partitioner;
-import org.apache.cassandra.index.sasi.SASIIndex;
-import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder;
-import org.junit.After;
-import org.junit.BeforeClass;
-
 import org.apache.cassandra.config.*;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.ColumnIdentifier;
-import org.apache.cassandra.cql3.statements.IndexTarget;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.cql3.statements.schema.IndexTarget;
 import org.apache.cassandra.db.RowUpdateBuilder;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.marshal.*;
+import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.index.StubIndex;
+import org.apache.cassandra.index.sasi.SASIIndex;
+import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.*;
 import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
+import org.junit.After;
+import org.junit.BeforeClass;
+
 public class SchemaLoader
 {
     @BeforeClass

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java 
b/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
index f0eed8c..bf50094 100644
--- a/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
+++ b/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
@@ -59,7 +59,7 @@ public class CassandraNetworkAuthorizerTest
     {
         ResultMessage.Rows select(SelectStatement statement, QueryOptions 
options)
         {
-            return statement.executeInternal(QueryState.forInternalCalls(), 
options);
+            return statement.executeLocally(QueryState.forInternalCalls(), 
options);
         }
 
         UntypedResultSet process(String query) throws RequestExecutionException
@@ -70,7 +70,7 @@ public class CassandraNetworkAuthorizerTest
         @Override
         void processBatch(BatchStatement statement)
         {
-            statement.executeInternal(QueryState.forInternalCalls(), 
QueryOptions.DEFAULT);
+            statement.executeLocally(QueryState.forInternalCalls(), 
QueryOptions.DEFAULT);
         }
     }
 
@@ -78,7 +78,7 @@ public class CassandraNetworkAuthorizerTest
     {
         ResultMessage.Rows select(SelectStatement statement, QueryOptions 
options)
         {
-            return statement.executeInternal(QueryState.forInternalCalls(), 
options);
+            return statement.executeLocally(QueryState.forInternalCalls(), 
options);
         }
 
         UntypedResultSet process(String query, ConsistencyLevel 
consistencyLevel) throws RequestValidationException, RequestExecutionException
@@ -91,7 +91,7 @@ public class CassandraNetworkAuthorizerTest
     {
         ResultMessage.Rows select(SelectStatement statement, QueryOptions 
options)
         {
-            return statement.executeInternal(QueryState.forInternalCalls(), 
options);
+            return statement.executeLocally(QueryState.forInternalCalls(), 
options);
         }
 
         void process(String query)
@@ -170,7 +170,7 @@ public class CassandraNetworkAuthorizerTest
 
     private static void auth(String query, Object... args)
     {
-        CQLStatement statement = 
QueryProcessor.parseStatement(String.format(query, args)).prepare().statement;
+        CQLStatement statement = 
QueryProcessor.parseStatement(String.format(query, 
args)).prepare(ClientState.forInternalCalls());
         assert statement instanceof CreateRoleStatement
                || statement instanceof AlterRoleStatement
                || statement instanceof DropRoleStatement;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/CQLTester.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java 
b/test/unit/org/apache/cassandra/cql3/CQLTester.java
index 662e804..4a1a365 100644
--- a/test/unit/org/apache/cassandra/cql3/CQLTester.java
+++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java
@@ -52,7 +52,6 @@ import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.schema.*;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.functions.FunctionName;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.marshal.*;
@@ -62,6 +61,8 @@ import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.AbstractEndpointSnitch;
+import org.apache.cassandra.schema.IndexMetadata;
+import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.serializers.TypeSerializer;
 import org.apache.cassandra.service.ClientState;
@@ -713,7 +714,13 @@ public abstract class CQLTester
             throw new IllegalArgumentException("Table name should be 
specified: " + formattedQuery);
 
         String column = matcher.group(9);
-        return Indexes.getAvailableIndexName(keyspace, table, 
Strings.isNullOrEmpty(column) ? null : column);
+
+        String baseName = Strings.isNullOrEmpty(column)
+                        ? IndexMetadata.generateDefaultIndexName(table)
+                        : IndexMetadata.generateDefaultIndexName(table, new 
ColumnIdentifier(column, true));
+
+        KeyspaceMetadata ks = Schema.instance.getKeyspaceMetadata(keyspace);
+        return ks.findAvailableIndexName(baseName);
     }
 
     /**
@@ -809,16 +816,15 @@ public abstract class CQLTester
     {
         try
         {
-            ClientState state = ClientState.forInternalCalls();
-            state.setKeyspace(SchemaConstants.SYSTEM_KEYSPACE_NAME);
+            ClientState state = 
ClientState.forInternalCalls(SchemaConstants.SYSTEM_KEYSPACE_NAME);
             QueryState queryState = new QueryState(state);
 
-            ParsedStatement.Prepared prepared = 
QueryProcessor.parseStatement(query, queryState.getClientState());
-            prepared.statement.validate(state);
+            CQLStatement statement = QueryProcessor.parseStatement(query, 
queryState.getClientState());
+            statement.validate(state);
 
             QueryOptions options = 
QueryOptions.forInternalCalls(Collections.<ByteBuffer>emptyList());
 
-            lastSchemaChangeResult = 
prepared.statement.executeInternal(queryState, options);
+            lastSchemaChangeResult = statement.executeLocally(queryState, 
options);
         }
         catch (Exception e)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java 
b/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
index 2b5a14a..eca6c20 100644
--- a/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
@@ -22,11 +22,10 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.junit.Assert;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.UTF8Type;
@@ -99,7 +98,7 @@ public class PstmtPersistenceTest extends CQLTester
         for (UntypedResultSet.Row row : 
QueryProcessor.executeOnceInternal(queryAll))
         {
             MD5Digest digest = 
MD5Digest.wrap(ByteBufferUtil.getArray(row.getBytes("prepared_id")));
-            ParsedStatement.Prepared prepared = 
QueryProcessor.instance.getPrepared(digest);
+            QueryProcessor.Prepared prepared = 
QueryProcessor.instance.getPrepared(digest);
             Assert.assertNotNull(prepared);
         }
 
@@ -128,8 +127,8 @@ public class PstmtPersistenceTest extends CQLTester
 
     private static void validatePstmt(QueryHandler handler, MD5Digest stmtId, 
QueryOptions options)
     {
-        ParsedStatement.Prepared prepared = handler.getPrepared(stmtId);
-        assertNotNull(prepared);
+        QueryProcessor.Prepared prepared = handler.getPrepared(stmtId);
+        Assert.assertNotNull(prepared);
         handler.processPrepared(prepared.statement, 
QueryState.forInternalCalls(), options, Collections.emptyMap(), 
System.nanoTime());
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java 
b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
index f6defa8..32319a9 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
@@ -144,7 +144,7 @@ public class ViewComplexTest extends CQLTester
         executeNet(protocolVersion, "USE " + keyspace());
         createTable("CREATE TABLE %s (k int, c int, a int, b int, e int, f 
int, PRIMARY KEY (k, c))");
         createView("mv",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE 
k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+                   "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s 
WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
         Keyspace ks = Keyspace.open(keyspace());
         ks.getColumnFamilyStore("mv").disableAutoCompaction();
 
@@ -401,7 +401,7 @@ public class ViewComplexTest extends CQLTester
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = 
?", 0, 0), row(0, 0, null, 1));
         assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = 
?", 0, 0), row(0, 0));
 
-        assertInvalidMessage(String.format("Cannot drop column v2 on base 
table %s with materialized views.", baseTable), "ALTER TABLE %s DROP v2");
+        assertInvalidMessage(String.format("Cannot drop column v2 on base 
table %s with materialized views", baseTable), "ALTER TABLE %s DROP v2");
         // // drop unselected base column, unselected metadata should be 
removed, thus view row is dead
         // updateView("ALTER TABLE %s DROP v2");
         // assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p 
= ?", 0, 0));
@@ -428,7 +428,7 @@ public class ViewComplexTest extends CQLTester
         executeNet(protocolVersion, "USE " + keyspace());
         String baseTable = createTable("CREATE TABLE %s (k int, c int, a int, 
b int, l list<int>, s set<int>, m map<int,int>, PRIMARY KEY (k, c))");
         createView("mv",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE 
k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)");
+                   "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s 
WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)");
         Keyspace ks = Keyspace.open(keyspace());
         ks.getColumnFamilyStore("mv").disableAutoCompaction();
 
@@ -462,7 +462,7 @@ public class ViewComplexTest extends CQLTester
         assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s"), row(1, 1, 
null, null));
         assertRowsIgnoringOrder(execute("SELECT * from mv"), row(1, 1, null, 
null));
 
-        assertInvalidMessage(String.format("Cannot drop column m on base table 
%s with materialized views.", baseTable), "ALTER TABLE %s DROP m");
+        assertInvalidMessage(String.format("Cannot drop column m on base table 
%s with materialized views", baseTable), "ALTER TABLE %s DROP m");
         // executeNet(protocolVersion, "ALTER TABLE %s DROP m");
         // ks.getColumnFamilyStore("mv").forceMajorCompaction();
         // assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s WHERE k = 1 
AND c = 1"));
@@ -931,7 +931,7 @@ public class ViewComplexTest extends CQLTester
         assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 2));
         assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, 1, 2));
 
-        assertInvalidMessage(String.format("Cannot drop column a on base table 
%s with materialized views.", baseTable), "ALTER TABLE %s DROP a");
+        assertInvalidMessage(String.format("Cannot drop column a on base table 
%s with materialized views", baseTable), "ALTER TABLE %s DROP a");
     }
 
     @Test
@@ -1273,7 +1273,7 @@ public class ViewComplexTest extends CQLTester
                                                   // all selected
                                                   "CREATE MATERIALIZED VIEW %s 
AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
                                                   // unselected e,f
-                                                  "CREATE MATERIALIZED VIEW %s 
AS SELECT c,d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
+                                                  "CREATE MATERIALIZED VIEW %s 
AS SELECT a,b,c,d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY 
(a,b)",
                                                   // no selected
                                                   "CREATE MATERIALIZED VIEW %s 
AS SELECT a,b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
                                                   // all selected, re-order 
keys

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java 
b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
index b7d3647..65d66b5 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
@@ -1848,7 +1848,7 @@ public class ViewFilteringTest extends CQLTester
         executeNet(protocolVersion, "USE " + keyspace());
 
         try {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * 
FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL AND d = 1 PRIMARY KEY (a, b, 
c)");
+            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * 
FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d = 1 
PRIMARY KEY (a, b, c)");
             dropView("mv_test");
         } catch(Exception e) {
             throw new RuntimeException("MV creation with non primary column 
restrictions failed.", e);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java 
b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
index 63ac3e3..093f122 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
@@ -672,7 +672,7 @@ public class ViewSchemaTest extends CQLTester
         executeNet(protocolVersion, "USE " + keyspace());
 
         createView(keyspace() + ".mv1",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b 
IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
+                   "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a 
IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
 
         try
         {
@@ -681,7 +681,7 @@ public class ViewSchemaTest extends CQLTester
         }
         catch (InvalidQueryException e)
         {
-            Assert.assertEquals("Cannot use DROP TABLE on Materialized View", 
e.getMessage());
+            Assert.assertEquals("Cannot use DROP TABLE on a materialized view. 
Please use DROP MATERIALIZED VIEW instead.", e.getMessage());
         }
     }
 
@@ -694,7 +694,7 @@ public class ViewSchemaTest extends CQLTester
 
         executeNet(protocolVersion, "USE " + keyspace());
 
-        assertInvalidMessage("Non-primary key columns cannot be restricted in 
the SELECT statement used for materialized view creation",
+        assertInvalidMessage("Non-primary key columns can only be restricted 
with 'IS NOT NULL'",
                              "CREATE MATERIALIZED VIEW " + keyspace() + ".mv 
AS SELECT * FROM %s "
                                      + "WHERE b IS NOT NULL AND c IS NOT NULL 
AND a IS NOT NULL "
                                      + "AND d = 1 PRIMARY KEY (c, b, a)");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/ViewTest.java 
b/test/unit/org/apache/cassandra/cql3/ViewTest.java
index 40d75c4..aae7d83 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewTest.java
@@ -93,8 +93,8 @@ public class ViewTest extends CQLTester
     @Test
     public void testNonExistingOnes() throws Throwable
     {
-        assertInvalidMessage("Cannot drop non existing materialized view", 
"DROP MATERIALIZED VIEW " + KEYSPACE + ".view_does_not_exist");
-        assertInvalidMessage("Cannot drop non existing materialized view", 
"DROP MATERIALIZED VIEW keyspace_does_not_exist.view_does_not_exist");
+        assertInvalidMessage(String.format("Materialized view 
'%s.view_does_not_exist' doesn't exist", KEYSPACE), "DROP MATERIALIZED VIEW " + 
KEYSPACE + ".view_does_not_exist");
+        assertInvalidMessage("Materialized view 
'keyspace_does_not_exist.view_does_not_exist' doesn't exist", "DROP 
MATERIALIZED VIEW keyspace_does_not_exist.view_does_not_exist");
 
         execute("DROP MATERIALIZED VIEW IF EXISTS " + KEYSPACE + 
".view_does_not_exist");
         execute("DROP MATERIALIZED VIEW IF EXISTS 
keyspace_does_not_exist.view_does_not_exist");
@@ -156,7 +156,7 @@ public class ViewTest extends CQLTester
         execute("USE " + keyspace());
         executeNet(protocolVersion, "USE " + keyspace());
 
-        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM 
%%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY 
(val, k1, c1)");
+        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1, c1, 
val FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL 
PRIMARY KEY (val, k1, c1)");
 
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)");
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)");
@@ -178,7 +178,7 @@ public class ViewTest extends CQLTester
         execute("USE " + keyspace());
         executeNet(protocolVersion, "USE " + keyspace());
 
-        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM 
%%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY 
(val, k1, c1)");
+        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT val, k1, 
c1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY 
KEY (val, k1, c1)");
 
     }
 
@@ -190,7 +190,7 @@ public class ViewTest extends CQLTester
         execute("USE " + keyspace());
         executeNet(protocolVersion, "USE " + keyspace());
 
-        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM 
%%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY 
(val, k1, c1)");
+        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1, c1, 
val FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL 
PRIMARY KEY (val, k1, c1)");
 
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)");
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)");
@@ -252,8 +252,15 @@ public class ViewTest extends CQLTester
         {
         }
 
-        // Can omit "k IS NOT NULL" because we have a sinlge partition key
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM 
%%s WHERE bigintval IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY 
(bigintval, k, asciival)");
+        // Must still include both even when the partition key is composite
+        try
+        {
+            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * 
FROM %%s WHERE bigintval IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY 
(bigintval, k, asciival)");
+            Assert.fail("Should fail if compound primary is not completely 
filtered as NOT NULL");
+        }
+        catch (Exception e)
+        {
+        }
     }
 
     @Test
@@ -418,7 +425,7 @@ public class ViewTest extends CQLTester
         }
         catch (InvalidQueryException e)
         {
-            Assert.assertEquals("Cannot use Duration column 'result' in 
PRIMARY KEY of materialized view", e.getMessage());
+            Assert.assertEquals("duration type is not supported for PRIMARY 
KEY column 'result'", e.getMessage());
         }
     }
 
@@ -760,7 +767,7 @@ public class ViewTest extends CQLTester
             {
                 String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM 
%%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
                                + (def.name.toString().equals("asciival") ? "" 
: "AND asciival IS NOT NULL ") + "PRIMARY KEY ((" + def.name + ", k), 
nonexistentcolumn)";
-                createView("mv3_" + def.name, query);
+                createView("mv4_" + def.name, query);
                 Assert.fail("Should fail with unknown base column");
             }
             catch (InvalidQueryException e)
@@ -1023,10 +1030,10 @@ public class ViewTest extends CQLTester
 
         executeNet(protocolVersion, "USE " + keyspace());
 
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c) WITH CLUSTERING 
ORDER BY (b DESC)");
-        createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING 
ORDER BY (c ASC)");
-        createView("mv3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
-        createView("mv4", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING 
ORDER BY (c DESC)");
+        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c) 
WITH CLUSTERING ORDER BY (b DESC, c ASC)");
+        createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) 
WITH CLUSTERING ORDER BY (c ASC, b ASC)");
+        createView("mv3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
+        createView("mv4", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) 
WITH CLUSTERING ORDER BY (c DESC, b ASC)");
 
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 
1);
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 2, 
2);
@@ -1062,7 +1069,7 @@ public class ViewTest extends CQLTester
 
         executeNet(protocolVersion, "USE " + keyspace());
 
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s 
WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1);
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 2);
@@ -1094,7 +1101,7 @@ public class ViewTest extends CQLTester
         executeNet(protocolVersion, "USE " + keyspace());
 
         // Cannot use SELECT *, as those are always handled by the includeAll 
shortcut in View.updateAffectsView
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s 
WHERE b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s 
WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1);
 
@@ -1183,7 +1190,7 @@ public class ViewTest extends CQLTester
                     "PRIMARY KEY (a))");
 
         executeNet(protocolVersion, "USE " + keyspace());
-        createView("mvmap", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM 
%%s WHERE b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("mvmap", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM 
%%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 0, 0);
         ResultSet mvRows = executeNet(protocolVersion, "SELECT a, b FROM mvmap 
WHERE b = ?", 0);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java 
b/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
index 30fbb0d..d6de5ff 100644
--- 
a/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java
@@ -124,7 +124,7 @@ public class SelectionColumnMappingTest extends CQLTester
         // we don't use verify like with the other tests because this query 
will produce no results
         SelectStatement statement = getSelect("SELECT token(a,b) FROM %s");
         verifyColumnMapping(expected, statement);
-        statement.executeInternal(QueryState.forInternalCalls(), 
QueryOptions.DEFAULT);
+        statement.executeLocally(QueryState.forInternalCalls(), 
QueryOptions.DEFAULT);
     }
 
     private void testSimpleTypes() throws Throwable
@@ -581,8 +581,8 @@ public class SelectionColumnMappingTest extends CQLTester
     private void checkExecution(SelectStatement statement, 
List<ColumnSpecification> expectedResultColumns)
     throws RequestExecutionException, RequestValidationException
     {
-        UntypedResultSet rs = 
UntypedResultSet.create(statement.executeInternal(QueryState.forInternalCalls(),
-                                                                               
 QueryOptions.DEFAULT).result);
+        UntypedResultSet rs = 
UntypedResultSet.create(statement.executeLocally(QueryState.forInternalCalls(),
+                                                                               
QueryOptions.DEFAULT).result);
 
         assertEquals(expectedResultColumns, rs.one().getColumns());
     }
@@ -590,7 +590,7 @@ public class SelectionColumnMappingTest extends CQLTester
     private SelectStatement getSelect(String query) throws 
RequestValidationException
     {
         CQLStatement statement = 
QueryProcessor.getStatement(String.format(query, KEYSPACE + "." + tableName),
-                                                             
ClientState.forInternalCalls()).statement;
+                                                             
ClientState.forInternalCalls());
         assertTrue(statement instanceof SelectStatement);
         return (SelectStatement)statement;
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java 
b/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java
index 77e5236..883b4f5 100644
--- a/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java
+++ b/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java
@@ -23,13 +23,14 @@ import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.auth.DCPermissions;
+import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryProcessor;
 
 public class AlterRoleStatementTest
 {
     private static AlterRoleStatement parse(String query)
     {
-        ParsedStatement stmt = QueryProcessor.parseStatement(query);
+        CQLStatement.Raw stmt = QueryProcessor.parseStatement(query);
         Assert.assertTrue(stmt instanceof AlterRoleStatement);
         return (AlterRoleStatement) stmt;
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java 
b/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java
index 0ff26b5..7a23da2 100644
--- 
a/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java
@@ -23,6 +23,7 @@ import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.auth.DCPermissions;
+import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.QueryProcessor;
 
@@ -31,7 +32,7 @@ public class CreateRoleStatementTest extends CQLTester
 
     private static CreateRoleStatement parse(String query)
     {
-        ParsedStatement stmt = QueryProcessor.parseStatement(query);
+        CQLStatement.Raw stmt = QueryProcessor.parseStatement(query);
         Assert.assertTrue(stmt instanceof CreateRoleStatement);
         return (CreateRoleStatement) stmt;
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java 
b/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java
index 51e38b3..51c61bb 100644
--- 
a/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java
@@ -22,13 +22,14 @@ import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.auth.DCPermissions;
+import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryProcessor;
 
 public class CreateUserStatementTest
 {
     private static CreateRoleStatement parse(String query)
     {
-        ParsedStatement stmt = QueryProcessor.parseStatement(query);
+        CQLStatement.Raw stmt = QueryProcessor.parseStatement(query);
         Assert.assertTrue(stmt instanceof CreateRoleStatement);
         return (CreateRoleStatement) stmt;
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
index 9ad47c0..54dd0c4 100644
--- 
a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
@@ -684,11 +684,11 @@ public class CollectionsTest extends CQLTester
     @Test
     public void testDropAndReaddDroppedCollection() throws Throwable
     {
-        createTable("create table %s (k int primary key, v frozen<set<text>>, 
x int)");
+        createTable("create table %s (k int primary key, v set<text>, x int)");
         execute("insert into %s (k, v) VALUES (0, {'fffffffff'})");
         flush();
         execute("alter table %s drop v");
-        execute("alter table %s add v set<int>");
+        execute("alter table %s add v set<text>");
     }
 
     @Test
@@ -1652,9 +1652,9 @@ public class CollectionsTest extends CQLTester
     public void testCollectionSliceOnMV() throws Throwable
     {
         createTable("CREATE TABLE %s (k int, c int, l text, m map<text, text>, 
o int, PRIMARY KEY (k, c))");
-        assertInvalidMessage("Cannot use collection element selection when 
defining a materialized view",
+        assertInvalidMessage("Can only select columns by name when defining a 
materialized view (got m['abc'])",
                              "CREATE MATERIALIZED VIEW " + KEYSPACE + ".view1 
AS SELECT m['abc'] FROM %s WHERE k IS NOT NULL AND c IS NOT NULL AND m IS NOT 
NULL PRIMARY KEY (c, k)");
-        assertInvalidMessage("Cannot use collection slice selection when 
defining a materialized view",
+        assertInvalidMessage("Can only select columns by name when defining a 
materialized view (got m['abc'..'def'])",
                              "CREATE MATERIALIZED VIEW " + KEYSPACE + ".view1 
AS SELECT m['abc'..'def'] FROM %s WHERE k IS NOT NULL AND c IS NOT NULL AND m 
IS NOT NULL PRIMARY KEY (c, k)");
     }
 
@@ -1762,7 +1762,7 @@ public class CollectionsTest extends CQLTester
         String type = createType("CREATE TYPE %s (s set<int>, m map<text, 
text>)");
 
         assertInvalidMessage("Non-frozen UDTs are not allowed inside 
collections",
-                             "CREATE TABLE " + KEYSPACE + "t (k int PRIMARY 
KEY, v map<text, " + type + ">)");
+                             "CREATE TABLE " + KEYSPACE + ".t (k int PRIMARY 
KEY, v map<text, " + type + ">)");
 
         String mapType = "map<text, frozen<" + type + ">>";
         for (boolean frozen : new boolean[]{false, true})

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java
index f4543ea..38bd4dd 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java
@@ -160,7 +160,7 @@ public class CountersTest extends CQLTester
     @Test
     public void testProhibitReversedCounterAsPartOfPrimaryKey() throws 
Throwable
     {
-        assertInvalidThrowMessage("counter type is not supported for PRIMARY 
KEY part a",
+        assertInvalidThrowMessage("counter type is not supported for PRIMARY 
KEY column 'a'",
                                   InvalidRequestException.class, 
String.format("CREATE TABLE %s.%s (a counter, b int, PRIMARY KEY (b, a)) WITH 
CLUSTERING ORDER BY (a desc);", KEYSPACE, createTableName()));
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java
 
b/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java
index c493267..39ae392 100644
--- 
a/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java
@@ -554,8 +554,8 @@ public class FrozenCollectionsTest extends CQLTester
         createTable("CREATE TABLE %s (a frozen<map<int, text>> PRIMARY KEY, b 
frozen<map<int, text>>)");
 
         // for now, we don't support indexing values or keys of collections in 
the primary key
-        assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (full(a))", 
"Cannot create secondary index on partition key column");
-        assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (keys(a))", 
"Cannot create secondary index on partition key column");
+        assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (full(a))", 
"Cannot create secondary index on the only partition key column");
+        assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (keys(a))", 
"Cannot create secondary index on the only partition key column");
         assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (keys(b))", 
"Cannot create keys() index on frozen column b. " +
                                                                               
"Frozen collections only support full() indexes");
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
 
b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
index c763b9b..2b2880d 100644
--- 
a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
@@ -25,6 +25,7 @@ import java.util.concurrent.CountDownLatch;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
 
+import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -32,13 +33,12 @@ import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
-import org.apache.cassandra.cql3.statements.IndexTarget;
+import org.apache.cassandra.cql3.statements.schema.IndexTarget;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DeletionTime;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.rows.Cell;
 import org.apache.cassandra.db.rows.Row;
-import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.index.IndexNotAvailableException;
 import org.apache.cassandra.index.SecondaryIndexManager;
@@ -52,6 +52,8 @@ import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.MD5Digest;
 import org.apache.cassandra.utils.Pair;
 
+import static java.lang.String.format;
+
 import static org.apache.cassandra.Util.throwAssert;
 import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
@@ -96,17 +98,17 @@ public class SecondaryIndexTest extends CQLTester
      */
     private void testCreateAndDropIndex(String indexName, boolean 
addKeyspaceOnDrop) throws Throwable
     {
-        execute("USE system");
-        assertInvalidMessage(String.format("Index '%s' could not be found",
-                                           
removeQuotes(indexName.toLowerCase(Locale.US))),
-                             "DROP INDEX " + indexName + ";");
+        assertInvalidMessage(format("Index '%s.%s' doesn't exist",
+                                    KEYSPACE,
+                                    
removeQuotes(indexName.toLowerCase(Locale.US))),
+                             format("DROP INDEX %s.%s", KEYSPACE, indexName));
 
         createTable("CREATE TABLE %s (a int primary key, b int);");
         createIndex("CREATE INDEX " + indexName + " ON %s(b);");
         createIndex("CREATE INDEX IF NOT EXISTS " + indexName + " ON %s(b);");
 
-        assertInvalidMessage(String.format("Index %s already exists",
-                                           
removeQuotes(indexName.toLowerCase(Locale.US))),
+        assertInvalidMessage(format("Index '%s' already exists",
+                                    
removeQuotes(indexName.toLowerCase(Locale.US))),
                              "CREATE INDEX " + indexName + " ON %s(b)");
 
         // IF NOT EXISTS should apply in cases where the new index differs 
from an existing one in name only
@@ -114,9 +116,9 @@ public class SecondaryIndexTest extends CQLTester
         assertEquals(1, 
getCurrentColumnFamilyStore().metadata().indexes.size());
         createIndex("CREATE INDEX IF NOT EXISTS " + otherIndexName + " ON 
%s(b)");
         assertEquals(1, 
getCurrentColumnFamilyStore().metadata().indexes.size());
-        assertInvalidMessage(String.format("Index %s is a duplicate of 
existing index %s",
-                                           
removeQuotes(otherIndexName.toLowerCase(Locale.US)),
-                                           
removeQuotes(indexName.toLowerCase(Locale.US))),
+        assertInvalidMessage(format("Index %s is a duplicate of existing index 
%s",
+                                    
removeQuotes(otherIndexName.toLowerCase(Locale.US)),
+                                    
removeQuotes(indexName.toLowerCase(Locale.US))),
                              "CREATE INDEX " + otherIndexName + " ON %s(b)");
 
         execute("INSERT INTO %s (a, b) values (?, ?);", 0, 0);
@@ -125,26 +127,24 @@ public class SecondaryIndexTest extends CQLTester
         execute("INSERT INTO %s (a, b) values (?, ?);", 3, 1);
 
         assertRows(execute("SELECT * FROM %s where b = ?", 1), row(1, 1), 
row(3, 1));
-        assertInvalidMessage(String.format("Index '%s' could not be found in 
any of the tables of keyspace 'system'",
-                                           
removeQuotes(indexName.toLowerCase(Locale.US))),
-                             "DROP INDEX " + indexName);
 
         if (addKeyspaceOnDrop)
         {
-            dropIndex("DROP INDEX " + KEYSPACE + "." + indexName);
+            dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName));
         }
         else
         {
             execute("USE " + KEYSPACE);
-            execute("DROP INDEX " + indexName);
+            execute(format("DROP INDEX %s", indexName));
         }
 
         
assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                              "SELECT * FROM %s where b = ?", 1);
-        dropIndex("DROP INDEX IF EXISTS " + indexName);
-        assertInvalidMessage(String.format("Index '%s' could not be found",
-                                           
removeQuotes(indexName.toLowerCase(Locale.US))),
-                             "DROP INDEX " + indexName);
+        dropIndex(format("DROP INDEX IF EXISTS %s.%s", KEYSPACE, indexName));
+        assertInvalidMessage(format("Index '%s.%s' doesn't exist",
+                                    KEYSPACE,
+                                    
removeQuotes(indexName.toLowerCase(Locale.US))),
+                             format("DROP INDEX %s.%s", KEYSPACE, indexName));
     }
 
     /**
@@ -239,10 +239,10 @@ public class SecondaryIndexTest extends CQLTester
     public void testUnknownCompressionOptions() throws Throwable
     {
         String tableName = createTableName();
-        assertInvalidThrow(SyntaxException.class, String.format("CREATE TABLE 
%s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH 
compression_parameters:sstable_compressor = 'DeflateCompressor'", tableName));
+        assertInvalidThrow(SyntaxException.class, format("CREATE TABLE %s (key 
varchar PRIMARY KEY, password varchar, gender varchar) WITH 
compression_parameters:sstable_compressor = 'DeflateCompressor'", tableName));
 
-        assertInvalidThrow(ConfigurationException.class, String.format("CREATE 
TABLE %s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH 
compression = { 'sstable_compressor': 'DeflateCompressor' }",
-                                                                       
tableName));
+        assertInvalidThrow(ConfigurationException.class, format("CREATE TABLE 
%s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH compression 
= { 'sstable_compressor': 'DeflateCompressor' }",
+                                                                tableName));
     }
 
     /**
@@ -558,14 +558,14 @@ public class SecondaryIndexTest extends CQLTester
     {
         String indexName = columnName + "_idx";
         SecondaryIndexManager indexManager = 
getCurrentColumnFamilyStore().indexManager;
-        createIndex(String.format("CREATE INDEX %s on %%s(%s)", indexName, 
columnName));
+        createIndex(format("CREATE INDEX %s on %%s(%s)", indexName, 
columnName));
         IndexMetadata indexDef = 
indexManager.getIndexByName(indexName).getIndexMetadata();
-        assertEquals(String.format("values(%s)", columnName), 
indexDef.options.get(IndexTarget.TARGET_OPTION_NAME));
-        dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName));
+        assertEquals(format("values(%s)", columnName), 
indexDef.options.get(IndexTarget.TARGET_OPTION_NAME));
+        dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName));
         assertFalse(indexManager.hasIndexes());
-        createIndex(String.format("CREATE INDEX %s on %%s(values(%s))", 
indexName, columnName));
+        createIndex(format("CREATE INDEX %s on %%s(values(%s))", indexName, 
columnName));
         assertEquals(indexDef, 
indexManager.getIndexByName(indexName).getIndexMetadata());
-        dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName));
+        dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName));
     }
 
     @Test
@@ -594,15 +594,15 @@ public class SecondaryIndexTest extends CQLTester
     private void createAndDropIndexWithQuotedColumnIdentifier(String target) 
throws Throwable
     {
         String indexName = "test_mixed_case_idx";
-        createIndex(String.format("CREATE INDEX %s ON %%s(%s)", indexName, 
target));
+        createIndex(format("CREATE INDEX %s ON %%s(%s)", indexName, target));
         SecondaryIndexManager indexManager = 
getCurrentColumnFamilyStore().indexManager;
         IndexMetadata indexDef = 
indexManager.getIndexByName(indexName).getIndexMetadata();
-        dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName));
+        dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName));
         // verify we can re-create the index using the target string
-        createIndex(String.format("CREATE INDEX %s ON %%s(%s)",
-                                  indexName, 
indexDef.options.get(IndexTarget.TARGET_OPTION_NAME)));
+        createIndex(format("CREATE INDEX %s ON %%s(%s)",
+                           indexName, 
indexDef.options.get(IndexTarget.TARGET_OPTION_NAME)));
         assertEquals(indexDef, 
indexManager.getIndexByName(indexName).getIndexMetadata());
-        dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName));
+        dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName));
     }
 
 
@@ -664,7 +664,7 @@ public class SecondaryIndexTest extends CQLTester
         // the indexed value passes validation, but the batch size will
         // exceed the default failure threshold, so temporarily raise it
         // (the non-conditional batch doesn't hit this because
-        // BatchStatement::executeInternal skips the size check but CAS
+        // BatchStatement::executeLocally skips the size check but CAS
         // path does not)
         long batchSizeThreshold = 
DatabaseDescriptor.getBatchSizeFailThreshold();
         try
@@ -717,7 +717,7 @@ public class SecondaryIndexTest extends CQLTester
         // the indexed value passes validation, but the batch size will
         // exceed the default failure threshold, so temporarily raise it
         // (the non-conditional batch doesn't hit this because
-        // BatchStatement::executeInternal skips the size check but CAS
+        // BatchStatement::executeLocally skips the size check but CAS
         // path does not)
         long batchSizeThreshold = 
DatabaseDescriptor.getBatchSizeFailThreshold();
         try
@@ -754,15 +754,15 @@ public class SecondaryIndexTest extends CQLTester
     public void prepareStatementsWithLIKEClauses() throws Throwable
     {
         createTable("CREATE TABLE %s (a int, c1 text, c2 text, v1 text, v2 
text, v3 int, PRIMARY KEY (a, c1, c2))");
-        createIndex(String.format("CREATE CUSTOM INDEX c1_idx on %%s(c1) USING 
'%s' WITH OPTIONS = {'mode' : 'PREFIX'}",
-                                  SASIIndex.class.getName()));
-        createIndex(String.format("CREATE CUSTOM INDEX c2_idx on %%s(c2) USING 
'%s' WITH OPTIONS = {'mode' : 'CONTAINS'}",
-                                  SASIIndex.class.getName()));
-        createIndex(String.format("CREATE CUSTOM INDEX v1_idx on %%s(v1) USING 
'%s' WITH OPTIONS = {'mode' : 'PREFIX'}",
-                                  SASIIndex.class.getName()));
-        createIndex(String.format("CREATE CUSTOM INDEX v2_idx on %%s(v2) USING 
'%s' WITH OPTIONS = {'mode' : 'CONTAINS'}",
-                                  SASIIndex.class.getName()));
-        createIndex(String.format("CREATE CUSTOM INDEX v3_idx on %%s(v3) USING 
'%s'", SASIIndex.class.getName()));
+        createIndex(format("CREATE CUSTOM INDEX c1_idx on %%s(c1) USING '%s' 
WITH OPTIONS = {'mode' : 'PREFIX'}",
+                           SASIIndex.class.getName()));
+        createIndex(format("CREATE CUSTOM INDEX c2_idx on %%s(c2) USING '%s' 
WITH OPTIONS = {'mode' : 'CONTAINS'}",
+                           SASIIndex.class.getName()));
+        createIndex(format("CREATE CUSTOM INDEX v1_idx on %%s(v1) USING '%s' 
WITH OPTIONS = {'mode' : 'PREFIX'}",
+                           SASIIndex.class.getName()));
+        createIndex(format("CREATE CUSTOM INDEX v2_idx on %%s(v2) USING '%s' 
WITH OPTIONS = {'mode' : 'CONTAINS'}",
+                           SASIIndex.class.getName()));
+        createIndex(format("CREATE CUSTOM INDEX v3_idx on %%s(v3) USING '%s'", 
SASIIndex.class.getName()));
 
         forcePreparedValues();
         // prefix mode indexes support prefix/contains/matches
@@ -870,8 +870,8 @@ public class SecondaryIndexTest extends CQLTester
         String indexClassName = StubIndex.class.getName();
         createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY ((a), 
b))");
         // uses different options otherwise the two indexes are considered 
duplicates
-        createIndex(String.format("CREATE CUSTOM INDEX c_idx_1 ON %%s(c) USING 
'%s' WITH OPTIONS = {'foo':'a'}", indexClassName));
-        createIndex(String.format("CREATE CUSTOM INDEX c_idx_2 ON %%s(c) USING 
'%s' WITH OPTIONS = {'foo':'b'}", indexClassName));
+        createIndex(format("CREATE CUSTOM INDEX c_idx_1 ON %%s(c) USING '%s' 
WITH OPTIONS = {'foo':'a'}", indexClassName));
+        createIndex(format("CREATE CUSTOM INDEX c_idx_2 ON %%s(c) USING '%s' 
WITH OPTIONS = {'foo':'b'}", indexClassName));
 
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         TableMetadata cfm = cfs.metadata();
@@ -913,7 +913,7 @@ public class SecondaryIndexTest extends CQLTester
 
         String indexClassName = StubIndex.class.getName();
         createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY ((a), 
b))");
-        createIndex(String.format("CREATE CUSTOM INDEX c_idx ON %%s(c) USING 
'%s'", indexClassName));
+        createIndex(format("CREATE CUSTOM INDEX c_idx ON %%s(c) USING '%s'", 
indexClassName));
 
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         TableMetadata cfm = cfs.metadata();
@@ -969,7 +969,7 @@ public class SecondaryIndexTest extends CQLTester
         // Any columns which are unchanged by the update are not passed to the 
Indexer
         // Note that for simplicity this test resets the index between each 
scenario
         createTable("CREATE TABLE %s (k int, c int, v1 int, v2 int, PRIMARY 
KEY (k,c))");
-        createIndex(String.format("CREATE CUSTOM INDEX test_index ON %%s() 
USING '%s'", StubIndex.class.getName()));
+        createIndex(format("CREATE CUSTOM INDEX test_index ON %%s() USING 
'%s'", StubIndex.class.getName()));
         execute("INSERT INTO %s (k, c, v1, v2) VALUES (0, 0, 0, 0) USING 
TIMESTAMP 0");
 
         ColumnMetadata v1 = 
getCurrentColumnFamilyStore().metadata().getColumn(new ColumnIdentifier("v1", 
true));
@@ -1386,8 +1386,8 @@ public class SecondaryIndexTest extends CQLTester
         assertRows(execute("SELECT * FROM %s WHERE v = ?", udt1), row(1, 
udt1));
 
         dropIndex("DROP INDEX %s." + indexName);
-        assertInvalidMessage(String.format("Index '%s' could not be found", 
indexName),
-                             String.format("DROP INDEX %s.%s", KEYSPACE, 
indexName));
+        assertInvalidMessage(format("Index '%s.%s' doesn't exist", KEYSPACE, 
indexName),
+                             format("DROP INDEX %s.%s", KEYSPACE, indexName));
         
assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                              "SELECT * FROM %s WHERE v = ?", udt1);
     }
@@ -1419,8 +1419,8 @@ public class SecondaryIndexTest extends CQLTester
         assertEmpty(execute("SELECT * FROM %s WHERE v = ?", set(udt2)));
 
         dropIndex("DROP INDEX %s." + indexName);
-        assertInvalidMessage(String.format("Index '%s' could not be found", 
indexName),
-                             String.format("DROP INDEX %s.%s", KEYSPACE, 
indexName));
+        assertInvalidMessage(format("Index '%s.%s' doesn't exist", KEYSPACE, 
indexName),
+                             format("DROP INDEX %s.%s", KEYSPACE, indexName));
         
assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                              "SELECT * FROM %s WHERE v CONTAINS ?", udt1);
     }
@@ -1453,8 +1453,8 @@ public class SecondaryIndexTest extends CQLTester
         assertRows(execute("SELECT * FROM %s WHERE v CONTAINS ?", udt2), 
row(2, set(udt2)));
 
         dropIndex("DROP INDEX %s." + indexName);
-        assertInvalidMessage(String.format("Index '%s' could not be found", 
indexName),
-                             String.format("DROP INDEX %s.%s", KEYSPACE, 
indexName));
+        assertInvalidMessage(format("Index '%s.%s' doesn't exist", KEYSPACE, 
indexName),
+                             format("DROP INDEX %s.%s", KEYSPACE, indexName));
         
assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                              "SELECT * FROM %s WHERE v CONTAINS ?", udt1);
     }
@@ -1464,9 +1464,9 @@ public class SecondaryIndexTest extends CQLTester
     {
         String type = createType("CREATE TYPE %s (a int)");
         createTable("CREATE TABLE %s (k int PRIMARY KEY, v " + type + ")");
-        assertInvalidMessage("Secondary indexes are not supported on 
non-frozen UDTs", "CREATE INDEX ON %s (v)");
-        assertInvalidMessage("Non-collection columns support only simple 
indexes", "CREATE INDEX ON %s (keys(v))");
-        assertInvalidMessage("Non-collection columns support only simple 
indexes", "CREATE INDEX ON %s (values(v))");
+        assertInvalidMessage("Cannot create index on non-frozen UDT column v", 
"CREATE INDEX ON %s (v)");
+        assertInvalidMessage("Cannot create keys() index on v. Non-collection 
columns only support simple indexes", "CREATE INDEX ON %s (keys(v))");
+        assertInvalidMessage("Cannot create values() index on v. 
Non-collection columns only support simple indexes", "CREATE INDEX ON %s 
(values(v))");
         assertInvalidMessage("full() indexes can only be created on frozen 
collections", "CREATE INDEX ON %s (full(v))");
     }
 
@@ -1514,7 +1514,7 @@ public class SecondaryIndexTest extends CQLTester
 
     private ResultMessage.Prepared prepareStatement(String cql)
     {
-        return QueryProcessor.prepare(String.format(cql, KEYSPACE, 
currentTable()),
+        return QueryProcessor.prepare(format(cql, KEYSPACE, currentTable()),
                                       ClientState.forInternalCalls());
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to