1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-12023 Assertion failure sym_node->table != NULL on startup

row_drop_table_for_mysql(): Avoid accessing non-existing dictionary tables.

dict_create_or_check_foreign_constraint_tables(): Add debug instrumentation
for creating and dropping a table before the creation of any non-core
dictionary tables.

trx_purge_add_update_undo_to_history(): Adjust a debug assertion, so that
it will not fail due to the test instrumentation.
This commit is contained in:
Marko Mäkelä
2018-10-30 13:29:19 +02:00
parent f4b8b6b9a3
commit 6ced789186
15 changed files with 588 additions and 174 deletions

View File

@@ -0,0 +1,5 @@
[debug]
--enable-gdb
[release]
--disable-gdb

View File

@@ -0,0 +1,3 @@
# include file for test files that can be run with and without debug
# having debug and non-debug tests.
let $have_debug=`select version() like '%debug%'`;

View File

@@ -23,6 +23,9 @@ sub skip_combinations {
# don't run tests for the wrong platform # don't run tests for the wrong platform
$skip{'include/platform.combinations'} = [ (IS_WINDOWS) ? 'unix' : 'win' ]; $skip{'include/platform.combinations'} = [ (IS_WINDOWS) ? 'unix' : 'win' ];
$skip{'include/maybe_debug.combinations'} =
[ defined $::mysqld_variables{'debug-dbug'} ? 'release' : 'debug' ];
# as a special case, disable certain include files as a whole # as a special case, disable certain include files as a whole
$skip{'include/not_embedded.inc'} = 'Not run for embedded server' $skip{'include/not_embedded.inc'} = 'Not run for embedded server'
if $::opt_embedded_server; if $::opt_embedded_server;

View File

@@ -0,0 +1,128 @@
--- suite/innodb/r/table_flags.result
+++ suite/innodb/r/table_flags,4k,debug.reject
@@ -10,81 +10,81 @@
CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
SYS_TABLES clustered index root page (8):
N_RECS=9; LEVEL=0; INDEX_ID=0x0000000000000001
-header=0x01000003016e (NAME=0x696e66696d756d00)
-header=0x00002815008d (NAME='SYS_DATAFILES',
- DB_TRX_ID=0x000000000301,
- DB_ROLL_PTR=0x81000001320194,
- ID=0x000000000000000e,
+header=0x0100000301bf (NAME=0x696e66696d756d00)
+header=0x0000301500de (NAME='SYS_DATAFILES',
+ DB_TRX_ID=0x000000000302,
+ DB_ROLL_PTR=0x81000003270194,
+ ID=0x000000000000000f,
N_COLS=0x00000002,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x0000101500d5 (NAME='SYS_FOREIGN',
+header=0x000018150126 (NAME='SYS_FOREIGN',
DB_TRX_ID=0x000000000300,
- DB_ROLL_PTR=0x800000012d0110,
- ID=0x000000000000000b,
+ DB_ROLL_PTR=0x8000000320016f,
+ ID=0x000000000000000c,
N_COLS=0x00000004,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x000018150122 (NAME='SYS_FOREIGN_COLS',
+header=0x000020150173 (NAME='SYS_FOREIGN_COLS',
DB_TRX_ID=0x000000000300,
- DB_ROLL_PTR=0x800000012d0201,
- ID=0x000000000000000c,
+ DB_ROLL_PTR=0x80000003200260,
+ ID=0x000000000000000d,
N_COLS=0x00000004,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x0400201501fc (NAME='SYS_TABLESPACES',
- DB_TRX_ID=0x000000000301,
- DB_ROLL_PTR=0x81000001320110,
- ID=0x000000000000000d,
+header=0x040028150209 (NAME='SYS_TABLESPACES',
+ DB_TRX_ID=0x000000000302,
+ DB_ROLL_PTR=0x81000003270110,
+ ID=0x000000000000000e,
N_COLS=0x00000003,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x000038150240 (NAME='test/tc',
- DB_TRX_ID=0x000000000303,
- DB_ROLL_PTR=0x83000001360110,
- ID=0x0000000000000010,
+header=0x00003815024d (NAME='test/tc',
+ DB_TRX_ID=0x000000000304,
+ DB_ROLL_PTR=0x830000032c0110,
+ ID=0x0000000000000011,
N_COLS=0x80000001,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000002)
-header=0x0000401502c8 (NAME='test/td',
- DB_TRX_ID=0x000000000304,
- DB_ROLL_PTR=0x84000001370110,
- ID=0x0000000000000011,
+header=0x0000401502d5 (NAME='test/td',
+ DB_TRX_ID=0x000000000305,
+ DB_ROLL_PTR=0x840000032d0110,
+ ID=0x0000000000000012,
N_COLS=0x80000001,
TYPE=0x00000021,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000003)
-header=0x0000501501b8 (NAME='test/tp',
- DB_TRX_ID=0x000000000306,
- DB_ROLL_PTR=0x86000001390110,
- ID=0x0000000000000013,
+header=0x00005015008d (NAME='test/tp',
+ DB_TRX_ID=0x000000000307,
+ DB_ROLL_PTR=0x86000003300110,
+ ID=0x0000000000000014,
N_COLS=0x80000001,
TYPE=0x00000021,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000005)
-header=0x000030150284 (NAME='test/tr',
- DB_TRX_ID=0x000000000302,
- DB_ROLL_PTR=0x82000001350110,
- ID=0x000000000000000f,
+header=0x000010150291 (NAME='test/tr',
+ DB_TRX_ID=0x000000000303,
+ DB_ROLL_PTR=0x820000032b0110,
+ ID=0x0000000000000010,
N_COLS=0x00000001,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
@@ -92,9 +92,9 @@
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000001)
header=0x000048150074 (NAME='test/tz',
- DB_TRX_ID=0x000000000305,
- DB_ROLL_PTR=0x85000001380110,
- ID=0x0000000000000012,
+ DB_TRX_ID=0x000000000306,
+ DB_ROLL_PTR=0x850000032e0110,
+ ID=0x0000000000000013,
N_COLS=0x80000001,
TYPE=0x00000023,
MIX_ID=0x0000000000000000,

View File

@@ -0,0 +1,128 @@
--- suite/innodb/r/table_flags.result
+++ suite/innodb/r/table_flags,8k,debug.reject
@@ -10,81 +10,81 @@
CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
SYS_TABLES clustered index root page (8):
N_RECS=9; LEVEL=0; INDEX_ID=0x0000000000000001
-header=0x01000003016e (NAME=0x696e66696d756d00)
-header=0x00002815008d (NAME='SYS_DATAFILES',
- DB_TRX_ID=0x000000000301,
- DB_ROLL_PTR=0x81000001320194,
- ID=0x000000000000000e,
+header=0x0100000301bf (NAME=0x696e66696d756d00)
+header=0x0000301500de (NAME='SYS_DATAFILES',
+ DB_TRX_ID=0x000000000302,
+ DB_ROLL_PTR=0x81000001d80194,
+ ID=0x000000000000000f,
N_COLS=0x00000002,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x0000101500d5 (NAME='SYS_FOREIGN',
+header=0x000018150126 (NAME='SYS_FOREIGN',
DB_TRX_ID=0x000000000300,
- DB_ROLL_PTR=0x800000012d0110,
- ID=0x000000000000000b,
+ DB_ROLL_PTR=0x80000001d1016f,
+ ID=0x000000000000000c,
N_COLS=0x00000004,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x000018150122 (NAME='SYS_FOREIGN_COLS',
+header=0x000020150173 (NAME='SYS_FOREIGN_COLS',
DB_TRX_ID=0x000000000300,
- DB_ROLL_PTR=0x800000012d0201,
- ID=0x000000000000000c,
+ DB_ROLL_PTR=0x80000001d10260,
+ ID=0x000000000000000d,
N_COLS=0x00000004,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x0400201501fc (NAME='SYS_TABLESPACES',
- DB_TRX_ID=0x000000000301,
- DB_ROLL_PTR=0x81000001320110,
- ID=0x000000000000000d,
+header=0x040028150209 (NAME='SYS_TABLESPACES',
+ DB_TRX_ID=0x000000000302,
+ DB_ROLL_PTR=0x81000001d80110,
+ ID=0x000000000000000e,
N_COLS=0x00000003,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x000038150240 (NAME='test/tc',
- DB_TRX_ID=0x000000000303,
- DB_ROLL_PTR=0x83000001360110,
- ID=0x0000000000000010,
+header=0x00003815024d (NAME='test/tc',
+ DB_TRX_ID=0x000000000304,
+ DB_ROLL_PTR=0x83000001dc0110,
+ ID=0x0000000000000011,
N_COLS=0x80000001,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000002)
-header=0x0000401502c8 (NAME='test/td',
- DB_TRX_ID=0x000000000304,
- DB_ROLL_PTR=0x84000001370110,
- ID=0x0000000000000011,
+header=0x0000401502d5 (NAME='test/td',
+ DB_TRX_ID=0x000000000305,
+ DB_ROLL_PTR=0x84000001dd0110,
+ ID=0x0000000000000012,
N_COLS=0x80000001,
TYPE=0x00000021,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000003)
-header=0x0000501501b8 (NAME='test/tp',
- DB_TRX_ID=0x000000000306,
- DB_ROLL_PTR=0x86000001390110,
- ID=0x0000000000000013,
+header=0x00005015008d (NAME='test/tp',
+ DB_TRX_ID=0x000000000307,
+ DB_ROLL_PTR=0x86000001df0110,
+ ID=0x0000000000000014,
N_COLS=0x80000001,
TYPE=0x00000021,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000005)
-header=0x000030150284 (NAME='test/tr',
- DB_TRX_ID=0x000000000302,
- DB_ROLL_PTR=0x82000001350110,
- ID=0x000000000000000f,
+header=0x000010150291 (NAME='test/tr',
+ DB_TRX_ID=0x000000000303,
+ DB_ROLL_PTR=0x82000001db0110,
+ ID=0x0000000000000010,
N_COLS=0x00000001,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
@@ -92,9 +92,9 @@
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000001)
header=0x000048150074 (NAME='test/tz',
- DB_TRX_ID=0x000000000305,
- DB_ROLL_PTR=0x85000001380110,
- ID=0x0000000000000012,
+ DB_TRX_ID=0x000000000306,
+ DB_ROLL_PTR=0x85000001de0110,
+ ID=0x0000000000000013,
N_COLS=0x80000001,
TYPE=0x00000023,
MIX_ID=0x0000000000000000,

View File

@@ -0,0 +1,128 @@
--- suite/innodb/r/table_flags.result
+++ suite/innodb/r/table_flags,debug.reject
@@ -10,81 +10,81 @@
CREATE TABLE tp(a INT PRIMARY KEY)ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
SYS_TABLES clustered index root page (8):
N_RECS=9; LEVEL=0; INDEX_ID=0x0000000000000001
-header=0x01000003016e (NAME=0x696e66696d756d00)
-header=0x00002815008d (NAME='SYS_DATAFILES',
- DB_TRX_ID=0x000000000301,
- DB_ROLL_PTR=0x81000001320194,
- ID=0x000000000000000e,
+header=0x0100000301bf (NAME=0x696e66696d756d00)
+header=0x0000301500de (NAME='SYS_DATAFILES',
+ DB_TRX_ID=0x000000000302,
+ DB_ROLL_PTR=0x81000001330194,
+ ID=0x000000000000000f,
N_COLS=0x00000002,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x0000101500d5 (NAME='SYS_FOREIGN',
+header=0x000018150126 (NAME='SYS_FOREIGN',
DB_TRX_ID=0x000000000300,
- DB_ROLL_PTR=0x800000012d0110,
- ID=0x000000000000000b,
+ DB_ROLL_PTR=0x800000012d016f,
+ ID=0x000000000000000c,
N_COLS=0x00000004,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x000018150122 (NAME='SYS_FOREIGN_COLS',
+header=0x000020150173 (NAME='SYS_FOREIGN_COLS',
DB_TRX_ID=0x000000000300,
- DB_ROLL_PTR=0x800000012d0201,
- ID=0x000000000000000c,
+ DB_ROLL_PTR=0x800000012d0260,
+ ID=0x000000000000000d,
N_COLS=0x00000004,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x0400201501fc (NAME='SYS_TABLESPACES',
- DB_TRX_ID=0x000000000301,
- DB_ROLL_PTR=0x81000001320110,
- ID=0x000000000000000d,
+header=0x040028150209 (NAME='SYS_TABLESPACES',
+ DB_TRX_ID=0x000000000302,
+ DB_ROLL_PTR=0x81000001330110,
+ ID=0x000000000000000e,
N_COLS=0x00000003,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000040,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000000)
-header=0x000038150240 (NAME='test/tc',
- DB_TRX_ID=0x000000000303,
- DB_ROLL_PTR=0x83000001360110,
- ID=0x0000000000000010,
+header=0x00003815024d (NAME='test/tc',
+ DB_TRX_ID=0x000000000304,
+ DB_ROLL_PTR=0x83000001370110,
+ ID=0x0000000000000011,
N_COLS=0x80000001,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000002)
-header=0x0000401502c8 (NAME='test/td',
- DB_TRX_ID=0x000000000304,
- DB_ROLL_PTR=0x84000001370110,
- ID=0x0000000000000011,
+header=0x0000401502d5 (NAME='test/td',
+ DB_TRX_ID=0x000000000305,
+ DB_ROLL_PTR=0x84000001380110,
+ ID=0x0000000000000012,
N_COLS=0x80000001,
TYPE=0x00000021,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000003)
-header=0x0000501501b8 (NAME='test/tp',
- DB_TRX_ID=0x000000000306,
- DB_ROLL_PTR=0x86000001390110,
- ID=0x0000000000000013,
+header=0x00005015008d (NAME='test/tp',
+ DB_TRX_ID=0x000000000307,
+ DB_ROLL_PTR=0x860000013a0110,
+ ID=0x0000000000000014,
N_COLS=0x80000001,
TYPE=0x00000021,
MIX_ID=0x0000000000000000,
MIX_LEN=0x00000050,
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000005)
-header=0x000030150284 (NAME='test/tr',
- DB_TRX_ID=0x000000000302,
- DB_ROLL_PTR=0x82000001350110,
- ID=0x000000000000000f,
+header=0x000010150291 (NAME='test/tr',
+ DB_TRX_ID=0x000000000303,
+ DB_ROLL_PTR=0x82000001360110,
+ ID=0x0000000000000010,
N_COLS=0x00000001,
TYPE=0x00000001,
MIX_ID=0x0000000000000000,
@@ -92,9 +92,9 @@
CLUSTER_NAME=NULL(0 bytes),
SPACE=0x00000001)
header=0x000048150074 (NAME='test/tz',
- DB_TRX_ID=0x000000000305,
- DB_ROLL_PTR=0x85000001380110,
- ID=0x0000000000000012,
+ DB_TRX_ID=0x000000000306,
+ DB_ROLL_PTR=0x85000001390110,
+ ID=0x0000000000000013,
N_COLS=0x80000001,
TYPE=0x00000023,
MIX_ID=0x0000000000000000,

View File

@@ -1,6 +1,7 @@
--source include/innodb_page_size.inc --source include/innodb_page_size.inc
# Embedded server tests do not support restarting # Embedded server tests do not support restarting
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/maybe_debug.inc
--disable_query_log --disable_query_log
call mtr.add_suppression("InnoDB: New log files created, LSN="); call mtr.add_suppression("InnoDB: New log files created, LSN=");
@@ -22,6 +23,9 @@ let bugdir= $MYSQLTEST_VARDIR/tmp/table_flags;
--let $d=--innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir --let $d=--innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir
--let $d=$d --innodb-data-file-path=ibdata1:10M:autoextend --let $d=$d --innodb-data-file-path=ibdata1:10M:autoextend
--let $d=$d --innodb-undo-tablespaces=0 --let $d=$d --innodb-undo-tablespaces=0
if ($have_debug) {
--let $d=$d --debug=d,create_and_drop_garbage
}
--let $restart_parameters=$d --innodb-stats-persistent=0 --innodb-file-format=1 --let $restart_parameters=$d --innodb-stats-persistent=0 --innodb-file-format=1
--source include/restart_mysqld.inc --source include/restart_mysqld.inc

View File

@@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@@ -1360,6 +1361,21 @@ dict_create_or_check_foreign_constraint_tables(void)
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
DBUG_EXECUTE_IF(
"create_and_drop_garbage",
err = que_eval_sql(
NULL,
"PROCEDURE CREATE_GARBAGE_TABLE_PROC () IS\n"
"BEGIN\n"
"CREATE TABLE\n"
"\"test/#sql-ib-garbage\"(ID CHAR);\n"
"CREATE UNIQUE CLUSTERED INDEX PRIMARY"
" ON \"test/#sql-ib-garbage\"(ID);\n"
"END;\n", FALSE, trx);
ut_ad(err == DB_SUCCESS);
row_drop_table_for_mysql("test/#sql-ib-garbage",
trx, TRUE, TRUE););
/* Check which incomplete table definition to drop. */ /* Check which incomplete table definition to drop. */
if (sys_foreign_err == DB_CORRUPTION) { if (sys_foreign_err == DB_CORRUPTION) {

View File

@@ -45,6 +45,7 @@ Created 9/17/2000 Heikki Tuuri
#include "dict0dict.h" #include "dict0dict.h"
#include "dict0crea.h" #include "dict0crea.h"
#include "dict0load.h" #include "dict0load.h"
#include "dict0priv.h"
#include "dict0boot.h" #include "dict0boot.h"
#include "dict0stats.h" #include "dict0stats.h"
#include "dict0stats_bg.h" #include "dict0stats_bg.h"
@@ -4137,95 +4138,87 @@ row_drop_table_for_mysql(
info = pars_info_create(); info = pars_info_create();
pars_info_add_str_literal(info, "table_name", name); pars_info_add_str_literal(info, "name", name);
err = que_eval_sql(info, if (strcmp(name, "SYS_FOREIGN") && strcmp(name, "SYS_FOREIGN_COLS")
&& dict_table_get_low("SYS_FOREIGN")
&& dict_table_get_low("SYS_FOREIGN_COLS")) {
err = que_eval_sql(
info,
"PROCEDURE DROP_FOREIGN_PROC () IS\n"
"fid CHAR;\n"
"DECLARE CURSOR fk IS\n"
"SELECT ID FROM SYS_FOREIGN\n"
"WHERE FOR_NAME = :name\n"
"AND TO_BINARY(FOR_NAME) = TO_BINARY(:name)\n"
"FOR UPDATE;\n"
"BEGIN\n"
"OPEN fk;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH fk INTO fid;\n"
" IF (SQL % NOTFOUND) THEN RETURN; END IF;\n"
" DELETE FROM SYS_FOREIGN_COLS WHERE ID = fid;\n"
" DELETE FROM SYS_FOREIGN WHERE ID = fid;\n"
"END LOOP;\n"
"CLOSE fk;\n"
"END;\n", FALSE, trx);
if (err == DB_SUCCESS) {
info = pars_info_create();
pars_info_add_str_literal(info, "name", name);
goto do_drop;
}
} else {
do_drop:
err = que_eval_sql(
info,
"PROCEDURE DROP_TABLE_PROC () IS\n" "PROCEDURE DROP_TABLE_PROC () IS\n"
"sys_foreign_id CHAR;\n"
"table_id CHAR;\n" "table_id CHAR;\n"
"index_id CHAR;\n" "index_id CHAR;\n"
"foreign_id CHAR;\n"
"space_id INT;\n"
"found INT;\n"
"DECLARE CURSOR cur_fk IS\n"
"SELECT ID FROM SYS_FOREIGN\n"
"WHERE FOR_NAME = :table_name\n"
"AND TO_BINARY(FOR_NAME)\n"
" = TO_BINARY(:table_name)\n"
"LOCK IN SHARE MODE;\n"
"DECLARE CURSOR cur_idx IS\n" "DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n" "SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n" "WHERE TABLE_ID = table_id\n"
"LOCK IN SHARE MODE;\n" "FOR UPDATE;\n"
"BEGIN\n" "BEGIN\n"
"SELECT ID INTO table_id\n" "SELECT ID INTO table_id\n"
"FROM SYS_TABLES\n" "FROM SYS_TABLES WHERE NAME = :name FOR UPDATE;\n"
"WHERE NAME = :table_name\n" "IF (SQL % NOTFOUND) THEN RETURN; END IF;\n"
"LOCK IN SHARE MODE;\n"
"IF (SQL % NOTFOUND) THEN\n"
" RETURN;\n"
"END IF;\n"
"SELECT SPACE INTO space_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = :table_name;\n"
"IF (SQL % NOTFOUND) THEN\n"
" RETURN;\n"
"END IF;\n"
"found := 1;\n"
"SELECT ID INTO sys_foreign_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = 'SYS_FOREIGN'\n"
"LOCK IN SHARE MODE;\n"
"IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
"END IF;\n"
"IF (:table_name = 'SYS_FOREIGN') THEN\n"
" found := 0;\n"
"END IF;\n"
"IF (:table_name = 'SYS_FOREIGN_COLS') THEN\n"
" found := 0;\n"
"END IF;\n"
"OPEN cur_fk;\n"
"WHILE found = 1 LOOP\n"
" FETCH cur_fk INTO foreign_id;\n"
" IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FOREIGN_COLS\n"
" WHERE ID = foreign_id;\n"
" DELETE FROM SYS_FOREIGN\n"
" WHERE ID = foreign_id;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE cur_fk;\n"
"found := 1;\n"
"OPEN cur_idx;\n" "OPEN cur_idx;\n"
"WHILE found = 1 LOOP\n" "WHILE 1 = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n" " FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN\n" " IF (SQL % NOTFOUND) THEN EXIT; END IF;\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FIELDS\n" " DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n" " WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n" " DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id\n" " WHERE ID = index_id AND TABLE_ID = table_id;\n"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n" "END LOOP;\n"
"CLOSE cur_idx;\n" "CLOSE cur_idx;\n"
"DELETE FROM SYS_COLUMNS WHERE TABLE_ID = table_id;\n"
"DELETE FROM SYS_TABLES WHERE NAME = :name;\n"
"END;\n", FALSE, trx);
if (err == DB_SUCCESS && table->space
&& dict_table_get_low("SYS_TABLESPACES")
&& dict_table_get_low("SYS_DATAFILES")) {
info = pars_info_create();
pars_info_add_int4_literal(info, "id",
lint(table->space));
err = que_eval_sql(
info,
"PROCEDURE DROP_SPACE_PROC () IS\n"
"BEGIN\n"
"DELETE FROM SYS_TABLESPACES\n" "DELETE FROM SYS_TABLESPACES\n"
"WHERE SPACE = space_id;\n" "WHERE SPACE = :id;\n"
"DELETE FROM SYS_DATAFILES\n" "DELETE FROM SYS_DATAFILES\n"
"WHERE SPACE = space_id;\n" "WHERE SPACE = :id;\n"
"DELETE FROM SYS_COLUMNS\n" "END;\n", FALSE, trx);
"WHERE TABLE_ID = table_id;\n" }
"DELETE FROM SYS_TABLES\n" }
"WHERE NAME = :table_name;\n"
"END;\n"
, FALSE, trx);
switch (err) { switch (err) {
ibool is_temp; ibool is_temp;

View File

@@ -251,7 +251,7 @@ trx_purge_add_update_undo_to_history(
in fast shutdown, we may roll back transactions (trx->undo_no==0) in fast shutdown, we may roll back transactions (trx->undo_no==0)
in THD::cleanup() invoked from unlink_thd(). */ in THD::cleanup() invoked from unlink_thd(). */
ut_ad(srv_undo_sources ut_ad(srv_undo_sources
|| ((srv_startup_is_before_trx_rollback_phase || ((srv_is_being_started
|| trx_rollback_or_clean_is_active) || trx_rollback_or_clean_is_active)
&& purge_sys->state == PURGE_STATE_INIT) && purge_sys->state == PURGE_STATE_INIT)
|| (trx->undo_no == 0 && srv_fast_shutdown)); || (trx->undo_no == 0 && srv_fast_shutdown));

View File

@@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
@@ -1361,6 +1361,21 @@ dict_create_or_check_foreign_constraint_tables(void)
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
DBUG_EXECUTE_IF(
"create_and_drop_garbage",
err = que_eval_sql(
NULL,
"PROCEDURE CREATE_GARBAGE_TABLE_PROC () IS\n"
"BEGIN\n"
"CREATE TABLE\n"
"\"test/#sql-ib-garbage\"(ID CHAR);\n"
"CREATE UNIQUE CLUSTERED INDEX PRIMARY"
" ON \"test/#sql-ib-garbage\"(ID);\n"
"END;\n", FALSE, trx);
ut_ad(err == DB_SUCCESS);
row_drop_table_for_mysql("test/#sql-ib-garbage",
trx, TRUE, TRUE););
/* Check which incomplete table definition to drop. */ /* Check which incomplete table definition to drop. */
if (sys_foreign_err == DB_CORRUPTION) { if (sys_foreign_err == DB_CORRUPTION) {

View File

@@ -4162,95 +4162,87 @@ row_drop_table_for_mysql(
info = pars_info_create(); info = pars_info_create();
pars_info_add_str_literal(info, "table_name", name); pars_info_add_str_literal(info, "name", name);
err = que_eval_sql(info, if (strcmp(name, "SYS_FOREIGN") && strcmp(name, "SYS_FOREIGN_COLS")
&& dict_table_get_low("SYS_FOREIGN")
&& dict_table_get_low("SYS_FOREIGN_COLS")) {
err = que_eval_sql(
info,
"PROCEDURE DROP_FOREIGN_PROC () IS\n"
"fid CHAR;\n"
"DECLARE CURSOR fk IS\n"
"SELECT ID FROM SYS_FOREIGN\n"
"WHERE FOR_NAME = :name\n"
"AND TO_BINARY(FOR_NAME) = TO_BINARY(:name)\n"
"FOR UPDATE;\n"
"BEGIN\n"
"OPEN fk;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH fk INTO fid;\n"
" IF (SQL % NOTFOUND) THEN RETURN; END IF;\n"
" DELETE FROM SYS_FOREIGN_COLS WHERE ID = fid;\n"
" DELETE FROM SYS_FOREIGN WHERE ID = fid;\n"
"END LOOP;\n"
"CLOSE fk;\n"
"END;\n", FALSE, trx);
if (err == DB_SUCCESS) {
info = pars_info_create();
pars_info_add_str_literal(info, "name", name);
goto do_drop;
}
} else {
do_drop:
err = que_eval_sql(
info,
"PROCEDURE DROP_TABLE_PROC () IS\n" "PROCEDURE DROP_TABLE_PROC () IS\n"
"sys_foreign_id CHAR;\n"
"table_id CHAR;\n" "table_id CHAR;\n"
"index_id CHAR;\n" "index_id CHAR;\n"
"foreign_id CHAR;\n"
"space_id INT;\n"
"found INT;\n"
"DECLARE CURSOR cur_fk IS\n"
"SELECT ID FROM SYS_FOREIGN\n"
"WHERE FOR_NAME = :table_name\n"
"AND TO_BINARY(FOR_NAME)\n"
" = TO_BINARY(:table_name)\n"
"LOCK IN SHARE MODE;\n"
"DECLARE CURSOR cur_idx IS\n" "DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n" "SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n" "WHERE TABLE_ID = table_id\n"
"LOCK IN SHARE MODE;\n" "FOR UPDATE;\n"
"BEGIN\n" "BEGIN\n"
"SELECT ID INTO table_id\n" "SELECT ID INTO table_id\n"
"FROM SYS_TABLES\n" "FROM SYS_TABLES WHERE NAME = :name FOR UPDATE;\n"
"WHERE NAME = :table_name\n" "IF (SQL % NOTFOUND) THEN RETURN; END IF;\n"
"LOCK IN SHARE MODE;\n"
"IF (SQL % NOTFOUND) THEN\n"
" RETURN;\n"
"END IF;\n"
"SELECT SPACE INTO space_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = :table_name;\n"
"IF (SQL % NOTFOUND) THEN\n"
" RETURN;\n"
"END IF;\n"
"found := 1;\n"
"SELECT ID INTO sys_foreign_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = 'SYS_FOREIGN'\n"
"LOCK IN SHARE MODE;\n"
"IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
"END IF;\n"
"IF (:table_name = 'SYS_FOREIGN') THEN\n"
" found := 0;\n"
"END IF;\n"
"IF (:table_name = 'SYS_FOREIGN_COLS') THEN\n"
" found := 0;\n"
"END IF;\n"
"OPEN cur_fk;\n"
"WHILE found = 1 LOOP\n"
" FETCH cur_fk INTO foreign_id;\n"
" IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FOREIGN_COLS\n"
" WHERE ID = foreign_id;\n"
" DELETE FROM SYS_FOREIGN\n"
" WHERE ID = foreign_id;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE cur_fk;\n"
"found := 1;\n"
"OPEN cur_idx;\n" "OPEN cur_idx;\n"
"WHILE found = 1 LOOP\n" "WHILE 1 = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n" " FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN\n" " IF (SQL % NOTFOUND) THEN EXIT; END IF;\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FIELDS\n" " DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n" " WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n" " DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id\n" " WHERE ID = index_id AND TABLE_ID = table_id;\n"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n" "END LOOP;\n"
"CLOSE cur_idx;\n" "CLOSE cur_idx;\n"
"DELETE FROM SYS_COLUMNS WHERE TABLE_ID = table_id;\n"
"DELETE FROM SYS_TABLES WHERE NAME = :name;\n"
"END;\n", FALSE, trx);
if (err == DB_SUCCESS && table->space
&& dict_table_get_low("SYS_TABLESPACES")
&& dict_table_get_low("SYS_DATAFILES")) {
info = pars_info_create();
pars_info_add_int4_literal(info, "id",
lint(table->space));
err = que_eval_sql(
info,
"PROCEDURE DROP_SPACE_PROC () IS\n"
"BEGIN\n"
"DELETE FROM SYS_TABLESPACES\n" "DELETE FROM SYS_TABLESPACES\n"
"WHERE SPACE = space_id;\n" "WHERE SPACE = :id;\n"
"DELETE FROM SYS_DATAFILES\n" "DELETE FROM SYS_DATAFILES\n"
"WHERE SPACE = space_id;\n" "WHERE SPACE = :id;\n"
"DELETE FROM SYS_COLUMNS\n" "END;\n", FALSE, trx);
"WHERE TABLE_ID = table_id;\n" }
"DELETE FROM SYS_TABLES\n" }
"WHERE NAME = :table_name;\n"
"END;\n"
, FALSE, trx);
switch (err) { switch (err) {
ibool is_temp; ibool is_temp;
@@ -4395,7 +4387,6 @@ row_drop_table_for_mysql(
case DB_OUT_OF_FILE_SPACE: case DB_OUT_OF_FILE_SPACE:
err = DB_MUST_GET_MORE_FILE_SPACE; err = DB_MUST_GET_MORE_FILE_SPACE;
trx->error_state = err; trx->error_state = err;
row_mysql_handle_errors(&err, trx, NULL, NULL); row_mysql_handle_errors(&err, trx, NULL, NULL);

View File

@@ -255,7 +255,7 @@ trx_purge_add_update_undo_to_history(
in fast shutdown, we may roll back transactions (trx->undo_no==0) in fast shutdown, we may roll back transactions (trx->undo_no==0)
in THD::cleanup() invoked from unlink_thd(). */ in THD::cleanup() invoked from unlink_thd(). */
ut_ad(srv_undo_sources ut_ad(srv_undo_sources
|| ((srv_startup_is_before_trx_rollback_phase || ((srv_is_being_started
|| trx_rollback_or_clean_is_active) || trx_rollback_or_clean_is_active)
&& purge_sys->state == PURGE_STATE_INIT) && purge_sys->state == PURGE_STATE_INIT)
|| (trx->undo_no == 0 && srv_fast_shutdown)); || (trx->undo_no == 0 && srv_fast_shutdown));