13426: work in progress

Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/aaddbd49
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/aaddbd49
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/aaddbd49

Branch: refs/heads/13426
Commit: aaddbd49ae7c88e8cfea5f51809f87e9e1ea729a
Parents: 7b149ce
Author: Aleksey Yeschenko <[email protected]>
Authored: Thu Nov 10 01:17:36 2016 +0000
Committer: Aleksey Yeschenko <[email protected]>
Committed: Wed May 31 14:42:08 2017 +0100

----------------------------------------------------------------------
 src/antlr/Cql.g                                 |  18 +-
 src/antlr/Parser.g                              | 215 +++++-----
 .../org/apache/cassandra/auth/AuthKeyspace.java |   2 +-
 .../cassandra/auth/CassandraAuthorizer.java     |  26 +-
 .../cassandra/auth/CassandraRoleManager.java    |   3 +-
 .../apache/cassandra/auth/FunctionResource.java |   5 +
 .../cassandra/auth/PasswordAuthenticator.java   |   2 +-
 .../cassandra/auth/jmx/AuthorizationProxy.java  |   2 +-
 src/java/org/apache/cassandra/cql3/CFName.java  |  39 --
 .../org/apache/cassandra/cql3/CQL3Type.java     |  97 ++---
 .../org/apache/cassandra/cql3/CQLStatement.java |  59 ++-
 .../CustomPayloadMirroringQueryHandler.java     |   3 +-
 .../org/apache/cassandra/cql3/IndexName.java    |  47 ---
 .../cassandra/cql3/KeyspaceElementName.java     |  74 ----
 .../apache/cassandra/cql3/QualifiedName.java    |  97 +++++
 .../org/apache/cassandra/cql3/QueryHandler.java |   3 +-
 .../apache/cassandra/cql3/QueryProcessor.java   | 154 ++++---
 .../cassandra/cql3/SingleColumnRelation.java    |   2 +-
 .../cassandra/cql3/VariableSpecifications.java  |  16 +-
 .../org/apache/cassandra/cql3/WhereClause.java  |  46 +-
 .../cql3/functions/AbstractFunction.java        |   7 +
 .../cassandra/cql3/functions/Function.java      |  10 +
 .../cassandra/cql3/functions/UDAggregate.java   |  77 ++--
 .../cassandra/cql3/functions/UDFunction.java    |  42 ++
 .../restrictions/CustomIndexExpression.java     |  12 +-
 .../cql3/restrictions/IndexRestrictions.java    |  18 +-
 .../restrictions/StatementRestrictions.java     |  35 +-
 .../cql3/statements/AlterKeyspaceStatement.java | 112 -----
 .../cql3/statements/AlterRoleStatement.java     |   4 +-
 .../cql3/statements/AlterTableStatement.java    |  20 +-
 .../cql3/statements/AlterTypeStatement.java     |  22 +-
 .../cql3/statements/AlterViewStatement.java     |  96 -----
 .../statements/AuthenticationStatement.java     |  18 +-
 .../cql3/statements/AuthorizationStatement.java |  17 +-
 .../cql3/statements/BatchStatement.java         |  79 ++--
 .../cassandra/cql3/statements/CFStatement.java  |  66 ---
 .../statements/CreateAggregateStatement.java    |  25 +-
 .../statements/CreateFunctionStatement.java     |  22 +-
 .../cql3/statements/CreateIndexStatement.java   | 258 ------------
 .../statements/CreateKeyspaceStatement.java     | 137 ------
 .../cql3/statements/CreateRoleStatement.java    |   4 +-
 .../cql3/statements/CreateTableStatement.java   | 414 ------------------
 .../cql3/statements/CreateTriggerStatement.java |  98 -----
 .../cql3/statements/CreateTypeStatement.java    | 135 ------
 .../cql3/statements/CreateViewStatement.java    | 338 ---------------
 .../cql3/statements/DeleteStatement.java        |  14 +-
 .../cql3/statements/DropAggregateStatement.java | 152 -------
 .../cql3/statements/DropFunctionStatement.java  | 189 ---------
 .../cql3/statements/DropIndexStatement.java     | 116 ------
 .../cql3/statements/DropKeyspaceStatement.java  |  73 ----
 .../cql3/statements/DropRoleStatement.java      |   4 +-
 .../cql3/statements/DropTableStatement.java     | 104 -----
 .../cql3/statements/DropTriggerStatement.java   |  85 ----
 .../cql3/statements/DropTypeStatement.java      | 123 ------
 .../cql3/statements/DropViewStatement.java      |  69 ---
 .../cql3/statements/IndexAttributes.java        |  76 ++++
 .../cql3/statements/IndexPropDefs.java          |  76 ----
 .../statements/ListPermissionsStatement.java    |   2 +-
 .../cql3/statements/ListRolesStatement.java     |   2 +-
 .../cql3/statements/ModificationStatement.java  |  81 ++--
 .../cql3/statements/ParsedStatement.java        |  86 ----
 .../PermissionsManagementStatement.java         |  10 +-
 .../cql3/statements/QualifiedStatement.java     |  67 +++
 .../statements/RoleManagementStatement.java     |   2 +-
 .../statements/SchemaAlteringStatement.java     |  21 +-
 .../cql3/statements/SelectStatement.java        |  84 ++--
 .../cql3/statements/TableAttributes.java        |   8 +-
 .../cql3/statements/TruncateStatement.java      |  27 +-
 .../cql3/statements/UpdateStatement.java        |  41 +-
 .../cassandra/cql3/statements/UseStatement.java |  15 +-
 .../schema/AlterKeyspaceStatement.java          | 104 +++++
 .../statements/schema/AlterSchemaStatement.java | 161 +++++++
 .../statements/schema/AlterTableStatement.java  | 341 +++++++++++++++
 .../statements/schema/AlterTypeStatement.java   | 149 +++++++
 .../statements/schema/AlterViewStatement.java   | 105 +++++
 .../schema/CreateAggregateStatement.java        | 231 ++++++++++
 .../schema/CreateFunctionStatement.java         | 239 +++++++++++
 .../statements/schema/CreateIndexStatement.java | 237 +++++++++++
 .../schema/CreateKeyspaceStatement.java         | 108 +++++
 .../statements/schema/CreateTableStatement.java | 417 +++++++++++++++++++
 .../schema/CreateTriggerStatement.java          | 112 +++++
 .../statements/schema/CreateTypeStatement.java  | 143 +++++++
 .../statements/schema/CreateViewStatement.java  | 400 ++++++++++++++++++
 .../schema/DropAggregateStatement.java          | 166 ++++++++
 .../schema/DropFunctionStatement.java           | 168 ++++++++
 .../statements/schema/DropIndexStatement.java   | 102 +++++
 .../schema/DropKeyspaceStatement.java           |  75 ++++
 .../statements/schema/DropTableStatement.java   | 104 +++++
 .../statements/schema/DropTriggerStatement.java |  96 +++++
 .../statements/schema/DropTypeStatement.java    | 140 +++++++
 .../statements/schema/DropViewStatement.java    |  90 ++++
 src/java/org/apache/cassandra/db/Keyspace.java  |   7 +-
 .../org/apache/cassandra/db/SystemKeyspace.java |   2 +-
 .../db/marshal/AbstractCompositeType.java       |   6 +-
 .../cassandra/db/marshal/AbstractType.java      |  10 +-
 .../cassandra/db/marshal/CompositeType.java     |  26 +-
 .../db/marshal/DynamicCompositeType.java        |  30 +-
 .../apache/cassandra/db/marshal/ListType.java   |  37 +-
 .../apache/cassandra/db/marshal/MapType.java    |  31 +-
 .../cassandra/db/marshal/ReversedType.java      |  33 +-
 .../apache/cassandra/db/marshal/SetType.java    |  28 +-
 .../apache/cassandra/db/marshal/TupleType.java  |  19 +-
 .../apache/cassandra/db/marshal/UserType.java   |  38 +-
 .../apache/cassandra/db/view/TableViews.java    |   2 +-
 src/java/org/apache/cassandra/db/view/View.java | 108 ++---
 .../apache/cassandra/db/view/ViewManager.java   |   4 +-
 .../hadoop/cql3/CqlBulkRecordWriter.java        |   2 +-
 .../cassandra/io/sstable/CQLSSTableWriter.java  |  43 +-
 .../apache/cassandra/repair/RepairRunnable.java |   3 +-
 .../repair/SystemDistributedKeyspace.java       |   2 +-
 src/java/org/apache/cassandra/schema/Diff.java  |  57 +++
 .../org/apache/cassandra/schema/Functions.java  | 141 +++++--
 .../apache/cassandra/schema/IndexMetadata.java  |  12 +-
 .../org/apache/cassandra/schema/Indexes.java    |  30 --
 .../cassandra/schema/KeyspaceMetadata.java      | 133 +++++-
 .../apache/cassandra/schema/KeyspaceParams.java |   4 +-
 .../org/apache/cassandra/schema/Keyspaces.java  |  99 ++++-
 .../cassandra/schema/MigrationManager.java      | 183 ++++----
 .../org/apache/cassandra/schema/Schema.java     | 176 ++++----
 .../apache/cassandra/schema/SchemaKeyspace.java | 205 +++++----
 .../cassandra/schema/SchemaTransformation.java  |  31 ++
 .../apache/cassandra/schema/TableMetadata.java  |  43 +-
 .../org/apache/cassandra/schema/Tables.java     |  92 +++-
 src/java/org/apache/cassandra/schema/Types.java |  73 +++-
 .../apache/cassandra/schema/ViewMetadata.java   | 118 ++----
 src/java/org/apache/cassandra/schema/Views.java | 117 ++++--
 .../apache/cassandra/service/ClientState.java   |  73 ++--
 .../cassandra/service/StorageService.java       |   6 +-
 .../cassandra/tools/SSTableOfflineRelevel.java  |   2 +-
 .../apache/cassandra/tracing/TraceKeyspace.java |   2 +-
 .../org/apache/cassandra/transport/Event.java   |  13 +
 .../transport/messages/BatchMessage.java        |  28 +-
 .../transport/messages/ExecuteMessage.java      |  12 +-
 .../transport/messages/ResultMessage.java       |   5 +-
 .../cassandra/triggers/TriggerExecutor.java     |   8 +-
 .../test/microbench/MutationBench.java          |   2 +-
 .../unit/org/apache/cassandra/SchemaLoader.java |   2 +-
 .../org/apache/cassandra/cql3/CQLTester.java    |  20 +-
 .../cassandra/cql3/PstmtPersistenceTest.java    |   5 +-
 .../cassandra/cql3/ViewFilteringTest.java       |   2 +-
 .../apache/cassandra/cql3/ViewSchemaTest.java   |   4 +-
 .../org/apache/cassandra/cql3/ViewTest.java     |  39 +-
 .../selection/SelectionColumnMappingTest.java   |   8 +-
 .../cql3/validation/entities/CountersTest.java  |   2 +-
 .../entities/FrozenCollectionsTest.java         |   4 +-
 .../validation/entities/SecondaryIndexTest.java | 114 ++---
 .../cql3/validation/entities/TypeTest.java      |   4 +-
 .../cql3/validation/entities/UFAuthTest.java    |  32 +-
 .../entities/UFIdentificationTest.java          |   9 +-
 .../cql3/validation/entities/UFTest.java        |  35 +-
 .../cql3/validation/entities/UFTypesTest.java   |  10 +-
 .../cql3/validation/entities/UserTypesTest.java |   6 +-
 .../validation/operations/AggregationTest.java  |  68 +--
 .../cql3/validation/operations/CreateTest.java  |  57 ++-
 .../cql3/validation/operations/DropTest.java    |   4 +-
 .../operations/InsertUpdateIfConditionTest.java |   6 +-
 .../SelectSingleColumnRelationTest.java         |   2 +-
 .../cql3/validation/operations/SelectTest.java  |   4 +-
 .../apache/cassandra/db/RowIndexEntryTest.java  |   2 +-
 .../compaction/AbstractPendingRepairTest.java   |   2 +-
 ...tionManagerGetSSTablesForValidationTest.java |   2 +-
 .../db/compaction/CompactionsPurgeTest.java     |   2 +-
 .../cassandra/hints/HintWriteTTLTest.java       |   2 +-
 .../apache/cassandra/index/CustomIndexTest.java |   4 +-
 .../index/internal/CassandraIndexTest.java      |   4 +-
 .../repair/StreamingRepairTaskTest.java         |   2 +-
 .../consistent/CoordinatorSessionsTest.java     |   2 +-
 .../repair/consistent/LocalSessionTest.java     |   2 +-
 .../consistent/PendingAntiCompactionTest.java   |   2 +-
 .../cassandra/schema/IndexMetadataTest.java     |   7 +-
 .../cassandra/schema/SchemaKeyspaceTest.java    |   2 +-
 .../cassandra/service/QueryPagerTest.java       |   2 +-
 .../cassandra/streaming/StreamSessionTest.java  |   2 +-
 .../cassandra/transport/MessagePayloadTest.java |   3 +-
 .../cassandra/triggers/TriggersSchemaTest.java  |   2 +-
 .../io/sstable/StressCQLSSTableWriter.java      |  59 +--
 .../cassandra/stress/CompactionStress.java      |   4 +-
 .../apache/cassandra/stress/StressProfile.java  |  14 +-
 178 files changed, 6311 insertions(+), 4534 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/antlr/Cql.g
