Merge bb-10.2-ext into 10.3
This commit is contained in:
commit
0436a0ff3c
@ -1061,11 +1061,13 @@ struct my_option xb_server_options[] =
|
|||||||
(G_PTR*) &defaults_group, (G_PTR*) &defaults_group,
|
(G_PTR*) &defaults_group, (G_PTR*) &defaults_group,
|
||||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
|
||||||
{"plugin-dir", OPT_PLUGIN_DIR, "Server plugin directory",
|
{"plugin-dir", OPT_PLUGIN_DIR,
|
||||||
|
"Server plugin directory. Used to load encryption plugin during 'prepare' phase."
|
||||||
|
"Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)",
|
||||||
&xb_plugin_dir, &xb_plugin_dir,
|
&xb_plugin_dir, &xb_plugin_dir,
|
||||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
||||||
|
|
||||||
{ "plugin-load", OPT_PLUGIN_LOAD, "encrypton plugin to load",
|
{ "plugin-load", OPT_PLUGIN_LOAD, "encrypton plugin to load during 'prepare' phase.",
|
||||||
&xb_plugin_load, &xb_plugin_load,
|
&xb_plugin_load, &xb_plugin_load,
|
||||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
||||||
|
|
||||||
@ -3624,7 +3626,6 @@ fail:
|
|||||||
/* Reset the system variables in the recovery module. */
|
/* Reset the system variables in the recovery module. */
|
||||||
recv_sys_var_init();
|
recv_sys_var_init();
|
||||||
trx_pool_init();
|
trx_pool_init();
|
||||||
row_mysql_init();
|
|
||||||
|
|
||||||
ut_crc32_init();
|
ut_crc32_init();
|
||||||
crc_init();
|
crc_init();
|
||||||
|
@ -152,6 +152,8 @@ typedef struct my_aio_result {
|
|||||||
/* Extra length needed for filename if one calls my_create_backup_name */
|
/* Extra length needed for filename if one calls my_create_backup_name */
|
||||||
#define MY_BACKUP_NAME_EXTRA_LENGTH 17
|
#define MY_BACKUP_NAME_EXTRA_LENGTH 17
|
||||||
|
|
||||||
|
char *guess_malloc_library();
|
||||||
|
|
||||||
/* If we have our own safemalloc (for debugging) */
|
/* If we have our own safemalloc (for debugging) */
|
||||||
#if defined(SAFEMALLOC)
|
#if defined(SAFEMALLOC)
|
||||||
void sf_report_leaked_memory(my_thread_id id);
|
void sf_report_leaked_memory(my_thread_id id);
|
||||||
|
@ -82,7 +82,10 @@ call mtr.check_testcase();
|
|||||||
|
|
||||||
let $datadir=`select @@datadir`;
|
let $datadir=`select @@datadir`;
|
||||||
list_files $datadir mysql_upgrade_info;
|
list_files $datadir mysql_upgrade_info;
|
||||||
list_files $datadir/test #sql*;
|
list_files_write_file $datadir.tempfiles.txt $datadir/test #sql*;
|
||||||
|
--replace_regex /#sql-ib[0-9a-f]+-[0-9a-f]+\.ibd\n//
|
||||||
|
cat_file $datadir.tempfiles.txt;
|
||||||
|
remove_file $datadir.tempfiles.txt;
|
||||||
list_files $datadir/mysql #sql*;
|
list_files $datadir/mysql #sql*;
|
||||||
|
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -115,3 +115,7 @@ c9: 0x000000000101000000000000000000F03F000000000000F03F
|
|||||||
#Print the table contents in html format
|
#Print the table contents in html format
|
||||||
|
|
||||||
<TABLE BORDER=1><TR><TH>c1</TH><TH>c2</TH><TH>c3</TH><TH>c4</TH><TH>c5</TH><TH>c6</TH><TH>c7</TH><TH>c8</TH><TH>c9</TH></TR><TR><TD>0x74696E79626C6F622D74657874207265616461626C65</TD><TD>0x626C6F622D74657874207265616461626C65</TD><TD>0x6D656469756D626C6F622D74657874207265616461626C65</TD><TD>0x6C6F6E67626C6F622D74657874207265616461626C65</TD><TD>0x74657874207265616461626C65</TD><TD>0x01</TD><TD>0x63</TD><TD>0x7661726961626C65</TD><TD>0x000000000101000000000000000000F03F000000000000F03F</TD></TR></TABLE><TABLE BORDER=1><TR><TH>id</TH><TH>col1</TH><TH>col2</TH></TR><TR><TD>1</TD><TD>0xAB123400000000000000</TD><TD>0x123ABC</TD></TR><TR><TD>2</TD><TD>0xDE123400000000000000</TD><TD>0x123DEF</TD></TR></TABLE>DROP TABLE t1, t2;
|
<TABLE BORDER=1><TR><TH>c1</TH><TH>c2</TH><TH>c3</TH><TH>c4</TH><TH>c5</TH><TH>c6</TH><TH>c7</TH><TH>c8</TH><TH>c9</TH></TR><TR><TD>0x74696E79626C6F622D74657874207265616461626C65</TD><TD>0x626C6F622D74657874207265616461626C65</TD><TD>0x6D656469756D626C6F622D74657874207265616461626C65</TD><TD>0x6C6F6E67626C6F622D74657874207265616461626C65</TD><TD>0x74657874207265616461626C65</TD><TD>0x01</TD><TD>0x63</TD><TD>0x7661726961626C65</TD><TD>0x000000000101000000000000000000F03F000000000000F03F</TD></TR></TABLE><TABLE BORDER=1><TR><TH>id</TH><TH>col1</TH><TH>col2</TH></TR><TR><TD>1</TD><TD>0xAB123400000000000000</TD><TD>0x123ABC</TD></TR><TR><TD>2</TD><TD>0xDE123400000000000000</TD><TD>0x123DEF</TD></TR></TABLE>DROP TABLE t1, t2;
|
||||||
|
create table t1 (a int);
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
1 3 2 0x7472316271
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -2904,6 +2904,53 @@ n
|
|||||||
2
|
2
|
||||||
3
|
3
|
||||||
#
|
#
|
||||||
|
# mdev-14629: a user-defined variable is defined by the recursive CTE
|
||||||
|
#
|
||||||
|
set @var=
|
||||||
|
(
|
||||||
|
with recursive cte_tab(a) as (
|
||||||
|
select 1
|
||||||
|
union
|
||||||
|
select a+1 from cte_tab
|
||||||
|
where a<3)
|
||||||
|
select count(*) from cte_tab
|
||||||
|
);
|
||||||
|
select @var;
|
||||||
|
@var
|
||||||
|
3
|
||||||
|
create table t1(a int, b int);
|
||||||
|
insert into t1 values (3,8),(1,5),(5,7),(7,4),(4,3);
|
||||||
|
set @var=
|
||||||
|
(
|
||||||
|
with recursive summ(a,s) as (
|
||||||
|
select 1, 0 union
|
||||||
|
select t1.b, t1.b+summ.s from summ, t1
|
||||||
|
where summ.a=t1.a)
|
||||||
|
select s from summ
|
||||||
|
order by a desc
|
||||||
|
limit 1
|
||||||
|
);
|
||||||
|
select @var;
|
||||||
|
@var
|
||||||
|
27
|
||||||
|
set @var=
|
||||||
|
(
|
||||||
|
with recursive
|
||||||
|
cte_1 as (
|
||||||
|
select 1
|
||||||
|
union
|
||||||
|
select * from cte_2),
|
||||||
|
cte_2 as (
|
||||||
|
select * from cte_1
|
||||||
|
union
|
||||||
|
select a from t1, cte_2
|
||||||
|
where t1.a=cte_2.a)
|
||||||
|
select * from cte_2
|
||||||
|
limit 1
|
||||||
|
);
|
||||||
|
ERROR HY000: Unacceptable mutual recursion with anchored table 'cte_1'
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
# MDEV-14217 [db crash] Recursive CTE when SELECT includes new field
|
# MDEV-14217 [db crash] Recursive CTE when SELECT includes new field
|
||||||
#
|
#
|
||||||
CREATE TEMPORARY TABLE a_tbl (
|
CREATE TEMPORARY TABLE a_tbl (
|
||||||
|
@ -60,6 +60,59 @@ a
|
|||||||
20
|
20
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
connection default;
|
connection default;
|
||||||
|
xa start 'tr1';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1';
|
||||||
|
xa prepare 'tr1';
|
||||||
|
xa recover format='SQL';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
1 3 0 'tr1'
|
||||||
|
xa rollback 'tr1';
|
||||||
|
xa start 'tr1', 'bq';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1', 'bq';
|
||||||
|
xa prepare 'tr1', 'bq';
|
||||||
|
xa recover format='SQL';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
1 3 2 'tr1','bq'
|
||||||
|
xa rollback 'tr1', 'bq';
|
||||||
|
xa start 'tr1', 'bq', 3;
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1', 'bq', 3;
|
||||||
|
xa prepare 'tr1', 'bq', 3;
|
||||||
|
xa recover format='SQL';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
3 3 2 'tr1','bq',3
|
||||||
|
xa rollback 'tr1', 'bq', 3;
|
||||||
|
xa start 'tr1#$';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1#$';
|
||||||
|
xa prepare 'tr1#$';
|
||||||
|
xa recover format='SQL';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
1 5 0 X'7472312324'
|
||||||
|
xa rollback 'tr1#$';
|
||||||
|
xa start 'tr1#$', 'bq';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1#$', 'bq';
|
||||||
|
xa prepare 'tr1#$', 'bq';
|
||||||
|
xa recover format='SQL';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
1 5 2 X'7472312324',X'6271'
|
||||||
|
xa rollback 'tr1#$', 'bq';
|
||||||
|
xa start 'tr1#$', 'bq', 3;
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1#$', 'bq', 3;
|
||||||
|
xa prepare 'tr1#$', 'bq', 3;
|
||||||
|
xa recover format='RAW';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
3 5 2 tr1#$bq
|
||||||
|
xa recover format='PLAIN';
|
||||||
|
ERROR HY000: Unknown XA RECOVER format name: 'PLAIN'
|
||||||
|
xa recover format='SQL';
|
||||||
|
formatID gtrid_length bqual_length data
|
||||||
|
3 5 2 X'7472312324',X'6271',3
|
||||||
|
xa rollback 'tr1#$', 'bq', 3;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
create table t1(a int, b int, c varchar(20), primary key(a)) engine = innodb;
|
create table t1(a int, b int, c varchar(20), primary key(a)) engine = innodb;
|
||||||
|
@ -44,10 +44,9 @@ SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit';
|
|||||||
ALTER TABLE t1 ADD PRIMARY KEY (f2, f1);
|
ALTER TABLE t1 ADD PRIMARY KEY (f2, f1);
|
||||||
ERROR HY000: Lost connection to MySQL server during query
|
ERROR HY000: Lost connection to MySQL server during query
|
||||||
# Restart mysqld after the crash and reconnect.
|
# Restart mysqld after the crash and reconnect.
|
||||||
# Manual *.frm recovery begin.
|
SELECT * FROM information_schema.innodb_sys_tables
|
||||||
# Manual recovery end
|
WHERE table_id = ID;
|
||||||
FLUSH TABLES;
|
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
|
||||||
# Drop the orphaned original table.
|
|
||||||
# Files in datadir after manual recovery.
|
# Files in datadir after manual recovery.
|
||||||
t1.frm
|
t1.frm
|
||||||
t1.ibd
|
t1.ibd
|
||||||
@ -83,11 +82,9 @@ SET DEBUG_DBUG='+d,innodb_alter_commit_crash_before_commit';
|
|||||||
ALTER TABLE t2 ADD PRIMARY KEY (f2, f1);
|
ALTER TABLE t2 ADD PRIMARY KEY (f2, f1);
|
||||||
ERROR HY000: Lost connection to MySQL server during query
|
ERROR HY000: Lost connection to MySQL server during query
|
||||||
# Startup the server after the crash
|
# Startup the server after the crash
|
||||||
# Read and remember the temporary table name
|
SELECT * FROM information_schema.innodb_sys_tables
|
||||||
# Manual *.frm recovery begin. The dictionary was not updated
|
WHERE name LIKE 'test/#sql-ib%';
|
||||||
# and the files were not renamed. The rebuilt table
|
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
|
||||||
# was left behind on purpose, to faciliate data recovery.
|
|
||||||
# Manual recovery end
|
|
||||||
# Drop the orphaned rebuilt table.
|
# Drop the orphaned rebuilt table.
|
||||||
SHOW TABLES;
|
SHOW TABLES;
|
||||||
Tables_in_test
|
Tables_in_test
|
||||||
@ -123,10 +120,10 @@ SET DEBUG_DBUG='+d,innodb_alter_commit_crash_after_commit';
|
|||||||
ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE;
|
ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE;
|
||||||
ERROR HY000: Lost connection to MySQL server during query
|
ERROR HY000: Lost connection to MySQL server during query
|
||||||
# Restart mysqld after the crash and reconnect.
|
# Restart mysqld after the crash and reconnect.
|
||||||
# Manual *.frm recovery begin.
|
SELECT * FROM information_schema.innodb_sys_tables
|
||||||
# Manual recovery end
|
WHERE table_id = ID;
|
||||||
|
TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
|
||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
# Drop the orphaned original table.
|
|
||||||
# Files in datadir after manual recovery.
|
# Files in datadir after manual recovery.
|
||||||
t1.frm
|
t1.frm
|
||||||
t1.ibd
|
t1.ibd
|
||||||
|
@ -3,7 +3,22 @@ KEY(c1), KEY(c2), KEY(c2,c1),
|
|||||||
KEY(c3), KEY(c3,c1), KEY(c3,c2), KEY(c3,c2,c1),
|
KEY(c3), KEY(c3,c1), KEY(c3,c2), KEY(c3,c2,c1),
|
||||||
KEY(c4), KEY(c4,c1), KEY(c4,c2), KEY(c4,c2,c1),
|
KEY(c4), KEY(c4,c1), KEY(c4,c2), KEY(c4,c2,c1),
|
||||||
KEY(c4,c3), KEY(c4,c3,c1), KEY(c4,c3,c2), KEY(c4,c3,c2,c1)) ENGINE=InnoDB;
|
KEY(c4,c3), KEY(c4,c3,c1), KEY(c4,c3,c2), KEY(c4,c3,c2,c1)) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE `#mysql50##sql-ib-foo`(a SERIAL) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t (c1) VALUES (1),(2),(1);
|
||||||
SET DEBUG_DBUG='+d,row_drop_table_add_to_background';
|
SET DEBUG_DBUG='+d,row_drop_table_add_to_background';
|
||||||
|
CREATE TABLE target (PRIMARY KEY(c1)) ENGINE=InnoDB SELECT * FROM t;
|
||||||
|
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
||||||
|
SELECT * from target;
|
||||||
|
ERROR 42S02: Table 'test.target' doesn't exist
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
CREATE TABLE t (a INT) ENGINE=InnoDB;
|
CREATE TABLE t (a INT) ENGINE=InnoDB;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
DROP TABLE target;
|
||||||
|
ERROR 42S02: Unknown table 'test.target'
|
||||||
|
CREATE TABLE target (a INT) ENGINE=InnoDB;
|
||||||
|
DROP TABLE target;
|
||||||
|
SELECT * FROM `#mysql50##sql-ib-foo`;
|
||||||
|
ERROR 42S02: Table 'test.#mysql50##sql-ib-foo' doesn't exist in engine
|
||||||
|
DROP TABLE `#mysql50##sql-ib-foo`;
|
||||||
|
Warnings:
|
||||||
|
Warning 1932 Table 'test.#mysql50##sql-ib-foo' doesn't exist in engine
|
||||||
|
@ -1351,3 +1351,15 @@ t CREATE TABLE `t` (
|
|||||||
KEY `i` (`i`)
|
KEY `i` (`i`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=401 DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB AUTO_INCREMENT=401 DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
#
|
||||||
|
# MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())
|
||||||
|
#
|
||||||
|
SET sql_mode=STRICT_ALL_TABLES;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 DOUBLE NOT NULL PRIMARY KEY AUTO_INCREMENT
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=10000000000000000000;
|
||||||
|
INSERT INTO t1 VALUES ();
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
1e19
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -75,28 +75,22 @@ ALTER TABLE t1 ADD PRIMARY KEY (f2, f1);
|
|||||||
--echo # Restart mysqld after the crash and reconnect.
|
--echo # Restart mysqld after the crash and reconnect.
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
|
|
||||||
let $temp_table_name = `SELECT SUBSTR(name, 6)
|
let TABLENAME_INC= $MYSQLTEST_VARDIR/tmp/tablename.inc;
|
||||||
FROM information_schema.innodb_sys_tables
|
|
||||||
WHERE table_id = $orig_table_id`;
|
|
||||||
|
|
||||||
--echo # Manual *.frm recovery begin.
|
|
||||||
|
|
||||||
--move_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/$temp_table_name.frm
|
|
||||||
|
|
||||||
perl;
|
perl;
|
||||||
my @frm_file = glob "$ENV{'datadir'}/test/#sql-*.frm";
|
die unless open OUT, ">$ENV{TABLENAME_INC}";
|
||||||
my $t1_frm = "$ENV{'datadir'}/test/t1.frm";
|
chdir "$ENV{'datadir'}/test";
|
||||||
rename($frm_file[0], $t1_frm);
|
my @frm_file = map { substr($_, 0, -4) } glob "#sql-*.frm";
|
||||||
|
print OUT 'let $tablename=', $frm_file[0], ';';
|
||||||
|
close OUT or die;
|
||||||
EOF
|
EOF
|
||||||
|
source $TABLENAME_INC;
|
||||||
|
remove_file $TABLENAME_INC;
|
||||||
|
|
||||||
--echo # Manual recovery end
|
--replace_result $orig_table_id ID
|
||||||
|
eval SELECT * FROM information_schema.innodb_sys_tables
|
||||||
|
WHERE table_id = $orig_table_id;
|
||||||
|
|
||||||
FLUSH TABLES;
|
move_file $datadir/test/$tablename.frm $datadir/test/t1.frm;
|
||||||
|
|
||||||
--echo # Drop the orphaned original table.
|
|
||||||
--disable_query_log
|
|
||||||
eval DROP TABLE `$temp_table_name`;
|
|
||||||
--enable_query_log
|
|
||||||
|
|
||||||
--echo # Files in datadir after manual recovery.
|
--echo # Files in datadir after manual recovery.
|
||||||
--list_files $MYSQLD_DATADIR/test
|
--list_files $MYSQLD_DATADIR/test
|
||||||
@ -134,16 +128,9 @@ ALTER TABLE t2 ADD PRIMARY KEY (f2, f1);
|
|||||||
--echo # Startup the server after the crash
|
--echo # Startup the server after the crash
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
|
|
||||||
--echo # Read and remember the temporary table name
|
SELECT * FROM information_schema.innodb_sys_tables
|
||||||
let $temp_table_name = `SELECT SUBSTRING(name,6)
|
WHERE name LIKE 'test/#sql-ib%';
|
||||||
FROM information_schema.innodb_sys_tables
|
|
||||||
WHERE name LIKE "test/#sql-ib$orig_table_id%"`;
|
|
||||||
|
|
||||||
--echo # Manual *.frm recovery begin. The dictionary was not updated
|
|
||||||
--echo # and the files were not renamed. The rebuilt table
|
|
||||||
--echo # was left behind on purpose, to faciliate data recovery.
|
|
||||||
|
|
||||||
let TABLENAME_INC= $MYSQLTEST_VARDIR/tmp/tablename.inc;
|
|
||||||
perl;
|
perl;
|
||||||
die unless open OUT, ">$ENV{TABLENAME_INC}";
|
die unless open OUT, ">$ENV{TABLENAME_INC}";
|
||||||
chdir "$ENV{'datadir'}/test";
|
chdir "$ENV{'datadir'}/test";
|
||||||
@ -154,8 +141,6 @@ EOF
|
|||||||
source $TABLENAME_INC;
|
source $TABLENAME_INC;
|
||||||
remove_file $TABLENAME_INC;
|
remove_file $TABLENAME_INC;
|
||||||
|
|
||||||
--echo # Manual recovery end
|
|
||||||
|
|
||||||
--echo # Drop the orphaned rebuilt table.
|
--echo # Drop the orphaned rebuilt table.
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
eval DROP TABLE `#mysql50#$tablename`;
|
eval DROP TABLE `#mysql50#$tablename`;
|
||||||
@ -198,28 +183,24 @@ ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE;
|
|||||||
--echo # Restart mysqld after the crash and reconnect.
|
--echo # Restart mysqld after the crash and reconnect.
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
|
|
||||||
let $temp_table_name = `SELECT SUBSTR(name, 6)
|
--replace_result $orig_table_id ID
|
||||||
FROM information_schema.innodb_sys_tables
|
eval SELECT * FROM information_schema.innodb_sys_tables
|
||||||
WHERE table_id = $orig_table_id`;
|
WHERE table_id = $orig_table_id;
|
||||||
|
|
||||||
--echo # Manual *.frm recovery begin.
|
|
||||||
--move_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/$temp_table_name.frm
|
|
||||||
|
|
||||||
perl;
|
perl;
|
||||||
my @frm_file = glob "$ENV{'datadir'}/test/#sql-*.frm";
|
die unless open OUT, ">$ENV{TABLENAME_INC}";
|
||||||
my $t1_frm = "$ENV{'datadir'}/test/t1.frm";
|
chdir "$ENV{'datadir'}/test";
|
||||||
rename($frm_file[0], $t1_frm);
|
my @frm_file = map { substr($_, 0, -4) } glob "#sql-*.frm";
|
||||||
|
print OUT 'let $tablename=', $frm_file[0], ';';
|
||||||
|
close OUT or die;
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
--echo # Manual recovery end
|
source $TABLENAME_INC;
|
||||||
|
remove_file $TABLENAME_INC;
|
||||||
|
move_file $datadir/test/$tablename.frm $datadir/test/t1.frm;
|
||||||
|
|
||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
|
|
||||||
--echo # Drop the orphaned original table.
|
|
||||||
--disable_query_log
|
|
||||||
eval DROP TABLE `#mysql50#$temp_table_name`;
|
|
||||||
--enable_query_log
|
|
||||||
|
|
||||||
--echo # Files in datadir after manual recovery.
|
--echo # Files in datadir after manual recovery.
|
||||||
--list_files $MYSQLD_DATADIR/test
|
--list_files $MYSQLD_DATADIR/test
|
||||||
|
|
||||||
|
@ -9,6 +9,9 @@ KEY(c3), KEY(c3,c1), KEY(c3,c2), KEY(c3,c2,c1),
|
|||||||
KEY(c4), KEY(c4,c1), KEY(c4,c2), KEY(c4,c2,c1),
|
KEY(c4), KEY(c4,c1), KEY(c4,c2), KEY(c4,c2,c1),
|
||||||
KEY(c4,c3), KEY(c4,c3,c1), KEY(c4,c3,c2), KEY(c4,c3,c2,c1)) ENGINE=InnoDB;
|
KEY(c4,c3), KEY(c4,c3,c1), KEY(c4,c3,c2), KEY(c4,c3,c2,c1)) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE `#mysql50##sql-ib-foo`(a SERIAL) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t (c1) VALUES (1),(2),(1);
|
||||||
|
|
||||||
let $n= 10;
|
let $n= 10;
|
||||||
|
|
||||||
SET DEBUG_DBUG='+d,row_drop_table_add_to_background';
|
SET DEBUG_DBUG='+d,row_drop_table_add_to_background';
|
||||||
@ -24,7 +27,18 @@ while ($i) {
|
|||||||
dec $i;
|
dec $i;
|
||||||
}
|
}
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
--error ER_DUP_ENTRY
|
||||||
|
CREATE TABLE target (PRIMARY KEY(c1)) ENGINE=InnoDB SELECT * FROM t;
|
||||||
|
--error ER_NO_SUCH_TABLE
|
||||||
|
SELECT * from target;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
CREATE TABLE t (a INT) ENGINE=InnoDB;
|
CREATE TABLE t (a INT) ENGINE=InnoDB;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
--error ER_BAD_TABLE_ERROR
|
||||||
|
DROP TABLE target;
|
||||||
|
CREATE TABLE target (a INT) ENGINE=InnoDB;
|
||||||
|
DROP TABLE target;
|
||||||
|
--error ER_NO_SUCH_TABLE_IN_ENGINE
|
||||||
|
SELECT * FROM `#mysql50##sql-ib-foo`;
|
||||||
|
DROP TABLE `#mysql50##sql-ib-foo`;
|
||||||
|
@ -683,3 +683,15 @@ INSERT INTO t VALUES (NULL);
|
|||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
SHOW CREATE TABLE t;
|
SHOW CREATE TABLE t;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET sql_mode=STRICT_ALL_TABLES;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 DOUBLE NOT NULL PRIMARY KEY AUTO_INCREMENT
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=10000000000000000000;
|
||||||
|
INSERT INTO t1 VALUES ();
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
10
mysql-test/suite/parts/r/partition_alter_myisam.result
Normal file
10
mysql-test/suite/parts/r/partition_alter_myisam.result
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
CREATE TABLE t1 (i INT) ENGINE=MYISAM
|
||||||
|
PARTITION BY LIST(i) (
|
||||||
|
PARTITION p0 VALUES IN (1),
|
||||||
|
PARTITION p1 VALUES IN (2)
|
||||||
|
);
|
||||||
|
ALTER TABLE t1 ROW_FORMAT=COMPRESSED;
|
||||||
|
ALTER TABLE t1 DROP PARTITION p1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
i
|
||||||
|
DROP TABLE t1;
|
17
mysql-test/suite/parts/t/partition_alter_myisam.test
Normal file
17
mysql-test/suite/parts/t/partition_alter_myisam.test
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#
|
||||||
|
# MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine
|
||||||
|
#
|
||||||
|
|
||||||
|
--source include/have_partition.inc
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=MYISAM
|
||||||
|
PARTITION BY LIST(i) (
|
||||||
|
PARTITION p0 VALUES IN (1),
|
||||||
|
PARTITION p1 VALUES IN (2)
|
||||||
|
);
|
||||||
|
ALTER TABLE t1 ROW_FORMAT=COMPRESSED;
|
||||||
|
ALTER TABLE t1 DROP PARTITION p1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
DROP TABLE t1;
|
@ -118,3 +118,19 @@ B
|
|||||||
select count(*) from events_statements_history where sql_text like "%...";
|
select count(*) from events_statements_history where sql_text like "%...";
|
||||||
count(*)
|
count(*)
|
||||||
2
|
2
|
||||||
|
use test;
|
||||||
|
create table t1 (id int);
|
||||||
|
insert into t1 values (1), (2), (3);
|
||||||
|
truncate performance_schema.events_statements_history;
|
||||||
|
select * from t1;
|
||||||
|
id
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
insert into t1 select RAND()*10000 from t1;
|
||||||
|
select sql_text, rows_examined from performance_schema.events_statements_history;
|
||||||
|
sql_text rows_examined
|
||||||
|
truncate performance_schema.events_statements_history 0
|
||||||
|
select * from t1 3
|
||||||
|
insert into t1 select RAND()*10000 from t1 6
|
||||||
|
drop table t1;
|
||||||
|
@ -207,3 +207,18 @@ select 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
|||||||
select _utf8mb4 'ваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑ' as B;
|
select _utf8mb4 'ваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑваÑÑ' as B;
|
||||||
|
|
||||||
select count(*) from events_statements_history where sql_text like "%...";
|
select count(*) from events_statements_history where sql_text like "%...";
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-10486 MariaDB 10.x does not update rows_examined in performance_schema tables
|
||||||
|
# Verify that the rows_examined counter is set properly.
|
||||||
|
|
||||||
|
use test;
|
||||||
|
create table t1 (id int);
|
||||||
|
insert into t1 values (1), (2), (3);
|
||||||
|
truncate performance_schema.events_statements_history;
|
||||||
|
select * from t1;
|
||||||
|
insert into t1 select RAND()*10000 from t1;
|
||||||
|
select sql_text, rows_examined from performance_schema.events_statements_history;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
@ -72,5 +72,25 @@ SELECT * FROM t2;
|
|||||||
#Cleanup
|
#Cleanup
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
# MDEV-14593 human-readable XA RECOVER
|
||||||
|
|
||||||
|
create table t1 (a int);
|
||||||
|
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/mdev-14593.sql
|
||||||
|
DELIMITER /
|
||||||
|
XA START 'tr1', 'bq'/
|
||||||
|
INSERT INTO t1 VALUES (0)/
|
||||||
|
XA END 'tr1', 'bq'/
|
||||||
|
XA PREPARE 'tr1', 'bq'/
|
||||||
|
XA RECOVER/
|
||||||
|
XA ROLLBACK 'tr1', 'bq'/
|
||||||
|
EOF
|
||||||
|
--exec $MYSQL test --binary-as-hex < $MYSQLTEST_VARDIR/tmp/mdev-14593.sql 2>&1
|
||||||
|
remove_file $MYSQLTEST_VARDIR/tmp/mdev-14593.sql;
|
||||||
|
|
||||||
|
|
||||||
|
#Cleanup
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
# Wait till all disconnects are completed
|
# Wait till all disconnects are completed
|
||||||
--source include/wait_until_count_sessions.inc
|
--source include/wait_until_count_sessions.inc
|
||||||
|
@ -1948,6 +1948,57 @@ cte2 as (
|
|||||||
SELECT *
|
SELECT *
|
||||||
FROM cte1;
|
FROM cte1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # mdev-14629: a user-defined variable is defined by the recursive CTE
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set @var=
|
||||||
|
(
|
||||||
|
with recursive cte_tab(a) as (
|
||||||
|
select 1
|
||||||
|
union
|
||||||
|
select a+1 from cte_tab
|
||||||
|
where a<3)
|
||||||
|
select count(*) from cte_tab
|
||||||
|
);
|
||||||
|
|
||||||
|
select @var;
|
||||||
|
|
||||||
|
create table t1(a int, b int);
|
||||||
|
insert into t1 values (3,8),(1,5),(5,7),(7,4),(4,3);
|
||||||
|
|
||||||
|
set @var=
|
||||||
|
(
|
||||||
|
with recursive summ(a,s) as (
|
||||||
|
select 1, 0 union
|
||||||
|
select t1.b, t1.b+summ.s from summ, t1
|
||||||
|
where summ.a=t1.a)
|
||||||
|
select s from summ
|
||||||
|
order by a desc
|
||||||
|
limit 1
|
||||||
|
);
|
||||||
|
|
||||||
|
select @var;
|
||||||
|
|
||||||
|
--ERROR ER_UNACCEPTABLE_MUTUAL_RECURSION
|
||||||
|
set @var=
|
||||||
|
(
|
||||||
|
with recursive
|
||||||
|
cte_1 as (
|
||||||
|
select 1
|
||||||
|
union
|
||||||
|
select * from cte_2),
|
||||||
|
cte_2 as (
|
||||||
|
select * from cte_1
|
||||||
|
union
|
||||||
|
select a from t1, cte_2
|
||||||
|
where t1.a=cte_2.a)
|
||||||
|
select * from cte_2
|
||||||
|
limit 1
|
||||||
|
);
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-14217 [db crash] Recursive CTE when SELECT includes new field
|
--echo # MDEV-14217 [db crash] Recursive CTE when SELECT includes new field
|
||||||
--echo #
|
--echo #
|
||||||
@ -1975,4 +2026,3 @@ DROP TABLE a_tbl;
|
|||||||
|
|
||||||
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
|
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
|
||||||
WITH RECURSIVE x AS (SELECT 1,2 UNION ALL SELECT 1 FROM x) SELECT * FROM x;
|
WITH RECURSIVE x AS (SELECT 1,2 UNION ALL SELECT 1 FROM x) SELECT * FROM x;
|
||||||
|
|
||||||
|
@ -80,9 +80,57 @@ xa rollback 'testa','testb';
|
|||||||
xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
|
xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
|
||||||
|
|
||||||
select * from t1;
|
select * from t1;
|
||||||
|
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
|
--source include/wait_until_count_sessions.inc
|
||||||
|
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
|
# MDEV-14593 human-readable XA RECOVER
|
||||||
|
xa start 'tr1';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1';
|
||||||
|
xa prepare 'tr1';
|
||||||
|
xa recover format='SQL';
|
||||||
|
xa rollback 'tr1';
|
||||||
|
|
||||||
|
xa start 'tr1', 'bq';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1', 'bq';
|
||||||
|
xa prepare 'tr1', 'bq';
|
||||||
|
xa recover format='SQL';
|
||||||
|
xa rollback 'tr1', 'bq';
|
||||||
|
|
||||||
|
xa start 'tr1', 'bq', 3;
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1', 'bq', 3;
|
||||||
|
xa prepare 'tr1', 'bq', 3;
|
||||||
|
xa recover format='SQL';
|
||||||
|
xa rollback 'tr1', 'bq', 3;
|
||||||
|
|
||||||
|
xa start 'tr1#$';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1#$';
|
||||||
|
xa prepare 'tr1#$';
|
||||||
|
xa recover format='SQL';
|
||||||
|
xa rollback 'tr1#$';
|
||||||
|
|
||||||
|
xa start 'tr1#$', 'bq';
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1#$', 'bq';
|
||||||
|
xa prepare 'tr1#$', 'bq';
|
||||||
|
xa recover format='SQL';
|
||||||
|
xa rollback 'tr1#$', 'bq';
|
||||||
|
|
||||||
|
xa start 'tr1#$', 'bq', 3;
|
||||||
|
insert t1 values (40);
|
||||||
|
xa end 'tr1#$', 'bq', 3;
|
||||||
|
xa prepare 'tr1#$', 'bq', 3;
|
||||||
|
xa recover format='RAW';
|
||||||
|
--error ER_UNKNOWN_EXPLAIN_FORMAT
|
||||||
|
xa recover format='PLAIN';
|
||||||
|
xa recover format='SQL';
|
||||||
|
xa rollback 'tr1#$', 'bq', 3;
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -379,7 +427,6 @@ connection default;
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
|
|
||||||
|
|
||||||
# Wait till all disconnects are completed
|
# Wait till all disconnects are completed
|
||||||
--source include/wait_until_count_sessions.inc
|
--source include/wait_until_count_sessions.inc
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ SET(MYSYS_SOURCES array.c charset-def.c charset.c checksum.c my_default.c
|
|||||||
thr_rwlock.c thr_timer.c
|
thr_rwlock.c thr_timer.c
|
||||||
tree.c typelib.c base64.c my_memmem.c
|
tree.c typelib.c base64.c my_memmem.c
|
||||||
my_getpagesize.c
|
my_getpagesize.c
|
||||||
|
guess_malloc_library.c
|
||||||
lf_alloc-pin.c lf_dynarray.c lf_hash.c
|
lf_alloc-pin.c lf_dynarray.c lf_hash.c
|
||||||
safemalloc.c my_new.cc
|
safemalloc.c my_new.cc
|
||||||
my_getncpus.c my_safehash.c my_chmod.c my_rnd.c
|
my_getncpus.c my_safehash.c my_chmod.c my_rnd.c
|
||||||
|
64
mysys/guess_malloc_library.c
Normal file
64
mysys/guess_malloc_library.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/* Copyright (c) 2002, 2015, Oracle and/or its affiliates.
|
||||||
|
Copyright (c) 2012, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
|
/* guess_malloc_library() deduces, to the best of its ability,
|
||||||
|
the currently used malloc library and its version */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "my_global.h"
|
||||||
|
#include <m_string.h>
|
||||||
|
|
||||||
|
char *guess_malloc_library()
|
||||||
|
{
|
||||||
|
#ifndef HAVE_DLOPEN
|
||||||
|
return (char*) MALLOC_LIBRARY;
|
||||||
|
#else
|
||||||
|
static char buf[128];
|
||||||
|
|
||||||
|
if (strcmp(MALLOC_LIBRARY, "system") != 0)
|
||||||
|
{
|
||||||
|
return (char*) MALLOC_LIBRARY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tcmalloc */
|
||||||
|
typedef const char* (*tc_version_type)(int*, int*, const char**);
|
||||||
|
tc_version_type tc_version_func =
|
||||||
|
(tc_version_type) dlsym(RTLD_DEFAULT, "tc_version");
|
||||||
|
if (tc_version_func)
|
||||||
|
{
|
||||||
|
int major, minor;
|
||||||
|
const char* ver_str = tc_version_func(&major, &minor, NULL);
|
||||||
|
strxnmov(buf, sizeof(buf)-1, "tcmalloc ", ver_str, NULL);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* jemalloc */
|
||||||
|
typedef int (*mallctl_type)(const char*, void*, size_t*, void*, size_t);
|
||||||
|
mallctl_type mallctl_func =
|
||||||
|
(mallctl_type) dlsym(RTLD_DEFAULT, "mallctl");
|
||||||
|
if (mallctl_func)
|
||||||
|
{
|
||||||
|
char *ver;
|
||||||
|
size_t len = sizeof(ver);
|
||||||
|
mallctl_func("version", &ver, &len, NULL, 0);
|
||||||
|
strxnmov(buf, sizeof(buf)-1, "jemalloc ", ver, NULL);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (char*) MALLOC_LIBRARY;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
@ -421,7 +421,7 @@ Events::create_event(THD *thd, Event_parse_data *parse_data)
|
|||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
error:
|
error:
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(true);
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4677,6 +4677,15 @@ double Field_double::val_real(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
longlong Field_double::val_int_from_real(bool want_unsigned_result)
|
||||||
|
{
|
||||||
|
Converter_double_to_longlong conv(val_real(), want_unsigned_result);
|
||||||
|
if (!want_unsigned_result && conv.error())
|
||||||
|
conv.push_warning(get_thd(), Field_double::val_real(), false);
|
||||||
|
return conv.result();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
my_decimal *Field_real::val_decimal(my_decimal *decimal_value)
|
my_decimal *Field_real::val_decimal(my_decimal *decimal_value)
|
||||||
{
|
{
|
||||||
ASSERT_COLUMN_MARKED_FOR_READ;
|
ASSERT_COLUMN_MARKED_FOR_READ;
|
||||||
|
14
sql/field.h
14
sql/field.h
@ -842,6 +842,10 @@ public:
|
|||||||
}
|
}
|
||||||
virtual double val_real(void)=0;
|
virtual double val_real(void)=0;
|
||||||
virtual longlong val_int(void)=0;
|
virtual longlong val_int(void)=0;
|
||||||
|
virtual ulonglong val_uint(void)
|
||||||
|
{
|
||||||
|
return (ulonglong) val_int();
|
||||||
|
}
|
||||||
virtual bool val_bool(void)= 0;
|
virtual bool val_bool(void)= 0;
|
||||||
virtual my_decimal *val_decimal(my_decimal *);
|
virtual my_decimal *val_decimal(my_decimal *);
|
||||||
inline String *val_str(String *str) { return val_str(str, str); }
|
inline String *val_str(String *str) { return val_str(str, str); }
|
||||||
@ -2195,6 +2199,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
class Field_double :public Field_real {
|
class Field_double :public Field_real {
|
||||||
|
longlong val_int_from_real(bool want_unsigned_result);
|
||||||
public:
|
public:
|
||||||
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
|
||||||
uchar null_bit_arg,
|
uchar null_bit_arg,
|
||||||
@ -2232,13 +2237,8 @@ public:
|
|||||||
int store(longlong nr, bool unsigned_val);
|
int store(longlong nr, bool unsigned_val);
|
||||||
int reset(void) { bzero(ptr,sizeof(double)); return 0; }
|
int reset(void) { bzero(ptr,sizeof(double)); return 0; }
|
||||||
double val_real(void);
|
double val_real(void);
|
||||||
longlong val_int(void)
|
longlong val_int(void) { return val_int_from_real(false); }
|
||||||
{
|
ulonglong val_uint(void) { return (ulonglong) val_int_from_real(true); }
|
||||||
Converter_double_to_longlong conv(Field_double::val_real(), false);
|
|
||||||
if (conv.error())
|
|
||||||
conv.push_warning(get_thd(), Field_double::val_real(), false);
|
|
||||||
return conv.result();
|
|
||||||
}
|
|
||||||
String *val_str(String*,String *);
|
String *val_str(String*,String *);
|
||||||
bool send_binary(Protocol *protocol);
|
bool send_binary(Protocol *protocol);
|
||||||
int cmp(const uchar *,const uchar *);
|
int cmp(const uchar *,const uchar *);
|
||||||
|
138
sql/handler.cc
138
sql/handler.cc
@ -1992,6 +1992,97 @@ int ha_recover(HASH *commit_list)
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
return the XID as it appears in the SQL function's arguments.
|
||||||
|
So this string can be passed to XA START, XA PREPARE etc...
|
||||||
|
|
||||||
|
@note
|
||||||
|
the 'buf' has to have space for at least SQL_XIDSIZE bytes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
'a'..'z' 'A'..'Z', '0'..'9'
|
||||||
|
and '-' '_' ' ' symbols don't have to be
|
||||||
|
converted.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const char xid_needs_conv[128]=
|
||||||
|
{
|
||||||
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
|
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
||||||
|
0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,
|
||||||
|
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,
|
||||||
|
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1
|
||||||
|
};
|
||||||
|
|
||||||
|
uint get_sql_xid(XID *xid, char *buf)
|
||||||
|
{
|
||||||
|
int tot_len= xid->gtrid_length + xid->bqual_length;
|
||||||
|
int i;
|
||||||
|
const char *orig_buf= buf;
|
||||||
|
|
||||||
|
for (i=0; i<tot_len; i++)
|
||||||
|
{
|
||||||
|
uchar c= ((uchar *) xid->data)[i];
|
||||||
|
if (c >= 128 || xid_needs_conv[c])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= tot_len)
|
||||||
|
{
|
||||||
|
/* No need to convert characters to hexadecimals. */
|
||||||
|
*buf++= '\'';
|
||||||
|
memcpy(buf, xid->data, xid->gtrid_length);
|
||||||
|
buf+= xid->gtrid_length;
|
||||||
|
*buf++= '\'';
|
||||||
|
if (xid->bqual_length > 0 || xid->formatID != 1)
|
||||||
|
{
|
||||||
|
*buf++= ',';
|
||||||
|
*buf++= '\'';
|
||||||
|
memcpy(buf, xid->data+xid->gtrid_length, xid->bqual_length);
|
||||||
|
buf+= xid->bqual_length;
|
||||||
|
*buf++= '\'';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*buf++= 'X';
|
||||||
|
*buf++= '\'';
|
||||||
|
for (i= 0; i < xid->gtrid_length; i++)
|
||||||
|
{
|
||||||
|
*buf++=_dig_vec_lower[((uchar*) xid->data)[i] >> 4];
|
||||||
|
*buf++=_dig_vec_lower[((uchar*) xid->data)[i] & 0x0f];
|
||||||
|
}
|
||||||
|
*buf++= '\'';
|
||||||
|
if (xid->bqual_length > 0 || xid->formatID != 1)
|
||||||
|
{
|
||||||
|
*buf++= ',';
|
||||||
|
*buf++= 'X';
|
||||||
|
*buf++= '\'';
|
||||||
|
for (; i < tot_len; i++)
|
||||||
|
{
|
||||||
|
*buf++=_dig_vec_lower[((uchar*) xid->data)[i] >> 4];
|
||||||
|
*buf++=_dig_vec_lower[((uchar*) xid->data)[i] & 0x0f];
|
||||||
|
}
|
||||||
|
*buf++= '\'';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xid->formatID != 1)
|
||||||
|
{
|
||||||
|
*buf++= ',';
|
||||||
|
buf+= my_longlong10_to_str_8bit(&my_charset_bin, buf,
|
||||||
|
MY_INT64_NUM_DECIMAL_DIGITS, -10, xid->formatID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf - orig_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
return the list of XID's to a client, the same way SHOW commands do.
|
return the list of XID's to a client, the same way SHOW commands do.
|
||||||
|
|
||||||
@ -2001,7 +2092,8 @@ int ha_recover(HASH *commit_list)
|
|||||||
It can be easily fixed later, if necessary.
|
It can be easily fixed later, if necessary.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static my_bool xa_recover_callback(XID_STATE *xs, Protocol *protocol)
|
static my_bool xa_recover_callback(XID_STATE *xs, Protocol *protocol,
|
||||||
|
char *data, uint data_len, CHARSET_INFO *data_cs)
|
||||||
{
|
{
|
||||||
if (xs->xa_state == XA_PREPARED)
|
if (xs->xa_state == XA_PREPARED)
|
||||||
{
|
{
|
||||||
@ -2009,8 +2101,7 @@ static my_bool xa_recover_callback(XID_STATE *xs, Protocol *protocol)
|
|||||||
protocol->store_longlong((longlong) xs->xid.formatID, FALSE);
|
protocol->store_longlong((longlong) xs->xid.formatID, FALSE);
|
||||||
protocol->store_longlong((longlong) xs->xid.gtrid_length, FALSE);
|
protocol->store_longlong((longlong) xs->xid.gtrid_length, FALSE);
|
||||||
protocol->store_longlong((longlong) xs->xid.bqual_length, FALSE);
|
protocol->store_longlong((longlong) xs->xid.bqual_length, FALSE);
|
||||||
protocol->store(xs->xid.data, xs->xid.gtrid_length + xs->xid.bqual_length,
|
protocol->store(data, data_len, data_cs);
|
||||||
&my_charset_bin);
|
|
||||||
if (protocol->write())
|
if (protocol->write())
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -2018,11 +2109,28 @@ static my_bool xa_recover_callback(XID_STATE *xs, Protocol *protocol)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static my_bool xa_recover_callback_short(XID_STATE *xs, Protocol *protocol)
|
||||||
|
{
|
||||||
|
return xa_recover_callback(xs, protocol, xs->xid.data,
|
||||||
|
xs->xid.gtrid_length + xs->xid.bqual_length, &my_charset_bin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static my_bool xa_recover_callback_verbose(XID_STATE *xs, Protocol *protocol)
|
||||||
|
{
|
||||||
|
char buf[SQL_XIDSIZE];
|
||||||
|
uint len= get_sql_xid(&xs->xid, buf);
|
||||||
|
return xa_recover_callback(xs, protocol, buf, len,
|
||||||
|
&my_charset_utf8_general_ci);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool mysql_xa_recover(THD *thd)
|
bool mysql_xa_recover(THD *thd)
|
||||||
{
|
{
|
||||||
List<Item> field_list;
|
List<Item> field_list;
|
||||||
Protocol *protocol= thd->protocol;
|
Protocol *protocol= thd->protocol;
|
||||||
MEM_ROOT *mem_root= thd->mem_root;
|
MEM_ROOT *mem_root= thd->mem_root;
|
||||||
|
my_hash_walk_action action;
|
||||||
DBUG_ENTER("mysql_xa_recover");
|
DBUG_ENTER("mysql_xa_recover");
|
||||||
|
|
||||||
field_list.push_back(new (mem_root)
|
field_list.push_back(new (mem_root)
|
||||||
@ -2034,16 +2142,32 @@ bool mysql_xa_recover(THD *thd)
|
|||||||
field_list.push_back(new (mem_root)
|
field_list.push_back(new (mem_root)
|
||||||
Item_int(thd, "bqual_length", 0,
|
Item_int(thd, "bqual_length", 0,
|
||||||
MY_INT32_NUM_DECIMAL_DIGITS), mem_root);
|
MY_INT32_NUM_DECIMAL_DIGITS), mem_root);
|
||||||
|
{
|
||||||
|
uint len;
|
||||||
|
CHARSET_INFO *cs;
|
||||||
|
|
||||||
|
if (thd->lex->verbose)
|
||||||
|
{
|
||||||
|
len= SQL_XIDSIZE;
|
||||||
|
cs= &my_charset_utf8_general_ci;
|
||||||
|
action= (my_hash_walk_action) xa_recover_callback_verbose;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len= XIDDATASIZE;
|
||||||
|
cs= &my_charset_bin;
|
||||||
|
action= (my_hash_walk_action) xa_recover_callback_short;
|
||||||
|
}
|
||||||
|
|
||||||
field_list.push_back(new (mem_root)
|
field_list.push_back(new (mem_root)
|
||||||
Item_empty_string(thd, "data",
|
Item_empty_string(thd, "data", len, cs), mem_root);
|
||||||
XIDDATASIZE), mem_root);
|
}
|
||||||
|
|
||||||
if (protocol->send_result_set_metadata(&field_list,
|
if (protocol->send_result_set_metadata(&field_list,
|
||||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
if (xid_cache_iterate(thd, (my_hash_walk_action) xa_recover_callback,
|
if (xid_cache_iterate(thd, action, protocol))
|
||||||
protocol))
|
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
my_eof(thd);
|
my_eof(thd);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
@ -669,6 +669,15 @@ struct xid_t {
|
|||||||
};
|
};
|
||||||
typedef struct xid_t XID;
|
typedef struct xid_t XID;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The size of XID string representation in the form
|
||||||
|
'gtrid', 'bqual', formatID
|
||||||
|
see xid_t::get_sql_string() for details.
|
||||||
|
*/
|
||||||
|
#define SQL_XIDSIZE (XIDDATASIZE * 2 + 8 + MY_INT64_NUM_DECIMAL_DIGITS)
|
||||||
|
/* The 'buf' has to have space for at least SQL_XIDSIZE bytes. */
|
||||||
|
uint get_sql_xid(XID *xid, char *buf);
|
||||||
|
|
||||||
/* for recover() handlerton call */
|
/* for recover() handlerton call */
|
||||||
#define MIN_XID_LIST_SIZE 128
|
#define MIN_XID_LIST_SIZE 128
|
||||||
#define MAX_XID_LIST_SIZE (1024*128)
|
#define MAX_XID_LIST_SIZE (1024*128)
|
||||||
@ -1824,6 +1833,13 @@ struct HA_CREATE_INFO: public Table_scope_and_contents_source_st,
|
|||||||
used_fields|= (HA_CREATE_USED_CHARSET | HA_CREATE_USED_DEFAULT_CHARSET);
|
used_fields|= (HA_CREATE_USED_CHARSET | HA_CREATE_USED_DEFAULT_CHARSET);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
ulong table_options_with_row_type()
|
||||||
|
{
|
||||||
|
if (row_type == ROW_TYPE_DYNAMIC || row_type == ROW_TYPE_PAGE)
|
||||||
|
return table_options | HA_OPTION_PACK_RECORD;
|
||||||
|
else
|
||||||
|
return table_options;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -6850,8 +6850,8 @@ ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID
|
|||||||
eng "GTID_NEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK"
|
eng "GTID_NEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK"
|
||||||
|
|
||||||
ER_UNKNOWN_EXPLAIN_FORMAT
|
ER_UNKNOWN_EXPLAIN_FORMAT
|
||||||
eng "Unknown EXPLAIN format name: '%s'"
|
eng "Unknown %s format name: '%s'"
|
||||||
rus "Неизвестное имя формата команды EXPLAIN: '%s'"
|
rus "Неизвестное имя формата команды %s: '%s'"
|
||||||
|
|
||||||
ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION 25006
|
ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION 25006
|
||||||
eng "Cannot execute statement in a READ ONLY transaction"
|
eng "Cannot execute statement in a READ ONLY transaction"
|
||||||
|
@ -2397,11 +2397,12 @@ com_multi_end:
|
|||||||
|
|
||||||
THD_STAGE_INFO(thd, stage_cleaning_up);
|
THD_STAGE_INFO(thd, stage_cleaning_up);
|
||||||
thd->reset_query();
|
thd->reset_query();
|
||||||
thd->set_examined_row_count(0); // For processlist
|
|
||||||
thd->set_command(COM_SLEEP);
|
|
||||||
|
|
||||||
/* Performance Schema Interface instrumentation, end */
|
/* Performance Schema Interface instrumentation, end */
|
||||||
MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da());
|
MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da());
|
||||||
|
thd->set_examined_row_count(0); // For processlist
|
||||||
|
thd->set_command(COM_SLEEP);
|
||||||
|
|
||||||
thd->m_statement_psi= NULL;
|
thd->m_statement_psi= NULL;
|
||||||
thd->m_digest= NULL;
|
thd->m_digest= NULL;
|
||||||
|
|
||||||
@ -5103,6 +5104,9 @@ end_with_restore_list:
|
|||||||
{
|
{
|
||||||
List<set_var_base> *lex_var_list= &lex->var_list;
|
List<set_var_base> *lex_var_list= &lex->var_list;
|
||||||
|
|
||||||
|
if (check_dependencies_in_with_clauses(thd->lex->with_clauses_list))
|
||||||
|
goto error;
|
||||||
|
|
||||||
if ((check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE)
|
if ((check_table_access(thd, SELECT_ACL, all_tables, FALSE, UINT_MAX, FALSE)
|
||||||
|| open_and_lock_tables(thd, all_tables, TRUE, 0)))
|
|| open_and_lock_tables(thd, all_tables, TRUE, 0)))
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -6560,10 +6560,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
|
|||||||
lpt->part_info= part_info;
|
lpt->part_info= part_info;
|
||||||
lpt->alter_info= alter_info;
|
lpt->alter_info= alter_info;
|
||||||
lpt->create_info= create_info;
|
lpt->create_info= create_info;
|
||||||
lpt->db_options= create_info->table_options;
|
lpt->db_options= create_info->table_options_with_row_type();
|
||||||
if (create_info->row_type != ROW_TYPE_FIXED &&
|
|
||||||
create_info->row_type != ROW_TYPE_DEFAULT)
|
|
||||||
lpt->db_options|= HA_OPTION_PACK_RECORD;
|
|
||||||
lpt->table= table;
|
lpt->table= table;
|
||||||
lpt->key_info_buffer= 0;
|
lpt->key_info_buffer= 0;
|
||||||
lpt->key_count= 0;
|
lpt->key_count= 0;
|
||||||
|
@ -4422,10 +4422,7 @@ handler *mysql_create_frm_image(THD *thd,
|
|||||||
|
|
||||||
set_table_default_charset(thd, create_info, (char*) db);
|
set_table_default_charset(thd, create_info, (char*) db);
|
||||||
|
|
||||||
db_options= create_info->table_options;
|
db_options= create_info->table_options_with_row_type();
|
||||||
if (create_info->row_type == ROW_TYPE_DYNAMIC ||
|
|
||||||
create_info->row_type == ROW_TYPE_PAGE)
|
|
||||||
db_options|= HA_OPTION_PACK_RECORD;
|
|
||||||
|
|
||||||
if (!(file= get_new_handler((TABLE_SHARE*) 0, thd->mem_root,
|
if (!(file= get_new_handler((TABLE_SHARE*) 0, thd->mem_root,
|
||||||
create_info->db_type)))
|
create_info->db_type)))
|
||||||
|
@ -430,14 +430,14 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
|||||||
lex->link_first_table_back(view, link_to_local);
|
lex->link_first_table_back(view, link_to_local);
|
||||||
view->open_type= OT_BASE_ONLY;
|
view->open_type= OT_BASE_ONLY;
|
||||||
|
|
||||||
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL)
|
|
||||||
|
|
||||||
if (check_dependencies_in_with_clauses(lex->with_clauses_list))
|
if (check_dependencies_in_with_clauses(lex->with_clauses_list))
|
||||||
{
|
{
|
||||||
res= TRUE;
|
res= TRUE;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ignore lock specs for CREATE statement
|
ignore lock specs for CREATE statement
|
||||||
*/
|
*/
|
||||||
|
@ -1692,7 +1692,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||||||
opt_default_time_precision
|
opt_default_time_precision
|
||||||
case_stmt_body opt_bin_mod
|
case_stmt_body opt_bin_mod
|
||||||
opt_if_exists_table_element opt_if_not_exists_table_element
|
opt_if_exists_table_element opt_if_not_exists_table_element
|
||||||
opt_recursive
|
opt_recursive opt_format_xid
|
||||||
|
|
||||||
%type <object_ddl_options>
|
%type <object_ddl_options>
|
||||||
create_or_replace
|
create_or_replace
|
||||||
@ -17134,9 +17134,26 @@ xa:
|
|||||||
{
|
{
|
||||||
Lex->sql_command = SQLCOM_XA_ROLLBACK;
|
Lex->sql_command = SQLCOM_XA_ROLLBACK;
|
||||||
}
|
}
|
||||||
| XA_SYM RECOVER_SYM
|
| XA_SYM RECOVER_SYM opt_format_xid
|
||||||
{
|
{
|
||||||
Lex->sql_command = SQLCOM_XA_RECOVER;
|
Lex->sql_command = SQLCOM_XA_RECOVER;
|
||||||
|
Lex->verbose= $3;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_format_xid:
|
||||||
|
/* empty */ { $$= false; }
|
||||||
|
| FORMAT_SYM '=' ident_or_text
|
||||||
|
{
|
||||||
|
if (!my_strcasecmp(system_charset_info, $3.str, "SQL"))
|
||||||
|
$$= true;
|
||||||
|
else if (!my_strcasecmp(system_charset_info, $3.str, "RAW"))
|
||||||
|
$$= false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), "XA RECOVER", $3.str));
|
||||||
|
$$= false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "sql_priv.h"
|
#include "sql_priv.h"
|
||||||
#include "sql_class.h" // set_var.h: THD
|
#include "sql_class.h" // set_var.h: THD
|
||||||
#include "sys_vars.ic"
|
#include "sys_vars.ic"
|
||||||
|
#include "my_sys.h"
|
||||||
|
|
||||||
#include "events.h"
|
#include "events.h"
|
||||||
#include <thr_alarm.h>
|
#include <thr_alarm.h>
|
||||||
@ -3739,27 +3740,6 @@ static Sys_var_charptr Sys_version_source_revision(
|
|||||||
CMD_LINE_HELP_ONLY,
|
CMD_LINE_HELP_ONLY,
|
||||||
IN_SYSTEM_CHARSET, DEFAULT(SOURCE_REVISION));
|
IN_SYSTEM_CHARSET, DEFAULT(SOURCE_REVISION));
|
||||||
|
|
||||||
static char *guess_malloc_library()
|
|
||||||
{
|
|
||||||
if (strcmp(MALLOC_LIBRARY, "system") == 0)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_DLOPEN
|
|
||||||
typedef int (*mallctl_type)(const char*, void*, size_t*, void*, size_t);
|
|
||||||
mallctl_type mallctl_func;
|
|
||||||
mallctl_func= (mallctl_type)dlsym(RTLD_DEFAULT, "mallctl");
|
|
||||||
if (mallctl_func)
|
|
||||||
{
|
|
||||||
static char buf[128];
|
|
||||||
char *ver;
|
|
||||||
size_t len = sizeof(ver);
|
|
||||||
mallctl_func("version", &ver, &len, NULL, 0);
|
|
||||||
strxnmov(buf, sizeof(buf)-1, "jemalloc ", ver, NULL);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return const_cast<char*>(MALLOC_LIBRARY);
|
|
||||||
}
|
|
||||||
static char *malloc_library;
|
static char *malloc_library;
|
||||||
static Sys_var_charptr Sys_malloc_library(
|
static Sys_var_charptr Sys_malloc_library(
|
||||||
"version_malloc_library", "Version of the used malloc library",
|
"version_malloc_library", "Version of the used malloc library",
|
||||||
|
@ -8385,8 +8385,8 @@ no_commit:
|
|||||||
whether we update the table autoinc counter or not. */
|
whether we update the table autoinc counter or not. */
|
||||||
col_max_value = innobase_get_int_col_max_value(table->next_number_field);
|
col_max_value = innobase_get_int_col_max_value(table->next_number_field);
|
||||||
|
|
||||||
/* Get the value that MySQL attempted to store in the table. */
|
/* Get the value that MySQL attempted to store in the table.*/
|
||||||
auto_inc = table->next_number_field->val_int();
|
auto_inc = table->next_number_field->val_uint();
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case DB_DUPLICATE_KEY:
|
case DB_DUPLICATE_KEY:
|
||||||
@ -8852,12 +8852,7 @@ calc_row_difference(
|
|||||||
if (field != table->found_next_number_field
|
if (field != table->found_next_number_field
|
||||||
|| dfield_is_null(&ufield->new_val)) {
|
|| dfield_is_null(&ufield->new_val)) {
|
||||||
} else {
|
} else {
|
||||||
auto_inc = row_parse_int(
|
auto_inc = field->val_uint();
|
||||||
static_cast<const byte*>(
|
|
||||||
ufield->new_val.data),
|
|
||||||
ufield->new_val.len,
|
|
||||||
col->mtype,
|
|
||||||
col->prtype & DATA_UNSIGNED);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n_changed++;
|
n_changed++;
|
||||||
|
@ -420,6 +420,10 @@ ulint
|
|||||||
row_get_background_drop_list_len_low(void);
|
row_get_background_drop_list_len_low(void);
|
||||||
/*======================================*/
|
/*======================================*/
|
||||||
|
|
||||||
|
/** Drop garbage tables during recovery. */
|
||||||
|
void
|
||||||
|
row_mysql_drop_garbage_tables();
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
Sets an exclusive lock on a table.
|
Sets an exclusive lock on a table.
|
||||||
@return error code or DB_SUCCESS */
|
@return error code or DB_SUCCESS */
|
||||||
|
@ -3462,6 +3462,8 @@ recv_recovery_rollback_active(void)
|
|||||||
|
|
||||||
/* Drop partially created indexes. */
|
/* Drop partially created indexes. */
|
||||||
row_merge_drop_temp_indexes();
|
row_merge_drop_temp_indexes();
|
||||||
|
/* Drop garbage tables. */
|
||||||
|
row_mysql_drop_garbage_tables();
|
||||||
|
|
||||||
/* Drop any auxiliary tables that were not dropped when the
|
/* Drop any auxiliary tables that were not dropped when the
|
||||||
parent table was dropped. This can happen if the parent table
|
parent table was dropped. This can happen if the parent table
|
||||||
|
@ -64,6 +64,7 @@ Created 9/17/2000 Heikki Tuuri
|
|||||||
#include "trx0roll.h"
|
#include "trx0roll.h"
|
||||||
#include "trx0undo.h"
|
#include "trx0undo.h"
|
||||||
#include "row0ext.h"
|
#include "row0ext.h"
|
||||||
|
#include "srv0start.h"
|
||||||
#include "ut0new.h"
|
#include "ut0new.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -75,7 +76,7 @@ ibool row_rollback_on_timeout = FALSE;
|
|||||||
|
|
||||||
/** Chain node of the list of tables to drop in the background. */
|
/** Chain node of the list of tables to drop in the background. */
|
||||||
struct row_mysql_drop_t{
|
struct row_mysql_drop_t{
|
||||||
char* table_name; /*!< table name */
|
table_id_t table_id; /*!< table id */
|
||||||
UT_LIST_NODE_T(row_mysql_drop_t)row_mysql_drop_list;
|
UT_LIST_NODE_T(row_mysql_drop_t)row_mysql_drop_list;
|
||||||
/*!< list chain node */
|
/*!< list chain node */
|
||||||
};
|
};
|
||||||
@ -112,19 +113,6 @@ row_mysql_is_system_table(
|
|||||||
|| 0 == strcmp(name + 6, "db"));
|
|| 0 == strcmp(name + 6, "db"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************//**
|
|
||||||
If a table is not yet in the drop list, adds the table to the list of tables
|
|
||||||
which the master thread drops in background. We need this on Unix because in
|
|
||||||
ALTER TABLE MySQL may call drop table even if the table has running queries on
|
|
||||||
it. Also, if there are running foreign key checks on the table, we drop the
|
|
||||||
table lazily.
|
|
||||||
@return TRUE if the table was not yet in the drop list, and was added there */
|
|
||||||
static
|
|
||||||
ibool
|
|
||||||
row_add_table_to_background_drop_list(
|
|
||||||
/*==================================*/
|
|
||||||
const char* name); /*!< in: table name */
|
|
||||||
|
|
||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
/** Wait for the background drop list to become empty. */
|
/** Wait for the background drop list to become empty. */
|
||||||
void
|
void
|
||||||
@ -2791,12 +2779,6 @@ row_drop_table_for_mysql_in_background(
|
|||||||
|
|
||||||
error = row_drop_table_for_mysql(name, trx, FALSE, FALSE);
|
error = row_drop_table_for_mysql(name, trx, FALSE, FALSE);
|
||||||
|
|
||||||
/* Flush the log to reduce probability that the .frm files and
|
|
||||||
the InnoDB data dictionary get out-of-sync if the user runs
|
|
||||||
with innodb_flush_log_at_trx_commit = 0 */
|
|
||||||
|
|
||||||
log_buffer_flush_to_disk();
|
|
||||||
|
|
||||||
trx_commit_for_mysql(trx);
|
trx_commit_for_mysql(trx);
|
||||||
|
|
||||||
trx_free_for_background(trx);
|
trx_free_for_background(trx);
|
||||||
@ -2821,7 +2803,7 @@ loop:
|
|||||||
mutex_enter(&row_drop_list_mutex);
|
mutex_enter(&row_drop_list_mutex);
|
||||||
|
|
||||||
ut_a(row_mysql_drop_list_inited);
|
ut_a(row_mysql_drop_list_inited);
|
||||||
|
next:
|
||||||
drop = UT_LIST_GET_FIRST(row_mysql_drop_list);
|
drop = UT_LIST_GET_FIRST(row_mysql_drop_list);
|
||||||
|
|
||||||
n_tables = UT_LIST_GET_LEN(row_mysql_drop_list);
|
n_tables = UT_LIST_GET_LEN(row_mysql_drop_list);
|
||||||
@ -2834,61 +2816,41 @@ loop:
|
|||||||
return(n_tables + n_tables_dropped);
|
return(n_tables + n_tables_dropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("row_drop_tables_in_background_sleep",
|
/* On fast shutdown, just empty the list without dropping tables. */
|
||||||
os_thread_sleep(5000000);
|
table = srv_shutdown_state == SRV_SHUTDOWN_NONE || !srv_fast_shutdown
|
||||||
);
|
? dict_table_open_on_id(drop->table_id, FALSE,
|
||||||
|
DICT_TABLE_OP_OPEN_ONLY_IF_CACHED)
|
||||||
|
: NULL;
|
||||||
|
|
||||||
table = dict_table_open_on_name(drop->table_name, FALSE, FALSE,
|
if (!table) {
|
||||||
DICT_ERR_IGNORE_NONE);
|
n_tables_dropped++;
|
||||||
|
mutex_enter(&row_drop_list_mutex);
|
||||||
if (table == NULL) {
|
UT_LIST_REMOVE(row_mysql_drop_list, drop);
|
||||||
/* If for some reason the table has already been dropped
|
MONITOR_DEC(MONITOR_BACKGROUND_DROP_TABLE);
|
||||||
through some other mechanism, do not try to drop it */
|
ut_free(drop);
|
||||||
|
goto next;
|
||||||
goto already_dropped;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!table->to_be_dropped) {
|
|
||||||
/* There is a scenario: the old table is dropped
|
|
||||||
just after it's added into drop list, and new
|
|
||||||
table with the same name is created, then we try
|
|
||||||
to drop the new table in background. */
|
|
||||||
dict_table_close(table, FALSE, FALSE);
|
|
||||||
|
|
||||||
goto already_dropped;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_a(!table->can_be_evicted);
|
ut_a(!table->can_be_evicted);
|
||||||
|
|
||||||
|
if (!table->to_be_dropped) {
|
||||||
|
dict_table_close(table, FALSE, FALSE);
|
||||||
|
|
||||||
|
mutex_enter(&row_drop_list_mutex);
|
||||||
|
UT_LIST_REMOVE(row_mysql_drop_list, drop);
|
||||||
|
UT_LIST_ADD_LAST(row_mysql_drop_list, drop);
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
dict_table_close(table, FALSE, FALSE);
|
dict_table_close(table, FALSE, FALSE);
|
||||||
|
|
||||||
if (DB_SUCCESS != row_drop_table_for_mysql_in_background(
|
if (DB_SUCCESS != row_drop_table_for_mysql_in_background(
|
||||||
drop->table_name)) {
|
table->name.m_name)) {
|
||||||
/* If the DROP fails for some table, we return, and let the
|
/* If the DROP fails for some table, we return, and let the
|
||||||
main thread retry later */
|
main thread retry later */
|
||||||
|
|
||||||
return(n_tables + n_tables_dropped);
|
return(n_tables + n_tables_dropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
n_tables_dropped++;
|
|
||||||
|
|
||||||
already_dropped:
|
|
||||||
mutex_enter(&row_drop_list_mutex);
|
|
||||||
|
|
||||||
UT_LIST_REMOVE(row_mysql_drop_list, drop);
|
|
||||||
|
|
||||||
MONITOR_DEC(MONITOR_BACKGROUND_DROP_TABLE);
|
|
||||||
|
|
||||||
ib::info() << "Dropped table "
|
|
||||||
<< ut_get_name(NULL, drop->table_name)
|
|
||||||
<< " in background drop queue.",
|
|
||||||
|
|
||||||
ut_free(drop->table_name);
|
|
||||||
|
|
||||||
ut_free(drop);
|
|
||||||
|
|
||||||
mutex_exit(&row_drop_list_mutex);
|
|
||||||
|
|
||||||
goto loop;
|
goto loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2913,20 +2875,87 @@ row_get_background_drop_list_len_low(void)
|
|||||||
return(len);
|
return(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Drop garbage tables during recovery. */
|
||||||
|
void
|
||||||
|
row_mysql_drop_garbage_tables()
|
||||||
|
{
|
||||||
|
mem_heap_t* heap = mem_heap_create(FN_REFLEN);
|
||||||
|
btr_pcur_t pcur;
|
||||||
|
mtr_t mtr;
|
||||||
|
trx_t* trx = trx_allocate_for_background();
|
||||||
|
trx->op_info = "dropping garbage tables";
|
||||||
|
row_mysql_lock_data_dictionary(trx);
|
||||||
|
|
||||||
|
mtr.start();
|
||||||
|
btr_pcur_open_at_index_side(
|
||||||
|
true, dict_table_get_first_index(dict_sys->sys_tables),
|
||||||
|
BTR_SEARCH_LEAF, &pcur, true, 0, &mtr);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
const rec_t* rec;
|
||||||
|
const byte* field;
|
||||||
|
ulint len;
|
||||||
|
const char* table_name;
|
||||||
|
|
||||||
|
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
||||||
|
|
||||||
|
if (!btr_pcur_is_on_user_rec(&pcur)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rec = btr_pcur_get_rec(&pcur);
|
||||||
|
if (rec_get_deleted_flag(rec, 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
field = rec_get_nth_field_old(rec, 0/*NAME*/, &len);
|
||||||
|
if (len == UNIV_SQL_NULL || len == 0) {
|
||||||
|
/* Corrupted SYS_TABLES.NAME */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
table_name = mem_heap_strdupl(
|
||||||
|
heap,
|
||||||
|
reinterpret_cast<const char*>(field), len);
|
||||||
|
if (strstr(table_name, "/" TEMP_FILE_PREFIX_INNODB)) {
|
||||||
|
btr_pcur_store_position(&pcur, &mtr);
|
||||||
|
btr_pcur_commit_specify_mtr(&pcur, &mtr);
|
||||||
|
|
||||||
|
if (dict_load_table(table_name, true,
|
||||||
|
DICT_ERR_IGNORE_ALL)) {
|
||||||
|
row_drop_table_for_mysql(
|
||||||
|
table_name, trx, FALSE, FALSE);
|
||||||
|
trx_commit_for_mysql(trx);
|
||||||
|
}
|
||||||
|
|
||||||
|
mtr.start();
|
||||||
|
btr_pcur_restore_position(BTR_SEARCH_LEAF,
|
||||||
|
&pcur, &mtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
mem_heap_empty(heap);
|
||||||
|
}
|
||||||
|
|
||||||
|
btr_pcur_close(&pcur);
|
||||||
|
mtr.commit();
|
||||||
|
row_mysql_unlock_data_dictionary(trx);
|
||||||
|
trx_free_for_background(trx);
|
||||||
|
mem_heap_free(heap);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
If a table is not yet in the drop list, adds the table to the list of tables
|
If a table is not yet in the drop list, adds the table to the list of tables
|
||||||
which the master thread drops in background. We need this on Unix because in
|
which the master thread drops in background. We need this on Unix because in
|
||||||
ALTER TABLE MySQL may call drop table even if the table has running queries on
|
ALTER TABLE MySQL may call drop table even if the table has running queries on
|
||||||
it. Also, if there are running foreign key checks on the table, we drop the
|
it. Also, if there are running foreign key checks on the table, we drop the
|
||||||
table lazily.
|
table lazily.
|
||||||
@return TRUE if the table was not yet in the drop list, and was added there */
|
@return whether background DROP TABLE was scheduled for the first time */
|
||||||
static
|
static
|
||||||
ibool
|
bool
|
||||||
row_add_table_to_background_drop_list(
|
row_add_table_to_background_drop_list(table_id_t table_id)
|
||||||
/*==================================*/
|
|
||||||
const char* name) /*!< in: table name */
|
|
||||||
{
|
{
|
||||||
row_mysql_drop_t* drop;
|
row_mysql_drop_t* drop;
|
||||||
|
bool added = true;
|
||||||
|
|
||||||
mutex_enter(&row_drop_list_mutex);
|
mutex_enter(&row_drop_list_mutex);
|
||||||
|
|
||||||
@ -2937,27 +2966,21 @@ row_add_table_to_background_drop_list(
|
|||||||
drop != NULL;
|
drop != NULL;
|
||||||
drop = UT_LIST_GET_NEXT(row_mysql_drop_list, drop)) {
|
drop = UT_LIST_GET_NEXT(row_mysql_drop_list, drop)) {
|
||||||
|
|
||||||
if (strcmp(drop->table_name, name) == 0) {
|
if (drop->table_id == table_id) {
|
||||||
/* Already in the list */
|
added = false;
|
||||||
|
goto func_exit;
|
||||||
mutex_exit(&row_drop_list_mutex);
|
|
||||||
|
|
||||||
return(FALSE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drop = static_cast<row_mysql_drop_t*>(
|
drop = static_cast<row_mysql_drop_t*>(ut_malloc_nokey(sizeof *drop));
|
||||||
ut_malloc_nokey(sizeof(row_mysql_drop_t)));
|
drop->table_id = table_id;
|
||||||
|
|
||||||
drop->table_name = mem_strdup(name);
|
|
||||||
|
|
||||||
UT_LIST_ADD_LAST(row_mysql_drop_list, drop);
|
UT_LIST_ADD_LAST(row_mysql_drop_list, drop);
|
||||||
|
|
||||||
MONITOR_INC(MONITOR_BACKGROUND_DROP_TABLE);
|
MONITOR_INC(MONITOR_BACKGROUND_DROP_TABLE);
|
||||||
|
func_exit:
|
||||||
mutex_exit(&row_drop_list_mutex);
|
mutex_exit(&row_drop_list_mutex);
|
||||||
|
return added;
|
||||||
return(TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reassigns the table identifier of a table.
|
/** Reassigns the table identifier of a table.
|
||||||
@ -3690,11 +3713,7 @@ row_drop_table_for_mysql(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("row_drop_table_add_to_background",
|
DBUG_EXECUTE_IF("row_drop_table_add_to_background", goto defer;);
|
||||||
row_add_table_to_background_drop_list(table->name.m_name);
|
|
||||||
err = DB_SUCCESS;
|
|
||||||
goto funct_exit;
|
|
||||||
);
|
|
||||||
|
|
||||||
/* TODO: could we replace the counter n_foreign_key_checks_running
|
/* TODO: could we replace the counter n_foreign_key_checks_running
|
||||||
with lock checks on the table? Acquire here an exclusive lock on the
|
with lock checks on the table? Acquire here an exclusive lock on the
|
||||||
@ -3703,28 +3722,22 @@ row_drop_table_for_mysql(
|
|||||||
checks take an IS or IX lock on the table. */
|
checks take an IS or IX lock on the table. */
|
||||||
|
|
||||||
if (table->n_foreign_key_checks_running > 0) {
|
if (table->n_foreign_key_checks_running > 0) {
|
||||||
|
defer:
|
||||||
const char* save_tablename = table->name.m_name;
|
if (!strstr(table->name.m_name, "/" TEMP_FILE_PREFIX_INNODB)) {
|
||||||
ibool added;
|
heap = mem_heap_create(FN_REFLEN);
|
||||||
|
const char* tmp_name
|
||||||
added = row_add_table_to_background_drop_list(save_tablename);
|
= dict_mem_create_temporary_tablename(
|
||||||
|
heap, table->name.m_name, table->id);
|
||||||
if (added) {
|
ib::info() << "Deferring DROP TABLE " << table->name
|
||||||
ib::info() << "You are trying to drop table "
|
<< "; renaming to " << tmp_name;
|
||||||
<< table->name
|
err = row_rename_table_for_mysql(
|
||||||
<< " though there is a foreign key check"
|
table->name.m_name, tmp_name, trx, false);
|
||||||
" running on it. Adding the table to the"
|
|
||||||
" background drop queue.";
|
|
||||||
|
|
||||||
/* We return DB_SUCCESS to MySQL though the drop will
|
|
||||||
happen lazily later */
|
|
||||||
|
|
||||||
err = DB_SUCCESS;
|
|
||||||
} else {
|
} else {
|
||||||
/* The table is already in the background drop list */
|
err = DB_SUCCESS;
|
||||||
err = DB_ERROR;
|
}
|
||||||
|
if (err == DB_SUCCESS) {
|
||||||
|
row_add_table_to_background_drop_list(table->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto funct_exit;
|
goto funct_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3745,31 +3758,9 @@ row_drop_table_for_mysql(
|
|||||||
/* Wait on background threads to stop using table */
|
/* Wait on background threads to stop using table */
|
||||||
fil_wait_crypt_bg_threads(table);
|
fil_wait_crypt_bg_threads(table);
|
||||||
|
|
||||||
if (table->get_ref_count() == 0) {
|
if (table->get_ref_count() > 0 || table->n_rec_locks > 0
|
||||||
lock_remove_all_on_table(table, TRUE);
|
|| lock_table_has_locks(table)) {
|
||||||
ut_a(table->n_rec_locks == 0);
|
goto defer;
|
||||||
} else if (table->get_ref_count() > 0 || table->n_rec_locks > 0) {
|
|
||||||
ibool added;
|
|
||||||
|
|
||||||
added = row_add_table_to_background_drop_list(
|
|
||||||
table->name.m_name);
|
|
||||||
|
|
||||||
if (added) {
|
|
||||||
ib::info() << "MySQL is trying to drop table "
|
|
||||||
<< table->name
|
|
||||||
<< " though there are still open handles to"
|
|
||||||
" it. Adding the table to the background drop"
|
|
||||||
" queue.";
|
|
||||||
|
|
||||||
/* We return DB_SUCCESS to MySQL though the drop will
|
|
||||||
happen lazily later */
|
|
||||||
err = DB_SUCCESS;
|
|
||||||
} else {
|
|
||||||
/* The table is already in the background drop list */
|
|
||||||
err = DB_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
goto funct_exit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The "to_be_dropped" marks table that is to be dropped, but
|
/* The "to_be_dropped" marks table that is to be dropped, but
|
||||||
@ -3779,11 +3770,6 @@ row_drop_table_for_mysql(
|
|||||||
and it is free to be dropped */
|
and it is free to be dropped */
|
||||||
table->to_be_dropped = false;
|
table->to_be_dropped = false;
|
||||||
|
|
||||||
/* If we get this far then the table to be dropped must not have
|
|
||||||
any table or record locks on it. */
|
|
||||||
|
|
||||||
ut_a(!lock_table_has_locks(table));
|
|
||||||
|
|
||||||
switch (trx_get_dict_operation(trx)) {
|
switch (trx_get_dict_operation(trx)) {
|
||||||
case TRX_DICT_OP_NONE:
|
case TRX_DICT_OP_NONE:
|
||||||
trx_set_dict_operation(trx, TRX_DICT_OP_TABLE);
|
trx_set_dict_operation(trx, TRX_DICT_OP_TABLE);
|
||||||
|
@ -5958,8 +5958,10 @@ rdb_is_index_collation_supported(const my_core::Field *const field) {
|
|||||||
/* Handle [VAR](CHAR|BINARY) or TEXT|BLOB */
|
/* Handle [VAR](CHAR|BINARY) or TEXT|BLOB */
|
||||||
if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_STRING ||
|
if (type == MYSQL_TYPE_VARCHAR || type == MYSQL_TYPE_STRING ||
|
||||||
type == MYSQL_TYPE_BLOB) {
|
type == MYSQL_TYPE_BLOB) {
|
||||||
return RDB_INDEX_COLLATIONS.find(field->charset()->number) !=
|
|
||||||
RDB_INDEX_COLLATIONS.end();
|
return (RDB_INDEX_COLLATIONS.find(field->charset()->number) !=
|
||||||
|
RDB_INDEX_COLLATIONS.end()) ||
|
||||||
|
rdb_is_collation_supported(field->charset());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -6118,18 +6120,16 @@ int ha_rocksdb::create_cfs(
|
|||||||
!rdb_is_index_collation_supported(
|
!rdb_is_index_collation_supported(
|
||||||
table_arg->key_info[i].key_part[part].field) &&
|
table_arg->key_info[i].key_part[part].field) &&
|
||||||
!rdb_collation_exceptions->matches(tablename_sys)) {
|
!rdb_collation_exceptions->matches(tablename_sys)) {
|
||||||
std::string collation_err;
|
|
||||||
for (const auto &coll : RDB_INDEX_COLLATIONS) {
|
char buf[1024];
|
||||||
if (collation_err != "") {
|
my_snprintf(buf, sizeof(buf),
|
||||||
collation_err += ", ";
|
"Indexed column %s.%s uses a collation that does not "
|
||||||
}
|
"allow index-only access in secondary key and has "
|
||||||
collation_err += get_charset_name(coll);
|
"reduced disk space efficiency in primary key.",
|
||||||
}
|
|
||||||
my_error(ER_UNSUPPORTED_COLLATION, MYF(0),
|
|
||||||
tbl_def_arg->full_tablename().c_str(),
|
tbl_def_arg->full_tablename().c_str(),
|
||||||
table_arg->key_info[i].key_part[part].field->field_name.str,
|
table_arg->key_info[i].key_part[part].field->field_name.str);
|
||||||
collation_err.c_str());
|
|
||||||
DBUG_RETURN(HA_EXIT_FAILURE);
|
my_error(ER_INTERNAL_ERROR, MYF(ME_JUST_WARNING), buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -12338,6 +12338,7 @@ void rocksdb_set_update_cf_options(THD *const /* unused */,
|
|||||||
// Basic sanity checking and parsing the options into a map. If this fails
|
// Basic sanity checking and parsing the options into a map. If this fails
|
||||||
// then there's no point to proceed.
|
// then there's no point to proceed.
|
||||||
if (!Rdb_cf_options::parse_cf_options(val, &option_map)) {
|
if (!Rdb_cf_options::parse_cf_options(val, &option_map)) {
|
||||||
|
my_free(*reinterpret_cast<char**>(var_ptr));
|
||||||
*reinterpret_cast<char**>(var_ptr) = nullptr;
|
*reinterpret_cast<char**>(var_ptr) = nullptr;
|
||||||
|
|
||||||
// NO_LINT_DEBUG
|
// NO_LINT_DEBUG
|
||||||
@ -12406,6 +12407,7 @@ void rocksdb_set_update_cf_options(THD *const /* unused */,
|
|||||||
// the CF options. This will results in consistent behavior and avoids
|
// the CF options. This will results in consistent behavior and avoids
|
||||||
// dealing with cases when only a subset of CF-s was successfully updated.
|
// dealing with cases when only a subset of CF-s was successfully updated.
|
||||||
if (val) {
|
if (val) {
|
||||||
|
my_free(*reinterpret_cast<char**>(var_ptr));
|
||||||
*reinterpret_cast<char**>(var_ptr) = my_strdup(val, MYF(0));
|
*reinterpret_cast<char**>(var_ptr) = my_strdup(val, MYF(0));
|
||||||
} else {
|
} else {
|
||||||
*reinterpret_cast<char**>(var_ptr) = nullptr;
|
*reinterpret_cast<char**>(var_ptr) = nullptr;
|
||||||
@ -12500,6 +12502,7 @@ void print_keydup_error(TABLE *table, KEY *key, myf errflag,
|
|||||||
its name generation.
|
its name generation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
struct st_mysql_storage_engine rocksdb_storage_engine = {
|
struct st_mysql_storage_engine rocksdb_storage_engine = {
|
||||||
MYSQL_HANDLERTON_INTERFACE_VERSION};
|
MYSQL_HANDLERTON_INTERFACE_VERSION};
|
||||||
|
|
||||||
@ -12516,7 +12519,7 @@ maria_declare_plugin(rocksdb_se){
|
|||||||
myrocks::rocksdb_status_vars, /* status variables */
|
myrocks::rocksdb_status_vars, /* status variables */
|
||||||
myrocks::rocksdb_system_variables, /* system variables */
|
myrocks::rocksdb_system_variables, /* system variables */
|
||||||
"1.0", /* string version */
|
"1.0", /* string version */
|
||||||
MariaDB_PLUGIN_MATURITY_ALPHA /* maturity */
|
myrocks::MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
},
|
},
|
||||||
myrocks::rdb_i_s_cfstats, myrocks::rdb_i_s_dbstats,
|
myrocks::rdb_i_s_cfstats, myrocks::rdb_i_s_dbstats,
|
||||||
myrocks::rdb_i_s_perf_context, myrocks::rdb_i_s_perf_context_global,
|
myrocks::rdb_i_s_perf_context, myrocks::rdb_i_s_perf_context_global,
|
||||||
|
@ -1411,4 +1411,7 @@ private:
|
|||||||
Rdb_inplace_alter_ctx(const Rdb_inplace_alter_ctx &);
|
Rdb_inplace_alter_ctx(const Rdb_inplace_alter_ctx &);
|
||||||
Rdb_inplace_alter_ctx &operator=(const Rdb_inplace_alter_ctx &);
|
Rdb_inplace_alter_ctx &operator=(const Rdb_inplace_alter_ctx &);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const int MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL= MariaDB_PLUGIN_MATURITY_ALPHA;
|
||||||
|
|
||||||
} // namespace myrocks
|
} // namespace myrocks
|
||||||
|
@ -279,8 +279,15 @@ DROP TABLE t1;
|
|||||||
set @tmp_rocksdb_strict_collation_check= @@rocksdb_strict_collation_check;
|
set @tmp_rocksdb_strict_collation_check= @@rocksdb_strict_collation_check;
|
||||||
set global rocksdb_strict_collation_check=1;
|
set global rocksdb_strict_collation_check=1;
|
||||||
CREATE TABLE t1 (a INT, b TEXT);
|
CREATE TABLE t1 (a INT, b TEXT);
|
||||||
|
# MariaDB no longer gives ER_UNSUPPORTED_COLLATION
|
||||||
ALTER TABLE t1 ADD KEY kb(b(10));
|
ALTER TABLE t1 ADD KEY kb(b(10));
|
||||||
ERROR HY000: Unsupported collation on string indexed column test.t1.b Use binary collation (latin1_bin, binary, utf8_bin).
|
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a INT, b TEXT collate utf8_general_ci);
|
||||||
|
# MariaDB no longer gives ER_UNSUPPORTED_COLLATION
|
||||||
|
ALTER TABLE t1 ADD KEY kb(b(10));
|
||||||
|
Warnings:
|
||||||
|
Warning 1815 Internal error: Indexed column test.t1.b uses a collation that does not allow index-only access in secondary key and has reduced disk space efficiency in primary key.
|
||||||
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
set global rocksdb_strict_collation_check= @tmp_rocksdb_strict_collation_check;
|
set global rocksdb_strict_collation_check= @tmp_rocksdb_strict_collation_check;
|
||||||
|
@ -64,3 +64,20 @@ set global rocksdb_strict_collation_check=off;
|
|||||||
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
|
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
|
||||||
ERROR HY000: MyRocks doesn't currently support collations with "No pad" attribute.
|
ERROR HY000: MyRocks doesn't currently support collations with "No pad" attribute.
|
||||||
set global rocksdb_strict_collation_check=@tmp_rscc;
|
set global rocksdb_strict_collation_check=@tmp_rscc;
|
||||||
|
#
|
||||||
|
# MDEV-14679: RocksdB plugin fails to load with "Loading of unknown plugin ROCKSDB_CFSTATS
|
||||||
|
#
|
||||||
|
select plugin_name, plugin_maturity from information_schema.plugins where plugin_name like '%rocksdb%';
|
||||||
|
plugin_name plugin_maturity
|
||||||
|
ROCKSDB Alpha
|
||||||
|
ROCKSDB_CFSTATS Alpha
|
||||||
|
ROCKSDB_DBSTATS Alpha
|
||||||
|
ROCKSDB_PERF_CONTEXT Alpha
|
||||||
|
ROCKSDB_PERF_CONTEXT_GLOBAL Alpha
|
||||||
|
ROCKSDB_CF_OPTIONS Alpha
|
||||||
|
ROCKSDB_COMPACTION_STATS Alpha
|
||||||
|
ROCKSDB_GLOBAL_INFO Alpha
|
||||||
|
ROCKSDB_DDL Alpha
|
||||||
|
ROCKSDB_INDEX_FILE_MAP Alpha
|
||||||
|
ROCKSDB_LOCKS Alpha
|
||||||
|
ROCKSDB_TRX Alpha
|
||||||
|
@ -173,10 +173,17 @@ set @tmp_rocksdb_strict_collation_check= @@rocksdb_strict_collation_check;
|
|||||||
set global rocksdb_strict_collation_check=1;
|
set global rocksdb_strict_collation_check=1;
|
||||||
CREATE TABLE t1 (a INT, b TEXT);
|
CREATE TABLE t1 (a INT, b TEXT);
|
||||||
|
|
||||||
--error ER_UNSUPPORTED_COLLATION
|
--echo # MariaDB no longer gives ER_UNSUPPORTED_COLLATION
|
||||||
ALTER TABLE t1 ADD KEY kb(b(10));
|
ALTER TABLE t1 ADD KEY kb(b(10));
|
||||||
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b TEXT collate utf8_general_ci);
|
||||||
|
--echo # MariaDB no longer gives ER_UNSUPPORTED_COLLATION
|
||||||
|
ALTER TABLE t1 ADD KEY kb(b(10));
|
||||||
|
ALTER TABLE t1 ADD PRIMARY KEY(a);
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
set global rocksdb_strict_collation_check= @tmp_rocksdb_strict_collation_check;
|
set global rocksdb_strict_collation_check= @tmp_rocksdb_strict_collation_check;
|
||||||
|
|
||||||
# make sure race condition between connection close and alter on another
|
# make sure race condition between connection close and alter on another
|
||||||
|
@ -67,3 +67,9 @@ set global rocksdb_strict_collation_check=off;
|
|||||||
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
|
create table t1 (pk varchar(10) collate latin1_nopad_bin, primary key(pk)) engine=rocksdb;
|
||||||
|
|
||||||
set global rocksdb_strict_collation_check=@tmp_rscc;
|
set global rocksdb_strict_collation_check=@tmp_rscc;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-14679: RocksdB plugin fails to load with "Loading of unknown plugin ROCKSDB_CFSTATS
|
||||||
|
--echo #
|
||||||
|
select plugin_name, plugin_maturity from information_schema.plugins where plugin_name like '%rocksdb%';
|
||||||
|
|
||||||
|
@ -2921,7 +2921,7 @@ std::array<const Rdb_collation_codec *, MY_ALL_CHARSETS_SIZE>
|
|||||||
rdb_collation_data;
|
rdb_collation_data;
|
||||||
mysql_mutex_t rdb_collation_data_mutex;
|
mysql_mutex_t rdb_collation_data_mutex;
|
||||||
|
|
||||||
static bool rdb_is_collation_supported(const my_core::CHARSET_INFO *const cs) {
|
bool rdb_is_collation_supported(const my_core::CHARSET_INFO *const cs) {
|
||||||
return cs->strxfrm_multiply==1 && cs->mbmaxlen == 1 &&
|
return cs->strxfrm_multiply==1 && cs->mbmaxlen == 1 &&
|
||||||
!(cs->state & (MY_CS_BINSORT | MY_CS_NOPAD));
|
!(cs->state & (MY_CS_BINSORT | MY_CS_NOPAD));
|
||||||
}
|
}
|
||||||
|
@ -1362,4 +1362,6 @@ struct Rdb_index_info {
|
|||||||
uint64 m_ttl_duration = 0;
|
uint64 m_ttl_duration = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool rdb_is_collation_supported(const my_core::CHARSET_INFO *const cs);
|
||||||
|
|
||||||
} // namespace myrocks
|
} // namespace myrocks
|
||||||
|
@ -1484,7 +1484,7 @@ struct st_maria_plugin rdb_i_s_cfstats = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_dbstats = {
|
struct st_maria_plugin rdb_i_s_dbstats = {
|
||||||
@ -1500,7 +1500,7 @@ struct st_maria_plugin rdb_i_s_dbstats = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_perf_context = {
|
struct st_maria_plugin rdb_i_s_perf_context = {
|
||||||
@ -1516,7 +1516,7 @@ struct st_maria_plugin rdb_i_s_perf_context = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_perf_context_global = {
|
struct st_maria_plugin rdb_i_s_perf_context_global = {
|
||||||
@ -1532,7 +1532,7 @@ struct st_maria_plugin rdb_i_s_perf_context_global = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_cfoptions = {
|
struct st_maria_plugin rdb_i_s_cfoptions = {
|
||||||
@ -1548,7 +1548,7 @@ struct st_maria_plugin rdb_i_s_cfoptions = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_global_info = {
|
struct st_maria_plugin rdb_i_s_global_info = {
|
||||||
@ -1564,7 +1564,7 @@ struct st_maria_plugin rdb_i_s_global_info = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_compact_stats = {
|
struct st_maria_plugin rdb_i_s_compact_stats = {
|
||||||
@ -1580,7 +1580,7 @@ struct st_maria_plugin rdb_i_s_compact_stats = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_ddl = {
|
struct st_maria_plugin rdb_i_s_ddl = {
|
||||||
@ -1596,7 +1596,7 @@ struct st_maria_plugin rdb_i_s_ddl = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_index_file_map = {
|
struct st_maria_plugin rdb_i_s_index_file_map = {
|
||||||
@ -1612,7 +1612,7 @@ struct st_maria_plugin rdb_i_s_index_file_map = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_lock_info = {
|
struct st_maria_plugin rdb_i_s_lock_info = {
|
||||||
@ -1628,7 +1628,7 @@ struct st_maria_plugin rdb_i_s_lock_info = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_maria_plugin rdb_i_s_trx_info = {
|
struct st_maria_plugin rdb_i_s_trx_info = {
|
||||||
@ -1644,6 +1644,6 @@ struct st_maria_plugin rdb_i_s_trx_info = {
|
|||||||
nullptr, /* status variables */
|
nullptr, /* status variables */
|
||||||
nullptr, /* system variables */
|
nullptr, /* system variables */
|
||||||
nullptr, /* config options */
|
nullptr, /* config options */
|
||||||
0, /* flags */
|
MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL
|
||||||
};
|
};
|
||||||
} // namespace myrocks
|
} // namespace myrocks
|
||||||
|
@ -4,13 +4,17 @@ IF(CMAKE_VERSION VERSION_LESS "2.8.9")
|
|||||||
MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB")
|
MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB")
|
||||||
ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
|
ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
|
||||||
CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64")
|
CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64")
|
||||||
# tokudb requires F_NOCACHE, O_DIRECT, and designated initializers
|
# tokudb requires F_NOCACHE or O_DIRECT, and designated initializers
|
||||||
CHECK_CXX_SOURCE_COMPILES(
|
CHECK_CXX_SOURCE_COMPILES(
|
||||||
"
|
"
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
struct a {int b; int c; };
|
struct a {int b; int c; };
|
||||||
struct a d = { .b=1, .c=2 };
|
struct a d = { .b=1, .c=2 };
|
||||||
int main() { return F_NOCACHE + O_DIRECT; }
|
#if defined(O_DIRECT) || defined(F_NOCACHE)
|
||||||
|
int main() { return 0; }
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
" TOKUDB_OK)
|
" TOKUDB_OK)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
@ -13,7 +13,9 @@
|
|||||||
# and probably others
|
# and probably others
|
||||||
|
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=MariaDB database server
|
Description=MariaDB @VERSION@ database server
|
||||||
|
Documentation=man:mysqld(8)
|
||||||
|
Documentation=https://mariadb.com/kb/en/library/systemd/
|
||||||
After=network.target
|
After=network.target
|
||||||
After=syslog.target
|
After=syslog.target
|
||||||
|
|
||||||
@ -76,7 +78,7 @@ ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
|
|||||||
|
|
||||||
# Start main service
|
# Start main service
|
||||||
# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
|
# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
|
||||||
# Use the [service] section and Environment="MYSQLD_OPTS=...".
|
# Use the [Service] section and Environment="MYSQLD_OPTS=...".
|
||||||
# This isn't a replacement for my.cnf.
|
# This isn't a replacement for my.cnf.
|
||||||
# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
|
# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
|
||||||
ExecStart=@sbindir@/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION
|
ExecStart=@sbindir@/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION
|
||||||
@ -103,7 +105,8 @@ UMask=007
|
|||||||
##
|
##
|
||||||
##
|
##
|
||||||
## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
|
## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
|
||||||
## and adding/setting the following will override this file's settings.
|
## and adding/setting the following under [Service] will override this file's
|
||||||
|
## settings.
|
||||||
|
|
||||||
# Useful options not previously available in [mysqld_safe]
|
# Useful options not previously available in [mysqld_safe]
|
||||||
|
|
||||||
|
@ -18,7 +18,9 @@
|
|||||||
# Inspired from https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-db/mysql-init-scripts/files/mysqld_at.service
|
# Inspired from https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-db/mysql-init-scripts/files/mysqld_at.service
|
||||||
|
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=MariaDB database server
|
Description=MariaDB @VERSION@ database server (multi-instance)
|
||||||
|
Documentation=man:mysqld(8)
|
||||||
|
Documentation=https://mariadb.com/kb/en/library/systemd/
|
||||||
After=network.target
|
After=network.target
|
||||||
After=syslog.target
|
After=syslog.target
|
||||||
|
|
||||||
@ -89,7 +91,7 @@ ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
|
|||||||
|
|
||||||
# Start main service
|
# Start main service
|
||||||
# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb@.service.d/MY_SPECIAL.conf
|
# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb@.service.d/MY_SPECIAL.conf
|
||||||
# Use the [service] section and Environment="MYSQLD_OPTS=...".
|
# Use the [Service] section and Environment="MYSQLD_OPTS=...".
|
||||||
# This isn't a replacement for my.cnf.
|
# This isn't a replacement for my.cnf.
|
||||||
# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
|
# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
|
||||||
|
|
||||||
@ -124,7 +126,8 @@ UMask=007
|
|||||||
##
|
##
|
||||||
##
|
##
|
||||||
## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
|
## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf
|
||||||
## and adding/setting the following will override this file's settings.
|
## and adding/setting the following below [Service] will override this file's
|
||||||
|
## settings.
|
||||||
|
|
||||||
# Useful options not previously available in [mysqld_safe]
|
# Useful options not previously available in [mysqld_safe]
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user