diff options
author | unknown <bell@sanja.is.com.ua> | 2003-09-02 19:56:55 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2003-09-02 19:56:55 +0300 |
commit | 2d7b48987621f20a57487d460d3bd77be4f254d5 (patch) | |
tree | 354683527bb4727d44f35e20a3d4f06e5e53d9b3 /sql/sql_prepare.cc | |
parent | 0e2f62640500d2d8c0acfbcdc91f207b8457da48 (diff) | |
download | mariadb-git-2d7b48987621f20a57487d460d3bd77be4f254d5.tar.gz |
fixed BUG#1180 (changing WHERE clause of prepared statements by optimisation)
sql/item.h:
constructor and method for aloning AND/OR structure of WHERE clause
sql/item_cmpfunc.cc:
constructor and method for aloning AND/OR structure of WHERE clause
sql/item_cmpfunc.h:
constructor and method for aloning AND/OR structure of WHERE clause
sql/item_func.cc:
constructor for aloning AND/OR structure of WHERE clause
sql/item_func.h:
constructor for aloning AND/OR structure of WHERE clause
sql/sql_lex.cc:
field for saving WHERE root
sql/sql_lex.h:
field for saving WHERE root
sql/sql_prepare.cc:
saving WHERE root
creating new AND/OR structure before executing prepared statement
tests/client_test.c:
test suite for bug #1180
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r-- | sql/sql_prepare.cc | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 550e4bbe086..3bebdef7738 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -873,11 +873,21 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length) if (!(specialflag & SPECIAL_NO_PRIOR)) my_pthread_setprio(pthread_self(),WAIT_PRIOR); + + // save WHERE clause pointers to avoid damaging they by optimisation + for (SELECT_LEX *sl= thd->lex.all_selects_list; + sl; + sl= sl->next_select_in_list()) + { + sl->prep_where= sl->where; + } + if (init_param_items(&stmt)) goto err; + - stmt.mem_root= stmt.thd->mem_root; + stmt.mem_root= stmt.thd->mem_root; tree_insert(&thd->prepared_statements, (void *)&stmt, 0, (void *)0); thd->mem_root= thd_root; // restore main mem_root DBUG_RETURN(0); @@ -919,6 +929,17 @@ void mysql_stmt_execute(THD *thd, char *packet) LEX thd_lex= thd->lex; thd->lex= stmt->lex; + + for (SELECT_LEX *sl= stmt->lex.all_selects_list; + sl; + sl= sl->next_select_in_list()) + { + // copy WHERE clause pointers to avoid damaging they by optimisation + if (sl->prep_where) + sl->where= sl->prep_where->copy_andor_structure(thd); + // force allocation new JOIN for this mem_root (for safety) + sl->join= 0; + } init_stmt_execute(stmt); if (stmt->param_count && setup_params_data(stmt)) |