----------------------------------------------------------------------
diff --git a/src/antlr/Cql.g b/src/antlr/Cql.g
index 17a11aa..e0d5b3f 100644
--- a/src/antlr/Cql.g
+++ b/src/antlr/Cql.g
@@ -46,6 +46,22 @@ import Parser,Lexer;
     import org.apache.cassandra.cql3.restrictions.CustomIndexExpression;
     import org.apache.cassandra.cql3.selection.*;
     import org.apache.cassandra.cql3.statements.*;
+    import org.apache.cassandra.cql3.statements.schema.AlterKeyspaceStatement;
+    import org.apache.cassandra.cql3.statements.schema.AlterViewStatement;
+    import org.apache.cassandra.cql3.statements.schema.CreateIndexStatement;
+    import org.apache.cassandra.cql3.statements.schema.CreateKeyspaceStatement;
+    import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+    import org.apache.cassandra.cql3.statements.schema.CreateTriggerStatement;
+    import org.apache.cassandra.cql3.statements.schema.CreateTypeStatement;
+    import org.apache.cassandra.cql3.statements.schema.CreateViewStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropAggregateStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropFunctionStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropIndexStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropKeyspaceStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropTableStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropTriggerStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropTypeStatement;
+    import org.apache.cassandra.cql3.statements.schema.DropViewStatement;
     import org.apache.cassandra.db.marshal.CollectionType;
     import org.apache.cassandra.exceptions.ConfigurationException;
     import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -135,6 +151,6 @@ import Parser,Lexer;
     }
 }
 
-query returns [ParsedStatement stmnt]
+query returns [CQLStatement.Raw stmnt]
     : st=cqlStatement (';')* EOF { $stmnt = st; }
     ;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/antlr/Parser.g
----------------------------------------------------------------------
diff --git a/src/antlr/Parser.g b/src/antlr/Parser.g
index a96bb2b..e93dac9 100644
--- a/src/antlr/Parser.g
+++ b/src/antlr/Parser.g
@@ -204,8 +204,8 @@ options {
 
 /** STATEMENTS **/
 
-cqlStatement returns [ParsedStatement stmt]
-    @after{ if (stmt != null) stmt.setBoundVariables(bindVariables); }
+cqlStatement returns [CQLStatement.Raw stmt]
+    @after{ if (stmt != null) stmt.setBindVariables(bindVariables); }
     : st1= selectStatement                 { $stmt = st1; }
     | st2= insertStatement                 { $stmt = st2; }
     | st3= updateStatement                 { $stmt = st3; }
@@ -417,8 +417,8 @@ selectionFunctionArgs returns [List<Selectable.Raw> a]
 
 sident returns [Selectable.Raw id]
     : t=IDENT              { $id = 
Selectable.RawIdentifier.forUnquoted($t.text); }
-    | t=QUOTED_NAME        { $id = 
ColumnMetadata.RawIdentifier.forQuoted($t.text); }
-    | k=unreserved_keyword { $id = 
ColumnMetadata.RawIdentifier.forUnquoted(k); }
+    | t=QUOTED_NAME        { $id = 
Selectable.RawIdentifier.forQuoted($t.text); }
+    | k=unreserved_keyword { $id = Selectable.RawIdentifier.forUnquoted(k); }
     ;
 
 whereClause returns [WhereClause.Builder clause]
@@ -432,7 +432,7 @@ relationOrExpression [WhereClause.Builder clause]
     ;
 
 customIndexExpression [WhereClause.Builder clause]
-    @init{IndexName name = new IndexName();}
+    @init{QualifiedName name = new QualifiedName();}
     : 'expr(' idxName[name] ',' t=term ')' { clause.add(new 
CustomIndexExpression(name, t));}
     ;
 
@@ -459,7 +459,7 @@ insertStatement returns [ModificationStatement.Parsed expr]
         | K_JSON st2=jsonInsertStatement[cf] { $expr = st2; })
     ;
 
