mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Merge 10.1 into 10.2
This commit is contained in:
@@ -2174,6 +2174,7 @@ static void print_xml_comment(FILE *xml_file, size_t len,
|
||||
case '-':
|
||||
if (*(comment_string + 1) == '-') /* Only one hyphen allowed. */
|
||||
break;
|
||||
/* fall through */
|
||||
default:
|
||||
fputc(*comment_string, xml_file);
|
||||
break;
|
||||
|
||||
@@ -30,4 +30,4 @@ ENDIF()
|
||||
IF(HAVE_CLMUL_INSTRUCTION)
|
||||
ADD_DEFINITIONS(-DHAVE_CLMUL_INSTRUCTION)
|
||||
ENDIF()
|
||||
ADD_LIBRARY(crc crc_glue.c crc-intel-pclmul.c)
|
||||
ADD_LIBRARY(crc STATIC crc_glue.c crc-intel-pclmul.c)
|
||||
|
||||
@@ -2169,7 +2169,7 @@ xb_write_delta_metadata(const char *filename, const xb_delta_info_t *info)
|
||||
void
|
||||
xtrabackup_io_throttling(void)
|
||||
{
|
||||
if (xtrabackup_throttle && (io_ticket--) < 0) {
|
||||
if (xtrabackup_backup && xtrabackup_throttle && (io_ticket--) < 0) {
|
||||
os_event_reset(wait_throttle);
|
||||
os_event_wait(wait_throttle);
|
||||
}
|
||||
@@ -3962,6 +3962,7 @@ xtrabackup_backup_func(void)
|
||||
mysql_data_home[0]=FN_CURLIB; // all paths are relative from here
|
||||
mysql_data_home[1]=0;
|
||||
|
||||
srv_n_purge_threads = 1;
|
||||
srv_read_only_mode = TRUE;
|
||||
|
||||
srv_backup_mode = TRUE;
|
||||
@@ -4650,6 +4651,7 @@ xtrabackup_stats_func(int argc, char **argv)
|
||||
mysql_data_home[0]=FN_CURLIB; // all paths are relative from here
|
||||
mysql_data_home[1]=0;
|
||||
|
||||
srv_n_purge_threads = 1;
|
||||
/* set read only */
|
||||
srv_read_only_mode = TRUE;
|
||||
|
||||
@@ -6407,6 +6409,7 @@ skip_check:
|
||||
|
||||
/* Create logfiles for recovery from 'xtrabackup_logfile', before start InnoDB */
|
||||
srv_max_n_threads = 1000;
|
||||
srv_n_purge_threads = 1;
|
||||
ut_mem_init();
|
||||
/* temporally dummy value to avoid crash */
|
||||
srv_page_size_shift = 14;
|
||||
|
||||
@@ -174,6 +174,7 @@ register char **argv[];
|
||||
break;
|
||||
case 'V':
|
||||
version=1;
|
||||
/* fall through */
|
||||
case 'I':
|
||||
case '?':
|
||||
help=1; /* Help text written */
|
||||
|
||||
@@ -949,6 +949,12 @@ extern ulonglong my_getcputime(void);
|
||||
#define hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION))
|
||||
#define my_time(X) hrtime_to_time(my_hrtime())
|
||||
|
||||
#if STACK_DIRECTION < 0
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END))
|
||||
#else
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR))
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_MMAN_H
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
||||
@@ -1404,7 +1404,7 @@ void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net)
|
||||
DBUG_ASSERT(stmt != 0);
|
||||
|
||||
stmt->last_errno= net->last_errno;
|
||||
if (net->last_error && net->last_error[0])
|
||||
if (net->last_error[0])
|
||||
strmov(stmt->last_error, net->last_error);
|
||||
strmov(stmt->sqlstate, net->sqlstate);
|
||||
|
||||
@@ -4707,8 +4707,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
|
||||
{
|
||||
uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
|
||||
|
||||
if ((rc= reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR)))
|
||||
return rc;
|
||||
reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR);
|
||||
|
||||
int4store(buff, stmt->stmt_id);
|
||||
if ((rc= stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt)))
|
||||
|
||||
@@ -880,3 +880,8 @@ SET @regCheck= '\\xE0\\x01';
|
||||
1
|
||||
# Testing workarond N3: This makes derivation of the subject string stronger (IMLICIT instead of COERCIBLE)
|
||||
SET NAMES latin1;
|
||||
SET @regCheck= '\\xE0\\x01';
|
||||
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
|
||||
CAST(0xE001 AS BINARY) REGEXP @regCheck
|
||||
1
|
||||
# MDEV-12420: Testing recursion overflow
|
||||
|
||||
@@ -29,3 +29,15 @@ Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1,t2;
|
||||
disconnect insertConn;
|
||||
call mtr.add_suppression("Index for table '.*test.t1\\.MYI' is corrupt; try to repair it");
|
||||
create table t1 (a int, index(a));
|
||||
lock tables t1 write;
|
||||
insert t1 values (1),(2),(1);
|
||||
set @old_dbug=@@debug_dbug;
|
||||
set debug_dbug='+d,mi_lock_database_failure';
|
||||
unlock tables;
|
||||
Warnings:
|
||||
Error 126 Index for table './test/t1.MYI' is corrupt; try to repair it
|
||||
Error 1030 Got error 22 "Invalid argument" from storage engine MyISAM
|
||||
set debug_dbug=@old_dbug;
|
||||
drop table t1;
|
||||
|
||||
30
mysql-test/suite/csv/read_only.result
Normal file
30
mysql-test/suite/csv/read_only.result
Normal file
@@ -0,0 +1,30 @@
|
||||
create table t1 (a int not null) engine=csv;
|
||||
insert t1 values (1),(2);
|
||||
flush tables;
|
||||
select * from information_schema.tables where table_schema='test';
|
||||
TABLE_CATALOG def
|
||||
TABLE_SCHEMA test
|
||||
TABLE_NAME t1
|
||||
TABLE_TYPE BASE TABLE
|
||||
ENGINE NULL
|
||||
VERSION NULL
|
||||
ROW_FORMAT NULL
|
||||
TABLE_ROWS NULL
|
||||
AVG_ROW_LENGTH NULL
|
||||
DATA_LENGTH NULL
|
||||
MAX_DATA_LENGTH NULL
|
||||
INDEX_LENGTH NULL
|
||||
DATA_FREE NULL
|
||||
AUTO_INCREMENT NULL
|
||||
CREATE_TIME NULL
|
||||
UPDATE_TIME NULL
|
||||
CHECK_TIME NULL
|
||||
TABLE_COLLATION NULL
|
||||
CHECKSUM NULL
|
||||
CREATE_OPTIONS NULL
|
||||
TABLE_COMMENT File './test/t1.CSM' not found (Errcode: 13 "Permission denied")
|
||||
Warnings:
|
||||
Level Warning
|
||||
Code 29
|
||||
Message File './test/t1.CSM' not found (Errcode: 13 "Permission denied")
|
||||
drop table t1;
|
||||
19
mysql-test/suite/csv/read_only.test
Normal file
19
mysql-test/suite/csv/read_only.test
Normal file
@@ -0,0 +1,19 @@
|
||||
#
|
||||
# MDEV-11883 MariaDB crashes with out-of-memory when query information_schema
|
||||
#
|
||||
source include/have_csv.inc;
|
||||
|
||||
let datadir=`select @@datadir`;
|
||||
|
||||
create table t1 (a int not null) engine=csv;
|
||||
insert t1 values (1),(2);
|
||||
flush tables;
|
||||
|
||||
chmod 0400 $datadir/test/t1.CSM;
|
||||
chmod 0400 $datadir/test/t1.CSV;
|
||||
|
||||
--replace_result $datadir ./
|
||||
query_vertical select * from information_schema.tables where table_schema='test';
|
||||
|
||||
drop table t1;
|
||||
|
||||
131
mysql-test/suite/innodb/include/innodb-page-compression.inc
Normal file
131
mysql-test/suite/innodb/include/innodb-page-compression.inc
Normal file
@@ -0,0 +1,131 @@
|
||||
--disable_warnings
|
||||
set global innodb_file_format = `Barracuda`;
|
||||
set global innodb_file_per_table = on;
|
||||
--enable_warnings
|
||||
|
||||
create table innodb_normal (c1 int not null auto_increment primary key, b char(200)) engine=innodb;
|
||||
create table innodb_page_compressed1 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=1;
|
||||
create table innodb_page_compressed2 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=2;
|
||||
create table innodb_page_compressed3 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=3;
|
||||
create table innodb_page_compressed4 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=4;
|
||||
create table innodb_page_compressed5 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=5;
|
||||
create table innodb_page_compressed6 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=6;
|
||||
create table innodb_page_compressed7 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=7;
|
||||
create table innodb_page_compressed8 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=8;
|
||||
create table innodb_page_compressed9 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=9;
|
||||
|
||||
--disable_query_log
|
||||
begin;
|
||||
let $i = 2000;
|
||||
while ($i)
|
||||
{
|
||||
insert into innodb_normal(b) values(REPEAT('Aa',50));
|
||||
insert into innodb_normal(b) values(REPEAT('a',100));
|
||||
insert into innodb_normal(b) values(REPEAT('b',100));
|
||||
insert into innodb_normal(b) values(REPEAT('0',100));
|
||||
insert into innodb_normal(b) values(REPEAT('1',100));
|
||||
dec $i;
|
||||
}
|
||||
|
||||
insert into innodb_page_compressed1 select * from innodb_normal;
|
||||
insert into innodb_page_compressed2 select * from innodb_normal;
|
||||
insert into innodb_page_compressed3 select * from innodb_normal;
|
||||
insert into innodb_page_compressed4 select * from innodb_normal;
|
||||
insert into innodb_page_compressed5 select * from innodb_normal;
|
||||
insert into innodb_page_compressed6 select * from innodb_normal;
|
||||
insert into innodb_page_compressed7 select * from innodb_normal;
|
||||
insert into innodb_page_compressed8 select * from innodb_normal;
|
||||
insert into innodb_page_compressed9 select * from innodb_normal;
|
||||
commit;
|
||||
--enable_query_log
|
||||
|
||||
select count(*) from innodb_page_compressed1;
|
||||
select count(*) from innodb_page_compressed3;
|
||||
select count(*) from innodb_page_compressed4;
|
||||
select count(*) from innodb_page_compressed5;
|
||||
select count(*) from innodb_page_compressed6;
|
||||
select count(*) from innodb_page_compressed6;
|
||||
select count(*) from innodb_page_compressed7;
|
||||
select count(*) from innodb_page_compressed8;
|
||||
select count(*) from innodb_page_compressed9;
|
||||
|
||||
#
|
||||
# Wait until pages are really compressed
|
||||
#
|
||||
let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $MYSQLD_DATADIR=`select @@datadir`
|
||||
|
||||
# shutdown before grep
|
||||
|
||||
--source include/shutdown_mysqld.inc
|
||||
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_normal.ibd
|
||||
--let SEARCH_RANGE = 10000000
|
||||
--let SEARCH_PATTERN=AaAaAaAa
|
||||
--echo # innodb_normal expected FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed1.ibd
|
||||
--echo # innodb_page_compressed1 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed2.ibd
|
||||
--echo # innodb_page_compressed2 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed3.ibd
|
||||
--echo # innodb_page_compressed3 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed4.ibd
|
||||
--echo # innodb_page_compressed4 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed5.ibd
|
||||
--echo # innodb_page_compressed5 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed6.ibd
|
||||
--echo # innodb_page_compressed6 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed7.ibd
|
||||
--echo # innodb_page_compressed7 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed8.ibd
|
||||
--echo # innodb_page_compressed8 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/innodb_page_compressed9.ibd
|
||||
--echo # innodb_page_compressed9 page compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
|
||||
-- source include/start_mysqld.inc
|
||||
|
||||
select count(*) from innodb_page_compressed1;
|
||||
select count(*) from innodb_page_compressed3;
|
||||
select count(*) from innodb_page_compressed4;
|
||||
select count(*) from innodb_page_compressed5;
|
||||
select count(*) from innodb_page_compressed6;
|
||||
select count(*) from innodb_page_compressed6;
|
||||
select count(*) from innodb_page_compressed7;
|
||||
select count(*) from innodb_page_compressed8;
|
||||
select count(*) from innodb_page_compressed9;
|
||||
|
||||
let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_DECOMPRESSED';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
drop table innodb_normal;
|
||||
drop table innodb_page_compressed1;
|
||||
drop table innodb_page_compressed2;
|
||||
drop table innodb_page_compressed3;
|
||||
drop table innodb_page_compressed4;
|
||||
drop table innodb_page_compressed5;
|
||||
drop table innodb_page_compressed6;
|
||||
drop table innodb_page_compressed7;
|
||||
drop table innodb_page_compressed8;
|
||||
drop table innodb_page_compressed9;
|
||||
@@ -1,20 +1,98 @@
|
||||
SET GLOBAL innodb_file_format = `Barracuda`;
|
||||
SET GLOBAL innodb_file_per_table = ON;
|
||||
create table t1 (c1 int not null primary key auto_increment, b char(200)) engine=innodb page_compressed=1;
|
||||
insert into t1 values(NULL,'compressed_text_aaaaaaaaabbbbbbbbbbbbbccccccccccccc');
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
# t1 compressed expected NOT FOUND
|
||||
NOT FOUND /compressed_text/ in t1.ibd
|
||||
drop table t1;
|
||||
call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+.");
|
||||
set global innodb_file_format = `Barracuda`;
|
||||
set global innodb_file_per_table = on;
|
||||
create table innodb_normal (c1 int not null auto_increment primary key, b char(200)) engine=innodb;
|
||||
create table innodb_page_compressed1 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=1;
|
||||
create table innodb_page_compressed2 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=2;
|
||||
create table innodb_page_compressed3 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=3;
|
||||
create table innodb_page_compressed4 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=4;
|
||||
create table innodb_page_compressed5 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=5;
|
||||
create table innodb_page_compressed6 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=6;
|
||||
create table innodb_page_compressed7 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=7;
|
||||
create table innodb_page_compressed8 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=8;
|
||||
create table innodb_page_compressed9 (c1 int not null auto_increment primary key, b char(200)) engine=innodb page_compressed=1 page_compression_level=9;
|
||||
select count(*) from innodb_page_compressed1;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed3;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed4;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed5;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed6;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed6;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed7;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed8;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed9;
|
||||
count(*)
|
||||
10000
|
||||
# innodb_normal expected FOUND
|
||||
FOUND 24084 /AaAaAaAa/ in innodb_normal.ibd
|
||||
# innodb_page_compressed1 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed1.ibd
|
||||
# innodb_page_compressed2 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed2.ibd
|
||||
# innodb_page_compressed3 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed3.ibd
|
||||
# innodb_page_compressed4 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed4.ibd
|
||||
# innodb_page_compressed5 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed5.ibd
|
||||
# innodb_page_compressed6 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed6.ibd
|
||||
# innodb_page_compressed7 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed7.ibd
|
||||
# innodb_page_compressed8 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed8.ibd
|
||||
# innodb_page_compressed9 page compressed expected NOT FOUND
|
||||
NOT FOUND /AaAaAaAa/ in innodb_page_compressed9.ibd
|
||||
select count(*) from innodb_page_compressed1;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed3;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed4;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed5;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed6;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed6;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed7;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed8;
|
||||
count(*)
|
||||
10000
|
||||
select count(*) from innodb_page_compressed9;
|
||||
count(*)
|
||||
10000
|
||||
drop table innodb_normal;
|
||||
drop table innodb_page_compressed1;
|
||||
drop table innodb_page_compressed2;
|
||||
drop table innodb_page_compressed3;
|
||||
drop table innodb_page_compressed4;
|
||||
drop table innodb_page_compressed5;
|
||||
drop table innodb_page_compressed6;
|
||||
drop table innodb_page_compressed7;
|
||||
drop table innodb_page_compressed8;
|
||||
drop table innodb_page_compressed9;
|
||||
#done
|
||||
|
||||
@@ -1,51 +1,10 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--disable_query_log
|
||||
let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`;
|
||||
let $innodb_file_format_orig = `SELECT @@innodb_file_format`;
|
||||
let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`;
|
||||
--enable_query_log
|
||||
call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+.");
|
||||
|
||||
--disable_warnings
|
||||
SET GLOBAL innodb_file_format = `Barracuda`;
|
||||
SET GLOBAL innodb_file_per_table = ON;
|
||||
--enable_warnings
|
||||
# All page compression test use the same
|
||||
--source include/innodb-page-compression.inc
|
||||
|
||||
create table t1 (c1 int not null primary key auto_increment, b char(200)) engine=innodb page_compressed=1;
|
||||
insert into t1 values(NULL,'compressed_text_aaaaaaaaabbbbbbbbbbbbbccccccccccccc');
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
insert into t1(b) select b from t1;
|
||||
-- echo #done
|
||||
|
||||
let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $MYSQLD_DATADIR=`select @@datadir`
|
||||
--let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd
|
||||
--let SEARCH_RANGE = 10000000
|
||||
--let SEARCH_PATTERN=compressed_text
|
||||
|
||||
--echo # t1 compressed expected NOT FOUND
|
||||
-- let SEARCH_FILE=$t1_IBD
|
||||
-- source include/search_pattern_in_file.inc
|
||||
|
||||
drop table t1;
|
||||
|
||||
# reset system
|
||||
--disable_query_log
|
||||
--disable_warnings
|
||||
EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig;
|
||||
EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig;
|
||||
EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig;
|
||||
--enable_warnings
|
||||
--enable_query_log
|
||||
|
||||
@@ -7,7 +7,7 @@ shutdown_server;
|
||||
echo # remove datadir;
|
||||
rmdir $_datadir;
|
||||
echo # xtrabackup move back;
|
||||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$_datadir --target-dir=$targetdir --parallel=2;
|
||||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$_datadir --target-dir=$targetdir --parallel=2 --throttle=1;
|
||||
echo # restart server;
|
||||
exec echo "restart" > $_expect_file_name;
|
||||
enable_reconnect;
|
||||
|
||||
@@ -428,3 +428,7 @@ SELECT 0xE001 REGEXP @regCheck;
|
||||
SET NAMES latin1;
|
||||
SET @regCheck= '\\xE0\\x01';
|
||||
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
|
||||
|
||||
--echo # MDEV-12420: Testing recursion overflow
|
||||
--replace_regex /[0-9]+ exceeded/NUM exceeded/
|
||||
SELECT 1 FROM dual WHERE ('Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,StrataCentral,Golf,Hotel,India,Juliet,Kilo,Lima,Mike,StrataL3,November,Oscar,StrataL2,Sand,P3,P4SwitchTest,Arsys,Poppa,ExtensionMgr,Arp,Quebec,Romeo,StrataApiV2,PtReyes,Sierra,SandAcl,Arrow,Artools,BridgeTest,Tango,SandT,PAlaska,Namespace,Agent,Qos,PatchPanel,ProjectReport,Ark,Gimp,Agent,SliceAgent,Arnet,Bgp,Ale,Tommy,Central,AsicPktTestLib,Hsc,SandL3,Abuild,Pca9555,Standby,ControllerDut,CalSys,SandLib,Sb820,PointV2,BfnLib,Evpn,BfnSdk,Sflow,ManagementActive,AutoTest,GatedTest,Bgp,Sand,xinetd,BfnAgentLib,bf-utils,Hello,BfnState,Eos,Artest,Qos,Scd,ThermoMgr,Uniform,EosUtils,Eb,FanController,Central,BfnL3,BfnL2,tcp_wrappers,Victor,Environment,Route,Failover,Whiskey,Xray,Gimp,BfnFixed,Strata,SoCal,XApi,Msrp,XpProfile,tcpdump,PatchPanel,ArosTest,FhTest,Arbus,XpAcl,MacConc,XpApi,telnet,QosTest,Alpha2,BfnVlan,Stp,VxlanControllerTest,MplsAgent,Bravo2,Lanz,BfnMbb,Intf,XCtrl,Unicast,SandTunnel,L3Unicast,Ipsec,MplsTest,Rsvp,EthIntf,StageMgr,Sol,MplsUtils,Nat,Ira,P4NamespaceDut,Counters,Charlie2,Aqlc,Mlag,Power,OpenFlow,Lag,RestApi,BfdTest,strongs,Sfa,CEosUtils,Adt746,MaintenanceMode,MlagDut,EosImage,IpEth,MultiProtocol,Launcher,Max3179,Snmp,Acl,IpEthTest,PhyEee,bf-syslibs,tacc,XpL2,p4-ar-switch,p4-bf-switch,LdpTest,BfnPhy,Mirroring,Phy6,Ptp' REGEXP '^((?!\b(Strata|StrataApi|StrataApiV2)\b).)*$');
|
||||
|
||||
@@ -57,3 +57,16 @@ KILL QUERY @thread_id;
|
||||
CHECK TABLE t1;
|
||||
DROP TABLE t1,t2;
|
||||
DISCONNECT insertConn;
|
||||
|
||||
#
|
||||
# MDEV-12761 Error return from external_lock make the server crash
|
||||
#
|
||||
call mtr.add_suppression("Index for table '.*test.t1\\.MYI' is corrupt; try to repair it");
|
||||
create table t1 (a int, index(a));
|
||||
lock tables t1 write;
|
||||
insert t1 values (1),(2),(1);
|
||||
set @old_dbug=@@debug_dbug;
|
||||
set debug_dbug='+d,mi_lock_database_failure';
|
||||
unlock tables;
|
||||
set debug_dbug=@old_dbug;
|
||||
drop table t1;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#
|
||||
--source include/not_embedded.inc
|
||||
--source include/have_perfschema.inc
|
||||
--source include/have_profiling.inc
|
||||
--source include/platform.inc
|
||||
|
||||
#
|
||||
|
||||
@@ -323,12 +323,6 @@ static int match_pins(LF_PINS *el, void *addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if STACK_DIRECTION < 0
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(CUR) - (char*)(END))
|
||||
#else
|
||||
#define available_stack_size(CUR,END) (long) ((char*)(END) - (char*)(CUR))
|
||||
#endif
|
||||
|
||||
#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset)))
|
||||
#define anext_node(X) next_node(&allocator->pinbox, (X))
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 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
|
||||
@@ -242,6 +243,7 @@ common_1_lev_code:
|
||||
break;
|
||||
case INTERVAL_WEEK:
|
||||
expr/= 7;
|
||||
/* fall through */
|
||||
default:
|
||||
close_quote= FALSE;
|
||||
break;
|
||||
|
||||
@@ -10026,7 +10026,7 @@ bool Column_definition::check(THD *thd)
|
||||
case MYSQL_TYPE_DATE:
|
||||
/* We don't support creation of MYSQL_TYPE_DATE anymore */
|
||||
sql_type= MYSQL_TYPE_NEWDATE;
|
||||
/* fall trough */
|
||||
/* fall through */
|
||||
case MYSQL_TYPE_NEWDATE:
|
||||
length= MAX_DATE_WIDTH;
|
||||
break;
|
||||
|
||||
@@ -5878,7 +5878,7 @@ int handler::ha_external_lock(THD *thd, int lock_type)
|
||||
|
||||
DBUG_EXECUTE_IF("external_lock_failure", error= HA_ERR_GENERIC;);
|
||||
|
||||
if (error == 0)
|
||||
if (error == 0 || lock_type == F_UNLCK)
|
||||
{
|
||||
m_lock_type= lock_type;
|
||||
cached_table_flags= table_flags();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
Copyright (c) 2010, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -6179,7 +6179,7 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table,
|
||||
Field_string(max_length, maybe_null, name, collation.collation);
|
||||
break;
|
||||
}
|
||||
/* Fall through to make_string_field() */
|
||||
/* Fall through */
|
||||
case MYSQL_TYPE_ENUM:
|
||||
case MYSQL_TYPE_SET:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
|
||||
@@ -5359,6 +5359,15 @@ int Regexp_processor_pcre::default_regex_flags()
|
||||
return default_regex_flags_pcre(current_thd);
|
||||
}
|
||||
|
||||
void Regexp_processor_pcre::set_recursion_limit(THD *thd)
|
||||
{
|
||||
long stack_used;
|
||||
DBUG_ASSERT(thd == current_thd);
|
||||
stack_used= available_stack_size(thd->thread_stack, &stack_used);
|
||||
m_pcre_extra.match_limit_recursion=
|
||||
(my_thread_stack_size - stack_used)/my_pcre_frame_size;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Convert string to lib_charset, if needed.
|
||||
@@ -5450,15 +5459,77 @@ void Regexp_processor_pcre::pcre_exec_warn(int rc) const
|
||||
*/
|
||||
switch (rc)
|
||||
{
|
||||
case PCRE_ERROR_NULL:
|
||||
errmsg= "pcre_exec: null arguement passed";
|
||||
break;
|
||||
case PCRE_ERROR_BADOPTION:
|
||||
errmsg= "pcre_exec: bad option";
|
||||
break;
|
||||
case PCRE_ERROR_BADMAGIC:
|
||||
errmsg= "pcre_exec: bad magic - not a compiled regex";
|
||||
break;
|
||||
case PCRE_ERROR_UNKNOWN_OPCODE:
|
||||
errmsg= "pcre_exec: error in compiled regex";
|
||||
break;
|
||||
case PCRE_ERROR_NOMEMORY:
|
||||
errmsg= "pcre_exec: Out of memory";
|
||||
break;
|
||||
case PCRE_ERROR_NOSUBSTRING:
|
||||
errmsg= "pcre_exec: no substring";
|
||||
break;
|
||||
case PCRE_ERROR_MATCHLIMIT:
|
||||
errmsg= "pcre_exec: match limit exceeded";
|
||||
break;
|
||||
case PCRE_ERROR_CALLOUT:
|
||||
errmsg= "pcre_exec: callout error";
|
||||
break;
|
||||
case PCRE_ERROR_BADUTF8:
|
||||
errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string";
|
||||
break;
|
||||
case PCRE_ERROR_BADUTF8_OFFSET:
|
||||
errmsg= "pcre_exec: Started at invalid location within utf8 byte sequence";
|
||||
break;
|
||||
case PCRE_ERROR_PARTIAL:
|
||||
errmsg= "pcre_exec: partial match";
|
||||
break;
|
||||
case PCRE_ERROR_INTERNAL:
|
||||
errmsg= "pcre_exec: internal error";
|
||||
break;
|
||||
case PCRE_ERROR_BADCOUNT:
|
||||
errmsg= "pcre_exec: ovesize is negative";
|
||||
break;
|
||||
case PCRE_ERROR_RECURSIONLIMIT:
|
||||
my_snprintf(buf, sizeof(buf), "pcre_exec: recursion limit of %ld exceeded",
|
||||
m_pcre_extra.match_limit_recursion);
|
||||
errmsg= buf;
|
||||
break;
|
||||
case PCRE_ERROR_BADNEWLINE:
|
||||
errmsg= "pcre_exec: bad newline options";
|
||||
break;
|
||||
case PCRE_ERROR_BADOFFSET:
|
||||
errmsg= "pcre_exec: start offset negative or greater than string length";
|
||||
break;
|
||||
case PCRE_ERROR_SHORTUTF8:
|
||||
errmsg= "pcre_exec: ended in middle of utf8 sequence";
|
||||
break;
|
||||
case PCRE_ERROR_JIT_STACKLIMIT:
|
||||
errmsg= "pcre_exec: insufficient stack memory for JIT compile";
|
||||
break;
|
||||
case PCRE_ERROR_RECURSELOOP:
|
||||
errmsg= "pcre_exec: Recursion loop detected";
|
||||
break;
|
||||
case PCRE_ERROR_BADMODE:
|
||||
errmsg= "pcre_exec: compiled pattern passed to wrong bit library function";
|
||||
break;
|
||||
case PCRE_ERROR_BADENDIANNESS:
|
||||
errmsg= "pcre_exec: compiled pattern passed to wrong endianness processor";
|
||||
break;
|
||||
case PCRE_ERROR_JIT_BADOPTION:
|
||||
errmsg= "pcre_exec: bad jit option";
|
||||
break;
|
||||
case PCRE_ERROR_BADLENGTH:
|
||||
errmsg= "pcre_exec: negative length";
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
As other error codes should normally not happen,
|
||||
@@ -5494,7 +5565,7 @@ int Regexp_processor_pcre::pcre_exec_with_warn(const pcre *code,
|
||||
|
||||
bool Regexp_processor_pcre::exec(const char *str, int length, int offset)
|
||||
{
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, NULL, str, length, offset, 0,
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra, str, length, offset, 0,
|
||||
m_SubStrVec, m_subpatterns_needed * 3);
|
||||
return false;
|
||||
}
|
||||
@@ -5505,7 +5576,7 @@ bool Regexp_processor_pcre::exec(String *str, int offset,
|
||||
{
|
||||
if (!(str= convert_if_needed(str, &subject_converter)))
|
||||
return true;
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, NULL,
|
||||
m_pcre_exec_rc= pcre_exec_with_warn(m_pcre, &m_pcre_extra,
|
||||
str->c_ptr_safe(), str->length(),
|
||||
offset, 0,
|
||||
m_SubStrVec, m_subpatterns_needed * 3);
|
||||
|
||||
@@ -2011,6 +2011,7 @@ public:
|
||||
class Regexp_processor_pcre
|
||||
{
|
||||
pcre *m_pcre;
|
||||
pcre_extra m_pcre_extra;
|
||||
bool m_conversion_is_needed;
|
||||
bool m_is_const;
|
||||
int m_library_flags;
|
||||
@@ -2035,8 +2036,12 @@ public:
|
||||
m_data_charset(&my_charset_utf8_general_ci),
|
||||
m_library_charset(&my_charset_utf8_general_ci),
|
||||
m_subpatterns_needed(0)
|
||||
{}
|
||||
{
|
||||
m_pcre_extra.flags= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
|
||||
m_pcre_extra.match_limit_recursion= 100L;
|
||||
}
|
||||
int default_regex_flags();
|
||||
void set_recursion_limit(THD *);
|
||||
void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg)
|
||||
{
|
||||
m_library_flags= default_regex_flags() | extra_flags |
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2015, MariaDB
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -1902,6 +1902,7 @@ my_decimal *Item_func_mod::decimal_op(my_decimal *decimal_value)
|
||||
return decimal_value;
|
||||
case E_DEC_DIV_ZERO:
|
||||
signal_divide_by_null();
|
||||
/* fall through */
|
||||
default:
|
||||
null_value= 1;
|
||||
return 0;
|
||||
|
||||
@@ -225,7 +225,7 @@ String *Item_func_sha2::val_str_ascii(String *str)
|
||||
break;
|
||||
case 0: // SHA-256 is the default
|
||||
digest_length= 256;
|
||||
/* fall trough */
|
||||
/* fall through */
|
||||
case 256:
|
||||
my_sha256(digest_buf, input_ptr, input_len);
|
||||
break;
|
||||
@@ -271,7 +271,7 @@ void Item_func_sha2::fix_length_and_dec()
|
||||
switch (sha_variant) {
|
||||
case 0: // SHA-256 is the default
|
||||
sha_variant= 256;
|
||||
/* fall trough */
|
||||
/* fall through */
|
||||
case 512:
|
||||
case 384:
|
||||
case 256:
|
||||
@@ -5056,7 +5056,7 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date)
|
||||
goto null;
|
||||
case DYN_COL_INT:
|
||||
signed_value= 1; // For error message
|
||||
/* fall_trough */
|
||||
/* fall through */
|
||||
case DYN_COL_UINT:
|
||||
if (signed_value || val.x.ulong_value <= LONGLONG_MAX)
|
||||
{
|
||||
@@ -5070,7 +5070,7 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date)
|
||||
}
|
||||
/* let double_to_datetime_with_warn() issue the warning message */
|
||||
val.x.double_value= static_cast<double>(ULONGLONG_MAX);
|
||||
/* fall_trough */
|
||||
/* fall through */
|
||||
case DYN_COL_DOUBLE:
|
||||
if (double_to_datetime_with_warn(val.x.double_value, ltime, fuzzy_date,
|
||||
0 /* TODO */))
|
||||
|
||||
@@ -422,6 +422,7 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock)
|
||||
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
|
||||
{
|
||||
DBUG_ENTER("mysql_unlock_tables");
|
||||
bool errors= thd->is_error();
|
||||
THD_STAGE_INFO(thd, stage_unlocking_tables);
|
||||
|
||||
if (sql_lock->table_count)
|
||||
@@ -430,6 +431,8 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
|
||||
thr_multi_unlock(sql_lock->locks, sql_lock->lock_count, 0);
|
||||
if (free_lock)
|
||||
my_free(sql_lock);
|
||||
if (!errors)
|
||||
thd->clear_error();
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
@@ -9181,8 +9181,10 @@ void TC_LOG_MMAP::close()
|
||||
mysql_cond_destroy(&COND_pool);
|
||||
mysql_cond_destroy(&COND_active);
|
||||
mysql_cond_destroy(&COND_queue_busy);
|
||||
/* fall through */
|
||||
case 5:
|
||||
data[0]='A'; // garble the first (signature) byte, in case mysql_file_delete fails
|
||||
/* fall through */
|
||||
case 4:
|
||||
for (i=0; i < npages; i++)
|
||||
{
|
||||
@@ -9191,10 +9193,13 @@ void TC_LOG_MMAP::close()
|
||||
mysql_mutex_destroy(&pages[i].lock);
|
||||
mysql_cond_destroy(&pages[i].cond);
|
||||
}
|
||||
/* fall through */
|
||||
case 3:
|
||||
my_free(pages);
|
||||
/* fall through */
|
||||
case 2:
|
||||
my_munmap((char*)data, (size_t)file_length);
|
||||
/* fall through */
|
||||
case 1:
|
||||
mysql_file_close(fd, MYF(0));
|
||||
}
|
||||
|
||||
@@ -1587,7 +1587,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi)
|
||||
rli->report(ERROR_LEVEL, thd->net.last_errno, NULL,
|
||||
"Error in %s event: row application failed. %s",
|
||||
get_type_str(), thd->net.last_error);
|
||||
thd->is_slave_error = 1;
|
||||
thd->is_slave_error= 1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -105,6 +105,7 @@
|
||||
#include "sp_rcontext.h"
|
||||
#include "sp_cache.h"
|
||||
#include "sql_reload.h" // reload_acl_and_cache
|
||||
#include "pcre.h"
|
||||
|
||||
#ifdef HAVE_POLL_H
|
||||
#include <poll.h>
|
||||
@@ -3724,6 +3725,7 @@ static void init_libstrings()
|
||||
#endif
|
||||
}
|
||||
|
||||
ulonglong my_pcre_frame_size;
|
||||
|
||||
static void init_pcre()
|
||||
{
|
||||
@@ -3731,6 +3733,8 @@ static void init_pcre()
|
||||
pcre_free= pcre_stack_free= my_str_free_mysqld;
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
pcre_stack_guard= check_enough_stack_size_slow;
|
||||
/* See http://pcre.org/original/doc/html/pcrestack.html */
|
||||
my_pcre_frame_size= -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0) + 16;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -9355,7 +9359,10 @@ mysql_getopt_value(const char *name, uint length,
|
||||
return (uchar**) &key_cache->changed_blocks_hash_size;
|
||||
}
|
||||
}
|
||||
/* We return in all cases above. Let us silence -Wimplicit-fallthrough */
|
||||
DBUG_ASSERT(0);
|
||||
#ifdef HAVE_REPLICATION
|
||||
/* fall through */
|
||||
case OPT_REPLICATE_DO_DB:
|
||||
case OPT_REPLICATE_DO_TABLE:
|
||||
case OPT_REPLICATE_IGNORE_DB:
|
||||
|
||||
@@ -526,6 +526,8 @@ extern pthread_t signal_thread;
|
||||
extern struct st_VioSSLFd * ssl_acceptor_fd;
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
extern ulonglong my_pcre_frame_size;
|
||||
|
||||
/*
|
||||
The following variables were under INNODB_COMPABILITY_HOOKS
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2008-2011 Monty Program Ab
|
||||
Copyright (c) 2008, 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
|
||||
@@ -1042,6 +1042,7 @@ static int maxmin_in_range(bool max_fl, Field* field, COND *cond)
|
||||
case Item_func::LT_FUNC:
|
||||
case Item_func::LE_FUNC:
|
||||
less_fl= 1;
|
||||
/* fall through */
|
||||
case Item_func::GT_FUNC:
|
||||
case Item_func::GE_FUNC:
|
||||
{
|
||||
|
||||
@@ -2045,7 +2045,7 @@ gtid_waiting::wait_for_pos(THD *thd, String *gtid_str, longlong timeout_us)
|
||||
{
|
||||
case -1:
|
||||
status_var_increment(thd->status_var.master_gtid_wait_timeouts);
|
||||
/* Deliberate fall through. */
|
||||
/* fall through */
|
||||
case 0:
|
||||
status_var_add(thd->status_var.master_gtid_wait_time,
|
||||
microsecond_interval_timer() - before);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -6287,9 +6287,8 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
||||
mi->last_queued_gtid.seq_no == 1000)
|
||||
goto skip_relay_logging;
|
||||
});
|
||||
/* Fall through to default case ... */
|
||||
#endif
|
||||
|
||||
/* fall through */
|
||||
default:
|
||||
default_action:
|
||||
DBUG_EXECUTE_IF("kill_slave_io_after_2_events",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2002, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
Copyright (c) 2011, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -120,6 +120,7 @@ sp_get_item_value(THD *thd, Item *item, String *str)
|
||||
if (item->field_type() != MYSQL_TYPE_BIT)
|
||||
return item->val_str(str);
|
||||
else {/* Bit type is handled as binary string */}
|
||||
/* fall through */
|
||||
case STRING_RESULT:
|
||||
{
|
||||
String *result= item->val_str(str);
|
||||
|
||||
@@ -11684,12 +11684,6 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
|
||||
/* global privileges */
|
||||
grant->privilege= sctx->master_access;
|
||||
|
||||
if (!sctx->priv_user[0] && !sctx->priv_role[0])
|
||||
{
|
||||
DBUG_PRINT("info", ("privilege 0x%lx", grant->privilege));
|
||||
DBUG_VOID_RETURN; // it is slave
|
||||
}
|
||||
|
||||
if (!thd->db || strcmp(db, thd->db))
|
||||
{
|
||||
/* db privileges */
|
||||
|
||||
@@ -240,7 +240,7 @@ void mysql_audit_finalize()
|
||||
|
||||
/**
|
||||
Initialize an Audit plug-in
|
||||
|
||||
|
||||
@param[in] plugin
|
||||
|
||||
@retval FALSE OK
|
||||
@@ -251,12 +251,13 @@ int initialize_audit_plugin(st_plugin_int *plugin)
|
||||
{
|
||||
st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info;
|
||||
|
||||
if (!data->event_notify || !data->class_mask[0]) {
|
||||
if (!data->event_notify || !data->class_mask[0])
|
||||
{
|
||||
sql_print_error("Plugin '%s' has invalid data.",
|
||||
plugin->name.str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if (plugin->plugin->init && plugin->plugin->init(NULL))
|
||||
{
|
||||
sql_print_error("Plugin '%s' init function returned error.",
|
||||
@@ -266,7 +267,7 @@ int initialize_audit_plugin(st_plugin_int *plugin)
|
||||
|
||||
/* Make the interface info more easily accessible */
|
||||
plugin->data= plugin->plugin->info;
|
||||
|
||||
|
||||
/* Add the bits the plugin is interested in to the global mask */
|
||||
mysql_mutex_lock(&LOCK_audit_mask);
|
||||
add_audit_mask(mysql_global_audit_mask, data->class_mask);
|
||||
|
||||
@@ -5501,6 +5501,7 @@ bool xid_cache_insert(THD *thd, XID_STATE *xid_state)
|
||||
break;
|
||||
case 1:
|
||||
my_error(ER_XAER_DUPID, MYF(0));
|
||||
/* fall through */
|
||||
default:
|
||||
xid_state->xid_cache_element= 0;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 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
|
||||
@@ -454,7 +455,8 @@ sql_digest_state* digest_add_token(sql_digest_state *state,
|
||||
}
|
||||
} while (found_unary);
|
||||
}
|
||||
/* fall through, for case NULL_SYM below */
|
||||
/* for case NULL_SYM below */
|
||||
/* fall through */
|
||||
case LEX_HOSTNAME:
|
||||
case TEXT_STRING:
|
||||
case NCHAR_STRING:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -1399,12 +1399,14 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd)
|
||||
state= MY_LEX_HEX_NUMBER;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case MY_LEX_IDENT_OR_BIN:
|
||||
if (lip->yyPeek() == '\'')
|
||||
{ // Found b'bin-number'
|
||||
state= MY_LEX_BIN_NUMBER;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case MY_LEX_IDENT:
|
||||
const char *start;
|
||||
#if defined(USE_MB) && defined(USE_MB_IDENT)
|
||||
@@ -1741,6 +1743,7 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd)
|
||||
break;
|
||||
}
|
||||
/* " used for strings */
|
||||
/* fall through */
|
||||
case MY_LEX_STRING: // Incomplete text string
|
||||
{
|
||||
uint sep;
|
||||
|
||||
@@ -3401,8 +3401,8 @@ mysql_execute_command(THD *thd)
|
||||
MYF(0));
|
||||
goto error;
|
||||
}
|
||||
/* no break; fall through */
|
||||
}
|
||||
/* fall through */
|
||||
case SQLCOM_SHOW_STATUS_PROC:
|
||||
case SQLCOM_SHOW_STATUS_FUNC:
|
||||
case SQLCOM_SHOW_DATABASES:
|
||||
@@ -3416,7 +3416,7 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_SELECT:
|
||||
if (WSREP_CLIENT(thd) && wsrep_sync_wait(thd))
|
||||
goto error;
|
||||
|
||||
/* fall through */
|
||||
case SQLCOM_SHOW_PLUGINS:
|
||||
case SQLCOM_SHOW_VARIABLES:
|
||||
case SQLCOM_SHOW_CHARSETS:
|
||||
@@ -4257,8 +4257,8 @@ end_with_restore_list:
|
||||
/* mysql_update return 2 if we need to switch to multi-update */
|
||||
if (up_result != 2)
|
||||
break;
|
||||
/* Fall through */
|
||||
}
|
||||
/* Fall through */
|
||||
case SQLCOM_UPDATE_MULTI:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
@@ -4376,6 +4376,7 @@ end_with_restore_list:
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* fall through */
|
||||
case SQLCOM_INSERT:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
@@ -5304,6 +5305,7 @@ end_with_restore_list:
|
||||
initialize this variable because RESET shares the same code as FLUSH
|
||||
*/
|
||||
lex->no_write_to_binlog= 1;
|
||||
/* fall through */
|
||||
case SQLCOM_FLUSH:
|
||||
{
|
||||
int write_to_binlog;
|
||||
@@ -7305,12 +7307,6 @@ bool check_fk_parent_table_access(THD *thd,
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
#if STACK_DIRECTION < 0
|
||||
#define used_stack(A,B) (long) (A - B)
|
||||
#else
|
||||
#define used_stack(A,B) (long) (B - A)
|
||||
#endif
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
long max_stack_used;
|
||||
#endif
|
||||
@@ -7327,7 +7323,7 @@ bool check_stack_overrun(THD *thd, long margin,
|
||||
{
|
||||
long stack_used;
|
||||
DBUG_ASSERT(thd == current_thd);
|
||||
if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=
|
||||
if ((stack_used= available_stack_size(thd->thread_stack, &stack_used)) >=
|
||||
(long) (my_thread_stack_size - margin))
|
||||
{
|
||||
thd->is_fatal_error= 1;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (c) 2005, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2014, SkySQL Ab.
|
||||
Copyright (c) 2010, 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
|
||||
@@ -1860,8 +1860,8 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list)
|
||||
switch ((*(p++)= *(list++))) {
|
||||
case '\0':
|
||||
list= NULL; /* terminate the loop */
|
||||
/* fall through */
|
||||
#ifndef __WIN__
|
||||
/* fall through */
|
||||
case ':': /* can't use this as delimiter as it may be drive letter */
|
||||
#endif
|
||||
case ';':
|
||||
@@ -1902,6 +1902,7 @@ static bool plugin_load_list(MEM_ROOT *tmp_root, const char *list)
|
||||
str->str= p;
|
||||
continue;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
str->length++;
|
||||
continue;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2002, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2008, 2016, MariaDB
|
||||
Copyright (c) 2008, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -2356,7 +2356,7 @@ static bool check_prepared_statement(Prepared_statement *stmt)
|
||||
/* mysql_test_update returns 2 if we need to switch to multi-update */
|
||||
if (res != 2)
|
||||
break;
|
||||
|
||||
/* fall through */
|
||||
case SQLCOM_UPDATE_MULTI:
|
||||
res= mysql_test_multiupdate(stmt, tables, res == 2);
|
||||
break;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
|
||||
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
|
||||
@@ -1092,6 +1092,7 @@ public:
|
||||
is_handled= FALSE;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case ER_COLUMNACCESS_DENIED_ERROR:
|
||||
case ER_VIEW_NO_EXPLAIN: /* Error was anonymized, ignore all the same. */
|
||||
case ER_PROCACCESS_DENIED_ERROR:
|
||||
|
||||
@@ -7037,7 +7037,8 @@ bool alter_table_manage_keys(TABLE *table, int indexes_were_disabled,
|
||||
case Alter_info::LEAVE_AS_IS:
|
||||
if (!indexes_were_disabled)
|
||||
break;
|
||||
/* fall-through: disabled indexes */
|
||||
/* disabled indexes */
|
||||
/* fall through */
|
||||
case Alter_info::DISABLE:
|
||||
error= table->file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE);
|
||||
}
|
||||
|
||||
@@ -4774,9 +4774,11 @@ size_number:
|
||||
case 'g':
|
||||
case 'G':
|
||||
text_shift_number+=10;
|
||||
/* fall through */
|
||||
case 'm':
|
||||
case 'M':
|
||||
text_shift_number+=10;
|
||||
/* fall through */
|
||||
case 'k':
|
||||
case 'K':
|
||||
text_shift_number+=10;
|
||||
|
||||
@@ -385,7 +385,8 @@ static void wsrep_replication_process(THD *thd)
|
||||
case WSREP_TRX_MISSING:
|
||||
/* these suggests a bug in provider code */
|
||||
WSREP_WARN("bad return from recv() call: %d", rcode);
|
||||
/* fall through to node shutdown */
|
||||
/* Shut down this node. */
|
||||
/* fall through */
|
||||
case WSREP_FATAL:
|
||||
/* Cluster connectivity is lost.
|
||||
*
|
||||
|
||||
@@ -270,8 +270,8 @@ IF(CONNECT_WITH_JDBC)
|
||||
# Find required libraries and include directories
|
||||
SET (JAVA_SOURCES JdbcInterface.java)
|
||||
add_jar(JdbcInterface ${JAVA_SOURCES})
|
||||
install_jar(JdbcInterface DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar
|
||||
${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar
|
||||
DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
|
||||
add_definitions(-DJDBC_SUPPORT)
|
||||
ELSE()
|
||||
|
||||
@@ -155,6 +155,7 @@ ARRAY::ARRAY(PGLOBAL g, int type, int size, int length, int prec)
|
||||
switch (type) {
|
||||
case TYPE_STRING:
|
||||
Len = length;
|
||||
/* fall through */
|
||||
case TYPE_SHORT:
|
||||
case TYPE_INT:
|
||||
case TYPE_DOUBLE:
|
||||
@@ -592,6 +593,7 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp)
|
||||
switch (Type) {
|
||||
case TYPE_DOUBLE:
|
||||
prec = 2;
|
||||
/* fall through */
|
||||
case TYPE_SHORT:
|
||||
case TYPE_INT:
|
||||
case TYPE_DATE:
|
||||
|
||||
@@ -503,7 +503,8 @@ bool DBFFAM::OpenTableFile(PGLOBAL g)
|
||||
break;
|
||||
} // endif
|
||||
|
||||
// Selective delete, pass thru
|
||||
// Selective delete
|
||||
/* fall through */
|
||||
case MODE_UPDATE:
|
||||
UseTemp = Tdbp->IsUsingTemp(g);
|
||||
strcpy(opmode, (UseTemp) ? "rb" : "r+b");
|
||||
@@ -623,6 +624,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g)
|
||||
case 'L': // Large (big) integer
|
||||
case 'T': // Tiny integer
|
||||
c = 'N'; // Numeric
|
||||
/* fall through */
|
||||
case 'N': // Numeric (integer)
|
||||
case 'F': // Float (double)
|
||||
descp->Decimals = (uchar)cdp->F.Prec;
|
||||
|
||||
@@ -919,7 +919,8 @@ bool BGXFAM::OpenTableFile(PGLOBAL g)
|
||||
break;
|
||||
} // endif
|
||||
|
||||
// Selective delete, pass thru
|
||||
// Selective delete
|
||||
/* fall through */
|
||||
case MODE_UPDATE:
|
||||
UseTemp = Tdbp->IsUsingTemp(g);
|
||||
oflag |= (UseTemp) ? O_RDONLY : O_RDWR;
|
||||
|
||||
@@ -561,6 +561,7 @@ bool DOSFAM::OpenTableFile(PGLOBAL g)
|
||||
|
||||
// Selective delete, pass thru
|
||||
Bin = true;
|
||||
/* fall through */
|
||||
case MODE_UPDATE:
|
||||
if ((UseTemp = Tdbp->IsUsingTemp(g))) {
|
||||
strcpy(opmode, "r");
|
||||
|
||||
@@ -440,6 +440,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g)
|
||||
} // endif
|
||||
|
||||
// Selective delete, pass thru
|
||||
/* fall through */
|
||||
case MODE_UPDATE:
|
||||
UseTemp = Tdbp->IsUsingTemp(g);
|
||||
strcpy(opmode, (UseTemp) ? "rb" : "r+b");
|
||||
@@ -1918,6 +1919,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g)
|
||||
} // endif filter
|
||||
|
||||
// Selective delete, pass thru
|
||||
/* fall through */
|
||||
case MODE_UPDATE:
|
||||
UseTemp = Tdbp->IsUsingTemp(g);
|
||||
strcpy(opmode, (UseTemp) ? "rb": "r+b");
|
||||
@@ -3584,6 +3586,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
|
||||
} // endif
|
||||
|
||||
// Selective delete, pass thru
|
||||
/* fall through */
|
||||
case MODE_UPDATE:
|
||||
UseTemp = Tdbp->IsUsingTemp(g);
|
||||
oflag = (UseTemp) ? O_RDONLY : O_RDWR;
|
||||
|
||||
@@ -341,7 +341,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append)
|
||||
bool ZIPUTIL::addEntry(PGLOBAL g, char *entry)
|
||||
{
|
||||
//?? we dont need the stinking time
|
||||
zip_fileinfo zi = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
zip_fileinfo zi = { {0, 0, 0, 0, 0, 0}, 0, 0, 0 };
|
||||
|
||||
getTime(zi.tmz_date);
|
||||
target = entry;
|
||||
|
||||
@@ -1193,7 +1193,7 @@ bool FILTER::Convert(PGLOBAL g, bool having)
|
||||
Arg(0) = pXVOID;
|
||||
} // endif void
|
||||
|
||||
// pass thru
|
||||
// fall through
|
||||
case OP_IN:
|
||||
// For IN operator do optimize if operand is an array
|
||||
if (GetArgType(1) != TYPE_ARRAY)
|
||||
@@ -1260,6 +1260,7 @@ bool FILTER::Eval(PGLOBAL g)
|
||||
} // endif Opm
|
||||
|
||||
// For modified operators, pass thru
|
||||
/* fall through */
|
||||
case OP_IN:
|
||||
case OP_EXIST:
|
||||
// For IN operations, special processing is done here
|
||||
|
||||
@@ -1427,7 +1427,7 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
|
||||
case MYSQL_TYPE_VARCHAR:
|
||||
case MYSQL_TYPE_VAR_STRING:
|
||||
pcf->Flags |= U_VAR;
|
||||
/* no break */
|
||||
/* fall through */
|
||||
default:
|
||||
pcf->Type= MYSQLtoPLG(fp->type(), &v);
|
||||
break;
|
||||
@@ -2800,6 +2800,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
||||
case Item_func::LIKE_FUNC: vop= OP_LIKE; break;
|
||||
case Item_func::ISNOTNULL_FUNC:
|
||||
neg = true;
|
||||
/* fall through */
|
||||
case Item_func::ISNULL_FUNC: vop= OP_NULL; break;
|
||||
case Item_func::IN_FUNC: vop= OP_IN;
|
||||
case Item_func::BETWEEN:
|
||||
@@ -4219,7 +4220,8 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, char *dbn, bool quick)
|
||||
} else
|
||||
return false;
|
||||
|
||||
/* Fall through to check FILE_ACL */
|
||||
/* check FILE_ACL */
|
||||
/* fall through */
|
||||
case TAB_ODBC:
|
||||
case TAB_JDBC:
|
||||
case TAB_MYSQL:
|
||||
@@ -5453,7 +5455,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
#endif // JDBC_SUPPORT
|
||||
case TAB_DBF:
|
||||
dbf= true;
|
||||
// Passthru
|
||||
// fall through
|
||||
case TAB_CSV:
|
||||
if (!fn && fnc != FNC_NO)
|
||||
sprintf(g->Message, "Missing %s file name", topt->type);
|
||||
|
||||
@@ -533,7 +533,7 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src)
|
||||
if (!has_e)
|
||||
goto err;
|
||||
|
||||
// passthru
|
||||
// fall through
|
||||
case '-':
|
||||
if (found_digit)
|
||||
goto err;
|
||||
@@ -826,7 +826,7 @@ bool JOUTSTR::Escape(const char *s)
|
||||
case '\r':
|
||||
case '\b':
|
||||
case '\f': WriteChr('\\');
|
||||
// passthru
|
||||
// fall through
|
||||
default:
|
||||
WriteChr(s[i]);
|
||||
break;
|
||||
|
||||
@@ -917,7 +917,7 @@ int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all)
|
||||
|
||||
fp->Memory = NULL;
|
||||
fp->Mode = MODE_ANY;
|
||||
// Passthru
|
||||
// fall through
|
||||
case TYPE_FB_HANDLE:
|
||||
if (fp->Handle && fp->Handle != INVALID_HANDLE_VALUE)
|
||||
if (CloseFileHandle(fp->Handle))
|
||||
|
||||
@@ -128,6 +128,7 @@ int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef)
|
||||
switch (toupper(c)) {
|
||||
case 'M':
|
||||
n *= 1024;
|
||||
// fall through
|
||||
case 'K':
|
||||
n *= 1024;
|
||||
} // endswitch c
|
||||
|
||||
@@ -1307,6 +1307,7 @@ PBF TDBDOS::InitBlockFilter(PGLOBAL g, PFIL filp)
|
||||
} // endif !opm
|
||||
|
||||
// if opm, pass thru
|
||||
/* fall through */
|
||||
case OP_IN:
|
||||
if (filp->GetArgType(0) == TYPE_COLBLK &&
|
||||
filp->GetArgType(1) == TYPE_ARRAY) {
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
/***********************************************************************/
|
||||
|
||||
#ifndef __TABEXT_H
|
||||
#define __TABEXTF_H
|
||||
#define __TABEXT_H
|
||||
|
||||
#include "reldef.h"
|
||||
|
||||
|
||||
@@ -1530,7 +1530,7 @@ void JSONCOL::WriteColumn(PGLOBAL g)
|
||||
break;
|
||||
} // endif Op
|
||||
|
||||
// Passthru
|
||||
// fall through
|
||||
case TYPE_DATE:
|
||||
case TYPE_INT:
|
||||
case TYPE_SHORT:
|
||||
|
||||
@@ -118,7 +118,7 @@ ulonglong CharToNumber(char *p, int n, ulonglong maxval,
|
||||
maxval++;
|
||||
if (minus) *minus = true;
|
||||
} // endif Unsigned
|
||||
|
||||
/* fall through */
|
||||
case '+':
|
||||
p++;
|
||||
break;
|
||||
|
||||
@@ -464,7 +464,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp)
|
||||
if (ApplyFilter(g, filp))
|
||||
break;
|
||||
|
||||
// passthru
|
||||
// fall through
|
||||
case RC_NF:
|
||||
continue;
|
||||
case RC_EF:
|
||||
|
||||
@@ -405,7 +405,7 @@ bool STRING::Append_quoted(PSZ s)
|
||||
case '\r':
|
||||
case '\b':
|
||||
case '\f': b |= Append('\\');
|
||||
// passthru
|
||||
// fall through
|
||||
default:
|
||||
b |= Append(*p);
|
||||
break;
|
||||
|
||||
@@ -300,7 +300,7 @@ static int read_meta_file(File meta_file, ha_rows *rows)
|
||||
mysql_file_seek(meta_file, 0, MY_SEEK_SET, MYF(0));
|
||||
if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0)
|
||||
!= META_BUFFER_SIZE)
|
||||
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
|
||||
DBUG_RETURN(my_errno= HA_ERR_CRASHED_ON_USAGE);
|
||||
|
||||
/*
|
||||
Parse out the meta data, we ignore version at the moment
|
||||
@@ -429,10 +429,13 @@ static int free_share(TINA_SHARE *share)
|
||||
int result_code= 0;
|
||||
if (!--share->use_count){
|
||||
/* Write the meta file. Mark it as crashed if needed. */
|
||||
(void)write_meta_file(share->meta_file, share->rows_recorded,
|
||||
share->crashed ? TRUE :FALSE);
|
||||
if (mysql_file_close(share->meta_file, MYF(0)))
|
||||
result_code= 1;
|
||||
if (share->meta_file != -1)
|
||||
{
|
||||
(void)write_meta_file(share->meta_file, share->rows_recorded,
|
||||
share->crashed ? TRUE :FALSE);
|
||||
if (mysql_file_close(share->meta_file, MYF(0)))
|
||||
result_code= 1;
|
||||
}
|
||||
if (share->tina_write_opened)
|
||||
{
|
||||
if (mysql_file_close(share->tina_write_filedes, MYF(0)))
|
||||
@@ -954,7 +957,7 @@ int ha_tina::open(const char *name, int mode, uint open_options)
|
||||
if (share->crashed && !(open_options & HA_OPEN_FOR_REPAIR))
|
||||
{
|
||||
free_share(share);
|
||||
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
|
||||
DBUG_RETURN(my_errno ? my_errno : HA_ERR_CRASHED_ON_USAGE);
|
||||
}
|
||||
|
||||
local_data_file_version= share->data_file_version;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2004, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 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
|
||||
@@ -2943,6 +2944,7 @@ int ha_federated::extra(ha_extra_function operation)
|
||||
break;
|
||||
case HA_EXTRA_PREPARE_FOR_DROP:
|
||||
table_will_be_deleted = TRUE;
|
||||
break;
|
||||
default:
|
||||
/* do nothing */
|
||||
DBUG_PRINT("info",("unhandled operation: %d", (uint) operation));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2014, SkySQL Ab.
|
||||
Copyright (c) 2010, 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
|
||||
@@ -94,7 +94,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info,
|
||||
case HA_KEYTYPE_VARBINARY1:
|
||||
/* Case-insensitiveness is handled in coll->hash_sort */
|
||||
keyinfo->seg[j].type= HA_KEYTYPE_VARTEXT1;
|
||||
/* fall_through */
|
||||
/* fall through */
|
||||
case HA_KEYTYPE_VARTEXT1:
|
||||
keyinfo->flag|= HA_VAR_LENGTH_KEY;
|
||||
length+= 2;
|
||||
|
||||
@@ -2813,18 +2813,21 @@ btr_cur_ins_lock_and_undo(
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS
|
||||
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|
||||
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP,
|
||||
thr, index, entry,
|
||||
NULL, 0, NULL, NULL,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
return(err);
|
||||
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||
roll_ptr = 0;
|
||||
} else {
|
||||
err = trx_undo_report_row_operation(thr, index, entry,
|
||||
NULL, 0, NULL, NULL,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
return(err);
|
||||
}
|
||||
}
|
||||
|
||||
/* Now we can fill in the roll ptr field in entry */
|
||||
@@ -2884,15 +2887,17 @@ btr_cur_optimistic_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||
if this function returns DB_SUCCESS on
|
||||
a leaf page of a secondary index in a
|
||||
@@ -2912,6 +2917,7 @@ btr_cur_optimistic_insert(
|
||||
ulint rec_size;
|
||||
dberr_t err;
|
||||
|
||||
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||
*big_rec = NULL;
|
||||
|
||||
block = btr_cur_get_block(cursor);
|
||||
@@ -3147,15 +3153,17 @@ btr_cur_pessimistic_insert(
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
{
|
||||
dict_index_t* index = cursor->index;
|
||||
@@ -3166,6 +3174,7 @@ btr_cur_pessimistic_insert(
|
||||
ulint n_reserved = 0;
|
||||
|
||||
ut_ad(dtuple_check_typed(entry));
|
||||
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
|
||||
|
||||
*big_rec = NULL;
|
||||
|
||||
@@ -3353,9 +3362,10 @@ btr_cur_upd_lock_and_undo(
|
||||
|
||||
/* Append the info about the update in the undo log */
|
||||
|
||||
return(trx_undo_report_row_operation(
|
||||
flags, TRX_UNDO_MODIFY_OP, thr,
|
||||
index, NULL, update,
|
||||
return((flags & BTR_NO_UNDO_LOG_FLAG)
|
||||
? DB_SUCCESS
|
||||
: trx_undo_report_row_operation(
|
||||
thr, index, NULL, update,
|
||||
cmpl_info, rec, offsets, roll_ptr));
|
||||
}
|
||||
|
||||
@@ -4069,12 +4079,12 @@ btr_cur_pessimistic_update(
|
||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
mem_heap_t* entry_heap,
|
||||
/*!< in/out: memory heap for allocating
|
||||
big_rec and the index tuple */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or NULL */
|
||||
be stored externally by the caller */
|
||||
upd_t* update, /*!< in/out: update vector; this is allowed to
|
||||
also contain trx id and roll ptr fields.
|
||||
Non-updated columns that are moved offpage will
|
||||
@@ -4601,7 +4611,6 @@ undo log record created.
|
||||
dberr_t
|
||||
btr_cur_del_mark_set_clust_rec(
|
||||
/*===========================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
buf_block_t* block, /*!< in/out: buffer block of the record */
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
dict_index_t* index, /*!< in: clustered index of the record */
|
||||
@@ -4637,8 +4646,8 @@ btr_cur_del_mark_set_clust_rec(
|
||||
return(err);
|
||||
}
|
||||
|
||||
err = trx_undo_report_row_operation(flags, TRX_UNDO_MODIFY_OP, thr,
|
||||
index, entry, NULL, 0, rec, offsets,
|
||||
err = trx_undo_report_row_operation(thr, index,
|
||||
entry, NULL, 0, rec, offsets,
|
||||
&roll_ptr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
|
||||
@@ -5875,18 +5875,15 @@ fil_iterate(
|
||||
|
||||
ut_ad(!srv_read_only_mode);
|
||||
|
||||
/* For old style compressed tables we do a lot of useless copying
|
||||
for non-index pages. Unfortunately, it is required by
|
||||
buf_zip_decompress() */
|
||||
|
||||
ulint read_type = IORequest::READ;
|
||||
ulint write_type = IORequest::WRITE;
|
||||
/* TODO: For compressed tables we do a lot of useless
|
||||
copying for non-index pages. Unfortunately, it is
|
||||
required by buf_zip_decompress() */
|
||||
const bool row_compressed
|
||||
= callback.get_page_size().is_compressed();
|
||||
|
||||
for (offset = iter.start; offset < iter.end; offset += n_bytes) {
|
||||
|
||||
byte* io_buffer = iter.io_buffer;
|
||||
const bool row_compressed
|
||||
= callback.get_page_size().is_compressed();
|
||||
|
||||
block->frame = io_buffer;
|
||||
|
||||
@@ -5906,8 +5903,6 @@ fil_iterate(
|
||||
|
||||
/* Zip IO is done in the compressed page buffer. */
|
||||
io_buffer = block->page.zip.data;
|
||||
} else {
|
||||
io_buffer = iter.io_buffer;
|
||||
}
|
||||
|
||||
/* We have to read the exact number of bytes. Otherwise the
|
||||
@@ -5920,22 +5915,14 @@ fil_iterate(
|
||||
ut_ad(n_bytes > 0);
|
||||
ut_ad(!(n_bytes % iter.page_size));
|
||||
|
||||
dberr_t err = DB_SUCCESS;
|
||||
IORequest read_request(read_type);
|
||||
|
||||
byte* readptr = io_buffer;
|
||||
byte* writeptr = io_buffer;
|
||||
bool encrypted = false;
|
||||
|
||||
const bool encrypted = iter.crypt_data != NULL
|
||||
&& iter.crypt_data->should_encrypt();
|
||||
/* Use additional crypt io buffer if tablespace is encrypted */
|
||||
if (iter.crypt_data != NULL && iter.crypt_data->should_encrypt()) {
|
||||
|
||||
encrypted = true;
|
||||
readptr = iter.crypt_io_buffer;
|
||||
writeptr = iter.crypt_io_buffer;
|
||||
}
|
||||
|
||||
err = os_file_read(
|
||||
byte* const readptr = encrypted
|
||||
? iter.crypt_io_buffer : io_buffer;
|
||||
byte* const writeptr = readptr;
|
||||
IORequest read_request(IORequest::READ);
|
||||
dberr_t err = os_file_read(
|
||||
read_request, iter.file, readptr, offset,
|
||||
(ulint) n_bytes);
|
||||
|
||||
@@ -5960,9 +5947,9 @@ fil_iterate(
|
||||
|
||||
ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE);
|
||||
|
||||
bool page_compressed =
|
||||
(page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED
|
||||
|| page_type == FIL_PAGE_PAGE_COMPRESSED);
|
||||
const bool page_compressed
|
||||
= page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED
|
||||
|| page_type == FIL_PAGE_PAGE_COMPRESSED;
|
||||
|
||||
/* If tablespace is encrypted, we need to decrypt
|
||||
the page. Note that tablespaces are not in
|
||||
@@ -6107,7 +6094,7 @@ fil_iterate(
|
||||
block->frame += iter.page_size;
|
||||
}
|
||||
|
||||
IORequest write_request(write_type);
|
||||
IORequest write_request(IORequest::WRITE);
|
||||
|
||||
/* A page was updated in the set, write back to disk.
|
||||
Note: We don't have the compression algorithm, we write
|
||||
|
||||
@@ -155,7 +155,6 @@ fil_compress_page(
|
||||
switch(comp_method) {
|
||||
#ifdef HAVE_LZ4
|
||||
case PAGE_LZ4_ALGORITHM:
|
||||
|
||||
#ifdef HAVE_LZ4_COMPRESS_DEFAULT
|
||||
err = LZ4_compress_default((const char *)buf,
|
||||
(char *)out_buf+header_len, len, write_size);
|
||||
|
||||
@@ -2479,25 +2479,16 @@ Thread unsafe, can only be called from the thread owning the THD.
|
||||
@return SQL statement string */
|
||||
const char*
|
||||
innobase_get_stmt_unsafe(
|
||||
/*=====================*/
|
||||
THD* thd,
|
||||
size_t* length)
|
||||
{
|
||||
LEX_STRING* stmt;
|
||||
const char* query=NULL;
|
||||
|
||||
stmt = thd ? thd_query_string(thd) : NULL;
|
||||
// MySQL 5.7
|
||||
//stmt = thd_query_unsafe(thd);
|
||||
|
||||
if (stmt && stmt->str) {
|
||||
if (const LEX_STRING *stmt = thd_query_string(thd)) {
|
||||
*length = stmt->length;
|
||||
query = stmt->str;
|
||||
} else {
|
||||
*length = 0;
|
||||
return stmt->str;
|
||||
}
|
||||
|
||||
return(query);
|
||||
*length = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Determines the current SQL statement.
|
||||
@@ -2509,7 +2500,6 @@ into the provided buffer.
|
||||
@return Length of the SQL statement */
|
||||
size_t
|
||||
innobase_get_stmt_safe(
|
||||
/*===================*/
|
||||
THD* thd,
|
||||
char* buf,
|
||||
size_t buflen)
|
||||
@@ -8522,8 +8512,8 @@ ha_innobase::innobase_lock_autoinc(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Fall through to old style locking. */
|
||||
|
||||
/* Use old style locking. */
|
||||
/* fall through */
|
||||
case AUTOINC_OLD_STYLE_LOCKING:
|
||||
DBUG_EXECUTE_IF("die_if_autoinc_old_lock_style_used",
|
||||
ut_ad(0););
|
||||
@@ -9193,8 +9183,8 @@ calc_row_difference(
|
||||
}
|
||||
}
|
||||
|
||||
if (o_len != n_len || (o_len != UNIV_SQL_NULL &&
|
||||
0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||
if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
|
||||
&& 0 != memcmp(o_ptr, n_ptr, o_len))) {
|
||||
/* The field has changed */
|
||||
|
||||
ufield = uvect->fields + n_changed;
|
||||
@@ -12384,7 +12374,8 @@ create_table_info_t::create_options_are_invalid()
|
||||
get_row_format_name(row_format));
|
||||
ret = "ROW_FORMAT";
|
||||
}
|
||||
/* FALLTRHOUGH */
|
||||
/* ROW_FORMAT=DYNAMIC also shuns KEY_BLOCK_SIZE */
|
||||
/* fall through */
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
if (has_key_block_size) {
|
||||
@@ -12901,7 +12892,8 @@ index_bad:
|
||||
break;
|
||||
}
|
||||
zip_allowed = false;
|
||||
/* fall through to set row_type = DYNAMIC */
|
||||
/* Set ROW_FORMAT = COMPACT */
|
||||
/* fall through */
|
||||
case ROW_TYPE_NOT_USED:
|
||||
case ROW_TYPE_FIXED:
|
||||
case ROW_TYPE_PAGE:
|
||||
@@ -12909,6 +12901,7 @@ index_bad:
|
||||
m_thd, Sql_condition::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: assuming ROW_FORMAT=DYNAMIC.");
|
||||
/* fall through */
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
innodb_row_format = REC_FORMAT_DYNAMIC;
|
||||
break;
|
||||
|
||||
@@ -656,14 +656,11 @@ and returns true.
|
||||
@return true if the index name matches the reserved name */
|
||||
bool
|
||||
innobase_index_name_is_reserved(
|
||||
THD* thd, /*!< in/out: MySQL connection */
|
||||
const KEY* key_info, /*!< in: Indexes to be
|
||||
created */
|
||||
ulint num_of_keys) /*!< in: Number of indexes to
|
||||
be created. */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
extern const char reserved_file_per_table_space_name[];
|
||||
THD* thd, /*!< in/out: MySQL connection */
|
||||
const KEY* key_info, /*!< in: Indexes to be created */
|
||||
ulint num_of_keys) /*!< in: Number of indexes to
|
||||
be created. */
|
||||
MY_ATTRIBUTE((nonnull(1), warn_unused_result));
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
//extern "C" int wsrep_trx_is_aborting(void *thd_ptr);
|
||||
|
||||
@@ -2830,10 +2830,10 @@ online_retry_drop_indexes_with_trx(
|
||||
@param drop_fk constraints being dropped
|
||||
@param n_drop_fk number of constraints that are being dropped
|
||||
@return whether the constraint is being dropped */
|
||||
inline MY_ATTRIBUTE((warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result))
|
||||
inline
|
||||
bool
|
||||
innobase_dropping_foreign(
|
||||
/*======================*/
|
||||
const dict_foreign_t* foreign,
|
||||
dict_foreign_t** drop_fk,
|
||||
ulint n_drop_fk)
|
||||
@@ -2857,10 +2857,10 @@ column that is being dropped or modified to NOT NULL.
|
||||
@retval true Not allowed (will call my_error())
|
||||
@retval false Allowed
|
||||
*/
|
||||
static MY_ATTRIBUTE((warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
|
||||
static
|
||||
bool
|
||||
innobase_check_foreigns_low(
|
||||
/*========================*/
|
||||
const dict_table_t* user_table,
|
||||
dict_foreign_t** drop_fk,
|
||||
ulint n_drop_fk,
|
||||
@@ -2957,10 +2957,10 @@ column that is being dropped or modified to NOT NULL.
|
||||
@retval true Not allowed (will call my_error())
|
||||
@retval false Allowed
|
||||
*/
|
||||
static MY_ATTRIBUTE((warn_unused_result))
|
||||
MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
|
||||
static
|
||||
bool
|
||||
innobase_check_foreigns(
|
||||
/*====================*/
|
||||
Alter_inplace_info* ha_alter_info,
|
||||
const TABLE* altered_table,
|
||||
const TABLE* old_table,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates.
|
||||
Copyrigth (c) 2014, 2017, MariaDB Corporation
|
||||
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2014, 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
|
||||
@@ -2971,14 +2971,16 @@ i_s_fts_deleted_generic_fill(
|
||||
|
||||
fields = table->field;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
|
||||
doc_id_t doc_id;
|
||||
|
||||
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
|
||||
|
||||
OK(fields[I_S_FTS_DOC_ID]->store(doc_id, true));
|
||||
BREAK_IF(ret = fields[I_S_FTS_DOC_ID]->store(doc_id, true));
|
||||
|
||||
OK(schema_table_store_record(thd, table));
|
||||
BREAK_IF(ret = schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
trx_free_for_background(trx);
|
||||
@@ -2989,7 +2991,7 @@ i_s_fts_deleted_generic_fill(
|
||||
|
||||
rw_lock_s_unlock(dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@@ -3229,13 +3231,13 @@ i_s_fts_index_cache_fill_one_index(
|
||||
/*===============================*/
|
||||
fts_index_cache_t* index_cache, /*!< in: FTS index cache */
|
||||
THD* thd, /*!< in: thread */
|
||||
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||
{
|
||||
TABLE* table = (TABLE*) tables->table;
|
||||
Field** fields;
|
||||
CHARSET_INFO* index_charset;
|
||||
const ib_rbt_node_t* rbt_node;
|
||||
fts_string_t conv_str;
|
||||
uint dummy_errors;
|
||||
char* word_str;
|
||||
|
||||
@@ -3244,10 +3246,9 @@ i_s_fts_index_cache_fill_one_index(
|
||||
fields = table->field;
|
||||
|
||||
index_charset = index_cache->charset;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc_nokey(conv_str.f_len));
|
||||
conv_str.f_n_char = 0;
|
||||
conv_str->f_n_char = 0;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
/* Go through each word in the index cache */
|
||||
for (rbt_node = rbt_first(index_cache->words);
|
||||
@@ -3259,16 +3260,16 @@ i_s_fts_index_cache_fill_one_index(
|
||||
|
||||
/* Convert word from index charset to system_charset_info */
|
||||
if (index_charset->cset != system_charset_info->cset) {
|
||||
conv_str.f_n_char = my_convert(
|
||||
reinterpret_cast<char*>(conv_str.f_str),
|
||||
static_cast<uint32>(conv_str.f_len),
|
||||
conv_str->f_n_char = my_convert(
|
||||
reinterpret_cast<char*>(conv_str->f_str),
|
||||
static_cast<uint32>(conv_str->f_len),
|
||||
system_charset_info,
|
||||
reinterpret_cast<char*>(word->text.f_str),
|
||||
static_cast<uint32>(word->text.f_len),
|
||||
index_charset, &dummy_errors);
|
||||
ut_ad(conv_str.f_n_char <= conv_str.f_len);
|
||||
conv_str.f_str[conv_str.f_n_char] = 0;
|
||||
word_str = reinterpret_cast<char*>(conv_str.f_str);
|
||||
ut_ad(conv_str->f_n_char <= conv_str->f_len);
|
||||
conv_str->f_str[conv_str->f_n_char] = 0;
|
||||
word_str = reinterpret_cast<char*>(conv_str->f_str);
|
||||
} else {
|
||||
word_str = reinterpret_cast<char*>(word->text.f_str);
|
||||
}
|
||||
@@ -3326,9 +3327,7 @@ i_s_fts_index_cache_fill_one_index(
|
||||
}
|
||||
}
|
||||
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
/*******************************************************************//**
|
||||
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
|
||||
@@ -3372,18 +3371,27 @@ i_s_fts_index_cache_fill(
|
||||
|
||||
ut_a(cache);
|
||||
|
||||
int ret = 0;
|
||||
fts_string_t conv_str;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc_nokey(conv_str.f_len));
|
||||
|
||||
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
|
||||
fts_index_cache_t* index_cache;
|
||||
|
||||
index_cache = static_cast<fts_index_cache_t*> (
|
||||
ib_vector_get(cache->indexes, i));
|
||||
|
||||
i_s_fts_index_cache_fill_one_index(index_cache, thd, tables);
|
||||
BREAK_IF(ret = i_s_fts_index_cache_fill_one_index(
|
||||
index_cache, thd, &conv_str, tables));
|
||||
}
|
||||
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
dict_table_close(user_table, FALSE, FALSE);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@@ -3685,8 +3693,6 @@ i_s_fts_index_table_fill_one_fetch(
|
||||
}
|
||||
}
|
||||
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
@@ -3700,12 +3706,12 @@ i_s_fts_index_table_fill_one_index(
|
||||
/*===============================*/
|
||||
dict_index_t* index, /*!< in: FTS index */
|
||||
THD* thd, /*!< in: thread */
|
||||
fts_string_t* conv_str, /*!< in/out: buffer */
|
||||
TABLE_LIST* tables) /*!< in/out: tables to fill */
|
||||
{
|
||||
ib_vector_t* words;
|
||||
mem_heap_t* heap;
|
||||
CHARSET_INFO* index_charset;
|
||||
fts_string_t conv_str;
|
||||
dberr_t error;
|
||||
int ret = 0;
|
||||
|
||||
@@ -3718,10 +3724,6 @@ i_s_fts_index_table_fill_one_index(
|
||||
sizeof(fts_word_t), 256);
|
||||
|
||||
index_charset = fts_index_get_charset(index);
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc_nokey(conv_str.f_len));
|
||||
conv_str.f_n_char = 0;
|
||||
|
||||
/* Iterate through each auxiliary table as described in
|
||||
fts_index_selector */
|
||||
@@ -3759,17 +3761,17 @@ i_s_fts_index_table_fill_one_index(
|
||||
|
||||
/* Fill into tables */
|
||||
ret = i_s_fts_index_table_fill_one_fetch(
|
||||
index_charset, thd, tables, words, &conv_str, has_more);
|
||||
index_charset, thd, tables, words, conv_str,
|
||||
has_more);
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
|
||||
if (ret != 0) {
|
||||
i_s_fts_index_table_free_one_fetch(words);
|
||||
goto func_exit;
|
||||
}
|
||||
} while (has_more);
|
||||
}
|
||||
|
||||
func_exit:
|
||||
ut_free(conv_str.f_str);
|
||||
mem_heap_free(heap);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
@@ -3811,10 +3813,17 @@ i_s_fts_index_table_fill(
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
fts_string_t conv_str;
|
||||
conv_str.f_len = system_charset_info->mbmaxlen
|
||||
* FTS_MAX_WORD_LEN_IN_CHAR;
|
||||
conv_str.f_str = static_cast<byte*>(ut_malloc_nokey(conv_str.f_len));
|
||||
|
||||
for (index = dict_table_get_first_index(user_table);
|
||||
index; index = dict_table_get_next_index(index)) {
|
||||
if (index->type & DICT_FTS) {
|
||||
i_s_fts_index_table_fill_one_index(index, thd, tables);
|
||||
BREAK_IF(ret = i_s_fts_index_table_fill_one_index(
|
||||
index, thd, &conv_str, tables));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3822,7 +3831,9 @@ i_s_fts_index_table_fill(
|
||||
|
||||
rw_lock_s_unlock(dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
ut_free(conv_str.f_str);
|
||||
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@@ -3988,6 +3999,8 @@ i_s_fts_config_fill(
|
||||
DBUG_ASSERT(!dict_index_is_online_ddl(index));
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
|
||||
while (fts_config_key[i]) {
|
||||
fts_string_t value;
|
||||
char* key_name;
|
||||
@@ -4012,13 +4025,14 @@ i_s_fts_config_fill(
|
||||
ut_free(key_name);
|
||||
}
|
||||
|
||||
OK(field_store_string(
|
||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||
BREAK_IF(ret = field_store_string(
|
||||
fields[FTS_CONFIG_KEY], fts_config_key[i]));
|
||||
|
||||
OK(field_store_string(
|
||||
fields[FTS_CONFIG_VALUE], (const char*) value.f_str));
|
||||
BREAK_IF(ret = field_store_string(
|
||||
fields[FTS_CONFIG_VALUE],
|
||||
reinterpret_cast<const char*>(value.f_str)));
|
||||
|
||||
OK(schema_table_store_record(thd, table));
|
||||
BREAK_IF(ret = schema_table_store_record(thd, table));
|
||||
|
||||
i++;
|
||||
}
|
||||
@@ -4031,7 +4045,7 @@ i_s_fts_config_fill(
|
||||
|
||||
rw_lock_s_unlock(dict_operation_lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@@ -4889,15 +4903,14 @@ i_s_innodb_buffer_page_fill(
|
||||
i_s_page_type[page_info->page_type].type_str));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store(
|
||||
page_info->flush_type));
|
||||
page_info->flush_type, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store(
|
||||
page_info->fix_count));
|
||||
page_info->fix_count, true));
|
||||
|
||||
#ifdef BTR_CUR_HASH_ADAPT
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUFFER_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
#endif /* BTR_CUR_HASH_ADAPT */
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
|
||||
@@ -4907,7 +4920,7 @@ i_s_innodb_buffer_page_fill(
|
||||
page_info->oldest_mod, true));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store(
|
||||
page_info->access_time));
|
||||
page_info->access_time, true));
|
||||
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null();
|
||||
|
||||
@@ -4916,32 +4929,36 @@ i_s_innodb_buffer_page_fill(
|
||||
/* If this is an index page, fetch the index name
|
||||
and table name */
|
||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||
const dict_index_t* index;
|
||||
bool ret = false;
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
index = dict_index_get_if_in_cache_low(
|
||||
page_info->index_id);
|
||||
|
||||
if (index) {
|
||||
|
||||
if (const dict_index_t* index =
|
||||
dict_index_get_if_in_cache_low(
|
||||
page_info->index_id)) {
|
||||
table_name_end = innobase_convert_name(
|
||||
table_name, sizeof(table_name),
|
||||
index->table_name,
|
||||
strlen(index->table_name),
|
||||
thd);
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store(
|
||||
table_name,
|
||||
uint(table_name_end - table_name),
|
||||
system_charset_info));
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||
|
||||
OK(field_store_index_name(
|
||||
fields[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||
index->name));
|
||||
ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
|
||||
->store(table_name,
|
||||
static_cast<uint>(
|
||||
table_name_end
|
||||
- table_name),
|
||||
system_charset_info)
|
||||
|| field_store_index_name(
|
||||
fields
|
||||
[IDX_BUFFER_PAGE_INDEX_NAME],
|
||||
index->name);
|
||||
}
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
OK(ret);
|
||||
|
||||
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
|
||||
}
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
|
||||
@@ -4991,32 +5008,29 @@ i_s_innodb_buffer_page_fill(
|
||||
|
||||
switch (page_info->io_fix) {
|
||||
case BUF_IO_NONE:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_NONE"));
|
||||
state_str = "IO_NONE";
|
||||
break;
|
||||
case BUF_IO_READ:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_READ"));
|
||||
state_str = "IO_READ";
|
||||
break;
|
||||
case BUF_IO_WRITE:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_WRITE"));
|
||||
state_str = "IO_WRITE";
|
||||
break;
|
||||
case BUF_IO_PIN:
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
"IO_PIN"));
|
||||
state_str = "IO_PIN";
|
||||
break;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
|
||||
state_str));
|
||||
|
||||
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
|
||||
(page_info->is_old) ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
|
||||
page_info->freed_page_clock, true));
|
||||
|
||||
if (schema_table_store_record(thd, table)) {
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
OK(schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
DBUG_RETURN(0);
|
||||
@@ -5572,17 +5586,10 @@ i_s_innodb_buf_page_lru_fill(
|
||||
ulint num_page) /*!< in: number of page info
|
||||
cached */
|
||||
{
|
||||
TABLE* table;
|
||||
Field** fields;
|
||||
mem_heap_t* heap;
|
||||
|
||||
DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
|
||||
|
||||
table = tables->table;
|
||||
|
||||
fields = table->field;
|
||||
|
||||
heap = mem_heap_create(1000);
|
||||
TABLE* table = tables->table;
|
||||
Field** fields = table->field;
|
||||
|
||||
/* Iterate through the cached array and fill the I_S table rows */
|
||||
for (ulint i = 0; i < num_page; i++) {
|
||||
@@ -5619,9 +5626,8 @@ i_s_innodb_buf_page_lru_fill(
|
||||
page_info->fix_count, true));
|
||||
|
||||
#ifdef BTR_CUR_HASH_ADAPT
|
||||
OK(field_store_string(
|
||||
fields[IDX_BUF_LRU_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED],
|
||||
page_info->hashed ? "YES" : "NO"));
|
||||
#endif /* BTR_CUR_HASH_ADAPT */
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
|
||||
@@ -5640,32 +5646,36 @@ i_s_innodb_buf_page_lru_fill(
|
||||
/* If this is an index page, fetch the index name
|
||||
and table name */
|
||||
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
|
||||
const dict_index_t* index;
|
||||
bool ret = false;
|
||||
|
||||
mutex_enter(&dict_sys->mutex);
|
||||
index = dict_index_get_if_in_cache_low(
|
||||
page_info->index_id);
|
||||
|
||||
if (index) {
|
||||
|
||||
if (const dict_index_t* index =
|
||||
dict_index_get_if_in_cache_low(
|
||||
page_info->index_id)) {
|
||||
table_name_end = innobase_convert_name(
|
||||
table_name, sizeof(table_name),
|
||||
index->table_name,
|
||||
strlen(index->table_name),
|
||||
thd);
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store(
|
||||
table_name,
|
||||
uint(table_name_end - table_name),
|
||||
system_charset_info));
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
||||
|
||||
OK(field_store_index_name(
|
||||
fields[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||
index->name));
|
||||
ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
|
||||
->store(table_name,
|
||||
static_cast<uint>(
|
||||
table_name_end
|
||||
- table_name),
|
||||
system_charset_info)
|
||||
|| field_store_index_name(
|
||||
fields
|
||||
[IDX_BUF_LRU_PAGE_INDEX_NAME],
|
||||
index->name);
|
||||
}
|
||||
|
||||
mutex_exit(&dict_sys->mutex);
|
||||
|
||||
OK(ret);
|
||||
|
||||
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
|
||||
}
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store(
|
||||
@@ -5675,8 +5685,8 @@ i_s_innodb_buf_page_lru_fill(
|
||||
page_info->data_size, true));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
|
||||
page_info->zip_ssize ?
|
||||
512 << page_info->zip_ssize : 0, true));
|
||||
page_info->zip_ssize
|
||||
? 512 << page_info->zip_ssize : 0, true));
|
||||
|
||||
state = static_cast<enum buf_page_state>(page_info->page_state);
|
||||
|
||||
@@ -5705,35 +5715,31 @@ i_s_innodb_buf_page_lru_fill(
|
||||
|
||||
switch (page_info->io_fix) {
|
||||
case BUF_IO_NONE:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_NONE"));
|
||||
state_str = "IO_NONE";
|
||||
break;
|
||||
case BUF_IO_READ:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_READ"));
|
||||
state_str = "IO_READ";
|
||||
break;
|
||||
case BUF_IO_WRITE:
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
"IO_WRITE"));
|
||||
state_str = "IO_WRITE";
|
||||
break;
|
||||
case BUF_IO_PIN:
|
||||
state_str = "IO_PIN";
|
||||
break;
|
||||
}
|
||||
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX],
|
||||
state_str));
|
||||
|
||||
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IS_OLD],
|
||||
(page_info->is_old) ? "YES" : "NO"));
|
||||
page_info->is_old ? "YES" : "NO"));
|
||||
|
||||
OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store(
|
||||
page_info->freed_page_clock, true));
|
||||
|
||||
if (schema_table_store_record(thd, table)) {
|
||||
mem_heap_free(heap);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
mem_heap_empty(heap);
|
||||
OK(schema_table_store_record(thd, table));
|
||||
}
|
||||
|
||||
mem_heap_free(heap);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyrigth (c) 2014, 2017, MariaDB Corporation
|
||||
Copyright (c) 2014, 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
|
||||
@@ -73,6 +73,8 @@ extern struct st_maria_plugin i_s_innodb_sys_semaphore_waits;
|
||||
DBUG_RETURN(1); \
|
||||
}
|
||||
|
||||
#define BREAK_IF(expr) if ((expr)) break
|
||||
|
||||
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
|
||||
do { \
|
||||
if (!srv_was_started) { \
|
||||
|
||||
@@ -3601,7 +3601,7 @@ fail_exit:
|
||||
|
||||
if (mode == BTR_MODIFY_PREV) {
|
||||
err = btr_cur_optimistic_insert(
|
||||
BTR_NO_LOCKING_FLAG,
|
||||
BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
|
||||
cursor, &offsets, &offsets_heap,
|
||||
ibuf_entry, &ins_rec,
|
||||
&dummy_big_rec, 0, thr, &mtr);
|
||||
|
||||
@@ -244,15 +244,17 @@ btr_cur_optimistic_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction;
|
||||
if this function returns DB_SUCCESS on
|
||||
a leaf page of a secondary index in a
|
||||
@@ -279,15 +281,17 @@ btr_cur_pessimistic_insert(
|
||||
cursor stays valid */
|
||||
ulint** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
succeed */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or
|
||||
NULL */
|
||||
be stored externally by the caller */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
que_thr_t* thr, /*!< in: query thread or NULL */
|
||||
que_thr_t* thr, /*!< in/out: query thread; can be NULL if
|
||||
!(~flags
|
||||
& (BTR_NO_LOCKING_FLAG
|
||||
| BTR_NO_UNDO_LOG_FLAG)) */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
|
||||
/*************************************************************//**
|
||||
@@ -408,12 +412,12 @@ btr_cur_pessimistic_update(
|
||||
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
that can be emptied */
|
||||
mem_heap_t* entry_heap,
|
||||
/*!< in/out: memory heap for allocating
|
||||
big_rec and the index tuple */
|
||||
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
|
||||
be stored externally by the caller, or NULL */
|
||||
be stored externally by the caller */
|
||||
upd_t* update, /*!< in/out: update vector; this is allowed to
|
||||
also contain trx id and roll ptr fields.
|
||||
Non-updated columns that are moved offpage will
|
||||
@@ -434,7 +438,6 @@ undo log record created.
|
||||
dberr_t
|
||||
btr_cur_del_mark_set_clust_rec(
|
||||
/*===========================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
buf_block_t* block, /*!< in/out: buffer block of the record */
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
dict_index_t* index, /*!< in: clustered index of the record */
|
||||
|
||||
@@ -527,7 +527,8 @@ dtype_get_fixed_size_low(
|
||||
return(len);
|
||||
}
|
||||
}
|
||||
/* fall through for variable-length charsets */
|
||||
/* Treat as variable-length. */
|
||||
/* Fall through */
|
||||
case DATA_VARCHAR:
|
||||
case DATA_BINARY:
|
||||
case DATA_DECIMAL:
|
||||
|
||||
@@ -1064,7 +1064,7 @@ fil_ibd_create(
|
||||
ulint size,
|
||||
fil_encryption_t mode,
|
||||
uint32_t key_id)
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(2), warn_unused_result));
|
||||
|
||||
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
|
||||
(Typically when upgrading from MariaDB 10.1.0..10.1.20.)
|
||||
|
||||
@@ -827,13 +827,13 @@ mach_swap_byte_order(
|
||||
dest += len;
|
||||
|
||||
switch (len & 0x7) {
|
||||
case 0: *--dest = *from++;
|
||||
case 7: *--dest = *from++;
|
||||
case 6: *--dest = *from++;
|
||||
case 5: *--dest = *from++;
|
||||
case 4: *--dest = *from++;
|
||||
case 3: *--dest = *from++;
|
||||
case 2: *--dest = *from++;
|
||||
case 0: *--dest = *from++; /* fall through */
|
||||
case 7: *--dest = *from++; /* fall through */
|
||||
case 6: *--dest = *from++; /* fall through */
|
||||
case 5: *--dest = *from++; /* fall through */
|
||||
case 4: *--dest = *from++; /* fall through */
|
||||
case 3: *--dest = *from++; /* fall through */
|
||||
case 2: *--dest = *from++; /* fall through */
|
||||
case 1: *--dest = *from;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,7 +164,8 @@ page_zip_rec_needs_ext(
|
||||
ulint n_fields,
|
||||
const page_size_t& page_size)
|
||||
{
|
||||
ut_ad(rec_size > comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES);
|
||||
ut_ad(rec_size
|
||||
> (comp ? REC_N_NEW_EXTRA_BYTES : REC_N_OLD_EXTRA_BYTES));
|
||||
ut_ad(comp || !page_size.is_compressed());
|
||||
|
||||
#if UNIV_PAGE_SIZE_MAX > REC_MAX_DATA_SIZE
|
||||
|
||||
@@ -188,28 +188,28 @@ transaction.
|
||||
dberr_t
|
||||
trx_undo_report_row_operation(
|
||||
/*==========================*/
|
||||
ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is
|
||||
set, does nothing */
|
||||
ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or
|
||||
TRX_UNDO_MODIFY_OP */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
||||
index entry to insert into the
|
||||
clustered index, otherwise NULL */
|
||||
clustered index; in updates,
|
||||
may contain a clustered index
|
||||
record tuple that also contains
|
||||
virtual columns of the table;
|
||||
otherwise, NULL */
|
||||
const upd_t* update, /*!< in: in the case of an update,
|
||||
the update vector, otherwise NULL */
|
||||
ulint cmpl_info, /*!< in: compiler info on secondary
|
||||
index updates */
|
||||
const rec_t* rec, /*!< in: case of an update or delete
|
||||
marking, the record in the clustered
|
||||
index, otherwise NULL */
|
||||
index; NULL if insert */
|
||||
const ulint* offsets, /*!< in: rec_get_offsets(rec) */
|
||||
roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the
|
||||
inserted undo log record,
|
||||
0 if BTR_NO_UNDO_LOG
|
||||
flag was specified */
|
||||
MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result));
|
||||
MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result));
|
||||
|
||||
/** status bit used for trx_undo_prev_version_build() */
|
||||
|
||||
@@ -341,10 +341,6 @@ record */
|
||||
storage fields: used by purge to
|
||||
free the external storage */
|
||||
|
||||
/* Operation type flags used in trx_undo_report_row_operation */
|
||||
#define TRX_UNDO_INSERT_OP 1U
|
||||
#define TRX_UNDO_MODIFY_OP 2U
|
||||
|
||||
#include "trx0rec.ic"
|
||||
|
||||
#endif /* trx0rec_h */
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 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
|
||||
@@ -217,16 +218,22 @@ ut_fold_binary(
|
||||
switch (len & 0x7) {
|
||||
case 7:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
/* fall through */
|
||||
case 6:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
/* fall through */
|
||||
case 5:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
/* fall through */
|
||||
case 4:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
/* fall through */
|
||||
case 3:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
/* fall through */
|
||||
case 2:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
/* fall through */
|
||||
case 1:
|
||||
fold = ut_fold_ulint_pair(fold, (ulint)(*str++));
|
||||
}
|
||||
|
||||
@@ -795,12 +795,19 @@ lock_reset_lock_and_trx_wait(
|
||||
const char* stmt2=NULL;
|
||||
size_t stmt_len;
|
||||
trx_id_t trx_id = 0;
|
||||
stmt = innobase_get_stmt_unsafe(lock->trx->mysql_thd, &stmt_len);
|
||||
stmt = lock->trx->mysql_thd
|
||||
? innobase_get_stmt_unsafe(
|
||||
lock->trx->mysql_thd, &stmt_len)
|
||||
: NULL;
|
||||
|
||||
if (lock->trx->lock.wait_lock &&
|
||||
lock->trx->lock.wait_lock->trx) {
|
||||
trx_id = lock->trx->lock.wait_lock->trx->id;
|
||||
stmt2 = innobase_get_stmt_unsafe(lock->trx->lock.wait_lock->trx->mysql_thd, &stmt_len);
|
||||
stmt2 = lock->trx->lock.wait_lock->trx->mysql_thd
|
||||
? innobase_get_stmt_unsafe(
|
||||
lock->trx->lock.wait_lock
|
||||
->trx->mysql_thd, &stmt_len)
|
||||
: NULL;
|
||||
}
|
||||
|
||||
ib::error() <<
|
||||
@@ -5054,8 +5061,6 @@ lock_rec_unlock(
|
||||
lock_t* first_lock;
|
||||
lock_t* lock;
|
||||
ulint heap_no;
|
||||
const char* stmt;
|
||||
size_t stmt_len;
|
||||
|
||||
ut_ad(trx);
|
||||
ut_ad(rec);
|
||||
@@ -5083,13 +5088,15 @@ lock_rec_unlock(
|
||||
lock_mutex_exit();
|
||||
trx_mutex_exit(trx);
|
||||
|
||||
stmt = innobase_get_stmt_unsafe(trx->mysql_thd, &stmt_len);
|
||||
|
||||
{
|
||||
ib::error err;
|
||||
err << "Unlock row could not find a " << lock_mode
|
||||
<< " mode lock on the record. Current statement: ";
|
||||
err.write(stmt, stmt_len);
|
||||
size_t stmt_len;
|
||||
if (const char* stmt = innobase_get_stmt_unsafe(
|
||||
trx->mysql_thd, &stmt_len)) {
|
||||
err.write(stmt, stmt_len);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
@@ -1354,8 +1354,10 @@ rec_convert_dtuple_to_rec_comp(
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(end, dfield_get_data(field), len);
|
||||
end += len;
|
||||
if (len) {
|
||||
memcpy(end, dfield_get_data(field), len);
|
||||
end += len;
|
||||
}
|
||||
}
|
||||
|
||||
if (!num_v) {
|
||||
|
||||
@@ -1926,6 +1926,7 @@ PageConverter::update_page(
|
||||
case FIL_PAGE_TYPE_XDES:
|
||||
err = set_current_xdes(
|
||||
block->page.id.page_no(), get_frame(block));
|
||||
/* fall through */
|
||||
case FIL_PAGE_INODE:
|
||||
case FIL_PAGE_TYPE_TRX_SYS:
|
||||
case FIL_PAGE_IBUF_FREE_LIST:
|
||||
|
||||
@@ -2277,18 +2277,14 @@ for a clustered index!
|
||||
@retval DB_SUCCESS if no error
|
||||
@retval DB_DUPLICATE_KEY if error,
|
||||
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
|
||||
record
|
||||
@retval DB_SUCCESS_LOCKED_REC if an exact match of the record was found
|
||||
in online table rebuild (flags & (BTR_KEEP_SYS_FLAG | BTR_NO_LOCKING_FLAG)) */
|
||||
record */
|
||||
static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||
dberr_t
|
||||
row_ins_duplicate_error_in_clust(
|
||||
/*=============================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
btr_cur_t* cursor, /*!< in: B-tree cursor */
|
||||
const dtuple_t* entry, /*!< in: entry to insert */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
que_thr_t* thr) /*!< in: query thread */
|
||||
{
|
||||
dberr_t err;
|
||||
rec_t* rec;
|
||||
@@ -2299,8 +2295,6 @@ row_ins_duplicate_error_in_clust(
|
||||
ulint* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
UT_NOT_USED(mtr);
|
||||
|
||||
ut_ad(dict_index_is_clust(cursor->index));
|
||||
|
||||
/* NOTE: For unique non-clustered indexes there may be any number
|
||||
@@ -2662,7 +2656,7 @@ row_ins_clust_index_entry_low(
|
||||
DB_LOCK_WAIT */
|
||||
|
||||
err = row_ins_duplicate_error_in_clust(
|
||||
flags, cursor, entry, thr, &mtr);
|
||||
flags, cursor, entry, thr);
|
||||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
@@ -2038,6 +2038,7 @@ row_log_table_apply_update(
|
||||
|
||||
When applying the subsequent ROW_T_DELETE, no matching
|
||||
record will be found. */
|
||||
/* fall through */
|
||||
case DB_SUCCESS:
|
||||
ut_ad(row != NULL);
|
||||
break;
|
||||
|
||||
@@ -5082,12 +5082,10 @@ loop:
|
||||
case DB_INTERRUPTED:
|
||||
goto func_exit;
|
||||
default:
|
||||
{
|
||||
const char* doing = "CHECK TABLE";
|
||||
ib::warn() << doing << " on index " << index->name << " of"
|
||||
ib::warn() << "CHECK TABLE on index " << index->name << " of"
|
||||
" table " << index->table->name << " returned " << ret;
|
||||
/* fall through (this error is ignored by CHECK TABLE) */
|
||||
}
|
||||
/* (this error is ignored by CHECK TABLE) */
|
||||
/* fall through */
|
||||
case DB_END_OF_INDEX:
|
||||
ret = DB_SUCCESS;
|
||||
func_exit:
|
||||
|
||||
@@ -537,8 +537,9 @@ row_purge_remove_sec_if_poss_leaf(
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
/* fall through (the index entry is still needed,
|
||||
/* (The index entry is still needed,
|
||||
or the deletion succeeded) */
|
||||
/* fall through */
|
||||
case ROW_NOT_DELETED_REF:
|
||||
/* The index entry is still needed. */
|
||||
case ROW_BUFFERED:
|
||||
|
||||
@@ -2603,7 +2603,6 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||
dberr_t
|
||||
row_upd_clust_rec_by_insert(
|
||||
/*========================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
upd_node_t* node, /*!< in/out: row update node */
|
||||
dict_index_t* index, /*!< in: clustered index of the record */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
@@ -2672,7 +2671,7 @@ row_upd_clust_rec_by_insert(
|
||||
}
|
||||
|
||||
err = btr_cur_del_mark_set_clust_rec(
|
||||
flags, btr_cur_get_block(btr_cur), rec, index, offsets,
|
||||
btr_cur_get_block(btr_cur), rec, index, offsets,
|
||||
thr, node->row, mtr);
|
||||
if (err != DB_SUCCESS) {
|
||||
err_exit:
|
||||
@@ -2913,7 +2912,6 @@ static MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||
dberr_t
|
||||
row_upd_del_mark_clust_rec(
|
||||
/*=======================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
upd_node_t* node, /*!< in: row update node */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
ulint* offsets,/*!< in/out: rec_get_offsets() for the
|
||||
@@ -2951,7 +2949,7 @@ row_upd_del_mark_clust_rec(
|
||||
rec = btr_cur_get_rec(btr_cur);
|
||||
|
||||
err = btr_cur_del_mark_set_clust_rec(
|
||||
flags, btr_cur_get_block(btr_cur), rec,
|
||||
btr_cur_get_block(btr_cur), rec,
|
||||
index, offsets, thr, node->row, mtr);
|
||||
|
||||
if (err == DB_SUCCESS && referenced) {
|
||||
@@ -3020,7 +3018,6 @@ row_upd_clust_step(
|
||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
ulint* offsets;
|
||||
ibool referenced;
|
||||
ulint flags;
|
||||
ibool foreign = FALSE;
|
||||
trx_t* trx = thr_get_trx(thr);
|
||||
|
||||
@@ -3046,11 +3043,10 @@ row_upd_clust_step(
|
||||
server or connection lifetime and so REDO information is not needed
|
||||
on restart for recovery.
|
||||
Disable locking as temp-tables are not shared across connection. */
|
||||
if (dict_table_is_temporary(index->table)) {
|
||||
flags = BTR_NO_LOCKING_FLAG;
|
||||
const ulint flags = dict_table_is_temporary(index->table)
|
||||
? BTR_NO_LOCKING_FLAG : 0;
|
||||
if (flags) {
|
||||
mtr.set_log_mode(MTR_LOG_NO_REDO);
|
||||
} else {
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
/* If the restoration does not succeed, then the same
|
||||
@@ -3118,9 +3114,9 @@ row_upd_clust_step(
|
||||
offsets = rec_get_offsets(rec, index, offsets_,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
|
||||
if (!node->has_clust_rec_x_lock) {
|
||||
if (!flags && !node->has_clust_rec_x_lock) {
|
||||
err = lock_clust_rec_modify_check_and_lock(
|
||||
flags, btr_pcur_get_block(pcur),
|
||||
0, btr_pcur_get_block(pcur),
|
||||
rec, index, offsets, thr);
|
||||
if (err != DB_SUCCESS) {
|
||||
mtr_commit(&mtr);
|
||||
@@ -3136,7 +3132,7 @@ row_upd_clust_step(
|
||||
|
||||
if (node->is_delete) {
|
||||
err = row_upd_del_mark_clust_rec(
|
||||
flags, node, index, offsets, thr, referenced, foreign, &mtr);
|
||||
node, index, offsets, thr, referenced, foreign, &mtr);
|
||||
|
||||
if (err == DB_SUCCESS) {
|
||||
node->state = UPD_NODE_UPDATE_ALL_SEC;
|
||||
@@ -3182,7 +3178,7 @@ row_upd_clust_step(
|
||||
externally! */
|
||||
|
||||
err = row_upd_clust_rec_by_insert(
|
||||
flags, node, index, thr, referenced, foreign, &mtr);
|
||||
node, index, thr, referenced, foreign, &mtr);
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
goto exit_func;
|
||||
|
||||
@@ -539,16 +539,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency;
|
||||
|
||||
/** Acquire the system_mutex. */
|
||||
#define srv_sys_mutex_enter() do { \
|
||||
mutex_enter(&srv_sys->mutex); \
|
||||
mutex_enter(&srv_sys.mutex); \
|
||||
} while (0)
|
||||
|
||||
/** Test if the system mutex is owned. */
|
||||
#define srv_sys_mutex_own() (mutex_own(&srv_sys->mutex) \
|
||||
#define srv_sys_mutex_own() (mutex_own(&srv_sys.mutex) \
|
||||
&& !srv_read_only_mode)
|
||||
|
||||
/** Release the system mutex. */
|
||||
#define srv_sys_mutex_exit() do { \
|
||||
mutex_exit(&srv_sys->mutex); \
|
||||
mutex_exit(&srv_sys.mutex); \
|
||||
} while (0)
|
||||
|
||||
#define fetch_lock_wait_timeout(trx) \
|
||||
@@ -640,7 +640,7 @@ struct srv_sys_t{
|
||||
ulint n_sys_threads; /*!< size of the sys_threads
|
||||
array */
|
||||
|
||||
srv_slot_t* sys_threads; /*!< server thread table;
|
||||
srv_slot_t sys_threads[32 + 1]; /*!< server thread table;
|
||||
os_event_set() and
|
||||
os_event_reset() on
|
||||
sys_threads[]->event are
|
||||
@@ -657,7 +657,7 @@ struct srv_sys_t{
|
||||
activity */
|
||||
};
|
||||
|
||||
static srv_sys_t* srv_sys;
|
||||
static srv_sys_t srv_sys;
|
||||
|
||||
/** Event to signal srv_monitor_thread. Not protected by a mutex.
|
||||
Set after setting srv_print_innodb_monitor. */
|
||||
@@ -682,10 +682,10 @@ and/or load it during startup. */
|
||||
char srv_buffer_pool_dump_at_shutdown = TRUE;
|
||||
char srv_buffer_pool_load_at_startup = TRUE;
|
||||
|
||||
/** Slot index in the srv_sys->sys_threads array for the purge thread. */
|
||||
/** Slot index in the srv_sys.sys_threads array for the purge thread. */
|
||||
static const ulint SRV_PURGE_SLOT = 1;
|
||||
|
||||
/** Slot index in the srv_sys->sys_threads array for the master thread. */
|
||||
/** Slot index in the srv_sys.sys_threads array for the master thread. */
|
||||
static const ulint SRV_MASTER_SLOT = 0;
|
||||
|
||||
#ifdef HAVE_PSI_STAGE_INTERFACE
|
||||
@@ -825,21 +825,21 @@ srv_reserve_slot(
|
||||
|
||||
switch (type) {
|
||||
case SRV_MASTER:
|
||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
/* Find an empty slot, skip the master and purge slots. */
|
||||
for (slot = &srv_sys->sys_threads[2];
|
||||
for (slot = &srv_sys.sys_threads[2];
|
||||
slot->in_use;
|
||||
++slot) {
|
||||
|
||||
ut_a(slot < &srv_sys->sys_threads[
|
||||
srv_sys->n_sys_threads]);
|
||||
ut_a(slot < &srv_sys.sys_threads[
|
||||
srv_sys.n_sys_threads]);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -855,7 +855,7 @@ srv_reserve_slot(
|
||||
|
||||
ut_ad(srv_slot_get_type(slot) == type);
|
||||
|
||||
my_atomic_addlint(&srv_sys->n_threads_active[type], 1);
|
||||
my_atomic_addlint(&srv_sys.n_threads_active[type], 1);
|
||||
|
||||
srv_sys_mutex_exit();
|
||||
|
||||
@@ -885,13 +885,13 @@ srv_suspend_thread_low(
|
||||
case SRV_MASTER:
|
||||
/* We have only one master thread and it
|
||||
should be the first entry always. */
|
||||
ut_a(srv_sys->n_threads_active[type] == 1);
|
||||
ut_a(srv_sys.n_threads_active[type] == 1);
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
/* We have only one purge coordinator thread
|
||||
and it should be the second entry always. */
|
||||
ut_a(srv_sys->n_threads_active[type] == 1);
|
||||
ut_a(srv_sys.n_threads_active[type] == 1);
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
@@ -902,7 +902,7 @@ srv_suspend_thread_low(
|
||||
ut_a(!slot->suspended);
|
||||
slot->suspended = TRUE;
|
||||
|
||||
if (my_atomic_addlint(&srv_sys->n_threads_active[type], -1) < 0) {
|
||||
if (my_atomic_addlint(&srv_sys.n_threads_active[type], -1) < 0) {
|
||||
ut_error;
|
||||
}
|
||||
|
||||
@@ -959,7 +959,7 @@ srv_resume_thread(srv_slot_t* slot, int64_t sig_count = 0, bool wait = true,
|
||||
ut_ad(slot->suspended);
|
||||
|
||||
slot->suspended = FALSE;
|
||||
my_atomic_addlint(&srv_sys->n_threads_active[slot->type], 1);
|
||||
my_atomic_addlint(&srv_sys.n_threads_active[slot->type], 1);
|
||||
srv_sys_mutex_exit();
|
||||
return(timeout);
|
||||
}
|
||||
@@ -981,8 +981,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
|
||||
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||
|
||||
if (!slot->in_use || srv_slot_get_type(slot) != type) {
|
||||
continue;
|
||||
@@ -1002,7 +1002,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
should be the first entry always. */
|
||||
ut_a(n == 1);
|
||||
ut_a(i == SRV_MASTER_SLOT);
|
||||
ut_a(srv_sys->n_threads_active[type] == 0);
|
||||
ut_a(srv_sys.n_threads_active[type] == 0);
|
||||
break;
|
||||
|
||||
case SRV_PURGE:
|
||||
@@ -1011,12 +1011,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
|
||||
ut_a(n == 1);
|
||||
ut_a(i == SRV_PURGE_SLOT);
|
||||
ut_a(srv_n_purge_threads > 0);
|
||||
ut_a(srv_sys->n_threads_active[type] == 0);
|
||||
ut_a(srv_sys.n_threads_active[type] == 0);
|
||||
break;
|
||||
|
||||
case SRV_WORKER:
|
||||
ut_a(srv_n_purge_threads > 1);
|
||||
ut_a(srv_sys->n_threads_active[type]
|
||||
ut_a(srv_sys.n_threads_active[type]
|
||||
< srv_n_purge_threads - 1);
|
||||
break;
|
||||
}
|
||||
@@ -1052,32 +1052,19 @@ static
|
||||
void
|
||||
srv_init()
|
||||
{
|
||||
ulint n_sys_threads = 0;
|
||||
ulint srv_sys_sz = sizeof(*srv_sys);
|
||||
|
||||
mutex_create(LATCH_ID_SRV_INNODB_MONITOR, &srv_innodb_monitor_mutex);
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
|
||||
/* Number of purge threads + master thread */
|
||||
n_sys_threads = srv_n_purge_threads + 1;
|
||||
|
||||
srv_sys_sz += n_sys_threads * sizeof(*srv_sys->sys_threads);
|
||||
}
|
||||
|
||||
srv_sys = static_cast<srv_sys_t*>(ut_zalloc_nokey(srv_sys_sz));
|
||||
|
||||
srv_sys->n_sys_threads = n_sys_threads;
|
||||
srv_sys.n_sys_threads = srv_read_only_mode
|
||||
? 0
|
||||
: srv_n_purge_threads + 1/* purge coordinator */;
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
mutex_create(LATCH_ID_SRV_SYS, &srv_sys->mutex);
|
||||
mutex_create(LATCH_ID_SRV_SYS, &srv_sys.mutex);
|
||||
|
||||
mutex_create(LATCH_ID_SRV_SYS_TASKS, &srv_sys->tasks_mutex);
|
||||
mutex_create(LATCH_ID_SRV_SYS_TASKS, &srv_sys.tasks_mutex);
|
||||
|
||||
srv_sys->sys_threads = (srv_slot_t*) &srv_sys[1];
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys.sys_threads[i];
|
||||
|
||||
slot->event = os_event_create(0);
|
||||
|
||||
@@ -1092,7 +1079,7 @@ srv_init()
|
||||
|
||||
buf_flush_event = os_event_create("buf_flush_event");
|
||||
|
||||
UT_LIST_INIT(srv_sys->tasks, &que_thr_t::queue);
|
||||
UT_LIST_INIT(srv_sys.tasks, &que_thr_t::queue);
|
||||
}
|
||||
|
||||
srv_buf_resize_event = os_event_create(0);
|
||||
@@ -1136,7 +1123,7 @@ void
|
||||
srv_free(void)
|
||||
/*==========*/
|
||||
{
|
||||
if (!srv_sys) {
|
||||
if (!srv_buf_resize_event) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1144,13 +1131,11 @@ srv_free(void)
|
||||
mutex_free(&page_zip_stat_per_index_mutex);
|
||||
|
||||
if (!srv_read_only_mode) {
|
||||
mutex_free(&srv_sys->mutex);
|
||||
mutex_free(&srv_sys->tasks_mutex);
|
||||
mutex_free(&srv_sys.mutex);
|
||||
mutex_free(&srv_sys.tasks_mutex);
|
||||
|
||||
for (ulint i = 0; i < srv_sys->n_sys_threads; ++i) {
|
||||
srv_slot_t* slot = &srv_sys->sys_threads[i];
|
||||
|
||||
os_event_destroy(slot->event);
|
||||
for (ulint i = 0; i < srv_sys.n_sys_threads; ++i) {
|
||||
os_event_destroy(srv_sys.sys_threads[i].event);
|
||||
}
|
||||
|
||||
os_event_destroy(srv_error_event);
|
||||
@@ -1161,18 +1146,11 @@ srv_free(void)
|
||||
|
||||
os_event_destroy(srv_buf_resize_event);
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
os_event_destroy(srv_master_thread_disabled_event);
|
||||
srv_master_thread_disabled_event = NULL;
|
||||
#endif /* UNIV_DEBUG */
|
||||
ut_d(os_event_destroy(srv_master_thread_disabled_event));
|
||||
|
||||
dict_ind_free();
|
||||
|
||||
trx_i_s_cache_free(trx_i_s_cache);
|
||||
|
||||
ut_free(srv_sys);
|
||||
|
||||
srv_sys = 0;
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
@@ -2020,7 +1998,7 @@ void
|
||||
srv_inc_activity_count(void)
|
||||
/*========================*/
|
||||
{
|
||||
srv_sys->activity_count.inc();
|
||||
srv_sys.activity_count.inc();
|
||||
}
|
||||
|
||||
/**********************************************************************//**
|
||||
@@ -2041,7 +2019,7 @@ srv_get_active_thread_type(void)
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) {
|
||||
if (srv_sys->n_threads_active[i] != 0) {
|
||||
if (srv_sys.n_threads_active[i] != 0) {
|
||||
ret = static_cast<srv_thread_type>(i);
|
||||
break;
|
||||
}
|
||||
@@ -2076,12 +2054,12 @@ srv_active_wake_master_thread_low()
|
||||
|
||||
srv_inc_activity_count();
|
||||
|
||||
if (my_atomic_loadlint(&srv_sys->n_threads_active[SRV_MASTER]) == 0) {
|
||||
if (my_atomic_loadlint(&srv_sys.n_threads_active[SRV_MASTER]) == 0) {
|
||||
srv_slot_t* slot;
|
||||
|
||||
srv_sys_mutex_enter();
|
||||
|
||||
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT];
|
||||
slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
|
||||
|
||||
/* Only if the master thread has been started. */
|
||||
|
||||
@@ -2101,7 +2079,7 @@ srv_wake_purge_thread_if_not_active()
|
||||
ut_ad(!srv_sys_mutex_own());
|
||||
|
||||
if (purge_sys->state == PURGE_STATE_RUN
|
||||
&& !my_atomic_loadlint(&srv_sys->n_threads_active[SRV_PURGE])
|
||||
&& !my_atomic_loadlint(&srv_sys.n_threads_active[SRV_PURGE])
|
||||
&& my_atomic_loadlint(&trx_sys->rseg_history_len)) {
|
||||
|
||||
srv_release_threads(SRV_PURGE, 1);
|
||||
@@ -2124,7 +2102,7 @@ ulint
|
||||
srv_get_activity_count(void)
|
||||
/*========================*/
|
||||
{
|
||||
return(srv_sys->activity_count);
|
||||
return(srv_sys.activity_count);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
@@ -2135,7 +2113,7 @@ srv_check_activity(
|
||||
/*===============*/
|
||||
ulint old_activity_count) /*!< in: old activity count */
|
||||
{
|
||||
return(srv_sys->activity_count != old_activity_count);
|
||||
return(srv_sys.activity_count != old_activity_count);
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
@@ -2555,7 +2533,7 @@ DECLARE_THREAD(srv_master_thread)(
|
||||
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
|
||||
|
||||
slot = srv_reserve_slot(SRV_MASTER);
|
||||
ut_a(slot == srv_sys->sys_threads);
|
||||
ut_a(slot == srv_sys.sys_threads);
|
||||
|
||||
last_print_time = ut_time();
|
||||
loop:
|
||||
@@ -2650,18 +2628,18 @@ srv_task_execute(void)
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND);
|
||||
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
if (UT_LIST_GET_LEN(srv_sys->tasks) > 0) {
|
||||
if (UT_LIST_GET_LEN(srv_sys.tasks) > 0) {
|
||||
|
||||
thr = UT_LIST_GET_FIRST(srv_sys->tasks);
|
||||
thr = UT_LIST_GET_FIRST(srv_sys.tasks);
|
||||
|
||||
ut_a(que_node_get_type(thr->child) == QUE_NODE_PURGE);
|
||||
|
||||
UT_LIST_REMOVE(srv_sys->tasks, thr);
|
||||
UT_LIST_REMOVE(srv_sys.tasks, thr);
|
||||
}
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
if (thr != NULL) {
|
||||
|
||||
@@ -2699,7 +2677,7 @@ DECLARE_THREAD(srv_worker_thread)(
|
||||
slot = srv_reserve_slot(SRV_WORKER);
|
||||
|
||||
ut_a(srv_n_purge_threads > 1);
|
||||
ut_a(my_atomic_loadlint(&srv_sys->n_threads_active[SRV_WORKER])
|
||||
ut_a(my_atomic_loadlint(&srv_sys.n_threads_active[SRV_WORKER])
|
||||
< static_cast<lint>(srv_n_purge_threads));
|
||||
|
||||
/* We need to ensure that the worker threads exit after the
|
||||
@@ -3041,11 +3019,11 @@ srv_que_task_enqueue_low(
|
||||
que_thr_t* thr) /*!< in: query thread */
|
||||
{
|
||||
ut_ad(!srv_read_only_mode);
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
UT_LIST_ADD_LAST(srv_sys->tasks, thr);
|
||||
UT_LIST_ADD_LAST(srv_sys.tasks, thr);
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
srv_release_threads(SRV_WORKER, 1);
|
||||
}
|
||||
@@ -3061,11 +3039,11 @@ srv_get_task_queue_length(void)
|
||||
|
||||
ut_ad(!srv_read_only_mode);
|
||||
|
||||
mutex_enter(&srv_sys->tasks_mutex);
|
||||
mutex_enter(&srv_sys.tasks_mutex);
|
||||
|
||||
n_tasks = UT_LIST_GET_LEN(srv_sys->tasks);
|
||||
n_tasks = UT_LIST_GET_LEN(srv_sys.tasks);
|
||||
|
||||
mutex_exit(&srv_sys->tasks_mutex);
|
||||
mutex_exit(&srv_sys.tasks_mutex);
|
||||
|
||||
return(n_tasks);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation
|
||||
Copyright (c) 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
|
||||
@@ -1839,22 +1839,22 @@ transaction.
|
||||
dberr_t
|
||||
trx_undo_report_row_operation(
|
||||
/*==========================*/
|
||||
ulint flags, /*!< in: if BTR_NO_UNDO_LOG_FLAG bit is
|
||||
set, does nothing */
|
||||
ulint op_type, /*!< in: TRX_UNDO_INSERT_OP or
|
||||
TRX_UNDO_MODIFY_OP */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const dtuple_t* clust_entry, /*!< in: in the case of an insert,
|
||||
index entry to insert into the
|
||||
clustered index, otherwise NULL */
|
||||
clustered index; in updates,
|
||||
may contain a clustered index
|
||||
record tuple that also contains
|
||||
virtual columns of the table;
|
||||
otherwise, NULL */
|
||||
const upd_t* update, /*!< in: in the case of an update,
|
||||
the update vector, otherwise NULL */
|
||||
ulint cmpl_info, /*!< in: compiler info on secondary
|
||||
index updates */
|
||||
const rec_t* rec, /*!< in: in case of an update or delete
|
||||
const rec_t* rec, /*!< in: case of an update or delete
|
||||
marking, the record in the clustered
|
||||
index, otherwise NULL */
|
||||
index; NULL if insert */
|
||||
const ulint* offsets, /*!< in: rec_get_offsets(rec) */
|
||||
roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the
|
||||
inserted undo log record,
|
||||
@@ -1870,18 +1870,9 @@ trx_undo_report_row_operation(
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
ut_a(dict_index_is_clust(index));
|
||||
ut_ad(!update || rec);
|
||||
ut_ad(!rec || rec_offs_validate(rec, index, offsets));
|
||||
ut_ad(!srv_read_only_mode);
|
||||
ut_ad(op_type == TRX_UNDO_INSERT_OP || op_type == TRX_UNDO_MODIFY_OP);
|
||||
ut_ad((op_type != TRX_UNDO_INSERT_OP)
|
||||
|| (clust_entry && !update && !rec));
|
||||
|
||||
if (flags & BTR_NO_UNDO_LOG_FLAG) {
|
||||
|
||||
*roll_ptr = 0;
|
||||
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
|
||||
trx = thr_get_trx(thr);
|
||||
|
||||
@@ -1902,7 +1893,7 @@ trx_undo_report_row_operation(
|
||||
not listed there. */
|
||||
trx->mod_tables.insert(index->table);
|
||||
|
||||
pundo = op_type == TRX_UNDO_INSERT_OP
|
||||
pundo = !rec
|
||||
? &trx->rsegs.m_redo.insert_undo
|
||||
: &trx->rsegs.m_redo.update_undo;
|
||||
rseg = trx->rsegs.m_redo.rseg;
|
||||
@@ -1913,7 +1904,7 @@ trx_undo_report_row_operation(
|
||||
|
||||
if (*pundo) {
|
||||
err = DB_SUCCESS;
|
||||
} else if (op_type == TRX_UNDO_INSERT_OP || is_temp) {
|
||||
} else if (!rec || is_temp) {
|
||||
err = trx_undo_assign_undo(trx, rseg, pundo, TRX_UNDO_INSERT);
|
||||
} else {
|
||||
err = trx_undo_assign_undo(trx, rseg, pundo, TRX_UNDO_UPDATE);
|
||||
@@ -1937,23 +1928,14 @@ trx_undo_report_row_operation(
|
||||
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
|
||||
|
||||
do {
|
||||
page_t* undo_page;
|
||||
ulint offset;
|
||||
|
||||
undo_page = buf_block_get_frame(undo_block);
|
||||
ut_ad(page_no == undo_block->page.id.page_no());
|
||||
|
||||
switch (op_type) {
|
||||
case TRX_UNDO_INSERT_OP:
|
||||
offset = trx_undo_page_report_insert(
|
||||
undo_page, trx, index, clust_entry, &mtr);
|
||||
break;
|
||||
default:
|
||||
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
|
||||
offset = trx_undo_page_report_modify(
|
||||
page_t* undo_page = buf_block_get_frame(undo_block);
|
||||
ulint offset = !rec
|
||||
? trx_undo_page_report_insert(
|
||||
undo_page, trx, index, clust_entry, &mtr)
|
||||
: trx_undo_page_report_modify(
|
||||
undo_page, trx, index, rec, offsets, update,
|
||||
cmpl_info, clust_entry, &mtr);
|
||||
}
|
||||
|
||||
if (UNIV_UNLIKELY(offset == 0)) {
|
||||
/* The record did not fit on the page. We erase the
|
||||
@@ -2007,8 +1989,7 @@ trx_undo_report_row_operation(
|
||||
mutex_exit(&trx->undo_mutex);
|
||||
|
||||
*roll_ptr = trx_undo_build_roll_ptr(
|
||||
op_type == TRX_UNDO_INSERT_OP,
|
||||
rseg->id, page_no, offset);
|
||||
!rec, rseg->id, page_no, offset);
|
||||
return(DB_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 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
|
||||
|
||||
@@ -157,6 +157,7 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function,
|
||||
if (info->s->data_file_type != DYNAMIC_RECORD)
|
||||
break;
|
||||
/* Remove read/write cache if dynamic rows */
|
||||
/* fall through */
|
||||
case HA_EXTRA_NO_CACHE:
|
||||
if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
|
||||
{
|
||||
@@ -313,7 +314,7 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function,
|
||||
share->state.open_count= 1;
|
||||
share->changed= 1;
|
||||
_ma_mark_file_changed_now(share);
|
||||
/* Fall trough */
|
||||
/* Fall through */
|
||||
case HA_EXTRA_PREPARE_FOR_RENAME:
|
||||
{
|
||||
my_bool do_flush= MY_TEST(function != HA_EXTRA_PREPARE_FOR_DROP);
|
||||
|
||||
@@ -3061,7 +3061,7 @@ static MARIA_HA *get_MARIA_HA_from_REDO_record(const
|
||||
case LOGREC_REDO_INDEX:
|
||||
case LOGREC_REDO_INDEX_FREE_PAGE:
|
||||
index_page_redo_entry= 1;
|
||||
/* Fall trough*/
|
||||
/* Fall through */
|
||||
case LOGREC_REDO_INSERT_ROW_HEAD:
|
||||
case LOGREC_REDO_INSERT_ROW_TAIL:
|
||||
case LOGREC_REDO_PURGE_ROW_HEAD:
|
||||
|
||||
@@ -150,6 +150,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
|
||||
if (info->s->data_file_type != DYNAMIC_RECORD)
|
||||
break;
|
||||
/* Remove read/write cache if dynamic rows */
|
||||
/* fall through */
|
||||
case HA_EXTRA_NO_CACHE:
|
||||
if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
|
||||
{
|
||||
@@ -262,7 +263,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
|
||||
//share->deleting= TRUE;
|
||||
share->global_changed= FALSE; /* force writing changed flag */
|
||||
_mi_mark_file_changed(info);
|
||||
/* Fall trough */
|
||||
/* Fall through */
|
||||
case HA_EXTRA_PREPARE_FOR_RENAME:
|
||||
DBUG_ASSERT(!share->temporary);
|
||||
mysql_mutex_lock(&THR_LOCK_myisam);
|
||||
|
||||
@@ -29,7 +29,7 @@ static void mi_update_status_with_lock(MI_INFO *info);
|
||||
|
||||
int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
{
|
||||
int error;
|
||||
int error, mark_crashed= 0;
|
||||
uint count;
|
||||
MYISAM_SHARE *share=info->s;
|
||||
DBUG_ENTER("mi_lock_database");
|
||||
@@ -52,6 +52,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
}
|
||||
|
||||
error= 0;
|
||||
DBUG_EXECUTE_IF ("mi_lock_database_failure", error= EINVAL;);
|
||||
mysql_mutex_lock(&share->intern_lock);
|
||||
if (share->kfile >= 0) /* May only be false on windows */
|
||||
{
|
||||
@@ -75,17 +76,15 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
&share->dirty_part_map,
|
||||
FLUSH_KEEP))
|
||||
{
|
||||
error=my_errno;
|
||||
mark_crashed= error=my_errno;
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
mi_mark_crashed(info); /* Mark that table must be checked */
|
||||
}
|
||||
if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
|
||||
{
|
||||
if (end_io_cache(&info->rec_cache))
|
||||
{
|
||||
error=my_errno;
|
||||
mark_crashed= error=my_errno;
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
mi_mark_crashed(info);
|
||||
}
|
||||
}
|
||||
if (!count)
|
||||
@@ -110,22 +109,19 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
share->state.unique= info->last_unique= info->this_unique;
|
||||
share->state.update_count= info->last_loop= ++info->this_loop;
|
||||
if (mi_state_info_write(share->kfile, &share->state, 1))
|
||||
error=my_errno;
|
||||
mark_crashed= error=my_errno;
|
||||
share->changed=0;
|
||||
if (myisam_flush)
|
||||
{
|
||||
if (mysql_file_sync(share->kfile, MYF(0)))
|
||||
error= my_errno;
|
||||
mark_crashed= error= my_errno;
|
||||
if (mysql_file_sync(info->dfile, MYF(0)))
|
||||
error= my_errno;
|
||||
mark_crashed= error= my_errno;
|
||||
}
|
||||
else
|
||||
share->not_flushed=1;
|
||||
if (error)
|
||||
{
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
mi_mark_crashed(info);
|
||||
}
|
||||
}
|
||||
if (info->lock_type != F_EXTRA_LCK)
|
||||
{
|
||||
@@ -260,6 +256,8 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
||||
}
|
||||
#endif
|
||||
mysql_mutex_unlock(&share->intern_lock);
|
||||
if (mark_crashed)
|
||||
mi_mark_crashed(info);
|
||||
DBUG_RETURN(error);
|
||||
} /* mi_lock_database */
|
||||
|
||||
|
||||
@@ -216,7 +216,9 @@ enum ESphGroupBy
|
||||
SPH_GROUPBY_WEEK = 1, ///< group by week
|
||||
SPH_GROUPBY_MONTH = 2, ///< group by month
|
||||
SPH_GROUPBY_YEAR = 3, ///< group by year
|
||||
SPH_GROUPBY_ATTR = 4 ///< group by attribute value
|
||||
SPH_GROUPBY_ATTR = 4, ///< group by attribute value
|
||||
SPH_GROUPBY_ATTRPAIR = 5, ///< group by sequential attrs pair (rendered redundant by 64bit attrs support; removed)
|
||||
SPH_GROUPBY_MULTIPLE = 6 ///< group by on multiple attribute values
|
||||
};
|
||||
|
||||
/// known attribute types
|
||||
@@ -911,7 +913,7 @@ bool sphinx_show_status ( THD * thd )
|
||||
}
|
||||
|
||||
// show last error or warning (either in addition to stats, or on their own)
|
||||
if ( pTls && pTls->m_pHeadTable && pTls->m_pHeadTable->m_tStats.m_sLastMessage && pTls->m_pHeadTable->m_tStats.m_sLastMessage[0] )
|
||||
if ( pTls && pTls->m_pHeadTable && pTls->m_pHeadTable->m_tStats.m_sLastMessage[0] )
|
||||
{
|
||||
const char * sMessageType = pTls->m_pHeadTable->m_tStats.m_bLastError ? "error" : "warning";
|
||||
|
||||
@@ -1563,6 +1565,7 @@ bool CSphSEQuery::ParseField ( char * sField )
|
||||
{ "month:", SPH_GROUPBY_MONTH },
|
||||
{ "year:", SPH_GROUPBY_YEAR },
|
||||
{ "attr:", SPH_GROUPBY_ATTR },
|
||||
{ "multi:", SPH_GROUPBY_MULTIPLE }
|
||||
};
|
||||
|
||||
int i;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user