/** {@inheritDoc} */ @Override public PreparedId getPreparedId() { return st.getPreparedId(); }
DataWrapper(BoundStatement wrapped, int size) { super(wrapped.statement.getPreparedId().protocolVersion, wrapped, size); }
public PreparedStatement addPrepared(PreparedStatement stmt) { PreparedStatement previous = preparedQueries.putIfAbsent(stmt.getPreparedId().boundValuesMetadata.id, stmt); if (previous != null) { logger.warn( "Re-preparing already prepared query is generally an anti-pattern and will likely affect performance. " + "Consider preparing the statement only once. Query='{}'", stmt.getQueryString()); // The one object in the cache will get GCed once it's not referenced by the client anymore // since we use a weak reference. // So we need to make sure that the instance we do return to the user is the one that is in // the cache. // However if the result metadata changed since the last PREPARE call, this also needs to be // updated. previous.getPreparedId().resultSetMetadata = stmt.getPreparedId().resultSetMetadata; return previous; } return stmt; }
/** {@inheritDoc} */ @Override public String getKeyspace() { ColumnDefinitions defs = statement.getPreparedId().boundValuesMetadata.variables; return defs.size() == 0 ? null : defs.getKeyspace(0); }
IdAndValues getIdAndValues(ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { IdAndValues idAndVals = new IdAndValues(statements.size()); for (Statement statement : statements) { if (statement instanceof StatementWrapper) statement = ((StatementWrapper) statement).getWrappedStatement(); if (statement instanceof RegularStatement) { RegularStatement st = (RegularStatement) statement; ByteBuffer[] vals = st.getValues(protocolVersion, codecRegistry); String query = st.getQueryString(codecRegistry); idAndVals.ids.add(query); idAndVals.values.add( vals == null ? Collections.<ByteBuffer>emptyList() : Arrays.asList(vals)); } else { // We handle BatchStatement in add() so ... assert statement instanceof BoundStatement; BoundStatement st = (BoundStatement) statement; idAndVals.ids.add(st.statement.getPreparedId().boundValuesMetadata.id); idAndVals.values.add(Arrays.asList(st.wrapper.values)); } } return idAndVals; }
int[] rkIndexes = statement.getPreparedId().routingKeyIndexes; if (rkIndexes != null) { if (rkIndexes.length == 1) {
assert statement instanceof BoundStatement; BoundStatement bs = (BoundStatement) statement; bs.preparedStatement().getPreparedId().resultSetMetadata = new PreparedId.PreparedMetadata( rows.metadata.metadataId, rows.metadata.columns);
/** * Validates that no routing key indexes are present for a partially-bound prepared statement. * * @test_category prepared_statements:metadata */ @Test(groups = "short") public void should_not_have_routing_key_indexes_when_some_not_bound() { PreparedStatement pst = session().prepare("INSERT INTO foo (k3, k1, k2, v) VALUES (1, ?, ?, ?)"); assertThat(pst.getPreparedId().routingKeyIndexes).isNull(); }
wrapper.values[i] = null; } else { ProtocolVersion protocolVersion = statement.getPreparedId().protocolVersion; if (value instanceof Token)
/** * Validates that no routing key indexes are present for a none-bound prepared statement. * * @test_category prepared_statements:metadata */ @Test(groups = "short") public void should_not_have_routing_key_indexes_when_none_bound() { PreparedStatement pst = session().prepare("INSERT INTO foo (k3, k1, k2, v) VALUES (1, 1, 1, 1)"); assertThat(pst.getPreparedId().routingKeyIndexes).isNull(); } }
/** * Validates that the correct routing key indexes are present for a fully-bound prepared * statement. * * @test_category prepared_statements:metadata */ @Test(groups = "short") public void should_have_routing_key_indexes_when_all_bound() { PreparedStatement pst = session().prepare("INSERT INTO foo (k3, k1, k2, v) VALUES (?, ?, ?, ?)"); assertThat(pst.getPreparedId().routingKeyIndexes).containsExactly(1, 2, 0); }
columnDefs = bs.preparedStatement().getPreparedId().resultSetMetadata.variables; } else { if (newMetadataId != null) { BoundStatement bs = ((BoundStatement) actualStatement); PreparedId preparedId = bs.preparedStatement().getPreparedId(); preparedId.resultSetMetadata = new PreparedId.PreparedMetadata(newMetadataId, columnDefs);
@BeforeMethod(groups = {"unit"}) public void setup() { MockitoAnnotations.initMocks(this); PreparedId preparedId = new PreparedId( new PreparedId.PreparedMetadata(MD5Digest.wrap(PREPARED_ID), null), new PreparedId.PreparedMetadata(MD5Digest.wrap(RESULT_METADATA_ID), null), new int[0], ProtocolVersion.V5); Mockito.when(preparedStatement.getPreparedId()).thenReturn(preparedId); ColumnDefinitions columnDefinitions = new ColumnDefinitions( new Definition[] { new Definition("ks", "table", "c1", DataType.cint()), new Definition("ks", "table", "c2", DataType.text()) }, CodecRegistry.DEFAULT_INSTANCE); Mockito.when(preparedStatement.getVariables()).thenReturn(columnDefinitions); Mockito.when(preparedStatement.getIncomingPayload()).thenReturn(null); Mockito.when(preparedStatement.getOutgoingPayload()).thenReturn(null); Mockito.when(preparedStatement.getCodecRegistry()).thenReturn(CodecRegistry.DEFAULT_INSTANCE); }
@Test(groups = "short") public void should_update_statement_id_when_metadata_changed_across_executions() { // given PreparedStatement ps = session().prepare("SELECT * FROM prepared_statement_invalidation_test WHERE a = ?"); MD5Digest idBefore = ps.getPreparedId().resultSetMetadata.id; // when session().execute("ALTER TABLE prepared_statement_invalidation_test ADD d int"); BoundStatement bs = ps.bind(1); ResultSet rows = session().execute(bs); // then MD5Digest idAfter = ps.getPreparedId().resultSetMetadata.id; assertThat(idBefore).isNotEqualTo(idAfter); assertThat(ps.getPreparedId().resultSetMetadata.variables) .hasSize(4) .containsVariable("d", DataType.cint()); assertThat(bs.preparedStatement().getPreparedId().resultSetMetadata.variables) .hasSize(4) .containsVariable("d", DataType.cint()); assertThat(rows.getColumnDefinitions()).hasSize(4).containsVariable("d", DataType.cint()); }
assertThat(ps.getPreparedId().resultSetMetadata.variables).isNull(); MD5Digest idBefore = ps.getPreparedId().resultSetMetadata.id; .containsVariable("[applied]", DataType.cboolean()); assertThat(ps.getPreparedId().resultSetMetadata.variables).isNull(); assertThat(ps.getPreparedId().resultSetMetadata.id).isEqualTo(idBefore); assertThat(row.getInt("c")).isEqualTo(5); assertThat(ps.getPreparedId().resultSetMetadata.variables).isNull(); assertThat(ps.getPreparedId().resultSetMetadata.id).isEqualTo(idBefore); assertThat(row.getInt("c")).isEqualTo(5); assertThat(row.isNull("d")).isTrue(); assertThat(ps.getPreparedId().resultSetMetadata.variables).isNull(); assertThat(ps.getPreparedId().resultSetMetadata.id).isEqualTo(idBefore);
BoundStatement bs = (BoundStatement) statement; if (!cluster.manager.preparedQueries.containsKey( bs.statement.getPreparedId().boundValuesMetadata.id)) { throw new InvalidQueryException( String.format( "Tried to execute unknown prepared query : %s. " + "You may have used a PreparedStatement that was created with another Cluster instance.", bs.statement.getPreparedId().boundValuesMetadata.id)); && bs.statement.getPreparedId().resultSetMetadata.variables != null; Requests.QueryProtocolOptions options = new Requests.QueryProtocolOptions( request = new Requests.Execute( bs.statement.getPreparedId().boundValuesMetadata.id, bs.statement.getPreparedId().resultSetMetadata.id, options, statement.isTracing());
try { size += CBUtil.sizeOfShortBytes(preparedStatement().getPreparedId().boundValuesMetadata.id.bytes); if (ProtocolFeature.PREPARED_METADATA_CHANGES.isSupportedBy(protocolVersion)) { size += CBUtil.sizeOfShortBytes(preparedStatement().getPreparedId().resultSetMetadata.id.bytes);
ResultSet rows = session().execute(ps.bind().setFetchSize(2)); assertThat(rows.isFullyFetched()).isFalse(); MD5Digest idBefore = ps.getPreparedId().resultSetMetadata.id; ColumnDefinitions definitionsBefore = rows.getColumnDefinitions(); assertThat(definitionsBefore).hasSize(3).doesNotContainVariable("d"); assertThat(row.isNull("d")).isTrue(); MD5Digest idAfter = ps.getPreparedId().resultSetMetadata.id; ColumnDefinitions definitionsAfter = rows.getColumnDefinitions(); assertThat(idBefore).isNotEqualTo(idAfter);
public PreparedStatement addPrepared(PreparedStatement stmt) { PreparedStatement previous = preparedQueries.putIfAbsent(stmt.getPreparedId().id, stmt); if (previous != null) { logger.warn("Re-preparing already prepared query is generally an anti-pattern and will likely affect performance. " + "Consider preparing the statement only once. Query='{}'", stmt.getQueryString()); // The one object in the cache will get GCed once it's not referenced by the client anymore since we use a weak reference. // So we need to make sure that the instance we do return to the user is the one that is in the cache. return previous; } return stmt; }
session2.prepare("SELECT * FROM prepared_statement_invalidation_test WHERE a = ?"); MD5Digest id1a = ps1.getPreparedId().resultSetMetadata.id; MD5Digest id2a = ps2.getPreparedId().resultSetMetadata.id; rows2 = session2.execute(ps2.bind(1)); MD5Digest id1b = ps1.getPreparedId().resultSetMetadata.id; MD5Digest id2b = ps2.getPreparedId().resultSetMetadata.id; assertThat(ps1.getPreparedId().resultSetMetadata.variables) .hasSize(4) .containsVariable("d", DataType.cint()); assertThat(ps2.getPreparedId().resultSetMetadata.variables) .hasSize(4) .containsVariable("d", DataType.cint());