Merge 10.0 into 10.1

This commit is contained in:
Marko Mäkelä 2017-05-19 08:53:58 +03:00
commit 13a350ac29
75 changed files with 830 additions and 790 deletions

View File

@ -3962,6 +3962,7 @@ xtrabackup_backup_func(void)
mysql_data_home[0]=FN_CURLIB; // all paths are relative from here mysql_data_home[0]=FN_CURLIB; // all paths are relative from here
mysql_data_home[1]=0; mysql_data_home[1]=0;
srv_n_purge_threads = 1;
srv_read_only_mode = TRUE; srv_read_only_mode = TRUE;
srv_backup_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[0]=FN_CURLIB; // all paths are relative from here
mysql_data_home[1]=0; mysql_data_home[1]=0;
srv_n_purge_threads = 1;
/* set read only */ /* set read only */
srv_read_only_mode = TRUE; srv_read_only_mode = TRUE;
@ -6407,6 +6409,7 @@ skip_check:
/* Create logfiles for recovery from 'xtrabackup_logfile', before start InnoDB */ /* Create logfiles for recovery from 'xtrabackup_logfile', before start InnoDB */
srv_max_n_threads = 1000; srv_max_n_threads = 1000;
srv_n_purge_threads = 1;
ut_mem_init(); ut_mem_init();
/* temporally dummy value to avoid crash */ /* temporally dummy value to avoid crash */
srv_page_size_shift = 14; srv_page_size_shift = 14;

View File

@ -934,6 +934,12 @@ extern ulonglong my_getcputime(void);
#define hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION)) #define hrtime_sec_part(X) ((ulong)((X).val % HRTIME_RESOLUTION))
#define my_time(X) hrtime_to_time(my_hrtime()) #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 #ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h> #include <sys/mman.h>

View File

@ -1406,7 +1406,7 @@ void set_stmt_errmsg(MYSQL_STMT *stmt, NET *net)
DBUG_ASSERT(stmt != 0); DBUG_ASSERT(stmt != 0);
stmt->last_errno= net->last_errno; 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->last_error, net->last_error);
strmov(stmt->sqlstate, net->sqlstate); strmov(stmt->sqlstate, net->sqlstate);
@ -4709,8 +4709,7 @@ my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
{ {
uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */ uchar buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
if ((rc= reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR))) reset_stmt_handle(stmt, RESET_ALL_BUFFERS | RESET_CLEAR_ERROR);
return rc;
int4store(buff, stmt->stmt_id); int4store(buff, stmt->stmt_id);
if ((rc= stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt))) if ((rc= stmt_command(mysql, COM_STMT_CLOSE, buff, 4, stmt)))

View File

@ -878,3 +878,8 @@ SET @regCheck= '\\xE0\\x01';
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck; SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck;
CAST(0xE001 AS BINARY) REGEXP @regCheck CAST(0xE001 AS BINARY) REGEXP @regCheck
1 1
# MDEV-12420: Testing recursion overflow
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).)*$');
1
Warnings:
Warning 1139 Got error 'pcre_exec: recursion limit of NUM exceeded' from regexp

View File

@ -27,3 +27,15 @@ CHECK TABLE t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 check status OK test.t1 check status OK
DROP TABLE t1,t2; DROP TABLE t1,t2;
call mtr.add_suppression('Incorrect key file for table');
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 Incorrect key file for table './test/t1.MYI'; 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

@ -426,3 +426,7 @@ SELECT 0xE001 REGEXP @regCheck;
SET NAMES latin1; SET NAMES latin1;
SET @regCheck= '\\xE0\\x01'; SET @regCheck= '\\xE0\\x01';
SELECT CAST(0xE001 AS BINARY) REGEXP @regCheck; 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

@ -59,3 +59,16 @@ KILL QUERY @thread_id;
CHECK TABLE t1; CHECK TABLE t1;
DROP TABLE t1,t2; DROP TABLE t1,t2;
DISCONNECT insertConn; DISCONNECT insertConn;
#
# MDEV-12761 Error return from external_lock make the server crash
#
call mtr.add_suppression('Incorrect key file for table');
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/not_embedded.inc
--source include/have_perfschema.inc --source include/have_perfschema.inc
--source include/have_profiling.inc
--source include/platform.inc --source include/platform.inc
# #

View File

@ -324,12 +324,6 @@ static int match_pins(LF_PINS *el, void *addr)
return 0; 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 next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset)))
#define anext_node(X) next_node(&allocator->pinbox, (X)) #define anext_node(X) next_node(&allocator->pinbox, (X))

View File

@ -5830,7 +5830,7 @@ int handler::ha_external_lock(THD *thd, int lock_type)
DBUG_EXECUTE_IF("external_lock_failure", error= HA_ERR_GENERIC;); 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; m_lock_type= lock_type;
cached_table_flags= table_flags(); cached_table_flags= table_flags();

View File

@ -5311,6 +5311,15 @@ int Regexp_processor_pcre::default_regex_flags()
return default_regex_flags_pcre(current_thd); 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. Convert string to lib_charset, if needed.
@ -5402,15 +5411,77 @@ void Regexp_processor_pcre::pcre_exec_warn(int rc) const
*/ */
switch (rc) 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: case PCRE_ERROR_NOMEMORY:
errmsg= "pcre_exec: Out of memory"; errmsg= "pcre_exec: Out of memory";
break; 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: case PCRE_ERROR_BADUTF8:
errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string"; errmsg= "pcre_exec: Invalid utf8 byte sequence in the subject string";
break; 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: case PCRE_ERROR_RECURSELOOP:
errmsg= "pcre_exec: Recursion loop detected"; errmsg= "pcre_exec: Recursion loop detected";
break; 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: default:
/* /*
As other error codes should normally not happen, As other error codes should normally not happen,
@ -5446,7 +5517,7 @@ int Regexp_processor_pcre::pcre_exec_with_warn(const pcre *code,
bool Regexp_processor_pcre::exec(const char *str, int length, int offset) 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); m_SubStrVec, m_subpatterns_needed * 3);
return false; return false;
} }
@ -5457,7 +5528,7 @@ bool Regexp_processor_pcre::exec(String *str, int offset,
{ {
if (!(str= convert_if_needed(str, &subject_converter))) if (!(str= convert_if_needed(str, &subject_converter)))
return true; 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(), str->c_ptr_safe(), str->length(),
offset, 0, offset, 0,
m_SubStrVec, m_subpatterns_needed * 3); m_SubStrVec, m_subpatterns_needed * 3);

View File

@ -1892,6 +1892,7 @@ public:
class Regexp_processor_pcre class Regexp_processor_pcre
{ {
pcre *m_pcre; pcre *m_pcre;
pcre_extra m_pcre_extra;
bool m_conversion_is_needed; bool m_conversion_is_needed;
bool m_is_const; bool m_is_const;
int m_library_flags; int m_library_flags;
@ -1916,8 +1917,12 @@ public:
m_data_charset(&my_charset_utf8_general_ci), m_data_charset(&my_charset_utf8_general_ci),
m_library_charset(&my_charset_utf8_general_ci), m_library_charset(&my_charset_utf8_general_ci),
m_subpatterns_needed(0) m_subpatterns_needed(0)
{} {
m_pcre_extra.flags= PCRE_EXTRA_MATCH_LIMIT_RECURSION;
m_pcre_extra.match_limit_recursion= 100L;
}
int default_regex_flags(); int default_regex_flags();
void set_recursion_limit(THD *);
void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg) void init(CHARSET_INFO *data_charset, int extra_flags, uint nsubpatterns_arg)
{ {
m_library_flags= default_regex_flags() | extra_flags | m_library_flags= default_regex_flags() | extra_flags |

View File

@ -392,6 +392,7 @@ void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock)
void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock) void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock, bool free_lock)
{ {
DBUG_ENTER("mysql_unlock_tables"); DBUG_ENTER("mysql_unlock_tables");
bool errors= thd->is_error();
THD_STAGE_INFO(thd, stage_unlocking_tables); THD_STAGE_INFO(thd, stage_unlocking_tables);
if (sql_lock->table_count) if (sql_lock->table_count)
@ -400,6 +401,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); thr_multi_unlock(sql_lock->locks, sql_lock->lock_count, 0);
if (free_lock) if (free_lock)
my_free(sql_lock); my_free(sql_lock);
if (!errors)
thd->clear_error();
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@ -1304,7 +1304,7 @@ bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
/* fill in user_host value: the format is "%s[%s] @ %s [%s]" */ /* fill in user_host value: the format is "%s[%s] @ %s [%s]" */
user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE, user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
sctx->priv_user ? sctx->priv_user : "", "[", sctx->priv_user, "[",
sctx->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), "] @ ", sctx->user ? sctx->user : (thd->slave_thread ? "SQL_SLAVE" : ""), "] @ ",
sctx->host ? sctx->host : "", " [", sctx->host ? sctx->host : "", " [",
sctx->ip ? sctx->ip : "", "]", NullS) - sctx->ip ? sctx->ip : "", "]", NullS) -

View File

@ -1584,8 +1584,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi)
default: default:
rli->report(ERROR_LEVEL, thd->net.last_errno, NULL, rli->report(ERROR_LEVEL, thd->net.last_errno, NULL,
"Error in %s event: row application failed. %s", "Error in %s event: row application failed. %s",
get_type_str(), get_type_str(), thd->net.last_error);
thd->net.last_error ? thd->net.last_error : "");
thd->is_slave_error= 1; thd->is_slave_error= 1;
break; break;
} }
@ -1624,8 +1623,7 @@ int Old_rows_log_event::do_apply_event(rpl_group_info *rgi)
"Error in %s event: error during transaction execution " "Error in %s event: error during transaction execution "
"on table %s.%s. %s", "on table %s.%s. %s",
get_type_str(), table->s->db.str, get_type_str(), table->s->db.str,
table->s->table_name.str, table->s->table_name.str, thd->net.last_error);
thd->net.last_error ? thd->net.last_error : "");
/* /*
If one day we honour --skip-slave-errors in row-based replication, and If one day we honour --skip-slave-errors in row-based replication, and

View File

@ -105,6 +105,7 @@
#include "sp_rcontext.h" #include "sp_rcontext.h"
#include "sp_cache.h" #include "sp_cache.h"
#include "sql_reload.h" // reload_acl_and_cache #include "sql_reload.h" // reload_acl_and_cache
#include "pcre.h"
#ifdef HAVE_POLL_H #ifdef HAVE_POLL_H
#include <poll.h> #include <poll.h>
@ -3631,6 +3632,7 @@ static void init_libstrings()
#endif #endif
} }
ulonglong my_pcre_frame_size;
static void init_pcre() static void init_pcre()
{ {
@ -3638,6 +3640,8 @@ static void init_pcre()
pcre_free= pcre_stack_free= my_str_free_mysqld; pcre_free= pcre_stack_free= my_str_free_mysqld;
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
pcre_stack_guard= check_enough_stack_size_slow; 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 #endif
} }
@ -9271,8 +9275,8 @@ mysql_getopt_value(const char *name, uint length,
} }
/* We return in all cases above. Let us silence -Wimplicit-fallthrough */ /* We return in all cases above. Let us silence -Wimplicit-fallthrough */
DBUG_ASSERT(0); DBUG_ASSERT(0);
/* fall through */
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
/* fall through */
case OPT_REPLICATE_DO_DB: case OPT_REPLICATE_DO_DB:
case OPT_REPLICATE_DO_TABLE: case OPT_REPLICATE_DO_TABLE:
case OPT_REPLICATE_IGNORE_DB: case OPT_REPLICATE_IGNORE_DB:

View File

@ -522,6 +522,8 @@ extern pthread_t signal_thread;
extern struct st_VioSSLFd * ssl_acceptor_fd; extern struct st_VioSSLFd * ssl_acceptor_fd;
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
extern ulonglong my_pcre_frame_size;
/* /*
The following variables were under INNODB_COMPABILITY_HOOKS The following variables were under INNODB_COMPABILITY_HOOKS
*/ */

View File

