Commit dffdbe3d authored by unknown's avatar unknown

Merge bk://localhost:5556

into  quadxeon.mysql.com:/benchmarks/ext3/TOSAVE/tsmith/bk/maint/51


mysql-test/r/range.result:
  Auto merged
mysys/string.c:
  Auto merged
sql/item.cc:
  Auto merged
parents ade93118 b1e27dab
...@@ -3456,3 +3456,20 @@ OPTIMIZE TABLE t1; ...@@ -3456,3 +3456,20 @@ OPTIMIZE TABLE t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 optimize status OK test.t1 optimize status OK
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (id int PRIMARY KEY, f int NOT NULL, INDEX(f)) ENGINE=InnoDB;
CREATE TABLE t2 (id int PRIMARY KEY, f INT NOT NULL,
CONSTRAINT t2_t1 FOREIGN KEY (id) REFERENCES t1 (id)
ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
ALTER TABLE t2 ADD FOREIGN KEY (f) REFERENCES t1 (f) ON
DELETE CASCADE ON UPDATE CASCADE;
SHOW CREATE TABLE t2;
Table Create Table
t2 CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`f` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `f` (`f`),
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f`) REFERENCES `t1` (`f`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `t2_t1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t2, t1;
...@@ -2504,6 +2504,22 @@ INSERT INTO t1 VALUES (1); ...@@ -2504,6 +2504,22 @@ INSERT INTO t1 VALUES (1);
OPTIMIZE TABLE t1; OPTIMIZE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #24741 (existing cascade clauses disappear when adding foreign keys)
#
CREATE TABLE t1 (id int PRIMARY KEY, f int NOT NULL, INDEX(f)) ENGINE=InnoDB;
CREATE TABLE t2 (id int PRIMARY KEY, f INT NOT NULL,
CONSTRAINT t2_t1 FOREIGN KEY (id) REFERENCES t1 (id)
ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
ALTER TABLE t2 ADD FOREIGN KEY (f) REFERENCES t1 (f) ON
DELETE CASCADE ON UPDATE CASCADE;
SHOW CREATE TABLE t2;
DROP TABLE t2, t1;
####################################################################### #######################################################################
# # # #
# Please, DO NOT TOUCH this file as well as the innodb.result file. # # Please, DO NOT TOUCH this file as well as the innodb.result file. #
......
...@@ -977,8 +977,7 @@ buf_flush_batch( ...@@ -977,8 +977,7 @@ buf_flush_batch(
} }
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
if (page_count != ULINT_UNDEFINED) srv_buf_pool_flushed += page_count;
srv_buf_pool_flushed+= page_count;
return(page_count); return(page_count);
} }
......
...@@ -1110,6 +1110,7 @@ dict_load_foreign( ...@@ -1110,6 +1110,7 @@ dict_load_foreign(
rec_t* rec; rec_t* rec;
byte* field; byte* field;
ulint len; ulint len;
ulint n_fields_and_type;
mtr_t mtr; mtr_t mtr;
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
...@@ -1172,15 +1173,15 @@ dict_load_foreign( ...@@ -1172,15 +1173,15 @@ dict_load_foreign(
foreign = dict_mem_foreign_create(); foreign = dict_mem_foreign_create();
foreign->n_fields = mach_read_from_4( n_fields_and_type = mach_read_from_4(
rec_get_nth_field_old(rec, 5, &len)); rec_get_nth_field_old(rec, 5, &len));
ut_a(len == 4); ut_a(len == 4);
/* We store the type to the bits 24-31 of n_fields */ /* We store the type in the bits 24..29 of n_fields_and_type. */
foreign->type = foreign->n_fields >> 24; foreign->type = n_fields_and_type >> 24;
foreign->n_fields = foreign->n_fields & 0xFFFFFFUL; foreign->n_fields = n_fields_and_type & 0x3FFUL;
foreign->id = mem_heap_strdup(foreign->heap, id); foreign->id = mem_heap_strdup(foreign->heap, id);
......
...@@ -119,7 +119,8 @@ ulint ...@@ -119,7 +119,8 @@ ulint
ut_2_power_up( ut_2_power_up(
/*==========*/ /*==========*/
/* out: first power of 2 which is >= n */ /* out: first power of 2 which is >= n */
ulint n); /* in: number != 0 */ ulint n) /* in: number != 0 */
__attribute__((const));
/**************************************************************** /****************************************************************
Sort function for ulint arrays. */ Sort function for ulint arrays. */
......
...@@ -335,6 +335,8 @@ que_fork_start_command( ...@@ -335,6 +335,8 @@ que_fork_start_command(
que_fork_t* fork) /* in: a query fork */ que_fork_t* fork) /* in: a query fork */
{ {
que_thr_t* thr; que_thr_t* thr;
que_thr_t* suspended_thr = NULL;
que_thr_t* completed_thr = NULL;
fork->state = QUE_FORK_ACTIVE; fork->state = QUE_FORK_ACTIVE;
...@@ -344,14 +346,18 @@ que_fork_start_command( ...@@ -344,14 +346,18 @@ que_fork_start_command(
but in a parallelized select, which necessarily is non-scrollable, but in a parallelized select, which necessarily is non-scrollable,
there may be several to choose from */ there may be several to choose from */
/*--------------------------------------------------------------- /* First we try to find a query thread in the QUE_THR_COMMAND_WAIT
First we try to find a query thread in the QUE_THR_COMMAND_WAIT state state. Then we try to find a query thread in the QUE_THR_SUSPENDED
*/ state, finally we try to find a query thread in the QUE_THR_COMPLETED
state */
thr = UT_LIST_GET_FIRST(fork->thrs); thr = UT_LIST_GET_FIRST(fork->thrs);
while (thr != NULL) { /* We make a single pass over the thr list within which we note which
if (thr->state == QUE_THR_COMMAND_WAIT) { threads are ready to run. */
while (thr) {
switch (thr->state) {
case QUE_THR_COMMAND_WAIT:
/* We have to send the initial message to query thread /* We have to send the initial message to query thread
to start it */ to start it */
...@@ -359,49 +365,44 @@ que_fork_start_command( ...@@ -359,49 +365,44 @@ que_fork_start_command(
que_thr_init_command(thr); que_thr_init_command(thr);
return(thr); return(thr);
}
ut_ad(thr->state != QUE_THR_LOCK_WAIT);
thr = UT_LIST_GET_NEXT(thrs, thr);
}
/*----------------------------------------------------------------
Then we try to find a query thread in the QUE_THR_SUSPENDED state */
thr = UT_LIST_GET_FIRST(fork->thrs); case QUE_THR_SUSPENDED:
while (thr != NULL) {
if (thr->state == QUE_THR_SUSPENDED) {
/* In this case the execution of the thread was /* In this case the execution of the thread was
suspended: no initial message is needed because suspended: no initial message is needed because
execution can continue from where it was left */ execution can continue from where it was left */
if (!suspended_thr) {
suspended_thr = thr;
}
que_thr_move_to_run_state(thr); break;
case QUE_THR_COMPLETED:
if (!completed_thr) {
completed_thr = thr;
}
break;
case QUE_THR_LOCK_WAIT:
ut_error;
return(thr);
} }
thr = UT_LIST_GET_NEXT(thrs, thr); thr = UT_LIST_GET_NEXT(thrs, thr);
} }
/*----------------------------------------------------------------- if (suspended_thr) {
Then we try to find a query thread in the QUE_THR_COMPLETED state */
thr = UT_LIST_GET_FIRST(fork->thrs);
while (thr != NULL) { thr = suspended_thr;
if (thr->state == QUE_THR_COMPLETED) { que_thr_move_to_run_state(thr);
que_thr_init_command(thr);
return(thr); } else if (completed_thr) {
}
thr = UT_LIST_GET_NEXT(thrs, thr); thr = completed_thr;
que_thr_init_command(thr);
} }
/* Else we return NULL */ return(thr);
return(NULL);
} }
/************************************************************************** /**************************************************************************
......
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