Skip to content

Commit cb0077b

Browse files
authored
Merge pull request #187 from muzarski/enable-named-parameters-tests
binding: fix by-name parameter binding and enable corresponding IT
2 parents bfae66b + 658ebb0 commit cb0077b

File tree

8 files changed

+398
-148
lines changed

8 files changed

+398
-148
lines changed

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ SCYLLA_TEST_FILTER := $(subst ${SPACE},${EMPTY},ClusterTests.*\
1111
:SerialConsistencyTests.*\
1212
:HeartbeatTests.*\
1313
:PreparedTests.*\
14+
:NamedParametersTests.*\
1415
:CassandraTypes/CassandraTypesTests/*.Integration_Cassandra_*\
1516
:BatchSingleNodeClusterTests*:BatchCounterSingleNodeClusterTests*:BatchCounterThreeNodeClusterTests*\
1617
:ErrorTests.*\
@@ -40,6 +41,7 @@ CASSANDRA_TEST_FILTER := $(subst ${SPACE},${EMPTY},ClusterTests.*\
4041
:SerialConsistencyTests.*\
4142
:HeartbeatTests.*\
4243
:PreparedTests.*\
44+
:NamedParametersTests.*\
4345
:CassandraTypes/CassandraTypesTests/*.Integration_Cassandra_*\
4446
:ErrorTests.*\
4547
:SslClientAuthenticationTests*:SslNoClusterTests*:SslNoSslOnClusterTests*:SslTests*\

scylla-rust-wrapper/src/batch.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::cass_types::CassConsistency;
44
use crate::cass_types::{make_batch_type, CassBatchType};
55
use crate::exec_profile::PerStatementExecProfile;
66
use crate::retry_policy::CassRetryPolicy;
7-
use crate::statement::{CassStatement, Statement};
7+
use crate::statement::{BoundStatement, CassStatement};
88
use crate::types::*;
99
use crate::value::CassCqlValue;
1010
use scylla::batch::Batch;
@@ -166,11 +166,15 @@ pub unsafe extern "C" fn cass_batch_add_statement(
166166
let statement = BoxFFI::as_ref(statement);
167167

168168
match &statement.statement {
169-
Statement::Simple(q) => state.batch.append_statement(q.query.clone()),
170-
Statement::Prepared(p) => state.batch.append_statement(p.statement.clone()),
169+
BoundStatement::Simple(q) => {
170+
state.batch.append_statement(q.query.clone());
171+
state.bound_values.push(q.bound_values.clone());
172+
}
173+
BoundStatement::Prepared(p) => {
174+
state.batch.append_statement(p.statement.statement.clone());
175+
state.bound_values.push(p.bound_values.clone());
176+
}
171177
};
172178

173-
state.bound_values.push(statement.bound_values.clone());
174-
175179
CassError::CASS_OK
176180
}

scylla-rust-wrapper/src/cass_error.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use scylla::transport::errors::*;
33
// Re-export error types.
44
pub(crate) use crate::cass_error_types::{CassError, CassErrorSource};
55
use crate::query_error::CassErrorResult;
6+
use crate::statement::UnknownNamedParameterError;
67

78
pub trait ToCassError {
89
fn to_cass_error(&self) -> CassError;
@@ -94,7 +95,14 @@ impl ToCassError for BadQuery {
9495
BadQuery::ValuesTooLongForKey(_usize, _usize2) => CassError::CASS_ERROR_LAST_ENTRY,
9596
BadQuery::BadKeyspaceName(_bad_keyspace_name) => CassError::CASS_ERROR_LAST_ENTRY,
9697
BadQuery::Other(_other_query) => CassError::CASS_ERROR_LAST_ENTRY,
97-
BadQuery::SerializationError(_) => CassError::CASS_ERROR_LAST_ENTRY,
98+
BadQuery::SerializationError(e) => {
99+
if e.downcast_ref::<UnknownNamedParameterError>().is_some() {
100+
// It means that our custom `UnknownNamedParameterError` was returned.
101+
CassError::CASS_ERROR_LIB_NAME_DOES_NOT_EXIST
102+
} else {
103+
CassError::CASS_ERROR_LAST_ENTRY
104+
}
105+
}
98106
BadQuery::TooManyQueriesInBatchStatement(_) => CassError::CASS_ERROR_LAST_ENTRY,
99107
// BadQuery is non_exhaustive
100108
// For now, since all other variants return LAST_ENTRY,

scylla-rust-wrapper/src/prepared.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::{
66
cass_error::CassError,
77
cass_types::{get_column_type, CassDataType},
88
query_result::CassResultMetadata,
9-
statement::{CassStatement, Statement},
9+
statement::{BoundPreparedStatement, BoundStatement, CassStatement},
1010
types::size_t,
1111
};
1212
use scylla::prepared_statement::PreparedStatement;
@@ -88,11 +88,14 @@ pub unsafe extern "C" fn cass_prepared_bind(
8888

8989
// cloning prepared statement's arc, because creating CassStatement should not invalidate
9090
// the CassPrepared argument
91-
let statement = Statement::Prepared(prepared);
91+
92+
let statement = BoundStatement::Prepared(BoundPreparedStatement {
93+
statement: prepared,
94+
bound_values: vec![Unset; bound_values_size],
95+
});
9296

9397
BoxFFI::into_ptr(Box::new(CassStatement {
9498
statement,
95-
bound_values: vec![Unset; bound_values_size],
9699
paging_state: PagingState::start(),
97100
// Cpp driver disables paging by default.
98101
paging_enabled: false,

scylla-rust-wrapper/src/session.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ use crate::metadata::create_table_metadata;
1010
use crate::metadata::{CassKeyspaceMeta, CassMaterializedViewMeta, CassSchemaMeta};
1111
use crate::prepared::CassPrepared;
1212
use crate::query_result::{CassResult, CassResultKind, CassResultMetadata};
13-
use crate::statement::CassStatement;
14-
use crate::statement::Statement;
13+
use crate::statement::{BoundStatement, CassStatement, SimpleQueryRowSerializer};
1514
use crate::types::{cass_uint64_t, size_t};
1615
use crate::uuid::CassUuid;
1716
use scylla::frame::types::Consistency;
@@ -258,7 +257,6 @@ pub unsafe extern "C" fn cass_session_execute(
258257
let statement_opt = BoxFFI::as_ref(statement_raw);
259258
let paging_state = statement_opt.paging_state.clone();
260259
let paging_enabled = statement_opt.paging_enabled;
261-
let bound_values = statement_opt.bound_values.clone();
262260
let request_timeout_ms = statement_opt.request_timeout_ms;
263261

264262
let mut statement = statement_opt.statement.clone();
@@ -282,8 +280,8 @@ pub unsafe extern "C" fn cass_session_execute(
282280
.await?;
283281

284282
match &mut statement {
285-
Statement::Simple(query) => query.query.set_execution_profile_handle(handle),
286-
Statement::Prepared(prepared) => Arc::make_mut(prepared)
283+
BoundStatement::Simple(query) => query.query.set_execution_profile_handle(handle),
284+
BoundStatement::Prepared(prepared) => Arc::make_mut(&mut prepared.statement)
287285
.statement
288286
.set_execution_profile_handle(handle),
289287
}
@@ -304,10 +302,15 @@ pub unsafe extern "C" fn cass_session_execute(
304302
QueryError,
305303
>;
306304
let query_res: QueryRes = match statement {
307-
Statement::Simple(query) => {
305+
BoundStatement::Simple(query) => {
308306
// We don't store result metadata for Queries - return None.
309307
let maybe_result_metadata = None;
310308

309+
let bound_values = SimpleQueryRowSerializer {
310+
bound_values: query.bound_values,
311+
name_to_bound_index: query.name_to_bound_index,
312+
};
313+
311314
if paging_enabled {
312315
session
313316
.query_single_page(query.query, bound_values, paging_state)
@@ -326,19 +329,23 @@ pub unsafe extern "C" fn cass_session_execute(
326329
})
327330
}
328331
}
329-
Statement::Prepared(prepared) => {
332+
BoundStatement::Prepared(prepared) => {
330333
// Clone result metadata, so we don't need to construct it from scratch in
331334
// `CassResultMetadata::from_column_specs` - it requires a lot of allocations for complex types.
332-
let maybe_result_metadata = Some(Arc::clone(&prepared.result_metadata));
335+
let maybe_result_metadata = Some(Arc::clone(&prepared.statement.result_metadata));
333336

334337
if paging_enabled {
335338
session
336-
.execute_single_page(&prepared.statement, bound_values, paging_state)
339+
.execute_single_page(
340+
&prepared.statement.statement,
341+
prepared.bound_values,
342+
paging_state,
343+
)
337344
.await
338345
.map(|(qr, psr)| (qr, psr, maybe_result_metadata))
339346
} else {
340347
session
341-
.execute_unpaged(&prepared.statement, bound_values)
348+
.execute_unpaged(&prepared.statement.statement, prepared.bound_values)
342349
.await
343350
.map(|result| {
344351
(
@@ -385,9 +392,9 @@ pub unsafe extern "C" fn cass_session_prepare_from_existing(
385392

386393
CassFuture::make_raw(async move {
387394
let query = match &statement {
388-
Statement::Simple(q) => q,
389-
Statement::Prepared(ps) => {
390-
return Ok(CassResultValue::Prepared(ps.clone()));
395+
BoundStatement::Simple(q) => q,
396+
BoundStatement::Prepared(ps) => {
397+
return Ok(CassResultValue::Prepared(ps.statement.clone()));
391398
}
392399
};
393400

0 commit comments

Comments
 (0)