-normalInsertStatement [CFName cf] returns [UpdateStatement.ParsedInsert expr]
+normalInsertStatement [QualifiedName qn] returns [UpdateStatement.ParsedInsert 
expr]
     @init {
         Attributes.Raw attrs = new Attributes.Raw();
         List<ColumnMetadata.Raw> columnNames  = new ArrayList<>();
@@ -472,11 +472,11 @@ normalInsertStatement [CFName cf] returns 
[UpdateStatement.ParsedInsert expr]
       ( K_IF K_NOT K_EXISTS { ifNotExists = true; } )?
       ( usingClause[attrs] )?
       {
-          $expr = new UpdateStatement.ParsedInsert(cf, attrs, columnNames, 
values, ifNotExists);
+          $expr = new UpdateStatement.ParsedInsert(qn, attrs, columnNames, 
values, ifNotExists);
       }
     ;
 
-jsonInsertStatement [CFName cf] returns [UpdateStatement.ParsedInsertJson expr]
+jsonInsertStatement [QualifiedName qn] returns 
[UpdateStatement.ParsedInsertJson expr]
     @init {
         Attributes.Raw attrs = new Attributes.Raw();
         boolean ifNotExists = false;
@@ -487,7 +487,7 @@ jsonInsertStatement [CFName cf] returns 
[UpdateStatement.ParsedInsertJson expr]
       ( K_IF K_NOT K_EXISTS { ifNotExists = true; } )?
       ( usingClause[attrs] )?
       {
-          $expr = new UpdateStatement.ParsedInsertJson(cf, attrs, val, 
defaultUnset, ifNotExists);
+          $expr = new UpdateStatement.ParsedInsertJson(qn, attrs, val, 
defaultUnset, ifNotExists);
       }
     ;
 
@@ -658,11 +658,11 @@ createAggregateStatement returns 
[CreateAggregateStatement expr]
       { $expr = new CreateAggregateStatement(fn, argsTypes, sfunc, stype, 
ffunc, ival, orReplace, ifNotExists); }
     ;
 
-dropAggregateStatement returns [DropAggregateStatement expr]
+dropAggregateStatement returns [DropAggregateStatement.Raw stmt]
     @init {
         boolean ifExists = false;
-        List<CQL3Type.Raw> argsTypes = new ArrayList<>();
-        boolean argsPresent = false;
+        List<CQL3Type.Raw> argTypes = new ArrayList<>();
+        boolean argsSpecified = false;
     }
     : K_DROP K_AGGREGATE
       (K_IF K_EXISTS { ifExists = true; } )?
@@ -670,13 +670,13 @@ dropAggregateStatement returns [DropAggregateStatement 
expr]
       (
         '('
           (
-            v=comparatorType { argsTypes.add(v); }
-            ( ',' v=comparatorType { argsTypes.add(v); } )*
+            v=comparatorType { argTypes.add(v); }
+            ( ',' v=comparatorType { argTypes.add(v); } )*
           )?
         ')'
-        { argsPresent = true; }
+        { argsSpecified = true; }
       )?
-      { $expr = new DropAggregateStatement(fn, argsTypes, argsPresent, 
ifExists); }
+      { $stmt = new DropAggregateStatement.Raw(fn, argTypes, argsSpecified, 
ifExists); }
     ;
 
 createFunctionStatement returns [CreateFunctionStatement expr]
@@ -706,11 +706,11 @@ createFunctionStatement returns [CreateFunctionStatement 
expr]
                                             argsNames, argsTypes, rt, 
calledOnNullInput, orReplace, ifNotExists); }
     ;
 
-dropFunctionStatement returns [DropFunctionStatement expr]
+dropFunctionStatement returns [DropFunctionStatement.Raw stmt]
     @init {
         boolean ifExists = false;
-        List<CQL3Type.Raw> argsTypes = new ArrayList<>();
-        boolean argsPresent = false;
+        List<CQL3Type.Raw> argTypes = new ArrayList<>();
+        boolean argsSpecified = false;
     }
     : K_DROP K_FUNCTION
       (K_IF K_EXISTS { ifExists = true; } )?
@@ -718,72 +718,71 @@ dropFunctionStatement returns [DropFunctionStatement expr]
       (
         '('
           (
-            v=comparatorType { argsTypes.add(v); }
-            ( ',' v=comparatorType { argsTypes.add(v); } )*
+            v=comparatorType { argTypes.add(v); }
+            ( ',' v=comparatorType { argTypes.add(v); } )*
           )?
         ')'
-        { argsPresent = true; }
+        { argsSpecified = true; }
       )?
-      { $expr = new DropFunctionStatement(fn, argsTypes, argsPresent, 
ifExists); }
+      { $stmt = new DropFunctionStatement.Raw(fn, argTypes, argsSpecified, 
ifExists); }
     ;
 
 /**
  * CREATE KEYSPACE [IF NOT EXISTS] <KEYSPACE> WITH attr1 = value1 AND attr2 = 
value2;
  */
-createKeyspaceStatement returns [CreateKeyspaceStatement expr]
+createKeyspaceStatement returns [CreateKeyspaceStatement.Raw stmt]
     @init {
         KeyspaceAttributes attrs = new KeyspaceAttributes();
         boolean ifNotExists = false;
     }
     : K_CREATE K_KEYSPACE (K_IF K_NOT K_EXISTS { ifNotExists = true; } )? 
ks=keyspaceName
-      K_WITH properties[attrs] { $expr = new CreateKeyspaceStatement(ks, 
attrs, ifNotExists); }
+      K_WITH properties[attrs] { $stmt = new CreateKeyspaceStatement.Raw(ks, 
attrs, ifNotExists); }
     ;
 
 /**
- * CREATE COLUMNFAMILY [IF NOT EXISTS] <CF> (
+ * CREATE TABLE [IF NOT EXISTS] <CF> (
  *     <name1> <type>,
  *     <name2> <type>,
  *     <name3> <type>
  * ) WITH <property> = <value> AND ...;
  */
-createTableStatement returns [CreateTableStatement.RawStatement expr]
+createTableStatement returns [CreateTableStatement.Raw stmt]
     @init { boolean ifNotExists = false; }
     : K_CREATE K_COLUMNFAMILY (K_IF K_NOT K_EXISTS { ifNotExists = true; } )?
-      cf=columnFamilyName { $expr = new CreateTableStatement.RawStatement(cf, 
ifNotExists); }
-      cfamDefinition[expr]
+      cf=columnFamilyName { $stmt = new CreateTableStatement.Raw(cf, 
ifNotExists); }
+      tableDefinition[stmt]
     ;
 
-cfamDefinition[CreateTableStatement.RawStatement expr]
-    : '(' cfamColumns[expr] ( ',' cfamColumns[expr]? )* ')'
-      ( K_WITH cfamProperty[expr.properties] ( K_AND 
cfamProperty[expr.properties] )*)?
+tableDefinition[CreateTableStatement.Raw stmt]
+    : '(' tableColumns[stmt] ( ',' tableColumns[stmt]? )* ')'
+      ( K_WITH tableProperty[stmt] ( K_AND tableProperty[stmt] )*)?
     ;
 
-cfamColumns[CreateTableStatement.RawStatement expr]
+tableColumns[CreateTableStatement.Raw stmt]
     @init { boolean isStatic = false; }