@ -5911,8 +5911,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
TODO: handling `when' for SHOW SLAVE STATUS' snds behind TODO: handling `when' for SHOW SLAVE STATUS' snds behind
*/ */
if ((memcmp(mi->master_log_name, hb.get_log_ident(), hb.get_ident_len()) if (memcmp(mi->master_log_name, hb.get_log_ident(), hb.get_ident_len())
&& mi->master_log_name != NULL)
|| mi->master_log_pos > hb.log_pos) || mi->master_log_pos > hb.log_pos)
{ {
/* missed events of heartbeat from the past */ /* missed events of heartbeat from the past */
@ -6464,7 +6463,7 @@ static int connect_to_master(THD* thd, MYSQL* mysql, Master_info* mi,
mysql_options(mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir_ptr); mysql_options(mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir_ptr);
/* we disallow empty users */ /* we disallow empty users */
if (mi->user == NULL || mi->user[0] == 0) if (mi->user[0] == 0)
{ {
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL, mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL,
ER_THD(thd, ER_SLAVE_FATAL_ERROR), ER_THD(thd, ER_SLAVE_FATAL_ERROR),

View File

@ -10941,12 +10941,6 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
/* global privileges */ /* global privileges */
grant->privilege= sctx->master_access; grant->privilege= sctx->master_access;
if (!sctx->priv_user)
{
DBUG_PRINT("info", ("privilege 0x%lx", grant->privilege));
DBUG_VOID_RETURN; // it is slave
}
if (!thd->db || strcmp(db, thd->db)) if (!thd->db || strcmp(db, thd->db))
{ {
/* db privileges */ /* db privileges */

View File

@ -369,8 +369,7 @@ int initialize_audit_plugin(st_plugin_int *plugin)
{ {
st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info; st_mysql_audit *data= (st_mysql_audit*) plugin->plugin->info;
if (!data->class_mask || !data->event_notify || if (!data->event_notify || !data->class_mask[0])
!data->class_mask[0])
{ {
sql_print_error("Plugin '%s' has invalid data.", sql_print_error("Plugin '%s' has invalid data.",
plugin->name.str); plugin->name.str);

View File

@ -6796,12 +6796,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 #ifndef DBUG_OFF
long max_stack_used; long max_stack_used;
#endif #endif
@ -6818,7 +6812,7 @@ bool check_stack_overrun(THD *thd, long margin,
{ {
long stack_used; long stack_used;
DBUG_ASSERT(thd == current_thd); 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)) (long) (my_thread_stack_size - margin))
{ {
thd->is_fatal_error= 1; thd->is_fatal_error= 1;

View File

@ -270,8 +270,8 @@ IF(CONNECT_WITH_JDBC)
# Find required libraries and include directories # Find required libraries and include directories
SET (JAVA_SOURCES JdbcInterface.java) SET (JAVA_SOURCES JdbcInterface.java)
add_jar(JdbcInterface ${JAVA_SOURCES}) add_jar(JdbcInterface ${JAVA_SOURCES})
install_jar(JdbcInterface DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/JavaWrappers.jar
${CMAKE_CURRENT_BINARY_DIR}/JdbcInterface.jar
DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine) DESTINATION ${INSTALL_PLUGINDIR} COMPONENT connect-engine)
add_definitions(-DJDBC_SUPPORT) add_definitions(-DJDBC_SUPPORT)
ELSE() ELSE()

View File

@ -341,7 +341,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, char *fn, bool append)
bool ZIPUTIL::addEntry(PGLOBAL g, char *entry) bool ZIPUTIL::addEntry(PGLOBAL g, char *entry)
{ {
//?? we dont need the stinking time //?? 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); getTime(zi.tmz_date);
target = entry; target = entry;

View File

@ -1192,7 +1192,7 @@ char *ha_connect::GetRealString(const char *s)
{ {
char *sv; char *sv;
if (IsPartitioned() && s && partname && *partname) { if (IsPartitioned() && s && *partname) {
sv= (char*)PlugSubAlloc(xp->g, NULL, 0); sv= (char*)PlugSubAlloc(xp->g, NULL, 0);
sprintf(sv, s, partname); sprintf(sv, s, partname);
PlugSubAlloc(xp->g, NULL, strlen(sv) + 1); PlugSubAlloc(xp->g, NULL, strlen(sv) + 1);

View File

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

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)); mysql_file_seek(meta_file, 0, MY_SEEK_SET, MYF(0));
if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0) if (mysql_file_read(meta_file, (uchar*)meta_buffer, META_BUFFER_SIZE, 0)
!= META_BUFFER_SIZE) != 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 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; int result_code= 0;
if (!--share->use_count){ if (!--share->use_count){
/* Write the meta file. Mark it as crashed if needed. */ /* Write the meta file. Mark it as crashed if needed. */
if (share->meta_file != -1)
{
(void)write_meta_file(share->meta_file, share->rows_recorded, (void)write_meta_file(share->meta_file, share->rows_recorded,
share->crashed ? TRUE :FALSE); share->crashed ? TRUE :FALSE);
if (mysql_file_close(share->meta_file, MYF(0))) if (mysql_file_close(share->meta_file, MYF(0)))
result_code= 1; result_code= 1;
}
if (share->tina_write_opened) if (share->tina_write_opened)
{ {
if (mysql_file_close(share->tina_write_filedes, MYF(0))) 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)) if (share->crashed && !(open_options & HA_OPEN_FOR_REPAIR))
{ {
free_share(share); 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; local_data_file_version= share->data_file_version;

View File

@ -1227,19 +1227,22 @@ btr_cur_ins_lock_and_undo(
index, thr, mtr, inherit); index, thr, mtr, inherit);
if (err != DB_SUCCESS if (err != DB_SUCCESS
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) { || !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
return(err); return(err);
} }
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP, if (flags & BTR_NO_UNDO_LOG_FLAG) {
thr, index, entry, roll_ptr = 0;
} else {
err = trx_undo_report_row_operation(thr, index, entry,
NULL, 0, NULL, NULL, NULL, 0, NULL, NULL,
&roll_ptr); &roll_ptr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
return(err); return(err);
} }
}
/* Now we can fill in the roll ptr field in entry */ /* Now we can fill in the roll ptr field in entry */
@ -1287,15 +1290,17 @@ btr_cur_optimistic_insert(
btr_cur_t* cursor, /*!< in: cursor on page after which to insert; btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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; mtr_t* mtr) /*!< in/out: mini-transaction;
if this function returns DB_SUCCESS on if this function returns DB_SUCCESS on
a leaf page of a secondary index in a a leaf page of a secondary index in a
@ -1316,6 +1321,7 @@ btr_cur_optimistic_insert(
ulint rec_size; ulint rec_size;
dberr_t err; dberr_t err;
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
*big_rec = NULL; *big_rec = NULL;
block = btr_cur_get_block(cursor); block = btr_cur_get_block(cursor);
@ -1574,15 +1580,17 @@ btr_cur_pessimistic_insert(
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ ulint** offsets,/*!< out: offsets on *rec */
mem_heap_t** heap, /*!< in/out: pointer to memory heap 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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 */ mtr_t* mtr) /*!< in/out: mini-transaction */
{ {
dict_index_t* index = cursor->index; dict_index_t* index = cursor->index;
@ -1594,6 +1602,7 @@ btr_cur_pessimistic_insert(
ulint n_reserved = 0; ulint n_reserved = 0;
ut_ad(dtuple_check_typed(entry)); ut_ad(dtuple_check_typed(entry));
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
*big_rec = NULL; *big_rec = NULL;
@ -1778,9 +1787,10 @@ btr_cur_upd_lock_and_undo(
/* Append the info about the update in the undo log */ /* Append the info about the update in the undo log */
return(trx_undo_report_row_operation( return((flags & BTR_NO_UNDO_LOG_FLAG)
flags, TRX_UNDO_MODIFY_OP, thr, ? DB_SUCCESS
index, NULL, update, : trx_undo_report_row_operation(
thr, index, NULL, update,
cmpl_info, rec, offsets, roll_ptr)); cmpl_info, rec, offsets, roll_ptr));
} }
@ -2511,12 +2521,12 @@ btr_cur_pessimistic_update(
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
mem_heap_t** offsets_heap, mem_heap_t** offsets_heap,
/*!< in/out: pointer to memory heap /*!< in/out: pointer to memory heap
that can be emptied, or NULL */ that can be emptied */
mem_heap_t* entry_heap, mem_heap_t* entry_heap,
/*!< in/out: memory heap for allocating /*!< in/out: memory heap for allocating
big_rec and the index tuple */ big_rec and the index tuple */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to 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 */
const upd_t* update, /*!< in: update vector; this is allowed also const upd_t* update, /*!< in: update vector; this is allowed also
contain trx id and roll ptr fields, but contain trx id and roll ptr fields, but
the values in update vector have no effect */ the values in update vector have no effect */
@ -3063,7 +3073,7 @@ btr_cur_del_mark_set_clust_rec(
return(err); return(err);
} }
err = trx_undo_report_row_operation(0, TRX_UNDO_MODIFY_OP, thr, err = trx_undo_report_row_operation(thr,
index, NULL, NULL, 0, rec, offsets, index, NULL, NULL, 0, rec, offsets,
&roll_ptr); &roll_ptr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {

View File

@ -2,7 +2,7 @@
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described Google, Inc. Those modifications are gratefully acknowledged and are described
@ -1430,8 +1430,6 @@ buf_pool_init_instance(
buf_pool->chunks = chunk = buf_pool->chunks = chunk =
(buf_chunk_t*) mem_zalloc(sizeof *chunk); (buf_chunk_t*) mem_zalloc(sizeof *chunk);
UT_LIST_INIT(buf_pool->free);
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) { if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
mem_free(chunk); mem_free(chunk);
mem_free(buf_pool); mem_free(buf_pool);

View File

@ -6322,6 +6322,7 @@ dict_set_corrupted_index_cache_only(
dict_table_t* table) /*!< in/out: table */ dict_table_t* table) /*!< in/out: table */
{ {
ut_ad(index != NULL); ut_ad(index != NULL);
ut_ad(table != NULL);
ut_ad(mutex_own(&dict_sys->mutex)); ut_ad(mutex_own(&dict_sys->mutex));
ut_ad(!dict_table_is_comp(dict_sys->sys_tables)); ut_ad(!dict_table_is_comp(dict_sys->sys_tables));
ut_ad(!dict_table_is_comp(dict_sys->sys_indexes)); ut_ad(!dict_table_is_comp(dict_sys->sys_indexes));
@ -6329,9 +6330,6 @@ dict_set_corrupted_index_cache_only(
/* Mark the table as corrupted only if the clustered index /* Mark the table as corrupted only if the clustered index
is corrupted */ is corrupted */
if (dict_index_is_clust(index)) { if (dict_index_is_clust(index)) {
ut_ad((index->table != NULL) || (table != NULL)
|| index->table == table);
table->corrupted = TRUE; table->corrupted = TRUE;
} }

View File

@ -2021,8 +2021,6 @@ fil_init(
fil_system->spaces = hash_create(hash_size); fil_system->spaces = hash_create(hash_size);
fil_system->name_hash = hash_create(hash_size); fil_system->name_hash = hash_create(hash_size);
UT_LIST_INIT(fil_system->LRU);
fil_system->max_n_open = max_n_open; fil_system->max_n_open = max_n_open;
fil_space_crypt_init(); fil_space_crypt_init();
@ -2733,14 +2731,12 @@ fil_op_log_parse_or_replay(
} else if (log_flags & MLOG_FILE_FLAG_TEMP) { } else if (log_flags & MLOG_FILE_FLAG_TEMP) {
/* Temporary table, do nothing */ /* Temporary table, do nothing */
} else { } else {
const char* path = NULL;
/* Create the database directory for name, if it does /* Create the database directory for name, if it does
not exist yet */ not exist yet */
fil_create_directory_for_tablename(name); fil_create_directory_for_tablename(name);
if (fil_create_new_single_table_tablespace( if (fil_create_new_single_table_tablespace(
space_id, name, path, flags, space_id, name, NULL, flags,
DICT_TF2_USE_TABLESPACE, DICT_TF2_USE_TABLESPACE,
FIL_IBD_FILE_INITIAL_SIZE, FIL_IBD_FILE_INITIAL_SIZE,
FIL_ENCRYPTION_DEFAULT, FIL_ENCRYPTION_DEFAULT,

View File

@ -1559,19 +1559,6 @@ thd_is_replication_slave_thread(
return thd && ((ibool) thd_slave_thread(thd)); return thd && ((ibool) thd_slave_thread(thd));
} }
/******************************************************************//**
Gets information on the durability property requested by thread.
Used when writing either a prepare or commit record to the log
buffer. @return the durability property. */
UNIV_INTERN
enum durability_properties
thd_requested_durability(
/*=====================*/
const THD* thd) /*!< in: thread handle */
{
return(thd_get_durability_property(thd));
}
/******************************************************************//** /******************************************************************//**
Returns true if transaction should be flagged as read-only. Returns true if transaction should be flagged as read-only.
@return true if the thd is marked as read-only */ @return true if the thd is marked as read-only */
@ -8557,8 +8544,8 @@ calc_row_difference(
} }
} }
if (o_len != n_len || (o_len != UNIV_SQL_NULL && if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
0 != memcmp(o_ptr, n_ptr, o_len))) { && 0 != memcmp(o_ptr, n_ptr, o_len))) {
/* The field has changed */ /* The field has changed */
ufield = uvect->fields + n_changed; ufield = uvect->fields + n_changed;

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 2016, MariaDB Corporation. Copyright (c) 2013, 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -516,7 +516,7 @@ innobase_index_name_is_reserved(
const KEY* key_info, /*!< in: Indexes to be created */ const KEY* key_info, /*!< in: Indexes to be created */
ulint num_of_keys) /*!< in: Number of indexes to ulint num_of_keys) /*!< in: Number of indexes to
be created. */ be created. */
MY_ATTRIBUTE((nonnull, warn_unused_result)); MY_ATTRIBUTE((nonnull(1), warn_unused_result));
/*****************************************************************//** /*****************************************************************//**
#ifdef WITH_WSREP #ifdef WITH_WSREP

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2005, 2016, Oracle and/or its affiliates Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -2303,10 +2303,10 @@ online_retry_drop_indexes_with_trx(
@param drop_fk constraints being dropped @param drop_fk constraints being dropped
@param n_drop_fk number of constraints that are being dropped @param n_drop_fk number of constraints that are being dropped
@return whether the constraint is being dropped */ @return whether the constraint is being dropped */
inline MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result))
inline
bool bool
innobase_dropping_foreign( innobase_dropping_foreign(
/*======================*/
const dict_foreign_t* foreign, const dict_foreign_t* foreign,
dict_foreign_t** drop_fk, dict_foreign_t** drop_fk,
ulint n_drop_fk) ulint n_drop_fk)
@ -2330,10 +2330,10 @@ column that is being dropped or modified to NOT NULL.
@retval true Not allowed (will call my_error()) @retval true Not allowed (will call my_error())
@retval false Allowed @retval false Allowed
*/ */
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
static
bool bool
innobase_check_foreigns_low( innobase_check_foreigns_low(
/*========================*/
const dict_table_t* user_table, const dict_table_t* user_table,
dict_foreign_t** drop_fk, dict_foreign_t** drop_fk,
ulint n_drop_fk, ulint n_drop_fk,
@ -2430,10 +2430,10 @@ column that is being dropped or modified to NOT NULL.
@retval true Not allowed (will call my_error()) @retval true Not allowed (will call my_error())
@retval false Allowed @retval false Allowed
*/ */
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
static
bool bool
innobase_check_foreigns( innobase_check_foreigns(
/*====================*/
Alter_inplace_info* ha_alter_info, Alter_inplace_info* ha_alter_info,
const TABLE* altered_table, const TABLE* altered_table,
const TABLE* old_table, const TABLE* old_table,

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates. Copyright (c) 2007, 2016, 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 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 the terms of the GNU General Public License as published by the Free Software
@ -2972,14 +2972,16 @@ i_s_fts_deleted_generic_fill(
fields = table->field; fields = table->field;
int ret = 0;
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) { for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
doc_id_t doc_id; doc_id_t doc_id;
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j); doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
OK(fields[I_S_FTS_DOC_ID]->store((longlong) 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); trx_free_for_background(trx);
@ -2990,7 +2992,7 @@ i_s_fts_deleted_generic_fill(
rw_lock_s_unlock(&dict_operation_lock); rw_lock_s_unlock(&dict_operation_lock);
DBUG_RETURN(0); DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -3230,13 +3232,13 @@ i_s_fts_index_cache_fill_one_index(
/*===============================*/ /*===============================*/
fts_index_cache_t* index_cache, /*!< in: FTS index cache */ fts_index_cache_t* index_cache, /*!< in: FTS index cache */
THD* thd, /*!< in: thread */ THD* thd, /*!< in: thread */
fts_string_t* conv_str, /*!< in/out: buffer */
TABLE_LIST* tables) /*!< in/out: tables to fill */ TABLE_LIST* tables) /*!< in/out: tables to fill */
{ {
TABLE* table = (TABLE*) tables->table; TABLE* table = (TABLE*) tables->table;
Field** fields; Field** fields;
CHARSET_INFO* index_charset; CHARSET_INFO* index_charset;
const ib_rbt_node_t* rbt_node; const ib_rbt_node_t* rbt_node;
fts_string_t conv_str;
uint dummy_errors; uint dummy_errors;
char* word_str; char* word_str;
@ -3245,10 +3247,9 @@ i_s_fts_index_cache_fill_one_index(
fields = table->field; fields = table->field;
index_charset = index_cache->charset; index_charset = index_cache->charset;
conv_str.f_len = system_charset_info->mbmaxlen conv_str->f_n_char = 0;
* FTS_MAX_WORD_LEN_IN_CHAR;
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len)); int ret = 0;
conv_str.f_n_char = 0;
/* Go through each word in the index cache */ /* Go through each word in the index cache */
for (rbt_node = rbt_first(index_cache->words); for (rbt_node = rbt_first(index_cache->words);
@ -3260,16 +3261,16 @@ i_s_fts_index_cache_fill_one_index(
/* Convert word from index charset to system_charset_info */ /* Convert word from index charset to system_charset_info */
if (index_charset->cset != system_charset_info->cset) { if (index_charset->cset != system_charset_info->cset) {
conv_str.f_n_char = my_convert( conv_str->f_n_char = my_convert(
reinterpret_cast<char*>(conv_str.f_str), reinterpret_cast<char*>(conv_str->f_str),
static_cast<uint32>(conv_str.f_len), static_cast<uint32>(conv_str->f_len),
system_charset_info, system_charset_info,
reinterpret_cast<char*>(word->text.f_str), reinterpret_cast<char*>(word->text.f_str),
static_cast<uint32>(word->text.f_len), static_cast<uint32>(word->text.f_len),
index_charset, &dummy_errors); index_charset, &dummy_errors);
ut_ad(conv_str.f_n_char <= conv_str.f_len); ut_ad(conv_str->f_n_char <= conv_str->f_len);
conv_str.f_str[conv_str.f_n_char] = 0; conv_str->f_str[conv_str->f_n_char] = 0;
word_str = reinterpret_cast<char*>(conv_str.f_str); word_str = reinterpret_cast<char*>(conv_str->f_str);
} else { } else {
word_str = reinterpret_cast<char*>(word->text.f_str); word_str = reinterpret_cast<char*>(word->text.f_str);
} }
@ -3327,9 +3328,7 @@ i_s_fts_index_cache_fill_one_index(
} }
} }
ut_free(conv_str.f_str); DBUG_RETURN(ret);
DBUG_RETURN(0);
} }
/*******************************************************************//** /*******************************************************************//**
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
@ -3373,18 +3372,27 @@ i_s_fts_index_cache_fill(
ut_a(cache); 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(conv_str.f_len));
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) { for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
fts_index_cache_t* index_cache; fts_index_cache_t* index_cache;
index_cache = static_cast<fts_index_cache_t*> ( index_cache = static_cast<fts_index_cache_t*> (
ib_vector_get(cache->indexes, i)); 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); dict_table_close(user_table, FALSE, FALSE);
DBUG_RETURN(0); DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -3688,8 +3696,6 @@ i_s_fts_index_table_fill_one_fetch(
} }
} }
i_s_fts_index_table_free_one_fetch(words);
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
@ -3703,13 +3709,13 @@ i_s_fts_index_table_fill_one_index(
/*===============================*/ /*===============================*/
dict_index_t* index, /*!< in: FTS index */ dict_index_t* index, /*!< in: FTS index */
THD* thd, /*!< in: thread */ THD* thd, /*!< in: thread */
fts_string_t* conv_str, /*!< in/out: buffer */
TABLE_LIST* tables) /*!< in/out: tables to fill */ TABLE_LIST* tables) /*!< in/out: tables to fill */
{ {
ib_vector_t* words; ib_vector_t* words;
mem_heap_t* heap; mem_heap_t* heap;
fts_string_t word; fts_string_t word;
CHARSET_INFO* index_charset; CHARSET_INFO* index_charset;
fts_string_t conv_str;
dberr_t error; dberr_t error;
int ret = 0; int ret = 0;
@ -3726,10 +3732,6 @@ i_s_fts_index_table_fill_one_index(
word.f_n_char = 0; word.f_n_char = 0;
index_charset = fts_index_get_charset(index); 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(conv_str.f_len));
conv_str.f_n_char = 0;
/* Iterate through each auxiliary table as described in /* Iterate through each auxiliary table as described in
fts_index_selector */ fts_index_selector */
@ -3763,17 +3765,17 @@ i_s_fts_index_table_fill_one_index(
/* Fill into tables */ /* Fill into tables */
ret = i_s_fts_index_table_fill_one_fetch( 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) { if (ret != 0) {
i_s_fts_index_table_free_one_fetch(words);
goto func_exit; goto func_exit;
} }
} while (has_more); } while (has_more);
} }
func_exit: func_exit:
ut_free(conv_str.f_str);
mem_heap_free(heap); mem_heap_free(heap);
DBUG_RETURN(ret); DBUG_RETURN(ret);
@ -3815,10 +3817,17 @@ i_s_fts_index_table_fill(
DBUG_RETURN(0); 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(conv_str.f_len));
for (index = dict_table_get_first_index(user_table); for (index = dict_table_get_first_index(user_table);
index; index = dict_table_get_next_index(index)) { index; index = dict_table_get_next_index(index)) {
if (index->type & DICT_FTS) { 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));
} }
} }
@ -3826,7 +3835,9 @@ i_s_fts_index_table_fill(
rw_lock_s_unlock(&dict_operation_lock); rw_lock_s_unlock(&dict_operation_lock);
DBUG_RETURN(0); ut_free(conv_str.f_str);
DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -3992,6 +4003,8 @@ i_s_fts_config_fill(
DBUG_ASSERT(!dict_index_is_online_ddl(index)); DBUG_ASSERT(!dict_index_is_online_ddl(index));
} }
int ret = 0;
while (fts_config_key[i]) { while (fts_config_key[i]) {
fts_string_t value; fts_string_t value;
char* key_name; char* key_name;
@ -4016,13 +4029,14 @@ i_s_fts_config_fill(
ut_free(key_name); ut_free(key_name);
} }
OK(field_store_string( BREAK_IF(ret = field_store_string(
fields[FTS_CONFIG_KEY], fts_config_key[i])); fields[FTS_CONFIG_KEY], fts_config_key[i]));
OK(field_store_string( BREAK_IF(ret = field_store_string(
fields[FTS_CONFIG_VALUE], (const char*) value.f_str)); 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++; i++;
} }
@ -4035,7 +4049,7 @@ i_s_fts_config_fill(
rw_lock_s_unlock(&dict_operation_lock); rw_lock_s_unlock(&dict_operation_lock);
DBUG_RETURN(0); DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -4877,34 +4891,29 @@ i_s_innodb_buffer_page_fill(
state_str = NULL; state_str = NULL;
OK(fields[IDX_BUFFER_POOL_ID]->store( OK(fields[IDX_BUFFER_POOL_ID]->store(
static_cast<double>(page_info->pool_id))); page_info->pool_id, true));
OK(fields[IDX_BUFFER_BLOCK_ID]->store( OK(fields[IDX_BUFFER_BLOCK_ID]->store(
static_cast<double>(page_info->block_id))); page_info->block_id, true));
OK(fields[IDX_BUFFER_PAGE_SPACE]->store( OK(fields[IDX_BUFFER_PAGE_SPACE]->store(
static_cast<double>(page_info->space_id))); page_info->space_id, true));
OK(fields[IDX_BUFFER_PAGE_NUM]->store( OK(fields[IDX_BUFFER_PAGE_NUM]->store(
static_cast<double>(page_info->page_num))); page_info->page_num, true));
OK(field_store_string( OK(field_store_string(
fields[IDX_BUFFER_PAGE_TYPE], fields[IDX_BUFFER_PAGE_TYPE],
i_s_page_type[page_info->page_type].type_str)); i_s_page_type[page_info->page_type].type_str));
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store( 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( OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store(
page_info->fix_count)); page_info->fix_count, true));
if (page_info->hashed) { OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED],
OK(field_store_string( page_info->hashed ? "YES" : "NO"));
fields[IDX_BUFFER_PAGE_HASHED], "YES"));
} else {
OK(field_store_string(
fields[IDX_BUFFER_PAGE_HASHED], "NO"));
}
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store( OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
(longlong) page_info->newest_mod, true)); (longlong) page_info->newest_mod, true));
@ -4913,7 +4922,7 @@ i_s_innodb_buffer_page_fill(
(longlong) page_info->oldest_mod, true)); (longlong) page_info->oldest_mod, true));
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store( 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(); fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null();
@ -4922,44 +4931,48 @@ i_s_innodb_buffer_page_fill(
/* If this is an index page, fetch the index name /* If this is an index page, fetch the index name
and table name */ and table name */
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
const dict_index_t* index; bool ret = false;
mutex_enter(&dict_sys->mutex); 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_end = innobase_convert_name(
table_name, sizeof(table_name), table_name, sizeof(table_name),
index->table_name, index->table_name,
strlen(index->table_name), strlen(index->table_name),
thd, TRUE); thd, TRUE);
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store( ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
table_name, ->store(table_name,
static_cast<uint>(table_name_end - table_name), static_cast<uint>(
system_charset_info)); table_name_end
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); - table_name),
system_charset_info)
OK(field_store_index_name( || field_store_index_name(
fields[IDX_BUFFER_PAGE_INDEX_NAME], fields
index->name)); [IDX_BUFFER_PAGE_INDEX_NAME],
index->name);
} }
mutex_exit(&dict_sys->mutex); mutex_exit(&dict_sys->mutex);
OK(ret);
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
} }
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store( OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
page_info->num_recs)); page_info->num_recs, true));
OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store( OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store(
page_info->data_size)); page_info->data_size, true));
OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store( OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store(
page_info->zip_ssize page_info->zip_ssize
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize ? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
: 0)); : 0, true));
#if BUF_PAGE_STATE_BITS > 3 #if BUF_PAGE_STATE_BITS > 3
# error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<<BUF_PAGE_STATE_BITS values are checked for" # error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<<BUF_PAGE_STATE_BITS values are checked for"
@ -4997,32 +5010,29 @@ i_s_innodb_buffer_page_fill(
switch (page_info->io_fix) { switch (page_info->io_fix) {
case BUF_IO_NONE: case BUF_IO_NONE:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_NONE";
"IO_NONE"));
break; break;
case BUF_IO_READ: case BUF_IO_READ:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_READ";
"IO_READ"));
break; break;
case BUF_IO_WRITE: case BUF_IO_WRITE:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_WRITE";
"IO_WRITE"));
break; break;
case BUF_IO_PIN: case BUF_IO_PIN:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_PIN";
"IO_PIN"));
break; break;
} }
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
state_str));
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD], OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
(page_info->is_old) ? "YES" : "NO")); (page_info->is_old) ? "YES" : "NO"));
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store( OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
page_info->freed_page_clock)); page_info->freed_page_clock));
if (schema_table_store_record(thd, table)) { OK(schema_table_store_record(thd, table));
DBUG_RETURN(1);
}
} }
DBUG_RETURN(0); DBUG_RETURN(0);
@ -5566,17 +5576,10 @@ i_s_innodb_buf_page_lru_fill(
ulint num_page) /*!< in: number of page info ulint num_page) /*!< in: number of page info
cached */ cached */
{ {
TABLE* table;
Field** fields;
mem_heap_t* heap;
DBUG_ENTER("i_s_innodb_buf_page_lru_fill"); DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
table = tables->table; TABLE* table = tables->table;
Field** fields = table->field;
fields = table->field;
heap = mem_heap_create(1000);
/* Iterate through the cached array and fill the I_S table rows */ /* Iterate through the cached array and fill the I_S table rows */
for (ulint i = 0; i < num_page; i++) { for (ulint i = 0; i < num_page; i++) {
@ -5591,34 +5594,28 @@ i_s_innodb_buf_page_lru_fill(
page_info = info_array + i; page_info = info_array + i;
OK(fields[IDX_BUF_LRU_POOL_ID]->store( OK(fields[IDX_BUF_LRU_POOL_ID]->store(
static_cast<double>(page_info->pool_id))); page_info->pool_id, true));
OK(fields[IDX_BUF_LRU_POS]->store( OK(fields[IDX_BUF_LRU_POS]->store(
static_cast<double>(page_info->block_id))); page_info->block_id, true));
OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store( OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store(
static_cast<double>(page_info->space_id))); page_info->space_id, true));
OK(fields[IDX_BUF_LRU_PAGE_NUM]->store( OK(fields[IDX_BUF_LRU_PAGE_NUM]->store(
static_cast<double>(page_info->page_num))); page_info->page_num, true));
OK(field_store_string( OK(field_store_string(
fields[IDX_BUF_LRU_PAGE_TYPE], fields[IDX_BUF_LRU_PAGE_TYPE],
i_s_page_type[page_info->page_type].type_str)); i_s_page_type[page_info->page_type].type_str));
OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store( OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store(
static_cast<double>(page_info->flush_type))); page_info->flush_type, true));
OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store( OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store(
static_cast<double>(page_info->fix_count))); page_info->fix_count, true));
if (page_info->hashed) { OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED],
OK(field_store_string( page_info->hashed ? "YES" : "NO"));
fields[IDX_BUF_LRU_PAGE_HASHED], "YES"));
} else {
OK(field_store_string(
fields[IDX_BUF_LRU_PAGE_HASHED], "NO"));
}
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store( OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
page_info->newest_mod, true)); page_info->newest_mod, true));
@ -5627,7 +5624,7 @@ i_s_innodb_buf_page_lru_fill(
page_info->oldest_mod, true)); page_info->oldest_mod, true));
OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store( OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store(
page_info->access_time)); page_info->access_time, true));
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null(); fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null();
@ -5636,43 +5633,47 @@ i_s_innodb_buf_page_lru_fill(
/* If this is an index page, fetch the index name /* If this is an index page, fetch the index name
and table name */ and table name */
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
const dict_index_t* index; bool ret = false;
mutex_enter(&dict_sys->mutex); 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_end = innobase_convert_name(
table_name, sizeof(table_name), table_name, sizeof(table_name),
index->table_name, index->table_name,
strlen(index->table_name), strlen(index->table_name),
thd, TRUE); thd, TRUE);
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store( ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
table_name, ->store(table_name,
static_cast<uint>(table_name_end - table_name), static_cast<uint>(
system_charset_info)); table_name_end
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); - table_name),
system_charset_info)
OK(field_store_index_name( || field_store_index_name(
fields[IDX_BUF_LRU_PAGE_INDEX_NAME], fields
index->name)); [IDX_BUF_LRU_PAGE_INDEX_NAME],
index->name);
} }
mutex_exit(&dict_sys->mutex); 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( OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store(
page_info->num_recs)); page_info->num_recs, true));
OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store( OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store(
page_info->data_size)); page_info->data_size, true));
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store( OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
page_info->zip_ssize ? page_info->zip_ssize
512 << page_info->zip_ssize : 0)); ? 512 << page_info->zip_ssize : 0, true));
state = static_cast<enum buf_page_state>(page_info->page_state); state = static_cast<enum buf_page_state>(page_info->page_state);
@ -5701,35 +5702,31 @@ i_s_innodb_buf_page_lru_fill(
switch (page_info->io_fix) { switch (page_info->io_fix) {
case BUF_IO_NONE: case BUF_IO_NONE:
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], state_str = "IO_NONE";
"IO_NONE"));
break; break;
case BUF_IO_READ: case BUF_IO_READ:
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], state_str = "IO_READ";
"IO_READ"));
break; break;
case BUF_IO_WRITE: case BUF_IO_WRITE:
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], state_str = "IO_WRITE";
"IO_WRITE")); break;
case BUF_IO_PIN:
state_str = "IO_PIN";
break; 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], 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( OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store(
page_info->freed_page_clock)); page_info->freed_page_clock, true));
if (schema_table_store_record(thd, table)) { OK(schema_table_store_record(thd, table));
mem_heap_free(heap);
DBUG_RETURN(1);
} }
mem_heap_empty(heap);
}
mem_heap_free(heap);
DBUG_RETURN(0); DBUG_RETURN(0);
} }

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
Copyrigth (c) 2014, 2015, MariaDB Corporation Copyrigth (c) 2014, 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -72,6 +72,8 @@ extern struct st_maria_plugin i_s_innodb_sys_semaphore_waits;
DBUG_RETURN(1); \ DBUG_RETURN(1); \
} }
#define BREAK_IF(expr) if ((expr)) break
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \ #define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
do { \ do { \
if (!srv_was_started) { \ if (!srv_was_started) { \

View File

@ -2923,8 +2923,7 @@ ibuf_get_volume_buffered_hash(
fold = ut_fold_binary(data, len); fold = ut_fold_binary(data, len);
hash += (fold / (CHAR_BIT * sizeof *hash)) % size; hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
bitmask = static_cast<ulint>( bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
1 << (fold % (CHAR_BIT * sizeof(*hash))));
if (*hash & bitmask) { if (*hash & bitmask) {
@ -3691,7 +3690,7 @@ fail_exit:
if (mode == BTR_MODIFY_PREV) { if (mode == BTR_MODIFY_PREV) {
err = btr_cur_optimistic_insert( err = btr_cur_optimistic_insert(
BTR_NO_LOCKING_FLAG, BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
cursor, &offsets, &offsets_heap, cursor, &offsets, &offsets_heap,
ibuf_entry, &ins_rec, ibuf_entry, &ins_rec,
&dummy_big_rec, 0, thr, &mtr); &dummy_big_rec, 0, thr, &mtr);

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -220,15 +221,17 @@ btr_cur_optimistic_insert(
btr_cur_t* cursor, /*!< in: cursor on page after which to insert; btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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; mtr_t* mtr) /*!< in/out: mini-transaction;
if this function returns DB_SUCCESS on if this function returns DB_SUCCESS on
a leaf page of a secondary index in a a leaf page of a secondary index in a
@ -256,15 +259,17 @@ btr_cur_pessimistic_insert(
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ ulint** offsets,/*!< out: offsets on *rec */
mem_heap_t** heap, /*!< in/out: pointer to memory heap 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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 */ mtr_t* mtr) /*!< in/out: mini-transaction */
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result)); MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
/*************************************************************//** /*************************************************************//**
@ -390,12 +395,12 @@ btr_cur_pessimistic_update(
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
mem_heap_t** offsets_heap, mem_heap_t** offsets_heap,
/*!< in/out: pointer to memory heap /*!< in/out: pointer to memory heap
that can be emptied, or NULL */ that can be emptied */
mem_heap_t* entry_heap, mem_heap_t* entry_heap,
/*!< in/out: memory heap for allocating /*!< in/out: memory heap for allocating
big_rec and the index tuple */ big_rec and the index tuple */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to 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 */
const upd_t* update, /*!< in: update vector; this is allowed also const upd_t* update, /*!< in: update vector; this is allowed also
contain trx id and roll ptr fields, but contain trx id and roll ptr fields, but
the values in update vector have no effect */ the values in update vector have no effect */

View File

@ -1006,7 +1006,7 @@ fil_create_new_single_table_tablespace(
must be >= FIL_IBD_FILE_INITIAL_SIZE */ must be >= FIL_IBD_FILE_INITIAL_SIZE */
fil_encryption_t mode, /*!< in: encryption mode */ fil_encryption_t mode, /*!< in: encryption mode */
ulint key_id) /*!< in: encryption key_id */ ulint key_id) /*!< in: encryption key_id */
__attribute__((nonnull, warn_unused_result)); MY_ATTRIBUTE((nonnull(2), warn_unused_result));
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations. /** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
(Typically when upgrading from MariaDB 10.1.0..10.1.20.) (Typically when upgrading from MariaDB 10.1.0..10.1.20.)

View File

@ -126,18 +126,6 @@ thd_is_replication_slave_thread(
/*============================*/ /*============================*/
THD* thd); /*!< in: thread handle */ THD* thd); /*!< in: thread handle */
/******************************************************************//**
Gets information on the durability property requested by thread.
Used when writing either a prepare or commit record to the log
buffer.
@return the durability property. */
UNIV_INTERN
enum durability_properties
thd_requested_durability(
/*=====================*/
const THD* thd) /*!< in: thread handle */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/******************************************************************//** /******************************************************************//**
Returns true if the transaction this thread is processing has edited Returns true if the transaction this thread is processing has edited
non-transactional tables. Used by the deadlock detector when deciding non-transactional tables. Used by the deadlock detector when deciding

View File

@ -908,7 +908,14 @@ struct MY_ALIGNED(CACHE_LINE_SIZE) simple_counter
{ {
compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint)); compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint));
if (atomic) { if (atomic) {
return os_atomic_increment_ulint(&m_counter, i); /* GCC would perform a type check in this code
also in case the template is instantiated with
simple_counter<Type=not_ulint, atomic=false>.
On Solaris, os_atomic_increment_ulint() maps
to atomic_add_long_nv(), which expects the
parameter to be correctly typed. */
return os_atomic_increment_ulint(
reinterpret_cast<ulint*>(&m_counter), i);
} else { } else {
return m_counter += i; return m_counter += i;
} }

View File

@ -2,6 +2,7 @@
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -172,7 +173,8 @@ page_zip_rec_needs_ext(
ignored if zip_size == 0 */ ignored if zip_size == 0 */
ulint zip_size) /*!< in: compressed page size in bytes, or 0 */ ulint zip_size) /*!< in: compressed page size in bytes, or 0 */
{ {
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(ut_is_2pow(zip_size)); ut_ad(ut_is_2pow(zip_size));
ut_ad(comp || !zip_size); ut_ad(comp || !zip_size);

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -212,10 +213,6 @@ UNIV_INTERN
dberr_t dberr_t
trx_undo_report_row_operation( 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 */ que_thr_t* thr, /*!< in: query thread */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const dtuple_t* clust_entry, /*!< in: in the case of an insert, const dtuple_t* clust_entry, /*!< in: in the case of an insert,
@ -233,7 +230,7 @@ trx_undo_report_row_operation(
inserted undo log record, inserted undo log record,
0 if BTR_NO_UNDO_LOG 0 if BTR_NO_UNDO_LOG
flag was specified */ flag was specified */
MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result)); MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result));
/******************************************************************//** /******************************************************************//**
Copies an undo record to heap. This function can be called if we know that Copies an undo record to heap. This function can be called if we know that
the undo log record exists. the undo log record exists.
@ -313,10 +310,6 @@ record */
storage fields: used by purge to storage fields: used by purge to
free the external storage */ free the external storage */
/* Operation type flags used in trx_undo_report_row_operation */
#define TRX_UNDO_INSERT_OP 1
#define TRX_UNDO_MODIFY_OP 2
#ifndef UNIV_NONINL #ifndef UNIV_NONINL
#include "trx0rec.ic" #include "trx0rec.ic"
#endif #endif

