1
0
mirror of https://github.com/MariaDB/server.git synced 2025-11-09 11:41:36 +03:00

Merge 10.11 into 11.4

This commit is contained in:
Marko Mäkelä
2025-09-24 13:40:09 +03:00
66 changed files with 1171 additions and 254 deletions

View File

@@ -2884,7 +2884,9 @@ static void fix_history(String *final_command)
ptr++; ptr++;
} }
if (total_lines > 1) if (total_lines > 1)
add_history(fixed_buffer.ptr()); {
add_history(fixed_buffer.c_ptr());
}
} }
/* /*

View File

@@ -81,6 +81,7 @@ my %debuggers = (
options => '_RR_TRACE_DIR={log} rr record {exe} {args}', options => '_RR_TRACE_DIR={log} rr record {exe} {args}',
run => 'env', run => 'env',
pre => sub { pre => sub {
push @::global_suppressions, qr/InnoDB: native AIO failed/;
::mtr_error('rr requires kernel.perf_event_paranoid <= 1') ::mtr_error('rr requires kernel.perf_event_paranoid <= 1')
if ::mtr_grab_file('/proc/sys/kernel/perf_event_paranoid') > 1; if ::mtr_grab_file('/proc/sys/kernel/perf_event_paranoid') > 1;
} }

View File

@@ -71,7 +71,8 @@ X
"rows": 10000, "rows": 10000,
"r_rows": 10000, "r_rows": 10000,
"r_filtered": 100, "r_filtered": 100,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": { "r_engine_stats": {
"pages_accessed": "REPLACED", "pages_accessed": "REPLACED",
"pages_updated": "REPLACED" "pages_updated": "REPLACED"
@@ -104,7 +105,8 @@ X
"rows": 10000, "rows": 10000,
"r_rows": 10000, "r_rows": 10000,
"r_filtered": 50, "r_filtered": 50,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": { "r_engine_stats": {
"pages_accessed": "REPLACED", "pages_accessed": "REPLACED",
"pages_updated": "REPLACED" "pages_updated": "REPLACED"

View File

@@ -419,7 +419,8 @@ ANALYZE
"rows": 1000, "rows": 1000,
"r_rows": 1000, "r_rows": 1000,
"r_filtered": 100, "r_filtered": 100,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED "r_engine_stats": REPLACED
} }
} }
@@ -483,7 +484,8 @@ ANALYZE
"rows": 10, "rows": 10,
"r_rows": 10, "r_rows": 10,
"r_filtered": 50, "r_filtered": 50,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED, "r_engine_stats": REPLACED,
"attached_condition": "t1.pk < 10 and t1.b > 4" "attached_condition": "t1.pk < 10 and t1.b > 4"
} }
@@ -1295,3 +1297,121 @@ ANALYZE
} }
set join_cache_level=@tmp; set join_cache_level=@tmp;
drop table t10, t11; drop table t10, t11;
#
# MDEV-33309: ANALYZE FORMAT=JSON: UPDATE|DELETE don't show r_other_time_ms
#
create table t1 (pk int primary key, a int);
insert into t1 select seq, seq from seq_1_to_1000;
create table t2 like t1;
insert into t2 select * from t1;
# Top-level query block must have r_table_time_ms and r_other_time_ms
analyze format=json
update t1 set a=a+1
where t1.pk > (select max(a) from t2 where t2.pk+1 = t1.pk+1 ) - 10;
ANALYZE
{
"query_optimization": {
"r_total_time_ms": "REPLACED"
},
"query_block": {
"select_id": 1,
"r_total_time_ms": "REPLACED",
"table": {
"update": 1,
"table_name": "t1",
"access_type": "ALL",
"rows": 1000,
"r_rows": 1000,
"r_filtered": 100,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED,
"attached_condition": "t1.pk > (subquery#2) - 10"
},
"subqueries": [
{
"query_block": {
"select_id": 2,
"cost": "REPLACED",
"r_loops": 1000,
"r_total_time_ms": "REPLACED",
"nested_loop": [
{
"table": {
"table_name": "t2",
"access_type": "ALL",
"loops": 1,
"r_loops": 1000,
"rows": 1000,
"r_rows": 1000,
"cost": "REPLACED",
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED,
"filtered": 100,
"r_filtered": 0.1,
"attached_condition": "t2.pk + 1 = t1.pk + 1"
}
}
]
}
}
]
}
}
# Top-level query block must have r_table_time_ms and r_other_time_ms
analyze format=json
delete from t1
where t1.pk > (select max(a) from t2 where t2.pk+1 = t1.pk+1 ) - 10;
ANALYZE
{
"query_optimization": {
"r_total_time_ms": "REPLACED"
},
"query_block": {
"select_id": 1,
"r_total_time_ms": "REPLACED",
"table": {
"delete": 1,
"table_name": "t1",
"access_type": "ALL",
"rows": 1000,
"r_rows": 1000,
"r_filtered": 100,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED,
"attached_condition": "t1.pk > (subquery#2) - 10"
},
"subqueries": [
{
"query_block": {
"select_id": 2,
"cost": "REPLACED",
"r_loops": 1000,
"r_total_time_ms": "REPLACED",
"nested_loop": [
{
"table": {
"table_name": "t2",
"access_type": "ALL",
"loops": 1,
"r_loops": 1000,
"rows": 1000,
"r_rows": 1000,
"cost": "REPLACED",
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED,
"filtered": 100,
"r_filtered": 0.1,
"attached_condition": "t2.pk + 1 = t1.pk + 1"
}
}
]
}
}
]
}
}
drop table t1, t2;

View File

@@ -269,4 +269,25 @@ where
set join_cache_level=@tmp; set join_cache_level=@tmp;
drop table t10, t11; drop table t10, t11;
--echo #
--echo # MDEV-33309: ANALYZE FORMAT=JSON: UPDATE|DELETE don't show r_other_time_ms
--echo #
--source include/have_sequence.inc
create table t1 (pk int primary key, a int);
insert into t1 select seq, seq from seq_1_to_1000;
create table t2 like t1;
insert into t2 select * from t1;
--echo # Top-level query block must have r_table_time_ms and r_other_time_ms
--source include/analyze-format.inc
analyze format=json
update t1 set a=a+1
where t1.pk > (select max(a) from t2 where t2.pk+1 = t1.pk+1 ) - 10;
--echo # Top-level query block must have r_table_time_ms and r_other_time_ms
--source include/analyze-format.inc
analyze format=json
delete from t1
where t1.pk > (select max(a) from t2 where t2.pk+1 = t1.pk+1 ) - 10;
drop table t1, t2;

View File

@@ -55,7 +55,8 @@ ANALYZE
"rows": 10000, "rows": 10000,
"r_rows": 10000, "r_rows": 10000,
"r_filtered": 100, "r_filtered": 100,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED "r_engine_stats": REPLACED
} }
} }
@@ -111,7 +112,8 @@ ANALYZE
"rows": 9, "rows": 9,
"r_rows": 10, "r_rows": 10,
"r_filtered": 100, "r_filtered": 100,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED, "r_engine_stats": REPLACED,
"attached_condition": "t2.a < 10" "attached_condition": "t2.a < 10"
} }
@@ -165,7 +167,8 @@ ANALYZE
"rows": 10000, "rows": 10000,
"r_rows": 10000, "r_rows": 10000,
"r_filtered": 100, "r_filtered": 100,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED "r_engine_stats": REPLACED
} }
} }

View File

@@ -5,6 +5,7 @@
--source include/long_test.inc --source include/long_test.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/have_metadata_lock_info.inc --source include/have_metadata_lock_info.inc
--source include/have_profiling.inc
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/no_view_protocol.inc --source include/no_view_protocol.inc

View File

@@ -80,7 +80,8 @@ ANALYZE
"rows": 10, "rows": 10,
"r_rows": 10, "r_rows": 10,
"r_filtered": 30, "r_filtered": 30,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED, "r_engine_stats": REPLACED,
"attached_condition": "t1.a in (2,3,4)" "attached_condition": "t1.a in (2,3,4)"
} }
@@ -104,7 +105,8 @@ ANALYZE
"rows": 10, "rows": 10,
"r_rows": 10, "r_rows": 10,
"r_filtered": 0, "r_filtered": 0,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED, "r_engine_stats": REPLACED,
"attached_condition": "t1.a in (20,30,40)" "attached_condition": "t1.a in (20,30,40)"
} }

View File

@@ -2686,6 +2686,12 @@ json_detailed('[[123],456]')
[123], [123],
456 456
] ]
#
# MDEV-37428 JSON_VALUE returns NULL for a key with an empty string value rather than an empty string
#
SELECT JSON_VALUE(JSON_OBJECT("a", ""), '$.a') = "" AS not_null;
not_null
1
# End of 10.11 Test # End of 10.11 Test
# #
# MDEV-32007: JSON_VALUE and JSON_EXTRACT doesn't handle dash (-) # MDEV-32007: JSON_VALUE and JSON_EXTRACT doesn't handle dash (-)

View File

@@ -1949,6 +1949,12 @@ select json_detailed('[[123],456]');
set @@collation_connection=@save_collation_connection; set @@collation_connection=@save_collation_connection;
select json_detailed('[[123],456]'); select json_detailed('[[123],456]');
--echo #
--echo # MDEV-37428 JSON_VALUE returns NULL for a key with an empty string value rather than an empty string
--echo #
SELECT JSON_VALUE(JSON_OBJECT("a", ""), '$.a') = "" AS not_null;
--echo # End of 10.11 Test --echo # End of 10.11 Test
--echo # --echo #

View File

@@ -1,6 +1,7 @@
# This test uses grants, which can't get tested for embedded server # This test uses grants, which can't get tested for embedded server
-- source include/not_embedded.inc -- source include/not_embedded.inc
-- source include/have_perfschema.inc -- source include/have_perfschema.inc
-- source include/have_profiling.inc
# check that CSV engine was compiled in, as the result of the test depends # check that CSV engine was compiled in, as the result of the test depends
# on the presence of the log tables (which are CSV-based). # on the presence of the log tables (which are CSV-based).

View File

@@ -843,3 +843,11 @@ insert into t (a) values (1);
update t set a=2; update t set a=2;
drop table t; drop table t;
# End of 10.6 tests # End of 10.6 tests
#
# MDEV-37404 InnoDB: Failing assertion: node->pcur->rel_pos == BTR_PCUR_ON
#
create table t(c int primary key, c2 blob unique) engine=innodb;
insert into t values (0, '');
replace into t values (0, '123');
drop table t;
# End of 10.11 tests

View File

@@ -767,3 +767,13 @@ update t set a=2;
drop table t; drop table t;
--echo # End of 10.6 tests --echo # End of 10.6 tests
--echo #
--echo # MDEV-37404 InnoDB: Failing assertion: node->pcur->rel_pos == BTR_PCUR_ON
--echo #
create table t(c int primary key, c2 blob unique) engine=innodb;
insert into t values (0, '');
replace into t values (0, '123');
drop table t;
--echo # End of 10.11 tests

View File

@@ -3335,7 +3335,8 @@ ANALYZE
"rows": 4, "rows": 4,
"r_rows": 4, "r_rows": 4,
"r_filtered": 25, "r_filtered": 25,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED, "r_engine_stats": REPLACED,
"attached_condition": "!(<in_optimizer>(t1.a,t1.a in (subquery#2)))" "attached_condition": "!(<in_optimizer>(t1.a,t1.a in (subquery#2)))"
}, },
@@ -3413,7 +3414,8 @@ ANALYZE
"rows": 2, "rows": 2,
"r_rows": 2, "r_rows": 2,
"r_filtered": 0, "r_filtered": 0,
"r_total_time_ms": "REPLACED", "r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"r_engine_stats": REPLACED, "r_engine_stats": REPLACED,
"attached_condition": "!(<in_optimizer>(t1.a,t1.a in (subquery#2)))" "attached_condition": "!(<in_optimizer>(t1.a,t1.a in (subquery#2)))"
}, },

View File

@@ -46,70 +46,23 @@ ALTER TABLE t1 MODIFY a DECIMAL(10,0);
SELECT * FROM t1,t2 WHERE a=d; SELECT * FROM t1,t2 WHERE a=d;
a b c pk d e a b c pk d e
Warnings: Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'd' Warning 1292 Truncated incorrect DECIMAL value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd' Warning 1292 Truncated incorrect DECIMAL value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f' Warning 1292 Truncated incorrect DECIMAL value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f' Warning 1292 Truncated incorrect DECIMAL value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g' Warning 1292 Truncated incorrect DECIMAL value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k' Warning 1292 Truncated incorrect DECIMAL value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm' Warning 1292 Truncated incorrect DECIMAL value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm' Warning 1292 Truncated incorrect DECIMAL value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm' Warning 1292 Truncated incorrect DECIMAL value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o' Warning 1292 Truncated incorrect DECIMAL value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q' Warning 1292 Truncated incorrect DECIMAL value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r' Warning 1292 Truncated incorrect DECIMAL value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u' Warning 1292 Truncated incorrect DECIMAL value: 'u'
Warning 1292 Truncated incorrect DOUBLE value: 'w' Warning 1292 Truncated incorrect DECIMAL value: 'w'
Warning 1292 Truncated incorrect DOUBLE value: 'x' Warning 1292 Truncated incorrect DECIMAL value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'x' Warning 1292 Truncated incorrect DECIMAL value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'y' Warning 1292 Truncated incorrect DECIMAL value: 'y'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u'
Warning 1292 Truncated incorrect DOUBLE value: 'w'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'y'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u'
Warning 1292 Truncated incorrect DOUBLE value: 'w'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'y'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u'
ALTER TABLE t1 MODIFY a DOUBLE; ALTER TABLE t1 MODIFY a DOUBLE;
SELECT * FROM t1,t2 WHERE a=d; SELECT * FROM t1,t2 WHERE a=d;
a b c pk d e a b c pk d e
@@ -131,53 +84,6 @@ Warning 1292 Truncated incorrect DOUBLE value: 'w'
Warning 1292 Truncated incorrect DOUBLE value: 'x' Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'x' Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'y' Warning 1292 Truncated incorrect DOUBLE value: 'y'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u'
Warning 1292 Truncated incorrect DOUBLE value: 'w'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'y'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u'
Warning 1292 Truncated incorrect DOUBLE value: 'w'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
Warning 1292 Truncated incorrect DOUBLE value: 'y'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'd'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'f'
Warning 1292 Truncated incorrect DOUBLE value: 'g'
Warning 1292 Truncated incorrect DOUBLE value: 'k'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'm'
Warning 1292 Truncated incorrect DOUBLE value: 'o'
Warning 1292 Truncated incorrect DOUBLE value: 'q'
Warning 1292 Truncated incorrect DOUBLE value: 'r'
Warning 1292 Truncated incorrect DOUBLE value: 'u'
DROP TABLE t1,t2; DROP TABLE t1,t2;
# #
# End of 10.2 tests # End of 10.2 tests

View File

@@ -1,4 +1,16 @@
# Wait max 10 min for key encryption threads to encrypt all spaces # Wait max 10 min for key encryption threads to encrypt all spaces
# Success! # Success!
SET GLOBAL innodb_encryption_threads=4;
SELECT COUNT(*) AS encrypt_threads_running
FROM performance_schema.threads
WHERE NAME LIKE '%encrypt%';
encrypt_threads_running
4
# restart: --innodb-read-only=1 --innodb-encrypt-tables=1 # restart: --innodb-read-only=1 --innodb-encrypt-tables=1
SET GLOBAL innodb_encryption_threads=4;
SELECT COUNT(*) AS encrypt_threads_running
FROM performance_schema.threads
WHERE NAME LIKE '%encrypt%';
encrypt_threads_running
0
# All done # All done

View File

@@ -25,10 +25,22 @@ if (!$success)
} }
--echo # Success! --echo # Success!
# Server in normal mode
SET GLOBAL innodb_encryption_threads=4;
SELECT COUNT(*) AS encrypt_threads_running
FROM performance_schema.threads
WHERE NAME LIKE '%encrypt%';
# #
# MDEV-11835: InnoDB: Failing assertion: free_slot != NULL on # MDEV-11835: InnoDB: Failing assertion: free_slot != NULL on
# restarting server with encryption and read-only # restarting server with encryption and read-only
# #
--let $restart_parameters= --innodb-read-only=1 --innodb-encrypt-tables=1 --let $restart_parameters= --innodb-read-only=1 --innodb-encrypt-tables=1
--source include/restart_mysqld.inc --source include/restart_mysqld.inc
# Server read-only mode
SET GLOBAL innodb_encryption_threads=4;
SELECT COUNT(*) AS encrypt_threads_running
FROM performance_schema.threads
WHERE NAME LIKE '%encrypt%';
--echo # All done --echo # All done

View File

@@ -94,8 +94,6 @@ ALTER TABLE t1 ADD COLUMN v2 int;
ALTER TABLE t2 ADD COLUMN v2 int; ALTER TABLE t2 ADD COLUMN v2 int;
ERROR HY000: Galera replication not supported ERROR HY000: Galera replication not supported
INSERT INTO t1 VALUES (1,1),(2,2); INSERT INTO t1 VALUES (1,1),(2,2);
Warnings:
Warning 1290 WSREP: wsrep_mode = STRICT_REPLICATION enabled. Storage engine partition for table 'test'.'t1' is not supported in Galera
INSERT INTO t2 VALUES (1),(2); INSERT INTO t2 VALUES (1),(2);
Warnings: Warnings:
Warning 1290 WSREP: wsrep_mode = STRICT_REPLICATION enabled. Storage engine partition for table 'test'.'t2' is not supported in Galera Warning 1290 WSREP: wsrep_mode = STRICT_REPLICATION enabled. Storage engine partition for table 'test'.'t2' is not supported in Galera
@@ -104,8 +102,6 @@ ERROR HY000: Galera replication not supported
ALTER TABLE t2 ADD COLUMN v3 int, ENGINE=Aria; ALTER TABLE t2 ADD COLUMN v3 int, ENGINE=Aria;
ERROR HY000: Galera replication not supported ERROR HY000: Galera replication not supported
UPDATE t1 SET v2 = v2 + 3; UPDATE t1 SET v2 = v2 + 3;
Warnings:
Warning 1290 WSREP: wsrep_mode = STRICT_REPLICATION enabled. Storage engine partition for table 'test'.'t1' is not supported in Galera
UPDATE t2 SET v1 = v1 + 3; UPDATE t2 SET v1 = v1 + 3;
Warnings: Warnings:
Warning 1290 WSREP: wsrep_mode = STRICT_REPLICATION enabled. Storage engine partition for table 'test'.'t2' is not supported in Galera Warning 1290 WSREP: wsrep_mode = STRICT_REPLICATION enabled. Storage engine partition for table 'test'.'t2' is not supported in Galera
@@ -173,4 +169,61 @@ SELECT @@wsrep_mode;
STRICT_REPLICATION STRICT_REPLICATION
ALTER TABLE t2 ENGINE=InnoDB; ALTER TABLE t2 ENGINE=InnoDB;
DROP TABLE t2; DROP TABLE t2;
SET GLOBAL wsrep_mode = DEFAULT; connection node_1;
#
# MDEV-37373 InnoDB partition table disallow local GTIDs in galera
# wsrep-mode= DISALLOW_LOCAL_GTID
#
SET GLOBAL wsrep_mode = "DISALLOW_LOCAL_GTID";
SELECT @@wsrep_mode;
@@wsrep_mode
DISALLOW_LOCAL_GTID
CREATE TABLE `sales` (
`customer_id` int(11) NOT NULL,
`customer_name` varchar(40) DEFAULT NULL,
`store_id` varchar(20) NOT NULL,
`bill_number` int(11) NOT NULL,
`bill_date` date NOT NULL,
`amount` decimal(8,2) NOT NULL,
PRIMARY KEY (`bill_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (year(`bill_date`))
(PARTITION `p0` VALUES LESS THAN (2016) ENGINE = InnoDB,
PARTITION `p1` VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION `p2` VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION `p3` VALUES LESS THAN (2020) ENGINE = InnoDB);
INSERT INTO sales
VALUES (1, 'Michael', 'S001', 101, '2015-01-02', 125.56),
(2, 'Jim', 'S003', 103, '2015-01-25', 476.50),
(3, 'Dwight', 'S012', 122, '2016-02-15', 335.00),
(4, 'Andy', 'S345', 121, '2016-03-26', 787.00),
(5, 'Pam', 'S234', 132, '2017-04-19', 678.00),
(6, 'Karen', 'S743', 111, '2017-05-31', 864.00),
(7, 'Toby', 'S234', 115, '2018-06-11', 762.00),
(8, 'Oscar', 'S012', 125, '2019-07-24', 300.00),
(9, 'Darryl', 'S456', 119, '2019-08-02', 492.20);
SELECT * FROM sales;
customer_id customer_name store_id bill_number bill_date amount
1 Michael S001 101 2015-01-02 125.56
2 Jim S003 103 2015-01-25 476.50
3 Dwight S012 122 2016-02-15 335.00
4 Andy S345 121 2016-03-26 787.00
5 Pam S234 132 2017-04-19 678.00
6 Karen S743 111 2017-05-31 864.00
7 Toby S234 115 2018-06-11 762.00
8 Oscar S012 125 2019-07-24 300.00
9 Darryl S456 119 2019-08-02 492.20
SET GLOBAL wsrep_mode=DEFAULT;
connection node_2;
SELECT * FROM sales;
customer_id customer_name store_id bill_number bill_date amount
1 Michael S001 101 2015-01-02 125.56
2 Jim S003 103 2015-01-25 476.50
3 Dwight S012 122 2016-02-15 335.00
4 Andy S345 121 2016-03-26 787.00
5 Pam S234 132 2017-04-19 678.00
6 Karen S743 111 2017-05-31 864.00
7 Toby S234 115 2018-06-11 762.00
8 Oscar S012 125 2019-07-24 300.00
9 Darryl S456 119 2019-08-02 492.20
DROP TABLE sales;

View File

@@ -0,0 +1,5 @@
[binlogon]
log-bin
log-slave-updates
[binlogoff]

View File

@@ -130,4 +130,41 @@ SELECT @@wsrep_mode;
ALTER TABLE t2 ENGINE=InnoDB; ALTER TABLE t2 ENGINE=InnoDB;
DROP TABLE t2; DROP TABLE t2;
SET GLOBAL wsrep_mode = DEFAULT; --connection node_1
--echo #
--echo # MDEV-37373 InnoDB partition table disallow local GTIDs in galera
--echo # wsrep-mode= DISALLOW_LOCAL_GTID
--echo #
SET GLOBAL wsrep_mode = "DISALLOW_LOCAL_GTID";
SELECT @@wsrep_mode;
CREATE TABLE `sales` (
`customer_id` int(11) NOT NULL,
`customer_name` varchar(40) DEFAULT NULL,
`store_id` varchar(20) NOT NULL,
`bill_number` int(11) NOT NULL,
`bill_date` date NOT NULL,
`amount` decimal(8,2) NOT NULL,
PRIMARY KEY (`bill_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE (year(`bill_date`))
(PARTITION `p0` VALUES LESS THAN (2016) ENGINE = InnoDB,
PARTITION `p1` VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION `p2` VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION `p3` VALUES LESS THAN (2020) ENGINE = InnoDB);
INSERT INTO sales
VALUES (1, 'Michael', 'S001', 101, '2015-01-02', 125.56),
(2, 'Jim', 'S003', 103, '2015-01-25', 476.50),
(3, 'Dwight', 'S012', 122, '2016-02-15', 335.00),
(4, 'Andy', 'S345', 121, '2016-03-26', 787.00),
(5, 'Pam', 'S234', 132, '2017-04-19', 678.00),
(6, 'Karen', 'S743', 111, '2017-05-31', 864.00),
(7, 'Toby', 'S234', 115, '2018-06-11', 762.00),
(8, 'Oscar', 'S012', 125, '2019-07-24', 300.00),
(9, 'Darryl', 'S456', 119, '2019-08-02', 492.20);
SELECT * FROM sales;
SET GLOBAL wsrep_mode=DEFAULT;
--connection node_2
SELECT * FROM sales;
DROP TABLE sales;

View File

@@ -0,0 +1,70 @@
connection node_2;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 BLOB) ENGINE=InnoDB;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
connection node_3;
SET GLOBAL wsrep_on=OFF;
ALTER TABLE t1 MODIFY f2 LONGTEXT;
SET GLOBAL wsrep_on=ON;
INSERT INTO t1 VALUES (3, 'a');
connection node_1;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Primary
connection node_2;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status Primary
INSERT INTO t1 VALUES (2, 'a');
connection node_3;
SET SESSION wsrep_sync_wait=0;
SET SESSION wsrep_on=OFF;
# restart
SET SESSION wsrep_on=ON;
INSERT INTO t1 VALUES (3, 'a');
connection node_1;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) NOT NULL,
`f2` blob DEFAULT NULL,
PRIMARY KEY (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
SELECT * FROM t1;
f1 f2
2 a
3 a
connection node_2;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) NOT NULL,
`f2` blob DEFAULT NULL,
PRIMARY KEY (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
SELECT * FROM t1;
f1 f2
2 a
3 a
connection node_3;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) NOT NULL,
`f2` blob DEFAULT NULL,
PRIMARY KEY (`f1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
SELECT * FROM t1;
f1 f2
2 a
3 a
DROP TABLE t1;
connection node_1;
CALL mtr.add_suppression("Replica SQL: Column 1 of table 'test.t1' cannot be converted from type 'longblob' to type 'blob', Error_code: MY-013146");
CALL mtr.add_suppression("Event 3 Write_rows_v1 apply failed: 3, seqno");
connection node_2;
CALL mtr.add_suppression("Replica SQL: Column 1 of table 'test.t1' cannot be converted from type 'longblob' to type 'blob', Error_code: MY-013146");
CALL mtr.add_suppression("Event 3 Write_rows_v1 apply failed: 3, seqno");
connection node_3;
CALL mtr.add_suppression("Vote 0 \\(success\\) on (.*) is inconsistent with group. Leaving cluster.");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");

View File

@@ -0,0 +1,5 @@
!include ../galera_3nodes.cnf
[mysqld]
wsrep-ignore-apply-errors=0

View File

@@ -0,0 +1,67 @@
#
# MDEV-37494: Inconsistency voting: create conditions where applying would
# fail on replicas in table_def::compatible_with() and check that
# that replicas survive and the primary (trx source) bails out.
#
--source include/galera_cluster.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 BLOB) ENGINE=InnoDB;
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
--connection node_3
SET GLOBAL wsrep_on=OFF;
ALTER TABLE t1 MODIFY f2 LONGTEXT; # Introducing schema inconsistency
SET GLOBAL wsrep_on=ON;
INSERT INTO t1 VALUES (3, 'a'); # Nodes 1 and 2 should fail to apply this
--connection node_1
# Wait until node #3 leaves the cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM performance_schema.global_status WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
--connection node_2
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM performance_schema.global_status WHERE VARIABLE_NAME = 'wsrep_cluster_size'
# Wait until node #3 leaves the cluster
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
INSERT INTO t1 VALUES (2, 'a'); # Nodes 1 and 2 should successfully apply this
--connection node_3
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT VARIABLE_VALUE = 'Disconnected' FROM performance_schema.global_status WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
SET SESSION wsrep_on=OFF;
--source include/restart_mysqld.inc
--source include/wait_wsrep_ready.inc
SET SESSION wsrep_on=ON;
INSERT INTO t1 VALUES (3, 'a'); # All nodes should successfully apply this
# Check that consistency is restored
--connection node_1
SHOW CREATE TABLE t1;
SELECT * FROM t1;
--connection node_2
SHOW CREATE TABLE t1;
SELECT * FROM t1;
--connection node_3
SHOW CREATE TABLE t1;
SELECT * FROM t1;
DROP TABLE t1;
--connection node_1
CALL mtr.add_suppression("Replica SQL: Column 1 of table 'test.t1' cannot be converted from type 'longblob' to type 'blob', Error_code: MY-013146");
CALL mtr.add_suppression("Event 3 Write_rows_v1 apply failed: 3, seqno");
--connection node_2
CALL mtr.add_suppression("Replica SQL: Column 1 of table 'test.t1' cannot be converted from type 'longblob' to type 'blob', Error_code: MY-013146");
CALL mtr.add_suppression("Event 3 Write_rows_v1 apply failed: 3, seqno");
--connection node_3
CALL mtr.add_suppression("Vote 0 \\(success\\) on (.*) is inconsistent with group. Leaving cluster.");
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");

View File

@@ -0,0 +1,105 @@
CREATE TABLE t1 (
c1 INT PRIMARY KEY,
c2 VARCHAR(50),
c3 VARCHAR(50),
c4 VARCHAR(50))ENGINE=InnoDB;
INSERT INTO t1 VALUES(1, 'AAA_2', 'AAA_3', 'AAA_4'),
(2, 'BBB_2', 'BBB_3', 'BBB_4'),
(3, 'CCC_2', 'CCC_3', 'CCC_4'),
(4, 'DDD_2', 'DDD_3', 'DDD_4'),
(5, 'EEE_2', 'EEE_3', 'EEE_4');
ALTER TABLE t1 CONVERT TO CHARACTER SET 'utf8mb4',ALGORITHM=COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 ADD COLUMN c5 VARCHAR(15), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 DROP COLUMN c5, ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 ADD COLUMN c5 VARCHAR(15), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 DROP COLUMN c5, ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY (c4), ALGORITHM=COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY (c1), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 ADD COLUMN c5 VARCHAR(15), ALGORITHM = INPLACE;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
ALTER TABLE t1 DROP COLUMN c5, ALGORITHM = INPLACE;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
n_rows database_name lower(table_name)
5 test t1
CREATE TABLE t2 (
c1 INT PRIMARY KEY,
c2 VARCHAR(50),
c3 VARCHAR(50),
c4 VARCHAR(50)
) ENGINE=InnoDB PARTITION BY RANGE (c1) (
PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (11),
PARTITION p3 VALUES LESS THAN (16),
PARTITION p4 VALUES LESS THAN (21)
);
INSERT INTO t2 VALUES(1, 'AAA_2', 'AAA_3', 'AAA_4'),
(2, 'BBB_2', 'BBB_3', 'BBB_4'),
(3, 'CCC_2', 'CCC_3', 'CCC_4'),
(4, 'DDD_2', 'DDD_3', 'DDD_4'),
(5, 'EEE_2', 'EEE_3', 'EEE_4'),
(6, 'FFF_2', 'DDD_3', 'DDD_4'),
(7, 'GGG_2', 'DDD_3', 'DDD_4'),
(8, 'HHH_2', 'DDD_3', 'DDD_4'),
(9, 'III_2', 'DDD_3', 'DDD_4'),
(10, 'JJJ_2', 'DDD_3', 'DDD_4'),
(13, 'KKK_2', 'DDD_3', 'DDD_4'),
(20, 'LLL_2', 'DDD_3', 'DDD_4');
ALTER TABLE t2 CONVERT TO CHARACTER SET 'utf8mb4',ALGORITHM=COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name LIKE '%t2%';
n_rows database_name lower(table_name)
5 test t2#p#p1
5 test t2#p#p2
1 test t2#p#p3
1 test t2#p#p4
ALTER TABLE t2 ADD COLUMN c5 VARCHAR(15), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name LIKE '%t2%';
n_rows database_name lower(table_name)
5 test t2#p#p1
5 test t2#p#p2
1 test t2#p#p3
1 test t2#p#p4
ALTER TABLE t2 DROP COLUMN c5, ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name LIKE '%t2%';
n_rows database_name lower(table_name)
5 test t2#p#p1
5 test t2#p#p2
1 test t2#p#p3
1 test t2#p#p4
# Test Cleanup.
DROP TABLE t1;
DROP TABLE t2;

View File

@@ -117,8 +117,9 @@ ALTER TABLE t1 FORCE, ALGORITHM=COPY;
connection default; connection default;
SET DEBUG_SYNC='now WAIT_FOR blocked'; SET DEBUG_SYNC='now WAIT_FOR blocked';
BEGIN; BEGIN;
SELECT * FROM mysql.innodb_table_stats FOR UPDATE; SELECT database_name, table_name FROM mysql.innodb_table_stats FOR UPDATE;
database_name table_name last_update n_rows clustered_index_size sum_of_other_index_sizes database_name table_name
test t1
SET DEBUG_SYNC='now SIGNAL go'; SET DEBUG_SYNC='now SIGNAL go';
connection con1; connection con1;
connection default; connection default;

View File

@@ -6,7 +6,7 @@ SET @old_debug_dbug = @@global.debug_dbug;
XA START 'a'; XA START 'a';
INSERT INTO mysql.innodb_index_stats SELECT '','' AS table_name,index_name,LAST_UPDATE,stat_name,0 AS stat_value,sample_size,stat_description FROM mysql.innodb_index_stats WHERE table_name='dummy' FOR UPDATE; INSERT INTO mysql.innodb_index_stats SELECT '','' AS table_name,index_name,LAST_UPDATE,stat_name,0 AS stat_value,sample_size,stat_description FROM mysql.innodb_index_stats WHERE table_name='dummy' FOR UPDATE;
SET GLOBAL debug_dbug = "+d,dict_stats_save_exit_notify"; SET GLOBAL debug_dbug = "+d,dict_stats_save_exit_notify";
INSERT INTO t VALUES (1); INSERT INTO t VALUES (1), (2);
XA END 'a'; XA END 'a';
XA PREPARE 'a'; XA PREPARE 'a';
SET DEBUG_SYNC="now WAIT_FOR dict_stats_save_finished"; SET DEBUG_SYNC="now WAIT_FOR dict_stats_save_finished";

View File

@@ -0,0 +1,90 @@
--source include/have_innodb.inc
--source include/have_partition.inc
CREATE TABLE t1 (
c1 INT PRIMARY KEY,
c2 VARCHAR(50),
c3 VARCHAR(50),
c4 VARCHAR(50))ENGINE=InnoDB;
INSERT INTO t1 VALUES(1, 'AAA_2', 'AAA_3', 'AAA_4'),
(2, 'BBB_2', 'BBB_3', 'BBB_4'),
(3, 'CCC_2', 'CCC_3', 'CCC_4'),
(4, 'DDD_2', 'DDD_3', 'DDD_4'),
(5, 'EEE_2', 'EEE_3', 'EEE_4');
ALTER TABLE t1 CONVERT TO CHARACTER SET 'utf8mb4',ALGORITHM=COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 ADD COLUMN c5 VARCHAR(15), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 DROP COLUMN c5, ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 ADD COLUMN c5 VARCHAR(15), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 DROP COLUMN c5, ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY (c4), ALGORITHM=COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY (c1), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 ADD COLUMN c5 VARCHAR(15), ALGORITHM = INPLACE;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
ALTER TABLE t1 DROP COLUMN c5, ALGORITHM = INPLACE;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name IN ('t1');
CREATE TABLE t2 (
c1 INT PRIMARY KEY,
c2 VARCHAR(50),
c3 VARCHAR(50),
c4 VARCHAR(50)
) ENGINE=InnoDB PARTITION BY RANGE (c1) (
PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (11),
PARTITION p3 VALUES LESS THAN (16),
PARTITION p4 VALUES LESS THAN (21)
);
INSERT INTO t2 VALUES(1, 'AAA_2', 'AAA_3', 'AAA_4'),
(2, 'BBB_2', 'BBB_3', 'BBB_4'),
(3, 'CCC_2', 'CCC_3', 'CCC_4'),
(4, 'DDD_2', 'DDD_3', 'DDD_4'),
(5, 'EEE_2', 'EEE_3', 'EEE_4'),
(6, 'FFF_2', 'DDD_3', 'DDD_4'),
(7, 'GGG_2', 'DDD_3', 'DDD_4'),
(8, 'HHH_2', 'DDD_3', 'DDD_4'),
(9, 'III_2', 'DDD_3', 'DDD_4'),
(10, 'JJJ_2', 'DDD_3', 'DDD_4'),
(13, 'KKK_2', 'DDD_3', 'DDD_4'),
(20, 'LLL_2', 'DDD_3', 'DDD_4');
ALTER TABLE t2 CONVERT TO CHARACTER SET 'utf8mb4',ALGORITHM=COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name LIKE '%t2%';
ALTER TABLE t2 ADD COLUMN c5 VARCHAR(15), ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name LIKE '%t2%';
ALTER TABLE t2 DROP COLUMN c5, ALGORITHM = COPY;
SELECT n_rows, database_name, lower(table_name)
FROM mysql.innodb_table_stats WHERE table_name LIKE '%t2%';
--echo # Test Cleanup.
DROP TABLE t1;
DROP TABLE t2;

View File

@@ -156,7 +156,7 @@ ALTER TABLE t1 FORCE, ALGORITHM=COPY;
connection default; connection default;
SET DEBUG_SYNC='now WAIT_FOR blocked'; SET DEBUG_SYNC='now WAIT_FOR blocked';
BEGIN; BEGIN;
SELECT * FROM mysql.innodb_table_stats FOR UPDATE; SELECT database_name, table_name FROM mysql.innodb_table_stats FOR UPDATE;
SET DEBUG_SYNC='now SIGNAL go'; SET DEBUG_SYNC='now SIGNAL go';
connection con1; connection con1;

View File

@@ -20,7 +20,7 @@ SET @old_debug_dbug = @@global.debug_dbug;
XA START 'a'; XA START 'a';
INSERT INTO mysql.innodb_index_stats SELECT '','' AS table_name,index_name,LAST_UPDATE,stat_name,0 AS stat_value,sample_size,stat_description FROM mysql.innodb_index_stats WHERE table_name='dummy' FOR UPDATE; # Note the SELECT is empty INSERT INTO mysql.innodb_index_stats SELECT '','' AS table_name,index_name,LAST_UPDATE,stat_name,0 AS stat_value,sample_size,stat_description FROM mysql.innodb_index_stats WHERE table_name='dummy' FOR UPDATE; # Note the SELECT is empty
SET GLOBAL debug_dbug = "+d,dict_stats_save_exit_notify"; SET GLOBAL debug_dbug = "+d,dict_stats_save_exit_notify";
INSERT INTO t VALUES (1); INSERT INTO t VALUES (1), (2);
XA END 'a'; XA END 'a';
XA PREPARE 'a'; XA PREPARE 'a';

View File

@@ -11,6 +11,7 @@
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_perfschema.inc --source include/have_perfschema.inc
--source include/not_msan_with_debug.inc
--source ../include/start_server_common.inc --source ../include/start_server_common.inc

View File

@@ -22,7 +22,7 @@ let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
--write_line wait $restart_file --write_line wait $restart_file
--shutdown_server --shutdown_server
--source include/wait_until_disconnected.inc --source include/wait_until_disconnected.inc
--write_line "restart:--performance_schema_max_program_instances=7 --performance_schema_max_statement_stack=2 --thread_stack=655360" $restart_file --write_line "restart:--performance_schema_max_program_instances=7 --performance_schema_max_statement_stack=2 --thread_stack=1048576" $restart_file
--enable_reconnect --enable_reconnect
--source include/wait_until_connected_again.inc --source include/wait_until_connected_again.inc

View File

@@ -5,6 +5,7 @@
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_perfschema.inc --source include/have_perfschema.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/not_msan_with_debug.inc
TRUNCATE TABLE performance_schema.events_statements_summary_by_program; TRUNCATE TABLE performance_schema.events_statements_summary_by_program;
TRUNCATE TABLE performance_schema.events_statements_history_long; TRUNCATE TABLE performance_schema.events_statements_history_long;

View File

@@ -8,6 +8,7 @@
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_perfschema.inc --source include/have_perfschema.inc
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/not_msan_with_debug.inc
TRUNCATE TABLE performance_schema.events_statements_history_long; TRUNCATE TABLE performance_schema.events_statements_history_long;

View File

@@ -0,0 +1,69 @@
set global server_audit_logging=on;
USE test;
CREATE TABLE source (
id bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE dest (
id bigint(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE dest_2 (
id bigint(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TRIGGER test_trigger
AFTER INSERT ON source
FOR EACH ROW
INSERT INTO dest (id) VALUES(NEW.id)//
CREATE TRIGGER test_trigger_2
AFTER INSERT ON dest
FOR EACH ROW
INSERT INTO dest_2 (id) VALUES(NEW.id)//
CREATE PROCEDURE test_procedure (IN id bigint(20))
NOT DETERMINISTIC MODIFIES SQL DATA
BEGIN
INSERT INTO source VALUES (id), (NULL);
END;//
# Insert a row to trigger the AFTER trigger
INSERT INTO source VALUES (NULL);
# Insert another row to see the pattern
INSERT INTO source VALUES (NULL);
# Test with multi-row insert
INSERT INTO source VALUES (NULL), (NULL);
# Test with stored procedure
CALL test_procedure(NULL);
# Clean up
DROP PROCEDURE test_procedure;
DROP TABLE source, dest, dest_2;
set global server_audit_logging=off;
# Wait for audit events to be written
FOUND 1 /set global server_audit_logging=off/ in server_audit_query_id.log
TIMESTAMP,HOSTNAME,root,localhost,4,0,QUERY,test,'set global server_audit_logging=on',0
TIMESTAMP,HOSTNAME,root,localhost,4,1,QUERY,test,'USE test',0
TIMESTAMP,HOSTNAME,root,localhost,4,2,QUERY,test,'CREATE TABLE source (\nid bigint(20) NOT NULL AUTO_INCREMENT,\nPRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4',0
TIMESTAMP,HOSTNAME,root,localhost,4,3,QUERY,test,'CREATE TABLE dest (\nid bigint(20) NOT NULL,\nPRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4',0
TIMESTAMP,HOSTNAME,root,localhost,4,4,QUERY,test,'CREATE TABLE dest_2 (\nid bigint(20) NOT NULL,\nPRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4',0
TIMESTAMP,HOSTNAME,root,localhost,4,5,QUERY,test,'CREATE TRIGGER test_trigger\nAFTER INSERT ON source\nFOR EACH ROW\nINSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,6,QUERY,test,'CREATE TRIGGER test_trigger_2\nAFTER INSERT ON dest\nFOR EACH ROW\nINSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,7,QUERY,test,'CREATE PROCEDURE test_procedure (IN id bigint(20))\nNOT DETERMINISTIC MODIFIES SQL DATA\nBEGIN\nINSERT INTO source VALUES (id), (NULL);\nEND',0
TIMESTAMP,HOSTNAME,root,localhost,4,10,QUERY,test,'INSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,9,QUERY,test,'INSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,8,QUERY,test,'INSERT INTO source VALUES (NULL)',0
TIMESTAMP,HOSTNAME,root,localhost,4,13,QUERY,test,'INSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,12,QUERY,test,'INSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,11,QUERY,test,'INSERT INTO source VALUES (NULL)',0
TIMESTAMP,HOSTNAME,root,localhost,4,16,QUERY,test,'INSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,15,QUERY,test,'INSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,18,QUERY,test,'INSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,17,QUERY,test,'INSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,14,QUERY,test,'INSERT INTO source VALUES (NULL), (NULL)',0
TIMESTAMP,HOSTNAME,root,localhost,4,22,QUERY,test,'INSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,21,QUERY,test,'INSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,24,QUERY,test,'INSERT INTO dest_2 (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,23,QUERY,test,'INSERT INTO dest (id) VALUES(NEW.id)',0
TIMESTAMP,HOSTNAME,root,localhost,4,20,QUERY,test,'INSERT INTO source VALUES ( NAME_CONST(\'id\',NULL)), (NULL)',0
TIMESTAMP,HOSTNAME,root,localhost,4,19,QUERY,test,'CALL test_procedure(NULL)',0
TIMESTAMP,HOSTNAME,root,localhost,4,25,QUERY,test,'DROP PROCEDURE test_procedure',0
TIMESTAMP,HOSTNAME,root,localhost,4,26,QUERY,test,'DROP TABLE source, dest, dest_2',0
TIMESTAMP,HOSTNAME,root,localhost,4,27,QUERY,test,'set global server_audit_logging=off',0

View File

@@ -0,0 +1,25 @@
#!/usr/bin/perl
use strict;
use warnings;
my $filename = $ARGV[0] or die "Usage: $0 <logfile>\n";
# Read all lines into memory
open(my $fh, '<', $filename) or die "Cannot open file '$filename': $!";
my @lines = <$fh>;
close($fh);
# Process lines and normalize query IDs
my $first_id;
foreach my $line (@lines) {
if ($line =~ /,(\d+),QUERY/) {
$first_id = $1 unless defined $first_id;
my $normalized = $1 - $first_id;
$line =~ s/,$1,QUERY/,$normalized,QUERY/;
}
}
# Write back to the same file
open($fh, '>', $filename) or die "Cannot write to file '$filename': $!";
print $fh @lines;
close($fh);

View File

@@ -0,0 +1,5 @@
--plugin-load-add=server_audit
--server_audit_mode=0
--server_audit_file_path='server_audit_query_id.log'
--server_audit_output_type=file
--server_audit_events='QUERY'

View File

@@ -0,0 +1,89 @@
--source include/have_innodb.inc
--source include/have_plugin_auth.inc
--source include/not_embedded.inc
if (!$SERVER_AUDIT_SO) {
skip No SERVER_AUDIT plugin;
}
# An unfortunate wait for check-testcase.inc to complete disconnect.
let count_sessions= 1;
source include/wait_until_count_sessions.inc;
let $MYSQLD_DATADIR= `SELECT @@datadir`;
let SEARCH_FILE= $MYSQLD_DATADIR/server_audit_query_id.log;
--disable_ps_protocol
set global server_audit_logging=on;
USE test;
CREATE TABLE source (
id bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE dest (
id bigint(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE dest_2 (
id bigint(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELIMITER //;
CREATE TRIGGER test_trigger
AFTER INSERT ON source
FOR EACH ROW
INSERT INTO dest (id) VALUES(NEW.id)//
DELIMITER ;//
DELIMITER //;
CREATE TRIGGER test_trigger_2
AFTER INSERT ON dest
FOR EACH ROW
INSERT INTO dest_2 (id) VALUES(NEW.id)//
DELIMITER ;//
DELIMITER //;
CREATE PROCEDURE test_procedure (IN id bigint(20))
NOT DETERMINISTIC MODIFIES SQL DATA
BEGIN
INSERT INTO source VALUES (id), (NULL);
END;//
DELIMITER ;//
--echo # Insert a row to trigger the AFTER trigger
INSERT INTO source VALUES (NULL);
--echo # Insert another row to see the pattern
INSERT INTO source VALUES (NULL);
--echo # Test with multi-row insert
INSERT INTO source VALUES (NULL), (NULL);
--echo # Test with stored procedure
CALL test_procedure(NULL);
--echo # Clean up
DROP PROCEDURE test_procedure;
DROP TABLE source, dest, dest_2;
set global server_audit_logging=off;
--echo # Wait for audit events to be written
--let SEARCH_FILE = $MYSQLD_DATADIR/server_audit_query_id.log
--let SEARCH_PATTERN = set global server_audit_logging=off
--source include/search_pattern_in_file.inc
# Read and normalize the log
--exec perl $MYSQL_TEST_DIR/suite/plugins/t/normalize_query_id.pl $SEARCH_FILE
# Output the log without heavy replacements so we can see the actual order
--replace_regex /\d\d\d\d\d\d\d\d \d\d:\d\d:\d\d/TIMESTAMP/ /,[^,]+,root,localhost,/,HOSTNAME,root,localhost,/
cat_file $SEARCH_FILE;
remove_file $SEARCH_FILE;

View File

@@ -313,4 +313,37 @@ insert v1 values (default);
ERROR HY000: The target table v1 of the INSERT is not insertable-into ERROR HY000: The target table v1 of the INSERT is not insertable-into
drop view v1; drop view v1;
drop table t1; drop table t1;
#
# MDEV-37172 Server crashes in Item_func_nextval::update_table after
# INSERT to the table, that uses expression with nextval() as default
#
create sequence s1;
create sequence s2;
create table t1 (id int default(nextval(s1)));
create table t2 (id int default(nextval(s1)+nextval(s1)));
create table t3 (id1 int default(nextval(s1)+nextval(s1)),
id2 int default(nextval(s2)));
insert t1 values ();
select lastval(s1);
lastval(s1)
1
select * from t1;
id
1
insert t2 values ();
select lastval(s1);
lastval(s1)
3
select * from t2;
id
5
insert t3 values ();
select lastval(s1), lastval(s2);
lastval(s1) lastval(s2)
5 1
select * from t3;
id1 id2
9 1
drop table t1,t2,t3;
drop sequence s1,s2;
# End of 10.6 tests # End of 10.6 tests

View File

@@ -240,4 +240,27 @@ insert v1 values (default);
drop view v1; drop view v1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-37172 Server crashes in Item_func_nextval::update_table after
--echo # INSERT to the table, that uses expression with nextval() as default
--echo #
create sequence s1;
create sequence s2;
create table t1 (id int default(nextval(s1)));
create table t2 (id int default(nextval(s1)+nextval(s1)));
create table t3 (id1 int default(nextval(s1)+nextval(s1)),
id2 int default(nextval(s2)));
insert t1 values ();
select lastval(s1);
select * from t1;
insert t2 values ();
select lastval(s1);
select * from t2;
insert t3 values ();
select lastval(s1), lastval(s2);
select * from t3;
drop table t1,t2,t3;
drop sequence s1,s2;
--echo # End of 10.6 tests --echo # End of 10.6 tests

View File

@@ -69,6 +69,8 @@ void* my_once_alloc(size_t Size, myf MyFlags)
(int64) get_size, (int64) get_size,
MY_MEMORY_ORDER_RELAXED); MY_MEMORY_ORDER_RELAXED);
DBUG_PRINT("test",("my_once_malloc %lu byte malloced", (ulong) get_size)); DBUG_PRINT("test",("my_once_malloc %lu byte malloced", (ulong) get_size));
my_once_allocated+= get_size;
update_malloc_size(get_size, 0);
next->next= 0; next->next= 0;
next->size= get_size; next->size= get_size;
next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM)); next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
@@ -119,7 +121,9 @@ void my_once_free(void)
old=next; next= next->next ; old=next; next= next->next ;
free((uchar*) old); free((uchar*) old);
} }
update_malloc_size(- (longlong) my_once_allocated, 0);
my_once_root_block=0; my_once_root_block=0;
my_once_allocated= 0;
my_malloc_init_memory_allocated= 0; my_malloc_init_memory_allocated= 0;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;

View File

@@ -92,6 +92,7 @@ const char *soundex_map= "01230120022455012623010202";
/* from my_malloc */ /* from my_malloc */
USED_MEM* my_once_root_block=0; /* pointer to first block */ USED_MEM* my_once_root_block=0; /* pointer to first block */
uint my_once_extra=ONCE_ALLOC_INIT; /* Memory to alloc / block */ uint my_once_extra=ONCE_ALLOC_INIT; /* Memory to alloc / block */
size_t my_once_allocated= 0;
/* from errors.c */ /* from errors.c */

