summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwalrus@mysql.com <>2002-11-09 01:22:44 +0500
committerwalrus@mysql.com <>2002-11-09 01:22:44 +0500
commit24dd50e406e86861ddb5115d51ede2a5aafa69b5 (patch)
tree8a2f5ecc2538b9d33f621b0086f77405b4352d5a
parentb5a740d0b31d698db21976908b11131309b799bc (diff)
parent5d2f8e96f176f428d43fa1eb93c3eba139f446ee (diff)
downloadmariadb-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.c23
-rw-r--r--mysql-test/r/merge.result6
-rw-r--r--mysql-test/t/merge.test19
-rw-r--r--sql/ha_myisammrg.cc23
-rw-r--r--sql/sql_select.cc8
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));
}