Loading innobase/row/row0mysql.c +19 −4 Original line number Diff line number Diff line Loading @@ -1012,10 +1012,25 @@ row_update_cascade_for_mysql( 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) { /* Handle lock wait here */ que_thr_stop_for_mysql(thr); row_mysql_handle_errors(&err, trx, thr, NULL); 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; } Loading mysql-test/r/merge.result +6 −0 Original line number Diff line number Diff line Loading @@ -130,3 +130,9 @@ a a b 1 1 1 2 a 1 2 a 1 2 mysql-test/t/merge.test +19 −0 Original line number Diff line number Diff line Loading @@ -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; sql/ha_myisammrg.cc +22 −1 Original line number Diff line number Diff line Loading @@ -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)); Loading sql/sql_select.cc +5 −3 Original line number Diff line number Diff line Loading @@ -1373,13 +1373,13 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array, functype == Item_func::GT_FUNC) && 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; } } Loading Loading @@ -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)); } Loading Loading
innobase/row/row0mysql.c +19 −4 Original line number Diff line number Diff line Loading @@ -1012,10 +1012,25 @@ row_update_cascade_for_mysql( 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) { /* Handle lock wait here */ que_thr_stop_for_mysql(thr); row_mysql_handle_errors(&err, trx, thr, NULL); 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; } Loading
mysql-test/r/merge.result +6 −0 Original line number Diff line number Diff line Loading @@ -130,3 +130,9 @@ a a b 1 1 1 2 a 1 2 a 1 2
mysql-test/t/merge.test +19 −0 Original line number Diff line number Diff line Loading @@ -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;
sql/ha_myisammrg.cc +22 −1 Original line number Diff line number Diff line Loading @@ -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)); Loading
sql/sql_select.cc +5 −3 Original line number Diff line number Diff line Loading @@ -1373,13 +1373,13 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array, functype == Item_func::GT_FUNC) && 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; } } Loading Loading @@ -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)); } Loading