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]
