@@ -391,7 +391,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
391391
392392/* {{{ mysqlnd_stmt::prepare */
393393static 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 )
395395{
396396 MYSQLND_STMT_DATA * stmt = s ? s -> data : NULL ;
397397 MYSQLND_CONN_DATA * conn = stmt ? stmt -> conn : NULL ;
@@ -413,12 +413,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query
413413 /*
414414 Create a new prepared statement and destroy the previous one.
415415 */
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 ) {
419418 goto fail ;
420419 }
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);
422435 }
423436
424437 {
0 commit comments