http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/service/ClientState.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java index 234ac4f..688df91 100644 --- a/src/java/org/apache/cassandra/service/ClientState.java +++ b/src/java/org/apache/cassandra/service/ClientState.java @@ -46,7 +46,6 @@ import org.apache.cassandra.exceptions.UnauthorizedException; import org.apache.cassandra.schema.SchemaKeyspace; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.JVMStabilityInspector; -import org.apache.cassandra.utils.CassandraVersion; /** * State related to a client connection. @@ -54,7 +53,6 @@ import org.apache.cassandra.utils.CassandraVersion; public class ClientState { private static final Logger logger = LoggerFactory.getLogger(ClientState.class); - public static final CassandraVersion DEFAULT_CQL_VERSION = org.apache.cassandra.cql3.QueryProcessor.CQL_VERSION; private static final Set<IResource> READABLE_SYSTEM_RESOURCES = new HashSet<>(); private static final Set<IResource> PROTECTED_AUTH_RESOURCES = new HashSet<>(); @@ -158,6 +156,13 @@ public class ClientState return new ClientState(); } + public static ClientState forInternalCalls(String keyspace) + { + ClientState state = new ClientState(); + state.setKeyspace(keyspace); + return state; + } + /** * @return a ClientState object for external clients (native protocol users). */ @@ -298,7 +303,7 @@ public class ClientState return keyspace; } - public void setKeyspace(String ks) throws InvalidRequestException + public void setKeyspace(String ks) { // Skip keyspace validation for non-authenticated users. Apparently, some client libraries // call set_keyspace() before calling login(), and we have to handle that. @@ -310,7 +315,7 @@ public class ClientState /** * Attempts to login the given user. */ - public void login(AuthenticatedUser user) throws AuthenticationException + public void login(AuthenticatedUser user) { // Login privilege is not inherited via granted roles, so just // verify that the role with the credentials that were actually @@ -321,40 +326,35 @@ public class ClientState throw new AuthenticationException(String.format("%s is not permitted to log in", user.getName())); } - public void hasAllKeyspacesAccess(Permission perm) throws UnauthorizedException + public void ensureAllKeyspacesPermission(Permission perm) { if (isInternal) return; validateLogin(); - ensureHasPermission(perm, DataResource.root()); + ensurePermission(perm, DataResource.root()); } - public void hasKeyspaceAccess(String keyspace, Permission perm) throws UnauthorizedException, InvalidRequestException + public void ensureKeyspacePermission(String keyspace, Permission perm) { - hasAccess(keyspace, perm, DataResource.keyspace(keyspace)); + ensurePermission(keyspace, perm, DataResource.keyspace(keyspace)); } - public void hasColumnFamilyAccess(String keyspace, String columnFamily, Permission perm) - throws UnauthorizedException, InvalidRequestException + public void ensureTablePermission(String keyspace, String table, Permission perm) { - Schema.instance.validateTable(keyspace, columnFamily); - hasAccess(keyspace, perm, DataResource.table(keyspace, columnFamily)); + ensurePermission(keyspace, perm, DataResource.table(keyspace, table)); } - public void hasColumnFamilyAccess(TableMetadataRef tableRef, Permission perm) - throws UnauthorizedException, InvalidRequestException + public void ensureTablePermission(TableMetadataRef tableRef, Permission perm) { - hasColumnFamilyAccess(tableRef.get(), perm); + ensureTablePermission(tableRef.get(), perm); } - public void hasColumnFamilyAccess(TableMetadata table, Permission perm) - throws UnauthorizedException, InvalidRequestException + public void ensureTablePermission(TableMetadata table, Permission perm) { - hasAccess(table.keyspace, perm, table.resource); + ensurePermission(table.keyspace, perm, table.resource); } - private void hasAccess(String keyspace, Permission perm, DataResource resource) - throws UnauthorizedException, InvalidRequestException + private void ensurePermission(String keyspace, Permission perm, DataResource resource) { validateKeyspace(keyspace); @@ -371,11 +371,10 @@ public class ClientState if (PROTECTED_AUTH_RESOURCES.contains(resource)) if ((perm == Permission.CREATE) || (perm == Permission.ALTER) || (perm == Permission.DROP)) throw new UnauthorizedException(String.format("%s schema is protected", resource)); - - ensureHasPermission(perm, resource); + ensurePermission(perm, resource); } - public void ensureHasPermission(Permission perm, IResource resource) throws UnauthorizedException + public void ensurePermission(Permission perm, IResource resource) { if (!DatabaseDescriptor.getAuthorizer().requireAuthorization()) return; @@ -385,12 +384,12 @@ public class ClientState if (((FunctionResource)resource).getKeyspace().equals(SchemaConstants.SYSTEM_KEYSPACE_NAME)) return; - checkPermissionOnResourceChain(perm, resource); + ensurePermissionOnResourceChain(perm, resource); } - // Convenience method called from checkAccess method of CQLStatement + // Convenience method called from authorize method of CQLStatement // Also avoids needlessly creating lots of FunctionResource objects - public void ensureHasPermission(Permission permission, Function function) + public void ensurePermission(Permission permission, Function function) { // Save creating a FunctionResource is we don't need to if (!DatabaseDescriptor.getAuthorizer().requireAuthorization()) @@ -400,12 +399,12 @@ public class ClientState if (function.isNative()) return; - checkPermissionOnResourceChain(permission, FunctionResource.function(function.name().keyspace, - function.name().name, - function.argTypes())); + ensurePermissionOnResourceChain(permission, FunctionResource.function(function.name().keyspace, + function.name().name, + function.argTypes())); } - private void checkPermissionOnResourceChain(Permission perm, IResource resource) + private void ensurePermissionOnResourceChain(Permission perm, IResource resource) { for (IResource r : Resources.chain(resource)) if (authorize(r).contains(perm)) @@ -417,7 +416,7 @@ public class ClientState resource)); } - private void preventSystemKSSchemaModification(String keyspace, DataResource resource, Permission perm) throws UnauthorizedException + private void preventSystemKSSchemaModification(String keyspace, DataResource resource, Permission perm) { // we only care about DDL statements if (perm != Permission.ALTER && perm != Permission.DROP && perm != Permission.CREATE) @@ -438,7 +437,7 @@ public class ClientState } } - public void validateLogin() throws UnauthorizedException + public void validateLogin() { if (user == null) { @@ -450,20 +449,20 @@ public class ClientState } } - public void ensureNotAnonymous() throws UnauthorizedException + public void ensureNotAnonymous() { validateLogin(); if (user.isAnonymous()) throw new UnauthorizedException("You have to be logged in and not anonymous to perform this request"); } - public void ensureIsSuper(String message) throws UnauthorizedException + public void ensureIsSuperuser(String message) { if (DatabaseDescriptor.getAuthenticator().requireAuthentication() && (user == null || !user.isSuper())) throw new UnauthorizedException(message); } - private static void validateKeyspace(String keyspace) throws InvalidRequestException + private static void validateKeyspace(String keyspace) { if (keyspace == null) throw new InvalidRequestException("You have not set a keyspace for this session"); @@ -474,11 +473,6 @@ public class ClientState return user; } - public static CassandraVersion[] getCQLSupportedVersion() - { - return new CassandraVersion[]{ QueryProcessor.CQL_VERSION }; - } - private Set<Permission> authorize(IResource resource) { return user.getPermissions(resource);
http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 96fd63f..cc02e17 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -65,6 +65,7 @@ import org.apache.cassandra.concurrent.Stage; import org.apache.cassandra.concurrent.StageManager; import org.apache.cassandra.config.Config; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.db.*; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.compaction.CompactionManager; @@ -631,8 +632,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public synchronized void initServer(int delay) throws ConfigurationException { logger.info("Cassandra version: {}", FBUtilities.getReleaseVersionString()); - logger.info("CQL supported versions: {} (default: {})", - StringUtils.join(ClientState.getCQLSupportedVersion(), ", "), ClientState.DEFAULT_CQL_VERSION); + logger.info("CQL version: {}", QueryProcessor.CQL_VERSION); logger.info("Native protocol supported versions: {} (default: {})", StringUtils.join(ProtocolVersion.supportedVersions(), ", "), ProtocolVersion.CURRENT); @@ -1590,7 +1590,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE for (String keyspace : Schema.instance.getUserKeyspaces()) { for (ViewMetadata view: Schema.instance.getKeyspaceMetadata(keyspace).views) - SystemKeyspace.finishViewBuildStatus(view.keyspace, view.name); + SystemKeyspace.finishViewBuildStatus(view.keyspace(), view.name()); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java index 1116575..b88bf0a 100644 --- a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java +++ b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java @@ -93,7 +93,7 @@ public class SSTableOfflineRelevel Schema.instance.loadFromDisk(false); if (Schema.instance.getTableMetadataRef(keyspace, columnfamily) == null) - throw new IllegalArgumentException(String.format("Unknown keyspace/columnFamily %s.%s", + throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s", keyspace, columnfamily)); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/tracing/TraceKeyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java index c29760e..6477d8c 100644 --- a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java +++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java @@ -22,7 +22,7 @@ import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.TimeUnit; -import org.apache.cassandra.cql3.statements.CreateTableStatement; +import org.apache.cassandra.cql3.statements.schema.CreateTableStatement; import org.apache.cassandra.db.Mutation; import org.apache.cassandra.db.partitions.PartitionUpdate; import org.apache.cassandra.db.rows.Row; http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/Event.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/Event.java b/src/java/org/apache/cassandra/transport/Event.java index 77edf8a..254e1e1 100644 --- a/src/java/org/apache/cassandra/transport/Event.java +++ b/src/java/org/apache/cassandra/transport/Event.java @@ -23,7 +23,10 @@ import java.util.Iterator; import java.util.List; import com.google.common.base.Objects; + import io.netty.buffer.ByteBuf; +import org.apache.cassandra.cql3.functions.UDAggregate; +import org.apache.cassandra.cql3.functions.UDFunction; import org.apache.cassandra.locator.InetAddressAndPort; public abstract class Event @@ -268,6 +271,16 @@ public abstract class Event this(change, Target.KEYSPACE, keyspace, null); } + public static SchemaChange forFunction(Change change, UDFunction function) + { + return new SchemaChange(change, Target.FUNCTION, function.name().keyspace, function.name().name, function.argumentsList()); + } + + public static SchemaChange forAggregate(Change change, UDAggregate aggregate) + { + return new SchemaChange(change, Target.AGGREGATE, aggregate.name().keyspace, aggregate.name().name, aggregate.argumentsList()); + } + // Assumes the type has already been deserialized public static SchemaChange deserializeEvent(ByteBuf cb, ProtocolVersion version) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/BatchMessage.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java index 5ffadac..29f92f7 100644 --- a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java @@ -29,12 +29,13 @@ import org.apache.cassandra.audit.AuditLogEntry; import org.apache.cassandra.audit.AuditLogEntryType; import org.apache.cassandra.cql3.Attributes; import org.apache.cassandra.cql3.BatchQueryOptions; +import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.QueryHandler; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.cql3.QueryProcessor; +import org.apache.cassandra.cql3.VariableSpecifications; import org.apache.cassandra.cql3.statements.BatchStatement; import org.apache.cassandra.cql3.statements.ModificationStatement; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.PreparedQueryNotFoundException; import org.apache.cassandra.service.ClientState; @@ -182,27 +183,28 @@ public class BatchMessage extends Message.Request } QueryHandler handler = ClientState.getCQLQueryHandler(); - List<ParsedStatement.Prepared> prepared = new ArrayList<>(queryOrIdList.size()); + List<QueryHandler.Prepared> prepared = new ArrayList<>(queryOrIdList.size()); for (int i = 0; i < queryOrIdList.size(); i++) { Object query = queryOrIdList.get(i); - ParsedStatement.Prepared p; + CQLStatement statement; + QueryHandler.Prepared p; if (query instanceof String) { - p = QueryProcessor.parseStatement((String)query, - state.getClientState().cloneWithKeyspaceIfSet(options.getKeyspace())); + statement = QueryProcessor.parseStatement((String)query, state.getClientState().cloneWithKeyspaceIfSet(options.getKeyspace())); + p = new QueryHandler.Prepared(statement, (String) query); } else { p = handler.getPrepared((MD5Digest)query); - if (p == null) + if (null == p) throw new PreparedQueryNotFoundException((MD5Digest)query); } List<ByteBuffer> queryValues = values.get(i); - if (queryValues.size() != p.statement.getBoundTerms()) + if (queryValues.size() != p.statement.getBindVariables().size()) throw new InvalidRequestException(String.format("There were %d markers(?) in CQL but %d bound variables", - p.statement.getBoundTerms(), + p.statement.getBindVariables().size(), queryValues.size())); prepared.add(p); @@ -212,18 +214,18 @@ public class BatchMessage extends Message.Request List<ModificationStatement> statements = new ArrayList<>(prepared.size()); for (int i = 0; i < prepared.size(); i++) { - ParsedStatement.Prepared p = prepared.get(i); - batchOptions.prepareStatement(i, p.boundNames); + CQLStatement statement = prepared.get(i).statement; + batchOptions.prepareStatement(i, statement.getBindVariables()); - if (!(p.statement instanceof ModificationStatement)) + if (!(statement instanceof ModificationStatement)) throw new InvalidRequestException("Invalid statement in batch: only UPDATE, INSERT and DELETE statements are allowed."); - statements.add((ModificationStatement)p.statement); + statements.add((ModificationStatement) statement); } // Note: It's ok at this point to pass a bogus value for the number of bound terms in the BatchState ctor // (and no value would be really correct, so we prefer passing a clearly wrong one). - BatchStatement batch = new BatchStatement(-1, batchType, statements, Attributes.none()); + BatchStatement batch = new BatchStatement(batchType, VariableSpecifications.empty(), statements, Attributes.none()); long fqlTime = isLoggingEnabled ? System.currentTimeMillis() : 0; Message.Response response = handler.processBatch(batch, state, batchOptions, getCustomPayload(), queryStartNanoTime); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java index cd7f300..6c0b77a 100644 --- a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java @@ -28,8 +28,8 @@ import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.ColumnSpecification; import org.apache.cassandra.cql3.QueryHandler; import org.apache.cassandra.cql3.QueryOptions; +import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.ResultSet; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.exceptions.PreparedQueryNotFoundException; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; @@ -113,12 +113,12 @@ public class ExecuteMessage extends Message.Request try { QueryHandler handler = ClientState.getCQLQueryHandler(); - ParsedStatement.Prepared prepared = handler.getPrepared(statementId); + QueryProcessor.Prepared prepared = handler.getPrepared(statementId); if (prepared == null) throw new PreparedQueryNotFoundException(statementId); - options.prepare(prepared.boundNames); CQLStatement statement = prepared.statement; + options.prepare(statement.getBindVariables()); if (options.getPageSize() == 0) throw new ProtocolException("The page size cannot be 0"); @@ -143,9 +143,9 @@ public class ExecuteMessage extends Message.Request builder.put("serial_consistency_level", options.getSerialConsistency().name()); builder.put("query", prepared.rawCQLStatement); - for(int i=0;i<prepared.boundNames.size();i++) + for(int i = 0; i < statement.getBindVariables().size(); i++) { - ColumnSpecification cs = prepared.boundNames.get(i); + ColumnSpecification cs = statement.getBindVariables().get(i); String boundName = cs.name.toString(); String boundValue = cs.type.asCQL3Type().toCQLLiteral(options.getValues().get(i), options.getProtocolVersion()); if ( boundValue.length() > 1000 ) @@ -163,7 +163,7 @@ public class ExecuteMessage extends Message.Request // Some custom QueryHandlers are interested by the bound names. We provide them this information // by wrapping the QueryOptions. - QueryOptions queryOptions = QueryOptions.addColumnSpecifications(options, prepared.boundNames); + QueryOptions queryOptions = QueryOptions.addColumnSpecifications(options, prepared.statement.getBindVariables()); long fqlTime = isLoggingEnabled ? System.currentTimeMillis() : 0; Message.Response response = handler.processPrepared(statement, state, queryOptions, getCustomPayload(), queryStartNanoTime); @@ -230,7 +230,7 @@ public class ExecuteMessage extends Message.Request } else { - ParsedStatement.Prepared prepared = ClientState.getCQLQueryHandler().getPrepared(statementId); + QueryHandler.Prepared prepared = ClientState.getCQLQueryHandler().getPrepared(statementId); if (prepared != null) { AuditLogEntry auditLogEntry = new AuditLogEntry.Builder(state.getClientState()) http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java index e5e5248..4ab6e0b 100644 --- a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java @@ -24,8 +24,8 @@ import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; import org.apache.cassandra.audit.AuditLogEntry; import org.apache.cassandra.audit.AuditLogEntryType; +import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.service.ClientState; import org.apache.cassandra.service.QueryState; import org.apache.cassandra.tracing.Tracing; @@ -119,12 +119,12 @@ public class PrepareMessage extends Message.Request getCustomPayload()); if (auditLogEnabled) { - ParsedStatement.Prepared parsedStmt = QueryProcessor.parseStatement(query, state.getClientState()); + CQLStatement parsedStmt = QueryProcessor.parseStatement(query, state.getClientState()); AuditLogEntry auditLogEntry = new AuditLogEntry.Builder(state.getClientState()) .setOperation(query) .setType(AuditLogEntryType.PREPARE_STATEMENT) - .setScope(parsedStmt.statement) - .setKeyspace(parsedStmt.statement) + .setScope(parsedStmt) + .setKeyspace(parsedStmt) .build(); auditLogManager.log(auditLogEntry); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/QueryMessage.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java index 9df9205..4f42b85 100644 --- a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java @@ -24,9 +24,9 @@ import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; import org.apache.cassandra.audit.AuditLogEntry; import org.apache.cassandra.audit.AuditLogManager; +import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.QueryOptions; import org.apache.cassandra.cql3.QueryProcessor; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.exceptions.RequestExecutionException; import org.apache.cassandra.exceptions.RequestValidationException; import org.apache.cassandra.service.ClientState; @@ -122,13 +122,13 @@ public class QueryMessage extends Message.Request if (isLoggingEnabled) { - ParsedStatement.Prepared parsedStatement = QueryProcessor.parseStatement(query, state.getClientState()); + CQLStatement parsedStatement = QueryProcessor.parseStatement(query, state.getClientState()); AuditLogEntry auditEntry = new AuditLogEntry.Builder(state.getClientState()) - .setType(parsedStatement.statement.getAuditLogContext().auditLogEntryType) + .setType(parsedStatement.getAuditLogContext().auditLogEntryType) .setOperation(query) .setTimestamp(fqlTime) - .setScope(parsedStatement.statement) - .setKeyspace(state, parsedStatement.statement) + .setScope(parsedStatement) + .setKeyspace(state, parsedStatement) .setOptions(options) .build(); AuditLogManager.getInstance().log(auditEntry); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/transport/messages/ResultMessage.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java index b989a7d..4485849 100644 --- a/src/java/org/apache/cassandra/transport/messages/ResultMessage.java +++ b/src/java/org/apache/cassandra/transport/messages/ResultMessage.java @@ -22,10 +22,7 @@ import com.google.common.annotations.VisibleForTesting; import io.netty.buffer.ByteBuf; -import org.apache.cassandra.cql3.ColumnSpecification; -import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.ResultSet; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.transport.*; import org.apache.cassandra.utils.MD5Digest; http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/src/java/org/apache/cassandra/triggers/TriggerExecutor.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java index 754183f..295003f 100644 --- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java +++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java @@ -252,11 +252,11 @@ public class TriggerExecutor } } - public synchronized ITrigger loadTriggerInstance(String triggerName) throws Exception + public synchronized ITrigger loadTriggerInstance(String triggerClass) throws Exception { // double check. - if (cachedTriggers.get(triggerName) != null) - return cachedTriggers.get(triggerName); - return (ITrigger) customClassLoader.loadClass(triggerName).getConstructor().newInstance(); + if (cachedTriggers.get(triggerClass) != null) + return cachedTriggers.get(triggerClass); + return (ITrigger) customClassLoader.loadClass(triggerClass).getConstructor().newInstance(); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java ---------------------------------------------------------------------- diff --git a/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java b/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java index 45ad258..4a0e646 100644 --- a/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java +++ b/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java @@ -25,7 +25,7 @@ import java.util.Collection; import java.util.concurrent.*; import org.apache.cassandra.UpdateBuilder; -import org.apache.cassandra.cql3.statements.CreateTableStatement; +import org.apache.cassandra.cql3.statements.schema.CreateTableStatement; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.schema.Schema; http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/SchemaLoader.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index eddaa1e..62b9670 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -27,29 +27,29 @@ import org.apache.cassandra.auth.IAuthenticator; import org.apache.cassandra.auth.IAuthorizer; import org.apache.cassandra.auth.INetworkAuthorizer; import org.apache.cassandra.auth.IRoleManager; -import org.apache.cassandra.cql3.statements.CreateTableStatement; -import org.apache.cassandra.dht.Murmur3Partitioner; -import org.apache.cassandra.index.sasi.SASIIndex; -import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder; -import org.junit.After; -import org.junit.BeforeClass; - import org.apache.cassandra.config.*; import org.apache.cassandra.cql3.CQLTester; import org.apache.cassandra.cql3.ColumnIdentifier; -import org.apache.cassandra.cql3.statements.IndexTarget; +import org.apache.cassandra.cql3.statements.schema.CreateTableStatement; +import org.apache.cassandra.cql3.statements.schema.IndexTarget; import org.apache.cassandra.db.RowUpdateBuilder; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.marshal.*; +import org.apache.cassandra.dht.Murmur3Partitioner; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.gms.Gossiper; import org.apache.cassandra.index.StubIndex; +import org.apache.cassandra.index.sasi.SASIIndex; +import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.schema.*; import org.apache.cassandra.schema.MigrationManager; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; +import org.junit.After; +import org.junit.BeforeClass; + public class SchemaLoader { @BeforeClass http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java b/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java index f0eed8c..bf50094 100644 --- a/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java +++ b/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java @@ -59,7 +59,7 @@ public class CassandraNetworkAuthorizerTest { ResultMessage.Rows select(SelectStatement statement, QueryOptions options) { - return statement.executeInternal(QueryState.forInternalCalls(), options); + return statement.executeLocally(QueryState.forInternalCalls(), options); } UntypedResultSet process(String query) throws RequestExecutionException @@ -70,7 +70,7 @@ public class CassandraNetworkAuthorizerTest @Override void processBatch(BatchStatement statement) { - statement.executeInternal(QueryState.forInternalCalls(), QueryOptions.DEFAULT); + statement.executeLocally(QueryState.forInternalCalls(), QueryOptions.DEFAULT); } } @@ -78,7 +78,7 @@ public class CassandraNetworkAuthorizerTest { ResultMessage.Rows select(SelectStatement statement, QueryOptions options) { - return statement.executeInternal(QueryState.forInternalCalls(), options); + return statement.executeLocally(QueryState.forInternalCalls(), options); } UntypedResultSet process(String query, ConsistencyLevel consistencyLevel) throws RequestValidationException, RequestExecutionException @@ -91,7 +91,7 @@ public class CassandraNetworkAuthorizerTest { ResultMessage.Rows select(SelectStatement statement, QueryOptions options) { - return statement.executeInternal(QueryState.forInternalCalls(), options); + return statement.executeLocally(QueryState.forInternalCalls(), options); } void process(String query) @@ -170,7 +170,7 @@ public class CassandraNetworkAuthorizerTest private static void auth(String query, Object... args) { - CQLStatement statement = QueryProcessor.parseStatement(String.format(query, args)).prepare().statement; + CQLStatement statement = QueryProcessor.parseStatement(String.format(query, args)).prepare(ClientState.forInternalCalls()); assert statement instanceof CreateRoleStatement || statement instanceof AlterRoleStatement || statement instanceof DropRoleStatement; http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/CQLTester.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java index 662e804..4a1a365 100644 --- a/test/unit/org/apache/cassandra/cql3/CQLTester.java +++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java @@ -52,7 +52,6 @@ import org.apache.cassandra.locator.InetAddressAndPort; import org.apache.cassandra.schema.*; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.cql3.functions.FunctionName; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.db.*; import org.apache.cassandra.db.commitlog.CommitLog; import org.apache.cassandra.db.marshal.*; @@ -62,6 +61,8 @@ import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.AbstractEndpointSnitch; +import org.apache.cassandra.schema.IndexMetadata; +import org.apache.cassandra.schema.KeyspaceMetadata; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.serializers.TypeSerializer; import org.apache.cassandra.service.ClientState; @@ -713,7 +714,13 @@ public abstract class CQLTester throw new IllegalArgumentException("Table name should be specified: " + formattedQuery); String column = matcher.group(9); - return Indexes.getAvailableIndexName(keyspace, table, Strings.isNullOrEmpty(column) ? null : column); + + String baseName = Strings.isNullOrEmpty(column) + ? IndexMetadata.generateDefaultIndexName(table) + : IndexMetadata.generateDefaultIndexName(table, new ColumnIdentifier(column, true)); + + KeyspaceMetadata ks = Schema.instance.getKeyspaceMetadata(keyspace); + return ks.findAvailableIndexName(baseName); } /** @@ -809,16 +816,15 @@ public abstract class CQLTester { try { - ClientState state = ClientState.forInternalCalls(); - state.setKeyspace(SchemaConstants.SYSTEM_KEYSPACE_NAME); + ClientState state = ClientState.forInternalCalls(SchemaConstants.SYSTEM_KEYSPACE_NAME); QueryState queryState = new QueryState(state); - ParsedStatement.Prepared prepared = QueryProcessor.parseStatement(query, queryState.getClientState()); - prepared.statement.validate(state); + CQLStatement statement = QueryProcessor.parseStatement(query, queryState.getClientState()); + statement.validate(state); QueryOptions options = QueryOptions.forInternalCalls(Collections.<ByteBuffer>emptyList()); - lastSchemaChangeResult = prepared.statement.executeInternal(queryState, options); + lastSchemaChangeResult = statement.executeLocally(queryState, options); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java b/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java index 2b5a14a..eca6c20 100644 --- a/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java +++ b/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java @@ -22,11 +22,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.Assert; -import org.apache.cassandra.cql3.statements.ParsedStatement; import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.db.marshal.Int32Type; import org.apache.cassandra.db.marshal.UTF8Type; @@ -99,7 +98,7 @@ public class PstmtPersistenceTest extends CQLTester for (UntypedResultSet.Row row : QueryProcessor.executeOnceInternal(queryAll)) { MD5Digest digest = MD5Digest.wrap(ByteBufferUtil.getArray(row.getBytes("prepared_id"))); - ParsedStatement.Prepared prepared = QueryProcessor.instance.getPrepared(digest); + QueryProcessor.Prepared prepared = QueryProcessor.instance.getPrepared(digest); Assert.assertNotNull(prepared); } @@ -128,8 +127,8 @@ public class PstmtPersistenceTest extends CQLTester private static void validatePstmt(QueryHandler handler, MD5Digest stmtId, QueryOptions options) { - ParsedStatement.Prepared prepared = handler.getPrepared(stmtId); - assertNotNull(prepared); + QueryProcessor.Prepared prepared = handler.getPrepared(stmtId); + Assert.assertNotNull(prepared); handler.processPrepared(prepared.statement, QueryState.forInternalCalls(), options, Collections.emptyMap(), System.nanoTime()); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java index f6defa8..32319a9 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java @@ -144,7 +144,7 @@ public class ViewComplexTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); createTable("CREATE TABLE %s (k int, c int, a int, b int, e int, f int, PRIMARY KEY (k, c))"); createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)"); + "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)"); Keyspace ks = Keyspace.open(keyspace()); ks.getColumnFamilyStore("mv").disableAutoCompaction(); @@ -401,7 +401,7 @@ public class ViewComplexTest extends CQLTester assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1)); assertRowsIgnoringOrder(execute("SELECT * from mv WHERE c = ? AND p = ?", 0, 0), row(0, 0)); - assertInvalidMessage(String.format("Cannot drop column v2 on base table %s with materialized views.", baseTable), "ALTER TABLE %s DROP v2"); + assertInvalidMessage(String.format("Cannot drop column v2 on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP v2"); // // drop unselected base column, unselected metadata should be removed, thus view row is dead // updateView("ALTER TABLE %s DROP v2"); // assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0)); @@ -428,7 +428,7 @@ public class ViewComplexTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); String baseTable = createTable("CREATE TABLE %s (k int, c int, a int, b int, l list<int>, s set<int>, m map<int,int>, PRIMARY KEY (k, c))"); createView("mv", - "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)"); + "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)"); Keyspace ks = Keyspace.open(keyspace()); ks.getColumnFamilyStore("mv").disableAutoCompaction(); @@ -462,7 +462,7 @@ public class ViewComplexTest extends CQLTester assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s"), row(1, 1, null, null)); assertRowsIgnoringOrder(execute("SELECT * from mv"), row(1, 1, null, null)); - assertInvalidMessage(String.format("Cannot drop column m on base table %s with materialized views.", baseTable), "ALTER TABLE %s DROP m"); + assertInvalidMessage(String.format("Cannot drop column m on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP m"); // executeNet(protocolVersion, "ALTER TABLE %s DROP m"); // ks.getColumnFamilyStore("mv").forceMajorCompaction(); // assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s WHERE k = 1 AND c = 1")); @@ -931,7 +931,7 @@ public class ViewComplexTest extends CQLTester assertRowsIgnoringOrder(execute("SELECT k,a,b from mv"), row(1, 1, 2)); assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, 1, 2)); - assertInvalidMessage(String.format("Cannot drop column a on base table %s with materialized views.", baseTable), "ALTER TABLE %s DROP a"); + assertInvalidMessage(String.format("Cannot drop column a on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP a"); } @Test @@ -1273,7 +1273,7 @@ public class ViewComplexTest extends CQLTester // all selected "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)", // unselected e,f - "CREATE MATERIALIZED VIEW %s AS SELECT c,d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)", + "CREATE MATERIALIZED VIEW %s AS SELECT a,b,c,d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)", // no selected "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)", // all selected, re-order keys http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java index b7d3647..65d66b5 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java @@ -1848,7 +1848,7 @@ public class ViewFilteringTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); try { - createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL AND d = 1 PRIMARY KEY (a, b, c)"); + createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d = 1 PRIMARY KEY (a, b, c)"); dropView("mv_test"); } catch(Exception e) { throw new RuntimeException("MV creation with non primary column restrictions failed.", e); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java index 63ac3e3..093f122 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java @@ -672,7 +672,7 @@ public class ViewSchemaTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); createView(keyspace() + ".mv1", - "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)"); + "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)"); try { @@ -681,7 +681,7 @@ public class ViewSchemaTest extends CQLTester } catch (InvalidQueryException e) { - Assert.assertEquals("Cannot use DROP TABLE on Materialized View", e.getMessage()); + Assert.assertEquals("Cannot use DROP TABLE on a materialized view. Please use DROP MATERIALIZED VIEW instead.", e.getMessage()); } } @@ -694,7 +694,7 @@ public class ViewSchemaTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); - assertInvalidMessage("Non-primary key columns cannot be restricted in the SELECT statement used for materialized view creation", + assertInvalidMessage("Non-primary key columns can only be restricted with 'IS NOT NULL'", "CREATE MATERIALIZED VIEW " + keyspace() + ".mv AS SELECT * FROM %s " + "WHERE b IS NOT NULL AND c IS NOT NULL AND a IS NOT NULL " + "AND d = 1 PRIMARY KEY (c, b, a)"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/ViewTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/ViewTest.java b/test/unit/org/apache/cassandra/cql3/ViewTest.java index 40d75c4..aae7d83 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewTest.java @@ -93,8 +93,8 @@ public class ViewTest extends CQLTester @Test public void testNonExistingOnes() throws Throwable { - assertInvalidMessage("Cannot drop non existing materialized view", "DROP MATERIALIZED VIEW " + KEYSPACE + ".view_does_not_exist"); - assertInvalidMessage("Cannot drop non existing materialized view", "DROP MATERIALIZED VIEW keyspace_does_not_exist.view_does_not_exist"); + assertInvalidMessage(String.format("Materialized view '%s.view_does_not_exist' doesn't exist", KEYSPACE), "DROP MATERIALIZED VIEW " + KEYSPACE + ".view_does_not_exist"); + assertInvalidMessage("Materialized view 'keyspace_does_not_exist.view_does_not_exist' doesn't exist", "DROP MATERIALIZED VIEW keyspace_does_not_exist.view_does_not_exist"); execute("DROP MATERIALIZED VIEW IF EXISTS " + KEYSPACE + ".view_does_not_exist"); execute("DROP MATERIALIZED VIEW IF EXISTS keyspace_does_not_exist.view_does_not_exist"); @@ -156,7 +156,7 @@ public class ViewTest extends CQLTester execute("USE " + keyspace()); executeNet(protocolVersion, "USE " + keyspace()); - createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); + createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1, c1, val FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)"); updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)"); @@ -178,7 +178,7 @@ public class ViewTest extends CQLTester execute("USE " + keyspace()); executeNet(protocolVersion, "USE " + keyspace()); - createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); + createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT val, k1, c1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); } @@ -190,7 +190,7 @@ public class ViewTest extends CQLTester execute("USE " + keyspace()); executeNet(protocolVersion, "USE " + keyspace()); - createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); + createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1, c1, val FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)"); updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)"); updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)"); @@ -252,8 +252,15 @@ public class ViewTest extends CQLTester { } - // Can omit "k IS NOT NULL" because we have a sinlge partition key - createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE bigintval IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY (bigintval, k, asciival)"); + // Must still include both even when the partition key is composite + try + { + createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE bigintval IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY (bigintval, k, asciival)"); + Assert.fail("Should fail if compound primary is not completely filtered as NOT NULL"); + } + catch (Exception e) + { + } } @Test @@ -418,7 +425,7 @@ public class ViewTest extends CQLTester } catch (InvalidQueryException e) { - Assert.assertEquals("Cannot use Duration column 'result' in PRIMARY KEY of materialized view", e.getMessage()); + Assert.assertEquals("duration type is not supported for PRIMARY KEY column 'result'", e.getMessage()); } } @@ -760,7 +767,7 @@ public class ViewTest extends CQLTester { String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL " + (def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ") + "PRIMARY KEY ((" + def.name + ", k), nonexistentcolumn)"; - createView("mv3_" + def.name, query); + createView("mv4_" + def.name, query); Assert.fail("Should fail with unknown base column"); } catch (InvalidQueryException e) @@ -1023,10 +1030,10 @@ public class ViewTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); - createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c) WITH CLUSTERING ORDER BY (b DESC)"); - createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c ASC)"); - createView("mv3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)"); - createView("mv4", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c DESC)"); + createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c) WITH CLUSTERING ORDER BY (b DESC, c ASC)"); + createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c ASC, b ASC)"); + createView("mv3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)"); + createView("mv4", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c DESC, b ASC)"); updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 1); updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 2, 2); @@ -1062,7 +1069,7 @@ public class ViewTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); - createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL PRIMARY KEY (b, a)"); + createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)"); updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1); updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 2); @@ -1094,7 +1101,7 @@ public class ViewTest extends CQLTester executeNet(protocolVersion, "USE " + keyspace()); // Cannot use SELECT *, as those are always handled by the includeAll shortcut in View.updateAffectsView - createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE b IS NOT NULL PRIMARY KEY (b, a)"); + createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)"); updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1); @@ -1183,7 +1190,7 @@ public class ViewTest extends CQLTester "PRIMARY KEY (a))"); executeNet(protocolVersion, "USE " + keyspace()); - createView("mvmap", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE b IS NOT NULL PRIMARY KEY (b, a)"); + createView("mvmap", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)"); updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 0, 0); ResultSet mvRows = executeNet(protocolVersion, "SELECT a, b FROM mvmap WHERE b = ?", 0); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java b/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java index 30fbb0d..d6de5ff 100644 --- a/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java +++ b/test/unit/org/apache/cassandra/cql3/selection/SelectionColumnMappingTest.java @@ -124,7 +124,7 @@ public class SelectionColumnMappingTest extends CQLTester // we don't use verify like with the other tests because this query will produce no results SelectStatement statement = getSelect("SELECT token(a,b) FROM %s"); verifyColumnMapping(expected, statement); - statement.executeInternal(QueryState.forInternalCalls(), QueryOptions.DEFAULT); + statement.executeLocally(QueryState.forInternalCalls(), QueryOptions.DEFAULT); } private void testSimpleTypes() throws Throwable @@ -581,8 +581,8 @@ public class SelectionColumnMappingTest extends CQLTester private void checkExecution(SelectStatement statement, List<ColumnSpecification> expectedResultColumns) throws RequestExecutionException, RequestValidationException { - UntypedResultSet rs = UntypedResultSet.create(statement.executeInternal(QueryState.forInternalCalls(), - QueryOptions.DEFAULT).result); + UntypedResultSet rs = UntypedResultSet.create(statement.executeLocally(QueryState.forInternalCalls(), + QueryOptions.DEFAULT).result); assertEquals(expectedResultColumns, rs.one().getColumns()); } @@ -590,7 +590,7 @@ public class SelectionColumnMappingTest extends CQLTester private SelectStatement getSelect(String query) throws RequestValidationException { CQLStatement statement = QueryProcessor.getStatement(String.format(query, KEYSPACE + "." + tableName), - ClientState.forInternalCalls()).statement; + ClientState.forInternalCalls()); assertTrue(statement instanceof SelectStatement); return (SelectStatement)statement; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java b/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java index 77e5236..883b4f5 100644 --- a/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java +++ b/test/unit/org/apache/cassandra/cql3/statements/AlterRoleStatementTest.java @@ -23,13 +23,14 @@ import org.junit.Assert; import org.junit.Test; import org.apache.cassandra.auth.DCPermissions; +import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.QueryProcessor; public class AlterRoleStatementTest { private static AlterRoleStatement parse(String query) { - ParsedStatement stmt = QueryProcessor.parseStatement(query); + CQLStatement.Raw stmt = QueryProcessor.parseStatement(query); Assert.assertTrue(stmt instanceof AlterRoleStatement); return (AlterRoleStatement) stmt; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java b/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java index 0ff26b5..7a23da2 100644 --- a/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java +++ b/test/unit/org/apache/cassandra/cql3/statements/CreateRoleStatementTest.java @@ -23,6 +23,7 @@ import org.junit.Assert; import org.junit.Test; import org.apache.cassandra.auth.DCPermissions; +import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.CQLTester; import org.apache.cassandra.cql3.QueryProcessor; @@ -31,7 +32,7 @@ public class CreateRoleStatementTest extends CQLTester private static CreateRoleStatement parse(String query) { - ParsedStatement stmt = QueryProcessor.parseStatement(query); + CQLStatement.Raw stmt = QueryProcessor.parseStatement(query); Assert.assertTrue(stmt instanceof CreateRoleStatement); return (CreateRoleStatement) stmt; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java b/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java index 51e38b3..51c61bb 100644 --- a/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java +++ b/test/unit/org/apache/cassandra/cql3/statements/CreateUserStatementTest.java @@ -22,13 +22,14 @@ import org.junit.Assert; import org.junit.Test; import org.apache.cassandra.auth.DCPermissions; +import org.apache.cassandra.cql3.CQLStatement; import org.apache.cassandra.cql3.QueryProcessor; public class CreateUserStatementTest { private static CreateRoleStatement parse(String query) { - ParsedStatement stmt = QueryProcessor.parseStatement(query); + CQLStatement.Raw stmt = QueryProcessor.parseStatement(query); Assert.assertTrue(stmt instanceof CreateRoleStatement); return (CreateRoleStatement) stmt; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java index 9ad47c0..54dd0c4 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java @@ -684,11 +684,11 @@ public class CollectionsTest extends CQLTester @Test public void testDropAndReaddDroppedCollection() throws Throwable { - createTable("create table %s (k int primary key, v frozen<set<text>>, x int)"); + createTable("create table %s (k int primary key, v set<text>, x int)"); execute("insert into %s (k, v) VALUES (0, {'fffffffff'})"); flush(); execute("alter table %s drop v"); - execute("alter table %s add v set<int>"); + execute("alter table %s add v set<text>"); } @Test @@ -1652,9 +1652,9 @@ public class CollectionsTest extends CQLTester public void testCollectionSliceOnMV() throws Throwable { createTable("CREATE TABLE %s (k int, c int, l text, m map<text, text>, o int, PRIMARY KEY (k, c))"); - assertInvalidMessage("Cannot use collection element selection when defining a materialized view", + assertInvalidMessage("Can only select columns by name when defining a materialized view (got m['abc'])", "CREATE MATERIALIZED VIEW " + KEYSPACE + ".view1 AS SELECT m['abc'] FROM %s WHERE k IS NOT NULL AND c IS NOT NULL AND m IS NOT NULL PRIMARY KEY (c, k)"); - assertInvalidMessage("Cannot use collection slice selection when defining a materialized view", + assertInvalidMessage("Can only select columns by name when defining a materialized view (got m['abc'..'def'])", "CREATE MATERIALIZED VIEW " + KEYSPACE + ".view1 AS SELECT m['abc'..'def'] FROM %s WHERE k IS NOT NULL AND c IS NOT NULL AND m IS NOT NULL PRIMARY KEY (c, k)"); } @@ -1762,7 +1762,7 @@ public class CollectionsTest extends CQLTester String type = createType("CREATE TYPE %s (s set<int>, m map<text, text>)"); assertInvalidMessage("Non-frozen UDTs are not allowed inside collections", - "CREATE TABLE " + KEYSPACE + "t (k int PRIMARY KEY, v map<text, " + type + ">)"); + "CREATE TABLE " + KEYSPACE + ".t (k int PRIMARY KEY, v map<text, " + type + ">)"); String mapType = "map<text, frozen<" + type + ">>"; for (boolean frozen : new boolean[]{false, true}) http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java index f4543ea..38bd4dd 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/CountersTest.java @@ -160,7 +160,7 @@ public class CountersTest extends CQLTester @Test public void testProhibitReversedCounterAsPartOfPrimaryKey() throws Throwable { - assertInvalidThrowMessage("counter type is not supported for PRIMARY KEY part a", + assertInvalidThrowMessage("counter type is not supported for PRIMARY KEY column 'a'", InvalidRequestException.class, String.format("CREATE TABLE %s.%s (a counter, b int, PRIMARY KEY (b, a)) WITH CLUSTERING ORDER BY (a desc);", KEYSPACE, createTableName())); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java index c493267..39ae392 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/FrozenCollectionsTest.java @@ -554,8 +554,8 @@ public class FrozenCollectionsTest extends CQLTester createTable("CREATE TABLE %s (a frozen<map<int, text>> PRIMARY KEY, b frozen<map<int, text>>)"); // for now, we don't support indexing values or keys of collections in the primary key - assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (full(a))", "Cannot create secondary index on partition key column"); - assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (keys(a))", "Cannot create secondary index on partition key column"); + assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (full(a))", "Cannot create secondary index on the only partition key column"); + assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (keys(a))", "Cannot create secondary index on the only partition key column"); assertInvalidIndexCreationWithMessage("CREATE INDEX ON %s (keys(b))", "Cannot create keys() index on frozen column b. " + "Frozen collections only support full() indexes"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/207c80c1/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java index c763b9b..2b2880d 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java @@ -25,6 +25,7 @@ import java.util.concurrent.CountDownLatch; import org.apache.commons.lang3.StringUtils; import org.junit.Test; +import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.config.DatabaseDescriptor; @@ -32,13 +33,12 @@ import org.apache.cassandra.cql3.CQLTester; import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.cql3.QueryProcessor; import org.apache.cassandra.cql3.restrictions.StatementRestrictions; -import org.apache.cassandra.cql3.statements.IndexTarget; +import org.apache.cassandra.cql3.statements.schema.IndexTarget; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.DeletionTime; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.rows.Cell; import org.apache.cassandra.db.rows.Row; -import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.index.IndexNotAvailableException; import org.apache.cassandra.index.SecondaryIndexManager; @@ -52,6 +52,8 @@ import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.MD5Digest; import org.apache.cassandra.utils.Pair; +import static java.lang.String.format; + import static org.apache.cassandra.Util.throwAssert; import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER; import static org.apache.cassandra.utils.ByteBufferUtil.bytes; @@ -96,17 +98,17 @@ public class SecondaryIndexTest extends CQLTester */ private void testCreateAndDropIndex(String indexName, boolean addKeyspaceOnDrop) throws Throwable { - execute("USE system"); - assertInvalidMessage(String.format("Index '%s' could not be found", - removeQuotes(indexName.toLowerCase(Locale.US))), - "DROP INDEX " + indexName + ";"); + assertInvalidMessage(format("Index '%s.%s' doesn't exist", + KEYSPACE, + removeQuotes(indexName.toLowerCase(Locale.US))), + format("DROP INDEX %s.%s", KEYSPACE, indexName)); createTable("CREATE TABLE %s (a int primary key, b int);"); createIndex("CREATE INDEX " + indexName + " ON %s(b);"); createIndex("CREATE INDEX IF NOT EXISTS " + indexName + " ON %s(b);"); - assertInvalidMessage(String.format("Index %s already exists", - removeQuotes(indexName.toLowerCase(Locale.US))), + assertInvalidMessage(format("Index '%s' already exists", + removeQuotes(indexName.toLowerCase(Locale.US))), "CREATE INDEX " + indexName + " ON %s(b)"); // IF NOT EXISTS should apply in cases where the new index differs from an existing one in name only @@ -114,9 +116,9 @@ public class SecondaryIndexTest extends CQLTester assertEquals(1, getCurrentColumnFamilyStore().metadata().indexes.size()); createIndex("CREATE INDEX IF NOT EXISTS " + otherIndexName + " ON %s(b)"); assertEquals(1, getCurrentColumnFamilyStore().metadata().indexes.size()); - assertInvalidMessage(String.format("Index %s is a duplicate of existing index %s", - removeQuotes(otherIndexName.toLowerCase(Locale.US)), - removeQuotes(indexName.toLowerCase(Locale.US))), + assertInvalidMessage(format("Index %s is a duplicate of existing index %s", + removeQuotes(otherIndexName.toLowerCase(Locale.US)), + removeQuotes(indexName.toLowerCase(Locale.US))), "CREATE INDEX " + otherIndexName + " ON %s(b)"); execute("INSERT INTO %s (a, b) values (?, ?);", 0, 0); @@ -125,26 +127,24 @@ public class SecondaryIndexTest extends CQLTester execute("INSERT INTO %s (a, b) values (?, ?);", 3, 1); assertRows(execute("SELECT * FROM %s where b = ?", 1), row(1, 1), row(3, 1)); - assertInvalidMessage(String.format("Index '%s' could not be found in any of the tables of keyspace 'system'", - removeQuotes(indexName.toLowerCase(Locale.US))), - "DROP INDEX " + indexName); if (addKeyspaceOnDrop) { - dropIndex("DROP INDEX " + KEYSPACE + "." + indexName); + dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName)); } else { execute("USE " + KEYSPACE); - execute("DROP INDEX " + indexName); + execute(format("DROP INDEX %s", indexName)); } assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE, "SELECT * FROM %s where b = ?", 1); - dropIndex("DROP INDEX IF EXISTS " + indexName); - assertInvalidMessage(String.format("Index '%s' could not be found", - removeQuotes(indexName.toLowerCase(Locale.US))), - "DROP INDEX " + indexName); + dropIndex(format("DROP INDEX IF EXISTS %s.%s", KEYSPACE, indexName)); + assertInvalidMessage(format("Index '%s.%s' doesn't exist", + KEYSPACE, + removeQuotes(indexName.toLowerCase(Locale.US))), + format("DROP INDEX %s.%s", KEYSPACE, indexName)); } /** @@ -239,10 +239,10 @@ public class SecondaryIndexTest extends CQLTester public void testUnknownCompressionOptions() throws Throwable { String tableName = createTableName(); - assertInvalidThrow(SyntaxException.class, String.format("CREATE TABLE %s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH compression_parameters:sstable_compressor = 'DeflateCompressor'", tableName)); + assertInvalidThrow(SyntaxException.class, format("CREATE TABLE %s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH compression_parameters:sstable_compressor = 'DeflateCompressor'", tableName)); - assertInvalidThrow(ConfigurationException.class, String.format("CREATE TABLE %s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH compression = { 'sstable_compressor': 'DeflateCompressor' }", - tableName)); + assertInvalidThrow(ConfigurationException.class, format("CREATE TABLE %s (key varchar PRIMARY KEY, password varchar, gender varchar) WITH compression = { 'sstable_compressor': 'DeflateCompressor' }", + tableName)); } /** @@ -558,14 +558,14 @@ public class SecondaryIndexTest extends CQLTester { String indexName = columnName + "_idx"; SecondaryIndexManager indexManager = getCurrentColumnFamilyStore().indexManager; - createIndex(String.format("CREATE INDEX %s on %%s(%s)", indexName, columnName)); + createIndex(format("CREATE INDEX %s on %%s(%s)", indexName, columnName)); IndexMetadata indexDef = indexManager.getIndexByName(indexName).getIndexMetadata(); - assertEquals(String.format("values(%s)", columnName), indexDef.options.get(IndexTarget.TARGET_OPTION_NAME)); - dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + assertEquals(format("values(%s)", columnName), indexDef.options.get(IndexTarget.TARGET_OPTION_NAME)); + dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName)); assertFalse(indexManager.hasIndexes()); - createIndex(String.format("CREATE INDEX %s on %%s(values(%s))", indexName, columnName)); + createIndex(format("CREATE INDEX %s on %%s(values(%s))", indexName, columnName)); assertEquals(indexDef, indexManager.getIndexByName(indexName).getIndexMetadata()); - dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName)); } @Test @@ -594,15 +594,15 @@ public class SecondaryIndexTest extends CQLTester private void createAndDropIndexWithQuotedColumnIdentifier(String target) throws Throwable { String indexName = "test_mixed_case_idx"; - createIndex(String.format("CREATE INDEX %s ON %%s(%s)", indexName, target)); + createIndex(format("CREATE INDEX %s ON %%s(%s)", indexName, target)); SecondaryIndexManager indexManager = getCurrentColumnFamilyStore().indexManager; IndexMetadata indexDef = indexManager.getIndexByName(indexName).getIndexMetadata(); - dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName)); // verify we can re-create the index using the target string - createIndex(String.format("CREATE INDEX %s ON %%s(%s)", - indexName, indexDef.options.get(IndexTarget.TARGET_OPTION_NAME))); + createIndex(format("CREATE INDEX %s ON %%s(%s)", + indexName, indexDef.options.get(IndexTarget.TARGET_OPTION_NAME))); assertEquals(indexDef, indexManager.getIndexByName(indexName).getIndexMetadata()); - dropIndex(String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + dropIndex(format("DROP INDEX %s.%s", KEYSPACE, indexName)); } @@ -664,7 +664,7 @@ public class SecondaryIndexTest extends CQLTester // the indexed value passes validation, but the batch size will // exceed the default failure threshold, so temporarily raise it // (the non-conditional batch doesn't hit this because - // BatchStatement::executeInternal skips the size check but CAS + // BatchStatement::executeLocally skips the size check but CAS // path does not) long batchSizeThreshold = DatabaseDescriptor.getBatchSizeFailThreshold(); try @@ -717,7 +717,7 @@ public class SecondaryIndexTest extends CQLTester // the indexed value passes validation, but the batch size will // exceed the default failure threshold, so temporarily raise it // (the non-conditional batch doesn't hit this because - // BatchStatement::executeInternal skips the size check but CAS + // BatchStatement::executeLocally skips the size check but CAS // path does not) long batchSizeThreshold = DatabaseDescriptor.getBatchSizeFailThreshold(); try @@ -754,15 +754,15 @@ public class SecondaryIndexTest extends CQLTester public void prepareStatementsWithLIKEClauses() throws Throwable { createTable("CREATE TABLE %s (a int, c1 text, c2 text, v1 text, v2 text, v3 int, PRIMARY KEY (a, c1, c2))"); - createIndex(String.format("CREATE CUSTOM INDEX c1_idx on %%s(c1) USING '%s' WITH OPTIONS = {'mode' : 'PREFIX'}", - SASIIndex.class.getName())); - createIndex(String.format("CREATE CUSTOM INDEX c2_idx on %%s(c2) USING '%s' WITH OPTIONS = {'mode' : 'CONTAINS'}", - SASIIndex.class.getName())); - createIndex(String.format("CREATE CUSTOM INDEX v1_idx on %%s(v1) USING '%s' WITH OPTIONS = {'mode' : 'PREFIX'}", - SASIIndex.class.getName())); - createIndex(String.format("CREATE CUSTOM INDEX v2_idx on %%s(v2) USING '%s' WITH OPTIONS = {'mode' : 'CONTAINS'}", - SASIIndex.class.getName())); - createIndex(String.format("CREATE CUSTOM INDEX v3_idx on %%s(v3) USING '%s'", SASIIndex.class.getName())); + createIndex(format("CREATE CUSTOM INDEX c1_idx on %%s(c1) USING '%s' WITH OPTIONS = {'mode' : 'PREFIX'}", + SASIIndex.class.getName())); + createIndex(format("CREATE CUSTOM INDEX c2_idx on %%s(c2) USING '%s' WITH OPTIONS = {'mode' : 'CONTAINS'}", + SASIIndex.class.getName())); + createIndex(format("CREATE CUSTOM INDEX v1_idx on %%s(v1) USING '%s' WITH OPTIONS = {'mode' : 'PREFIX'}", + SASIIndex.class.getName())); + createIndex(format("CREATE CUSTOM INDEX v2_idx on %%s(v2) USING '%s' WITH OPTIONS = {'mode' : 'CONTAINS'}", + SASIIndex.class.getName())); + createIndex(format("CREATE CUSTOM INDEX v3_idx on %%s(v3) USING '%s'", SASIIndex.class.getName())); forcePreparedValues(); // prefix mode indexes support prefix/contains/matches @@ -870,8 +870,8 @@ public class SecondaryIndexTest extends CQLTester String indexClassName = StubIndex.class.getName(); createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY ((a), b))"); // uses different options otherwise the two indexes are considered duplicates - createIndex(String.format("CREATE CUSTOM INDEX c_idx_1 ON %%s(c) USING '%s' WITH OPTIONS = {'foo':'a'}", indexClassName)); - createIndex(String.format("CREATE CUSTOM INDEX c_idx_2 ON %%s(c) USING '%s' WITH OPTIONS = {'foo':'b'}", indexClassName)); + createIndex(format("CREATE CUSTOM INDEX c_idx_1 ON %%s(c) USING '%s' WITH OPTIONS = {'foo':'a'}", indexClassName)); + createIndex(format("CREATE CUSTOM INDEX c_idx_2 ON %%s(c) USING '%s' WITH OPTIONS = {'foo':'b'}", indexClassName)); ColumnFamilyStore cfs = getCurrentColumnFamilyStore(); TableMetadata cfm = cfs.metadata(); @@ -913,7 +913,7 @@ public class SecondaryIndexTest extends CQLTester String indexClassName = StubIndex.class.getName(); createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY ((a), b))"); - createIndex(String.format("CREATE CUSTOM INDEX c_idx ON %%s(c) USING '%s'", indexClassName)); + createIndex(format("CREATE CUSTOM INDEX c_idx ON %%s(c) USING '%s'", indexClassName)); ColumnFamilyStore cfs = getCurrentColumnFamilyStore(); TableMetadata cfm = cfs.metadata(); @@ -969,7 +969,7 @@ public class SecondaryIndexTest extends CQLTester // Any columns which are unchanged by the update are not passed to the Indexer // Note that for simplicity this test resets the index between each scenario createTable("CREATE TABLE %s (k int, c int, v1 int, v2 int, PRIMARY KEY (k,c))"); - createIndex(String.format("CREATE CUSTOM INDEX test_index ON %%s() USING '%s'", StubIndex.class.getName())); + createIndex(format("CREATE CUSTOM INDEX test_index ON %%s() USING '%s'", StubIndex.class.getName())); execute("INSERT INTO %s (k, c, v1, v2) VALUES (0, 0, 0, 0) USING TIMESTAMP 0"); ColumnMetadata v1 = getCurrentColumnFamilyStore().metadata().getColumn(new ColumnIdentifier("v1", true)); @@ -1386,8 +1386,8 @@ public class SecondaryIndexTest extends CQLTester assertRows(execute("SELECT * FROM %s WHERE v = ?", udt1), row(1, udt1)); dropIndex("DROP INDEX %s." + indexName); - assertInvalidMessage(String.format("Index '%s' could not be found", indexName), - String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + assertInvalidMessage(format("Index '%s.%s' doesn't exist", KEYSPACE, indexName), + format("DROP INDEX %s.%s", KEYSPACE, indexName)); assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE, "SELECT * FROM %s WHERE v = ?", udt1); } @@ -1419,8 +1419,8 @@ public class SecondaryIndexTest extends CQLTester assertEmpty(execute("SELECT * FROM %s WHERE v = ?", set(udt2))); dropIndex("DROP INDEX %s." + indexName); - assertInvalidMessage(String.format("Index '%s' could not be found", indexName), - String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + assertInvalidMessage(format("Index '%s.%s' doesn't exist", KEYSPACE, indexName), + format("DROP INDEX %s.%s", KEYSPACE, indexName)); assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE, "SELECT * FROM %s WHERE v CONTAINS ?", udt1); } @@ -1453,8 +1453,8 @@ public class SecondaryIndexTest extends CQLTester assertRows(execute("SELECT * FROM %s WHERE v CONTAINS ?", udt2), row(2, set(udt2))); dropIndex("DROP INDEX %s." + indexName); - assertInvalidMessage(String.format("Index '%s' could not be found", indexName), - String.format("DROP INDEX %s.%s", KEYSPACE, indexName)); + assertInvalidMessage(format("Index '%s.%s' doesn't exist", KEYSPACE, indexName), + format("DROP INDEX %s.%s", KEYSPACE, indexName)); assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE, "SELECT * FROM %s WHERE v CONTAINS ?", udt1); } @@ -1464,9 +1464,9 @@ public class SecondaryIndexTest extends CQLTester { String type = createType("CREATE TYPE %s (a int)"); createTable("CREATE TABLE %s (k int PRIMARY KEY, v " + type + ")"); - assertInvalidMessage("Secondary indexes are not supported on non-frozen UDTs", "CREATE INDEX ON %s (v)"); - assertInvalidMessage("Non-collection columns support only simple indexes", "CREATE INDEX ON %s (keys(v))"); - assertInvalidMessage("Non-collection columns support only simple indexes", "CREATE INDEX ON %s (values(v))"); + assertInvalidMessage("Cannot create index on non-frozen UDT column v", "CREATE INDEX ON %s (v)"); + assertInvalidMessage("Cannot create keys() index on v. Non-collection columns only support simple indexes", "CREATE INDEX ON %s (keys(v))"); + assertInvalidMessage("Cannot create values() index on v. Non-collection columns only support simple indexes", "CREATE INDEX ON %s (values(v))"); assertInvalidMessage("full() indexes can only be created on frozen collections", "CREATE INDEX ON %s (full(v))"); } @@ -1514,7 +1514,7 @@ public class SecondaryIndexTest extends CQLTester private ResultMessage.Prepared prepareStatement(String cql) { - return QueryProcessor.prepare(String.format(cql, KEYSPACE, currentTable()), + return QueryProcessor.prepare(format(cql, KEYSPACE, currentTable()), ClientState.forInternalCalls()); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
