Browse Source

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.
pull/899/head
Marko Mäkelä 7 years ago
parent
commit
6ced789186
  1. 5
      mysql-test/include/maybe_debug.combinations
  2. 3
      mysql-test/include/maybe_debug.inc
  3. 3
      mysql-test/suite.pm
  4. 128
      mysql-test/suite/innodb/r/table_flags,4k,debug.rdiff
  5. 0
      mysql-test/suite/innodb/r/table_flags,4k,release.rdiff
  6. 128
      mysql-test/suite/innodb/r/table_flags,8k,debug.rdiff
  7. 0
      mysql-test/suite/innodb/r/table_flags,8k,release.rdiff
  8. 128
      mysql-test/suite/innodb/r/table_flags,debug.rdiff
  9. 4
      mysql-test/suite/innodb/t/table_flags.test
  10. 16
      storage/innobase/dict/dict0crea.cc
  11. 131
      storage/innobase/row/row0mysql.cc
  12. 2
      storage/innobase/trx/trx0purge.cc
  13. 17
      storage/xtradb/dict/dict0crea.cc
  14. 131
      storage/xtradb/row/row0mysql.cc
  15. 2
      storage/xtradb/trx/trx0purge.cc

5
mysql-test/include/maybe_debug.combinations

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

3
mysql-test/include/maybe_debug.inc

@ -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%'`;

3
mysql-test/suite.pm

@ -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;

128
mysql-test/suite/innodb/r/table_flags,4k,debug.rdiff

@ -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,

0
mysql-test/suite/innodb/r/table_flags,4k.rdiff → mysql-test/suite/innodb/r/table_flags,4k,release.rdiff

128
mysql-test/suite/innodb/r/table_flags,8k,debug.rdiff

@ -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,

0
mysql-test/suite/innodb/r/table_flags,8k.rdiff → mysql-test/suite/innodb/r/table_flags,8k,release.rdiff

128
mysql-test/suite/innodb/r/table_flags,debug.rdiff

@ -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,

4
mysql-test/suite/innodb/t/table_flags.test

@ -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

16
storage/innobase/dict/dict0crea.cc

@ -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) {

131
storage/innobase/row/row0mysql.cc

@ -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"
"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"
"FROM SYS_TABLES WHERE NAME = :name FOR UPDATE;\n"
"IF (SQL % NOTFOUND) THEN RETURN; END IF;\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"
" found := 0;\n"
" ELSE\n"
" IF (SQL % NOTFOUND) THEN EXIT; END IF;\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"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
" WHERE ID = index_id AND TABLE_ID = table_id;\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"
"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);
"WHERE SPACE = :id;\n"
"END;\n", FALSE, trx);
}
}
switch (err) { switch (err) {
ibool is_temp; ibool is_temp;

2
storage/innobase/trx/trx0purge.cc

@ -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));

17
storage/xtradb/dict/dict0crea.cc

@ -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) {

131
storage/xtradb/row/row0mysql.cc

@ -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"
"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"
"FROM SYS_TABLES WHERE NAME = :name FOR UPDATE;\n"
"IF (SQL % NOTFOUND) THEN RETURN; END IF;\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"
" found := 0;\n"
" ELSE\n"
" IF (SQL % NOTFOUND) THEN EXIT; END IF;\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"
" AND TABLE_ID = table_id;\n"
" END IF;\n"
" WHERE ID = index_id AND TABLE_ID = table_id;\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"
"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);
"WHERE SPACE = :id;\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);

2
storage/xtradb/trx/trx0purge.cc

@ -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));

Loading…
Cancel
Save