summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2002-11-23 19:20:04 +0200
committerbell@sanja.is.com.ua <>2002-11-23 19:20:04 +0200
commit202446401849fa754389a0363830b167606087d5 (patch)
tree9fe88aa9a632d93ab216559d9912707472f72580 /sql
parenta2700eca6f8bea8829c2368c12c2527929df6ab0 (diff)
parent21ca25debf7d027ad9588cc69075e6142402fdd6 (diff)
downloadmariadb-git-202446401849fa754389a0363830b167606087d5.tar.gz
merging
Diffstat (limited to 'sql')
-rw-r--r--sql/mysql_priv.h3
-rw-r--r--sql/sql_base.cc16
-rw-r--r--sql/sql_lex.cc3
-rw-r--r--sql/sql_select.cc3
-rw-r--r--sql/sql_update.cc19
-rw-r--r--sql/sql_yacc.yy5
6 files changed, 35 insertions, 14 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 3ba88d493bd..a92893ca142 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -448,7 +448,8 @@ void kill_delayed_threads(void);
int mysql_delete(THD *thd, TABLE_LIST *table, COND *conds, ORDER *order,
ha_rows rows, ulong options);
int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok=0);
-TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type update);
+TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type update,
+ bool multiopen= 0);
TABLE *open_table(THD *thd,const char *db,const char *table,const char *alias,
bool *refresh);
TABLE *reopen_name_locked_table(THD* thd, TABLE_LIST* table);
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 59310fb00de..4c6192bc694 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1615,16 +1615,24 @@ static bool check_lock_and_start_stmt(THD *thd, TABLE *table,
table_list->table table
*/
-TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type)
+TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type,
+ bool multiopen)
{
TABLE *table;
bool refresh;
DBUG_ENTER("open_ltable");
thd->proc_info="Opening table";
- while (!(table=open_table(thd,table_list->db,
- table_list->real_name,table_list->alias,
- &refresh)) && refresh) ;
+ if (table_list->next && multiopen)
+ {
+ while (open_tables(thd,table_list) && refresh) ;
+ table= table_list->table;
+ }
+ else
+ while (!(table= open_table(thd,table_list->db,
+ table_list->real_name,table_list->alias,
+ &refresh)) && refresh) ;
+
if (table)
{
#if defined( __WIN__) || defined(OS2)
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 286cec87424..5adc1bec539 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -149,6 +149,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length)
lex->select_lex.expr_list.empty();
lex->select_lex.ftfunc_list_alloc.empty();
lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc;
+ lex->select= &lex->select_lex;
lex->convert_set= (lex->thd= thd)->variables.convert_set;
lex->yacc_yyss=lex->yacc_yyvs=0;
lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE);
@@ -959,6 +960,7 @@ void st_select_lex::init_query()
item_list.empty();
join= 0;
olap= UNSPECIFIED_OLAP_TYPE;
+ having_fix_field= 0;
}
void st_select_lex::init_select()
@@ -976,7 +978,6 @@ void st_select_lex::init_select()
ftfunc_list_alloc.empty();
ftfunc_list= &ftfunc_list_alloc;
linkage= UNSPECIFIED_TYPE;
- having_fix_field= 0;
}
/*
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 20b000392df..34f8108f6de 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -5698,6 +5698,9 @@ make_cond_for_table(COND *cond,table_map tables,table_map used_table)
static Item *
part_of_refkey(TABLE *table,Field *field)
{
+ if (!table->reginfo.join_tab)
+ return (Item*) 0; // field from outer non-select (UPDATE,...)
+
uint ref_parts=table->reginfo.join_tab->ref.key_parts;
if (ref_parts)
{
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index e3e0bca9856..ece2ed3df41 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -62,12 +62,18 @@ int mysql_update(THD *thd,
TABLE *table;
SQL_SELECT *select;
READ_RECORD info;
+ TABLE_LIST *update_table_list= (TABLE_LIST*)
+ thd->lex.select_lex.table_list.first;
DBUG_ENTER("mysql_update");
LINT_INIT(used_index);
LINT_INIT(timestamp_query_id);
- if (!(table = open_ltable(thd,table_list,table_list->lock_type)))
- DBUG_RETURN(-1); /* purecov: inspected */
+ table_list->lock_type= lock_type;
+ if ((open_and_lock_tables(thd, table_list)))
+ DBUG_RETURN(-1);
+ fix_tables_pointers(&thd->lex.select_lex);
+ table= table_list->table;
+
save_time_stamp=table->time_stamp;
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
thd->proc_info="init";
@@ -77,8 +83,9 @@ int mysql_update(THD *thd,
table->quick_keys=0;
want_privilege=table->grant.want_privilege;
table->grant.want_privilege=(SELECT_ACL & ~table->grant.privilege);
- if (setup_tables(table_list) || setup_conds(thd,table_list,&conds)
- || setup_ftfuncs(&thd->lex.select_lex))
+ if (setup_tables(update_table_list) ||
+ setup_conds(thd,update_table_list,&conds)
+ || setup_ftfuncs(&thd->lex.select_lex))
DBUG_RETURN(-1); /* purecov: inspected */
old_used_keys=table->used_keys; // Keys used in WHERE
@@ -94,7 +101,7 @@ int mysql_update(THD *thd,
/* Check the fields we are going to modify */
table->grant.want_privilege=want_privilege;
- if (setup_fields(thd,table_list,fields,1,0,0))
+ if (setup_fields(thd,update_table_list,fields,1,0,0))
DBUG_RETURN(-1); /* purecov: inspected */
if (table->timestamp_field)
{
@@ -107,7 +114,7 @@ int mysql_update(THD *thd,
/* Check values */
table->grant.want_privilege=(SELECT_ACL & ~table->grant.privilege);
- if (setup_fields(thd,table_list,values,0,0,0))
+ if (setup_fields(thd,update_table_list,values,0,0,0))
{
table->time_stamp=save_time_stamp; // Restore timestamp pointer
DBUG_RETURN(-1); /* purecov: inspected */
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index f2c8869b1af..e5ec86e6658 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1631,8 +1631,9 @@ select_init:
select_part2:
{
LEX *lex=Lex;
- lex->lock_option=TL_READ;
- mysql_init_select(lex);
+ if (lex->select == &lex->select_lex)
+ lex->lock_option= TL_READ; /* Only for global SELECT */
+ mysql_init_select(lex);
}
select_options select_item_list select_into select_lock_type;