-    : k=ident v=comparatorType (K_STATIC {isStatic = true;})? { 
$expr.addDefinition(k, v, isStatic); }
-        (K_PRIMARY K_KEY { $expr.addKeyAliases(Collections.singletonList(k)); 
})?
-    | K_PRIMARY K_KEY '(' pkDef[expr] (',' c=ident { $expr.addColumnAlias(c); 
} )* ')'
+    : k=ident v=comparatorType (K_STATIC { isStatic = true; })? { 
$stmt.addColumn(k, v, isStatic); }
+        (K_PRIMARY K_KEY { $stmt.setPartitionKeyColumn(k); })?
+    | K_PRIMARY K_KEY '(' tablePartitionKey[stmt] (',' c=ident { 
$stmt.markClusteringColumn(c); } )* ')'
     ;
 
-pkDef[CreateTableStatement.RawStatement expr]
+tablePartitionKey[CreateTableStatement.Raw stmt]
     @init {List<ColumnIdentifier> l = new ArrayList<ColumnIdentifier>();}
-    @after{ $expr.addKeyAliases(l); }
+    @after{ $stmt.setPartitionKeyColumns(l); }
     : k1=ident { l.add(k1);}
     | '(' k1=ident { l.add(k1); } ( ',' kn=ident { l.add(kn); } )* ')'
     ;
 
-cfamProperty[CFProperties props]
-    : property[props.properties]
-    | K_COMPACT K_STORAGE { $props.setCompactStorage(); }
-    | K_CLUSTERING K_ORDER K_BY '(' cfamOrdering[props] (',' 
cfamOrdering[props])* ')'
+tableProperty[CreateTableStatement.Raw stmt]
+    : property[stmt.attrs]
+    | K_COMPACT K_STORAGE { $stmt.useCompactStorage(); }
+    | K_CLUSTERING K_ORDER K_BY '(' tableClusteringOrder[stmt] (',' 
tableClusteringOrder[stmt])* ')'
     ;
 
-cfamOrdering[CFProperties props]
-    @init{ boolean reversed=false; }
-    : k=ident (K_ASC | K_DESC { reversed=true;} ) { $props.setOrdering(k, 
reversed); }
+tableClusteringOrder[CreateTableStatement.Raw stmt]
+    @init{ boolean ascending = true; }
+    : k=ident (K_ASC | K_DESC { ascending = false; } ) { 
$stmt.extendClusteringOrder(k, ascending); }
     ;
 
-
 /**
  * CREATE TYPE foo (
  *    <name1> <type1>,
@@ -791,34 +790,33 @@ cfamOrdering[CFProperties props]
  *    ....
  * )
  */
-createTypeStatement returns [CreateTypeStatement expr]
+createTypeStatement returns [CreateTypeStatement.Raw stmt]
     @init { boolean ifNotExists = false; }
     : K_CREATE K_TYPE (K_IF K_NOT K_EXISTS { ifNotExists = true; } )?
-         tn=userTypeName { $expr = new CreateTypeStatement(tn, ifNotExists); }
-         '(' typeColumns[expr] ( ',' typeColumns[expr]? )* ')'
+         tn=userTypeName { $stmt = new CreateTypeStatement.Raw(tn, 
ifNotExists); }
+         '(' typeColumns[stmt] ( ',' typeColumns[stmt]? )* ')'
     ;
 
-typeColumns[CreateTypeStatement expr]
-    : k=fident v=comparatorType { $expr.addDefinition(k, v); }
+typeColumns[CreateTypeStatement.Raw stmt]
+    : k=fident v=comparatorType { $stmt.addField(k, v); }
     ;
 
-
 /**
  * CREATE INDEX [IF NOT EXISTS] [indexName] ON <columnFamily> (<columnName>);
  * CREATE CUSTOM INDEX [IF NOT EXISTS] [indexName] ON <columnFamily> 
(<columnName>) USING <indexClass>;
  */
-createIndexStatement returns [CreateIndexStatement expr]
+createIndexStatement returns [CreateIndexStatement.Raw stmt]
     @init {
-        IndexPropDefs props = new IndexPropDefs();
+        IndexAttributes props = new IndexAttributes();
         boolean ifNotExists = false;
-        IndexName name = new IndexName();
+        QualifiedName name = new QualifiedName();
         List<IndexTarget.Raw> targets = new ArrayList<>();
     }
     : K_CREATE (K_CUSTOM { props.isCustom = true; })? K_INDEX (K_IF K_NOT 
K_EXISTS { ifNotExists = true; } )?
         (idxName[name])? K_ON cf=columnFamilyName '(' (indexIdent[targets] 
(',' indexIdent[targets])*)? ')'
         (K_USING cls=STRING_LITERAL { props.customClass = $cls.text; })?
         (K_WITH properties[props])?
-      { $expr = new CreateIndexStatement(cf, name, targets, props, 
ifNotExists); }
+      { $stmt = new CreateIndexStatement.Raw(cf, name, targets, props, 
ifNotExists); }
     ;
 
 indexIdent [List<IndexTarget.Raw> targets]
@@ -837,54 +835,71 @@ indexIdent [List<IndexTarget.Raw> targets]
  *  PRIMARY KEY (<pkColumns>)
  *  WITH <property> = <value> AND ...;
  */
-createMaterializedViewStatement returns [CreateViewStatement expr]
+createMaterializedViewStatement returns [CreateViewStatement.Raw stmt]
     @init {
         boolean ifNotExists = false;
-        List<ColumnMetadata.Raw> partitionKeys = new ArrayList<>();
-        List<ColumnMetadata.Raw> compositeKeys = new ArrayList<>();
     }
     : K_CREATE K_MATERIALIZED K_VIEW (K_IF K_NOT K_EXISTS { ifNotExists = 
true; })? cf=columnFamilyName K_AS
         K_SELECT sclause=selectors K_FROM basecf=columnFamilyName
         (K_WHERE wclause=whereClause)?
-        K_PRIMARY K_KEY (
-        '(' '(' k1=cident { partitionKeys.add(k1); } ( ',' kn=cident { 
partitionKeys.add(kn); } )* ')' ( ',' c1=cident { compositeKeys.add(c1); } )* 
')'
-    |   '(' k1=cident { partitionKeys.add(k1); } ( ',' cn=cident { 
compositeKeys.add(cn); } )* ')'
-        )
         {
              WhereClause where = wclause == null ? WhereClause.empty() : 
wclause.build();
-             $expr = new CreateViewStatement(cf, basecf, sclause, where, 
partitionKeys, compositeKeys, ifNotExists);
+             $stmt = new CreateViewStatement.Raw(basecf, cf, sclause, where, 
ifNotExists);
         }
-        ( K_WITH cfamProperty[expr.properties] ( K_AND 
cfamProperty[expr.properties] )*)?
+        viewPrimaryKey[stmt]
+        ( K_WITH viewProperty[stmt] ( K_AND viewProperty[stmt] )*)?
+    ;
+
+viewPrimaryKey[CreateViewStatement.Raw stmt]
+    : K_PRIMARY K_KEY '(' viewPartitionKey[stmt] (',' c=ident { 
$stmt.markClusteringColumn(c); } )* ')'
+    ;
+
+viewPartitionKey[CreateViewStatement.Raw stmt]
+    @init {List<ColumnIdentifier> l = new ArrayList<ColumnIdentifier>();}
+    @after{ $stmt.setPartitionKeyColumns(l); }
+    : k1=ident { l.add(k1);}
+    | '(' k1=ident { l.add(k1); } ( ',' kn=ident { l.add(kn); } )* ')'
+    ;
+
+viewProperty[CreateViewStatement.Raw stmt]
+    : property[stmt.attrs]
+    | K_COMPACT K_STORAGE { $stmt.useCompactStorage(); }
+    | K_CLUSTERING K_ORDER K_BY '(' viewClusteringOrder[stmt] (',' 
viewClusteringOrder[stmt])* ')'
+    ;
+
+viewClusteringOrder[CreateViewStatement.Raw stmt]
+    @init{ boolean ascending = true; }
+    : k=ident (K_ASC | K_DESC { ascending = false; } ) { 
$stmt.extendClusteringOrder(k, ascending); }
     ;
 
 /**
  * CREATE TRIGGER triggerName ON columnFamily USING 'triggerClass';
  */
-createTriggerStatement returns [CreateTriggerStatement expr]
+createTriggerStatement returns [CreateTriggerStatement.Raw stmt]
     @init {
         boolean ifNotExists = false;
     }
     : K_CREATE K_TRIGGER (K_IF K_NOT K_EXISTS { ifNotExists = true; } )? 
