Commit 6ced7891 authored by Marko Mäkelä's avatar Marko Mäkelä

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.
parent f4b8b6b9
[debug]
--enable-gdb
[release]
--disable-gdb
# 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%'`;
......@@ -23,6 +23,9 @@ sub skip_combinations {
# don't run tests for the wrong platform
$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
$skip{'include/not_embedded.inc'} = 'Not run for embedded server'
if $::opt_embedded_server;
......
--- 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,
--- 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,
--- 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,
--source include/innodb_page_size.inc
# Embedded server tests do not support restarting
--source include/not_embedded.inc
--source include/maybe_debug.inc
--disable_query_log
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=$d --innodb-data-file-path=ibdata1:10M:autoextend
--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
--source include/restart_mysqld.inc
......
/*****************************************************************************
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
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);
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. */
if (sys_foreign_err == DB_CORRUPTION) {
......
......@@ -45,6 +45,7 @@ Created 9/17/2000 Heikki Tuuri
#include "dict0dict.h"
#include "dict0crea.h"
#include "dict0load.h"
#include "dict0priv.h"
#include "dict0boot.h"
#include "dict0stats.h"
#include "dict0stats_bg.h"
......@@ -4137,95 +4138,87 @@ row_drop_table_for_mysql(
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,
"PROCEDURE DROP_TABLE_PROC () IS\n"
"sys_foreign_id CHAR;\n"
"table_id CHAR;\n"
"index_id CHAR;\n"
"foreign_id CHAR;\n"
"space_id INT;\n"
"found INT;\n"
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 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 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"
"DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n"
"LOCK IN SHARE MODE;\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"
"table_id CHAR;\n"
"index_id CHAR;\n"
"BEGIN\n"
"SELECT ID INTO table_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = :table_name\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"
"WHILE found = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id\n"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE cur_idx;\n"
"DELETE FROM SYS_TABLESPACES\n"
"WHERE SPACE = space_id;\n"
"DELETE FROM SYS_DATAFILES\n"
"WHERE SPACE = space_id;\n"
"DELETE FROM SYS_COLUMNS\n"
"WHERE TABLE_ID = table_id;\n"
"DELETE FROM SYS_TABLES\n"
"WHERE NAME = :table_name;\n"
"END;\n"
, FALSE, trx);
"DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n"
"FOR UPDATE;\n"
"BEGIN\n"
"SELECT ID INTO table_id\n"
"FROM SYS_TABLES WHERE NAME = :name FOR UPDATE;\n"
"IF (SQL % NOTFOUND) THEN RETURN; END IF;\n"
"OPEN cur_idx;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN EXIT; END IF;\n"
" DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id AND TABLE_ID = table_id;\n"
"END LOOP;\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"
"WHERE SPACE = :id;\n"
"DELETE FROM SYS_DATAFILES\n"
"WHERE SPACE = :id;\n"
"END;\n", FALSE, trx);
}
}
switch (err) {
ibool is_temp;
......
......@@ -251,7 +251,7 @@ trx_purge_add_update_undo_to_history(
in fast shutdown, we may roll back transactions (trx->undo_no==0)
in THD::cleanup() invoked from unlink_thd(). */
ut_ad(srv_undo_sources
|| ((srv_startup_is_before_trx_rollback_phase
|| ((srv_is_being_started
|| trx_rollback_or_clean_is_active)
&& purge_sys->state == PURGE_STATE_INIT)
|| (trx->undo_no == 0 && srv_fast_shutdown));
......
/*****************************************************************************
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
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);
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. */
if (sys_foreign_err == DB_CORRUPTION) {
......
......@@ -4162,95 +4162,87 @@ row_drop_table_for_mysql(
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,
"PROCEDURE DROP_TABLE_PROC () IS\n"
"sys_foreign_id CHAR;\n"
"table_id CHAR;\n"
"index_id CHAR;\n"
"foreign_id CHAR;\n"
"space_id INT;\n"
"found INT;\n"
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 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 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"
"DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n"
"LOCK IN SHARE MODE;\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"
"table_id CHAR;\n"
"index_id CHAR;\n"
"BEGIN\n"
"SELECT ID INTO table_id\n"
"FROM SYS_TABLES\n"
"WHERE NAME = :table_name\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"
"WHILE found = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN\n"
" found := 0;\n"
" ELSE\n"
" DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id\n"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE cur_idx;\n"
"DELETE FROM SYS_TABLESPACES\n"
"WHERE SPACE = space_id;\n"
"DELETE FROM SYS_DATAFILES\n"
"WHERE SPACE = space_id;\n"
"DELETE FROM SYS_COLUMNS\n"
"WHERE TABLE_ID = table_id;\n"
"DELETE FROM SYS_TABLES\n"
"WHERE NAME = :table_name;\n"
"END;\n"
, FALSE, trx);
"DECLARE CURSOR cur_idx IS\n"
"SELECT ID FROM SYS_INDEXES\n"
"WHERE TABLE_ID = table_id\n"
"FOR UPDATE;\n"
"BEGIN\n"
"SELECT ID INTO table_id\n"
"FROM SYS_TABLES WHERE NAME = :name FOR UPDATE;\n"
"IF (SQL % NOTFOUND) THEN RETURN; END IF;\n"
"OPEN cur_idx;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH cur_idx INTO index_id;\n"
" IF (SQL % NOTFOUND) THEN EXIT; END IF;\n"
" DELETE FROM SYS_FIELDS\n"
" WHERE INDEX_ID = index_id;\n"
" DELETE FROM SYS_INDEXES\n"
" WHERE ID = index_id AND TABLE_ID = table_id;\n"
"END LOOP;\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"
"WHERE SPACE = :id;\n"
"DELETE FROM SYS_DATAFILES\n"
"WHERE SPACE = :id;\n"
"END;\n", FALSE, trx);
}
}
switch (err) {
ibool is_temp;
......@@ -4395,7 +4387,6 @@ row_drop_table_for_mysql(
case DB_OUT_OF_FILE_SPACE:
err = DB_MUST_GET_MORE_FILE_SPACE;
trx->error_state = err;
row_mysql_handle_errors(&err, trx, NULL, NULL);
......
......@@ -255,7 +255,7 @@ trx_purge_add_update_undo_to_history(
in fast shutdown, we may roll back transactions (trx->undo_no==0)
in THD::cleanup() invoked from unlink_thd(). */
ut_ad(srv_undo_sources
|| ((srv_startup_is_before_trx_rollback_phase
|| ((srv_is_being_started
|| trx_rollback_or_clean_is_active)
&& purge_sys->state == PURGE_STATE_INIT)
|| (trx->undo_no == 0 && srv_fast_shutdown));
......
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