View File

@ -2,6 +2,7 @@
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -68,8 +69,8 @@ using namespace std;
# define buf_LRU_stat_inc_unzip() ((void) 0) # define buf_LRU_stat_inc_unzip() ((void) 0)
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
#ifndef UNIV_HOTBACKUP
#ifndef UNIV_INNOCHECKSUM #ifndef UNIV_INNOCHECKSUM
#ifndef UNIV_HOTBACKUP
/** Statistics on compression, indexed by page_zip_des_t::ssize - 1 */ /** Statistics on compression, indexed by page_zip_des_t::ssize - 1 */
UNIV_INTERN page_zip_stat_t page_zip_stat[PAGE_ZIP_SSIZE_MAX]; UNIV_INTERN page_zip_stat_t page_zip_stat[PAGE_ZIP_SSIZE_MAX];
/** Statistics on compression, indexed by index->id */ /** Statistics on compression, indexed by index->id */
@ -79,7 +80,6 @@ UNIV_INTERN ib_mutex_t page_zip_stat_per_index_mutex;
#ifdef HAVE_PSI_INTERFACE #ifdef HAVE_PSI_INTERFACE
UNIV_INTERN mysql_pfs_key_t page_zip_stat_per_index_mutex_key; UNIV_INTERN mysql_pfs_key_t page_zip_stat_per_index_mutex_key;
#endif /* HAVE_PSI_INTERFACE */ #endif /* HAVE_PSI_INTERFACE */
#endif /* !UNIV_INNOCHECKSUM */
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
/* Compression level to be used by zlib. Settable by user. */ /* Compression level to be used by zlib. Settable by user. */
@ -128,7 +128,6 @@ Compare at most sizeof(field_ref_zero) bytes.
/* Enable some extra debugging output. This code can be enabled /* Enable some extra debugging output. This code can be enabled
independently of any UNIV_ debugging conditions. */ independently of any UNIV_ debugging conditions. */
#ifndef UNIV_INNOCHECKSUM
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG #if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
# include <stdarg.h> # include <stdarg.h>
MY_ATTRIBUTE((format (printf, 1, 2))) MY_ATTRIBUTE((format (printf, 1, 2)))