(name=cident)
         K_ON cf=columnFamilyName K_USING cls=STRING_LITERAL
-      { $expr = new CreateTriggerStatement(cf, name.rawText(), $cls.text, 
ifNotExists); }
+      { $stmt = new CreateTriggerStatement.Raw(cf, name.rawText(), $cls.text, 
ifNotExists); }
     ;
 
 /**
  * DROP TRIGGER [IF EXISTS] triggerName ON columnFamily;
  */
-dropTriggerStatement returns [DropTriggerStatement expr]
+dropTriggerStatement returns [DropTriggerStatement.Raw stmt]
      @init { boolean ifExists = false; }
     : K_DROP K_TRIGGER (K_IF K_EXISTS { ifExists = true; } )? (name=cident) 
K_ON cf=columnFamilyName
-      { $expr = new DropTriggerStatement(cf, name.rawText(), ifExists); }
+      { $stmt = new DropTriggerStatement.Raw(cf, name.rawText(), ifExists); }
     ;
 
 /**
  * ALTER KEYSPACE <KS> WITH <property> = <value>;
  */
-alterKeyspaceStatement returns [AlterKeyspaceStatement expr]
+alterKeyspaceStatement returns [AlterKeyspaceStatement.Raw stmt]
     @init { KeyspaceAttributes attrs = new KeyspaceAttributes(); }
     : K_ALTER K_KEYSPACE ks=keyspaceName
-        K_WITH properties[attrs] { $expr = new AlterKeyspaceStatement(ks, 
attrs); }
+        K_WITH properties[attrs] { $stmt = new AlterKeyspaceStatement.Raw(ks, 
attrs); }
     ;
 
 /**
@@ -929,14 +944,14 @@ cfisStatic returns [boolean isStaticColumn]
     }
     ;
 
-alterMaterializedViewStatement returns [AlterViewStatement expr]
+alterMaterializedViewStatement returns [AlterViewStatement.Raw stmt]
     @init {
         TableAttributes attrs = new TableAttributes();
     }
     : K_ALTER K_MATERIALIZED K_VIEW name=columnFamilyName
           K_WITH properties[attrs]
     {
-        $expr = new AlterViewStatement(name, attrs);
+        $stmt = new AlterViewStatement.Raw(name, attrs);
     }
     ;
 
@@ -962,43 +977,43 @@ renamedColumns returns [Map<FieldIdentifier, 
FieldIdentifier> renames]
 /**
  * DROP KEYSPACE [IF EXISTS] <KSP>;
  */
-dropKeyspaceStatement returns [DropKeyspaceStatement ksp]
+dropKeyspaceStatement returns [DropKeyspaceStatement.Raw stmt]
     @init { boolean ifExists = false; }
-    : K_DROP K_KEYSPACE (K_IF K_EXISTS { ifExists = true; } )? ks=keyspaceName 
{ $ksp = new DropKeyspaceStatement(ks, ifExists); }
+    : K_DROP K_KEYSPACE (K_IF K_EXISTS { ifExists = true; } )? ks=keyspaceName 
{ $stmt = new DropKeyspaceStatement.Raw(ks, ifExists); }
     ;
 
 /**
- * DROP COLUMNFAMILY [IF EXISTS] <CF>;
+ * DROP TABLE [IF EXISTS] <table>;
  */
-dropTableStatement returns [DropTableStatement stmt]
+dropTableStatement returns [DropTableStatement.Raw stmt]
     @init { boolean ifExists = false; }
-    : K_DROP K_COLUMNFAMILY (K_IF K_EXISTS { ifExists = true; } )? 
cf=columnFamilyName { $stmt = new DropTableStatement(cf, ifExists); }
+    : K_DROP K_COLUMNFAMILY (K_IF K_EXISTS { ifExists = true; } )? 
name=columnFamilyName { $stmt = new DropTableStatement.Raw(name, ifExists); }
     ;
 
 /**
  * DROP TYPE <name>;
  */
-dropTypeStatement returns [DropTypeStatement stmt]
+dropTypeStatement returns [DropTypeStatement.Raw stmt]
     @init { boolean ifExists = false; }
-    : K_DROP K_TYPE (K_IF K_EXISTS { ifExists = true; } )? name=userTypeName { 
$stmt = new DropTypeStatement(name, ifExists); }
+    : K_DROP K_TYPE (K_IF K_EXISTS { ifExists = true; } )? name=userTypeName { 
$stmt = new DropTypeStatement.Raw(name, ifExists); }
     ;
 
 /**
  * DROP INDEX [IF EXISTS] <INDEX_NAME>
  */
-dropIndexStatement returns [DropIndexStatement expr]
+dropIndexStatement returns [DropIndexStatement.Raw stmt]
     @init { boolean ifExists = false; }
     : K_DROP K_INDEX (K_IF K_EXISTS { ifExists = true; } )? index=indexName
-      { $expr = new DropIndexStatement(index, ifExists); }
+      { $stmt = new DropIndexStatement.Raw(index, ifExists); }
     ;
 
 /**
  * DROP MATERIALIZED VIEW [IF EXISTS] <view_name>
  */
-dropMaterializedViewStatement returns [DropViewStatement expr]
+dropMaterializedViewStatement returns [DropViewStatement.Raw stmt]
     @init { boolean ifExists = false; }
     : K_DROP K_MATERIALIZED K_VIEW (K_IF K_EXISTS { ifExists = true; } )? 
