@@ -10,8 +10,7 @@ use crate::metadata::create_table_metadata;
10
10
use crate :: metadata:: { CassKeyspaceMeta , CassMaterializedViewMeta , CassSchemaMeta } ;
11
11
use crate :: prepared:: CassPrepared ;
12
12
use crate :: query_result:: { CassResult , CassResultKind , CassResultMetadata } ;
13
- use crate :: statement:: CassStatement ;
14
- use crate :: statement:: Statement ;
13
+ use crate :: statement:: { BoundStatement , CassStatement , SimpleQueryRowSerializer } ;
15
14
use crate :: types:: { cass_uint64_t, size_t} ;
16
15
use crate :: uuid:: CassUuid ;
17
16
use scylla:: frame:: types:: Consistency ;
@@ -258,7 +257,6 @@ pub unsafe extern "C" fn cass_session_execute(
258
257
let statement_opt = BoxFFI :: as_ref ( statement_raw) ;
259
258
let paging_state = statement_opt. paging_state . clone ( ) ;
260
259
let paging_enabled = statement_opt. paging_enabled ;
261
- let bound_values = statement_opt. bound_values . clone ( ) ;
262
260
let request_timeout_ms = statement_opt. request_timeout_ms ;
263
261
264
262
let mut statement = statement_opt. statement . clone ( ) ;
@@ -282,8 +280,8 @@ pub unsafe extern "C" fn cass_session_execute(
282
280
. await ?;
283
281
284
282
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 )
287
285
. statement
288
286
. set_execution_profile_handle ( handle) ,
289
287
}
@@ -304,10 +302,15 @@ pub unsafe extern "C" fn cass_session_execute(
304
302
QueryError ,
305
303
> ;
306
304
let query_res: QueryRes = match statement {
307
- Statement :: Simple ( query) => {
305
+ BoundStatement :: Simple ( query) => {
308
306
// We don't store result metadata for Queries - return None.
309
307
let maybe_result_metadata = None ;
310
308
309
+ let bound_values = SimpleQueryRowSerializer {
310
+ bound_values : query. bound_values ,
311
+ name_to_bound_index : query. name_to_bound_index ,
312
+ } ;
313
+
311
314
if paging_enabled {
312
315
session
313
316
. query_single_page ( query. query , bound_values, paging_state)
@@ -326,19 +329,23 @@ pub unsafe extern "C" fn cass_session_execute(
326
329
} )
327
330
}
328
331
}
329
- Statement :: Prepared ( prepared) => {
332
+ BoundStatement :: Prepared ( prepared) => {
330
333
// Clone result metadata, so we don't need to construct it from scratch in
331
334
// `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 ) ) ;
333
336
334
337
if paging_enabled {
335
338
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
+ )
337
344
. await
338
345
. map ( |( qr, psr) | ( qr, psr, maybe_result_metadata) )
339
346
} else {
340
347
session
341
- . execute_unpaged ( & prepared. statement , bound_values)
348
+ . execute_unpaged ( & prepared. statement . statement , prepared . bound_values )
342
349
. await
343
350
. map ( |result| {
344
351
(
@@ -385,9 +392,9 @@ pub unsafe extern "C" fn cass_session_prepare_from_existing(
385
392
386
393
CassFuture :: make_raw ( async move {
387
394
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 ( ) ) ) ;
391
398
}
392
399
} ;
393
400
0 commit comments