summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-09-22 17:50:37 +0200
committerSergei Golubchik <serg@mariadb.org>2016-09-22 17:50:37 +0200
commitf32a5115584c9b33a2163df57830ad335cd2b3ab (patch)
treeeb121e6577aa86edc7a1a604b6bc6b40bb7d90ba
parentf7640e1194793cc4252ad168937a4233ed9a632b (diff)
parent272637887c58ce43ee4f866ca8e212680abdadf6 (diff)
downloadmariadb-git-f32a5115584c9b33a2163df57830ad335cd2b3ab.tar.gz
Merge branch '10.2' into bb-10.2-connector-c-integ-subm
-rw-r--r--mysql-test/r/cte_recursive.result48
-rw-r--r--mysql-test/t/cte_recursive.test38
-rw-r--r--sql/sql_parse.cc6
-rw-r--r--sql/sql_yacc.yy26
-rw-r--r--storage/innobase/sync/sync0arr.cc87
-rw-r--r--storage/innobase/ut/ut0crc32.cc4
6 files changed, 119 insertions, 90 deletions
diff --git a/mysql-test/r/cte_recursive.result b/mysql-test/r/cte_recursive.result
index b37a32a8ae7..1aa469029dd 100644
--- a/mysql-test/r/cte_recursive.result
+++ b/mysql-test/r/cte_recursive.result
@@ -1556,6 +1556,54 @@ EXPLAIN
}
}
}
+create table my_ancestors
+with recursive
+ancestor_ids (id)
+as
+(
+select father from folks where name = 'Me'
+ union
+select mother from folks where name = 'Me'
+ union
+select father from folks, ancestor_ids a where folks.id = a.id
+union
+select mother from folks, ancestor_ids a where folks.id = a.id
+)
+select p.* from folks as p, ancestor_ids as a where p.id = a.id;
+select * from my_ancestors;
+id name dob father mother
+20 Dad 1970-02-02 10 9
+30 Mom 1975-03-03 8 7
+10 Grandpa Bill 1940-04-05 NULL NULL
+9 Grandma Ann 1941-10-15 NULL NULL
+7 Grandma Sally 1943-08-23 NULL 6
+8 Grandpa Ben 1940-10-21 NULL NULL
+6 Grandgrandma Martha 1923-05-17 NULL NULL
+delete from my_ancestors;
+insert into my_ancestors
+with recursive
+ancestor_ids (id)
+as
+(
+select father from folks where name = 'Me'
+ union
+select mother from folks where name = 'Me'
+ union
+select father from folks, ancestor_ids a where folks.id = a.id
+union
+select mother from folks, ancestor_ids a where folks.id = a.id
+)
+select p.* from folks as p, ancestor_ids as a where p.id = a.id;
+select * from my_ancestors;
+id name dob father mother
+20 Dad 1970-02-02 10 9
+30 Mom 1975-03-03 8 7
+10 Grandpa Bill 1940-04-05 NULL NULL
+9 Grandma Ann 1941-10-15 NULL NULL
+7 Grandma Sally 1943-08-23 NULL 6
+8 Grandpa Ben 1940-10-21 NULL NULL
+6 Grandgrandma Martha 1923-05-17 NULL NULL
+drop table my_ancestors;
drop table folks;
#
# MDEV-10372: [bb-10.2-mdev9864 tree] EXPLAIN with recursive CTE enters endless recursion
diff --git a/mysql-test/t/cte_recursive.test b/mysql-test/t/cte_recursive.test
index 5eb84bae4fb..c2c02a6680d 100644
--- a/mysql-test/t/cte_recursive.test
+++ b/mysql-test/t/cte_recursive.test
@@ -1162,6 +1162,44 @@ select h_name, h_dob, w_name, w_dob
from ancestor_couples;
+create table my_ancestors
+with recursive
+ancestor_ids (id)
+as
+(
+ select father from folks where name = 'Me'
+ union
+ select mother from folks where name = 'Me'
+ union
+ select father from folks, ancestor_ids a where folks.id = a.id
+ union
+ select mother from folks, ancestor_ids a where folks.id = a.id
+)
+select p.* from folks as p, ancestor_ids as a where p.id = a.id;
+
+select * from my_ancestors;
+
+delete from my_ancestors;
+
+insert into my_ancestors
+with recursive
+ancestor_ids (id)
+as
+(
+ select father from folks where name = 'Me'
+ union
+ select mother from folks where name = 'Me'
+ union
+ select father from folks, ancestor_ids a where folks.id = a.id
+ union
+ select mother from folks, ancestor_ids a where folks.id = a.id
+)
+select p.* from folks as p, ancestor_ids as a where p.id = a.id;
+
+select * from my_ancestors;
+
+drop table my_ancestors;
+
drop table folks;
--echo #
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index effc0230536..ac00b21c837 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3781,7 +3781,8 @@ mysql_execute_command(THD *thd)
/* Copy temporarily the statement flags to thd for lock_table_names() */
uint save_thd_create_info_options= thd->lex->create_info.options;
thd->lex->create_info.options|= create_info.options;
- res= open_and_lock_tables(thd, create_info, lex->query_tables, TRUE, 0);
+ if (!(res= check_dependencies_in_with_clauses(lex->with_clauses_list)))
+ res= open_and_lock_tables(thd, create_info, lex->query_tables, TRUE, 0);
thd->lex->create_info.options= save_thd_create_info_options;
if (res)
{
@@ -4394,7 +4395,8 @@ end_with_restore_list:
unit->set_limit(select_lex);
- if (!(res= open_and_lock_tables(thd, all_tables, TRUE, 0)))
+ if (!(res= check_dependencies_in_with_clauses(lex->with_clauses_list)) &&
+ !(res=open_and_lock_tables(thd, all_tables, TRUE, 0)))
{
MYSQL_INSERT_SELECT_START(thd->query());
/*
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 551a86e4a41..1facf0623d4 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -4810,16 +4810,22 @@ create_like:
opt_create_select:
/* empty */ {}
- | opt_duplicate opt_as create_select_query_expression_body
+ | opt_duplicate opt_as create_select_query_expression
;
-create_select_query_expression_body:
- SELECT_SYM create_select_part2 opt_table_expression
+create_select_query_expression:
+ opt_with_clause SELECT_SYM create_select_part2 opt_table_expression
create_select_part4
- { Select->set_braces(0);}
+ {
+ Select->set_braces(0);
+ Select->set_with_clause($1);
+ }
union_clause
- | SELECT_SYM create_select_part2 create_select_part3_union_not_ready
- create_select_part4
+ | opt_with_clause SELECT_SYM create_select_part2
+ create_select_part3_union_not_ready create_select_part4
+ {
+ Select->set_with_clause($1);
+ }
| '(' create_select_query_specification ')'
| '(' create_select_query_specification ')'
{ Select->set_braces(1);} union_list {}
@@ -5519,7 +5525,11 @@ opt_part_option:
*/
create_select_query_specification:
- SELECT_SYM create_select_part2 create_select_part3 create_select_part4
+ SELECT_SYM opt_with_clause create_select_part2 create_select_part3
+ create_select_part4
+ {
+ Select->set_with_clause($2);
+ }
;
create_select_part2:
@@ -12308,7 +12318,7 @@ fields:
insert_values:
VALUES values_list {}
| VALUE_SYM values_list {}
- | create_select_query_expression_body {}
+ | create_select_query_expression {}
;
values_list:
diff --git a/storage/innobase/sync/sync0arr.cc b/storage/innobase/sync/sync0arr.cc
index f6416263eee..97c83fd5757 100644
--- a/storage/innobase/sync/sync0arr.cc
+++ b/storage/innobase/sync/sync0arr.cc
@@ -501,9 +501,7 @@ void
sync_array_cell_print(
/*==================*/
FILE* file, /*!< in: file where to print */
- sync_cell_t* cell, /*!< in: sync cell */
- os_thread_id_t* reserver) /*!< out: write reserver or
- 0 */
+ sync_cell_t* cell) /*!< in: sync cell */
{
rw_lock_t* rwlock;
ulint type;
@@ -601,7 +599,6 @@ sync_array_cell_print(
writer == RW_LOCK_X ? " exclusive\n"
: writer == RW_LOCK_SX ? " SX\n"
: " wait exclusive\n");
- *reserver = rwlock->writer_thread;
}
fprintf(file,
@@ -715,7 +712,7 @@ sync_array_report_error(
sync_cell_t* cell)
{
fprintf(stderr, "rw-lock %p ", (void*) lock);
- sync_array_cell_print(stderr, cell, 0);
+ sync_array_cell_print(stderr, cell);
rw_lock_debug_print(stderr, debug);
}
@@ -788,7 +785,7 @@ sync_array_detect_deadlock(
<< " file " << name << " line "
<< policy.get_enter_line();
- sync_array_cell_print(stderr, cell, 0);
+ sync_array_cell_print(stderr, cell);
return(true);
}
@@ -1152,7 +1149,7 @@ sync_array_print_long_waits_low(
if (diff > SYNC_ARRAY_TIMEOUT) {
ib::warn() << "A long semaphore wait:";
- sync_array_cell_print(stderr, cell, 0);
+ sync_array_cell_print(stderr, cell);
*noticed = TRUE;
}
@@ -1167,14 +1164,12 @@ sync_array_print_long_waits_low(
}
}
- /* We found a long semaphore wait, wait all threads that are
+ /* We found a long semaphore wait, print all threads that are
waiting for a semaphore. */
if (*noticed) {
for (i = 0; i < arr->n_cells; i++) {
void* wait_object;
- os_thread_id_t reserver=(os_thread_id_t)ULINT_UNDEFINED;
sync_cell_t* cell;
- ulint loop = 0;
cell = sync_array_get_nth_cell(arr, i);
@@ -1185,41 +1180,8 @@ sync_array_print_long_waits_low(
continue;
}
- fputs("InnoDB: Warning: semaphore wait:\n",
- stderr);
- sync_array_cell_print(stderr, cell, 0);
-
- /* Try to output cell information for writer recursive way */
- while (reserver != (os_thread_id_t)ULINT_UNDEFINED) {
- sync_cell_t* reserver_wait;
-
- reserver_wait = sync_array_find_thread(arr, reserver);
-
- if (reserver_wait &&
- reserver_wait->latch.mutex != NULL &&
- reserver_wait->waiting) {
- fputs("InnoDB: Warning: Writer thread is waiting this semaphore:\n",
- stderr);
- reserver = (os_thread_id_t)ULINT_UNDEFINED;
- sync_array_cell_print(stderr, reserver_wait, &reserver);
- loop++;
-
- /* TODO: FIXME:
- if (reserver_wait->thread == reserver) {
- reserver = (os_thread_id_t)ULINT_UNDEFINED;
- }
- */
- } else {
- reserver = (os_thread_id_t)ULINT_UNDEFINED;
- }
-
- /* This is protection against loop */
- if (loop > 100) {
- fputs("InnoDB: Warning: Too many waiting threads.\n", stderr);
- break;
- }
-
- }
+ ib::info() << "A semaphore wait:";
+ sync_array_cell_print(stderr, cell);
}
}
@@ -1314,7 +1276,7 @@ sync_array_print_info_low(
if (cell->latch.mutex != 0) {
count++;
- sync_array_cell_print(file, cell, 0);
+ sync_array_cell_print(file, cell);
}
}
}
@@ -1404,8 +1366,6 @@ sync_array_print_innodb(void)
for (i = 0; i < arr->n_cells; i++) {
void* wait_object;
sync_cell_t* cell;
- os_thread_id_t reserver=(os_thread_id_t)ULINT_UNDEFINED;
- ulint loop=0;
cell = sync_array_get_nth_cell(arr, i);
@@ -1418,36 +1378,7 @@ sync_array_print_innodb(void)
fputs("InnoDB: Warning: semaphore wait:\n",
stderr);
- sync_array_cell_print(stderr, cell, &reserver);
-
- /* Try to output cell information for writer recursive way */
- while (reserver != (os_thread_id_t)ULINT_UNDEFINED) {
- sync_cell_t* reserver_wait;
-
- reserver_wait = sync_array_find_thread(arr, reserver);
-
- if (reserver_wait &&
- reserver_wait->latch.mutex != NULL &&
- reserver_wait->waiting) {
- fputs("InnoDB: Warning: Writer thread is waiting this semaphore:\n",
- stderr);
- sync_array_cell_print(stderr, reserver_wait, &reserver);
-
- /* JAN: FIXME:
- if (reserver_wait->thread == reserver) {
- reserver = (os_thread_id_t)ULINT_UNDEFINED;
- }
- */
- } else {
- reserver = (os_thread_id_t)ULINT_UNDEFINED;
- }
-
- /* This is protection against loop */
- if (loop > 100) {
- fputs("InnoDB: Warning: Too many waiting threads.\n", stderr);
- break;
- }
- }
+ sync_array_cell_print(stderr, cell);
}
fputs("InnoDB: Semaphore wait debug output ended:\n", stderr);
diff --git a/storage/innobase/ut/ut0crc32.cc b/storage/innobase/ut/ut0crc32.cc
index e4f0f310224..2d892be869b 100644
--- a/storage/innobase/ut/ut0crc32.cc
+++ b/storage/innobase/ut/ut0crc32.cc
@@ -447,12 +447,12 @@ static bool ut_crc32_slice8_table_initialized = false;
/********************************************************************//**
Initializes the table that is used to generate the CRC32 if the CPU does
not have support for it. */
-#ifndef HAVE_CRC32_VPMSUM
static
void
ut_crc32_slice8_table_init()
/*========================*/
{
+#ifndef HAVE_CRC32_VPMSUM
/* bit-reversed poly 0x1EDC6F41 (from SSE42 crc32 instruction) */
static const uint32_t poly = 0x82f63b78;
uint32_t n;
@@ -476,8 +476,8 @@ ut_crc32_slice8_table_init()
}
ut_crc32_slice8_table_initialized = true;
-}
#endif
+}
/** Calculate CRC32 over 8-bit data using a software implementation.
@param[in,out] crc crc32 checksum so far when this function is called,