Search in sources :

Example 1 with ColumnSpecification

use of org.apache.cassandra.cql3.ColumnSpecification in project cassandra by apache.

the class ExecuteMessage method execute.

public Message.Response execute(QueryState state, long queryStartNanoTime) {
    try {
        QueryHandler handler = ClientState.getCQLQueryHandler();
        ParsedStatement.Prepared prepared = handler.getPrepared(statementId);
        if (prepared == null)
            throw new PreparedQueryNotFoundException(statementId);
        options.prepare(prepared.boundNames);
        CQLStatement statement = prepared.statement;
        if (options.getPageSize() == 0)
            throw new ProtocolException("The page size cannot be 0");
        UUID tracingId = null;
        if (isTracingRequested()) {
            tracingId = UUIDGen.getTimeUUID();
            state.prepareTracingSession(tracingId);
        }
        if (state.traceNextQuery()) {
            state.createTracingSession(getCustomPayload());
            ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
            if (options.getPageSize() > 0)
                builder.put("page_size", Integer.toString(options.getPageSize()));
            if (options.getConsistency() != null)
                builder.put("consistency_level", options.getConsistency().name());
            if (options.getSerialConsistency() != null)
                builder.put("serial_consistency_level", options.getSerialConsistency().name());
            builder.put("query", prepared.rawCQLStatement);
            for (int i = 0; i < prepared.boundNames.size(); i++) {
                ColumnSpecification cs = prepared.boundNames.get(i);
                String boundName = cs.name.toString();
                String boundValue = cs.type.asCQL3Type().toCQLLiteral(options.getValues().get(i), options.getProtocolVersion());
                if (boundValue.length() > 1000) {
                    boundValue = boundValue.substring(0, 1000) + "...'";
                }
                //Here we prefix boundName with the index to avoid possible collission in builder keys due to
                //having multiple boundValues for the same variable
                builder.put("bound_var_" + Integer.toString(i) + "_" + boundName, boundValue);
            }
            Tracing.instance.begin("Execute CQL3 prepared query", state.getClientAddress(), builder.build());
        }
        // 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);
        Message.Response response = handler.processPrepared(statement, state, queryOptions, getCustomPayload(), queryStartNanoTime);
        if (options.skipMetadata() && response instanceof ResultMessage.Rows)
            ((ResultMessage.Rows) response).result.metadata.setSkipMetadata();
        if (tracingId != null)
            response.setTracingId(tracingId);
        return response;
    } catch (Exception e) {
        JVMStabilityInspector.inspectThrowable(e);
        return ErrorMessage.fromException(e);
    } finally {
        Tracing.instance.stopSession();
    }
}
Also used : CQLStatement(org.apache.cassandra.cql3.CQLStatement) QueryHandler(org.apache.cassandra.cql3.QueryHandler) ColumnSpecification(org.apache.cassandra.cql3.ColumnSpecification) ParsedStatement(org.apache.cassandra.cql3.statements.ParsedStatement) PreparedQueryNotFoundException(org.apache.cassandra.exceptions.PreparedQueryNotFoundException) QueryOptions(org.apache.cassandra.cql3.QueryOptions) ImmutableMap(com.google.common.collect.ImmutableMap) PreparedQueryNotFoundException(org.apache.cassandra.exceptions.PreparedQueryNotFoundException) UUID(java.util.UUID)

Example 2 with ColumnSpecification

use of org.apache.cassandra.cql3.ColumnSpecification in project cassandra by apache.

the class FunctionResolver method validateTypes.

// This method and matchArguments are somewhat duplicate, but this method allows us to provide more precise errors in the common
// case where there is no override for a given function. This is thus probably worth the minor code duplication.
private static void validateTypes(String keyspace, Function fun, List<? extends AssignmentTestable> providedArgs, String receiverKs, String receiverCf) {
    if (providedArgs.size() != fun.argTypes().size())
        throw invalidRequest("Invalid number of arguments in call to function %s: %d required but %d provided", fun.name(), fun.argTypes().size(), providedArgs.size());
    for (int i = 0; i < providedArgs.size(); i++) {
        AssignmentTestable provided = providedArgs.get(i);
        // We'll validate the actually provided value at execution time.
        if (provided == null)
            continue;
        ColumnSpecification expected = makeArgSpec(receiverKs, receiverCf, fun, i);
        if (!provided.testAssignment(keyspace, expected).isAssignable())
            throw invalidRequest("Type error: %s cannot be passed as argument %d of function %s of type %s", provided, i, fun.name(), expected.type.asCQL3Type());
    }
}
Also used : AssignmentTestable(org.apache.cassandra.cql3.AssignmentTestable) ColumnSpecification(org.apache.cassandra.cql3.ColumnSpecification)

Example 3 with ColumnSpecification

use of org.apache.cassandra.cql3.ColumnSpecification in project cassandra by apache.

the class CQLSSTableWriter method addRow.

