protected int appendParameters(BoundStatement statement, StringBuilder buffer, int remaining) { if (remaining == 0) return 0; ColumnDefinitions metadata = statement.preparedStatement().getVariables(); int numberOfParameters = metadata.size(); if (numberOfParameters > 0) { List<ColumnDefinitions.Definition> definitions = metadata.asList(); int numberOfLoggedParameters; if (remaining == -1) { numberOfLoggedParameters = numberOfParameters; } else { numberOfLoggedParameters = Math.min(remaining, numberOfParameters); remaining -= numberOfLoggedParameters; } for (int i = 0; i < numberOfLoggedParameters; i++) { if (buffer.length() == 0) buffer.append(" ["); else buffer.append(", "); String value = statement.isSet(i) ? parameterValueAsString(definitions.get(i), statement.wrapper.values[i]) : "<UNSET>"; buffer.append(String.format("%s:%s", metadata.getName(i), value)); } if (numberOfLoggedParameters < numberOfParameters) { buffer.append(FURTHER_PARAMS_OMITTED); } } return remaining; }
/** * Tests that, under protocol versions lesser than V4, it is NOT possible to execute a prepared * statement with unbound values. Note that we have to force protocol version to less than V4 * because higher protocol versions would allow such unbound values to be sent. * * @test_category prepared_statements:binding * @jira_ticket JAVA-777 * @since 2.2.0 */ @Test(groups = "short") public void should_not_allow_unbound_value_on_bound_statement_when_protocol_lesser_than_v4() { Cluster cluster = register( Cluster.builder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .withProtocolVersion(ccm().getProtocolVersion(ProtocolVersion.V3)) .build()); Session session = cluster.connect(); try { PreparedStatement ps = session.prepare("INSERT INTO " + keyspace + "." + SIMPLE_TABLE + " (k, i) VALUES (?, ?)"); BoundStatement bs = ps.bind("foo"); assertFalse(bs.isSet("i")); session.execute(bs); fail("Should not have executed statement with UNSET values in protocol V3"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("Unset value at index 1"); } }
/** * Tests that a value that was previously set on a bound statement can be unset by name. This only * works from protocol V4 onwards. * * @test_category prepared_statements:binding * @jira_ticket JAVA-930 * @since 2.2.0 */ @Test(groups = "short") @CassandraVersion("2.2.0") public void should_unset_value_by_name() { PreparedStatement prepared = session().prepare("INSERT INTO " + SIMPLE_TABLE + " (k, i) VALUES (:k, :i)"); BoundStatement bound = prepared.bind(); bound.setString("k", "foo"); bound.setInt("i", 1234); bound.unset("i"); assertThat(bound.isSet("i")).isFalse(); session().execute(bound); ResultSet rows = session() .execute( new SimpleStatement("SELECT i from " + SIMPLE_TABLE + " where k = 'foo'") .enableTracing()); assertThat(rows.one().isNull("i")); // sleep 10 seconds to make sure the trace will be complete Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS); QueryTrace queryTrace = rows.getExecutionInfo().getQueryTrace(); assertEventsContain(queryTrace, "0 tombstone"); }
/** * Tests that a value that was previously set on a bound statement can be unset by index. This * only works from protocol V4 onwards. * * @test_category prepared_statements:binding * @jira_ticket JAVA-930 * @since 2.2.0 */ @Test(groups = "short") @CassandraVersion("2.2.0") public void should_unset_value_by_index() { PreparedStatement prepared = session().prepare("INSERT INTO " + SIMPLE_TABLE + " (k, i) VALUES (?, ?)"); BoundStatement bound = prepared.bind(); bound.setString(0, "foo"); bound.setInt(1, 1234); bound.unset(1); assertThat(bound.isSet(1)).isFalse(); session().execute(bound); ResultSet rows = session() .execute( new SimpleStatement("SELECT i from " + SIMPLE_TABLE + " where k = 'foo'") .enableTracing()); assertThat(rows.one().isNull("i")); // sleep 10 seconds to make sure the trace will be complete Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS); QueryTrace queryTrace = rows.getExecutionInfo().getQueryTrace(); assertEventsContain(queryTrace, "0 tombstone"); }
int findUnsetPosition(BoundStatement bs) { int size = bs.preparedStatement().getVariables().size(); for (int i = 0; i < size; i++) if (!bs.isSet(i)) return i; throw new IllegalArgumentException("found no unset position"); }
/** * Returns whether the first occurrence of variable {@code name} has been * bound to a non-null value. * * @param name the name of the variable to check. * @return whether the first occurrence of variable {@code name} has been * bound to a non-null value. * * @throws IllegalArgumentException if {@code name} is not a prepared * variable, that is if {@code !this.preparedStatement().variables().names().contains(name)}. */ public boolean isSet(String name) { return isSet(metadata().getFirstIdx(name)); }
protected int appendParameters(BoundStatement statement, StringBuilder buffer, int remaining) { if (remaining == 0) return 0; ColumnDefinitions metadata = statement.preparedStatement().getVariables(); int numberOfParameters = metadata.size(); if (numberOfParameters > 0) { List<ColumnDefinitions.Definition> definitions = metadata.asList(); int numberOfLoggedParameters; if (remaining == -1) { numberOfLoggedParameters = numberOfParameters; } else { numberOfLoggedParameters = Math.min(remaining, numberOfParameters); remaining -= numberOfLoggedParameters; } for (int i = 0; i < numberOfLoggedParameters; i++) { if (buffer.length() == 0) buffer.append(" ["); else buffer.append(", "); String value = statement.isSet(i) ? parameterValueAsString(definitions.get(i), statement.wrapper.values[i]) : "<UNSET>"; buffer.append(String.format("%s:%s", metadata.getName(i), value)); } if (numberOfLoggedParameters < numberOfParameters) { buffer.append(FURTHER_PARAMS_OMITTED); } } return remaining; }
protected int appendParameters(BoundStatement statement, StringBuilder buffer, int remaining) { if (remaining == 0) return 0; ColumnDefinitions metadata = statement.preparedStatement().getVariables(); int numberOfParameters = metadata.size(); if (numberOfParameters > 0) { List<ColumnDefinitions.Definition> definitions = metadata.asList(); int numberOfLoggedParameters; if (remaining == -1) { numberOfLoggedParameters = numberOfParameters; } else { numberOfLoggedParameters = Math.min(remaining, numberOfParameters); remaining -= numberOfLoggedParameters; } for (int i = 0; i < numberOfLoggedParameters; i++) { if (buffer.length() == 0) buffer.append(" ["); else buffer.append(", "); String value = statement.isSet(i) ? parameterValueAsString(definitions.get(i), statement.wrapper.values[i]) : "<UNSET>"; buffer.append(String.format("%s:%s", metadata.getName(i), value)); } if (numberOfLoggedParameters < numberOfParameters) { buffer.append(FURTHER_PARAMS_OMITTED); } } return remaining; }
protected int appendParameters(BoundStatement statement, StringBuilder buffer, int remaining) { if (remaining == 0) return 0; ColumnDefinitions metadata = statement.preparedStatement().getVariables(); int numberOfParameters = metadata.size(); if (numberOfParameters > 0) { List<ColumnDefinitions.Definition> definitions = metadata.asList(); int numberOfLoggedParameters; if (remaining == -1) { numberOfLoggedParameters = numberOfParameters; } else { numberOfLoggedParameters = Math.min(remaining, numberOfParameters); remaining -= numberOfLoggedParameters; } for (int i = 0; i < numberOfLoggedParameters; i++) { if (buffer.length() == 0) buffer.append(" ["); else buffer.append(", "); String value = statement.isSet(i) ? parameterValueAsString(definitions.get(i), statement.wrapper.values[i]) : "<UNSET>"; buffer.append(String.format("%s:%s", metadata.getName(i), value)); } if (numberOfLoggedParameters < numberOfParameters) { buffer.append(FURTHER_PARAMS_OMITTED); } } return remaining; }
for(int i=0; i<q.preparedStatement().getVariables().size(); i++){ if(!q.isSet(i)){ q.setToNull(i);
private void doExecute() throws SQLException { if (LOG.isTraceEnabled()) LOG.trace("CQL: " + cql); try { resetResults(); if (this.connection.debugMode) System.out.println("CQL: "+ cql); if(this.statement.getFetchSize()==0) // force paging to avoid timeout and node harm... this.statement.setFetchSize(100); this.statement.setConsistencyLevel(this.connection.defaultConsistencyLevel); for(int i=0; i<this.statement.preparedStatement().getVariables().size(); i++){ // Set parameters to null if unset if(!this.statement.isSet(i)){ this.statement.setToNull(i); } } currentResultSet = new CassandraResultSet(this, this.connection.getSession().execute(this.statement)); } catch (Exception e) { throw new SQLTransientException(e); } }
/** * Tests that, under protocol versions lesser than V4, it is NOT possible to execute a prepared * statement with unbound values. Note that we have to force protocol version to less than V4 * because higher protocol versions would allow such unbound values to be sent. * * @test_category prepared_statements:binding * @jira_ticket JAVA-777 * @since 2.2.0 */ @Test(groups = "short") public void should_not_allow_unbound_value_on_bound_statement_when_protocol_lesser_than_v4() { Cluster cluster = register( Cluster.builder() .addContactPoints(getContactPoints()) .withPort(ccm().getBinaryPort()) .withProtocolVersion(ccm().getProtocolVersion(ProtocolVersion.V3)) .build()); Session session = cluster.connect(); try { PreparedStatement ps = session.prepare("INSERT INTO " + keyspace + "." + SIMPLE_TABLE + " (k, i) VALUES (?, ?)"); BoundStatement bs = ps.bind("foo"); assertFalse(bs.isSet("i")); session.execute(bs); fail("Should not have executed statement with UNSET values in protocol V3"); } catch (IllegalStateException e) { assertThat(e.getMessage()).contains("Unset value at index 1"); } }
/** * Tests that a value that was previously set on a bound statement can be unset by name. This only * works from protocol V4 onwards. * * @test_category prepared_statements:binding * @jira_ticket JAVA-930 * @since 2.2.0 */ @Test(groups = "short") @CassandraVersion("2.2.0") public void should_unset_value_by_name() { PreparedStatement prepared = session().prepare("INSERT INTO " + SIMPLE_TABLE + " (k, i) VALUES (:k, :i)"); BoundStatement bound = prepared.bind(); bound.setString("k", "foo"); bound.setInt("i", 1234); bound.unset("i"); assertThat(bound.isSet("i")).isFalse(); session().execute(bound); ResultSet rows = session() .execute( new SimpleStatement("SELECT i from " + SIMPLE_TABLE + " where k = 'foo'") .enableTracing()); assertThat(rows.one().isNull("i")); // sleep 10 seconds to make sure the trace will be complete Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS); QueryTrace queryTrace = rows.getExecutionInfo().getQueryTrace(); assertEventsContain(queryTrace, "0 tombstone"); }
/** * Tests that a value that was previously set on a bound statement can be unset by index. This * only works from protocol V4 onwards. * * @test_category prepared_statements:binding * @jira_ticket JAVA-930 * @since 2.2.0 */ @Test(groups = "short") @CassandraVersion("2.2.0") public void should_unset_value_by_index() { PreparedStatement prepared = session().prepare("INSERT INTO " + SIMPLE_TABLE + " (k, i) VALUES (?, ?)"); BoundStatement bound = prepared.bind(); bound.setString(0, "foo"); bound.setInt(1, 1234); bound.unset(1); assertThat(bound.isSet(1)).isFalse(); session().execute(bound); ResultSet rows = session() .execute( new SimpleStatement("SELECT i from " + SIMPLE_TABLE + " where k = 'foo'") .enableTracing()); assertThat(rows.one().isNull("i")); // sleep 10 seconds to make sure the trace will be complete Uninterruptibles.sleepUninterruptibly(10, TimeUnit.SECONDS); QueryTrace queryTrace = rows.getExecutionInfo().getQueryTrace(); assertEventsContain(queryTrace, "0 tombstone"); }