View File

@ -1288,9 +1288,11 @@ rec_convert_dtuple_to_rec_comp(
} }
} }
if (len) {
memcpy(end, dfield_get_data(field), len); memcpy(end, dfield_get_data(field), len);
end += len; end += len;
} }
}
} }
/*********************************************************//** /*********************************************************//**

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2016, MariaDB Corporation. Copyright (c) 2015, 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -246,9 +246,6 @@ row_fts_psort_info_init(
each parallel sort thread. Each "sort bucket" holds records for each parallel sort thread. Each "sort bucket" holds records for
a particular "FTS index partition" */ a particular "FTS index partition" */
for (j = 0; j < fts_sort_pll_degree; j++) { for (j = 0; j < fts_sort_pll_degree; j++) {
UT_LIST_INIT(psort_info[j].fts_doc_list);
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) { for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
psort_info[j].merge_file[i] = psort_info[j].merge_file[i] =

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -2148,14 +2149,10 @@ for a clustered index!
@retval DB_SUCCESS if no error @retval DB_SUCCESS if no error
@retval DB_DUPLICATE_KEY if error, @retval DB_DUPLICATE_KEY if error,
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate @retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
record 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)) */
static MY_ATTRIBUTE((nonnull, warn_unused_result)) static MY_ATTRIBUTE((nonnull, warn_unused_result))
dberr_t dberr_t
row_ins_duplicate_error_in_clust( row_ins_duplicate_error_in_clust(
/*=============================*/
ulint flags, /*!< in: undo logging and locking flags */
btr_cur_t* cursor, /*!< in: B-tree cursor */ btr_cur_t* cursor, /*!< in: B-tree cursor */
const dtuple_t* entry, /*!< in: entry to insert */ const dtuple_t* entry, /*!< in: entry to insert */
que_thr_t* thr, /*!< in: query thread */ que_thr_t* thr, /*!< in: query thread */
@ -2419,7 +2416,7 @@ row_ins_clust_index_entry_low(
DB_LOCK_WAIT */ DB_LOCK_WAIT */
err = row_ins_duplicate_error_in_clust( err = row_ins_duplicate_error_in_clust(
flags, &cursor, entry, thr, &mtr); &cursor, entry, thr, &mtr);
} }
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {

View File

@ -324,7 +324,7 @@ UNIV_INTERN double srv_adaptive_flushing_lwm = 10.0;
UNIV_INTERN ulong srv_flushing_avg_loops = 30; UNIV_INTERN ulong srv_flushing_avg_loops = 30;
/* The number of purge threads to use.*/ /* The number of purge threads to use.*/
UNIV_INTERN ulong srv_n_purge_threads = 1; UNIV_INTERN ulong srv_n_purge_threads;
/* the number of pages to purge in one batch */ /* the number of pages to purge in one batch */
UNIV_INTERN ulong srv_purge_batch_size = 20; UNIV_INTERN ulong srv_purge_batch_size = 20;
@ -549,16 +549,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency = 0;
/** Acquire the system_mutex. */ /** Acquire the system_mutex. */
#define srv_sys_mutex_enter() do { \ #define srv_sys_mutex_enter() do { \
mutex_enter(&srv_sys->mutex); \ mutex_enter(&srv_sys.mutex); \
} while (0) } while (0)
/** Test if the system mutex is owned. */ /** 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) && !srv_read_only_mode)
/** Release the system mutex. */ /** Release the system mutex. */
#define srv_sys_mutex_exit() do { \ #define srv_sys_mutex_exit() do { \
mutex_exit(&srv_sys->mutex); \ mutex_exit(&srv_sys.mutex); \
} while (0) } while (0)
#define fetch_lock_wait_timeout(trx) \ #define fetch_lock_wait_timeout(trx) \
@ -650,7 +650,7 @@ struct srv_sys_t{
ulint n_sys_threads; /*!< size of the sys_threads ulint n_sys_threads; /*!< size of the sys_threads
array */ 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_set() and
os_event_reset() on os_event_reset() on
sys_threads[]->event are sys_threads[]->event are
@ -670,7 +670,7 @@ struct srv_sys_t{
UNIV_INTERN ib_mutex_t server_mutex; UNIV_INTERN ib_mutex_t server_mutex;
#endif /* !HAVE_ATOMIC_BUILTINS */ #endif /* !HAVE_ATOMIC_BUILTINS */
static srv_sys_t* srv_sys = NULL; static srv_sys_t srv_sys;
/** Event to signal srv_monitor_thread. Not protected by a mutex. /** Event to signal srv_monitor_thread. Not protected by a mutex.
Set after setting srv_print_innodb_monitor. */ Set after setting srv_print_innodb_monitor. */
@ -692,10 +692,10 @@ and/or load it during startup. */
UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE; UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE;
UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE; UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE;
/** 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; 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; static const ulint SRV_MASTER_SLOT = 0;
/*********************************************************************//** /*********************************************************************//**
@ -796,21 +796,21 @@ srv_reserve_slot(
switch (type) { switch (type) {
case SRV_MASTER: case SRV_MASTER:
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT]; slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
break; break;
case SRV_PURGE: case SRV_PURGE:
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT]; slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
break; break;
case SRV_WORKER: case SRV_WORKER:
/* Find an empty slot, skip the master and purge slots. */ /* 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->in_use;
++slot) { ++slot) {
ut_a(slot < &srv_sys->sys_threads[ ut_a(slot < &srv_sys.sys_threads[
srv_sys->n_sys_threads]); srv_sys.n_sys_threads]);
} }
break; break;
@ -826,7 +826,7 @@ srv_reserve_slot(
ut_ad(srv_slot_get_type(slot) == type); ut_ad(srv_slot_get_type(slot) == type);
++srv_sys->n_threads_active[type]; ++srv_sys.n_threads_active[type];
srv_sys_mutex_exit(); srv_sys_mutex_exit();
@ -856,27 +856,27 @@ srv_suspend_thread_low(
case SRV_MASTER: case SRV_MASTER:
/* We have only one master thread and it /* We have only one master thread and it
should be the first entry always. */ 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; break;
case SRV_PURGE: case SRV_PURGE:
/* We have only one purge coordinator thread /* We have only one purge coordinator thread
and it should be the second entry always. */ 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; break;
case SRV_WORKER: case SRV_WORKER:
ut_a(srv_n_purge_threads > 1); ut_a(srv_n_purge_threads > 1);
ut_a(srv_sys->n_threads_active[type] > 0); ut_a(srv_sys.n_threads_active[type] > 0);
break; break;
} }
ut_a(!slot->suspended); ut_a(!slot->suspended);
slot->suspended = TRUE; slot->suspended = TRUE;
ut_a(srv_sys->n_threads_active[type] > 0); ut_a(srv_sys.n_threads_active[type] > 0);
srv_sys->n_threads_active[type]--; srv_sys.n_threads_active[type]--;
return(os_event_reset(slot->event)); return(os_event_reset(slot->event));
} }
@ -931,7 +931,7 @@ srv_resume_thread(srv_slot_t* slot, ib_int64_t sig_count = 0, bool wait = true,
ut_ad(slot->suspended); ut_ad(slot->suspended);
slot->suspended = FALSE; slot->suspended = FALSE;
++srv_sys->n_threads_active[slot->type]; ++srv_sys.n_threads_active[slot->type];
srv_sys_mutex_exit(); srv_sys_mutex_exit();
return(timeout); return(timeout);
} }
@ -953,8 +953,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
srv_sys_mutex_enter(); srv_sys_mutex_enter();
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) { for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
srv_slot_t* slot = &srv_sys->sys_threads[i]; srv_slot_t* slot = &srv_sys.sys_threads[i];
if (!slot->in_use || srv_slot_get_type(slot) != type) { if (!slot->in_use || srv_slot_get_type(slot) != type) {
continue; continue;
@ -974,7 +974,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
should be the first entry always. */ should be the first entry always. */
ut_a(n == 1); ut_a(n == 1);
ut_a(i == SRV_MASTER_SLOT); 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; break;
case SRV_PURGE: case SRV_PURGE:
@ -983,12 +983,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
ut_a(n == 1); ut_a(n == 1);
ut_a(i == SRV_PURGE_SLOT); ut_a(i == SRV_PURGE_SLOT);
ut_a(srv_n_purge_threads > 0); 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; break;
case SRV_WORKER: case SRV_WORKER:
ut_a(srv_n_purge_threads > 1); 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); < srv_n_purge_threads - 1);
break; break;
} }
@ -1026,9 +1026,6 @@ void
srv_init(void) srv_init(void)
/*==========*/ /*==========*/
{ {
ulint n_sys_threads = 0;
ulint srv_sys_sz = sizeof(*srv_sys);
#ifndef HAVE_ATOMIC_BUILTINS #ifndef HAVE_ATOMIC_BUILTINS
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH); mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
#endif /* !HAVE_ATOMIC_BUILTINS */ #endif /* !HAVE_ATOMIC_BUILTINS */
@ -1036,29 +1033,19 @@ srv_init(void)
mutex_create(srv_innodb_monitor_mutex_key, mutex_create(srv_innodb_monitor_mutex_key,
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK); &srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
if (!srv_read_only_mode) { srv_sys.n_sys_threads = srv_read_only_mode
? 0
/* Number of purge threads + master thread */ : srv_n_purge_threads + 1/* purge coordinator */;
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*>(mem_zalloc(srv_sys_sz));
srv_sys->n_sys_threads = n_sys_threads;
if (!srv_read_only_mode) { if (!srv_read_only_mode) {
mutex_create(srv_sys_mutex_key, &srv_sys->mutex, SYNC_THREADS); mutex_create(srv_sys_mutex_key, &srv_sys.mutex, SYNC_THREADS);
mutex_create(srv_sys_tasks_mutex_key, mutex_create(srv_sys_tasks_mutex_key,
&srv_sys->tasks_mutex, SYNC_ANY_LATCH); &srv_sys.tasks_mutex, SYNC_ANY_LATCH);
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(); slot->event = os_event_create();
@ -1070,8 +1057,6 @@ srv_init(void)
srv_monitor_event = os_event_create(); srv_monitor_event = os_event_create();
srv_buf_dump_event = os_event_create(); srv_buf_dump_event = os_event_create();
UT_LIST_INIT(srv_sys->tasks);
} }
/* page_zip_stat_per_index_mutex is acquired from: /* page_zip_stat_per_index_mutex is acquired from:
@ -1117,10 +1102,8 @@ srv_free(void)
{ {
srv_conc_free(); srv_conc_free();
/* The mutexes srv_sys->mutex and srv_sys->tasks_mutex should have /* The mutexes srv_sys.mutex and srv_sys.tasks_mutex should have
been freed by sync_close() already. */ been freed by sync_close() already. */
mem_free(srv_sys);
srv_sys = NULL;
trx_i_s_cache_free(trx_i_s_cache); trx_i_s_cache_free(trx_i_s_cache);
@ -2012,7 +1995,7 @@ void
srv_inc_activity_count(void) srv_inc_activity_count(void)
/*========================*/ /*========================*/
{ {
srv_sys->activity_count.inc(); srv_sys.activity_count.inc();
} }
/**********************************************************************//** /**********************************************************************//**
@ -2034,7 +2017,7 @@ srv_get_active_thread_type(void)
srv_sys_mutex_enter(); srv_sys_mutex_enter();
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) { 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); ret = static_cast<srv_thread_type>(i);
break; break;
} }
@ -2073,12 +2056,12 @@ srv_active_wake_master_thread(void)
srv_inc_activity_count(); srv_inc_activity_count();
if (srv_sys->n_threads_active[SRV_MASTER] == 0) { if (srv_sys.n_threads_active[SRV_MASTER] == 0) {
srv_slot_t* slot; srv_slot_t* slot;
srv_sys_mutex_enter(); 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. */ /* Only if the master thread has been started. */
@ -2105,7 +2088,7 @@ srv_wake_purge_thread_if_not_active(void)
ut_ad(!srv_sys_mutex_own()); ut_ad(!srv_sys_mutex_own());
if (purge_sys->state == PURGE_STATE_RUN if (purge_sys->state == PURGE_STATE_RUN
&& srv_sys->n_threads_active[SRV_PURGE] == 0) { && srv_sys.n_threads_active[SRV_PURGE] == 0) {
srv_release_threads(SRV_PURGE, 1); srv_release_threads(SRV_PURGE, 1);
} }
@ -2134,7 +2117,7 @@ ulint
srv_get_activity_count(void) srv_get_activity_count(void)
/*========================*/ /*========================*/
{ {
return(srv_sys->activity_count); return(srv_sys.activity_count);
} }
/*******************************************************************//** /*******************************************************************//**
@ -2146,7 +2129,7 @@ srv_check_activity(
/*===============*/ /*===============*/
ulint old_activity_count) /*!< in: old activity count */ ulint old_activity_count) /*!< in: old activity count */
{ {
return(srv_sys->activity_count != old_activity_count); return(srv_sys.activity_count != old_activity_count);
} }
/********************************************************************//** /********************************************************************//**
@ -2517,7 +2500,7 @@ DECLARE_THREAD(srv_master_thread)(
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id()); srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
slot = srv_reserve_slot(SRV_MASTER); 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(); last_print_time = ut_time();
loop: loop:
@ -2607,18 +2590,18 @@ srv_task_execute(void)
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND); 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_a(que_node_get_type(thr->child) == QUE_NODE_PURGE);
UT_LIST_REMOVE(queue, srv_sys->tasks, thr); UT_LIST_REMOVE(queue, srv_sys.tasks, thr);
} }
mutex_exit(&srv_sys->tasks_mutex); mutex_exit(&srv_sys.tasks_mutex);
if (thr != NULL) { if (thr != NULL) {
@ -2658,7 +2641,7 @@ DECLARE_THREAD(srv_worker_thread)(
srv_sys_mutex_enter(); srv_sys_mutex_enter();
ut_a(srv_sys->n_threads_active[SRV_WORKER] < srv_n_purge_threads); ut_a(srv_sys.n_threads_active[SRV_WORKER] < srv_n_purge_threads);
srv_sys_mutex_exit(); srv_sys_mutex_exit();
@ -2987,11 +2970,11 @@ srv_que_task_enqueue_low(
que_thr_t* thr) /*!< in: query thread */ que_thr_t* thr) /*!< in: query thread */
{ {
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
mutex_enter(&srv_sys->tasks_mutex); mutex_enter(&srv_sys.tasks_mutex);
UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr); UT_LIST_ADD_LAST(queue, srv_sys.tasks, thr);
mutex_exit(&srv_sys->tasks_mutex); mutex_exit(&srv_sys.tasks_mutex);
srv_release_threads(SRV_WORKER, 1); srv_release_threads(SRV_WORKER, 1);
} }
@ -3008,11 +2991,11 @@ srv_get_task_queue_length(void)
ut_ad(!srv_read_only_mode); 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); return(n_tasks);
} }

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -1186,10 +1187,6 @@ UNIV_INTERN
dberr_t dberr_t
trx_undo_report_row_operation( 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 */ que_thr_t* thr, /*!< in: query thread */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const dtuple_t* clust_entry, /*!< in: in the case of an insert, const dtuple_t* clust_entry, /*!< in: in the case of an insert,
@ -1222,17 +1219,8 @@ trx_undo_report_row_operation(
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
ut_a(dict_index_is_clust(index)); ut_a(dict_index_is_clust(index));
ut_ad(!rec || rec_offs_validate(rec, index, offsets)); ut_ad(!rec || rec_offs_validate(rec, index, offsets));
if (flags & BTR_NO_UNDO_LOG_FLAG) {
*roll_ptr = 0;
return(DB_SUCCESS);
}
ut_ad(thr); ut_ad(thr);
ut_ad((op_type != TRX_UNDO_INSERT_OP) ut_ad(!clust_entry || (!update && !rec));
|| (clust_entry && !update && !rec));
trx = thr_get_trx(thr); trx = thr_get_trx(thr);
@ -1253,8 +1241,7 @@ trx_undo_report_row_operation(
/* If the undo log is not assigned yet, assign one */ /* If the undo log is not assigned yet, assign one */
switch (op_type) { if (clust_entry) {
case TRX_UNDO_INSERT_OP:
undo = trx->insert_undo; undo = trx->insert_undo;
if (undo == NULL) { if (undo == NULL) {
@ -1270,10 +1257,7 @@ trx_undo_report_row_operation(
ut_ad(err == DB_SUCCESS); ut_ad(err == DB_SUCCESS);
} }
break; } else {
default:
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
undo = trx->update_undo; undo = trx->update_undo;
if (undo == NULL) { if (undo == NULL) {
@ -1297,23 +1281,14 @@ trx_undo_report_row_operation(
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE); buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
do { do {
page_t* undo_page;
ulint offset;
undo_page = buf_block_get_frame(undo_block);
ut_ad(page_no == buf_block_get_page_no(undo_block)); ut_ad(page_no == buf_block_get_page_no(undo_block));
page_t* undo_page = buf_block_get_frame(undo_block);
switch (op_type) { ulint offset = clust_entry
case TRX_UNDO_INSERT_OP: ? trx_undo_page_report_insert(
offset = trx_undo_page_report_insert( undo_page, trx, index, clust_entry, &mtr)
undo_page, trx, index, clust_entry, &mtr); : trx_undo_page_report_modify(
break;
default:
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
offset = trx_undo_page_report_modify(
undo_page, trx, index, rec, offsets, update, undo_page, trx, index, rec, offsets, update,
cmpl_info, &mtr); cmpl_info, &mtr);
}
if (UNIV_UNLIKELY(offset == 0)) { if (UNIV_UNLIKELY(offset == 0)) {
/* The record did not fit on the page. We erase the /* The record did not fit on the page. We erase the
@ -1364,7 +1339,7 @@ trx_undo_report_row_operation(
mutex_exit(&trx->undo_mutex); mutex_exit(&trx->undo_mutex);
*roll_ptr = trx_undo_build_roll_ptr( *roll_ptr = trx_undo_build_roll_ptr(
op_type == TRX_UNDO_INSERT_OP, clust_entry != NULL,
rseg->id, page_no, offset); rseg->id, page_no, offset);
return(DB_SUCCESS); return(DB_SUCCESS);
} }

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2011, 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 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 the terms of the GNU General Public License as published by the Free Software
@ -48,8 +49,6 @@ sess_open(void)
sess->trx = trx_allocate_for_background(); sess->trx = trx_allocate_for_background();
sess->trx->sess = sess; sess->trx->sess = sess;
UT_LIST_INIT(sess->graphs);
return(sess); return(sess);
} }

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 mi_lock_database(MI_INFO *info, int lock_type)
{ {
int error; int error, mark_crashed= 0;
uint count; uint count;
MYISAM_SHARE *share=info->s; MYISAM_SHARE *share=info->s;
DBUG_ENTER("mi_lock_database"); DBUG_ENTER("mi_lock_database");
@ -52,6 +52,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
} }
error= 0; error= 0;
DBUG_EXECUTE_IF ("mi_lock_database_failure", error= EINVAL;);
mysql_mutex_lock(&share->intern_lock); mysql_mutex_lock(&share->intern_lock);
if (share->kfile >= 0) /* May only be false on windows */ 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, &share->dirty_part_map,
FLUSH_KEEP)) FLUSH_KEEP))
{ {
error=my_errno; mark_crashed= error=my_errno;
mi_print_error(info->s, HA_ERR_CRASHED); 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 (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
{ {
if (end_io_cache(&info->rec_cache)) if (end_io_cache(&info->rec_cache))
{ {
error=my_errno; mark_crashed= error=my_errno;
mi_print_error(info->s, HA_ERR_CRASHED); mi_print_error(info->s, HA_ERR_CRASHED);
mi_mark_crashed(info);
} }
} }
if (!count) 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.unique= info->last_unique= info->this_unique;
share->state.update_count= info->last_loop= ++info->this_loop; share->state.update_count= info->last_loop= ++info->this_loop;
if (mi_state_info_write(share->kfile, &share->state, 1)) if (mi_state_info_write(share->kfile, &share->state, 1))
error=my_errno; mark_crashed= error=my_errno;
share->changed=0; share->changed=0;
if (myisam_flush) if (myisam_flush)
{ {
if (mysql_file_sync(share->kfile, MYF(0))) if (mysql_file_sync(share->kfile, MYF(0)))
error= my_errno; mark_crashed= error= my_errno;
if (mysql_file_sync(info->dfile, MYF(0))) if (mysql_file_sync(info->dfile, MYF(0)))
error= my_errno; mark_crashed= error= my_errno;
} }
else else
share->not_flushed=1; share->not_flushed=1;
if (error) if (error)
{
mi_print_error(info->s, HA_ERR_CRASHED); mi_print_error(info->s, HA_ERR_CRASHED);
mi_mark_crashed(info);
}
} }
if (info->lock_type != F_EXTRA_LCK) if (info->lock_type != F_EXTRA_LCK)
{ {
@ -260,6 +256,8 @@ int mi_lock_database(MI_INFO *info, int lock_type)
} }
#endif #endif
mysql_mutex_unlock(&share->intern_lock); mysql_mutex_unlock(&share->intern_lock);
if (mark_crashed)
mi_mark_crashed(info);
DBUG_RETURN(error); DBUG_RETURN(error);
} /* mi_lock_database */ } /* mi_lock_database */

View File

@ -216,7 +216,9 @@ enum ESphGroupBy
SPH_GROUPBY_WEEK = 1, ///< group by week SPH_GROUPBY_WEEK = 1, ///< group by week
SPH_GROUPBY_MONTH = 2, ///< group by month SPH_GROUPBY_MONTH = 2, ///< group by month
SPH_GROUPBY_YEAR = 3, ///< group by year 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 /// 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) // 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"; 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 }, { "month:", SPH_GROUPBY_MONTH },
{ "year:", SPH_GROUPBY_YEAR }, { "year:", SPH_GROUPBY_YEAR },
{ "attr:", SPH_GROUPBY_ATTR }, { "attr:", SPH_GROUPBY_ATTR },
{ "multi:", SPH_GROUPBY_MULTIPLE }
}; };
int i; int i;

View File

@ -517,7 +517,6 @@ int spider_free_share_alloc(
) { ) {
int roop_count; int roop_count;
DBUG_ENTER("spider_free_share_alloc"); DBUG_ENTER("spider_free_share_alloc");
if (share->dbton_bitmap)
{ {
for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--) for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--)
{ {

View File

@ -1329,19 +1329,22 @@ btr_cur_ins_lock_and_undo(
index, thr, mtr, inherit); index, thr, mtr, inherit);
if (err != DB_SUCCESS if (err != DB_SUCCESS
|| !(~flags | (BTR_NO_UNDO_LOG_FLAG | BTR_KEEP_SYS_FLAG))
|| !dict_index_is_clust(index) || dict_index_is_ibuf(index)) { || !dict_index_is_clust(index) || dict_index_is_ibuf(index)) {
return(err); return(err);
} }
err = trx_undo_report_row_operation(flags, TRX_UNDO_INSERT_OP, if (flags & BTR_NO_UNDO_LOG_FLAG) {
thr, index, entry, roll_ptr = 0;
} else {
err = trx_undo_report_row_operation(thr, index, entry,
NULL, 0, NULL, NULL, NULL, 0, NULL, NULL,
&roll_ptr); &roll_ptr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
return(err); return(err);
} }
}
/* Now we can fill in the roll ptr field in entry */ /* Now we can fill in the roll ptr field in entry */
@ -1389,15 +1392,17 @@ btr_cur_optimistic_insert(
btr_cur_t* cursor, /*!< in: cursor on page after which to insert; btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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; mtr_t* mtr) /*!< in/out: mini-transaction;
if this function returns DB_SUCCESS on if this function returns DB_SUCCESS on
a leaf page of a secondary index in a a leaf page of a secondary index in a
@ -1418,6 +1423,7 @@ btr_cur_optimistic_insert(
ulint rec_size; ulint rec_size;
dberr_t err; dberr_t err;
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
*big_rec = NULL; *big_rec = NULL;
block = btr_cur_get_block(cursor); block = btr_cur_get_block(cursor);
@ -1427,7 +1433,10 @@ btr_cur_optimistic_insert(
page = buf_block_get_frame(block); page = buf_block_get_frame(block);
index = cursor->index; index = cursor->index;
ut_ad((thr && thr_get_trx(thr)->fake_changes) const bool fake_changes = (~flags & (BTR_NO_LOCKING_FLAG
| BTR_NO_UNDO_LOG_FLAG))
&& thr_get_trx(thr)->fake_changes;
ut_ad(fake_changes
|| mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); || mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
ut_ad(!dict_index_is_online_ddl(index) ut_ad(!dict_index_is_online_ddl(index)
|| dict_index_is_clust(index) || dict_index_is_clust(index)
@ -1568,7 +1577,7 @@ fail_err:
goto fail_err; goto fail_err;
} }
if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) { if (UNIV_UNLIKELY(fake_changes)) {
/* skip CHANGE, LOG */ /* skip CHANGE, LOG */
*big_rec = big_rec_vec; *big_rec = big_rec_vec;
return(err); /* == DB_SUCCESS */ return(err); /* == DB_SUCCESS */
@ -1686,15 +1695,17 @@ btr_cur_pessimistic_insert(
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ ulint** offsets,/*!< out: offsets on *rec */
mem_heap_t** heap, /*!< in/out: pointer to memory heap 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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 */ mtr_t* mtr) /*!< in/out: mini-transaction */
{ {
dict_index_t* index = cursor->index; dict_index_t* index = cursor->index;
@ -1706,13 +1717,17 @@ btr_cur_pessimistic_insert(
ulint n_reserved = 0; ulint n_reserved = 0;
ut_ad(dtuple_check_typed(entry)); ut_ad(dtuple_check_typed(entry));
ut_ad(thr || !(~flags & (BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG)));
*big_rec = NULL; *big_rec = NULL;
ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr, const bool fake_changes = (~flags & (BTR_NO_LOCKING_FLAG
| BTR_NO_UNDO_LOG_FLAG))
&& thr_get_trx(thr)->fake_changes;
ut_ad(fake_changes || mtr_memo_contains(mtr,
dict_index_get_lock(btr_cur_get_index(cursor)), dict_index_get_lock(btr_cur_get_index(cursor)),
MTR_MEMO_X_LOCK)); MTR_MEMO_X_LOCK));
ut_ad((thr && thr_get_trx(thr)->fake_changes) || mtr_memo_contains(mtr, btr_cur_get_block(cursor), ut_ad(fake_changes || mtr_memo_contains(mtr, btr_cur_get_block(cursor),
MTR_MEMO_PAGE_X_FIX)); MTR_MEMO_PAGE_X_FIX));
ut_ad(!dict_index_is_online_ddl(index) ut_ad(!dict_index_is_online_ddl(index)
|| dict_index_is_clust(index) || dict_index_is_clust(index)
@ -1773,7 +1788,7 @@ btr_cur_pessimistic_insert(
} }
} }
if (UNIV_UNLIKELY(thr && thr_get_trx(thr)->fake_changes)) { if (UNIV_UNLIKELY(fake_changes)) {
/* skip CHANGE, LOG */ /* skip CHANGE, LOG */
if (n_reserved > 0) { if (n_reserved > 0) {
fil_space_release_free_extents(index->space, fil_space_release_free_extents(index->space,
@ -1871,7 +1886,9 @@ btr_cur_upd_lock_and_undo(
const rec_t* rec; const rec_t* rec;
dberr_t err; dberr_t err;
if (UNIV_UNLIKELY(thr_get_trx(thr)->fake_changes)) { ut_ad((thr != NULL) || (flags & BTR_NO_LOCKING_FLAG));
if (!(flags & BTR_NO_LOCKING_FLAG) && thr_get_trx(thr)->fake_changes) {
/* skip LOCK, UNDO */ /* skip LOCK, UNDO */
return(DB_SUCCESS); return(DB_SUCCESS);
} }
@ -1906,9 +1923,10 @@ btr_cur_upd_lock_and_undo(
/* Append the info about the update in the undo log */ /* Append the info about the update in the undo log */
return(trx_undo_report_row_operation( return((flags & BTR_NO_UNDO_LOG_FLAG)
flags, TRX_UNDO_MODIFY_OP, thr, ? DB_SUCCESS
index, NULL, update, : trx_undo_report_row_operation(
thr, index, NULL, update,
cmpl_info, rec, offsets, roll_ptr)); cmpl_info, rec, offsets, roll_ptr));
} }
@ -2659,12 +2677,12 @@ btr_cur_pessimistic_update(
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
mem_heap_t** offsets_heap, mem_heap_t** offsets_heap,
/*!< in/out: pointer to memory heap /*!< in/out: pointer to memory heap
that can be emptied, or NULL */ that can be emptied */
mem_heap_t* entry_heap, mem_heap_t* entry_heap,
/*!< in/out: memory heap for allocating /*!< in/out: memory heap for allocating
big_rec and the index tuple */ big_rec and the index tuple */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to 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 */
const upd_t* update, /*!< in: update vector; this is allowed also const upd_t* update, /*!< in: update vector; this is allowed also
contain trx id and roll ptr fields, but contain trx id and roll ptr fields, but
the values in update vector have no effect */ the values in update vector have no effect */
@ -3239,7 +3257,7 @@ btr_cur_del_mark_set_clust_rec(
return(err); return(err);
} }
err = trx_undo_report_row_operation(0, TRX_UNDO_MODIFY_OP, thr, err = trx_undo_report_row_operation(thr,
index, NULL, NULL, 0, rec, offsets, index, NULL, NULL, 0, rec, offsets,
&roll_ptr); &roll_ptr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {

View File

@ -2,7 +2,7 @@
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. Copyright (c) 2013, 2017, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described Google, Inc. Those modifications are gratefully acknowledged and are described
@ -1509,8 +1509,6 @@ buf_pool_init_instance(
buf_pool->chunks = chunk = buf_pool->chunks = chunk =
(buf_chunk_t*) mem_zalloc(sizeof *chunk); (buf_chunk_t*) mem_zalloc(sizeof *chunk);
UT_LIST_INIT(buf_pool->free);
if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) { if (!buf_chunk_init(buf_pool, chunk, buf_pool_size)) {
mem_free(chunk); mem_free(chunk);
mem_free(buf_pool); mem_free(buf_pool);

View File

@ -2063,8 +2063,6 @@ fil_init(
fil_system->spaces = hash_create(hash_size); fil_system->spaces = hash_create(hash_size);
fil_system->name_hash = hash_create(hash_size); fil_system->name_hash = hash_create(hash_size);
UT_LIST_INIT(fil_system->LRU);
fil_system->max_n_open = max_n_open; fil_system->max_n_open = max_n_open;
fil_space_crypt_init(); fil_space_crypt_init();
@ -2791,14 +2789,12 @@ fil_op_log_parse_or_replay(
} else if (log_flags & MLOG_FILE_FLAG_TEMP) { } else if (log_flags & MLOG_FILE_FLAG_TEMP) {
/* Temporary table, do nothing */ /* Temporary table, do nothing */
} else { } else {
const char* path = NULL;
/* Create the database directory for name, if it does /* Create the database directory for name, if it does
not exist yet */ not exist yet */
fil_create_directory_for_tablename(name); fil_create_directory_for_tablename(name);
if (fil_create_new_single_table_tablespace( if (fil_create_new_single_table_tablespace(
space_id, name, path, flags, space_id, name, NULL, flags,
DICT_TF2_USE_TABLESPACE, DICT_TF2_USE_TABLESPACE,
FIL_IBD_FILE_INITIAL_SIZE, FIL_IBD_FILE_INITIAL_SIZE,
FIL_ENCRYPTION_DEFAULT, FIL_ENCRYPTION_DEFAULT,

View File

@ -872,17 +872,6 @@ innobase_purge_changed_page_bitmaps(
ulonglong lsn) __attribute__((unused)); /*!< in: LSN to purge files up to */ ulonglong lsn) __attribute__((unused)); /*!< in: LSN to purge files up to */
/*****************************************************************//**
Check whether this is a fake change transaction.
@return TRUE if a fake change transaction */
static
my_bool
innobase_is_fake_change(
/*====================*/
handlerton *hton, /*!< in: InnoDB handlerton */
THD* thd) __attribute__((unused)); /*!< in: MySQL thread handle of the user for
whom the transaction is being committed */
/** Get the list of foreign keys referencing a specified table /** Get the list of foreign keys referencing a specified table
table. table.
@param thd The thread handle @param thd The thread handle
@ -4598,22 +4587,6 @@ innobase_purge_changed_page_bitmaps(
return (my_bool)log_online_purge_changed_page_bitmaps(lsn); return (my_bool)log_online_purge_changed_page_bitmaps(lsn);
} }
/*****************************************************************//**
Check whether this is a fake change transaction.
@return TRUE if a fake change transaction */
static
my_bool
innobase_is_fake_change(
/*====================*/
handlerton *hton MY_ATTRIBUTE((unused)),
/*!< in: InnoDB handlerton */
THD* thd) /*!< in: MySQL thread handle of the user for
whom the transaction is being committed */
{
trx_t* trx = check_trx_exists(thd);
return UNIV_UNLIKELY(trx->fake_changes);
}
/*****************************************************************//** /*****************************************************************//**
Commits a transaction in an InnoDB database. */ Commits a transaction in an InnoDB database. */
static static
@ -9140,8 +9113,8 @@ calc_row_difference(
} }
} }
if (o_len != n_len || (o_len != UNIV_SQL_NULL && if (o_len != n_len || (o_len != 0 && o_len != UNIV_SQL_NULL
0 != memcmp(o_ptr, n_ptr, o_len))) { && 0 != memcmp(o_ptr, n_ptr, o_len))) {
/* The field has changed */ /* The field has changed */
ufield = uvect->fields + n_changed; ufield = uvect->fields + n_changed;
@ -15071,7 +15044,8 @@ fill_foreign_key_list(THD* thd,
{ {
ut_ad(mutex_own(&dict_sys->mutex)); ut_ad(mutex_own(&dict_sys->mutex));
for (dict_foreign_set::iterator it = table->referenced_set.begin(); for (dict_foreign_set::const_iterator it
= table->referenced_set.begin();
it != table->referenced_set.end(); ++it) { it != table->referenced_set.end(); ++it) {
dict_foreign_t* foreign = *it; dict_foreign_t* foreign = *it;

View File

@ -540,7 +540,7 @@ innobase_index_name_is_reserved(
const KEY* key_info, /*!< in: Indexes to be created */ const KEY* key_info, /*!< in: Indexes to be created */
ulint num_of_keys) /*!< in: Number of indexes to ulint num_of_keys) /*!< in: Number of indexes to
be created. */ be created. */
MY_ATTRIBUTE((nonnull, warn_unused_result)); MY_ATTRIBUTE((nonnull(1), warn_unused_result));
/*****************************************************************//** /*****************************************************************//**
#ifdef WITH_WSREP #ifdef WITH_WSREP

View File

@ -2307,10 +2307,10 @@ online_retry_drop_indexes_with_trx(
@param drop_fk constraints being dropped @param drop_fk constraints being dropped
@param n_drop_fk number of constraints that are being dropped @param n_drop_fk number of constraints that are being dropped
@return whether the constraint is being dropped */ @return whether the constraint is being dropped */
inline MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) MY_ATTRIBUTE((pure, nonnull(1), warn_unused_result))
inline
bool bool
innobase_dropping_foreign( innobase_dropping_foreign(
/*======================*/
const dict_foreign_t* foreign, const dict_foreign_t* foreign,
dict_foreign_t** drop_fk, dict_foreign_t** drop_fk,
ulint n_drop_fk) ulint n_drop_fk)
@ -2334,10 +2334,10 @@ column that is being dropped or modified to NOT NULL.
@retval true Not allowed (will call my_error()) @retval true Not allowed (will call my_error())
@retval false Allowed @retval false Allowed
*/ */
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) MY_ATTRIBUTE((pure, nonnull(1,4), warn_unused_result))
static
bool bool
innobase_check_foreigns_low( innobase_check_foreigns_low(
/*========================*/
const dict_table_t* user_table, const dict_table_t* user_table,
dict_foreign_t** drop_fk, dict_foreign_t** drop_fk,
ulint n_drop_fk, ulint n_drop_fk,
@ -2434,10 +2434,10 @@ column that is being dropped or modified to NOT NULL.
@retval true Not allowed (will call my_error()) @retval true Not allowed (will call my_error())
@retval false Allowed @retval false Allowed
*/ */
static MY_ATTRIBUTE((pure, nonnull, warn_unused_result)) MY_ATTRIBUTE((pure, nonnull(1,2,3,4), warn_unused_result))
static
bool bool
innobase_check_foreigns( innobase_check_foreigns(
/*====================*/
Alter_inplace_info* ha_alter_info, Alter_inplace_info* ha_alter_info,
const TABLE* altered_table, const TABLE* altered_table,
const TABLE* old_table, const TABLE* old_table,

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates. Copyright (c) 2007, 2016, 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 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 the terms of the GNU General Public License as published by the Free Software
@ -2966,14 +2966,16 @@ i_s_fts_deleted_generic_fill(
fields = table->field; fields = table->field;
int ret = 0;
for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) { for (ulint j = 0; j < ib_vector_size(deleted->doc_ids); ++j) {
doc_id_t doc_id; doc_id_t doc_id;
doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j); doc_id = *(doc_id_t*) ib_vector_get_const(deleted->doc_ids, j);
OK(fields[I_S_FTS_DOC_ID]->store((longlong) 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); trx_free_for_background(trx);
@ -2984,7 +2986,7 @@ i_s_fts_deleted_generic_fill(
rw_lock_s_unlock(&dict_operation_lock); rw_lock_s_unlock(&dict_operation_lock);
DBUG_RETURN(0); DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -3222,13 +3224,13 @@ i_s_fts_index_cache_fill_one_index(
/*===============================*/ /*===============================*/
fts_index_cache_t* index_cache, /*!< in: FTS index cache */ fts_index_cache_t* index_cache, /*!< in: FTS index cache */
THD* thd, /*!< in: thread */ THD* thd, /*!< in: thread */
fts_string_t* conv_str, /*!< in/out: buffer */
TABLE_LIST* tables) /*!< in/out: tables to fill */ TABLE_LIST* tables) /*!< in/out: tables to fill */
{ {
TABLE* table = (TABLE*) tables->table; TABLE* table = (TABLE*) tables->table;
Field** fields; Field** fields;
CHARSET_INFO* index_charset; CHARSET_INFO* index_charset;
const ib_rbt_node_t* rbt_node; const ib_rbt_node_t* rbt_node;
fts_string_t conv_str;
uint dummy_errors; uint dummy_errors;
char* word_str; char* word_str;
@ -3237,10 +3239,9 @@ i_s_fts_index_cache_fill_one_index(
fields = table->field; fields = table->field;
index_charset = index_cache->charset; index_charset = index_cache->charset;
conv_str.f_len = system_charset_info->mbmaxlen conv_str->f_n_char = 0;
* FTS_MAX_WORD_LEN_IN_CHAR;
conv_str.f_str = static_cast<byte*>(ut_malloc(conv_str.f_len)); int ret = 0;
conv_str.f_n_char = 0;
/* Go through each word in the index cache */ /* Go through each word in the index cache */
for (rbt_node = rbt_first(index_cache->words); for (rbt_node = rbt_first(index_cache->words);
@ -3252,16 +3253,16 @@ i_s_fts_index_cache_fill_one_index(
/* Convert word from index charset to system_charset_info */ /* Convert word from index charset to system_charset_info */
if (index_charset->cset != system_charset_info->cset) { if (index_charset->cset != system_charset_info->cset) {
conv_str.f_n_char = my_convert( conv_str->f_n_char = my_convert(
reinterpret_cast<char*>(conv_str.f_str), reinterpret_cast<char*>(conv_str->f_str),
static_cast<uint32>(conv_str.f_len), static_cast<uint32>(conv_str->f_len),
system_charset_info, system_charset_info,
reinterpret_cast<char*>(word->text.f_str), reinterpret_cast<char*>(word->text.f_str),
static_cast<uint32>(word->text.f_len), static_cast<uint32>(word->text.f_len),
index_charset, &dummy_errors); index_charset, &dummy_errors);
ut_ad(conv_str.f_n_char <= conv_str.f_len); ut_ad(conv_str->f_n_char <= conv_str->f_len);
conv_str.f_str[conv_str.f_n_char] = 0; conv_str->f_str[conv_str->f_n_char] = 0;
word_str = reinterpret_cast<char*>(conv_str.f_str); word_str = reinterpret_cast<char*>(conv_str->f_str);
} else { } else {
word_str = reinterpret_cast<char*>(word->text.f_str); word_str = reinterpret_cast<char*>(word->text.f_str);
} }
@ -3319,9 +3320,7 @@ i_s_fts_index_cache_fill_one_index(
} }
} }
ut_free(conv_str.f_str); DBUG_RETURN(ret);
DBUG_RETURN(0);
} }
/*******************************************************************//** /*******************************************************************//**
Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED Fill the dynamic table INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHED
@ -3365,18 +3364,27 @@ i_s_fts_index_cache_fill(
ut_a(cache); 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(conv_str.f_len));
for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) { for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) {
fts_index_cache_t* index_cache; fts_index_cache_t* index_cache;
index_cache = static_cast<fts_index_cache_t*> ( index_cache = static_cast<fts_index_cache_t*> (
ib_vector_get(cache->indexes, i)); 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); dict_table_close(user_table, FALSE, FALSE);
DBUG_RETURN(0); DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -3679,8 +3687,6 @@ i_s_fts_index_table_fill_one_fetch(
} }
} }
i_s_fts_index_table_free_one_fetch(words);
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
@ -3694,13 +3700,13 @@ i_s_fts_index_table_fill_one_index(
/*===============================*/ /*===============================*/
dict_index_t* index, /*!< in: FTS index */ dict_index_t* index, /*!< in: FTS index */
THD* thd, /*!< in: thread */ THD* thd, /*!< in: thread */
fts_string_t* conv_str, /*!< in/out: buffer */
TABLE_LIST* tables) /*!< in/out: tables to fill */ TABLE_LIST* tables) /*!< in/out: tables to fill */
{ {
ib_vector_t* words; ib_vector_t* words;
mem_heap_t* heap; mem_heap_t* heap;
fts_string_t word; fts_string_t word;
CHARSET_INFO* index_charset; CHARSET_INFO* index_charset;
fts_string_t conv_str;
dberr_t error; dberr_t error;
int ret = 0; int ret = 0;
@ -3717,10 +3723,6 @@ i_s_fts_index_table_fill_one_index(
word.f_n_char = 0; word.f_n_char = 0;
index_charset = fts_index_get_charset(index); 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(conv_str.f_len));
conv_str.f_n_char = 0;
/* Iterate through each auxiliary table as described in /* Iterate through each auxiliary table as described in
fts_index_selector */ fts_index_selector */
@ -3754,17 +3756,17 @@ i_s_fts_index_table_fill_one_index(
/* Fill into tables */ /* Fill into tables */
ret = i_s_fts_index_table_fill_one_fetch( 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) { if (ret != 0) {
i_s_fts_index_table_free_one_fetch(words);
goto func_exit; goto func_exit;
} }
} while (has_more); } while (has_more);
} }
func_exit: func_exit:
ut_free(conv_str.f_str);
mem_heap_free(heap); mem_heap_free(heap);
DBUG_RETURN(ret); DBUG_RETURN(ret);
@ -3806,10 +3808,17 @@ i_s_fts_index_table_fill(
DBUG_RETURN(0); 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(conv_str.f_len));
for (index = dict_table_get_first_index(user_table); for (index = dict_table_get_first_index(user_table);
index; index = dict_table_get_next_index(index)) { index; index = dict_table_get_next_index(index)) {
if (index->type & DICT_FTS) { 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));
} }
} }
@ -3817,7 +3826,9 @@ i_s_fts_index_table_fill(
rw_lock_s_unlock(&dict_operation_lock); rw_lock_s_unlock(&dict_operation_lock);
DBUG_RETURN(0); ut_free(conv_str.f_str);
DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -3982,6 +3993,8 @@ i_s_fts_config_fill(
DBUG_ASSERT(!dict_index_is_online_ddl(index)); DBUG_ASSERT(!dict_index_is_online_ddl(index));
} }
int ret = 0;
while (fts_config_key[i]) { while (fts_config_key[i]) {
fts_string_t value; fts_string_t value;
char* key_name; char* key_name;
@ -4006,13 +4019,14 @@ i_s_fts_config_fill(
ut_free(key_name); ut_free(key_name);
} }
OK(field_store_string( BREAK_IF(ret = field_store_string(
fields[FTS_CONFIG_KEY], fts_config_key[i])); fields[FTS_CONFIG_KEY], fts_config_key[i]));
OK(field_store_string( BREAK_IF(ret = field_store_string(
fields[FTS_CONFIG_VALUE], (const char*) value.f_str)); 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++; i++;
} }
@ -4025,7 +4039,7 @@ i_s_fts_config_fill(
rw_lock_s_unlock(&dict_operation_lock); rw_lock_s_unlock(&dict_operation_lock);
DBUG_RETURN(0); DBUG_RETURN(ret);
} }
/*******************************************************************//** /*******************************************************************//**
@ -4864,34 +4878,29 @@ i_s_innodb_buffer_page_fill(
state_str = NULL; state_str = NULL;
OK(fields[IDX_BUFFER_POOL_ID]->store( OK(fields[IDX_BUFFER_POOL_ID]->store(
static_cast<double>(page_info->pool_id))); page_info->pool_id, true));
OK(fields[IDX_BUFFER_BLOCK_ID]->store( OK(fields[IDX_BUFFER_BLOCK_ID]->store(
static_cast<double>(page_info->block_id))); page_info->block_id, true));
OK(fields[IDX_BUFFER_PAGE_SPACE]->store( OK(fields[IDX_BUFFER_PAGE_SPACE]->store(
static_cast<double>(page_info->space_id))); page_info->space_id, true));
OK(fields[IDX_BUFFER_PAGE_NUM]->store( OK(fields[IDX_BUFFER_PAGE_NUM]->store(
static_cast<double>(page_info->page_num))); page_info->page_num, true));
OK(field_store_string( OK(field_store_string(
fields[IDX_BUFFER_PAGE_TYPE], fields[IDX_BUFFER_PAGE_TYPE],
i_s_page_type[page_info->page_type].type_str)); i_s_page_type[page_info->page_type].type_str));
OK(fields[IDX_BUFFER_PAGE_FLUSH_TYPE]->store( 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( OK(fields[IDX_BUFFER_PAGE_FIX_COUNT]->store(
page_info->fix_count)); page_info->fix_count, true));
if (page_info->hashed) { OK(field_store_string(fields[IDX_BUFFER_PAGE_HASHED],
OK(field_store_string( page_info->hashed ? "YES" : "NO"));
fields[IDX_BUFFER_PAGE_HASHED], "YES"));
} else {
OK(field_store_string(
fields[IDX_BUFFER_PAGE_HASHED], "NO"));
}
OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store( OK(fields[IDX_BUFFER_PAGE_NEWEST_MOD]->store(
(longlong) page_info->newest_mod, true)); (longlong) page_info->newest_mod, true));
@ -4900,7 +4909,7 @@ i_s_innodb_buffer_page_fill(
(longlong) page_info->oldest_mod, true)); (longlong) page_info->oldest_mod, true));
OK(fields[IDX_BUFFER_PAGE_ACCESS_TIME]->store( 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(); fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_null();
@ -4909,44 +4918,48 @@ i_s_innodb_buffer_page_fill(
/* If this is an index page, fetch the index name /* If this is an index page, fetch the index name
and table name */ and table name */
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
const dict_index_t* index; bool ret = false;
mutex_enter(&dict_sys->mutex); 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_end = innobase_convert_name(
table_name, sizeof(table_name), table_name, sizeof(table_name),
index->table_name, index->table_name,
strlen(index->table_name), strlen(index->table_name),
thd, TRUE); thd, TRUE);
OK(fields[IDX_BUFFER_PAGE_TABLE_NAME]->store( ret = fields[IDX_BUFFER_PAGE_TABLE_NAME]
table_name, ->store(table_name,
static_cast<uint>(table_name_end - table_name), static_cast<uint>(
system_charset_info)); table_name_end
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); - table_name),
system_charset_info)
OK(field_store_index_name( || field_store_index_name(
fields[IDX_BUFFER_PAGE_INDEX_NAME], fields
index->name)); [IDX_BUFFER_PAGE_INDEX_NAME],
index->name);
} }
mutex_exit(&dict_sys->mutex); mutex_exit(&dict_sys->mutex);
OK(ret);
fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
} }
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store( OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
page_info->num_recs)); page_info->num_recs, true));
OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store( OK(fields[IDX_BUFFER_PAGE_DATA_SIZE]->store(
page_info->data_size)); page_info->data_size, true));
OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store( OK(fields[IDX_BUFFER_PAGE_ZIP_SIZE]->store(
page_info->zip_ssize page_info->zip_ssize
? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize ? (UNIV_ZIP_SIZE_MIN >> 1) << page_info->zip_ssize
: 0)); : 0, true));
#if BUF_PAGE_STATE_BITS > 3 #if BUF_PAGE_STATE_BITS > 3
# error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<<BUF_PAGE_STATE_BITS values are checked for" # error "BUF_PAGE_STATE_BITS > 3, please ensure that all 1<<BUF_PAGE_STATE_BITS values are checked for"
@ -4984,32 +4997,29 @@ i_s_innodb_buffer_page_fill(
switch (page_info->io_fix) { switch (page_info->io_fix) {
case BUF_IO_NONE: case BUF_IO_NONE:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_NONE";
"IO_NONE"));
break; break;
case BUF_IO_READ: case BUF_IO_READ:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_READ";
"IO_READ"));
break; break;
case BUF_IO_WRITE: case BUF_IO_WRITE:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_WRITE";
"IO_WRITE"));
break; break;
case BUF_IO_PIN: case BUF_IO_PIN:
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX], state_str = "IO_PIN";
"IO_PIN"));
break; break;
} }
OK(field_store_string(fields[IDX_BUFFER_PAGE_IO_FIX],
state_str));
OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD], OK(field_store_string(fields[IDX_BUFFER_PAGE_IS_OLD],
(page_info->is_old) ? "YES" : "NO")); (page_info->is_old) ? "YES" : "NO"));
OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store( OK(fields[IDX_BUFFER_PAGE_FREE_CLOCK]->store(
page_info->freed_page_clock)); page_info->freed_page_clock));
if (schema_table_store_record(thd, table)) { OK(schema_table_store_record(thd, table));
DBUG_RETURN(1);
}
} }
DBUG_RETURN(0); DBUG_RETURN(0);
@ -5550,17 +5560,10 @@ i_s_innodb_buf_page_lru_fill(
ulint num_page) /*!< in: number of page info ulint num_page) /*!< in: number of page info
cached */ cached */
{ {
TABLE* table;
Field** fields;
mem_heap_t* heap;
DBUG_ENTER("i_s_innodb_buf_page_lru_fill"); DBUG_ENTER("i_s_innodb_buf_page_lru_fill");
table = tables->table; TABLE* table = tables->table;
Field** fields = table->field;
fields = table->field;
heap = mem_heap_create(1000);
/* Iterate through the cached array and fill the I_S table rows */ /* Iterate through the cached array and fill the I_S table rows */
for (ulint i = 0; i < num_page; i++) { for (ulint i = 0; i < num_page; i++) {
@ -5575,34 +5578,28 @@ i_s_innodb_buf_page_lru_fill(
page_info = info_array + i; page_info = info_array + i;
OK(fields[IDX_BUF_LRU_POOL_ID]->store( OK(fields[IDX_BUF_LRU_POOL_ID]->store(
static_cast<double>(page_info->pool_id))); page_info->pool_id, true));
OK(fields[IDX_BUF_LRU_POS]->store( OK(fields[IDX_BUF_LRU_POS]->store(
static_cast<double>(page_info->block_id))); page_info->block_id, true));
OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store( OK(fields[IDX_BUF_LRU_PAGE_SPACE]->store(
static_cast<double>(page_info->space_id))); page_info->space_id, true));
OK(fields[IDX_BUF_LRU_PAGE_NUM]->store( OK(fields[IDX_BUF_LRU_PAGE_NUM]->store(
static_cast<double>(page_info->page_num))); page_info->page_num, true));
OK(field_store_string( OK(field_store_string(
fields[IDX_BUF_LRU_PAGE_TYPE], fields[IDX_BUF_LRU_PAGE_TYPE],
i_s_page_type[page_info->page_type].type_str)); i_s_page_type[page_info->page_type].type_str));
OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store( OK(fields[IDX_BUF_LRU_PAGE_FLUSH_TYPE]->store(
static_cast<double>(page_info->flush_type))); page_info->flush_type, true));
OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store( OK(fields[IDX_BUF_LRU_PAGE_FIX_COUNT]->store(
static_cast<double>(page_info->fix_count))); page_info->fix_count, true));
if (page_info->hashed) { OK(field_store_string(fields[IDX_BUF_LRU_PAGE_HASHED],
OK(field_store_string( page_info->hashed ? "YES" : "NO"));
fields[IDX_BUF_LRU_PAGE_HASHED], "YES"));
} else {
OK(field_store_string(
fields[IDX_BUF_LRU_PAGE_HASHED], "NO"));
}
OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store( OK(fields[IDX_BUF_LRU_PAGE_NEWEST_MOD]->store(
page_info->newest_mod, true)); page_info->newest_mod, true));
@ -5611,7 +5608,7 @@ i_s_innodb_buf_page_lru_fill(
page_info->oldest_mod, true)); page_info->oldest_mod, true));
OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store( OK(fields[IDX_BUF_LRU_PAGE_ACCESS_TIME]->store(
page_info->access_time)); page_info->access_time, true));
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null(); fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_null();
@ -5620,43 +5617,47 @@ i_s_innodb_buf_page_lru_fill(
/* If this is an index page, fetch the index name /* If this is an index page, fetch the index name
and table name */ and table name */
if (page_info->page_type == I_S_PAGE_TYPE_INDEX) { if (page_info->page_type == I_S_PAGE_TYPE_INDEX) {
const dict_index_t* index; bool ret = false;
mutex_enter(&dict_sys->mutex); 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_end = innobase_convert_name(
table_name, sizeof(table_name), table_name, sizeof(table_name),
index->table_name, index->table_name,
strlen(index->table_name), strlen(index->table_name),
thd, TRUE); thd, TRUE);
OK(fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->store( ret = fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
table_name, ->store(table_name,
static_cast<uint>(table_name_end - table_name), static_cast<uint>(
system_charset_info)); table_name_end
fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); - table_name),
system_charset_info)
OK(field_store_index_name( || field_store_index_name(
fields[IDX_BUF_LRU_PAGE_INDEX_NAME], fields
index->name)); [IDX_BUF_LRU_PAGE_INDEX_NAME],
index->name);
} }
mutex_exit(&dict_sys->mutex); 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( OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store(
page_info->num_recs)); page_info->num_recs, true));
OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store( OK(fields[IDX_BUF_LRU_PAGE_DATA_SIZE]->store(
page_info->data_size)); page_info->data_size, true));
OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store( OK(fields[IDX_BUF_LRU_PAGE_ZIP_SIZE]->store(
page_info->zip_ssize ? page_info->zip_ssize
512 << page_info->zip_ssize : 0)); ? 512 << page_info->zip_ssize : 0, true));
state = static_cast<enum buf_page_state>(page_info->page_state); state = static_cast<enum buf_page_state>(page_info->page_state);
@ -5685,35 +5686,31 @@ i_s_innodb_buf_page_lru_fill(
switch (page_info->io_fix) { switch (page_info->io_fix) {
case BUF_IO_NONE: case BUF_IO_NONE:
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], state_str = "IO_NONE";
"IO_NONE"));
break; break;
case BUF_IO_READ: case BUF_IO_READ:
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], state_str = "IO_READ";
"IO_READ"));
break; break;
case BUF_IO_WRITE: case BUF_IO_WRITE:
OK(field_store_string(fields[IDX_BUF_LRU_PAGE_IO_FIX], state_str = "IO_WRITE";
"IO_WRITE")); break;
case BUF_IO_PIN:
state_str = "IO_PIN";
break; 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], 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( OK(fields[IDX_BUF_LRU_PAGE_FREE_CLOCK]->store(
page_info->freed_page_clock)); page_info->freed_page_clock, true));
if (schema_table_store_record(thd, table)) { OK(schema_table_store_record(thd, table));
mem_heap_free(heap);
DBUG_RETURN(1);
} }
mem_heap_empty(heap);
}
mem_heap_free(heap);
DBUG_RETURN(0); DBUG_RETURN(0);
} }

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2007, 2013, Oracle and/or its affiliates. All Rights Reserved.
Copyrigth (c) 2014, 2015, MariaDB Corporation Copyrigth (c) 2014, 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -77,6 +77,8 @@ extern struct st_mysql_plugin i_s_innodb_changed_page_bitmaps;
DBUG_RETURN(1); \ DBUG_RETURN(1); \
} }
#define BREAK_IF(expr) if ((expr)) break
#define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \ #define RETURN_IF_INNODB_NOT_STARTED(plugin_name) \
do { \ do { \
if (!srv_was_started) { \ if (!srv_was_started) { \

View File

@ -2963,8 +2963,7 @@ ibuf_get_volume_buffered_hash(
fold = ut_fold_binary(data, len); fold = ut_fold_binary(data, len);
hash += (fold / (CHAR_BIT * sizeof *hash)) % size; hash += (fold / (CHAR_BIT * sizeof *hash)) % size;
bitmask = static_cast<ulint>( bitmask = static_cast<ulint>(1) << (fold % (CHAR_BIT * sizeof(*hash)));
1 << (fold % (CHAR_BIT * sizeof(*hash))));
if (*hash & bitmask) { if (*hash & bitmask) {
@ -3733,7 +3732,7 @@ fail_exit:
if (mode == BTR_MODIFY_PREV) { if (mode == BTR_MODIFY_PREV) {
err = btr_cur_optimistic_insert( err = btr_cur_optimistic_insert(
BTR_NO_LOCKING_FLAG, BTR_NO_LOCKING_FLAG | BTR_NO_UNDO_LOG_FLAG,
cursor, &offsets, &offsets_heap, cursor, &offsets, &offsets_heap,
ibuf_entry, &ins_rec, ibuf_entry, &ins_rec,
&dummy_big_rec, 0, thr, &mtr); &dummy_big_rec, 0, thr, &mtr);

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -220,15 +221,17 @@ btr_cur_optimistic_insert(
btr_cur_t* cursor, /*!< in: cursor on page after which to insert; btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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; mtr_t* mtr) /*!< in/out: mini-transaction;
if this function returns DB_SUCCESS on if this function returns DB_SUCCESS on
a leaf page of a secondary index in a a leaf page of a secondary index in a
@ -256,15 +259,17 @@ btr_cur_pessimistic_insert(
cursor stays valid */ cursor stays valid */
ulint** offsets,/*!< out: offsets on *rec */ ulint** offsets,/*!< out: offsets on *rec */
mem_heap_t** heap, /*!< in/out: pointer to memory heap 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 */ dtuple_t* entry, /*!< in/out: entry to insert */
rec_t** rec, /*!< out: pointer to inserted record if rec_t** rec, /*!< out: pointer to inserted record if
succeed */ succeed */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to big_rec_t** big_rec,/*!< out: big rec vector whose fields have to
be stored externally by the caller, or be stored externally by the caller */
NULL */
ulint n_ext, /*!< in: number of externally stored columns */ 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 */ mtr_t* mtr) /*!< in/out: mini-transaction */
MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result)); MY_ATTRIBUTE((nonnull(2,3,4,5,6,7,10), warn_unused_result));
/*************************************************************//** /*************************************************************//**
@ -392,12 +397,12 @@ btr_cur_pessimistic_update(
ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */ ulint** offsets,/*!< out: offsets on cursor->page_cur.rec */
mem_heap_t** offsets_heap, mem_heap_t** offsets_heap,
/*!< in/out: pointer to memory heap /*!< in/out: pointer to memory heap
that can be emptied, or NULL */ that can be emptied */
mem_heap_t* entry_heap, mem_heap_t* entry_heap,
/*!< in/out: memory heap for allocating /*!< in/out: memory heap for allocating
big_rec and the index tuple */ big_rec and the index tuple */
big_rec_t** big_rec,/*!< out: big rec vector whose fields have to 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 */
const upd_t* update, /*!< in: update vector; this is allowed also const upd_t* update, /*!< in: update vector; this is allowed also
contain trx id and roll ptr fields, but contain trx id and roll ptr fields, but
the values in update vector have no effect */ the values in update vector have no effect */

View File

@ -1006,7 +1006,7 @@ fil_create_new_single_table_tablespace(
must be >= FIL_IBD_FILE_INITIAL_SIZE */ must be >= FIL_IBD_FILE_INITIAL_SIZE */
fil_encryption_t mode, /*!< in: encryption mode */ fil_encryption_t mode, /*!< in: encryption mode */
ulint key_id) /*!< in: encryption key_id */ ulint key_id) /*!< in: encryption key_id */
__attribute__((nonnull, warn_unused_result)); MY_ATTRIBUTE((nonnull(2), warn_unused_result));
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
/** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations. /** Try to adjust FSP_SPACE_FLAGS if they differ from the expectations.
(Typically when upgrading from MariaDB 10.1.0..10.1.20.) (Typically when upgrading from MariaDB 10.1.0..10.1.20.)

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2006, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2006, 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 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 the terms of the GNU General Public License as published by the Free Software
@ -143,7 +144,7 @@ enum durability_properties
thd_requested_durability( thd_requested_durability(
/*=====================*/ /*=====================*/
const THD* thd) /*!< in: thread handle */ const THD* thd) /*!< in: thread handle */
MY_ATTRIBUTE((nonnull, warn_unused_result)); MY_ATTRIBUTE((warn_unused_result));
/******************************************************************//** /******************************************************************//**
Returns true if the transaction this thread is processing has edited Returns true if the transaction this thread is processing has edited

View File

@ -960,7 +960,14 @@ struct MY_ALIGNED(CACHE_LINE_SIZE) simple_counter
{ {
compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint)); compile_time_assert(!atomic || sizeof(Type) == sizeof(ulint));
if (atomic) { if (atomic) {
return os_atomic_increment_ulint(&m_counter, i); /* GCC would perform a type check in this code
also in case the template is instantiated with
simple_counter<Type=not_ulint, atomic=false>.
On Solaris, os_atomic_increment_ulint() maps
to atomic_add_long_nv(), which expects the
parameter to be correctly typed. */
return os_atomic_increment_ulint(
reinterpret_cast<ulint*>(&m_counter), i);
} else { } else {
return m_counter += i; return m_counter += i;
} }

View File

@ -2,6 +2,7 @@
Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2005, 2013, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -172,7 +173,8 @@ page_zip_rec_needs_ext(
ignored if zip_size == 0 */ ignored if zip_size == 0 */
ulint zip_size) /*!< in: compressed page size in bytes, or 0 */ ulint zip_size) /*!< in: compressed page size in bytes, or 0 */
{ {
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(ut_is_2pow(zip_size)); ut_ad(ut_is_2pow(zip_size));
ut_ad(comp || !zip_size); ut_ad(comp || !zip_size);

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -212,10 +213,6 @@ UNIV_INTERN
dberr_t dberr_t
trx_undo_report_row_operation( 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 */ que_thr_t* thr, /*!< in: query thread */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const dtuple_t* clust_entry, /*!< in: in the case of an insert, const dtuple_t* clust_entry, /*!< in: in the case of an insert,
@ -233,7 +230,7 @@ trx_undo_report_row_operation(
inserted undo log record, inserted undo log record,
0 if BTR_NO_UNDO_LOG 0 if BTR_NO_UNDO_LOG
flag was specified */ flag was specified */
MY_ATTRIBUTE((nonnull(3,4,10), warn_unused_result)); MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result));
/******************************************************************//** /******************************************************************//**
Copies an undo record to heap. This function can be called if we know that Copies an undo record to heap. This function can be called if we know that
the undo log record exists. the undo log record exists.
@ -313,10 +310,6 @@ record */
storage fields: used by purge to storage fields: used by purge to
free the external storage */ free the external storage */
/* Operation type flags used in trx_undo_report_row_operation */
#define TRX_UNDO_INSERT_OP 1
#define TRX_UNDO_MODIFY_OP 2
#ifndef UNIV_NONINL #ifndef UNIV_NONINL
#include "trx0rec.ic" #include "trx0rec.ic"
#endif #endif

View File

@ -1293,9 +1293,11 @@ rec_convert_dtuple_to_rec_comp(
} }
} }
if (len) {
memcpy(end, dfield_get_data(field), len); memcpy(end, dfield_get_data(field), len);
end += len; end += len;
} }
}
} }
/*********************************************************//** /*********************************************************//**

View File

@ -249,9 +249,6 @@ row_fts_psort_info_init(
each parallel sort thread. Each "sort bucket" holds records for each parallel sort thread. Each "sort bucket" holds records for
a particular "FTS index partition" */ a particular "FTS index partition" */
for (j = 0; j < fts_sort_pll_degree; j++) { for (j = 0; j < fts_sort_pll_degree; j++) {
UT_LIST_INIT(psort_info[j].fts_doc_list);
for (i = 0; i < FTS_NUM_AUX_INDEX; i++) { for (i = 0; i < FTS_NUM_AUX_INDEX; i++) {
psort_info[j].merge_file[i] = psort_info[j].merge_file[i] =

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -2166,14 +2167,10 @@ for a clustered index!
@retval DB_SUCCESS if no error @retval DB_SUCCESS if no error
@retval DB_DUPLICATE_KEY if error, @retval DB_DUPLICATE_KEY if error,
@retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate @retval DB_LOCK_WAIT if we have to wait for a lock on a possible duplicate
record 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)) */
static MY_ATTRIBUTE((nonnull, warn_unused_result)) static MY_ATTRIBUTE((nonnull, warn_unused_result))
dberr_t dberr_t
row_ins_duplicate_error_in_clust( row_ins_duplicate_error_in_clust(
/*=============================*/
ulint flags, /*!< in: undo logging and locking flags */
btr_cur_t* cursor, /*!< in: B-tree cursor */ btr_cur_t* cursor, /*!< in: B-tree cursor */
const dtuple_t* entry, /*!< in: entry to insert */ const dtuple_t* entry, /*!< in: entry to insert */
que_thr_t* thr, /*!< in: query thread */ que_thr_t* thr, /*!< in: query thread */
@ -2454,7 +2451,7 @@ row_ins_clust_index_entry_low(
DB_LOCK_WAIT */ DB_LOCK_WAIT */
err = row_ins_duplicate_error_in_clust( err = row_ins_duplicate_error_in_clust(
flags, &cursor, entry, thr, &mtr); &cursor, entry, thr, &mtr);
} }
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {

View File

@ -450,7 +450,7 @@ UNIV_INTERN my_bool srv_cleaner_thread_priority = FALSE;
UNIV_INTERN my_bool srv_master_thread_priority = FALSE; UNIV_INTERN my_bool srv_master_thread_priority = FALSE;
/* The number of purge threads to use.*/ /* The number of purge threads to use.*/
UNIV_INTERN ulong srv_n_purge_threads = 1; UNIV_INTERN ulong srv_n_purge_threads;
/* the number of pages to purge in one batch */ /* the number of pages to purge in one batch */
UNIV_INTERN ulong srv_purge_batch_size = 20; UNIV_INTERN ulong srv_purge_batch_size = 20;
@ -694,16 +694,16 @@ UNIV_INTERN ulong srv_buf_dump_status_frequency = 0;
/** Acquire the system_mutex. */ /** Acquire the system_mutex. */
#define srv_sys_mutex_enter() do { \ #define srv_sys_mutex_enter() do { \
mutex_enter(&srv_sys->mutex); \ mutex_enter(&srv_sys.mutex); \
} while (0) } while (0)
/** Test if the system mutex is owned. */ /** 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) && !srv_read_only_mode)
/** Release the system mutex. */ /** Release the system mutex. */
#define srv_sys_mutex_exit() do { \ #define srv_sys_mutex_exit() do { \
mutex_exit(&srv_sys->mutex); \ mutex_exit(&srv_sys.mutex); \
} while (0) } while (0)
#define fetch_lock_wait_timeout(trx) \ #define fetch_lock_wait_timeout(trx) \
@ -798,7 +798,7 @@ struct srv_sys_t{
ulint n_sys_threads; /*!< size of the sys_threads ulint n_sys_threads; /*!< size of the sys_threads
array */ 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_set() and
os_event_reset() on os_event_reset() on
sys_threads[]->event are sys_threads[]->event are
@ -822,7 +822,7 @@ struct srv_sys_t{
UNIV_INTERN ib_mutex_t server_mutex; UNIV_INTERN ib_mutex_t server_mutex;
#endif /* !HAVE_ATOMIC_BUILTINS */ #endif /* !HAVE_ATOMIC_BUILTINS */
static srv_sys_t* srv_sys = NULL; static srv_sys_t srv_sys;
/** Event to signal srv_monitor_thread. Not protected by a mutex. /** Event to signal srv_monitor_thread. Not protected by a mutex.
Set after setting srv_print_innodb_monitor. */ Set after setting srv_print_innodb_monitor. */
@ -844,10 +844,10 @@ and/or load it during startup. */
UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE; UNIV_INTERN char srv_buffer_pool_dump_at_shutdown = FALSE;
UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE; UNIV_INTERN char srv_buffer_pool_load_at_startup = FALSE;
/** 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; 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; static const ulint SRV_MASTER_SLOT = 0;
UNIV_INTERN os_event_t srv_checkpoint_completed_event; UNIV_INTERN os_event_t srv_checkpoint_completed_event;
@ -957,21 +957,21 @@ srv_reserve_slot(
switch (type) { switch (type) {
case SRV_MASTER: case SRV_MASTER:
slot = &srv_sys->sys_threads[SRV_MASTER_SLOT]; slot = &srv_sys.sys_threads[SRV_MASTER_SLOT];
break; break;
case SRV_PURGE: case SRV_PURGE:
slot = &srv_sys->sys_threads[SRV_PURGE_SLOT]; slot = &srv_sys.sys_threads[SRV_PURGE_SLOT];
break; break;
case SRV_WORKER: case SRV_WORKER:
/* Find an empty slot, skip the master and purge slots. */ /* 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->in_use;
++slot) { ++slot) {
ut_a(slot < &srv_sys->sys_threads[ ut_a(slot < &srv_sys.sys_threads[
srv_sys->n_sys_threads]); srv_sys.n_sys_threads]);
} }
break; break;
@ -987,7 +987,7 @@ srv_reserve_slot(
ut_ad(srv_slot_get_type(slot) == type); ut_ad(srv_slot_get_type(slot) == type);
++srv_sys->n_threads_active[type]; ++srv_sys.n_threads_active[type];
srv_sys_mutex_exit(); srv_sys_mutex_exit();
@ -1017,27 +1017,27 @@ srv_suspend_thread_low(
case SRV_MASTER: case SRV_MASTER:
/* We have only one master thread and it /* We have only one master thread and it
should be the first entry always. */ 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; break;
case SRV_PURGE: case SRV_PURGE:
/* We have only one purge coordinator thread /* We have only one purge coordinator thread
and it should be the second entry always. */ 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; break;
case SRV_WORKER: case SRV_WORKER:
ut_a(srv_n_purge_threads > 1); ut_a(srv_n_purge_threads > 1);
ut_a(srv_sys->n_threads_active[type] > 0); ut_a(srv_sys.n_threads_active[type] > 0);
break; break;
} }
ut_a(!slot->suspended); ut_a(!slot->suspended);
slot->suspended = TRUE; slot->suspended = TRUE;
ut_a(srv_sys->n_threads_active[type] > 0); ut_a(srv_sys.n_threads_active[type] > 0);
srv_sys->n_threads_active[type]--; srv_sys.n_threads_active[type]--;
return(os_event_reset(slot->event)); return(os_event_reset(slot->event));
} }
@ -1092,7 +1092,7 @@ srv_resume_thread(srv_slot_t* slot, ib_int64_t sig_count = 0, bool wait = true,
ut_ad(slot->suspended); ut_ad(slot->suspended);
slot->suspended = FALSE; slot->suspended = FALSE;
++srv_sys->n_threads_active[slot->type]; ++srv_sys.n_threads_active[slot->type];
srv_sys_mutex_exit(); srv_sys_mutex_exit();
return(timeout); return(timeout);
} }
@ -1114,8 +1114,8 @@ srv_release_threads(enum srv_thread_type type, ulint n)
srv_sys_mutex_enter(); srv_sys_mutex_enter();
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) { for (ulint i = 0; i < srv_sys.n_sys_threads; i++) {
srv_slot_t* slot = &srv_sys->sys_threads[i]; srv_slot_t* slot = &srv_sys.sys_threads[i];
if (!slot->in_use || srv_slot_get_type(slot) != type) { if (!slot->in_use || srv_slot_get_type(slot) != type) {
continue; continue;
@ -1135,7 +1135,7 @@ srv_release_threads(enum srv_thread_type type, ulint n)
should be the first entry always. */ should be the first entry always. */
ut_a(n == 1); ut_a(n == 1);
ut_a(i == SRV_MASTER_SLOT); 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; break;
case SRV_PURGE: case SRV_PURGE:
@ -1144,12 +1144,12 @@ srv_release_threads(enum srv_thread_type type, ulint n)
ut_a(n == 1); ut_a(n == 1);
ut_a(i == SRV_PURGE_SLOT); ut_a(i == SRV_PURGE_SLOT);
ut_a(srv_n_purge_threads > 0); 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; break;
case SRV_WORKER: case SRV_WORKER:
ut_a(srv_n_purge_threads > 1); 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); < srv_n_purge_threads - 1);
break; break;
} }
@ -1187,9 +1187,6 @@ void
srv_init(void) srv_init(void)
/*==========*/ /*==========*/
{ {
ulint n_sys_threads = 0;
ulint srv_sys_sz = sizeof(*srv_sys);
#ifndef HAVE_ATOMIC_BUILTINS #ifndef HAVE_ATOMIC_BUILTINS
mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH); mutex_create(server_mutex_key, &server_mutex, SYNC_ANY_LATCH);
#endif /* !HAVE_ATOMIC_BUILTINS */ #endif /* !HAVE_ATOMIC_BUILTINS */
@ -1197,29 +1194,19 @@ srv_init(void)
mutex_create(srv_innodb_monitor_mutex_key, mutex_create(srv_innodb_monitor_mutex_key,
&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK); &srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK);
if (!srv_read_only_mode) { srv_sys.n_sys_threads = srv_read_only_mode
? 0
/* Number of purge threads + master thread */ : srv_n_purge_threads + 1/* purge coordinator */;
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*>(mem_zalloc(srv_sys_sz));
srv_sys->n_sys_threads = n_sys_threads;
if (!srv_read_only_mode) { if (!srv_read_only_mode) {
mutex_create(srv_sys_mutex_key, &srv_sys->mutex, SYNC_THREADS); mutex_create(srv_sys_mutex_key, &srv_sys.mutex, SYNC_THREADS);
mutex_create(srv_sys_tasks_mutex_key, mutex_create(srv_sys_tasks_mutex_key,
&srv_sys->tasks_mutex, SYNC_ANY_LATCH); &srv_sys.tasks_mutex, SYNC_ANY_LATCH);
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(); slot->event = os_event_create();
@ -1239,8 +1226,6 @@ srv_init(void)
if (srv_track_changed_pages) { if (srv_track_changed_pages) {
os_event_set(srv_redo_log_tracked_event); os_event_set(srv_redo_log_tracked_event);
} }
UT_LIST_INIT(srv_sys->tasks);
} }
/* page_zip_stat_per_index_mutex is acquired from: /* page_zip_stat_per_index_mutex is acquired from:
@ -1288,8 +1273,8 @@ srv_free(void)
if (!srv_read_only_mode) { if (!srv_read_only_mode) {
for (ulint i = 0; i < srv_sys->n_sys_threads; i++) for (ulint i = 0; i < srv_sys.n_sys_threads; i++)
os_event_free(srv_sys->sys_threads[i].event); os_event_free(srv_sys.sys_threads[i].event);
os_event_free(srv_error_event); os_event_free(srv_error_event);
srv_error_event = NULL; srv_error_event = NULL;
@ -1301,8 +1286,8 @@ srv_free(void)
srv_checkpoint_completed_event = NULL; srv_checkpoint_completed_event = NULL;
os_event_free(srv_redo_log_tracked_event); os_event_free(srv_redo_log_tracked_event);
srv_redo_log_tracked_event = NULL; srv_redo_log_tracked_event = NULL;
mutex_free(&srv_sys->mutex); mutex_free(&srv_sys.mutex);
mutex_free(&srv_sys->tasks_mutex); mutex_free(&srv_sys.tasks_mutex);
} }
#ifdef WITH_INNODB_DISALLOW_WRITES #ifdef WITH_INNODB_DISALLOW_WRITES
@ -1316,10 +1301,10 @@ srv_free(void)
mutex_free(&srv_innodb_monitor_mutex); mutex_free(&srv_innodb_monitor_mutex);
mutex_free(&page_zip_stat_per_index_mutex); mutex_free(&page_zip_stat_per_index_mutex);
mem_free(srv_sys);
srv_sys = NULL;
trx_i_s_cache_free(trx_i_s_cache); trx_i_s_cache_free(trx_i_s_cache);
/* This is needed for Mariabackup. */
memset(&srv_sys, 0, sizeof srv_sys);
} }
/*********************************************************************//** /*********************************************************************//**
@ -2457,9 +2442,9 @@ srv_inc_activity_count(
is caused by the background is caused by the background
change buffer merge */ change buffer merge */
{ {
srv_sys->activity_count.inc(); srv_sys.activity_count.inc();
if (ibuf_merge_activity) if (ibuf_merge_activity)
srv_sys->ibuf_merge_activity_count.inc(); srv_sys.ibuf_merge_activity_count.inc();
} }
/**********************************************************************//** /**********************************************************************//**
@ -2481,7 +2466,7 @@ srv_get_active_thread_type(void)
srv_sys_mutex_enter(); srv_sys_mutex_enter();
for (ulint i = SRV_WORKER; i <= SRV_MASTER; ++i) { 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); ret = static_cast<srv_thread_type>(i);
break; break;
} }
@ -2700,12 +2685,12 @@ srv_active_wake_master_thread(void)
srv_inc_activity_count(); srv_inc_activity_count();
if (srv_sys->n_threads_active[SRV_MASTER] == 0) { if (srv_sys.n_threads_active[SRV_MASTER] == 0) {
srv_slot_t* slot; srv_slot_t* slot;
srv_sys_mutex_enter(); 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. */ /* Only if the master thread has been started. */
@ -2732,7 +2717,7 @@ srv_wake_purge_thread_if_not_active(void)
ut_ad(!srv_sys_mutex_own()); ut_ad(!srv_sys_mutex_own());
if (purge_sys->state == PURGE_STATE_RUN if (purge_sys->state == PURGE_STATE_RUN
&& srv_sys->n_threads_active[SRV_PURGE] == 0) { && srv_sys.n_threads_active[SRV_PURGE] == 0) {
srv_release_threads(SRV_PURGE, 1); srv_release_threads(SRV_PURGE, 1);
} }
@ -2761,7 +2746,7 @@ ulint
srv_get_activity_count(void) srv_get_activity_count(void)
/*========================*/ /*========================*/
{ {
return(srv_sys->activity_count); return(srv_sys.activity_count);
} }
/** Get current server ibuf merge activity count. /** Get current server ibuf merge activity count.
@ -2770,7 +2755,7 @@ static
ulint ulint
srv_get_ibuf_merge_activity_count(void) srv_get_ibuf_merge_activity_count(void)
{ {
return(srv_sys->ibuf_merge_activity_count); return(srv_sys.ibuf_merge_activity_count);
} }
/*******************************************************************//** /*******************************************************************//**
@ -2789,14 +2774,14 @@ srv_check_activity(
ULINT_UNDEFINED */ ULINT_UNDEFINED */
ulint old_ibuf_merge_activity_count) ulint old_ibuf_merge_activity_count)
{ {
ulint new_activity_count = srv_sys->activity_count; ulint new_activity_count = srv_sys.activity_count;
if (old_ibuf_merge_activity_count == ULINT_UNDEFINED) if (old_ibuf_merge_activity_count == ULINT_UNDEFINED)
return(new_activity_count != old_activity_count); return(new_activity_count != old_activity_count);
/* If we care about ibuf merge activity, then the server is considered /* If we care about ibuf merge activity, then the server is considered
idle if all activity, if any, was due to ibuf merge. */ idle if all activity, if any, was due to ibuf merge. */
ulint new_ibuf_merge_activity_count ulint new_ibuf_merge_activity_count
= srv_sys->ibuf_merge_activity_count; = srv_sys.ibuf_merge_activity_count;
ut_ad(new_ibuf_merge_activity_count <= new_activity_count); ut_ad(new_ibuf_merge_activity_count <= new_activity_count);
ut_ad(new_ibuf_merge_activity_count >= old_ibuf_merge_activity_count); ut_ad(new_ibuf_merge_activity_count >= old_ibuf_merge_activity_count);
@ -3193,7 +3178,7 @@ DECLARE_THREAD(srv_master_thread)(
srv_main_thread_id = os_thread_pf(os_thread_get_curr_id()); srv_main_thread_id = os_thread_pf(os_thread_get_curr_id());
slot = srv_reserve_slot(SRV_MASTER); 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(); last_print_time = ut_time();
loop: loop:
@ -3289,18 +3274,18 @@ srv_task_execute(void)
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
ut_a(srv_force_recovery < SRV_FORCE_NO_BACKGROUND); 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_a(que_node_get_type(thr->child) == QUE_NODE_PURGE);
UT_LIST_REMOVE(queue, srv_sys->tasks, thr); UT_LIST_REMOVE(queue, srv_sys.tasks, thr);
} }
mutex_exit(&srv_sys->tasks_mutex); mutex_exit(&srv_sys.tasks_mutex);
if (thr != NULL) { if (thr != NULL) {
@ -3350,7 +3335,7 @@ DECLARE_THREAD(srv_worker_thread)(
srv_sys_mutex_enter(); srv_sys_mutex_enter();
ut_a(srv_sys->n_threads_active[SRV_WORKER] < srv_n_purge_threads); ut_a(srv_sys.n_threads_active[SRV_WORKER] < srv_n_purge_threads);
srv_sys_mutex_exit(); srv_sys_mutex_exit();
@ -3690,11 +3675,11 @@ srv_que_task_enqueue_low(
que_thr_t* thr) /*!< in: query thread */ que_thr_t* thr) /*!< in: query thread */
{ {
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
mutex_enter(&srv_sys->tasks_mutex); mutex_enter(&srv_sys.tasks_mutex);
UT_LIST_ADD_LAST(queue, srv_sys->tasks, thr); UT_LIST_ADD_LAST(queue, srv_sys.tasks, thr);
mutex_exit(&srv_sys->tasks_mutex); mutex_exit(&srv_sys.tasks_mutex);
srv_release_threads(SRV_WORKER, 1); srv_release_threads(SRV_WORKER, 1);
} }
@ -3711,11 +3696,11 @@ srv_get_task_queue_length(void)
ut_ad(!srv_read_only_mode); 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); return(n_tasks);
} }

View File

@ -1186,10 +1186,6 @@ UNIV_INTERN
dberr_t dberr_t
trx_undo_report_row_operation( 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 */ que_thr_t* thr, /*!< in: query thread */
dict_index_t* index, /*!< in: clustered index */ dict_index_t* index, /*!< in: clustered index */
const dtuple_t* clust_entry, /*!< in: in the case of an insert, const dtuple_t* clust_entry, /*!< in: in the case of an insert,
@ -1223,16 +1219,8 @@ trx_undo_report_row_operation(
ut_a(dict_index_is_clust(index)); ut_a(dict_index_is_clust(index));
ut_ad(!rec || rec_offs_validate(rec, index, offsets)); ut_ad(!rec || rec_offs_validate(rec, index, offsets));
if (flags & BTR_NO_UNDO_LOG_FLAG) {
*roll_ptr = 0;
return(DB_SUCCESS);
}
ut_ad(thr); ut_ad(thr);
ut_ad((op_type != TRX_UNDO_INSERT_OP) ut_ad(!clust_entry || (!update && !rec));
|| (clust_entry && !update && !rec));
trx = thr_get_trx(thr); trx = thr_get_trx(thr);
@ -1253,8 +1241,7 @@ trx_undo_report_row_operation(
/* If the undo log is not assigned yet, assign one */ /* If the undo log is not assigned yet, assign one */
switch (op_type) { if (clust_entry) {
case TRX_UNDO_INSERT_OP:
undo = trx->insert_undo; undo = trx->insert_undo;
if (undo == NULL) { if (undo == NULL) {
@ -1270,10 +1257,7 @@ trx_undo_report_row_operation(
ut_ad(err == DB_SUCCESS); ut_ad(err == DB_SUCCESS);
} }
break; } else {
default:
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
undo = trx->update_undo; undo = trx->update_undo;
if (undo == NULL) { if (undo == NULL) {
@ -1297,23 +1281,15 @@ trx_undo_report_row_operation(
buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE); buf_block_dbg_add_level(undo_block, SYNC_TRX_UNDO_PAGE);
do { do {
page_t* undo_page;
ulint offset;
undo_page = buf_block_get_frame(undo_block);
ut_ad(page_no == buf_block_get_page_no(undo_block)); ut_ad(page_no == buf_block_get_page_no(undo_block));
switch (op_type) { page_t* undo_page = buf_block_get_frame(undo_block);
case TRX_UNDO_INSERT_OP: ulint offset = clust_entry
offset = trx_undo_page_report_insert( ? trx_undo_page_report_insert(
undo_page, trx, index, clust_entry, &mtr); undo_page, trx, index, clust_entry, &mtr)
break; : trx_undo_page_report_modify(
default:
ut_ad(op_type == TRX_UNDO_MODIFY_OP);
offset = trx_undo_page_report_modify(
undo_page, trx, index, rec, offsets, update, undo_page, trx, index, rec, offsets, update,
cmpl_info, &mtr); cmpl_info, &mtr);
}
if (UNIV_UNLIKELY(offset == 0)) { if (UNIV_UNLIKELY(offset == 0)) {
/* The record did not fit on the page. We erase the /* The record did not fit on the page. We erase the
@ -1364,7 +1340,7 @@ trx_undo_report_row_operation(
mutex_exit(&trx->undo_mutex); mutex_exit(&trx->undo_mutex);
*roll_ptr = trx_undo_build_roll_ptr( *roll_ptr = trx_undo_build_roll_ptr(
op_type == TRX_UNDO_INSERT_OP, clust_entry != NULL,
rseg->id, page_no, offset); rseg->id, page_no, offset);
return(DB_SUCCESS); return(DB_SUCCESS);
} }

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2011, 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 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 the terms of the GNU General Public License as published by the Free Software
@ -48,8 +49,6 @@ sess_open(void)
sess->trx = trx_allocate_for_background(); sess->trx = trx_allocate_for_background();
sess->trx->sess = sess; sess->trx->sess = sess;
UT_LIST_INIT(sess->graphs);
return(sess); return(sess);
} }