/**
 * Adds a new row to the writer.
 * <p>
 * This is equivalent to the other addRow methods, but takes a map whose
 * keys are the names of the columns to add instead of taking a list of the
 * values in the order of the insert statement used during construction of
 * this write.
 * <p>
 * Please note that the column names in the map keys must be in lowercase unless
 * the declared column name is a
 * <a href="http://cassandra.apache.org/doc/cql3/CQL.html#identifiers">case-sensitive quoted identifier</a>
 * (in which case the map key must use the exact case of the column).
 *
 * @param values a map of colum name to column values representing the new
 * row to add. Note that if a column is not part of the map, it's value will
 * be {@code null}. If the map contains keys that does not correspond to one
 * of the column of the insert statement used when creating this writer, the
 * the corresponding value is ignored.
 * @return this writer.
 */
public CQLSSTableWriter addRow(Map<String, Object> values) throws InvalidRequestException, IOException {
    int size = boundNames.size();
    List<ByteBuffer> rawValues = new ArrayList<>(size);
    for (int i = 0; i < size; i++) {
        ColumnSpecification spec = boundNames.get(i);
        Object value = values.get(spec.name.toString());
        rawValues.add(serialize(value, typeCodecs.get(i), boundNames.get(i)));
    }
    return rawAddRow(rawValues);
}
Also used : ColumnSpecification(org.apache.cassandra.cql3.ColumnSpecification) ArrayList(java.util.ArrayList) ByteBuffer(java.nio.ByteBuffer)

Example 4 with ColumnSpecification

use of org.apache.cassandra.cql3.ColumnSpecification in project cassandra by apache.

the class ExecuteMessage method traceQuery.

private void traceQuery(QueryState state, QueryHandler.Prepared prepared) {
    ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
    if (options.getPageSize() > 0)
        builder.put("page_size", Integer.toString(options.getPageSize()));
    if (options.getConsistency() != null)
        builder.put("consistency_level", options.getConsistency().name());
    if (options.getSerialConsistency() != null)
        builder.put("serial_consistency_level", options.getSerialConsistency().name());
    builder.put("query", prepared.rawCQLStatement);
    for (int i = 0; i < prepared.statement.getBindVariables().size(); i++) {
        ColumnSpecification cs = prepared.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)
            boundValue = boundValue.substring(0, 1000) + "...'";
        // Here we prefix boundName with the index to avoid possible collission in builder keys due to
        // having multiple boundValues for the same variable
        builder.put("bound_var_" + i + '_' + boundName, boundValue);
    }
    Tracing.instance.begin("Execute CQL3 prepared query", state.getClientAddress(), builder.build());
}
Also used : ColumnSpecification(org.apache.cassandra.cql3.ColumnSpecification) ImmutableMap(com.google.common.collect.ImmutableMap)

Example 5 with ColumnSpecification

use of org.apache.cassandra.cql3.ColumnSpecification in project cassandra by apache.

the class SelectionColumnMappingTest method testMultipleArgumentFunction.

@Test
public void testMultipleArgumentFunction() throws Throwable {
    // demonstrate behaviour of token() with composite partition key
    tableName = createTable("CREATE TABLE %s (a int, b text, PRIMARY KEY ((a, b)))");
    ColumnSpecification tokenSpec = columnSpecification("system.token(a, b)", BytesType.instance);
    SelectionColumnMapping expected = SelectionColumnMapping.newMapping().addMapping(tokenSpec, columnDefinitions("a", "b"));
    // 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.executeLocally(QueryState.forInternalCalls(), QueryOptions.DEFAULT);
}
Also used : SelectStatement(org.apache.cassandra.cql3.statements.SelectStatement) Test(org.junit.Test)

Aggregations

ColumnSpecification (org.apache.cassandra.cql3.ColumnSpecification)14 ByteBuffer (java.nio.ByteBuffer)7 ArrayList (java.util.ArrayList)4 List (java.util.List)3 ImmutableMap (com.google.common.collect.ImmutableMap)2 AssignmentTestable (org.apache.cassandra.cql3.AssignmentTestable)2 QueryOptions (org.apache.cassandra.cql3.QueryOptions)2 ColumnMetadata (org.apache.cassandra.schema.ColumnMetadata)2 Test (org.junit.Test)2 ColumnDefinitions (com.datastax.driver.core.ColumnDefinitions)1 ResultSet (com.datastax.driver.core.ResultSet)1 Session (com.datastax.driver.core.Session)1 Random (java.util.Random)1 UUID (java.util.UUID)1 CQLStatement (org.apache.cassandra.cql3.CQLStatement)1 ColumnIdentifier (org.apache.cassandra.cql3.ColumnIdentifier)1 QueryHandler (org.apache.cassandra.cql3.QueryHandler)1 ResultSet (org.apache.cassandra.cql3.ResultSet)1 UntypedResultSet (org.apache.cassandra.cql3.UntypedResultSet)1 SingleColumnRestriction (org.apache.cassandra.cql3.restrictions.SingleColumnRestriction)1