View File

@@ -40,6 +40,7 @@ extern const char *soundex_map;
extern USED_MEM* my_once_root_block; extern USED_MEM* my_once_root_block;
extern uint my_once_extra; extern uint my_once_extra;
extern size_t my_once_allocated;
extern struct st_my_file_info my_file_info_default[MY_NFILE]; extern struct st_my_file_info my_file_info_default[MY_NFILE];

View File

@@ -2013,6 +2013,16 @@ static int log_statement(const struct connection_info *cn,
const struct mysql_event_general *event, const struct mysql_event_general *event,
const char *type) const char *type)
{ {
DBUG_PRINT("info", ("log_statement: event_subclass=%d, general_command=%.*s, "
"cn->query_id=%lld, cn->query=%.*s, event->query_id=%lld, "
"event->general_query=%.*s, type=%s",
event->event_subclass, event->general_command_length,
event->general_command,
cn->query_id,
cn->query_length == 0x4f4f4f4f ? 0 : cn->query_length,
cn->query == (const char *)0x4f4f4f4f4f4f4f4fL ? NULL : cn->query,
event->query_id, event->general_query_length,
event->general_query, type));
return log_statement_ex(cn, event->general_time, event->general_thread_id, return log_statement_ex(cn, event->general_time, event->general_thread_id,
event->general_query, event->general_query_length, event->general_query, event->general_query_length,
event->general_error_code, type, 1); event->general_error_code, type, 1);
@@ -2113,6 +2123,16 @@ static void update_connection_info(MYSQL_THD thd, struct connection_info *cn,
{ {
const struct mysql_event_general *event = const struct mysql_event_general *event =
(const struct mysql_event_general *) ev; (const struct mysql_event_general *) ev;
DBUG_PRINT("info", ("update_connection_info: before: event_subclass=%d, "
"general_command=%.*s, cn->query_id=%lld, cn->query=%.*s, "
"event->query_id=%lld, event->general_query=%.*s",
event->event_subclass, event->general_command_length,
event->general_command,
cn->query_id,
cn->query_length == 0x4f4f4f4f ? 0 : cn->query_length,
cn->query == (const char *)0x4f4f4f4f4f4f4f4fL ? NULL : cn->query,
event->query_id, event->general_query_length,
event->general_query));
switch (event->event_subclass) { switch (event->event_subclass) {
case MYSQL_AUDIT_GENERAL_LOG: case MYSQL_AUDIT_GENERAL_LOG:
{ {
@@ -2142,8 +2162,8 @@ static void update_connection_info(MYSQL_THD thd, struct connection_info *cn,
setup_connection_query(cn, event); setup_connection_query(cn, event);
else else
setup_connection_simple(cn); setup_connection_simple(cn);
break;
} }
break;
case MYSQL_AUDIT_GENERAL_STATUS: case MYSQL_AUDIT_GENERAL_STATUS:
if (event_query_command(event)) if (event_query_command(event))
@@ -2151,10 +2171,14 @@ static void update_connection_info(MYSQL_THD thd, struct connection_info *cn,
if (ci_needs_setup(cn)) if (ci_needs_setup(cn))
setup_connection_query(cn, event); setup_connection_query(cn, event);
if (mode == 0 && cn->db_length == 0 && event->database.length > 0) if (mode == 0)
{
if (cn->db_length == 0 && event->database.length > 0)
get_str_n(cn->db, &cn->db_length, sizeof(cn->db), get_str_n(cn->db, &cn->db_length, sizeof(cn->db),
event->database.str, event->database.length); event->database.str, event->database.length);
cn->query_id= event->query_id;
}
if (event->general_error_code == 0) if (event->general_error_code == 0)
{ {
/* We need to check if it's the USE command to change the DB */ /* We need to check if it's the USE command to change the DB */
@@ -2174,6 +2198,7 @@ static void update_connection_info(MYSQL_THD thd, struct connection_info *cn,
update_general_user(cn, event); update_general_user(cn, event);
} }
break; break;
case MYSQL_AUDIT_GENERAL_ERROR: case MYSQL_AUDIT_GENERAL_ERROR:
/* /*
We need this because the MariaDB returns NULL query field for the We need this because the MariaDB returns NULL query field for the
@@ -2190,6 +2215,16 @@ static void update_connection_info(MYSQL_THD thd, struct connection_info *cn,
break; break;
default:; default:;
} }
DBUG_PRINT("info", ("update_connection_info: after: event_subclass=%d, "
"general_command=%.*s, cn->query_id=%lld, cn->query=%.*s, "
"event->query_id=%lld, event->general_query=%.*s",
event->event_subclass, event->general_command_length,
event->general_command,
cn->query_id,
cn->query_length == 0x4f4f4f4f ? 0 : cn->query_length,
cn->query == (const char *)0x4f4f4f4f4f4f4f4fL ? NULL : cn->query,
event->query_id, event->general_query_length,
event->general_query));
break; break;
} }
case MYSQL_AUDIT_TABLE_CLASS: case MYSQL_AUDIT_TABLE_CLASS:
@@ -2307,6 +2342,7 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev)
{ {
log_statement(cn, event, "QUERY"); log_statement(cn, event, "QUERY");
cn->query_length= 0; /* So the log_current_query() won't log this again. */ cn->query_length= 0; /* So the log_current_query() won't log this again. */
cn->query_id= 0;
cn->log_always= 0; cn->log_always= 0;
} }
} }

View File

@@ -1094,7 +1094,8 @@ enum enum_schema_tables
SCH_TRIGGERS, SCH_TRIGGERS,
SCH_USER_PRIVILEGES, SCH_USER_PRIVILEGES,
SCH_VIEWS, SCH_VIEWS,
SCH_ENUM_SIZE SCH_N_SERVER_TABLES, /* How many SCHEMA tables in the server. */
SCH_PLUGIN_TABLE /* Schema table defined in plugin. */
}; };
struct TABLE_SHARE; struct TABLE_SHARE;

View File

@@ -114,12 +114,14 @@ bool st_append_json(String *s,
return false; return false;
} }
if ((str_len= json_unescape(json_cs, js, js + js_len, str_len= json_unescape(json_cs, js, js + js_len, s->charset(),
s->charset(), (uchar *) s->end(), (uchar *) s->end() + str_len)) > 0) (uchar *) s->end(), (uchar *) s->end() + str_len);
{ if (str_len > 0)
s->length(s->length() + str_len); s->length(s->length() + str_len);
if (str_len >= 0)
return false; return false;
}
if (current_thd) if (current_thd)
{ {
if (str_len == JSON_ERROR_OUT_OF_SPACE) if (str_len == JSON_ERROR_OUT_OF_SPACE)

View File

@@ -1434,6 +1434,9 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
DBUG_ASSERT(thd->Item_change_list::is_empty()); DBUG_ASSERT(thd->Item_change_list::is_empty());
old_change_list.move_elements_to(thd); old_change_list.move_elements_to(thd);
thd->lex= old_lex; thd->lex= old_lex;
DBUG_PRINT("info", ("sp_head::execute: query_id restore: old_query_id=%lld, query_id=%lld, query=%.*s",
old_query_id,
thd->query_id, thd->query_length(), thd->query()));
thd->set_query_id(old_query_id); thd->set_query_id(old_query_id);
thd->set_query_inner(old_query); thd->set_query_inner(old_query);
DBUG_ASSERT(!thd->derived_tables); DBUG_ASSERT(!thd->derived_tables);

View File

@@ -175,6 +175,8 @@ void mysql_audit_general(THD *thd, uint event_subtype,
event.general_rows= thd->get_stmt_da()->current_row_for_warning(); event.general_rows= thd->get_stmt_da()->current_row_for_warning();
event.database= thd->db; event.database= thd->db;
event.query_id= thd->query_id; event.query_id= thd->query_id;
DBUG_PRINT("info", ("mysql_audit_general: query_id=%lld, query=%.*s, subtype=%d, error_code=%d, msg=%s",
thd->query_id, thd->query_length(), thd->query(), event_subtype, error_code, msg));
} }
else else
{ {

View File

@@ -5031,11 +5031,12 @@ bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_CSTRING *db,
static TABLE_LIST *internal_table_exists(TABLE_LIST *global_list, static TABLE_LIST *internal_table_exists(TABLE_LIST *global_list,
const char *table_name) TABLE_LIST *table)
{ {
do do
{ {
if (global_list->table_name.str == table_name) if (global_list->table_name.str == table->table_name.str &&
global_list->db.str == table->db.str)
return global_list; return global_list;
} while ((global_list= global_list->next_global)); } while ((global_list= global_list->next_global));
return 0; return 0;
@@ -5056,8 +5057,7 @@ add_internal_tables(THD *thd, Query_tables_list *prelocking_ctx,
/* /*
Skip table if already in the list. Can happen with prepared statements Skip table if already in the list. Can happen with prepared statements
*/ */
if ((tmp= internal_table_exists(global_table_list, if ((tmp= internal_table_exists(global_table_list, tables)))
tables->table_name.str)))
{ {
/* /*
Use the original value for the next local, used by the Use the original value for the next local, used by the

View File

@@ -172,7 +172,14 @@
Feel free to raise this by the smallest amount you can to get the Feel free to raise this by the smallest amount you can to get the
"execution_constants" test to pass. "execution_constants" test to pass.
*/ */
#ifndef __has_feature
#define __has_feature(x) 0
#endif
#if defined(__clang__) && __has_feature(memory_sanitizer) && !defined(DBUG_OFF)
#define STACK_MIN_SIZE 44000
#else
#define STACK_MIN_SIZE 16000 // Abort if less stack during eval. #define STACK_MIN_SIZE 16000 // Abort if less stack during eval.
#endif
#define STACK_MIN_SIZE_FOR_OPEN (1024*80) #define STACK_MIN_SIZE_FOR_OPEN (1024*80)
#define STACK_BUFF_ALLOC 352 ///< For stack overrun checks #define STACK_BUFF_ALLOC 352 ///< For stack overrun checks

View File

@@ -128,6 +128,7 @@ bool Update_plan::save_explain_data_intern(THD *thd,
(thd->variables.log_slow_verbosity & (thd->variables.log_slow_verbosity &
LOG_SLOW_VERBOSITY_ENGINE)) LOG_SLOW_VERBOSITY_ENGINE))
{ {
explain->table_tracker.set_gap_tracker(&explain->extra_time_tracker);
table->file->set_time_tracker(&explain->table_tracker); table->file->set_time_tracker(&explain->table_tracker);
if (table->file->handler_stats && table->s->tmp_table != INTERNAL_TMP_TABLE) if (table->file->handler_stats && table->s->tmp_table != INTERNAL_TMP_TABLE)

View File

@@ -2838,8 +2838,8 @@ void Explain_update::print_explain_json(Explain_query *query,
if (table_tracker.has_timed_statistics()) if (table_tracker.has_timed_statistics())
{ {
writer->add_member("r_total_time_ms"). writer->add_member("r_table_time_ms").add_double(table_tracker.get_time_ms());
add_double(table_tracker.get_time_ms()); writer->add_member("r_other_time_ms").add_double(extra_time_tracker.get_time_ms());
} }
} }

View File

@@ -1025,6 +1025,7 @@ public:
/* TODO: This tracks time to read rows from the table */ /* TODO: This tracks time to read rows from the table */
Exec_time_tracker table_tracker; Exec_time_tracker table_tracker;
Gap_time_tracker extra_time_tracker;
/* The same as Explain_table_access::handler_for_stats */ /* The same as Explain_table_access::handler_for_stats */
handler *handler_for_stats; handler *handler_for_stats;

View File

@@ -702,8 +702,7 @@ int prepare_for_replace(TABLE *table, enum_duplicates handle_duplicates,
{ {
create_lookup_handler= true; create_lookup_handler= true;
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
if (table->file->ha_table_flags() & HA_DUPLICATE_POS || if (table->file->ha_table_flags() & HA_DUPLICATE_POS)
table->s->long_unique_table)
{ {
if (table->file->ha_rnd_init_with_error(false)) if (table->file->ha_rnd_init_with_error(false))
return 1; return 1;
@@ -2015,17 +2014,26 @@ int vers_insert_history_row(TABLE *table)
*/ */
int Write_record::locate_dup_record() int Write_record::locate_dup_record()
{ {
handler *h= table->file;
int error= 0; int error= 0;
if (h->ha_table_flags() & HA_DUPLICATE_POS || h->lookup_errkey != (uint)-1) if (table->file->ha_table_flags() & HA_DUPLICATE_POS ||
table->file->lookup_errkey != (uint)-1)
{ {
DBUG_PRINT("info", ("Locating offending record using rnd_pos()")); DBUG_PRINT("info", ("Locating offending record using rnd_pos()"));
error= h->ha_rnd_pos(table->record[1], h->dup_ref); const bool init_lookup_handler= (table->file->inited == handler::NONE);
if (init_lookup_handler)
{
error= table->file->ha_rnd_init_with_error(false);
if (error)
return error;
}
error= table->file->ha_rnd_pos(table->record[1], table->file->dup_ref);
if (init_lookup_handler)
table->file->ha_rnd_end();
if (unlikely(error)) if (unlikely(error))
{ {
DBUG_PRINT("info", ("rnd_pos() returns error %d",error)); DBUG_PRINT("info", ("rnd_pos() returns error %d",error));
h->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
} }
} }
else else
@@ -2033,10 +2041,7 @@ int Write_record::locate_dup_record()
DBUG_PRINT("info", DBUG_PRINT("info",
("Locating offending record using ha_index_read_idx_map")); ("Locating offending record using ha_index_read_idx_map"));
if (h->lookup_handler) error= table->file->extra(HA_EXTRA_FLUSH_CACHE);
h= h->lookup_handler;
error= h->extra(HA_EXTRA_FLUSH_CACHE);
if (unlikely(error)) if (unlikely(error))
{ {
DBUG_PRINT("info",("Error when setting HA_EXTRA_FLUSH_CACHE")); DBUG_PRINT("info",("Error when setting HA_EXTRA_FLUSH_CACHE"));
@@ -2055,12 +2060,12 @@ int Write_record::locate_dup_record()
key_copy(key, table->record[0], table->key_info + key_nr, 0); key_copy(key, table->record[0], table->key_info + key_nr, 0);
error= h->ha_index_read_idx_map(table->record[1], key_nr, key, error= table->file->ha_index_read_idx_map(table->record[1], key_nr, key,
HA_WHOLE_KEY, HA_READ_KEY_EXACT); HA_WHOLE_KEY, HA_READ_KEY_EXACT);
if (unlikely(error)) if (unlikely(error))
{ {
DBUG_PRINT("info", ("index_read_idx() returns %d", error)); DBUG_PRINT("info", ("index_read_idx() returns %d", error));
h->print_error(error, MYF(0)); table->file->print_error(error, MYF(0));
} }
} }

View File

@@ -34,16 +34,11 @@ bool mysql_insert(THD *thd,TABLE_LIST *table,List<Item> &fields,
List<List_item> &values, List<Item> &update_fields, List<List_item> &values, List<Item> &update_fields,
List<Item> &update_values, enum_duplicates flag, List<Item> &update_values, enum_duplicates flag,
bool ignore, select_result* result); bool ignore, select_result* result);
void upgrade_lock_type_for_insert(THD *thd, thr_lock_type *lock_type,
enum_duplicates duplic,
bool is_multi_insert);
int check_that_all_fields_are_given_values(THD *thd, TABLE *entry, int check_that_all_fields_are_given_values(THD *thd, TABLE *entry,
TABLE_LIST *table_list); TABLE_LIST *table_list);
int vers_insert_history_row(TABLE *table); int vers_insert_history_row(TABLE *table);
int check_duplic_insert_without_overlaps(THD *thd, TABLE *table, int check_duplic_insert_without_overlaps(THD *thd, TABLE *table,
enum_duplicates duplic); enum_duplicates duplic);
int write_record(THD *thd, TABLE *table, COPY_INFO *info,
select_result *returning= NULL);
void kill_delayed_threads(void); void kill_delayed_threads(void);
bool binlog_create_table(THD *thd, TABLE *table, bool replace); bool binlog_create_table(THD *thd, TABLE *table, bool replace);
bool binlog_drop_table(THD *thd, TABLE *table); bool binlog_drop_table(THD *thd, TABLE *table);

View File

@@ -1875,7 +1875,7 @@ dispatch_command_return dispatch_command(enum enum_server_command command, THD *
(char *) thd->security_ctx->host_or_ip); (char *) thd->security_ctx->host_or_ip);
char *packet_end= thd->query() + thd->query_length(); char *packet_end= thd->query() + thd->query_length();
general_log_write(thd, command, thd->query(), thd->query_length()); general_log_write(thd, command, thd->query(), thd->query_length());
DBUG_PRINT("query",("%-.4096s",thd->query())); DBUG_PRINT("query",("query_id=%lld, %.*s", thd->query_id, thd->query_length(), thd->query()));
#if defined(ENABLED_PROFILING) #if defined(ENABLED_PROFILING)
thd->profiling.set_query_source(thd->query(), thd->query_length()); thd->profiling.set_query_source(thd->query(), thd->query_length());
#endif #endif
@@ -8153,8 +8153,8 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
} }
} }
} }
/* Store the table reference preceding the current one. */ /* Store the table reference preceding the current in previous_table_ref */
TABLE_LIST *UNINIT_VAR(previous_table_ref); /* The table preceding the current one. */ TABLE_LIST *UNINIT_VAR(previous_table_ref);
if (table_list.elements > 0 && likely(!ptr->sequence)) if (table_list.elements > 0 && likely(!ptr->sequence))
{ {
/* /*

View File

@@ -96,7 +96,7 @@ When one supplies long data for a placeholder:
#include "sql_cache.h" // query_cache_* #include "sql_cache.h" // query_cache_*
#include "sql_view.h" // create_view_precheck #include "sql_view.h" // create_view_precheck
#include "sql_select.h" // for JOIN #include "sql_select.h" // for JOIN
#include "sql_insert.h" // upgrade_lock_type_for_insert, mysql_prepare_insert #include "sql_insert.h" // mysql_prepare_insert
#include "sql_db.h" // mysql_opt_change_db, mysql_change_db #include "sql_db.h" // mysql_opt_change_db, mysql_change_db
#include "sql_derived.h" // mysql_derived_prepare, #include "sql_derived.h" // mysql_derived_prepare,
// mysql_handle_derived // mysql_handle_derived
@@ -1322,8 +1322,6 @@ static bool mysql_test_insert_common(Prepared_statement *stmt,
if (insert_precheck(thd, table_list)) if (insert_precheck(thd, table_list))
goto error; goto error;
//upgrade_lock_type_for_insert(thd, &table_list->lock_type, duplic,
// values_list.elements > 1);
/* /*
open temporary memory pool for temporary data allocated by derived open temporary memory pool for temporary data allocated by derived
tables & preparation procedure tables & preparation procedure

View File

@@ -4397,6 +4397,12 @@ bool get_lookup_field_values(THD *thd, COND *cond, bool fix_table_name_case,
enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table) enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table)
{ {
if (schema_table < schema_tables ||
schema_table > &schema_tables[SCH_N_SERVER_TABLES])
{
return SCH_PLUGIN_TABLE;
}
return (enum enum_schema_tables) (schema_table - &schema_tables[0]); return (enum enum_schema_tables) (schema_table - &schema_tables[0]);
} }
@@ -10524,7 +10530,7 @@ ST_SCHEMA_TABLE schema_tables[]=
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}; };
static_assert(array_elements(schema_tables) == SCH_ENUM_SIZE + 1, static_assert(array_elements(schema_tables) == SCH_N_SERVER_TABLES + 1,
"Update enum_schema_tables as well."); "Update enum_schema_tables as well.");
int initialize_schema_table(void *plugin_) int initialize_schema_table(void *plugin_)

View File

@@ -4026,6 +4026,7 @@ unpack_vcol_info_from_frm(THD *thd, TABLE *table,
LEX *old_lex= thd->lex; LEX *old_lex= thd->lex;
LEX lex; LEX lex;
bool error; bool error;
TABLE_LIST *sequence, *last;
DBUG_ENTER("unpack_vcol_info_from_frm"); DBUG_ENTER("unpack_vcol_info_from_frm");
DBUG_ASSERT(vcol->expr == NULL); DBUG_ASSERT(vcol->expr == NULL);
@@ -4043,11 +4044,12 @@ unpack_vcol_info_from_frm(THD *thd, TABLE *table,
if (unlikely(error)) if (unlikely(error))
goto end; goto end;
if (lex.current_select->table_list.first[0].next_global) if ((sequence= lex.current_select->table_list.first[0].next_global))
{ {
/* We are using NEXT VALUE FOR sequence. Remember table name for open */ /* We are using NEXT VALUE FOR sequence. Remember table for open */
TABLE_LIST *sequence= lex.current_select->table_list.first[0].next_global; for (last= sequence ; last->next_global ; last= last->next_global)
sequence->next_global= table->internal_tables; ;
last->next_global= table->internal_tables;
table->internal_tables= sequence; table->internal_tables= sequence;
} }

View File

@@ -83,7 +83,33 @@ wsrep_get_apply_format(THD* thd)
return thd->wsrep_rgi->rli->relay_log.description_event_for_exec; return thd->wsrep_rgi->rli->relay_log.description_event_for_exec;
} }
void wsrep_store_error(const THD* const thd, /* store error from rli */
static void wsrep_store_error_rli(const THD* const thd,
wsrep::mutable_buffer& dst,
bool const include_msg)
{
Slave_reporting_capability* const rli= thd->wsrep_rgi->rli;
if (rli && rli->last_error().number != 0)
{
auto error= rli->last_error();
std::ostringstream os;
if (include_msg)
{
os << error.message << ",";
}
os << " Error_code: " << error.number << ';';
std::string const err_str= os.str();
dst.resize(err_str.length() + 1);
sprintf(dst.data(), "%s", err_str.c_str());
WSREP_DEBUG("Error buffer (RLI) for thd %u seqno %lld, %zu bytes: '%s'",
thd->thread_id, (long long)wsrep_thd_trx_seqno(thd),
dst.size(), dst.size() ? dst.data() : "(null)");
}
}
/* store error from diagnostic area */
static void wsrep_store_error_da(const THD* const thd,
wsrep::mutable_buffer& dst, wsrep::mutable_buffer& dst,
bool const include_msg) bool const include_msg)
{ {
@@ -123,11 +149,35 @@ void wsrep_store_error(const THD* const thd,
dst.resize(slider - dst.data()); dst.resize(slider - dst.data());
WSREP_DEBUG("Error buffer for thd %llu seqno %lld, %zu bytes: '%s'", WSREP_DEBUG("Error buffer (DA) for thd %llu seqno %lld, %zu bytes: '%s'",
thd->thread_id, (long long)wsrep_thd_trx_seqno(thd), thd->thread_id, (long long)wsrep_thd_trx_seqno(thd),
dst.size(), dst.size() ? dst.data() : "(null)"); dst.size(), dst.size() ? dst.data() : "(null)");
} }
/* store error info after applying error */
void wsrep_store_error(const THD* const thd,
wsrep::mutable_buffer& dst,
bool const include_msg)
{
dst.clear();
wsrep_store_error_da(thd, dst, include_msg);
if (dst.size() == 0)
{
wsrep_store_error_rli(thd, dst, include_msg);
}
if (dst.size() == 0)
{
WSREP_WARN("Failed to get apply error description from either "
"Relay_log_info or Diagnostics_area, will use random data.");
DBUG_ASSERT(0);
uintptr_t const n1= reinterpret_cast<uintptr_t>(&dst);
uintptr_t const n2= reinterpret_cast<uintptr_t>(thd);
uintptr_t const data= n1 ^ (n2 < 1);
const char* const data_ptr= reinterpret_cast<const char*>(&data);
dst.push_back(data_ptr, data_ptr + sizeof(data));
}
}
int wsrep_apply_events(THD* thd, int wsrep_apply_events(THD* thd,
Relay_log_info* rli, Relay_log_info* rli,
const void* events_buf, const void* events_buf,

View File

@@ -1448,10 +1448,16 @@ bool wsrep_check_mode_after_open_table (THD *thd,
if (!is_dml_stmt) if (!is_dml_stmt)
return true; return true;
const legacy_db_type db_type= hton->db_type; TABLE *tbl= tables->table;
/* If this is partitioned table we need to find out
implementing storage engine handlerton.
*/
const handlerton *ht= tbl->file->partition_ht();
if (!ht) ht= hton;
const legacy_db_type db_type= ht->db_type;
bool replicate= ((db_type == DB_TYPE_MYISAM && wsrep_check_mode(WSREP_MODE_REPLICATE_MYISAM)) || bool replicate= ((db_type == DB_TYPE_MYISAM && wsrep_check_mode(WSREP_MODE_REPLICATE_MYISAM)) ||
(db_type == DB_TYPE_ARIA && wsrep_check_mode(WSREP_MODE_REPLICATE_ARIA))); (db_type == DB_TYPE_ARIA && wsrep_check_mode(WSREP_MODE_REPLICATE_ARIA)));
TABLE *tbl= tables->table;
if (replicate) if (replicate)
{ {

View File

@@ -379,7 +379,15 @@ dict_table_schema_check(
return DB_STATS_DO_NOT_EXIST; return DB_STATS_DO_NOT_EXIST;
} }
if (!table->is_readable() || !table->space) { if (!table->is_readable()) {
/* table is not readable */
snprintf(errstr, errstr_sz,
"Table %s is not readable.",
req_schema->table_name_sql);
return DB_ERROR;
}
if (!table->space) {
/* missing tablespace */ /* missing tablespace */
snprintf(errstr, errstr_sz, snprintf(errstr, errstr_sz,
"Tablespace for table %s is missing.", "Tablespace for table %s is missing.",
@@ -3662,8 +3670,9 @@ dberr_t dict_stats_rename_table(const char *old_name, const char *new_name,
dict_fs2utf8(old_name, old_db, sizeof old_db, old_table, sizeof old_table); dict_fs2utf8(old_name, old_db, sizeof old_db, old_table, sizeof old_table);
dict_fs2utf8(new_name, new_db, sizeof new_db, new_table, sizeof new_table); dict_fs2utf8(new_name, new_db, sizeof new_db, new_table, sizeof new_table);
if (dict_table_t::is_temporary_name(old_name) || /* Delete the stats only if renaming the table from old table to
dict_table_t::is_temporary_name(new_name)) intermediate table during COPY algorithm */
if (dict_table_t::is_temporary_name(new_name))
{ {
if (dberr_t e= dict_stats_delete_from_table_stats(old_db, old_table, trx)) if (dberr_t e= dict_stats_delete_from_table_stats(old_db, old_table, trx))
return e; return e;

View File

@@ -2108,6 +2108,9 @@ Adjust thread count for key rotation
@param[in] enw_cnt Number of threads to be used */ @param[in] enw_cnt Number of threads to be used */
void fil_crypt_set_thread_cnt(const uint new_cnt) void fil_crypt_set_thread_cnt(const uint new_cnt)
{ {
if (srv_read_only_mode)
return;
if (!fil_crypt_threads_inited) { if (!fil_crypt_threads_inited) {
if (srv_shutdown_state != SRV_SHUTDOWN_NONE) if (srv_shutdown_state != SRV_SHUTDOWN_NONE)
return; return;
@@ -2261,6 +2264,8 @@ void fil_crypt_set_encrypt_tables(ulong val)
Init threads for key rotation */ Init threads for key rotation */
void fil_crypt_threads_init() void fil_crypt_threads_init()
{ {
ut_ad(!srv_read_only_mode);
if (!fil_crypt_threads_inited) { if (!fil_crypt_threads_inited) {
pthread_cond_init(&fil_crypt_cond, nullptr); pthread_cond_init(&fil_crypt_cond, nullptr);
pthread_cond_init(&fil_crypt_threads_cond, nullptr); pthread_cond_init(&fil_crypt_threads_cond, nullptr);

View File

@@ -15827,16 +15827,17 @@ ha_innobase::extra(
/* Warning: since it is not sure that MariaDB calls external_lock() /* Warning: since it is not sure that MariaDB calls external_lock()
before calling this function, m_prebuilt->trx can be obsolete! */ before calling this function, m_prebuilt->trx can be obsolete! */
trx_t* trx; trx_t* trx;
THD* thd = ha_thd();
switch (operation) { switch (operation) {
case HA_EXTRA_FLUSH: case HA_EXTRA_FLUSH:
(void)check_trx_exists(ha_thd()); (void)check_trx_exists(thd);
if (m_prebuilt->blob_heap) { if (m_prebuilt->blob_heap) {
row_mysql_prebuilt_free_blob_heap(m_prebuilt); row_mysql_prebuilt_free_blob_heap(m_prebuilt);
} }
break; break;
case HA_EXTRA_RESET_STATE: case HA_EXTRA_RESET_STATE:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
reset_template(); reset_template();
trx->duplicates = 0; trx->duplicates = 0;
stmt_boundary: stmt_boundary:
@@ -15845,23 +15846,23 @@ ha_innobase::extra(
trx->bulk_insert &= TRX_DDL_BULK; trx->bulk_insert &= TRX_DDL_BULK;
break; break;
case HA_EXTRA_NO_KEYREAD: case HA_EXTRA_NO_KEYREAD:
(void)check_trx_exists(ha_thd()); (void)check_trx_exists(thd);
m_prebuilt->read_just_key = 0; m_prebuilt->read_just_key = 0;
break; break;
case HA_EXTRA_KEYREAD: case HA_EXTRA_KEYREAD:
(void)check_trx_exists(ha_thd()); (void)check_trx_exists(thd);
m_prebuilt->read_just_key = 1; m_prebuilt->read_just_key = 1;
break; break;
case HA_EXTRA_KEYREAD_PRESERVE_FIELDS: case HA_EXTRA_KEYREAD_PRESERVE_FIELDS:
(void)check_trx_exists(ha_thd()); (void)check_trx_exists(thd);
m_prebuilt->keep_other_fields_on_keyread = 1; m_prebuilt->keep_other_fields_on_keyread = 1;
break; break;
case HA_EXTRA_INSERT_WITH_UPDATE: case HA_EXTRA_INSERT_WITH_UPDATE:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
trx->duplicates |= TRX_DUP_IGNORE; trx->duplicates |= TRX_DUP_IGNORE;
goto stmt_boundary; goto stmt_boundary;
case HA_EXTRA_NO_IGNORE_DUP_KEY: case HA_EXTRA_NO_IGNORE_DUP_KEY:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
trx->duplicates &= ~TRX_DUP_IGNORE; trx->duplicates &= ~TRX_DUP_IGNORE;
if (trx->is_bulk_insert()) { if (trx->is_bulk_insert()) {
/* Allow a subsequent INSERT into an empty table /* Allow a subsequent INSERT into an empty table
@@ -15874,11 +15875,11 @@ ha_innobase::extra(
} }
goto stmt_boundary; goto stmt_boundary;
case HA_EXTRA_WRITE_CAN_REPLACE: case HA_EXTRA_WRITE_CAN_REPLACE:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
trx->duplicates |= TRX_DUP_REPLACE; trx->duplicates |= TRX_DUP_REPLACE;
goto stmt_boundary; goto stmt_boundary;
case HA_EXTRA_WRITE_CANNOT_REPLACE: case HA_EXTRA_WRITE_CANNOT_REPLACE:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
trx->duplicates &= ~TRX_DUP_REPLACE; trx->duplicates &= ~TRX_DUP_REPLACE;
if (trx->is_bulk_insert()) { if (trx->is_bulk_insert()) {
/* Allow a subsequent INSERT into an empty table /* Allow a subsequent INSERT into an empty table
@@ -15887,7 +15888,7 @@ ha_innobase::extra(
} }
goto stmt_boundary; goto stmt_boundary;
case HA_EXTRA_BEGIN_ALTER_COPY: case HA_EXTRA_BEGIN_ALTER_COPY:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
m_prebuilt->table->skip_alter_undo = 1; m_prebuilt->table->skip_alter_undo = 1;
if (m_prebuilt->table->is_temporary() if (m_prebuilt->table->is_temporary()
|| !m_prebuilt->table->versioned_by_id()) { || !m_prebuilt->table->versioned_by_id()) {
@@ -15900,7 +15901,7 @@ ha_innobase::extra(
.first->second.set_versioned(0); .first->second.set_versioned(0);
break; break;
case HA_EXTRA_END_ALTER_COPY: case HA_EXTRA_END_ALTER_COPY:
trx = check_trx_exists(ha_thd()); trx = check_trx_exists(thd);
if (!m_prebuilt->table->skip_alter_undo) { if (!m_prebuilt->table->skip_alter_undo) {
/* This could be invoked inside INSERT...SELECT. /* This could be invoked inside INSERT...SELECT.
We do not want any extra log writes, because We do not want any extra log writes, because
@@ -15934,6 +15935,7 @@ ha_innobase::extra(
handler::extra(HA_EXTRA_BEGIN_ALTER_COPY). */ handler::extra(HA_EXTRA_BEGIN_ALTER_COPY). */
log_buffer_flush_to_disk(); log_buffer_flush_to_disk();
} }
alter_stats_rebuild(m_prebuilt->table, thd);
break; break;
case HA_EXTRA_ABORT_ALTER_COPY: case HA_EXTRA_ABORT_ALTER_COPY:
if (m_prebuilt->table->skip_alter_undo) { if (m_prebuilt->table->skip_alter_undo) {
@@ -21280,3 +21282,25 @@ void ins_node_t::vers_update_end(row_prebuilt_t *prebuilt, bool history_row)
if (UNIV_LIKELY_NULL(local_heap)) if (UNIV_LIKELY_NULL(local_heap))
mem_heap_free(local_heap); mem_heap_free(local_heap);
} }
/** Adjust the persistent statistics after rebuilding ALTER TABLE.
Remove statistics for dropped indexes, add statistics for created indexes
and rename statistics for renamed indexes.
@param table InnoDB table that was rebuilt by ALTER TABLE
@param thd alter table thread */
void alter_stats_rebuild(dict_table_t *table, THD *thd)
{
DBUG_ENTER("alter_stats_rebuild");
if (!table->space || !table->stats_is_persistent()
|| dict_stats_persistent_storage_check(false) != SCHEMA_OK)
DBUG_VOID_RETURN;
dberr_t ret= dict_stats_update_persistent(table);
if (ret == DB_SUCCESS)
ret= dict_stats_save(table);
if (ret != DB_SUCCESS)
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_ALTER_INFO, "Error updating stats for table after"
" table rebuild: %s", ut_strerr(ret));
DBUG_VOID_RETURN;
}

View File

@@ -923,3 +923,10 @@ ib_push_frm_error(
@return true if index column length exceeds limit */ @return true if index column length exceeds limit */
MY_ATTRIBUTE((warn_unused_result)) MY_ATTRIBUTE((warn_unused_result))
bool too_big_key_part_length(size_t max_field_len, const KEY& key); bool too_big_key_part_length(size_t max_field_len, const KEY& key);
/** Adjust the persistent statistics after rebuilding ALTER TABLE.
Remove statistics for dropped indexes, add statistics for created indexes
and rename statistics for renamed indexes.
@param table_name Table name in MySQL
@param thd alter table thread */
void alter_stats_rebuild(dict_table_t *table, THD *thd);

View File

@@ -11209,7 +11209,7 @@ Remove statistics for dropped indexes, add statistics for created indexes
and rename statistics for renamed indexes. and rename statistics for renamed indexes.
@param ha_alter_info Data used during in-place alter @param ha_alter_info Data used during in-place alter
@param ctx In-place ALTER TABLE context @param ctx In-place ALTER TABLE context
@param thd MySQL connection @param thd alter table thread
*/ */
static static
void void
@@ -11241,46 +11241,6 @@ alter_stats_norebuild(
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/** Adjust the persistent statistics after rebuilding ALTER TABLE.
Remove statistics for dropped indexes, add statistics for created indexes
and rename statistics for renamed indexes.
@param table InnoDB table that was rebuilt by ALTER TABLE
@param table_name Table name in MySQL
@param thd MySQL connection
*/
static
void
alter_stats_rebuild(
/*================*/
dict_table_t* table,
const char* table_name,
THD* thd)
{
DBUG_ENTER("alter_stats_rebuild");
if (!table->space || !table->stats_is_persistent()
|| dict_stats_persistent_storage_check(false) != SCHEMA_OK) {
DBUG_VOID_RETURN;
}
dberr_t ret = dict_stats_update_persistent(table);
if (ret == DB_SUCCESS) {
ret = dict_stats_save(table);
}
if (ret != DB_SUCCESS) {
push_warning_printf(
thd,
Sql_condition::WARN_LEVEL_WARN,
ER_ALTER_INFO,
"Error updating stats for table '%s'"
" after table rebuild: %s",
table_name, ut_strerr(ret));
}
DBUG_VOID_RETURN;
}
/** Apply the log for the table rebuild operation. /** Apply the log for the table rebuild operation.
@param[in] ctx Inplace Alter table context @param[in] ctx Inplace Alter table context
@param[in] altered_table MySQL table that is being altered @param[in] altered_table MySQL table that is being altered
@@ -11951,9 +11911,7 @@ foreign_fail:
(*pctx); (*pctx);
DBUG_ASSERT(ctx->need_rebuild()); DBUG_ASSERT(ctx->need_rebuild());
alter_stats_rebuild( alter_stats_rebuild(ctx->new_table, m_user_thd);
ctx->new_table, table->s->table_name.str,
m_user_thd);
} }
} else { } else {
for (inplace_alter_handler_ctx** pctx = ctx_array; for (inplace_alter_handler_ctx** pctx = ctx_array;

View File

@@ -2655,9 +2655,8 @@ all_done:
ut_ad((mrec == NULL) == (index->online_log->head.bytes == 0)); ut_ad((mrec == NULL) == (index->online_log->head.bytes == 0));
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
if (index->online_log->head.block && if (next_mrec_end - srv_sort_buf_size
next_mrec_end == index->online_log->head.block == index->online_log->head.block) {
+ srv_sort_buf_size) {
/* If tail.bytes == 0, next_mrec_end can also be at /* If tail.bytes == 0, next_mrec_end can also be at
the end of tail.block. */ the end of tail.block. */
if (index->online_log->tail.bytes == 0) { if (index->online_log->tail.bytes == 0) {
@@ -2671,9 +2670,8 @@ all_done:
ut_ad(index->online_log->tail.blocks ut_ad(index->online_log->tail.blocks
> index->online_log->head.blocks); > index->online_log->head.blocks);
} }
} else if (index->online_log->tail.block && } else if (next_mrec_end - index->online_log->tail.bytes
next_mrec_end == index->online_log->tail.block == index->online_log->tail.block) {
+ index->online_log->tail.bytes) {
ut_ad(next_mrec == index->online_log->tail.block ut_ad(next_mrec == index->online_log->tail.block
+ index->online_log->head.bytes); + index->online_log->head.bytes);
ut_ad(index->online_log->tail.blocks == 0); ut_ad(index->online_log->tail.blocks == 0);
@@ -2774,7 +2772,7 @@ process_next_block:
} else { } else {
memcpy(index->online_log->head.buf, mrec, memcpy(index->online_log->head.buf, mrec,
ulint(mrec_end - mrec)); ulint(mrec_end - mrec));
mrec_end += ulint(index->online_log->head.buf - mrec); mrec_end -= ulint(mrec - index->online_log->head.buf);
mrec = index->online_log->head.buf; mrec = index->online_log->head.buf;
goto process_next_block; goto process_next_block;
} }
@@ -3567,8 +3565,8 @@ all_done:
ut_ad((mrec == NULL) == (index->online_log->head.bytes == 0)); ut_ad((mrec == NULL) == (index->online_log->head.bytes == 0));
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
if (next_mrec_end == index->online_log->head.block if (next_mrec_end - srv_sort_buf_size
+ srv_sort_buf_size) { == index->online_log->head.block) {
/* If tail.bytes == 0, next_mrec_end can also be at /* If tail.bytes == 0, next_mrec_end can also be at
the end of tail.block. */ the end of tail.block. */
if (index->online_log->tail.bytes == 0) { if (index->online_log->tail.bytes == 0) {
@@ -3582,8 +3580,8 @@ all_done:
ut_ad(index->online_log->tail.blocks ut_ad(index->online_log->tail.blocks
> index->online_log->head.blocks); > index->online_log->head.blocks);
} }
} else if (next_mrec_end == index->online_log->tail.block } else if (next_mrec_end - index->online_log->tail.bytes
+ index->online_log->tail.bytes) { == index->online_log->tail.block) {
ut_ad(next_mrec == index->online_log->tail.block ut_ad(next_mrec == index->online_log->tail.block
+ index->online_log->head.bytes); + index->online_log->head.bytes);
ut_ad(index->online_log->tail.blocks == 0); ut_ad(index->online_log->tail.blocks == 0);
@@ -3666,7 +3664,7 @@ process_next_block:
} else { } else {
memcpy(index->online_log->head.buf, mrec, memcpy(index->online_log->head.buf, mrec,
ulint(mrec_end - mrec)); ulint(mrec_end - mrec));
mrec_end += ulint(index->online_log->head.buf - mrec); mrec_end -= ulint(mrec - index->online_log->head.buf);
mrec = index->online_log->head.buf; mrec = index->online_log->head.buf;
goto process_next_block; goto process_next_block;
} }