summaryrefslogtreecommitdiff
path: root/sql/sql_prepare.cc
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2003-09-02 19:56:55 +0300
committerunknown <bell@sanja.is.com.ua>2003-09-02 19:56:55 +0300
commit2d7b48987621f20a57487d460d3bd77be4f254d5 (patch)
tree354683527bb4727d44f35e20a3d4f06e5e53d9b3 /sql/sql_prepare.cc
parent0e2f62640500d2d8c0acfbcdc91f207b8457da48 (diff)
downloadmariadb-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.cc23
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))