@@ -369,7 +369,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
369
369
370
370
/* {{{ mysqlnd_stmt::prepare */
371
371
static enum_func_status
372
- MYSQLND_METHOD (mysqlnd_stmt , prepare )(MYSQLND_STMT * s , const char * const query , const size_t query_len )
372
+ MYSQLND_METHOD (mysqlnd_stmt , prepare )(MYSQLND_STMT * const s , const char * const query , const size_t query_len )
373
373
{
374
374
MYSQLND_STMT_DATA * stmt = s ? s -> data : NULL ;
375
375
MYSQLND_CONN_DATA * conn = stmt ? stmt -> conn : NULL ;
@@ -391,12 +391,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query
391
391
/*
392
392
Create a new prepared statement and destroy the previous one.
393
393
*/
394
- s -> m -> dtor (s , TRUE);
395
- s = conn -> m -> stmt_init (conn );
396
- if (!s ) {
394
+ MYSQLND_STMT * s_to_prepare = conn -> m -> stmt_init (conn );
395
+ if (!s_to_prepare ) {
397
396
goto fail ;
398
397
}
399
- stmt = s -> data ;
398
+ MYSQLND_STMT_DATA * stmt_to_prepare = s_to_prepare -> data ;
399
+
400
+ /* swap */
401
+ size_t real_size = sizeof (MYSQLND_STMT ) + mysqlnd_plugin_count () * sizeof (void * );
402
+ char * tmp_swap = mnd_malloc (real_size );
403
+ memcpy (tmp_swap , s , real_size );
404
+ memcpy (s , s_to_prepare , real_size );
405
+ memcpy (s_to_prepare , tmp_swap , real_size );
406
+ mnd_free (tmp_swap );
407
+ {
408
+ MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare ;
409
+ stmt_to_prepare = stmt ;
410
+ stmt = tmp_swap_data ;
411
+ }
412
+ s_to_prepare -> m -> dtor (s_to_prepare , TRUE);
400
413
}
401
414
402
415
{
0 commit comments