@@ -369,7 +369,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
369369
370370/* {{{ mysqlnd_stmt::prepare */
371371static 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 )
373373{
374374 MYSQLND_STMT_DATA * stmt = s ? s -> data : NULL ;
375375 MYSQLND_CONN_DATA * conn = stmt ? stmt -> conn : NULL ;
@@ -391,12 +391,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query
391391 /*
392392 Create a new prepared statement and destroy the previous one.
393393 */
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 ) {
397396 goto fail ;
398397 }
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);
400413 }
401414
402415 {
0 commit comments