Commit 193d1f6c authored by unknown's avatar unknown

Merge myvenu.com:/home/venu/bk/src-4.1

into myvenu.com:/home/venu/work/sql/dev-4.1

parents 0ebbac24 a3927906
...@@ -66,6 +66,7 @@ Long data handling: ...@@ -66,6 +66,7 @@ Long data handling:
#include "mysql_priv.h" #include "mysql_priv.h"
#include "sql_acl.h" #include "sql_acl.h"
#include "sql_select.h" // for JOIN
#include <assert.h> // for DEBUG_ASSERT() #include <assert.h> // for DEBUG_ASSERT()
#include <m_ctype.h> // for isspace() #include <m_ctype.h> // for isspace()
...@@ -402,7 +403,7 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list, ...@@ -402,7 +403,7 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list,
DBUG_RETURN(1); DBUG_RETURN(1);
if (setup_tables(table_list) || setup_fields(thd,table_list,fields,1,0,0) || if (setup_tables(table_list) || setup_fields(thd,table_list,fields,1,0,0) ||
setup_conds(thd,table_list,&conds)) setup_conds(thd,table_list,&conds) || thd->net.report_error)
DBUG_RETURN(1); DBUG_RETURN(1);
/* /*
...@@ -426,39 +427,41 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list, ...@@ -426,39 +427,41 @@ static bool mysql_test_upd_fields(PREP_STMT *stmt, TABLE_LIST *table_list,
And send column list fields info back to client. And send column list fields info back to client.
*/ */
static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
List<Item> &fields, List<Item> &values, List<Item> &fields, COND *conds,
COND *conds, ORDER *order, ORDER *group, ORDER *order, ORDER *group,
Item *having) Item *having, ORDER *proc,
ulong select_options,
SELECT_LEX_UNIT *unit,
SELECT_LEX *select_lex)
{ {
bool hidden_group_fields;
THD *thd= stmt->thd; THD *thd= stmt->thd;
List<Item> all_fields(fields); LEX *lex= &thd->lex;
select_result *result= thd->lex.result;
DBUG_ENTER("mysql_test_select_fields"); DBUG_ENTER("mysql_test_select_fields");
if ((&lex->select_lex != lex->all_selects_list &&
lex->unit.create_total_list(thd, lex, &tables)))
DBUG_RETURN(1);
if (open_and_lock_tables(thd, tables)) if (open_and_lock_tables(thd, tables))
DBUG_RETURN(1); DBUG_RETURN(1);
thd->used_tables=0; // Updated by setup_fields fix_tables_pointers(thd->lex.all_selects_list);
if (setup_tables(tables) ||
setup_fields(thd,tables,fields,1,&all_fields,1) ||
setup_conds(thd,tables,&conds) ||
setup_order(thd,tables,fields,all_fields,order) ||
setup_group(thd,tables,fields,all_fields,group,&hidden_group_fields))
DBUG_RETURN(1);
if (having) if (!result && !(result= new select_send()))
{ {
thd->where="having clause"; delete select_lex->having;
thd->allow_sum_func=1; delete select_lex->where;
if (having->check_cols(1) || having->fix_fields(thd, tables, &having) send_error(thd, ER_OUT_OF_RESOURCES);
|| thd->fatal_error) DBUG_RETURN(1);
DBUG_RETURN(1);
if (having->with_sum_func)
having->split_sum_func(all_fields);
} }
if (setup_ftfuncs(&thd->lex.select_lex))
JOIN *join= new JOIN(thd, fields, select_options, result);
thd->used_tables= 0; // Updated by setup_fields
if (join->prepare(tables, conds, order, group, having, proc,
select_lex, unit, 0))
DBUG_RETURN(1); DBUG_RETURN(1);
/* /*
...@@ -466,12 +469,14 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, ...@@ -466,12 +469,14 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables,
sending any info on where clause. sending any info on where clause.
*/ */
if (send_prep_stmt(stmt, fields.elements) || if (send_prep_stmt(stmt, fields.elements) ||
thd->protocol_simple.send_fields(&fields,0) || thd->protocol_simple.send_fields(&fields, 0) ||
send_item_params(stmt)) send_item_params(stmt))
DBUG_RETURN(1); DBUG_RETURN(1);
join->cleanup(thd);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/* /*
Send the prepare query results back to client Send the prepare query results back to client
*/ */
...@@ -514,10 +519,15 @@ static bool send_prepare_results(PREP_STMT *stmt) ...@@ -514,10 +519,15 @@ static bool send_prepare_results(PREP_STMT *stmt)
break; break;
case SQLCOM_SELECT: case SQLCOM_SELECT:
if (mysql_test_select_fields(stmt, tables, select_lex->item_list, if (mysql_test_select_fields(stmt, tables,
lex->value_list, select_lex->where, select_lex->item_list,
(ORDER*) select_lex->order_list.first, select_lex->where,
(ORDER*) select_lex->group_list.first, select_lex->having)) (ORDER*) select_lex->order_list.first,
(ORDER*) select_lex->group_list.first,
select_lex->having,
(ORDER*)lex->proc_list.first,
select_lex->options | thd->options,
&(lex->unit), select_lex))
goto abort; goto abort;
break; break;
...@@ -678,6 +688,10 @@ void mysql_stmt_execute(THD *thd, char *packet) ...@@ -678,6 +688,10 @@ void mysql_stmt_execute(THD *thd, char *packet)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
if (my_pthread_setspecific_ptr(THR_THD, stmt->thd) ||
my_pthread_setspecific_ptr(THR_MALLOC, &stmt->thd->mem_root))
DBUG_VOID_RETURN;
init_stmt_execute(stmt); init_stmt_execute(stmt);
if (stmt->param_count && setup_params_data(stmt)) if (stmt->param_count && setup_params_data(stmt))
...@@ -692,13 +706,17 @@ void mysql_stmt_execute(THD *thd, char *packet) ...@@ -692,13 +706,17 @@ void mysql_stmt_execute(THD *thd, char *packet)
mysql_delete(), mysql_update() and mysql_select() to not to mysql_delete(), mysql_update() and mysql_select() to not to
have re-check on setup_* and other things .. have re-check on setup_* and other things ..
*/ */
stmt->thd->protocol= &thd->protocol_prep; // Switch to binary protocol THD *cur_thd= stmt->thd;
mysql_execute_command(stmt->thd); cur_thd->protocol= &cur_thd->protocol_prep; // Switch to binary protocol
stmt->thd->protocol= &thd->protocol_simple; // Use normal protocol mysql_execute_command(cur_thd);
cur_thd->protocol= &cur_thd->protocol_simple; // Use normal protocol
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(), WAIT_PRIOR); my_pthread_setprio(pthread_self(), WAIT_PRIOR);
my_pthread_setspecific_ptr(THR_THD, thd);
my_pthread_setspecific_ptr(THR_MALLOC, &thd->mem_root);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment