1
0
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:
Marko Mäkelä
2017-05-22 09:20:20 +03:00
136 changed files with 1290 additions and 975 deletions

View File

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

View File

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

View File

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

View File

@@ -174,6 +174,7 @@ register char **argv[];
break;
case 'V':
version=1;
/* fall through */
case 'I':
case '?':
help=1; /* Help text written */

View File

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

View File

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

View File

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

View File

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

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

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

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

View File

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

View File

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

View File

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

View File

@@ -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).)*$');

View File

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

View File

@@ -3,6 +3,7 @@
#
--source include/not_embedded.inc
--source include/have_perfschema.inc
--source include/have_profiling.inc
--source include/platform.inc
#

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 */))

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,7 +7,7 @@
/***********************************************************************/
#ifndef __TABEXT_H
#define __TABEXTF_H
#define __TABEXT_H
#include "reldef.h"

View File

@@ -1530,7 +1530,7 @@ void JSONCOL::WriteColumn(PGLOBAL g)
break;
} // endif Op
// Passthru
// fall through
case TYPE_DATE:
case TYPE_INT:
case TYPE_SHORT:

View File

@@ -118,7 +118,7 @@ ulonglong CharToNumber(char *p, int n, ulonglong maxval,
maxval++;
if (minus) *minus = true;
} // endif Unsigned
/* fall through */
case '+':
p++;
break;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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