cf=columnFamilyName
-      { $expr = new DropViewStatement(cf, ifExists); }
+      { $stmt = new DropViewStatement.Raw(cf, ifExists); }
     ;
 
 /**
@@ -1091,7 +1106,7 @@ dataResource returns [DataResource res]
     : K_ALL K_KEYSPACES { $res = DataResource.root(); }
     | K_KEYSPACE ks = keyspaceName { $res = DataResource.keyspace($ks.id); }
     | ( K_COLUMNFAMILY )? cf = columnFamilyName
-      { $res = DataResource.table($cf.name.getKeyspace(), 
$cf.name.getColumnFamily()); }
+      { $res = DataResource.table($cf.name.getKeyspace(), $cf.name.getName()); 
}
     ;
 
 jmxResource returns [JMXResource res]
@@ -1299,17 +1314,17 @@ noncol_ident returns [ColumnIdentifier id]
 
 // Keyspace & Column family names
 keyspaceName returns [String id]
-    @init { CFName name = new CFName(); }
+    @init { QualifiedName name = new QualifiedName(); }
     : ksName[name] { $id = name.getKeyspace(); }
     ;
 
-indexName returns [IndexName name]
-    @init { $name = new IndexName(); }
+indexName returns [QualifiedName name]
+    @init { $name = new QualifiedName(); }
     : (ksName[name] '.')? idxName[name]
     ;
 
-columnFamilyName returns [CFName name]
-    @init { $name = new CFName(); }
+columnFamilyName returns [QualifiedName name]
+    @init { $name = new QualifiedName(); }
     : (ksName[name] '.')? cfName[name]
     ;
 
@@ -1322,24 +1337,24 @@ userOrRoleName returns [RoleName name]
     : roleName[role] {$name = role;}
     ;
 
-ksName[KeyspaceElementName name]
+ksName[QualifiedName name]
     : t=IDENT              { $name.setKeyspace($t.text, false);}
     | t=QUOTED_NAME        { $name.setKeyspace($t.text, true);}
     | k=unreserved_keyword { $name.setKeyspace(k, false);}
     | QMARK {addRecognitionError("Bind variables cannot be used for keyspace 
names");}
     ;
 
-cfName[CFName name]
-    : t=IDENT              { $name.setColumnFamily($t.text, false); }
-    | t=QUOTED_NAME        { $name.setColumnFamily($t.text, true); }
-    | k=unreserved_keyword { $name.setColumnFamily(k, false); }
+cfName[QualifiedName name]
+    : t=IDENT              { $name.setName($t.text, false); }
+    | t=QUOTED_NAME        { $name.setName($t.text, true); }
+    | k=unreserved_keyword { $name.setName(k, false); }
     | QMARK {addRecognitionError("Bind variables cannot be used for table 
names");}
     ;
 
-idxName[IndexName name]
-    : t=IDENT              { $name.setIndex($t.text, false); }
-    | t=QUOTED_NAME        { $name.setIndex($t.text, true);}
-    | k=unreserved_keyword { $name.setIndex(k, false); }
+idxName[QualifiedName name]
+    : t=IDENT              { $name.setName($t.text, false); }
+    | t=QUOTED_NAME        { $name.setName($t.text, true);}
+    | k=unreserved_keyword { $name.setName(k, false); }
     | QMARK {addRecognitionError("Bind variables cannot be used for index 
names");}
     ;
 
@@ -1675,7 +1690,7 @@ comparatorType returns [CQL3Type.Raw t]
     | K_FROZEN '<' f=comparatorType '>'
       {
         try {
-            $t = CQL3Type.Raw.frozen(f);
+            $t = f.freeze();
         } catch (InvalidRequestException e) {
             addRecognitionError(e.getMessage());
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/auth/AuthKeyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/AuthKeyspace.java 
b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
index a7079dc..82bca5b 100644
--- a/src/java/org/apache/cassandra/auth/AuthKeyspace.java
+++ b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
@@ -19,7 +19,7 @@ package org.apache.cassandra.auth;
 
 import java.util.concurrent.TimeUnit;
 
-import org.apache.cassandra.cql3.statements.CreateTableStatement;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.SchemaConstants;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java 
b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
index 6509798..ea4755f 100644
--- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
@@ -30,8 +30,6 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.statements.BatchStatement;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
@@ -39,13 +37,11 @@ import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.*;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.serializers.SetSerializer;
 import org.apache.cassandra.serializers.UTF8Serializer;
 import org.apache.cassandra.service.ClientState;
-
-import org.apache.cassandra.cql3.QueryOptions;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -126,7 +122,7 @@ public class CassandraAuthorizer implements IAuthorizer
                                                               
AuthKeyspace.RESOURCE_ROLE_INDEX,
                                                               
escape(row.getString("resource")),
                                                               
escape(revokee.getRoleName())),
-                                                
ClientState.forInternalCalls()).statement);
+                                                
ClientState.forInternalCalls()));
 
             }
 
@@ -134,7 +130,7 @@ public class CassandraAuthorizer implements IAuthorizer
                                                                      
SchemaConstants.AUTH_KEYSPACE_NAME,
                                                                      
AuthKeyspace.ROLE_PERMISSIONS,
                                                                      
escape(revokee.getRoleName())),
-                                                       
ClientState.forInternalCalls()).statement);
+                                                       
ClientState.forInternalCalls()));
 
             executeLoggedBatch(statements);
         }
@@ -164,14 +160,14 @@ public class CassandraAuthorizer implements IAuthorizer
                                                                          
AuthKeyspace.ROLE_PERMISSIONS,
                                                                          
escape(row.getString("role")),
                                                                          
escape(droppedResource.getName())),
-                                                           
ClientState.forInternalCalls()).statement);
+                                                           
ClientState.forInternalCalls()));
             }
 
             statements.add(QueryProcessor.getStatement(String.format("DELETE 
FROM %s.%s WHERE resource = '%s'",
                                                                      
SchemaConstants.AUTH_KEYSPACE_NAME,
                                                                      
AuthKeyspace.RESOURCE_ROLE_INDEX,
                                                                      
escape(droppedResource.getName())),
-                                                                               
ClientState.forInternalCalls()).statement);
+                                                      
ClientState.forInternalCalls()));
 
             executeLoggedBatch(statements);
         }
@@ -185,8 +181,8 @@ public class CassandraAuthorizer implements IAuthorizer
     private void executeLoggedBatch(List<CQLStatement> statements)
     throws RequestExecutionException, RequestValidationException
     {
-        BatchStatement batch = new BatchStatement(0,
-                                                  BatchStatement.Type.LOGGED,
+        BatchStatement batch = new BatchStatement(BatchStatement.Type.LOGGED,
+                                                  
VariableSpecifications.empty(),
                                                   
Lists.newArrayList(Iterables.filter(statements, ModificationStatement.class)),
                                                   Attributes.none());
         QueryProcessor.instance.processBatch(batch,
@@ -379,7 +375,7 @@ public class CassandraAuthorizer implements IAuthorizer
                                      SchemaConstants.AUTH_KEYSPACE_NAME,
                                      permissionsTable,
                                      entityname);
-        return (SelectStatement) QueryProcessor.getStatement(query, 
ClientState.forInternalCalls()).statement;
+        return (SelectStatement) QueryProcessor.getStatement(query, 
ClientState.forInternalCalls());
     }
 
     /**
@@ -401,12 +397,12 @@ public class CassandraAuthorizer implements IAuthorizer
                                                               "VALUES (?, ?, 
?)",
                                                               
SchemaConstants.AUTH_KEYSPACE_NAME,
                                                               
AuthKeyspace.ROLE_PERMISSIONS),
-                                                
ClientState.forInternalCalls()).statement;
+                                                
ClientState.forInternalCalls());
                 CQLStatement indexStatement =
                     QueryProcessor.getStatement(String.format("INSERT INTO 
%s.%s (resource, role) VALUES (?,?)",
                                                               
SchemaConstants.AUTH_KEYSPACE_NAME,
                                                               
AuthKeyspace.RESOURCE_ROLE_INDEX),
-                                                
ClientState.forInternalCalls()).statement;
+                                                
ClientState.forInternalCalls());
 
                 UntypedResultSet permissions = process("SELECT * FROM 
system_auth.permissions");
                 for (UntypedResultSet.Row row : permissions)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java 
b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
index 0591760..ef19d48 100644
--- a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
+++ b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
@@ -39,6 +39,7 @@ import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.*;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -451,7 +452,7 @@ public class CassandraRoleManager implements IRoleManager
     {
         try
         {
-            return QueryProcessor.parseStatement(String.format(template, 
keyspace, table)).prepare().statement;
+            return QueryProcessor.parseStatement(String.format(template, 
keyspace, table)).prepare(ClientState.forInternalCalls());
         }
         catch (RequestValidationException e)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/auth/FunctionResource.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/FunctionResource.java 
b/src/java/org/apache/cassandra/auth/FunctionResource.java
index f9f51d5..3e112cb 100644
--- a/src/java/org/apache/cassandra/auth/FunctionResource.java
+++ b/src/java/org/apache/cassandra/auth/FunctionResource.java
@@ -134,6 +134,11 @@ public class FunctionResource implements IResource
         return new FunctionResource(keyspace, name, argTypes);
     }
 
+    public static FunctionResource function(Function function)
+    {
+        return new FunctionResource(function.name().keyspace, 
function.name().name, function.argTypes());
+    }
+
     /**
      * Creates a FunctionResource representing a specific, keyspace-scoped 
function.
      * This variant is used to create an instance during parsing of a CQL 
statement.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java 
b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
index 126c04d..f904e58 100644
--- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
+++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
@@ -183,7 +183,7 @@ public class PasswordAuthenticator implements IAuthenticator
 
     private static SelectStatement prepare(String query)
     {
-        return (SelectStatement) QueryProcessor.getStatement(query, 
ClientState.forInternalCalls()).statement;
+        return (SelectStatement) QueryProcessor.getStatement(query, 
ClientState.forInternalCalls());
     }
 
     private class PlainTextSaslAuthenticator implements SaslNegotiator

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java 
b/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
index 1d8f462..03e8358 100644
--- a/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
+++ b/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
@@ -52,7 +52,7 @@ import org.apache.cassandra.service.StorageService;
  *
  * Because an ObjectName may contain wildcards, meaning it represents a set of 
individual MBeans,
  * JMX resources don't fit well with the hierarchical approach modelled by 
other IResource
- * implementations and utilised by ClientState::ensureHasPermission etc. To 
enable grants to use
+ * implementations and utilised by ClientState::ensurePermission etc. To 
enable grants to use
  * pattern-type ObjectNames, this class performs its own custom matching and 
filtering of resources
  * rather than pushing that down to the configured IAuthorizer. To that end, 
during authorization
  * it pulls back all permissions for the active subject, filtering them to 
retain only grants on

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/CFName.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CFName.java 
b/src/java/org/apache/cassandra/cql3/CFName.java
deleted file mode 100644
index 3f4a118..0000000
--- a/src/java/org/apache/cassandra/cql3/CFName.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.cql3;
-
-public class CFName extends KeyspaceElementName
-{
-    private String cfName;
-
-    public void setColumnFamily(String cf, boolean keepCase)
-    {
-        cfName = toInternalName(cf, keepCase);
-    }
-
-    public String getColumnFamily()
-    {
-        return cfName;
-    }
-
-    @Override
-    public String toString()
-    {
-        return super.toString() + cfName;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/CQL3Type.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CQL3Type.java 
b/src/java/org/apache/cassandra/cql3/CQL3Type.java
index d387a25..340a992 100644
--- a/src/java/org/apache/cassandra/cql3/CQL3Type.java
+++ b/src/java/org/apache/cassandra/cql3/CQL3Type.java
@@ -37,6 +37,8 @@ import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static java.util.stream.Collectors.toList;
+
 public interface CQL3Type
 {
     static final Logger logger = LoggerFactory.getLogger(CQL3Type.class);
@@ -88,7 +90,7 @@ public interface CQL3Type
 
         private final AbstractType<?> type;
 
-        private Native(AbstractType<?> type)
+        Native(AbstractType<?> type)
         {
             this.type = type;
         }
@@ -482,7 +484,12 @@ public interface CQL3Type
     // actual type used, so Raw is a "not yet prepared" CQL3Type.
     public abstract class Raw
     {
-        protected boolean frozen = false;
+        protected final boolean frozen;
+
+        protected Raw(boolean frozen)
+        {
+            this.frozen = frozen;
+        }
 
         public abstract boolean supportsFreezing();
 
@@ -491,11 +498,6 @@ public interface CQL3Type
             return this.frozen;
         }
 
-        public boolean canBeNonFrozen()
-        {
-            return true;
-        }
-
         public boolean isDuration()
         {
             return false;
@@ -516,7 +518,7 @@ public interface CQL3Type
             return null;
         }
 
-        public void freeze() throws InvalidRequestException
+        public Raw freeze()
         {
             String message = String.format("frozen<> is only allowed on 
collections, tuples, and user-defined types (got %s)", this);
             throw new InvalidRequestException(message);
@@ -544,46 +546,41 @@ public interface CQL3Type
 
         public static Raw from(CQL3Type type)
         {
-            return new RawType(type);
+            return new RawType(type, false);
         }
 
         public static Raw userType(UTName name)
         {
-            return new RawUT(name);
+            return new RawUT(name, false);
         }
 
         public static Raw map(CQL3Type.Raw t1, CQL3Type.Raw t2)
         {
-            return new RawCollection(CollectionType.Kind.MAP, t1, t2);
+            return new RawCollection(CollectionType.Kind.MAP, t1, t2, false);
         }
 
         public static Raw list(CQL3Type.Raw t)
         {
-            return new RawCollection(CollectionType.Kind.LIST, null, t);
+            return new RawCollection(CollectionType.Kind.LIST, null, t, false);
         }
 
         public static Raw set(CQL3Type.Raw t)
         {
-            return new RawCollection(CollectionType.Kind.SET, null, t);
+            return new RawCollection(CollectionType.Kind.SET, null, t, false);
         }
 
         public static Raw tuple(List<CQL3Type.Raw> ts)
         {
-            return new RawTuple(ts);
-        }
-
-        public static Raw frozen(CQL3Type.Raw t) throws InvalidRequestException
-        {
-            t.freeze();
-            return t;
+            return new RawTuple(ts, false);
         }
 
         private static class RawType extends Raw
         {
             private final CQL3Type type;
 
-            private RawType(CQL3Type type)
+            private RawType(CQL3Type type, boolean frozen)
             {
+                super(frozen);
                 this.type = type;
             }
 
@@ -620,20 +617,28 @@ public interface CQL3Type
             private final CQL3Type.Raw keys;
             private final CQL3Type.Raw values;
 
-            private RawCollection(CollectionType.Kind kind, CQL3Type.Raw keys, 
CQL3Type.Raw values)
+            private RawCollection(CollectionType.Kind kind, CQL3Type.Raw keys, 
CQL3Type.Raw values, boolean frozen)
             {
+                super(frozen);
                 this.kind = kind;
                 this.keys = keys;
                 this.values = values;
             }
 
-            public void freeze() throws InvalidRequestException
+            @Override
+            public RawCollection freeze()
             {
-                if (keys != null && keys.supportsFreezing())
-                    keys.freeze();
-                if (values != null && values.supportsFreezing())
-                    values.freeze();
-                frozen = true;
+                CQL3Type.Raw frozenKeys =
+                    null != keys && keys.supportsFreezing()
+                  ? keys.freeze()
+                  : keys;
+
+                CQL3Type.Raw frozenValues =
+                    null != values && values.supportsFreezing()
+                  ? values.freeze()
+                  : values;
+
+                return new RawCollection(kind, frozenKeys, frozenValues, true);
             }
 
             public boolean supportsFreezing()
@@ -727,8 +732,9 @@ public interface CQL3Type
         {
             private final UTName name;
 
-            private RawUT(UTName name)
+            private RawUT(UTName name, boolean frozen)
             {
+                super(frozen);
                 this.name = name;
             }
 
@@ -737,14 +743,10 @@ public interface CQL3Type
                 return name.getKeyspace();
             }
 
-            public void freeze()
-            {
-                frozen = true;
-            }
-
-            public boolean canBeNonFrozen()
+            @Override
+            public RawUT freeze()
             {
-                return true;
+                return new RawUT(name, true);
             }
 
             public CQL3Type prepare(String keyspace, Types udts) throws 
InvalidRequestException
@@ -801,8 +803,9 @@ public interface CQL3Type
         {
             private final List<CQL3Type.Raw> types;
 
-            private RawTuple(List<CQL3Type.Raw> types)
+            private RawTuple(List<CQL3Type.Raw> types, boolean frozen)
             {
+                super(frozen);
                 this.types = types;
             }
 
@@ -811,22 +814,22 @@ public interface CQL3Type
                 return true;
             }
 
-            public void freeze() throws InvalidRequestException
+            @Override
+            public RawTuple freeze()
             {
-                for (CQL3Type.Raw t : types)
-                    if (t.supportsFreezing())
-                        t.freeze();
-
-                frozen = true;
+                List<CQL3Type.Raw> frozenTypes =
+                    types.stream()
+                         .map(t -> t.supportsFreezing() ? t.freeze() : t)
+                         .collect(toList());
+                return new RawTuple(frozenTypes, true);
             }
 
             public CQL3Type prepare(String keyspace, Types udts) throws 
InvalidRequestException
             {
-                if (!frozen)
-                    freeze();
+                RawTuple raw = frozen ? this : freeze();
 
-                List<AbstractType<?>> ts = new ArrayList<>(types.size());
-                for (CQL3Type.Raw t : types)
+                List<AbstractType<?>> ts = new ArrayList<>(raw.types.size());
+                for (CQL3Type.Raw t : raw.types)
                 {
                     if (t.isCounter())
                         throw new InvalidRequestException("Counters are not 
allowed inside tuples");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/CQLStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/CQLStatement.java 
b/src/java/org/apache/cassandra/cql3/CQLStatement.java
index 901ecd4..fc9fd71 100644
--- a/src/java/org/apache/cassandra/cql3/CQLStatement.java
+++ b/src/java/org/apache/cassandra/cql3/CQLStatement.java
@@ -17,8 +17,10 @@
  */
 package org.apache.cassandra.cql3;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.cassandra.cql3.functions.Function;
