@@ -391,7 +391,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
391
391
392
392
/* {{{ mysqlnd_stmt::prepare */
393
393
static enum_func_status
394
- MYSQLND_METHOD (mysqlnd_stmt , prepare )(MYSQLND_STMT * s , const char * const query , const size_t query_len )
394
+ MYSQLND_METHOD (mysqlnd_stmt , prepare )(MYSQLND_STMT * const s , const char * const query , const size_t query_len )
395
395
{
396
396
MYSQLND_STMT_DATA * stmt = s ? s -> data : NULL ;
397
397
MYSQLND_CONN_DATA * conn = stmt ? stmt -> conn : NULL ;
@@ -413,12 +413,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query
413
413
/*
414
414
Create a new prepared statement and destroy the previous one.
415
415
*/
416
- s -> m -> dtor (s , TRUE);
417
- s = conn -> m -> stmt_init (conn );
418
- if (!s ) {
416
+ MYSQLND_STMT * s_to_prepare = conn -> m -> stmt_init (conn );
417
+ if (!s_to_prepare ) {
419
418
goto fail ;
420
419
}
421
- stmt = s -> data ;
420
+ MYSQLND_STMT_DATA * stmt_to_prepare = s_to_prepare -> data ;
421
+
422
+ /* swap */
423
+ size_t real_size = sizeof (MYSQLND_STMT ) + mysqlnd_plugin_count () * sizeof (void * );
424
+ char * tmp_swap = mnd_malloc (real_size );
425
+ memcpy (tmp_swap , s , real_size );
426
+ memcpy (s , s_to_prepare , real_size );
427
+ memcpy (s_to_prepare , tmp_swap , real_size );
428
+ mnd_free (tmp_swap );
429
+ {
430
+ MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare ;
431
+ stmt_to_prepare = stmt ;
432
+ stmt = tmp_swap_data ;
433
+ }
434
+ s_to_prepare -> m -> dtor (s_to_prepare , TRUE);
422
435
}
423
436
424
437
{
0 commit comments