Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
5aa89abf
Commit
5aa89abf
authored
Nov 18, 2010
by
Vasil Dimov
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql-5.5-innodb -> mysql-5.5-bugteam
parents
c4545852
f6402642
Changes
38
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
38 changed files
with
2183 additions
and
1091 deletions
+2183
-1091
mysql-test/suite/innodb/r/innodb-create-options.result
mysql-test/suite/innodb/r/innodb-create-options.result
+854
-0
mysql-test/suite/innodb/r/innodb-zip.result
mysql-test/suite/innodb/r/innodb-zip.result
+4
-16
mysql-test/suite/innodb/r/innodb_bug53046.result
mysql-test/suite/innodb/r/innodb_bug53046.result
+27
-0
mysql-test/suite/innodb/r/innodb_bug54679.result
mysql-test/suite/innodb/r/innodb_bug54679.result
+0
-88
mysql-test/suite/innodb/r/innodb_bug56632.result
mysql-test/suite/innodb/r/innodb_bug56632.result
+0
-294
mysql-test/suite/innodb/r/innodb_bug57904.result
mysql-test/suite/innodb/r/innodb_bug57904.result
+41
-0
mysql-test/suite/innodb/t/innodb-create-options.test
mysql-test/suite/innodb/t/innodb-create-options.test
+575
-0
mysql-test/suite/innodb/t/innodb-zip.test
mysql-test/suite/innodb/t/innodb-zip.test
+2
-6
mysql-test/suite/innodb/t/innodb_bug53046.test
mysql-test/suite/innodb/t/innodb_bug53046.test
+48
-0
mysql-test/suite/innodb/t/innodb_bug54679.test
mysql-test/suite/innodb/t/innodb_bug54679.test
+0
-101
mysql-test/suite/innodb/t/innodb_bug56632.test
mysql-test/suite/innodb/t/innodb_bug56632.test
+0
-216
mysql-test/suite/innodb/t/innodb_bug57904.test
mysql-test/suite/innodb/t/innodb_bug57904.test
+27
-0
storage/innobase/btr/btr0cur.c
storage/innobase/btr/btr0cur.c
+4
-7
storage/innobase/dict/dict0crea.c
storage/innobase/dict/dict0crea.c
+1
-1
storage/innobase/dict/dict0dict.c
storage/innobase/dict/dict0dict.c
+97
-67
storage/innobase/dict/dict0load.c
storage/innobase/dict/dict0load.c
+2
-1
storage/innobase/fil/fil0fil.c
storage/innobase/fil/fil0fil.c
+67
-21
storage/innobase/fsp/fsp0fsp.c
storage/innobase/fsp/fsp0fsp.c
+50
-0
storage/innobase/handler/ha_innodb.cc
storage/innobase/handler/ha_innodb.cc
+188
-171
storage/innobase/handler/handler0alter.cc
storage/innobase/handler/handler0alter.cc
+6
-5
storage/innobase/include/btr0btr.h
storage/innobase/include/btr0btr.h
+29
-20
storage/innobase/include/btr0btr.ic
storage/innobase/include/btr0btr.ic
+12
-26
storage/innobase/include/btr0cur.h
storage/innobase/include/btr0cur.h
+1
-1
storage/innobase/include/db0err.h
storage/innobase/include/db0err.h
+6
-0
storage/innobase/include/dict0dict.h
storage/innobase/include/dict0dict.h
+21
-22
storage/innobase/include/fil0fil.h
storage/innobase/include/fil0fil.h
+8
-0
storage/innobase/include/row0ins.h
storage/innobase/include/row0ins.h
+3
-2
storage/innobase/include/row0upd.h
storage/innobase/include/row0upd.h
+2
-2
storage/innobase/include/univ.i
storage/innobase/include/univ.i
+4
-1
storage/innobase/row/row0ins.c
storage/innobase/row/row0ins.c
+5
-4
storage/innobase/row/row0merge.c
storage/innobase/row/row0merge.c
+1
-1
storage/innobase/row/row0mysql.c
storage/innobase/row/row0mysql.c
+4
-2
storage/innobase/row/row0sel.c
storage/innobase/row/row0sel.c
+12
-0
storage/innobase/row/row0upd.c
storage/innobase/row/row0upd.c
+4
-4
storage/innobase/sync/sync0rw.c
storage/innobase/sync/sync0rw.c
+1
-1
storage/innobase/thr/thr0loc.c
storage/innobase/thr/thr0loc.c
+26
-4
storage/innobase/trx/trx0i_s.c
storage/innobase/trx/trx0i_s.c
+47
-7
storage/innobase/ut/ut0ut.c
storage/innobase/ut/ut0ut.c
+4
-0
No files found.
mysql-test/suite/innodb/r/innodb-create-options.result
0 → 100644
View file @
5aa89abf
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/r/innodb-zip.result
View file @
5aa89abf
...
...
@@ -84,8 +84,6 @@ test t8 Compact
test t9 Compact
drop table t0,t00,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14;
alter table t1 key_block_size=0;
Warnings:
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=0.
alter table t1 row_format=dynamic;
SELECT table_schema, table_name, row_format
FROM information_schema.tables WHERE engine='innodb';
...
...
@@ -191,16 +189,9 @@ set global innodb_file_per_table = on;
set global innodb_file_format = `1`;
set innodb_strict_mode = off;
create table t1 (id int primary key) engine = innodb key_block_size = 0;
Warnings:
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=0.
drop table t1;
set innodb_strict_mode = on;
create table t1 (id int primary key) engine = innodb key_block_size = 0;
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
show warnings;
Level Code Message
Warning 1478 InnoDB: invalid KEY_BLOCK_SIZE = 0. Valid values are [1, 2, 4, 8, 16]
Error 1005 Can't create table 'test.t1' (errno: 1478)
create table t2 (id int primary key) engine = innodb key_block_size = 9;
ERROR HY000: Can't create table 'test.t2' (errno: 1478)
show warnings;
...
...
@@ -219,6 +210,7 @@ create table t11(id int primary key) engine = innodb row_format = redundant;
SELECT table_schema, table_name, row_format
FROM information_schema.tables WHERE engine='innodb';
table_schema table_name row_format
test t1 Compact
test t10 Compact
test t11 Redundant
test t3 Compressed
...
...
@@ -228,7 +220,7 @@ test t6 Compressed
test t7 Compressed
test t8 Compressed
test t9 Dynamic
drop table t3, t4, t5, t6, t7, t8, t9, t10, t11;
drop table t
1, t
3, t4, t5, t6, t7, t8, t9, t10, t11;
create table t1 (id int primary key) engine = innodb
key_block_size = 8 row_format = compressed;
create table t2 (id int primary key) engine = innodb
...
...
@@ -254,16 +246,12 @@ Warning 1478 InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.
Error 1005 Can't create table 'test.t4' (errno: 1478)
create table t5 (id int primary key) engine = innodb
key_block_size = 8 row_format = default;
ERROR HY000: Can't create table 'test.t5' (errno: 1478)
show warnings;
Level Code Message
Warning 1478 InnoDB: cannot specify ROW_FORMAT = COMPACT with KEY_BLOCK_SIZE.
Error 1005 Can't create table 'test.t5' (errno: 1478)
SELECT table_schema, table_name, row_format
FROM information_schema.tables WHERE engine='innodb';
table_schema table_name row_format
test t1 Compressed
drop table t1;
test t5 Compressed
drop table t1, t5;
create table t1 (id int primary key) engine = innodb
key_block_size = 9 row_format = redundant;
ERROR HY000: Can't create table 'test.t1' (errno: 1478)
...
...
mysql-test/suite/innodb/r/innodb_bug53046.result
0 → 100644
View file @
5aa89abf
CREATE TABLE bug53046_1 (c1 INT PRIMARY KEY) ENGINE=INNODB;
CREATE TABLE bug53046_2 (c2 INT PRIMARY KEY,
FOREIGN KEY (c2) REFERENCES bug53046_1(c1)
ON UPDATE CASCADE ON DELETE CASCADE) ENGINE=INNODB;
INSERT INTO bug53046_1 VALUES (1);
INSERT INTO bug53046_1 SELECT c1+(SELECT MAX(c1) FROM bug53046_1)
FROM bug53046_1;
INSERT INTO bug53046_1 SELECT c1+(SELECT MAX(c1) FROM bug53046_1)
FROM bug53046_1;
INSERT INTO bug53046_1 SELECT c1+(SELECT MAX(c1) FROM bug53046_1)
FROM bug53046_1;
INSERT INTO bug53046_1 SELECT c1+(SELECT MAX(c1) FROM bug53046_1)
FROM bug53046_1;
INSERT INTO bug53046_1 SELECT c1+(SELECT MAX(c1) FROM bug53046_1)
FROM bug53046_1;
INSERT INTO bug53046_2 VALUES (1), (2);
ANALYZE TABLE bug53046_1;
Table Op Msg_type Msg_text
test.bug53046_1 analyze status OK
SHOW TABLE STATUS LIKE 'bug53046_1';
UPDATE bug53046_1 SET c1 = c1 - 1;
DELETE FROM bug53046_1;
INSERT INTO bug53046_1 VALUES (1);
INSERT INTO bug53046_2 VALUES (1);
TRUNCATE TABLE bug53046_2;
DROP TABLE bug53046_2;
DROP TABLE bug53046_1;
mysql-test/suite/innodb/r/innodb_bug54679.result
deleted
100644 → 0
View file @
c4545852
SET GLOBAL innodb_file_format='Barracuda';
SET GLOBAL innodb_file_per_table=ON;
SET innodb_strict_mode=ON;
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables
WHERE TABLE_NAME='bug54679';
TABLE_NAME ROW_FORMAT CREATE_OPTIONS
bug54679 Compressed row_format=COMPRESSED
ALTER TABLE bug54679 ADD COLUMN b INT;
SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables
WHERE TABLE_NAME='bug54679';
TABLE_NAME ROW_FORMAT CREATE_OPTIONS
bug54679 Compressed row_format=COMPRESSED
DROP TABLE bug54679;
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB;
SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables
WHERE TABLE_NAME='bug54679';
TABLE_NAME ROW_FORMAT CREATE_OPTIONS
bug54679 Compact
ALTER TABLE bug54679 KEY_BLOCK_SIZE=1;
SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables
WHERE TABLE_NAME='bug54679';
TABLE_NAME ROW_FORMAT CREATE_OPTIONS
bug54679 Compressed KEY_BLOCK_SIZE=1
ALTER TABLE bug54679 ROW_FORMAT=REDUNDANT;
ERROR HY000: Can't create table '#sql-temporary' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: cannot specify ROW_FORMAT = REDUNDANT with KEY_BLOCK_SIZE.
Error 1005 Can't create table '#sql-temporary' (errno: 1478)
DROP TABLE bug54679;
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB ROW_FORMAT=REDUNDANT;
SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables
WHERE TABLE_NAME='bug54679';
TABLE_NAME ROW_FORMAT CREATE_OPTIONS
bug54679 Redundant row_format=REDUNDANT
ALTER TABLE bug54679 KEY_BLOCK_SIZE=2;
SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables
WHERE TABLE_NAME='bug54679';
TABLE_NAME ROW_FORMAT CREATE_OPTIONS
bug54679 Compressed row_format=REDUNDANT KEY_BLOCK_SIZE=2
SET GLOBAL innodb_file_format=Antelope;
ALTER TABLE bug54679 KEY_BLOCK_SIZE=4;
ERROR HY000: Can't create table '#sql-temporary' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
Error 1005 Can't create table '#sql-temporary' (errno: 1478)
ALTER TABLE bug54679 ROW_FORMAT=DYNAMIC;
ERROR HY000: Can't create table '#sql-temporary' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.
Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope.
Warning 1478 InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.
Error 1005 Can't create table '#sql-temporary' (errno: 1478)
DROP TABLE bug54679;
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
ERROR HY000: Can't create table 'test.bug54679' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope.
Error 1005 Can't create table 'test.bug54679' (errno: 1478)
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB;
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=OFF;
ALTER TABLE bug54679 KEY_BLOCK_SIZE=4;
ERROR HY000: Can't create table '#sql-temporary' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
Error 1005 Can't create table '#sql-temporary' (errno: 1478)
ALTER TABLE bug54679 ROW_FORMAT=DYNAMIC;
ERROR HY000: Can't create table '#sql-temporary' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table.
Error 1005 Can't create table '#sql-temporary' (errno: 1478)
DROP TABLE bug54679;
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
ERROR HY000: Can't create table 'test.bug54679' (errno: 1478)
SHOW WARNINGS;
Level Code Message
Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table.
Error 1005 Can't create table 'test.bug54679' (errno: 1478)
SET GLOBAL innodb_file_per_table=ON;
CREATE TABLE bug54679 (a INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
DROP TABLE bug54679;
mysql-test/suite/innodb/r/innodb_bug56632.result
deleted
100644 → 0
View file @
c4545852
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/r/innodb_bug57904.result
0 → 100755
View file @
5aa89abf
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB;
CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id)
REFERENCES customer(id)
) ENGINE=INNODB;
SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS;
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME product_order_ibfk_1
UNIQUE_CONSTRAINT_CATALOG def
UNIQUE_CONSTRAINT_SCHEMA test
UNIQUE_CONSTRAINT_NAME PRIMARY
MATCH_OPTION NONE
UPDATE_RULE CASCADE
DELETE_RULE RESTRICT
TABLE_NAME product_order
REFERENCED_TABLE_NAME product
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME product_order_ibfk_2
UNIQUE_CONSTRAINT_CATALOG def
UNIQUE_CONSTRAINT_SCHEMA test
UNIQUE_CONSTRAINT_NAME PRIMARY
MATCH_OPTION NONE
UPDATE_RULE RESTRICT
DELETE_RULE RESTRICT
TABLE_NAME product_order
REFERENCED_TABLE_NAME customer
DROP TABLE product_order;
DROP TABLE product;
DROP TABLE customer;
mysql-test/suite/innodb/t/innodb-create-options.test
0 → 100644
View file @
5aa89abf
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/t/innodb-zip.test
View file @
5aa89abf
...
...
@@ -176,9 +176,7 @@ set innodb_strict_mode = on;
#Test different values of KEY_BLOCK_SIZE
--
error
ER_CANT_CREATE_TABLE
create
table
t1
(
id
int
primary
key
)
engine
=
innodb
key_block_size
=
0
;
show
warnings
;
--
error
ER_CANT_CREATE_TABLE
create
table
t2
(
id
int
primary
key
)
engine
=
innodb
key_block_size
=
9
;
...
...
@@ -199,7 +197,7 @@ create table t11(id int primary key) engine = innodb row_format = redundant;
SELECT
table_schema
,
table_name
,
row_format
FROM
information_schema
.
tables
WHERE
engine
=
'innodb'
;
drop
table
t3
,
t4
,
t5
,
t6
,
t7
,
t8
,
t9
,
t10
,
t11
;
drop
table
t
1
,
t
3
,
t4
,
t5
,
t6
,
t7
,
t8
,
t9
,
t10
,
t11
;
#test different values of ROW_FORMAT with KEY_BLOCK_SIZE
create
table
t1
(
id
int
primary
key
)
engine
=
innodb
...
...
@@ -220,14 +218,12 @@ create table t4 (id int primary key) engine = innodb
key_block_size
=
8
row_format
=
dynamic
;
show
warnings
;
--
error
ER_CANT_CREATE_TABLE
create
table
t5
(
id
int
primary
key
)
engine
=
innodb
key_block_size
=
8
row_format
=
default
;
show
warnings
;
SELECT
table_schema
,
table_name
,
row_format
FROM
information_schema
.
tables
WHERE
engine
=
'innodb'
;
drop
table
t1
;
drop
table
t1
,
t5
;
#test multiple errors
--
error
ER_CANT_CREATE_TABLE
...
...
mysql-test/suite/innodb/t/innodb_bug53046.test
0 → 100644
View file @
5aa89abf
#
# http://bugs.mysql.com/53046
# dict_update_statistics_low can still be run concurrently on same table
#
# This is a symbolic test, it would not fail if the bug is present.
# Rather those SQL commands have been used during manual testing under
# UNIV_DEBUG & UNIV_SYNC_DEBUG to test all changed codepaths for locking
# correctness.
#
--
source
include
/
have_innodb
.
inc
CREATE
TABLE
bug53046_1
(
c1
INT
PRIMARY
KEY
)
ENGINE
=
INNODB
;
CREATE
TABLE
bug53046_2
(
c2
INT
PRIMARY
KEY
,
FOREIGN
KEY
(
c2
)
REFERENCES
bug53046_1
(
c1
)
ON
UPDATE
CASCADE
ON
DELETE
CASCADE
)
ENGINE
=
INNODB
;
INSERT
INTO
bug53046_1
VALUES
(
1
);
let
$i
=
5
;
while
(
$i
)
{
eval
INSERT
INTO
bug53046_1
SELECT
c1
+
(
SELECT
MAX
(
c1
)
FROM
bug53046_1
)
FROM
bug53046_1
;
dec
$i
;
}
INSERT
INTO
bug53046_2
VALUES
(
1
),
(
2
);
# CREATE TABLE innodb_table_monitor (a int) ENGINE=INNODB;
# wait more than 1 minute and observe the mysqld output
# DROP TABLE innodb_table_monitor;
ANALYZE
TABLE
bug53046_1
;
# this prints create time and other nondeterministic data
--
disable_result_log
SHOW
TABLE
STATUS
LIKE
'bug53046_1'
;
--
enable_result_log
UPDATE
bug53046_1
SET
c1
=
c1
-
1
;
DELETE
FROM
bug53046_1
;
INSERT
INTO
bug53046_1
VALUES
(
1
);
INSERT
INTO
bug53046_2
VALUES
(
1
);
TRUNCATE
TABLE
bug53046_2
;
DROP
TABLE
bug53046_2
;
DROP
TABLE
bug53046_1
;
mysql-test/suite/innodb/t/innodb_bug54679.test
deleted
100644 → 0
View file @
c4545852
# Test Bug #54679 alter table causes compressed row_format to revert to compact
--
source
include
/
have_innodb
.
inc
let
$file_format
=
`select @@innodb_file_format`
;
let
$file_format_max
=
`select @@innodb_file_format_max`
;
let
$file_per_table
=
`select @@innodb_file_per_table`
;
SET
GLOBAL
innodb_file_format
=
'Barracuda'
;
SET
GLOBAL
innodb_file_per_table
=
ON
;
SET
innodb_strict_mode
=
ON
;
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
ROW_FORMAT
=
COMPRESSED
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug54679'
;
# The ROW_FORMAT of the table should be preserved when it is not specified
# in ALTER TABLE.
ALTER
TABLE
bug54679
ADD
COLUMN
b
INT
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug54679'
;
DROP
TABLE
bug54679
;
# Check that the ROW_FORMAT conversion to/from COMPRESSED works.
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug54679'
;
# KEY_BLOCK_SIZE implies COMPRESSED.
ALTER
TABLE
bug54679
KEY_BLOCK_SIZE
=
1
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug54679'
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug54679
ROW_FORMAT
=
REDUNDANT
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
DROP
TABLE
bug54679
;
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
ROW_FORMAT
=
REDUNDANT
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug54679'
;
ALTER
TABLE
bug54679
KEY_BLOCK_SIZE
=
2
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug54679'
;
# This prevents other than REDUNDANT or COMPACT ROW_FORMAT for new tables.
SET
GLOBAL
innodb_file_format
=
Antelope
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug54679
KEY_BLOCK_SIZE
=
4
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug54679
ROW_FORMAT
=
DYNAMIC
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
DROP
TABLE
bug54679
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
ROW_FORMAT
=
DYNAMIC
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
;
SET
GLOBAL
innodb_file_format
=
Barracuda
;
# This will prevent ROW_FORMAT=COMPRESSED, because the system tablespace
# cannot be compressed.
SET
GLOBAL
innodb_file_per_table
=
OFF
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug54679
KEY_BLOCK_SIZE
=
4
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug54679
ROW_FORMAT
=
DYNAMIC
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
DROP
TABLE
bug54679
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
--
error
ER_CANT_CREATE_TABLE
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
ROW_FORMAT
=
DYNAMIC
;
--
replace_regex
/
'[^'
]
*
test
\
.
#sql-[0-9a-f_]*'/'#sql-temporary'/
SHOW
WARNINGS
;
SET
GLOBAL
innodb_file_per_table
=
ON
;
CREATE
TABLE
bug54679
(
a
INT
)
ENGINE
=
InnoDB
ROW_FORMAT
=
DYNAMIC
;
DROP
TABLE
bug54679
;
# restore original values, quietly so the test does not fail if those
# defaults are changed
--
disable_query_log
EVAL
SET
GLOBAL
innodb_file_format
=
$file_format
;
EVAL
SET
GLOBAL
innodb_file_format_max
=
$file_format_max
;
EVAL
SET
GLOBAL
innodb_file_per_table
=
$file_per_table
;
--
enable_query_log
mysql-test/suite/innodb/t/innodb_bug56632.test
deleted
100644 → 0
View file @
c4545852
#
# Bug#56632: ALTER TABLE implicitly changes ROW_FORMAT to COMPRESSED
# http://bugs.mysql.com/56632
#
# Innodb automatically uses compressed mode when the KEY_BLOCK_SIZE
# parameter is used, except if the ROW_FORMAT is also specified, in
# which case the KEY_BLOCK_SIZE is ignored and a warning is shown.
# But Innodb was getting confused when neither of those parameters
# was used on the ALTER statement after they were both used on the
# CREATE.
#
# This will test the results of all 4 combinations of these two
# parameters of the CREATE and ALTER.
#
# Tests 1-5 use INNODB_STRICT_MODE=1 which returns an error
# if there is anything wrong with the statement.
#
# 1) CREATE with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1, ALTER with neither.
# Result; CREATE; fails with error ER_CANT_CREATE_TABLE
# 2) CREATE with ROW_FORMAT=COMPACT, ALTER with KEY_BLOCK_SIZE=1
# Result; CREATE succeeds,
# ALTER quietly converts ROW_FORMAT to compressed.
# 3) CREATE with KEY_BLOCK_SIZE=1, ALTER with ROW_FORMAT=COMPACT
# Result; CREATE quietly converts ROW_FORMAT to compressed,
# ALTER fails with error ER_CANT_CREATE_TABLE.
# 4) CREATE with neither, ALTER with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1
# Result; CREATE succeeds,
# ALTER; fails with error ER_CANT_CREATE_TABLE
# 5) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither.
# Result; CREATE; fails with error ER_CANT_CREATE_TABLE
#
# Tests 6-11 use INNODB_STRICT_MODE=0 which automatically makes
# adjustments if the prameters are incompatible.
#
# 6) CREATE with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1, ALTER with neither.
# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE is ignored.
# ALTER succeeds, no warnings.
# 7) CREATE with ROW_FORMAT=COMPACT, ALTER with KEY_BLOCK_SIZE=1
# Result; CREATE succeeds,
# ALTER quietly converts ROW_FORMAT to compressed.
# 8) CREATE with KEY_BLOCK_SIZE=1, ALTER with ROW_FORMAT=COMPACT
# Result; CREATE quietly converts ROW_FORMAT to compressed,
# ALTER succeeds, warns that KEY_BLOCK_SIZE is ignored.
# 9) CREATE with neither, ALTER with ROW_FORMAT=COMPACT & KEY_BLOCK_SIZE=1
# Result; CREATE succeeds,
# ALTER succeeds, warns that KEY_BLOCK_SIZE is ignored.
# 10) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither.
# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE=3 is ignored.
# ALTER succeeds, warns that KEY_BLOCK_SIZE=3 is ignored.
# 11) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with ROW_FORMAT=COMPACT.
# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE=3 is ignored.
# ALTER succeeds, warns that KEY_BLOCK_SIZE=3 is ignored.
# 12) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with KEY_BLOCK_SIZE=1.
# Result; CREATE succeeds, warns that KEY_BLOCK_SIZE=3 is ignored.
# ALTER succeeds, quietly converts ROW_FORMAT to compressed.
--
source
include
/
have_innodb
.
inc
SET
storage_engine
=
InnoDB
;
--
disable_query_log
# These values can change during the test
LET
$innodb_file_format_orig
=
`select @@innodb_file_format`
;
LET
$innodb_file_format_max_orig
=
`select @@innodb_file_format_max`
;
LET
$innodb_file_per_table_orig
=
`select @@innodb_file_per_table`
;
LET
$innodb_strict_mode_orig
=
`select @@session.innodb_strict_mode`
;
--
enable_query_log
SET
GLOBAL
innodb_file_format
=
`Barracuda`
;
SET
GLOBAL
innodb_file_per_table
=
ON
;
# Innodb strict mode will cause an error on the CREATE or ALTER when;
# 1. both ROW_FORMAT=COMPACT and KEY_BLOCK_SIZE=1,
# 2. KEY_BLOCK_SIZE is not a valid number (0,1,2,4,8,16).
# With innodb_strict_mode = OFF, These errors are corrected
# and just a warning is returned.
SET
SESSION
innodb_strict_mode
=
ON
;
--
echo
# Test 1) CREATE with ROW_FORMAT & KEY_BLOCK_SIZE, ALTER with neither
DROP
TABLE
IF
EXISTS
bug56632
;
--
error
ER_CANT_CREATE_TABLE
CREATE
TABLE
bug56632
(
i
INT
)
ROW_FORMAT
=
COMPACT
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
--
echo
# Test 2) CREATE with ROW_FORMAT, ALTER with KEY_BLOCK_SIZE
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
ROW_FORMAT
=
COMPACT
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 3) CREATE with KEY_BLOCK_SIZE, ALTER with ROW_FORMAT
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
disable_result_log
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug56632
ROW_FORMAT
=
COMPACT
;
--
enable_result_log
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 4) CREATE with neither, ALTER with ROW_FORMAT & KEY_BLOCK_SIZE
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
);
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
disable_result_log
--
error
ER_CANT_CREATE_TABLE
ALTER
TABLE
bug56632
ROW_FORMAT
=
COMPACT
KEY_BLOCK_SIZE
=
1
;
--
enable_result_log
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 5) CREATE with KEY_BLOCK_SIZE=3 (invalid).
DROP
TABLE
IF
EXISTS
bug56632
;
--
error
ER_CANT_CREATE_TABLE
CREATE
TABLE
bug56632
(
i
INT
)
KEY_BLOCK_SIZE
=
3
;
SHOW
WARNINGS
;
SET
SESSION
innodb_strict_mode
=
OFF
;
--
echo
# Test 6) CREATE with ROW_FORMAT & KEY_BLOCK_SIZE, ALTER with neither
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
ROW_FORMAT
=
COMPACT
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
ADD
COLUMN
f1
INT
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 7) CREATE with ROW_FORMAT, ALTER with KEY_BLOCK_SIZE
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
ROW_FORMAT
=
COMPACT
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 8) CREATE with KEY_BLOCK_SIZE, ALTER with ROW_FORMAT
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
ROW_FORMAT
=
COMPACT
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 9) CREATE with neither, ALTER with ROW_FORMAT & KEY_BLOCK_SIZE
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
);
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
ROW_FORMAT
=
COMPACT
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 10) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with neither.
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
KEY_BLOCK_SIZE
=
3
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
ADD
COLUMN
f1
INT
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 11) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with ROW_FORMAT=COMPACT.
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
KEY_BLOCK_SIZE
=
3
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
ROW_FORMAT
=
COMPACT
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Test 12) CREATE with KEY_BLOCK_SIZE=3 (invalid), ALTER with KEY_BLOCK_SIZE=1.
DROP
TABLE
IF
EXISTS
bug56632
;
CREATE
TABLE
bug56632
(
i
INT
)
KEY_BLOCK_SIZE
=
3
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
ALTER
TABLE
bug56632
KEY_BLOCK_SIZE
=
1
;
SHOW
WARNINGS
;
SHOW
CREATE
TABLE
bug56632
;
SELECT
TABLE_NAME
,
ROW_FORMAT
,
CREATE_OPTIONS
FROM
information_schema
.
tables
WHERE
TABLE_NAME
=
'bug56632'
;
--
echo
# Cleanup
DROP
TABLE
IF
EXISTS
bug56632
;
--
disable_query_log
EVAL
SET
GLOBAL
innodb_file_per_table
=
$innodb_file_per_table_orig
;
EVAL
SET
GLOBAL
innodb_file_format_max
=
$innodb_file_format_max_orig
;
EVAL
SET
GLOBAL
innodb_file_format
=
$innodb_file_format_orig
;
EVAL
SET
SESSION
innodb_strict_mode
=
$innodb_strict_mode_orig
;
--
enable_query_log
mysql-test/suite/innodb/t/innodb_bug57904.test
0 → 100755
View file @
5aa89abf
#
# Bug #57904 Missing constraint from information schema REFERENTIAL_CONSTRAINTS table
#
--
source
include
/
have_innodb
.
inc
CREATE
TABLE
product
(
category
INT
NOT
NULL
,
id
INT
NOT
NULL
,
price
DECIMAL
,
PRIMARY
KEY
(
category
,
id
))
ENGINE
=
INNODB
;
CREATE
TABLE
customer
(
id
INT
NOT
NULL
,
PRIMARY
KEY
(
id
))
ENGINE
=
INNODB
;
CREATE
TABLE
product_order
(
no
INT
NOT
NULL
AUTO_INCREMENT
,
product_category
INT
NOT
NULL
,
product_id
INT
NOT
NULL
,
customer_id
INT
NOT
NULL
,
PRIMARY
KEY
(
no
),
INDEX
(
product_category
,
product_id
),
FOREIGN
KEY
(
product_category
,
product_id
)
REFERENCES
product
(
category
,
id
)
ON
UPDATE
CASCADE
ON
DELETE
RESTRICT
,
INDEX
(
customer_id
),
FOREIGN
KEY
(
customer_id
)
REFERENCES
customer
(
id
)
)
ENGINE
=
INNODB
;
query_vertical
SELECT
*
FROM
INFORMATION_SCHEMA
.
REFERENTIAL_CONSTRAINTS
;
DROP
TABLE
product_order
;
DROP
TABLE
product
;
DROP
TABLE
customer
;
storage/innobase/btr/btr0cur.c
View file @
5aa89abf
...
...
@@ -1071,7 +1071,7 @@ btr_cur_ins_lock_and_undo(
not zero, the parameters index and thr
should be specified */
btr_cur_t
*
cursor
,
/*!< in: cursor on page after which to insert */
const
dtuple_t
*
entry
,
/*!< in
: entry to insert */
dtuple_t
*
entry
,
/*!< in/out
: entry to insert */
que_thr_t
*
thr
,
/*!< in: query thread or NULL */
mtr_t
*
mtr
,
/*!< in/out: mini-transaction */
ibool
*
inherit
)
/*!< out: TRUE if the inserted new record maybe
...
...
@@ -3248,7 +3248,7 @@ btr_estimate_n_rows_in_range_on_level(
performance with this code which is just an estimation. If we read
this many pages before reaching slot2->page_no then we estimate the
average from the pages scanned so far */
#
define N_PAGES_READ_LIMIT 10
#
define N_PAGES_READ_LIMIT 10
page_no
=
slot1
->
page_no
;
level
=
slot1
->
page_level
;
...
...
@@ -3277,6 +3277,7 @@ btr_estimate_n_rows_in_range_on_level(
||
btr_page_get_level_low
(
page
)
!=
level
)
{
/* The page got reused for something else */
mtr_commit
(
&
mtr
);
goto
inexact
;
}
...
...
@@ -3632,8 +3633,6 @@ btr_estimate_number_of_different_key_vals(
also the pages used for external storage of fields (those pages are
included in index->stat_n_leaf_pages) */
dict_index_stat_mutex_enter
(
index
);
for
(
j
=
0
;
j
<=
n_cols
;
j
++
)
{
index
->
stat_n_diff_key_vals
[
j
]
=
((
n_diff
[
j
]
...
...
@@ -3663,8 +3662,6 @@ btr_estimate_number_of_different_key_vals(
index
->
stat_n_diff_key_vals
[
j
]
+=
add_on
;
}
dict_index_stat_mutex_exit
(
index
);
mem_free
(
n_diff
);
if
(
UNIV_LIKELY_NULL
(
heap
))
{
mem_heap_free
(
heap
);
...
...
@@ -4072,7 +4069,7 @@ Stores the fields in big_rec_vec to the tablespace and puts pointers to
them in rec. The extern flags in rec will have to be set beforehand.
The fields are stored on pages allocated from leaf node
file segment of the index tree.
@return DB_SUCCESS or
error
*/
@return DB_SUCCESS or
DB_OUT_OF_FILE_SPACE
*/
UNIV_INTERN
ulint
btr_store_big_rec_extern_fields
(
...
...
storage/innobase/dict/dict0crea.c
View file @
5aa89abf
...
...
@@ -828,7 +828,7 @@ dict_truncate_index_tree(
appropriate field in the SYS_INDEXES record: this mini-transaction
marks the B-tree totally truncated */
btr_
page
_get
(
space
,
zip_size
,
root_page_no
,
RW_X_LATCH
,
mtr
);
btr_
block
_get
(
space
,
zip_size
,
root_page_no
,
RW_X_LATCH
,
mtr
);
btr_free_root
(
space
,
zip_size
,
root_page_no
,
mtr
);
create:
...
...
storage/innobase/dict/dict0dict.c
View file @
5aa89abf
...
...
@@ -91,9 +91,18 @@ UNIV_INTERN mysql_pfs_key_t dict_foreign_err_mutex_key;
/** Identifies generated InnoDB foreign key names */
static
char
dict_ibfk
[]
=
"_ibfk_"
;
/** array of mutexes protecting dict_index_t::stat_n_diff_key_vals[] */
#define DICT_INDEX_STAT_MUTEX_SIZE 32
mutex_t
dict_index_stat_mutex
[
DICT_INDEX_STAT_MUTEX_SIZE
];
/** array of rw locks protecting
dict_table_t::stat_initialized
dict_table_t::stat_n_rows (*)
dict_table_t::stat_clustered_index_size
dict_table_t::stat_sum_of_other_index_sizes
dict_table_t::stat_modified_counter (*)
dict_table_t::indexes*::stat_n_diff_key_vals[]
dict_table_t::indexes*::stat_index_size
dict_table_t::indexes*::stat_n_leaf_pages
(*) those are not always protected for performance reasons */
#define DICT_TABLE_STATS_LATCHES_SIZE 64
static
rw_lock_t
dict_table_stats_latches
[
DICT_TABLE_STATS_LATCHES_SIZE
];
/*******************************************************************//**
Tries to find column names for the index and sets the col field of the
...
...
@@ -254,43 +263,65 @@ dict_mutex_exit_for_mysql(void)
mutex_exit
(
&
(
dict_sys
->
mutex
));
}
/** Get the
mutex that protects index->stat_n_diff_key_vals[]
*/
#define GET_
INDEX_STAT_MUTEX(index
) \
(&dict_
index_stat_mutex[ut_fold_ull(index
->id) \
% DICT_INDEX_STAT_MUTEX
_SIZE])
/** Get the
latch that protects the stats of a given table
*/
#define GET_
TABLE_STATS_LATCH(table
) \
(&dict_
table_stats_latches[ut_fold_ull(table
->id) \
% DICT_TABLE_STATS_LATCHES
_SIZE])
/**********************************************************************//**
Lock the appropriate
mutex to protect index->stat_n_diff_key_vals[]
.
index->id is used to pick the right mutex and it should not change
before dict_index_stat_mutex_exit() is called on this index
. */
Lock the appropriate
latch to protect a given table's statistics
.
table->id is used to pick the corresponding latch from a global array of
latches
. */
UNIV_INTERN
void
dict_index_stat_mutex_enter
(
/*========================*/
const
dict_index_t
*
index
)
/*!< in: index */
dict_table_stats_lock
(
/*==================*/
const
dict_table_t
*
table
,
/*!< in: table */
ulint
latch_mode
)
/*!< in: RW_S_LATCH or
RW_X_LATCH */
{
ut_ad
(
index
!=
NULL
);
ut_ad
(
index
->
magic_n
==
DICT_INDEX_MAGIC_N
);
ut_ad
(
index
->
cached
);
ut_ad
(
!
index
->
to_be_dropped
);
ut_ad
(
table
!=
NULL
);
ut_ad
(
table
->
magic_n
==
DICT_TABLE_MAGIC_N
);
mutex_enter
(
GET_INDEX_STAT_MUTEX
(
index
));
switch
(
latch_mode
)
{
case
RW_S_LATCH
:
rw_lock_s_lock
(
GET_TABLE_STATS_LATCH
(
table
));
break
;
case
RW_X_LATCH
:
rw_lock_x_lock
(
GET_TABLE_STATS_LATCH
(
table
));
break
;
case
RW_NO_LATCH
:
/* fall through */
default:
ut_error
;
}
}
/**********************************************************************//**
Unlock the
appropriate mutex that protects index->stat_n_diff_key_vals[].
*/
Unlock the
latch that has been locked by dict_table_stats_lock()
*/
UNIV_INTERN
void
dict_index_stat_mutex_exit
(
/*=======================*/
const
dict_index_t
*
index
)
/*!< in: index */
dict_table_stats_unlock
(
/*====================*/
const
dict_table_t
*
table
,
/*!< in: table */
ulint
latch_mode
)
/*!< in: RW_S_LATCH or
RW_X_LATCH */
{
ut_ad
(
index
!=
NULL
);
ut_ad
(
index
->
magic_n
==
DICT_INDEX_MAGIC_N
);
ut_ad
(
index
->
cached
);
ut_ad
(
!
index
->
to_be_dropped
);
ut_ad
(
table
!=
NULL
);
ut_ad
(
table
->
magic_n
==
DICT_TABLE_MAGIC_N
);
mutex_exit
(
GET_INDEX_STAT_MUTEX
(
index
));
switch
(
latch_mode
)
{
case
RW_S_LATCH
:
rw_lock_s_unlock
(
GET_TABLE_STATS_LATCH
(
table
));
break
;
case
RW_X_LATCH
:
rw_lock_x_unlock
(
GET_TABLE_STATS_LATCH
(
table
));
break
;
case
RW_NO_LATCH
:
/* fall through */
default:
ut_error
;
}
}
/********************************************************************//**
...
...
@@ -682,9 +713,9 @@ dict_init(void)
mutex_create
(
dict_foreign_err_mutex_key
,
&
dict_foreign_err_mutex
,
SYNC_ANY_LATCH
);
for
(
i
=
0
;
i
<
DICT_
INDEX_STAT_MUTEX
_SIZE
;
i
++
)
{
mutex
_create
(
PFS_NOT_INSTRUMENTED
,
&
dict_index_stat_mutex
[
i
],
SYNC_INDEX_TREE
);
for
(
i
=
0
;
i
<
DICT_
TABLE_STATS_LATCHES
_SIZE
;
i
++
)
{
rw_lock
_create
(
PFS_NOT_INSTRUMENTED
,
&
dict_table_stats_latches
[
i
],
SYNC_INDEX_TREE
);
}
}
...
...
@@ -715,12 +746,11 @@ dict_table_get(
mutex_exit
(
&
(
dict_sys
->
mutex
));
if
(
table
!=
NULL
)
{
if
(
!
table
->
stat_initialized
)
{
/* If table->ibd_file_missing == TRUE, this will
print an error message and return without doing
anything. */
dict_update_statistics
(
table
);
}
/* If table->ibd_file_missing == TRUE, this will
print an error message and return without doing
anything. */
dict_update_statistics
(
table
,
TRUE
/* only update stats
if they have not been initialized */
);
}
return
(
table
);
...
...
@@ -3453,7 +3483,7 @@ dict_create_foreign_constraints_low(
start_of_latest_foreign
);
mutex_exit
(
&
dict_foreign_err_mutex
);
return
(
DB_C
ANNOT_ADD_CONSTRAINT
);
return
(
DB_C
HILD_NO_INDEX
);
}
ptr
=
dict_accept
(
cs
,
ptr
,
"REFERENCES"
,
&
success
);
...
...
@@ -3734,7 +3764,7 @@ dict_create_foreign_constraints_low(
start_of_latest_foreign
);
mutex_exit
(
&
dict_foreign_err_mutex
);
return
(
DB_
CANNOT_ADD_CONSTRAINT
);
return
(
DB_
PARENT_NO_INDEX
);
}
}
else
{
ut_a
(
trx
->
check_foreigns
==
FALSE
);
...
...
@@ -4198,12 +4228,13 @@ Calculates new estimates for table and index statistics. The statistics
are used in query optimization. */
UNIV_INTERN
void
dict_update_statistics
_low
(
/*===================
====
*/
dict_update_statistics
(
/*===================*/
dict_table_t
*
table
,
/*!< in/out: table */
ibool
has_dict_mutex
__attribute__
((
unused
)))
/*!< in: TRUE if the caller has the
dictionary mutex */
ibool
only_calc_if_missing_stats
)
/*!< in: only
update/recalc the stats if they have
not been initialized yet, otherwise
do nothing */
{
dict_index_t
*
index
;
ulint
sum_of_index_sizes
=
0
;
...
...
@@ -4231,6 +4262,12 @@ dict_update_statistics_low(
return
;
}
dict_table_stats_lock
(
table
,
RW_X_LATCH
);
if
(
only_calc_if_missing_stats
&&
table
->
stat_initialized
)
{
dict_table_stats_unlock
(
table
,
RW_X_LATCH
);
return
;
}
do
{
if
(
UNIV_LIKELY
...
...
@@ -4276,13 +4313,9 @@ dict_update_statistics_low(
index
=
dict_table_get_first_index
(
table
);
dict_index_stat_mutex_enter
(
index
);
table
->
stat_n_rows
=
index
->
stat_n_diff_key_vals
[
dict_index_get_n_unique
(
index
)];
dict_index_stat_mutex_exit
(
index
);
table
->
stat_clustered_index_size
=
index
->
stat_index_size
;
table
->
stat_sum_of_other_index_sizes
=
sum_of_index_sizes
...
...
@@ -4291,18 +4324,8 @@ dict_update_statistics_low(
table
->
stat_initialized
=
TRUE
;
table
->
stat_modified_counter
=
0
;
}
/*********************************************************************//**
Calculates new estimates for table and index statistics. The statistics
are used in query optimization. */
UNIV_INTERN
void
dict_update_statistics
(
/*===================*/
dict_table_t
*
table
)
/*!< in/out: table */
{
dict_update_statistics_low
(
table
,
FALSE
);
dict_table_stats_unlock
(
table
,
RW_X_LATCH
);
}
/**********************************************************************//**
...
...
@@ -4382,7 +4405,9 @@ dict_table_print_low(
ut_ad
(
mutex_own
(
&
(
dict_sys
->
mutex
)));
dict_update_statistics_low
(
table
,
TRUE
);
dict_update_statistics
(
table
,
FALSE
/* update even if initialized */
);
dict_table_stats_lock
(
table
,
RW_S_LATCH
);
fprintf
(
stderr
,
"--------------------------------------
\n
"
...
...
@@ -4410,6 +4435,8 @@ dict_table_print_low(
index
=
UT_LIST_GET_NEXT
(
indexes
,
index
);
}
dict_table_stats_unlock
(
table
,
RW_S_LATCH
);
foreign
=
UT_LIST_GET_FIRST
(
table
->
foreign_list
);
while
(
foreign
!=
NULL
)
{
...
...
@@ -4458,8 +4485,6 @@ dict_index_print_low(
ut_ad
(
mutex_own
(
&
(
dict_sys
->
mutex
)));
dict_index_stat_mutex_enter
(
index
);
if
(
index
->
n_user_defined_cols
>
0
)
{
n_vals
=
index
->
stat_n_diff_key_vals
[
index
->
n_user_defined_cols
];
...
...
@@ -4467,8 +4492,6 @@ dict_index_print_low(
n_vals
=
index
->
stat_n_diff_key_vals
[
1
];
}
dict_index_stat_mutex_exit
(
index
);
fprintf
(
stderr
,
" INDEX: name %s, id %llu, fields %lu/%lu,"
" uniq %lu, type %lu
\n
"
...
...
@@ -4811,7 +4834,8 @@ void
dict_table_replace_index_in_foreign_list
(
/*=====================================*/
dict_table_t
*
table
,
/*!< in/out: table */
dict_index_t
*
index
)
/*!< in: index to be replaced */
dict_index_t
*
index
,
/*!< in: index to be replaced */
const
trx_t
*
trx
)
/*!< in: transaction handle */
{
dict_foreign_t
*
foreign
;
...
...
@@ -4822,7 +4846,13 @@ dict_table_replace_index_in_foreign_list(
if
(
foreign
->
foreign_index
==
index
)
{
dict_index_t
*
new_index
=
dict_foreign_find_equiv_index
(
foreign
);
ut_a
(
new_index
);
/* There must exist an alternative index if
check_foreigns (FOREIGN_KEY_CHECKS) is on,
since ha_innobase::prepare_drop_index had done
the check before we reach here. */
ut_a
(
new_index
||
!
trx
->
check_foreigns
);
foreign
->
foreign_index
=
new_index
;
}
...
...
@@ -4955,8 +4985,8 @@ dict_close(void)
mem_free
(
dict_sys
);
dict_sys
=
NULL
;
for
(
i
=
0
;
i
<
DICT_
INDEX_STAT_MUTEX
_SIZE
;
i
++
)
{
mutex_free
(
&
dict_index_stat_mutex
[
i
]);
for
(
i
=
0
;
i
<
DICT_
TABLE_STATS_LATCHES
_SIZE
;
i
++
)
{
rw_lock_free
(
&
dict_table_stats_latches
[
i
]);
}
}
#endif
/* !UNIV_HOTBACKUP */
storage/innobase/dict/dict0load.c
View file @
5aa89abf
...
...
@@ -346,7 +346,8 @@ dict_process_sys_tables_rec(
/* Update statistics if DICT_TABLE_UPDATE_STATS
is set */
dict_update_statistics_low
(
*
table
,
TRUE
);
dict_update_statistics
(
*
table
,
FALSE
/* update even if
initialized */
);
}
return
(
NULL
);
...
...
storage/innobase/fil/fil0fil.c
View file @
5aa89abf
...
...
@@ -339,14 +339,15 @@ fil_get_space_id_for_table(
/*******************************************************************//**
Frees a space object from the tablespace memory cache. Closes the files in
the chain but does not delete them. There must not be any pending i/o's or
flushes on the files. */
flushes on the files.
@return TRUE on success */
static
ibool
fil_space_free
(
/*===========*/
/* out: TRUE if success
*/
ulint
id
,
/* in: space id */
ibool
own_mutex
);
/* in: TRUE if own system->mutex
*/
ulint
id
,
/* in: space id
*/
ibool
x_latched
);
/* in: TRUE if caller has space->latch
in X mode
*/
/********************************************************************//**
Reads data from a space to a buffer. Remember that the possible incomplete
blocks at the end of file are ignored: they are not taken into account when
...
...
@@ -1140,6 +1141,7 @@ fil_space_create(
space
=
fil_space_get_by_name
(
name
);
if
(
UNIV_LIKELY_NULL
(
space
))
{
ibool
success
;
ulint
namesake_id
;
ut_print_timestamp
(
stderr
);
...
...
@@ -1178,9 +1180,10 @@ fil_space_create(
namesake_id
=
space
->
id
;
mutex_exit
(
&
fil_system
->
mutex
);
success
=
fil_space_free
(
namesake_id
,
FALSE
);
ut_a
(
success
);
fil_space_free
(
namesake_id
,
FALSE
);
mutex_exit
(
&
fil_system
->
mutex
);
goto
try_again
;
}
...
...
@@ -1331,15 +1334,14 @@ fil_space_free(
/*===========*/
/* out: TRUE if success */
ulint
id
,
/* in: space id */
ibool
own_mutex
)
/* in: TRUE if own system->mutex */
ibool
x_latched
)
/* in: TRUE if caller has space->latch
in X mode */
{
fil_space_t
*
space
;
fil_space_t
*
namespace
;
fil_node_t
*
fil_node
;
if
(
!
own_mutex
)
{
mutex_enter
(
&
fil_system
->
mutex
);
}
ut_ad
(
mutex_own
(
&
fil_system
->
mutex
));
space
=
fil_space_get_by_id
(
id
);
...
...
@@ -1350,8 +1352,6 @@ fil_space_free(
" from the cache but
\n
"
"InnoDB: it is not there.
\n
"
,
(
ulong
)
id
);
mutex_exit
(
&
fil_system
->
mutex
);
return
(
FALSE
);
}
...
...
@@ -1386,8 +1386,8 @@ fil_space_free(
ut_a
(
0
==
UT_LIST_GET_LEN
(
space
->
chain
));
if
(
!
own_mutex
)
{
mutex_exit
(
&
fil_system
->
mutex
);
if
(
x_latched
)
{
rw_lock_x_unlock
(
&
space
->
latch
);
}
rw_lock_free
(
&
(
space
->
latch
));
...
...
@@ -1633,25 +1633,27 @@ fil_close_all_files(void)
/*=====================*/
{
fil_space_t
*
space
;
fil_node_t
*
node
;
mutex_enter
(
&
fil_system
->
mutex
);
space
=
UT_LIST_GET_FIRST
(
fil_system
->
space_list
);
while
(
space
!=
NULL
)
{
fil_node_t
*
node
;
fil_space_t
*
prev_space
=
space
;
node
=
UT_LIST_GET_FIRST
(
space
->
chain
);
for
(
node
=
UT_LIST_GET_FIRST
(
space
->
chain
);
node
!=
NULL
;
node
=
UT_LIST_GET_NEXT
(
chain
,
node
))
{
while
(
node
!=
NULL
)
{
if
(
node
->
open
)
{
fil_node_close_file
(
node
,
fil_system
);
}
node
=
UT_LIST_GET_NEXT
(
chain
,
node
);
}
space
=
UT_LIST_GET_NEXT
(
space_list
,
space
);
fil_space_free
(
prev_space
->
id
,
TRUE
);
fil_space_free
(
prev_space
->
id
,
FALSE
);
}
mutex_exit
(
&
fil_system
->
mutex
);
...
...
@@ -2271,6 +2273,19 @@ fil_delete_tablespace(
path
=
mem_strdup
(
space
->
name
);
mutex_exit
(
&
fil_system
->
mutex
);
/* Important: We rely on the data dictionary mutex to ensure
that a race is not possible here. It should serialize the tablespace
drop/free. We acquire an X latch only to avoid a race condition
when accessing the tablespace instance via:
fsp_get_available_space_in_free_extents().
There our main motivation is to reduce the contention on the
dictionary mutex. */
rw_lock_x_lock
(
&
space
->
latch
);
#ifndef UNIV_HOTBACKUP
/* Invalidate in the buffer pool all pages belonging to the
tablespace. Since we have set space->is_being_deleted = TRUE, readahead
...
...
@@ -2283,7 +2298,11 @@ fil_delete_tablespace(
#endif
/* printf("Deleting tablespace %s id %lu\n", space->name, id); */
success
=
fil_space_free
(
id
,
FALSE
);
mutex_enter
(
&
fil_system
->
mutex
);
success
=
fil_space_free
(
id
,
TRUE
);
mutex_exit
(
&
fil_system
->
mutex
);
if
(
success
)
{
success
=
os_file_delete
(
path
);
...
...
@@ -2291,6 +2310,8 @@ fil_delete_tablespace(
if
(
!
success
)
{
success
=
os_file_delete_if_exists
(
path
);
}
}
else
{
rw_lock_x_unlock
(
&
space
->
latch
);
}
if
(
success
)
{
...
...
@@ -2318,6 +2339,31 @@ fil_delete_tablespace(
return
(
FALSE
);
}
/*******************************************************************//**
Returns TRUE if a single-table tablespace is being deleted.
@return TRUE if being deleted */
UNIV_INTERN
ibool
fil_tablespace_is_being_deleted
(
/*============================*/
ulint
id
)
/*!< in: space id */
{
fil_space_t
*
space
;
ibool
is_being_deleted
;
mutex_enter
(
&
fil_system
->
mutex
);
space
=
fil_space_get_by_id
(
id
);
ut_a
(
space
!=
NULL
);
is_being_deleted
=
space
->
is_being_deleted
;
mutex_exit
(
&
fil_system
->
mutex
);
return
(
is_being_deleted
);
}
#ifndef UNIV_HOTBACKUP
/*******************************************************************//**
Discards a single-table tablespace. The tablespace must be cached in the
...
...
@@ -4788,7 +4834,7 @@ fil_page_get_type(
return
(
mach_read_from_2
(
page
+
FIL_PAGE_TYPE
));
}
/****************************************************************
**
**
/****************************************************************
//
**
Initializes the tablespace memory cache. */
UNIV_INTERN
void
...
...
storage/innobase/fsp/fsp0fsp.c
View file @
5aa89abf
...
...
@@ -3097,13 +3097,63 @@ fsp_get_available_space_in_free_extents(
ut_ad
(
!
mutex_own
(
&
kernel_mutex
));
/* The convoluted mutex acquire is to overcome latching order
issues: The problem is that the fil_mutex is at a lower level
than the tablespace latch and the buffer pool mutex. We have to
first prevent any operations on the file system by acquiring the
dictionary mutex. Then acquire the tablespace latch to obey the
latching order and then release the dictionary mutex. That way we
ensure that the tablespace instance can't be freed while we are
examining its contents (see fil_space_free()).
However, there is one further complication, we release the fil_mutex
when we need to invalidate the the pages in the buffer pool and we
reacquire the fil_mutex when deleting and freeing the tablespace
instance in fil0fil.c. Here we need to account for that situation
too. */
mutex_enter
(
&
dict_sys
->
mutex
);
/* At this stage there is no guarantee that the tablespace even
exists in the cache. */
if
(
fil_tablespace_deleted_or_being_deleted_in_mem
(
space
,
-
1
))
{
mutex_exit
(
&
dict_sys
->
mutex
);
return
(
ULLINT_UNDEFINED
);
}
mtr_start
(
&
mtr
);
latch
=
fil_space_get_latch
(
space
,
&
flags
);
/* This should ensure that the tablespace instance can't be freed
by another thread. However, the tablespace pages can still be freed
from the buffer pool. We need to check for that again. */
zip_size
=
dict_table_flags_to_zip_size
(
flags
);
mtr_x_lock
(
latch
,
&
mtr
);
mutex_exit
(
&
dict_sys
->
mutex
);
/* At this point it is possible for the tablespace to be deleted and
its pages removed from the buffer pool. We need to check for that
situation. However, the tablespace instance can't be deleted because
our latching above should ensure that. */
if
(
fil_tablespace_is_being_deleted
(
space
))
{
mtr_commit
(
&
mtr
);
return
(
ULLINT_UNDEFINED
);
}
/* From here on even if the user has dropped the tablespace, the
pages _must_ still exist in the buffer pool and the tablespace
instance _must_ be in the file system hash table. */
space_header
=
fsp_get_space_header
(
space
,
zip_size
,
&
mtr
);
size
=
mtr_read_ulint
(
space_header
+
FSP_SIZE
,
MLOG_4BYTES
,
&
mtr
);
...
...
storage/innobase/handler/ha_innodb.cc
View file @
5aa89abf
This diff is collapsed.
Click to expand it.
storage/innobase/handler/handler0alter.cc
View file @
5aa89abf
...
...
@@ -1016,12 +1016,13 @@ ha_innobase::prepare_drop_index(
index
->
to_be_dropped
=
TRUE
;
}
/* If FOREIGN_KEY_CHECK = 1 you may not drop an index defined
/* If FOREIGN_KEY_CHECK
S
= 1 you may not drop an index defined
for a foreign key constraint because InnoDB requires that both
tables contain indexes for the constraint. Note that CREATE
INDEX id ON table does a CREATE INDEX and DROP INDEX, and we
can ignore here foreign keys because a new index for the
foreign key has already been created.
tables contain indexes for the constraint. Such index can
be dropped only if FOREIGN_KEY_CHECKS is set to 0.
Note that CREATE INDEX id ON table does a CREATE INDEX and
DROP INDEX, and we can ignore here foreign keys because a
new index for the foreign key has already been created.
We check for the foreign key constraints after marking the
candidate indexes for deletion, because when we check for an
...
...
storage/innobase/include/btr0btr.h
View file @
5aa89abf
...
...
@@ -105,26 +105,35 @@ btr_root_get(
Gets a buffer page and declares its latching order level. */
UNIV_INLINE
buf_block_t
*
btr_block_get
(
/*==========*/
ulint
space
,
/*!< in: space id */
ulint
zip_size
,
/*!< in: compressed page size in bytes
or 0 for uncompressed pages */
ulint
page_no
,
/*!< in: page number */
ulint
mode
,
/*!< in: latch mode */
mtr_t
*
mtr
);
/*!< in: mtr */
/**************************************************************//**
Gets a buffer page and declares its latching order level. */
UNIV_INLINE
page_t
*
btr_page_get
(
/*=========*/
ulint
space
,
/*!< in: space id */
ulint
zip_size
,
/*!< in: compressed page size in bytes
or 0 for uncompressed pages */
ulint
page_no
,
/*!< in: page number */
ulint
mode
,
/*!< in: latch mode */
mtr_t
*
mtr
);
/*!< in: mtr */
btr_block_get_func
(
/*===============*/
ulint
space
,
/*!< in: space id */
ulint
zip_size
,
/*!< in: compressed page size in bytes
or 0 for uncompressed pages */
ulint
page_no
,
/*!< in: page number */
ulint
mode
,
/*!< in: latch mode */
const
char
*
file
,
/*!< in: file name */
ulint
line
,
/*!< in: line where called */
mtr_t
*
mtr
)
/*!< in/out: mtr */
__attribute__
((
nonnull
));
/** Gets a buffer page and declares its latching order level.
@param space tablespace identifier
@param zip_size compressed page size in bytes or 0 for uncompressed pages
@param page_no page number
@param mode latch mode
@param mtr mini-transaction handle
@return the block descriptor */
# define btr_block_get(space,zip_size,page_no,mode,mtr) \
btr_block_get_func(space,zip_size,page_no,mode,__FILE__,__LINE__,mtr)
/** Gets a buffer page and declares its latching order level.
@param space tablespace identifier
@param zip_size compressed page size in bytes or 0 for uncompressed pages
@param page_no page number
@param mode latch mode
@param mtr mini-transaction handle
@return the uncompressed page frame */
# define btr_page_get(space,zip_size,page_no,mode,mtr) \
buf_block_get_frame(btr_block_get(space,zip_size,page_no,mode,mtr))
#endif
/* !UNIV_HOTBACKUP */
/**************************************************************//**
Gets the index id field of a page.
...
...
storage/innobase/include/btr0btr.ic
View file @
5aa89abf
...
...
@@ -39,18 +39,21 @@ Created 6/2/1994 Heikki Tuuri
Gets a buffer page and declares its latching order level. */
UNIV_INLINE
buf_block_t*
btr_block_get(
/*==========*/
ulint space, /*!< in: space id */
ulint zip_size, /*!< in: compressed page size in bytes
or 0 for uncompressed pages */
ulint page_no, /*!< in: page number */
ulint mode, /*!< in: latch mode */
mtr_t* mtr) /*!< in: mtr */
btr_block_get_func(
/*===============*/
ulint space, /*!< in: space id */
ulint zip_size, /*!< in: compressed page size in bytes
or 0 for uncompressed pages */
ulint page_no, /*!< in: page number */
ulint mode, /*!< in: latch mode */
const char* file, /*!< in: file name */
ulint line, /*!< in: line where called */
mtr_t* mtr) /*!< in/out: mtr */
{
buf_block_t* block;
block = buf_page_get(space, zip_size, page_no, mode, mtr);
block = buf_page_get_gen(space, zip_size, page_no, mode,
NULL, BUF_GET, file, line, mtr);
if (mode != RW_NO_LATCH) {
...
...
@@ -60,23 +63,6 @@ btr_block_get(
return(block);
}
/**************************************************************//**
Gets a buffer page and declares its latching order level. */
UNIV_INLINE
page_t*
btr_page_get(
/*=========*/
ulint space, /*!< in: space id */
ulint zip_size, /*!< in: compressed page size in bytes
or 0 for uncompressed pages */
ulint page_no, /*!< in: page number */
ulint mode, /*!< in: latch mode */
mtr_t* mtr) /*!< in: mtr */
{
return(buf_block_get_frame(btr_block_get(space, zip_size, page_no,
mode, mtr)));
}
/**************************************************************//**
Sets the index id field of a page. */
UNIV_INLINE
...
...
storage/innobase/include/btr0cur.h
View file @
5aa89abf
...
...
@@ -508,7 +508,7 @@ Stores the fields in big_rec_vec to the tablespace and puts pointers to
them in rec. The extern flags in rec will have to be set beforehand.
The fields are stored on pages allocated from leaf node
file segment of the index tree.
@return DB_SUCCESS or
error
*/
@return DB_SUCCESS or
DB_OUT_OF_FILE_SPACE
*/
UNIV_INTERN
ulint
btr_store_big_rec_extern_fields
(
...
...
storage/innobase/include/db0err.h
View file @
5aa89abf
...
...
@@ -104,6 +104,12 @@ enum db_err {
DB_FOREIGN_EXCEED_MAX_CASCADE
,
/* Foreign key constraint related
cascading delete/update exceeds
maximum allowed depth */
DB_CHILD_NO_INDEX
,
/* the child (foreign) table does not
have an index that contains the
foreign keys as its prefix columns */
DB_PARENT_NO_INDEX
,
/* the parent table does not
have an index that contains the
foreign keys as its prefix columns */
/* The following are partial failure codes */
DB_FAIL
=
1000
,
...
...
storage/innobase/include/dict0dict.h
View file @
5aa89abf
...
...
@@ -345,7 +345,8 @@ void
dict_table_replace_index_in_foreign_list
(
/*=====================================*/
dict_table_t
*
table
,
/*!< in/out: table */
dict_index_t
*
index
);
/*!< in: index to be replaced */
dict_index_t
*
index
,
/*!< in: index to be replaced */
const
trx_t
*
trx
);
/*!< in: transaction handle */
/*********************************************************************//**
Checks if a index is defined for a foreign key constraint. Index is a part
of a foreign key constraint if the index is referenced by foreign key
...
...
@@ -1080,19 +1081,13 @@ Calculates new estimates for table and index statistics. The statistics
are used in query optimization. */
UNIV_INTERN
void
dict_update_statistics_low
(
/*=======================*/
dict_table_t
*
table
,
/*!< in/out: table */
ibool
has_dict_mutex
);
/*!< in: TRUE if the caller has the
dictionary mutex */
/*********************************************************************//**
Calculates new estimates for table and index statistics. The statistics
are used in query optimization. */
UNIV_INTERN
void
dict_update_statistics
(
/*===================*/
dict_table_t
*
table
);
/*!< in/out: table */
dict_table_t
*
table
,
/*!< in/out: table */
ibool
only_calc_if_missing_stats
);
/*!< in: only
update/recalc the stats if they have
not been initialized yet, otherwise
do nothing */
/********************************************************************//**
Reserves the dictionary system mutex for MySQL. */
UNIV_INTERN
...
...
@@ -1106,21 +1101,25 @@ void
dict_mutex_exit_for_mysql
(
void
);
/*===========================*/
/**********************************************************************//**
Lock the appropriate
mutex to protect index->stat_n_diff_key_vals[]
.
index->id is used to pick the right mutex and it should not change
before dict_index_stat_mutex_exit() is called on this index
. */
Lock the appropriate
latch to protect a given table's statistics
.
table->id is used to pick the corresponding latch from a global array of
latches
. */
UNIV_INTERN
void
dict_index_stat_mutex_enter
(
/*========================*/
const
dict_index_t
*
index
);
/*!< in: index */
dict_table_stats_lock
(
/*==================*/
const
dict_table_t
*
table
,
/*!< in: table */
ulint
latch_mode
);
/*!< in: RW_S_LATCH or
RW_X_LATCH */
/**********************************************************************//**
Unlock the
appropriate mutex that protects index->stat_n_diff_key_vals[].
*/
Unlock the
latch that has been locked by dict_table_stats_lock()
*/
UNIV_INTERN
void
dict_index_stat_mutex_exit
(
/*=======================*/
const
dict_index_t
*
index
);
/*!< in: index */
dict_table_stats_unlock
(
/*====================*/
const
dict_table_t
*
table
,
/*!< in: table */
ulint
latch_mode
);
/*!< in: RW_S_LATCH or
RW_X_LATCH */
/********************************************************************//**
Checks if the database name in two table names is the same.
@return TRUE if same db name */
...
...
storage/innobase/include/fil0fil.h
View file @
5aa89abf
...
...
@@ -717,6 +717,14 @@ fil_page_get_type(
/*==============*/
const
byte
*
page
);
/*!< in: file page */
/*******************************************************************//**
Returns TRUE if a single-table tablespace is being deleted.
@return TRUE if being deleted */
UNIV_INTERN
ibool
fil_tablespace_is_being_deleted
(
/*============================*/
ulint
id
);
/*!< in: space id */
typedef
struct
fil_space_struct
fil_space_t
;
...
...
storage/innobase/include/row0ins.h
View file @
5aa89abf
...
...
@@ -84,9 +84,10 @@ ulint
row_ins_index_entry
(
/*================*/
dict_index_t
*
index
,
/*!< in: index */
dtuple_t
*
entry
,
/*!< in: index entry to insert */
dtuple_t
*
entry
,
/*!< in
/out
: index entry to insert */
ulint
n_ext
,
/*!< in: number of externally stored columns */
ibool
foreign
,
/*!< in: TRUE=check foreign key constraints */
ibool
foreign
,
/*!< in: TRUE=check foreign key constraints
(foreign=FALSE only during CREATE INDEX) */
que_thr_t
*
thr
);
/*!< in: query thread */
/***********************************************************//**
Inserts a row to a table. This is a high-level function used in
...
...
storage/innobase/include/row0upd.h
View file @
5aa89abf
...
...
@@ -126,8 +126,8 @@ UNIV_INTERN
void
row_upd_index_entry_sys_field
(
/*==========================*/
const
dtuple_t
*
entry
,
/*!< in: index entry, where the memory buffers
for sys fields are already allocated:
dtuple_t
*
entry
,
/*!< in/out: index entry, where the memory
buffers
for sys fields are already allocated:
the function just copies the new values to
them */
dict_index_t
*
index
,
/*!< in: clustered index */
...
...
storage/innobase/include/univ.i
View file @
5aa89abf
...
...
@@ -46,7 +46,7 @@ Created 1/20/1994 Heikki Tuuri
#
define
INNODB_VERSION_MAJOR
1
#
define
INNODB_VERSION_MINOR
1
#
define
INNODB_VERSION_BUGFIX
3
#
define
INNODB_VERSION_BUGFIX
4
/* The following is the InnoDB version as shown in
SELECT plugin_version FROM information_schema.plugins;
...
...
@@ -374,6 +374,9 @@ typedef unsigned long long int ullint;
/** The generic InnoDB system object identifier data type */
typedef
ib_uint64_t
ib_id_t
;
/* The 'undefined' value for a ullint */
#
define
ULLINT_UNDEFINED
((
ullint
)(
-
1
))
/* This 'ibool' type is used within Innobase. Remember that different included
headers may define 'bool' differently. Do not assume that 'bool' is a ulint! */
#
define
ibool
ulint
...
...
storage/innobase/row/row0ins.c
View file @
5aa89abf
...
...
@@ -1768,7 +1768,7 @@ ulint
row_ins_duplicate_error_in_clust
(
/*=============================*/
btr_cur_t
*
cursor
,
/*!< in: B-tree cursor */
dtuple_t
*
entry
,
/*!< in: entry to insert */
const
dtuple_t
*
entry
,
/*!< in: entry to insert */
que_thr_t
*
thr
,
/*!< in: query thread */
mtr_t
*
mtr
)
/*!< in: mtr */
{
...
...
@@ -1964,7 +1964,7 @@ row_ins_index_entry_low(
depending on whether we wish optimistic or
pessimistic descent down the index tree */
dict_index_t
*
index
,
/*!< in: index */
dtuple_t
*
entry
,
/*!< in: index entry to insert */
dtuple_t
*
entry
,
/*!< in
/out
: index entry to insert */
ulint
n_ext
,
/*!< in: number of externally stored columns */
que_thr_t
*
thr
)
/*!< in: query thread */
{
...
...
@@ -2150,9 +2150,10 @@ ulint
row_ins_index_entry
(
/*================*/
dict_index_t
*
index
,
/*!< in: index */
dtuple_t
*
entry
,
/*!< in: index entry to insert */
dtuple_t
*
entry
,
/*!< in
/out
: index entry to insert */
ulint
n_ext
,
/*!< in: number of externally stored columns */
ibool
foreign
,
/*!< in: TRUE=check foreign key constraints */
ibool
foreign
,
/*!< in: TRUE=check foreign key constraints
(foreign=FALSE only during CREATE INDEX) */
que_thr_t
*
thr
)
/*!< in: query thread */
{
ulint
err
;
...
...
storage/innobase/row/row0merge.c
View file @
5aa89abf
...
...
@@ -2042,7 +2042,7 @@ row_merge_drop_index(
/* Replace this index with another equivalent index for all
foreign key constraints on this table where this index is used */
dict_table_replace_index_in_foreign_list
(
table
,
index
);
dict_table_replace_index_in_foreign_list
(
table
,
index
,
trx
);
dict_index_remove_from_cache
(
table
,
index
);
trx
->
op_info
=
""
;
...
...
storage/innobase/row/row0mysql.c
View file @
5aa89abf
...
...
@@ -930,7 +930,8 @@ row_update_statistics_if_needed(
if
(
counter
>
2000000000
||
((
ib_int64_t
)
counter
>
16
+
table
->
stat_n_rows
/
16
))
{
dict_update_statistics
(
table
);
dict_update_statistics
(
table
,
FALSE
/* update even if stats
are initialized */
);
}
}
...
...
@@ -3020,7 +3021,8 @@ row_truncate_table_for_mysql(
dict_table_autoinc_lock
(
table
);
dict_table_autoinc_initialize
(
table
,
1
);
dict_table_autoinc_unlock
(
table
);
dict_update_statistics
(
table
);
dict_update_statistics
(
table
,
FALSE
/* update even if stats are
initialized */
);
trx_commit_for_mysql
(
trx
);
...
...
storage/innobase/row/row0sel.c
View file @
5aa89abf
...
...
@@ -104,6 +104,18 @@ row_sel_sec_rec_is_for_blob(
ulint
len
;
byte
buf
[
DICT_MAX_INDEX_COL_LEN
];
ut_a
(
clust_len
>=
BTR_EXTERN_FIELD_REF_SIZE
);
if
(
UNIV_UNLIKELY
(
!
memcmp
(
clust_field
+
clust_len
-
BTR_EXTERN_FIELD_REF_SIZE
,
field_ref_zero
,
BTR_EXTERN_FIELD_REF_SIZE
)))
{
/* The externally stored field was not written yet.
This record should only be seen by
recv_recovery_rollback_active() or any
TRX_ISO_READ_UNCOMMITTED transactions. */
return
(
FALSE
);
}
len
=
btr_copy_externally_stored_field_prefix
(
buf
,
sizeof
buf
,
zip_size
,
clust_field
,
clust_len
);
...
...
storage/innobase/row/row0upd.c
View file @
5aa89abf
...
...
@@ -371,8 +371,8 @@ UNIV_INTERN
void
row_upd_index_entry_sys_field
(
/*==========================*/
const
dtuple_t
*
entry
,
/*!< in: index entry, where the memory buffers
for sys fields are already allocated:
dtuple_t
*
entry
,
/*!< in/out: index entry, where the memory
buffers
for sys fields are already allocated:
the function just copies the new values to
them */
dict_index_t
*
index
,
/*!< in: clustered index */
...
...
@@ -1615,12 +1615,12 @@ static
ulint
row_upd_clust_rec_by_insert
(
/*========================*/
upd_node_t
*
node
,
/*!< in: row update node */
upd_node_t
*
node
,
/*!< in
/out
: row update node */
dict_index_t
*
index
,
/*!< in: clustered index of the record */
que_thr_t
*
thr
,
/*!< in: query thread */
ibool
referenced
,
/*!< in: TRUE if index may be referenced in
a foreign key constraint */
mtr_t
*
mtr
)
/*!< in: mtr; gets committed here */
mtr_t
*
mtr
)
/*!< in
/out
: mtr; gets committed here */
{
mem_heap_t
*
heap
=
NULL
;
btr_pcur_t
*
pcur
;
...
...
storage/innobase/sync/sync0rw.c
View file @
5aa89abf
...
...
@@ -1002,7 +1002,7 @@ rw_lock_debug_print(
rwt
=
info
->
lock_type
;
fprintf
(
stderr
,
"Locked: thread %l
d file %s line %ld
"
,
fprintf
(
stderr
,
"Locked: thread %l
u file %s line %lu
"
,
(
ulong
)
os_thread_pf
(
info
->
thread_id
),
info
->
file_name
,
(
ulong
)
info
->
line
);
if
(
rwt
==
RW_LOCK_SHARED
)
{
...
...
storage/innobase/thr/thr0loc.c
View file @
5aa89abf
...
...
@@ -76,6 +76,24 @@ struct thr_local_struct{
/** The value of thr_local_struct::magic_n */
#define THR_LOCAL_MAGIC_N 1231234
#ifdef UNIV_DEBUG
/*******************************************************************//**
Validates thread local data.
@return TRUE if valid */
static
ibool
thr_local_validate
(
/*===============*/
const
thr_local_t
*
local
)
/*!< in: data to validate */
{
ut_ad
(
local
->
magic_n
==
THR_LOCAL_MAGIC_N
);
ut_ad
(
local
->
slot_no
==
ULINT_UNDEFINED
||
local
->
slot_no
<
OS_THREAD_MAX_N
);
ut_ad
(
local
->
in_ibuf
==
FALSE
||
local
->
in_ibuf
==
TRUE
);
return
(
TRUE
);
}
#endif
/* UNIV_DEBUG */
/*******************************************************************//**
Returns the local storage struct for a thread.
@return local storage */
...
...
@@ -96,7 +114,8 @@ thr_local_get(
local
=
NULL
;
HASH_SEARCH
(
hash
,
thr_local_hash
,
os_thread_pf
(
id
),
thr_local_t
*
,
local
,,
os_thread_eq
(
local
->
id
,
id
));
thr_local_t
*
,
local
,
ut_ad
(
thr_local_validate
(
local
)),
os_thread_eq
(
local
->
id
,
id
));
if
(
local
==
NULL
)
{
mutex_exit
(
&
thr_local_mutex
);
...
...
@@ -107,7 +126,7 @@ thr_local_get(
goto
try_again
;
}
ut_ad
(
local
->
magic_n
==
THR_LOCAL_MAGIC_N
);
ut_ad
(
thr_local_validate
(
local
)
);
return
(
local
);
}
...
...
@@ -193,7 +212,7 @@ thr_local_create(void)
local
->
id
=
os_thread_get_curr_id
();
local
->
handle
=
os_thread_get_curr
();
local
->
magic_n
=
THR_LOCAL_MAGIC_N
;
local
->
slot_no
=
ULINT_UNDEFINED
;
local
->
in_ibuf
=
FALSE
;
mutex_enter
(
&
thr_local_mutex
);
...
...
@@ -220,7 +239,8 @@ thr_local_free(
/* Look for the local struct in the hash table */
HASH_SEARCH
(
hash
,
thr_local_hash
,
os_thread_pf
(
id
),
thr_local_t
*
,
local
,,
os_thread_eq
(
local
->
id
,
id
));
thr_local_t
*
,
local
,
ut_ad
(
thr_local_validate
(
local
)),
os_thread_eq
(
local
->
id
,
id
));
if
(
local
==
NULL
)
{
mutex_exit
(
&
thr_local_mutex
);
...
...
@@ -233,6 +253,7 @@ thr_local_free(
mutex_exit
(
&
thr_local_mutex
);
ut_a
(
local
->
magic_n
==
THR_LOCAL_MAGIC_N
);
ut_ad
(
thr_local_validate
(
local
));
mem_free
(
local
);
}
...
...
@@ -276,6 +297,7 @@ thr_local_close(void)
local
=
HASH_GET_NEXT
(
hash
,
prev_local
);
ut_a
(
prev_local
->
magic_n
==
THR_LOCAL_MAGIC_N
);
ut_ad
(
thr_local_validate
(
prev_local
));
mem_free
(
prev_local
);
}
}
...
...
storage/innobase/trx/trx0i_s.c
View file @
5aa89abf
...
...
@@ -415,6 +415,42 @@ table_cache_create_empty_row(
return
(
row
);
}
#ifdef UNIV_DEBUG
/*******************************************************************//**
Validates a row in the locks cache.
@return TRUE if valid */
static
ibool
i_s_locks_row_validate
(
/*===================*/
const
i_s_locks_row_t
*
row
)
/*!< in: row to validate */
{
ut_ad
(
row
->
lock_trx_id
!=
0
);
ut_ad
(
row
->
lock_mode
!=
NULL
);
ut_ad
(
row
->
lock_type
!=
NULL
);
ut_ad
(
row
->
lock_table
!=
NULL
);
ut_ad
(
row
->
lock_table_id
!=
0
);
if
(
row
->
lock_space
==
ULINT_UNDEFINED
)
{
/* table lock */
ut_ad
(
!
strcmp
(
"TABLE"
,
row
->
lock_type
));
ut_ad
(
row
->
lock_index
==
NULL
);
ut_ad
(
row
->
lock_data
==
NULL
);
ut_ad
(
row
->
lock_page
==
ULINT_UNDEFINED
);
ut_ad
(
row
->
lock_rec
==
ULINT_UNDEFINED
);
}
else
{
/* record lock */
ut_ad
(
!
strcmp
(
"RECORD"
,
row
->
lock_type
));
ut_ad
(
row
->
lock_index
!=
NULL
);
ut_ad
(
row
->
lock_data
!=
NULL
);
ut_ad
(
row
->
lock_page
!=
ULINT_UNDEFINED
);
ut_ad
(
row
->
lock_rec
!=
ULINT_UNDEFINED
);
}
return
(
TRUE
);
}
#endif
/* UNIV_DEBUG */
/*******************************************************************//**
Fills i_s_trx_row_t object.
If memory can not be allocated then FALSE is returned.
...
...
@@ -445,18 +481,15 @@ fill_trx_row(
row
->
trx_id
=
trx
->
id
;
row
->
trx_started
=
(
ib_time_t
)
trx
->
start_time
;
row
->
trx_state
=
trx_get_que_state_str
(
trx
);
row
->
requested_lock_row
=
requested_lock_row
;
ut_ad
(
requested_lock_row
==
NULL
||
i_s_locks_row_validate
(
requested_lock_row
));
if
(
trx
->
wait_lock
!=
NULL
)
{
ut_a
(
requested_lock_row
!=
NULL
);
row
->
requested_lock_row
=
requested_lock_row
;
row
->
trx_wait_started
=
(
ib_time_t
)
trx
->
wait_started
;
}
else
{
ut_a
(
requested_lock_row
==
NULL
);
row
->
requested_lock_row
=
NULL
;
row
->
trx_wait_started
=
0
;
}
...
...
@@ -812,6 +845,7 @@ fill_locks_row(
row
->
lock_table_id
=
lock_get_table_id
(
lock
);
row
->
hash_chain
.
value
=
row
;
ut_ad
(
i_s_locks_row_validate
(
row
));
return
(
TRUE
);
}
...
...
@@ -832,6 +866,9 @@ fill_lock_waits_row(
relevant blocking lock
row in innodb_locks */
{
ut_ad
(
i_s_locks_row_validate
(
requested_lock_row
));
ut_ad
(
i_s_locks_row_validate
(
blocking_lock_row
));
row
->
requested_lock_row
=
requested_lock_row
;
row
->
blocking_lock_row
=
blocking_lock_row
;
...
...
@@ -903,6 +940,7 @@ locks_row_eq_lock(
or ULINT_UNDEFINED if the lock
is a table lock */
{
ut_ad
(
i_s_locks_row_validate
(
row
));
#ifdef TEST_NO_LOCKS_ROW_IS_EVER_EQUAL_TO_LOCK_T
return
(
0
);
#else
...
...
@@ -960,7 +998,7 @@ search_innodb_locks(
/* auxiliary variable */
hash_chain
,
/* assertion on every traversed item */
,
ut_ad
(
i_s_locks_row_validate
(
hash_chain
->
value
))
,
/* this determines if we have found the lock */
locks_row_eq_lock
(
hash_chain
->
value
,
lock
,
heap_no
));
...
...
@@ -1000,6 +1038,7 @@ add_lock_to_cache(
dst_row
=
search_innodb_locks
(
cache
,
lock
,
heap_no
);
if
(
dst_row
!=
NULL
)
{
ut_ad
(
i_s_locks_row_validate
(
dst_row
));
return
(
dst_row
);
}
#endif
...
...
@@ -1037,6 +1076,7 @@ add_lock_to_cache(
}
/* for()-loop */
#endif
ut_ad
(
i_s_locks_row_validate
(
dst_row
));
return
(
dst_row
);
}
...
...
storage/innobase/ut/ut0ut.c
View file @
5aa89abf
...
...
@@ -715,6 +715,10 @@ ut_strerr(
return
(
"Zip overflow"
);
case
DB_RECORD_NOT_FOUND
:
return
(
"Record not found"
);
case
DB_CHILD_NO_INDEX
:
return
(
"No index on referencing keys in referencing table"
);
case
DB_PARENT_NO_INDEX
:
return
(
"No index on referenced keys in referenced table"
);
case
DB_END_OF_INDEX
:
return
(
"End of index"
);
/* do not add default: in order to produce a warning if new code
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment