diff options
author | walrus@mysql.com <> | 2002-11-09 01:22:44 +0500 |
---|---|---|
committer | walrus@mysql.com <> | 2002-11-09 01:22:44 +0500 |
commit | 24dd50e406e86861ddb5115d51ede2a5aafa69b5 (patch) | |
tree | 8a2f5ecc2538b9d33f621b0086f77405b4352d5a | |
parent | b5a740d0b31d698db21976908b11131309b799bc (diff) | |
parent | 5d2f8e96f176f428d43fa1eb93c3eba139f446ee (diff) | |
download | mariadb-git-24dd50e406e86861ddb5115d51ede2a5aafa69b5.tar.gz |
Merge akishkin@work.mysql.com:/home/bk/mysql
into mysql.com:/home/walrus/bk/323
-rw-r--r-- | innobase/row/row0mysql.c | 23 | ||||
-rw-r--r-- | mysql-test/r/merge.result | 6 | ||||
-rw-r--r-- | mysql-test/t/merge.test | 19 | ||||
-rw-r--r-- | sql/ha_myisammrg.cc | 23 | ||||
-rw-r--r-- | sql/sql_select.cc | 8 |
5 files changed, 71 insertions, 8 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 26878f8c97c..ebb3cbe8dc8 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1000,8 +1000,8 @@ row_update_cascade_for_mysql( or set null operation */ dict_table_t* table) /* in: table where we do the operation */ { - ulint err; - trx_t* trx; + ulint err; + trx_t* trx; trx = thr_get_trx(thr); run_again: @@ -1012,11 +1012,26 @@ run_again: err = trx->error_state; + /* Note that the cascade node is a subnode of another InnoDB + query graph node. We do a normal lock wait in this node, but + all errors are handled by the parent node. */ + if (err == DB_LOCK_WAIT) { - que_thr_stop_for_mysql(thr); + /* Handle lock wait here */ - row_mysql_handle_errors(&err, trx, thr, NULL); + que_thr_stop_for_mysql(thr); + srv_suspend_mysql_thread(thr); + + /* Note that a lock wait may also end in a lock wait timeout */ + + if (trx->error_state != DB_SUCCESS) { + + return(trx->error_state); + } + + /* Retry operation after a normal lock wait */ + goto run_again; } diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 653e25af799..bdde202b335 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -130,3 +130,9 @@ a a b 1 1 1 2 +a +1 +2 +a +1 +2 diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test index 238dd599664..6ea9ecc269f 100644 --- a/mysql-test/t/merge.test +++ b/mysql-test/t/merge.test @@ -114,3 +114,22 @@ insert into t2 values (1,1),(2,2),(0,0),(4,4),(5,5),(6,6); flush tables; select * from t3 where a=1 order by b limit 2; drop table t3,t1,t2; + +# +# temporary merge tables +# +drop table if exists t1, t2, t3, t4, t5, t6; +create table t1 (a int not null); +create table t2 (a int not null); +insert into t1 values (1); +insert into t2 values (2); +create temporary table t3 (a int not null) TYPE=MERGE UNION=(t1,t2); +select * from t3; +create temporary table t4 (a int not null); +create temporary table t5 (a int not null); +insert into t4 values (1); +insert into t5 values (2); +create temporary table t6 (a int not null) TYPE=MERGE UNION=(t4,t5); +select * from t6; +drop table if exists t1, t2, t3, t4, t5, t6; + diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc index e5fb0310a36..e9b6a048264 100644 --- a/sql/ha_myisammrg.cc +++ b/sql/ha_myisammrg.cc @@ -264,7 +264,28 @@ int ha_myisammrg::create(const char *name, register TABLE *form, sizeof(char*)))) DBUG_RETURN(1); for (pos=table_names ; tables ; tables=tables->next) - *pos++= tables->real_name; + { + char *table_name; + if (create_info->options & HA_LEX_CREATE_TMP_TABLE) + { + TABLE **tbl=find_temporary_table(current_thd, + tables->db, tables->real_name); + if (!tbl) + { + table_name=sql_alloc(1+ + my_snprintf(buff,FN_REFLEN,"%s/%s/%s",mysql_real_data_home, + tables->db, tables->real_name)); + if (!table_name) + DBUG_RETURN(1); + strcpy(table_name, buff); + } + else + table_name=(*tbl)->path; + } + else + table_name=tables->real_name; + *pos++= table_name; + } *pos=0; DBUG_RETURN(myrg_create(fn_format(buff,name,"","",2+4+16), (const char **) table_names, (my_bool) 0)); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 49502a7a116..3596fdc0c05 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1371,15 +1371,15 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array, *arg1=(Item_func *)(func->arguments()[1]); if ((functype == Item_func::GE_FUNC || functype == Item_func::GT_FUNC) && - arg0->type() == Item::FUNC_ITEM && + arg0->type() == Item::FUNC_ITEM && arg0->functype() == Item_func::FT_FUNC && - arg1->const_item() && arg1->val()>=0) + arg1->const_item() && arg1->val()>0) cond_func=(Item_func_match *) arg0; else if ((functype == Item_func::LE_FUNC || functype == Item_func::LT_FUNC) && arg1->type() == Item::FUNC_ITEM && arg1->functype() == Item_func::FT_FUNC && - arg0->const_item() && arg0->val()>=0) + arg0->const_item() && arg0->val()>0) cond_func=(Item_func_match *) arg1; } } @@ -4970,6 +4970,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), } else { + if (end_of_records) + DBUG_RETURN(0); join->first_record=1; VOID(test_if_group_changed(join->group_fields)); } |