-import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.ResultMessage;
@@ -26,24 +28,46 @@ import 
org.apache.cassandra.transport.messages.ResultMessage;
 public interface CQLStatement
 {
     /**
-     * Returns the number of bound terms in this statement.
+     * Returns all bind variables for the statement
+     */
+    default List<ColumnSpecification> getBindVariables()
+    {
+        return Collections.emptyList();
+    }
+
+    /**
+     * Returns an array with the same length as the number of partition key 
columns for the table corresponding
+     * to table.  Each short in the array represents the bind index of the 
marker that holds the value for that
+     * partition key column. If there are no bind markers for any of the 
partition key columns, null is returned.
+     */
+    default short[] getPartitionKeyBindVariableIndexes()
+    {
+        return null;
+    }
+
+    /**
+     * Return an Iterable over all of the functions (both native and 
user-defined) used by any component of the statement
+     *
+     * @return functions all functions found (may contain duplicates)
      */
-    public int getBoundTerms();
+    default Iterable<Function> getFunctions()
+    {
+        return Collections.emptyList();
+    }
 
     /**
      * Perform any access verification necessary for the statement.
      *
      * @param state the current client state
      */
-    public void checkAccess(ClientState state) throws UnauthorizedException, 
InvalidRequestException;
+    public void authorize(ClientState state);
 
     /**
-     * Perform additional validation required by the statment.
-     * To be overriden by subclasses if needed.
+     * Perform additional validation required by the statment. To be overriden 
by subclasses if needed.
      *
      * @param state the current client state
      */
-    public void validate(ClientState state) throws RequestValidationException;
+    public void validate(ClientState state);
 
     /**
      * Execute the statement and return the resulting result or null if there 
is no result.
@@ -52,19 +76,24 @@ public interface CQLStatement
      * @param options options for this query (consistency, variables, 
pageSize, ...)
      * @param queryStartNanoTime the timestamp returned by System.nanoTime() 
when this statement was received
      */
-    public ResultMessage execute(QueryState state, QueryOptions options, long 
queryStartNanoTime) throws RequestValidationException, 
RequestExecutionException;
+    public ResultMessage execute(QueryState state, QueryOptions options, long 
queryStartNanoTime);
 
     /**
      * Variant of execute used for internal query against the system tables, 
and thus only query the local node.
      *
      * @param state the current query state
      */
-    public ResultMessage executeInternal(QueryState state, QueryOptions 
options) throws RequestValidationException, RequestExecutionException;
+    public ResultMessage executeLocally(QueryState state, QueryOptions 
options);
 
-    /**
-     * Return an Iterable over all of the functions (both native and 
user-defined) used by any component
-     * of the statement
-     * @return functions all functions found (may contain duplicates)
-     */
-    public Iterable<Function> getFunctions();
+    public static abstract class Raw
+    {
+        protected VariableSpecifications bindVariables;
+
+        public void setBindVariables(List<ColumnIdentifier> variables)
+        {
+            bindVariables = new VariableSpecifications(variables);
+        }
+
+        public abstract CQLStatement prepare(ClientState state);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java 
b/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
index 32cddba..0906d2a 100644
--- a/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
+++ b/src/java/org/apache/cassandra/cql3/CustomPayloadMirroringQueryHandler.java
@@ -21,7 +21,6 @@ import java.nio.ByteBuffer;
 import java.util.Map;
 
 import org.apache.cassandra.cql3.statements.BatchStatement;
-import org.apache.cassandra.cql3.statements.ParsedStatement;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.ResultMessage;
@@ -54,7 +53,7 @@ public class CustomPayloadMirroringQueryHandler implements 
QueryHandler
         return prepared;
     }
 
-    public ParsedStatement.Prepared getPrepared(MD5Digest id)
+    public QueryProcessor.Prepared getPrepared(MD5Digest id)
     {
         return queryProcessor.getPrepared(id);
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/IndexName.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/IndexName.java 
b/src/java/org/apache/cassandra/cql3/IndexName.java
deleted file mode 100644
index d7ff8ff..0000000
--- a/src/java/org/apache/cassandra/cql3/IndexName.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.cql3;
-
-public final class IndexName extends KeyspaceElementName
-{
-    private String idxName;
-
-    public void setIndex(String idx, boolean keepCase)
-    {
-        idxName = toInternalName(idx, keepCase);
-    }
-
-    public String getIdx()
-    {
-        return idxName;
-    }
-
-    public CFName getCfName()
-    {
-        CFName cfName = new CFName();
-        if (hasKeyspace())
-            cfName.setKeyspace(getKeyspace(), true);
-       return cfName;
-    }
-
-    @Override
-    public String toString()
-    {
-        return super.toString() + idxName;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/KeyspaceElementName.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/KeyspaceElementName.java 
b/src/java/org/apache/cassandra/cql3/KeyspaceElementName.java
deleted file mode 100644
index 0a68997..0000000
--- a/src/java/org/apache/cassandra/cql3/KeyspaceElementName.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.cql3;
-
-import java.util.Locale;
-
-/**
- * Base class for the names of the keyspace elements (e.g. table, index ...)
- */
-abstract class KeyspaceElementName
-{
-    /**
-     * The keyspace name as stored internally.
-     */
-    private String ksName;
-
-    /**
-     * Sets the keyspace.
-     *
-     * @param ks the keyspace name
-     * @param keepCase <code>true</code> if the case must be kept, 
<code>false</code> otherwise.
-     */
-    public final void setKeyspace(String ks, boolean keepCase)
-    {
-        ksName = toInternalName(ks, keepCase);
-    }
-
-    /**
-     * Checks if the keyspace is specified.
-     * @return <code>true</code> if the keyspace is specified, 
<code>false</code> otherwise.
-     */
-    public final boolean hasKeyspace()
-    {
-        return ksName != null;
-    }
-
-    public final String getKeyspace()
-    {
-        return ksName;
-    }
-
-    /**
-     * Converts the specified name into the name used internally.
-     *
-     * @param name the name
-     * @param keepCase <code>true</code> if the case must be kept, 
<code>false</code> otherwise.
-     * @return the name used internally.
-     */
-    protected static String toInternalName(String name, boolean keepCase)
-    {
-        return keepCase ? name : name.toLowerCase(Locale.US);
-    }
-
-    @Override
-    public String toString()
-    {
-        return hasKeyspace() ? (getKeyspace() + ".") : "";
-    }
-}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/QualifiedName.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/QualifiedName.java 
b/src/java/org/apache/cassandra/cql3/QualifiedName.java
new file mode 100644
index 0000000..4d61ffa
--- /dev/null
+++ b/src/java/org/apache/cassandra/cql3/QualifiedName.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.cql3;
+
+import java.util.Locale;
+
+/**
+ * CLass for the names of the keyspace-prefixed elements (e.g. table, index, 
view names)
+ */
+public class QualifiedName
+{
+    /**
+     * The keyspace name as stored internally.
+     */
+    private String keyspace;
+    private String name;
+
+    public QualifiedName()
+    {
+    }
+
+    public QualifiedName(String keyspace, String name)
+    {
+        this.keyspace = keyspace;
+        this.name = name;
+    }
+
+    /**
+     * Sets the keyspace.
+     *
+     * @param ks the keyspace name
+     * @param keepCase <code>true</code> if the case must be kept, 
<code>false</code> otherwise.
+     */
+    public final void setKeyspace(String ks, boolean keepCase)
+    {
+        keyspace = toInternalName(ks, keepCase);
+    }
+
+    /**
+     * Checks if the keyspace is specified.
+     * @return <code>true</code> if the keyspace is specified, 
<code>false</code> otherwise.
+     */
+    public final boolean hasKeyspace()
+    {
+        return keyspace != null;
+    }
+
+    public final String getKeyspace()
+    {
+        return keyspace;
+    }
+
+    public void setName(String cf, boolean keepCase)
+    {
+        name = toInternalName(cf, keepCase);
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    @Override
+    public String toString()
+    {
+        return hasKeyspace()
+             ? String.format("%s.%s", keyspace, name)
+             : name;
+    }
+
+    /**
+     * Converts the specified name into the name used internally.
+     *
+     * @param name the name
+     * @param keepCase <code>true</code> if the case must be kept, 
<code>false</code> otherwise.
+     * @return the name used internally.
+     */
+    private static String toInternalName(String name, boolean keepCase)
+    {
+        return keepCase ? name : name.toLowerCase(Locale.US);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cassandra/blob/aaddbd49/src/java/org/apache/cassandra/cql3/QueryHandler.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/QueryHandler.java 
b/src/java/org/apache/cassandra/cql3/QueryHandler.java
index d3b41f0..b95453d 100644
--- a/src/java/org/apache/cassandra/cql3/QueryHandler.java
+++ b/src/java/org/apache/cassandra/cql3/QueryHandler.java
@@ -21,7 +21,6 @@ import java.nio.ByteBuffer;
 import java.util.Map;
 
 import org.apache.cassandra.cql3.statements.BatchStatement;
-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;
@@ -41,7 +40,7 @@ public interface QueryHandler
                                    ClientState clientState,
                                    Map<String, ByteBuffer> customPayload) 
throws RequestValidationException;
 
-    ParsedStatement.Prepared getPrepared(MD5Digest id);
+    QueryProcessor.Prepared getPrepared(MD5Digest id);
 
     ResultMessage processPrepared(CQLStatement statement,
                                   QueryState state,


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

Reply via email to