Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
6373ec3e
Commit
6373ec3e
authored
5 years ago
by
Marko Mäkelä
Browse files
Options
Browse Files
Download
Plain Diff
Merge 10.2 into 10.3
parents
e709eb9b
d595a91b
Branches unavailable
Tags unavailable
No related merge requests found
Changes
36
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
36 changed files
with
2729 additions
and
358 deletions
+2729
-358
mysql-test/suite/galera/disabled.def
mysql-test/suite/galera/disabled.def
+0
-1
mysql-test/suite/innodb/r/innodb_bug30113362.result
mysql-test/suite/innodb/r/innodb_bug30113362.result
+119
-0
mysql-test/suite/innodb/r/innodb_wl6326.result
mysql-test/suite/innodb/r/innodb_wl6326.result
+372
-0
mysql-test/suite/innodb/r/innodb_wl6326_big.result
mysql-test/suite/innodb/r/innodb_wl6326_big.result
+449
-0
mysql-test/suite/innodb/t/innodb_bug30113362.opt
mysql-test/suite/innodb/t/innodb_bug30113362.opt
+1
-0
mysql-test/suite/innodb/t/innodb_bug30113362.test
mysql-test/suite/innodb/t/innodb_bug30113362.test
+236
-0
mysql-test/suite/innodb/t/innodb_wl6326.opt
mysql-test/suite/innodb/t/innodb_wl6326.opt
+1
-0
mysql-test/suite/innodb/t/innodb_wl6326.test
mysql-test/suite/innodb/t/innodb_wl6326.test
+500
-0
mysql-test/suite/innodb/t/innodb_wl6326_big.test
mysql-test/suite/innodb/t/innodb_wl6326_big.test
+716
-0
sql/sql_select.cc
sql/sql_select.cc
+1
-1
sql/wsrep_thd.cc
sql/wsrep_thd.cc
+36
-13
sql/wsrep_thd.h
sql/wsrep_thd.h
+1
-1
sql/wsrep_var.cc
sql/wsrep_var.cc
+8
-2
storage/innobase/btr/btr0cur.cc
storage/innobase/btr/btr0cur.cc
+66
-127
storage/innobase/dict/dict0stats.cc
storage/innobase/dict/dict0stats.cc
+6
-11
storage/innobase/gis/gis0rtree.cc
storage/innobase/gis/gis0rtree.cc
+7
-10
storage/innobase/include/btr0cur.h
storage/innobase/include/btr0cur.h
+2
-14
storage/innobase/include/page0page.h
storage/innobase/include/page0page.h
+18
-2
storage/innobase/include/page0page.ic
storage/innobase/include/page0page.ic
+22
-2
storage/innobase/include/rem0cmp.h
storage/innobase/include/rem0cmp.h
+15
-33
storage/innobase/include/rem0cmp.ic
storage/innobase/include/rem0cmp.ic
+1
-34
storage/innobase/include/rem0rec.ic
storage/innobase/include/rem0rec.ic
+3
-2
storage/innobase/include/row0row.h
storage/innobase/include/row0row.h
+1
-5
storage/innobase/include/univ.i
storage/innobase/include/univ.i
+1
-1
storage/innobase/os/os0file.cc
storage/innobase/os/os0file.cc
+8
-2
storage/innobase/rem/rem0cmp.cc
storage/innobase/rem/rem0cmp.cc
+48
-41
storage/innobase/row/row0ftsort.cc
storage/innobase/row/row0ftsort.cc
+2
-3
storage/innobase/row/row0import.cc
storage/innobase/row/row0import.cc
+62
-5
storage/innobase/row/row0log.cc
storage/innobase/row/row0log.cc
+3
-4
storage/innobase/row/row0merge.cc
storage/innobase/row/row0merge.cc
+3
-9
storage/innobase/row/row0mysql.cc
storage/innobase/row/row0mysql.cc
+1
-2
storage/innobase/row/row0row.cc
storage/innobase/row/row0row.cc
+3
-12
storage/innobase/row/row0umod.cc
storage/innobase/row/row0umod.cc
+3
-1
storage/innobase/row/row0upd.cc
storage/innobase/row/row0upd.cc
+6
-9
storage/innobase/row/row0vers.cc
storage/innobase/row/row0vers.cc
+2
-4
storage/innobase/trx/trx0rec.cc
storage/innobase/trx/trx0rec.cc
+6
-7
No files found.
mysql-test/suite/galera/disabled.def
View file @
6373ec3e
...
...
@@ -14,7 +14,6 @@ MW-286 : MDEV-18464 Killing thread can cause mutex deadlock if done concurrently
MW-328A : MDEV-21483 galera.MW-328A galera.MW-328B
MW-328B : MDEV-21483 galera.MW-328A galera.MW-328B
MW-329 : MDEV-19962 Galera test failure on MW-329
MW-336 : MDEV-17062 Test failure on galera.MW-336
galera.galera_defaults : MDEV-21494 Galera test sporadic failure on galera.galera_defaults
galera_account_management : MariaDB 10.0 does not support ALTER USER
galera_as_master_gtid : Requires MySQL GTID
...
...
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/r/innodb_bug30113362.result
0 → 100644
View file @
6373ec3e
SET GLOBAL innodb_adaptive_hash_index = false;
SET GLOBAL innodb_stats_persistent = false;
connect purge_control,localhost,root,,;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
connect con2,localhost,root,,;
CREATE TABLE t1 (
a00 CHAR(255) NOT NULL DEFAULT 'a',
a01 CHAR(255) NOT NULL DEFAULT 'a',
a02 CHAR(255) NOT NULL DEFAULT 'a',
b INT NOT NULL DEFAULT 0,
PRIMARY KEY(a00, a01, a02)
) charset latin1 ENGINE = InnoDB COMMENT='MERGE_THRESHOLD=45';
SET GLOBAL innodb_limit_optimistic_insert_debug = 3;
CREATE PROCEDURE data_load_t1()
BEGIN
DECLARE c1 INT DEFAULT 97;
DECLARE c2 INT DEFAULT 97;
DECLARE c3 INT DEFAULT 97;
WHILE c1 < 102 DO
WHILE c2 < 123 DO
WHILE c3 < 123 DO
INSERT INTO t1 (a00) VALUES (CHAR(c1,c2,c3));
SET c3 = c3 + 1;
END WHILE;
SET c3 = 97;
SET c2 = c2 + 1;
END WHILE;
SET c2 = 97;
SET c1 = c1 + 1;
END WHILE;
END |
call data_load_t1();
DROP PROCEDURE data_load_t1;
ANALYZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
SELECT CLUST_INDEX_SIZE FROM information_schema.INNODB_SYS_TABLESTATS WHERE NAME = 'test/t1';
CLUST_INDEX_SIZE
1856
connection con2;
DELETE FROM t1 WHERE a00 = 'cnm';
COMMIT;
BEGIN;
INSERT INTO t1 SET a00 = 'cnm';
connection purge_control;
COMMIT;
connection con2;
SET GLOBAL innodb_limit_optimistic_insert_debug = 0;
ROLLBACK;
# Test start
connection purge_control;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
connection con2;
DELETE FROM t1 WHERE a00 = 'bii';
COMMIT;
BEGIN;
INSERT INTO t1 SET a00 = 'bii';
SET DEBUG_SYNC = 'rollback_undo_pk SIGNAL roll1_wait WAIT_FOR roll2';
SET DEBUG_SYNC = 'rollback_purge_clust SIGNAL rollback_waiting WAIT_FOR resume';
ROLLBACK;
connection purge_control;
SET DEBUG_SYNC = 'now WAIT_FOR roll1_wait';
COMMIT;
SET DEBUG_SYNC = 'now SIGNAL roll2';
connect con1,localhost,root,,;
SET DEBUG_SYNC = 'now WAIT_FOR rollback_waiting';
SET DEBUG_SYNC = 'rw_s_lock_waiting SIGNAL lockwait1';
SELECT a00 FROM t1 WHERE a00 = 'bii';
connection default;
SET DEBUG_SYNC = 'now WAIT_FOR lockwait1';
SET DEBUG_SYNC = 'now SIGNAL resume';
connection con1;
a00
connection con2;
connection default;
ANALYZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
SELECT CLUST_INDEX_SIZE FROM information_schema.INNODB_SYS_TABLESTATS WHERE NAME = 'test/t1';
CLUST_INDEX_SIZE
1856
DELETE FROM t1 WHERE a00 = 'dpn';
COMMIT;
INSERT INTO t1 SET a00 = 'dpn';
ROLLBACK;
ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=35';
connection purge_control;
START TRANSACTION WITH CONSISTENT SNAPSHOT;
connection con2;
DELETE FROM t1 WHERE a00 = 'cnd';
COMMIT;
BEGIN;
INSERT INTO t1 SET a00 = 'cnd';
SET DEBUG_SYNC = 'rollback_undo_pk SIGNAL roll1_wait WAIT_FOR roll2';
SET DEBUG_SYNC = 'rollback_purge_clust SIGNAL rollback_waiting WAIT_FOR resume EXECUTE 2';
ROLLBACK;
connection purge_control;
SET DEBUG_SYNC = 'now WAIT_FOR roll1_wait';
START TRANSACTION WITH CONSISTENT SNAPSHOT;
SET DEBUG_SYNC = 'now SIGNAL roll2';
connection con1;
SET DEBUG_SYNC = 'now WAIT_FOR rollback_waiting TIMEOUT 1';
SET DEBUG_SYNC = 'now SIGNAL resume';
SET DEBUG_SYNC = 'now WAIT_FOR rollback_waiting TIMEOUT 1';
disconnect purge_control;
connection default;
SET DEBUG_SYNC = 'now SIGNAL resume';
disconnect con1;
connection con2;
disconnect con2;
connection default;
ANALYZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
SELECT CLUST_INDEX_SIZE FROM information_schema.INNODB_SYS_TABLESTATS WHERE NAME = 'test/t1';
CLUST_INDEX_SIZE
1856
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1;
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/r/innodb_wl6326.result
0 → 100644
View file @
6373ec3e
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/r/innodb_wl6326_big.result
0 → 100644
View file @
6373ec3e
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/t/innodb_bug30113362.opt
0 → 100644
View file @
6373ec3e
--innodb-sys-tablestats
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/t/innodb_bug30113362.test
0 → 100644
View file @
6373ec3e
#
# Test for Bug#30113362 : BTR_CUR_WILL_MODIFY_TREE() IS INSUFFICIENT FOR HIGHER TREE LEVEL
#
--
source
include
/
have_innodb
.
inc
--
source
include
/
have_debug
.
inc
--
source
include
/
have_debug_sync
.
inc
--
source
include
/
have_innodb_16k
.
inc
--
disable_query_log
SET
@
old_innodb_limit_optimistic_insert_debug
=
@@
innodb_limit_optimistic_insert_debug
;
SET
@
old_innodb_adaptive_hash_index
=
@@
innodb_adaptive_hash_index
;
SET
@
old_innodb_stats_persistent
=
@@
innodb_stats_persistent
;
--
enable_query_log
# Save the initial number of concurrent sessions
--
source
include
/
count_sessions
.
inc
SET
GLOBAL
innodb_adaptive_hash_index
=
false
;
SET
GLOBAL
innodb_stats_persistent
=
false
;
connect
(
purge_control
,
localhost
,
root
,,);
START
TRANSACTION
WITH
CONSISTENT
SNAPSHOT
;
--
connect
(
con2
,
localhost
,
root
,,)
CREATE
TABLE
t1
(
a00
CHAR
(
255
)
NOT
NULL
DEFAULT
'a'
,
a01
CHAR
(
255
)
NOT
NULL
DEFAULT
'a'
,
a02
CHAR
(
255
)
NOT
NULL
DEFAULT
'a'
,
b
INT
NOT
NULL
DEFAULT
0
,
PRIMARY
KEY
(
a00
,
a01
,
a02
)
)
charset
latin1
ENGINE
=
InnoDB
COMMENT
=
'MERGE_THRESHOLD=45'
;
#
# Prepare primary key index tree to be used for this test.
#
SET
GLOBAL
innodb_limit_optimistic_insert_debug
=
3
;
delimiter
|
;
CREATE
PROCEDURE
data_load_t1
()
BEGIN
DECLARE
c1
INT
DEFAULT
97
;
DECLARE
c2
INT
DEFAULT
97
;
DECLARE
c3
INT
DEFAULT
97
;
WHILE
c1
<
102
DO
WHILE
c2
<
123
DO
WHILE
c3
<
123
DO
INSERT
INTO
t1
(
a00
)
VALUES
(
CHAR
(
c1
,
c2
,
c3
));
SET
c3
=
c3
+
1
;
END
WHILE
;
SET
c3
=
97
;
SET
c2
=
c2
+
1
;
END
WHILE
;
SET
c2
=
97
;
SET
c1
=
c1
+
1
;
END
WHILE
;
END
|
delimiter
;
|
call
data_load_t1
();
DROP
PROCEDURE
data_load_t1
;
# all node pages are sparse (max 3 node_ptrs)
ANALYZE
TABLE
t1
;
SELECT
CLUST_INDEX_SIZE
FROM
information_schema
.
INNODB_SYS_TABLESTATS
WHERE
NAME
=
'test/t1'
;
connection
con2
;
DELETE
FROM
t1
WHERE
a00
=
'cnm'
;
COMMIT
;
BEGIN
;
INSERT
INTO
t1
SET
a00
=
'cnm'
;
# causes "domino falling" merges to upper level
connection
purge_control
;
COMMIT
;
connection
con2
;
SET
GLOBAL
innodb_limit_optimistic_insert_debug
=
0
;
ROLLBACK
;
# at this moment, in the tree,
# ...
# level 4: ...(ast,avw,ayz)(bcc,bff,bii,bll,boo,brr,buu,bxx,cba,ced,cqp,cts)(cwv,czy,ddb)...
# ...
--
echo
# Test start
# (1) Similar case to the first reported corefile at bug#30113362
# - Deleting 'bii' causes "domino falling" merges and the node_ptr becomes left_most of level 4.
# So, the operation needs upper level pages' X-latch, though doesn't cause merge more.
connection
purge_control
;
START
TRANSACTION
WITH
CONSISTENT
SNAPSHOT
;
connection
con2
;
DELETE
FROM
t1
WHERE
a00
=
'bii'
;
COMMIT
;
BEGIN
;
INSERT
INTO
t1
SET
a00
=
'bii'
;
SET
DEBUG_SYNC
=
'rollback_undo_pk SIGNAL roll1_wait WAIT_FOR roll2'
;
SET
DEBUG_SYNC
=
'rollback_purge_clust SIGNAL rollback_waiting WAIT_FOR resume'
;
send
ROLLBACK
;
connection
purge_control
;
SET
DEBUG_SYNC
=
'now WAIT_FOR roll1_wait'
;
COMMIT
;
SET
DEBUG_SYNC
=
'now SIGNAL roll2'
;
connect
(
con1
,
localhost
,
root
,,);
SET
DEBUG_SYNC
=
'now WAIT_FOR rollback_waiting'
;
SET
DEBUG_SYNC
=
'rw_s_lock_waiting SIGNAL lockwait1'
;
send
SELECT
a00
FROM
t1
WHERE
a00
=
'bii'
;
connection
default
;
SET
DEBUG_SYNC
=
'now WAIT_FOR lockwait1'
;
# bug#30113362 caused deadlock
SET
DEBUG_SYNC
=
'now SIGNAL resume'
;
connection
con1
;
reap
;
connection
con2
;
reap
;
connection
default
;
ANALYZE
TABLE
t1
;
SELECT
CLUST_INDEX_SIZE
FROM
information_schema
.
INNODB_SYS_TABLESTATS
WHERE
NAME
=
'test/t1'
;
# (2) Confirm blocking domain caused by DELETE modify_tree for tall index tree
# at this moment, in the tree,
# ...
# level 4: ...(ajk,amn,apq)(ast,avw,ayz,bll,boo,brr,buu,bxx,cba,ced,cqp,cts)(cwv,czy,ddb)(dge,djh,dmk)(dpn,dsq,dvt)(dyw,ebz,efc)...
# ...
# makes >17 records in level4 [(2^(4-1))*2 + 1]. (causes never left_most records)
DELETE
FROM
t1
WHERE
a00
=
'dpn'
;
COMMIT
;
INSERT
INTO
t1
SET
a00
=
'dpn'
;
ROLLBACK
;
# at this moment, in the tree,
# (* before "]" and after "[" records are treated as left_most possible records)
# ...
# level 4: ...(ajk,amn,apq)(ast,avw,ayz,bll,boo,brr,buu,bxx],cba,ced,[cqp,cts,cwv,czy,ddb,dge,dsq,dvt)(dyw,ebz,efc)...
# level 3: ...(cba,ccb,cdc)(ced,cfe,cgf,chg],cih,cji,[ckj,clk,con,cpo)(cqp,crq,csr)...
# level 2: ...(ckj,cks,clb)(clk,clt],cmc,cml,cmu,cnd,[cnv,coe)(con,cow,cpf)...
# level 1: ...(cmu,cmx,cna)(cnd],cng,cnj,cnp,[cns)(cnv,cny,cob)...
# level 0: ...(cnd,cne,cnf)(cng,cnh,cni)(cnj,cnk,cnl,cnn,cno)(cnp,cnq,cnr)...
# deletes just 'ced' node_ptr only from level 4. doesn't cause merge and never left_most.
# adjusts MERGE_THRESHOLD to do so.
ALTER
TABLE
t1
COMMENT
=
'MERGE_THRESHOLD=35'
;
connection
purge_control
;
START
TRANSACTION
WITH
CONSISTENT
SNAPSHOT
;
connection
con2
;
DELETE
FROM
t1
WHERE
a00
=
'cnd'
;
COMMIT
;
BEGIN
;
INSERT
INTO
t1
SET
a00
=
'cnd'
;
SET
DEBUG_SYNC
=
'rollback_undo_pk SIGNAL roll1_wait WAIT_FOR roll2'
;
SET
DEBUG_SYNC
=
'rollback_purge_clust SIGNAL rollback_waiting WAIT_FOR resume EXECUTE 2'
;
send
ROLLBACK
;
connection
purge_control
;
SET
DEBUG_SYNC
=
'now WAIT_FOR roll1_wait'
;
START
TRANSACTION
WITH
CONSISTENT
SNAPSHOT
;
SET
DEBUG_SYNC
=
'now SIGNAL roll2'
;
connection
con1
;
# FIXME: For some reason, we will not always receive these signals!
--
disable_warnings
# An optimistic row_undo_mod_remove_clust_low() will fail.
SET
DEBUG_SYNC
=
'now WAIT_FOR rollback_waiting TIMEOUT 1'
;
SET
DEBUG_SYNC
=
'now SIGNAL resume'
;
# Wait for the pessimistic row_undo_mod_remove_clust_low() attempt.
SET
DEBUG_SYNC
=
'now WAIT_FOR rollback_waiting TIMEOUT 1'
;
--
enable_warnings
disconnect
purge_control
;
# The expectation should be...
# level 0: (#cnd#,cne,cnf): causes merge
# level 1: (#cnd#],cng,cnj,cnp,[cns): left_most
# level 2: (clk,clt],cmc,cml,cmu,#cnd#,[cnv,coe): causes merge
# level 3: (ced,cfe,cgf,chg],cih,cji,[ckj,#clk#,con,cpo): left_most possible (not cause merge)
# level 4: (ast,avw,ayz,bll,boo,brr,buu,bxx],cba,#ced#,[cqp,cts,cwv,czy,ddb,dge,dsq,dvt): no merge, not left_most possible
# So, the top X-latch page is at level4. (ast~dvt)
# blocking domain based on whether its ancestor is latched or not.
# (*[]: ancestor is X-latched)
# level 0: ...(asq,asr,ass) [(ast,asu,asv)...(dyt,dyu,dyv)] (dyw,dyx,dyy)...
# Not blocked searches
## In MariaDB, both these will block, because we use different DEBUG_SYNC
## instrumentation (in rollback, not purge) and the root page (number 3)
## is being latched in row_undo_mod_remove_clust_low().
## SELECT a00 FROM t1 WHERE a00 = 'ass';
## SELECT a00 FROM t1 WHERE a00 = 'dyx';
## SET DEBUG_SYNC = 'rw_s_lock_waiting SIGNAL lockwait1';
## send SELECT a00 FROM t1 WHERE a00 = 'ast';
## connection con2;
## SET DEBUG_SYNC = 'rw_s_lock_waiting SIGNAL lockwait2';
## send SELECT a00 FROM t1 WHERE a00 = 'dyw';
connection
default
;
## SET DEBUG_SYNC = 'now WAIT_FOR lockwait1';
## SET DEBUG_SYNC = 'now WAIT_FOR lockwait2';
SET
DEBUG_SYNC
=
'now SIGNAL resume'
;
## connection con1;
## reap;
disconnect
con1
;
connection
con2
;
reap
;
disconnect
con2
;
connection
default
;
ANALYZE
TABLE
t1
;
SELECT
CLUST_INDEX_SIZE
FROM
information_schema
.
INNODB_SYS_TABLESTATS
WHERE
NAME
=
'test/t1'
;
# Cleanup
SET
DEBUG_SYNC
=
'RESET'
;
DROP
TABLE
t1
;
--
disable_query_log
SET
GLOBAL
innodb_limit_optimistic_insert_debug
=
@
old_innodb_limit_optimistic_insert_debug
;
SET
GLOBAL
innodb_adaptive_hash_index
=
@
old_innodb_adaptive_hash_index
;
SET
GLOBAL
innodb_stats_persistent
=
@
old_innodb_stats_persistent
;
--
enable_query_log
--
source
include
/
wait_until_count_sessions
.
inc
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/t/innodb_wl6326.opt
0 → 100644
View file @
6373ec3e
--innodb-sys-tablestats
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/t/innodb_wl6326.test
0 → 100644
View file @
6373ec3e
This diff is collapsed.
Click to expand it.
mysql-test/suite/innodb/t/innodb_wl6326_big.test
0 → 100644
View file @
6373ec3e
This diff is collapsed.
Click to expand it.
sql/sql_select.cc
View file @
6373ec3e
...
...
@@ -14554,7 +14554,7 @@ static int compare_fields_by_table_order(Item *field1,
Item_field
*
f2
=
(
Item_field
*
)
field2_real
;
if
(
f1
->
used_tables
()
&
OUTER_REF_TABLE_BIT
)
{
outer_ref
=
-
1
;
outer_ref
=
1
;
cmp
=
-
1
;
}
if
(
f2
->
used_tables
()
&
OUTER_REF_TABLE_BIT
)
...
...
This diff is collapsed.
Click to expand it.
sql/wsrep_thd.cc
View file @
6373ec3e
...
...
@@ -415,29 +415,46 @@ static void wsrep_replication_process(THD *thd)
DBUG_VOID_RETURN
;
}
static
bool
create_wsrep_THD
(
wsrep_thread_args
*
args
)
static
bool
create_wsrep_THD
(
wsrep_thread_args
*
args
,
bool
thread_count_lock
)
{
mysql_mutex_lock
(
&
LOCK_thread_count
);
if
(
!
thread_count_lock
)
mysql_mutex_lock
(
&
LOCK_thread_count
);
ulong
old_wsrep_running_threads
=
wsrep_running_threads
;
DBUG_ASSERT
(
args
->
thread_type
==
WSREP_APPLIER_THREAD
||
args
->
thread_type
==
WSREP_ROLLBACKER_THREAD
);
bool
res
=
mysql_thread_create
(
args
->
thread_type
==
WSREP_APPLIER_THREAD
?
key_wsrep_applier
:
key_wsrep_rollbacker
,
&
args
->
thread_id
,
&
connection_attrib
,
start_wsrep_THD
,
(
void
*
)
args
);
if
(
res
)
{
WSREP_ERROR
(
"Can't create wsrep thread"
);
}
/*
if starting a thread on server startup, wait until the this thread's THD
is fully initialized (otherwise a THD initialization code might
try to access a partially initialized server data structure - MDEV-8208).
*/
if
(
!
mysqld_server_initialized
)
{
while
(
old_wsrep_running_threads
==
wsrep_running_threads
)
{
mysql_cond_wait
(
&
COND_thread_count
,
&
LOCK_thread_count
);
mysql_mutex_unlock
(
&
LOCK_thread_count
);
}
}
if
(
!
thread_count_lock
)
mysql_mutex_unlock
(
&
LOCK_thread_count
);
return
res
;
}
void
wsrep_create_appliers
(
long
threads
)
bool
wsrep_create_appliers
(
long
threads
,
bool
thread_count_lock
)
{
if
(
!
wsrep_connected
)
{
...
...
@@ -449,26 +466,32 @@ void wsrep_create_appliers(long threads)
"connection at '%s'"
,
wsrep_cluster_address
);
assert
(
0
);
}
return
;
return
false
;
}
long
wsrep_threads
=
0
;
long
wsrep_threads
=
0
;
while
(
wsrep_threads
++
<
threads
)
{
wsrep_thread_args
*
arg
;
if
((
arg
=
(
wsrep_thread_args
*
)
my_malloc
(
sizeof
(
wsrep_thread_args
),
MYF
(
0
)))
==
NULL
)
{
if
((
arg
=
(
wsrep_thread_args
*
)
my_malloc
(
sizeof
(
wsrep_thread_args
),
MYF
(
0
)))
==
NULL
)
{
WSREP_ERROR
(
"Can't allocate memory for wsrep replication thread %ld
\n
"
,
wsrep_threads
);
assert
(
0
);
}
arg
->
thread_type
=
WSREP_APPLIER_THREAD
;
arg
->
processor
=
wsrep_replication_process
;
arg
->
thread_type
=
WSREP_APPLIER_THREAD
;
arg
->
processor
=
wsrep_replication_process
;
if
(
create_wsrep_THD
(
arg
))
{
WSREP_WARN
(
"Can't create thread to manage wsrep replication"
);
if
(
create_wsrep_THD
(
arg
,
thread_count_lock
))
{
WSREP_ERROR
(
"Can't create thread to manage wsrep replication"
);
my_free
(
arg
);
return
;
return
true
;
}
}
return
false
;
}
static
void
wsrep_rollback_process
(
THD
*
thd
)
...
...
@@ -564,7 +587,7 @@ void wsrep_create_rollbacker()
arg
->
processor
=
wsrep_rollback_process
;
/* create rollbacker */
if
(
create_wsrep_THD
(
arg
))
{
if
(
create_wsrep_THD
(
arg
,
false
))
{
WSREP_WARN
(
"Can't create thread to manage wsrep rollback"
);
my_free
(
arg
);
return
;
...
...
This diff is collapsed.
Click to expand it.
sql/wsrep_thd.h
View file @
6373ec3e
...
...
@@ -26,7 +26,7 @@ int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff,
enum
enum_var_type
scope
);
void
wsrep_client_rollback
(
THD
*
thd
);
void
wsrep_replay_transaction
(
THD
*
thd
);
void
wsrep_create_appliers
(
long
threads
);
bool
wsrep_create_appliers
(
long
threads
,
bool
thread_count_lock
=
false
);
void
wsrep_create_rollbacker
();
int
wsrep_abort_thd
(
void
*
bf_thd_ptr
,
void
*
victim_thd_ptr
,
...
...
This diff is collapsed.
Click to expand it.
sql/wsrep_var.cc
View file @
6373ec3e
...
...
@@ -602,16 +602,22 @@ static void wsrep_slave_count_change_update ()
bool
wsrep_slave_threads_update
(
sys_var
*
self
,
THD
*
thd
,
enum_var_type
type
)
{
mysql_mutex_lock
(
&
LOCK_thread_count
);
bool
res
=
false
;
wsrep_slave_count_change_update
();
if
(
wsrep_slave_count_change
>
0
)
{
WSREP_DEBUG
(
"Creating %d applier threads, total %ld"
,
wsrep_slave_count_change
,
wsrep_slave_threads
);
wsrep_create_appliers
(
wsrep_slave_count_chang
e
);
res
=
wsrep_create_appliers
(
wsrep_slave_count_change
,
tru
e
);
WSREP_DEBUG
(
"Running %lu applier threads"
,
wsrep_running_applier_threads
);
wsrep_slave_count_change
=
0
;
}
return
false
;
mysql_mutex_unlock
(
&
LOCK_thread_count
);
return
res
;
}
bool
wsrep_desync_check
(
sys_var
*
self
,
THD
*
thd
,
set_var
*
var
)
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/btr/btr0cur.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 201
8
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 1994, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc.
Copyright (c) 2012, Facebook Inc.
Copyright (c) 2015, 20
19
, MariaDB Corporation.
Copyright (c) 2015, 20
20
, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
...
...
@@ -804,46 +804,66 @@ btr_cur_will_modify_tree(
const
ulint
n_recs
=
page_get_n_recs
(
page
);
if
(
lock_intention
<=
BTR_INTENTION_BOTH
)
{
ulint
margin
;
compile_time_assert
(
BTR_INTENTION_DELETE
<
BTR_INTENTION_BOTH
);
compile_time_assert
(
BTR_INTENTION_BOTH
<
BTR_INTENTION_INSERT
);
/* check delete will cause. (BTR_INTENTION_BOTH
or BTR_INTENTION_DELETE) */
/* first, 2nd, 2nd-last and last records are 4 records */
if
(
n_recs
<
5
)
{
return
(
true
);
if
(
!
page_has_siblings
(
page
))
{
return
true
;
}
/* is first, 2nd or last record */
if
(
page_rec_is_first
(
rec
,
page
)
||
(
page_has_next
(
page
)
&&
(
page_rec_is_last
(
rec
,
page
)
||
page_rec_is_second_last
(
rec
,
page
)))
||
(
page_has_prev
(
page
)
&&
page_rec_is_second
(
rec
,
page
)))
{
return
(
true
);
}
ulint
margin
=
rec_size
;
if
(
lock_intention
==
BTR_INTENTION_BOTH
)
{
ulint
level
=
btr_page_get_level
(
page
);
/* This value is the worst expectation for the node_ptr
records to be deleted from this page. It is used to
expect whether the cursor position can be the left_most
record in this page or not. */
ulint
max_nodes_deleted
=
0
;
/* By modifying tree operations from the under of this
level, logically (2 ^ (level - 1)) opportunities to
deleting records in maximum even unreally rare case. */
if
(
level
>
7
)
{
/* TODO: adjust this practical limit. */
max_nodes_deleted
=
64
;
}
else
if
(
level
>
0
)
{
max_nodes_deleted
=
(
ulint
)
1
<<
(
level
-
1
);
}
/* check delete will cause. (BTR_INTENTION_BOTH
or BTR_INTENTION_DELETE) */
if
(
n_recs
<=
max_nodes_deleted
*
2
||
page_rec_is_first
(
rec
,
page
))
{
/* The cursor record can be the left most record
in this page. */
return
true
;
}
if
(
page_has_prev
(
page
)
&&
page_rec_distance_is_at_most
(
page_get_infimum_rec
(
page
),
rec
,
max_nodes_deleted
))
{
return
true
;
}
if
(
page_has_next
(
page
)
&&
page_rec_distance_is_at_most
(
rec
,
page_get_supremum_rec
(
page
),
max_nodes_deleted
))
{
return
true
;
}
/* Delete at leftmost record in a page causes delete
& insert at its parent page. After that, the delete
might cause btr_compress() and delete record at its
parent page. Thus we should consider max 2 deletes. */
margin
=
rec_size
*
2
;
}
else
{
ut_ad
(
lock_intention
==
BTR_INTENTION_DELETE
);
margin
=
rec_size
;
parent page. Thus we should consider max deletes. */
margin
*=
max_nodes_deleted
;
}
/* NOTE: call mach_read_from_4() directly to avoid assertion
failure. It is safe because we already have SX latch of the
index tree */
/* Safe because we already have SX latch of the index tree */
if
(
page_get_data_size
(
page
)
<
margin
+
BTR_CUR_PAGE_COMPRESS_LIMIT
(
index
)
||
(
mach_read_from_4
(
page
+
FIL_PAGE_NEXT
)
==
FIL_NULL
&&
mach_read_from_4
(
page
+
FIL_PAGE_PREV
)
==
FIL_NULL
))
{
<
margin
+
BTR_CUR_PAGE_COMPRESS_LIMIT
(
index
))
{
return
(
true
);
}
}
...
...
@@ -2025,9 +2045,9 @@ btr_cur_search_to_nth_level_func(
offsets2
=
rec_get_offsets
(
first_rec
,
index
,
offsets2
,
false
,
ULINT_UNDEFINED
,
&
heap
);
cmp_rec_rec
_with_match
(
node_ptr
,
first_rec
,
offsets
,
offsets2
,
index
,
FALSE
,
&
matched_fields
);
cmp_rec_rec
(
node_ptr
,
first_rec
,
offsets
,
offsets2
,
index
,
false
,
&
matched_fields
);
if
(
matched_fields
>=
rec_offs_n_fields
(
offsets
)
-
1
)
{
...
...
@@ -2043,10 +2063,10 @@ btr_cur_search_to_nth_level_func(
offsets2
=
rec_get_offsets
(
last_rec
,
index
,
offsets2
,
false
,
ULINT_UNDEFINED
,
&
heap
);
cmp_rec_rec
_with_match
(
cmp_rec_rec
(
node_ptr
,
last_rec
,
offsets
,
offsets2
,
index
,
FALSE
,
&
matched_fields
);
false
,
&
matched_fields
);
if
(
matched_fields
>=
rec_offs_n_fields
(
offsets
)
-
1
)
{
detected_same_key_root
=
true
;
...
...
@@ -4242,7 +4262,6 @@ btr_cur_optimistic_update(
dtuple_t
*
new_entry
;
roll_ptr_t
roll_ptr
;
ulint
i
;
ulint
n_ext
;
block
=
btr_cur_get_block
(
cursor
);
page
=
buf_block_get_frame
(
block
);
...
...
@@ -4319,10 +4338,8 @@ btr_cur_optimistic_update(
+
DTUPLE_EST_ALLOC
(
rec_offs_n_fields
(
*
offsets
)));
}
new_entry
=
row_rec_to_index_entry
(
rec
,
index
,
*
offsets
,
&
n_ext
,
*
heap
);
/* We checked above that there are no externally stored fields. */
ut_a
(
!
n_ext
);
new_entry
=
row_rec_to_index_entry
(
rec
,
index
,
*
offsets
,
*
heap
);
ut_ad
(
!
dtuple_get_n_ext
(
new_entry
));
/* The page containing the clustered index record
corresponding to new_entry is latched in mtr.
...
...
@@ -4586,7 +4603,6 @@ btr_cur_pessimistic_update(
roll_ptr_t
roll_ptr
;
ibool
was_first
;
ulint
n_reserved
=
0
;
ulint
n_ext
;
ulint
max_ins_size
=
0
;
*
offsets
=
NULL
;
...
...
@@ -4651,7 +4667,7 @@ btr_cur_pessimistic_update(
ut_ad
(
rec_offs_validate
(
rec
,
index
,
*
offsets
));
dtuple_t
*
new_entry
=
row_rec_to_index_entry
(
rec
,
index
,
*
offsets
,
&
n_ext
,
entry_heap
);
rec
,
index
,
*
offsets
,
entry_heap
);
/* The page containing the clustered index record
corresponding to new_entry is latched in mtr. If the
...
...
@@ -4671,7 +4687,6 @@ btr_cur_pessimistic_update(
ut_ad
(
!
page_is_comp
(
page
)
||
!
rec_get_node_ptr_flag
(
rec
));
ut_ad
(
rec_offs_validate
(
rec
,
index
,
*
offsets
));
n_ext
+=
btr_push_update_extern_fields
(
new_entry
,
update
,
entry_heap
);
if
((
flags
&
BTR_NO_UNDO_LOG_FLAG
)
&&
rec_offs_any_extern
(
*
offsets
))
{
...
...
@@ -4692,6 +4707,8 @@ btr_cur_pessimistic_update(
index
,
rec
,
page_zip
,
*
offsets
,
update
,
true
,
mtr
);
}
ulint
n_ext
=
dtuple_get_n_ext
(
new_entry
);
if
(
page_zip_rec_needs_ext
(
rec_get_converted_size
(
index
,
new_entry
,
n_ext
),
page_is_comp
(
page
),
...
...
@@ -6722,10 +6739,10 @@ btr_estimate_number_of_different_key_vals(
ULINT_UNDEFINED
,
&
heap
);
cmp_rec_rec
_with_match
(
rec
,
next_rec
,
offsets_rec
,
offsets_next_rec
,
index
,
stats_null_not_equal
,
&
matched_fields
);
cmp_rec_rec
(
rec
,
next_rec
,
offsets_rec
,
offsets_next_rec
,
index
,
stats_null_not_equal
,
&
matched_fields
);
for
(
j
=
matched_fields
;
j
<
n_cols
;
j
++
)
{
/* We add one if this index record has
...
...
@@ -7005,84 +7022,6 @@ btr_cur_unmark_extern_fields(
}
}
/*******************************************************************//**
Flags the data tuple fields that are marked as extern storage in the
update vector. We use this function to remember which fields we must
mark as extern storage in a record inserted for an update.
@return number of flagged external columns */
ulint
btr_push_update_extern_fields
(
/*==========================*/
dtuple_t
*
tuple
,
/*!< in/out: data tuple */
const
upd_t
*
update
,
/*!< in: update vector */
mem_heap_t
*
heap
)
/*!< in: memory heap */
{
ulint
n_pushed
=
0
;
ulint
n
;
const
upd_field_t
*
uf
;
uf
=
update
->
fields
;
n
=
upd_get_n_fields
(
update
);
for
(;
n
--
;
uf
++
)
{
if
(
dfield_is_ext
(
&
uf
->
new_val
))
{
dfield_t
*
field
=
dtuple_get_nth_field
(
tuple
,
uf
->
field_no
);
if
(
!
dfield_is_ext
(
field
))
{
dfield_set_ext
(
field
);
n_pushed
++
;
}
switch
(
uf
->
orig_len
)
{
byte
*
data
;
ulint
len
;
byte
*
buf
;
case
0
:
break
;
case
BTR_EXTERN_FIELD_REF_SIZE
:
/* Restore the original locally stored
part of the column. In the undo log,
InnoDB writes a longer prefix of externally
stored columns, so that column prefixes
in secondary indexes can be reconstructed. */
dfield_set_data
(
field
,
(
byte
*
)
dfield_get_data
(
field
)
+
dfield_get_len
(
field
)
-
BTR_EXTERN_FIELD_REF_SIZE
,
BTR_EXTERN_FIELD_REF_SIZE
);
dfield_set_ext
(
field
);
break
;
default:
/* Reconstruct the original locally
stored part of the column. The data
will have to be copied. */
ut_a
(
uf
->
orig_len
>
BTR_EXTERN_FIELD_REF_SIZE
);
data
=
(
byte
*
)
dfield_get_data
(
field
);
len
=
dfield_get_len
(
field
);
buf
=
(
byte
*
)
mem_heap_alloc
(
heap
,
uf
->
orig_len
);
/* Copy the locally stored prefix. */
memcpy
(
buf
,
data
,
unsigned
(
uf
->
orig_len
)
-
BTR_EXTERN_FIELD_REF_SIZE
);
/* Copy the BLOB pointer. */
memcpy
(
buf
+
unsigned
(
uf
->
orig_len
)
-
BTR_EXTERN_FIELD_REF_SIZE
,
data
+
len
-
BTR_EXTERN_FIELD_REF_SIZE
,
BTR_EXTERN_FIELD_REF_SIZE
);
dfield_set_data
(
field
,
buf
,
uf
->
orig_len
);
dfield_set_ext
(
field
);
}
}
}
return
(
n_pushed
);
}
/*******************************************************************//**
Returns the length of a BLOB part stored on the header page.
@return part length */
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/dict/dict0stats.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 2009, 2019, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 20
19
, MariaDB Corporation.
Copyright (c) 2015, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -1169,13 +1169,9 @@ dict_stats_analyze_index_level(
prev_rec
,
index
,
prev_rec_offsets
,
!
level
,
n_uniq
,
&
heap
);
cmp_rec_rec_with_match
(
rec
,
prev_rec
,
rec_offsets
,
prev_rec_offsets
,
index
,
FALSE
,
&
matched_fields
);
cmp_rec_rec
(
prev_rec
,
rec
,
prev_rec_offsets
,
rec_offsets
,
index
,
false
,
&
matched_fields
);
for
(
i
=
matched_fields
;
i
<
n_uniq
;
i
++
)
{
...
...
@@ -1395,9 +1391,8 @@ dict_stats_scan_page(
/* check whether rec != next_rec when looking at
the first n_prefix fields */
cmp_rec_rec_with_match
(
rec
,
next_rec
,
offsets_rec
,
offsets_next_rec
,
index
,
FALSE
,
&
matched_fields
);
cmp_rec_rec
(
rec
,
next_rec
,
offsets_rec
,
offsets_next_rec
,
index
,
false
,
&
matched_fields
);
if
(
matched_fields
<
n_prefix
)
{
/* rec != next_rec, => rec is non-boring */
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/gis/gis0rtree.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, 20
19
, MariaDB Corporation.
Copyright (c) 2018, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -1436,10 +1436,9 @@ rtr_page_copy_rec_list_end_no_locks(
offsets2
=
rec_get_offsets
(
cur_rec
,
index
,
offsets2
,
is_leaf
,
ULINT_UNDEFINED
,
&
heap
);
cmp
=
cmp_rec_rec_with_match
(
cur1_rec
,
cur_rec
,
offsets1
,
offsets2
,
index
,
FALSE
,
&
cur_matched_fields
);
cmp
=
cmp_rec_rec
(
cur1_rec
,
cur_rec
,
offsets1
,
offsets2
,
index
,
false
,
&
cur_matched_fields
);
if
(
cmp
<
0
)
{
page_cur_move_to_prev
(
&
page_cur
);
break
;
...
...
@@ -1551,15 +1550,13 @@ rtr_page_copy_rec_list_start_no_locks(
while
(
!
page_rec_is_supremum
(
cur_rec
))
{
ulint
cur_matched_fields
=
0
;
int
cmp
;
offsets2
=
rec_get_offsets
(
cur_rec
,
index
,
offsets2
,
is_leaf
,
ULINT_UNDEFINED
,
&
heap
);
cmp
=
cmp_rec_rec_with_match
(
cur1_rec
,
cur_rec
,
offsets1
,
offsets2
,
index
,
FALSE
,
&
cur_matched_fields
);
int
cmp
=
cmp_rec_rec
(
cur1_rec
,
cur_rec
,
offsets1
,
offsets2
,
index
,
false
,
&
cur_matched_fields
);
if
(
cmp
<
0
)
{
page_cur_move_to_prev
(
&
page_cur
);
cur_rec
=
page_cur_get_rec
(
&
page_cur
);
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/btr0cur.h
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 201
6
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
19
, MariaDB Corporation.
Copyright (c) 1994, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -784,18 +784,6 @@ btr_rec_copy_externally_stored_field(
ulint
*
len
,
mem_heap_t
*
heap
);
/*******************************************************************//**
Flags the data tuple fields that are marked as extern storage in the
update vector. We use this function to remember which fields we must
mark as extern storage in a record inserted for an update.
@return number of flagged external columns */
ulint
btr_push_update_extern_fields
(
/*==========================*/
dtuple_t
*
tuple
,
/*!< in/out: data tuple */
const
upd_t
*
update
,
/*!< in: update vector */
mem_heap_t
*
heap
)
/*!< in: memory heap */
MY_ATTRIBUTE
((
nonnull
));
/***********************************************************//**
Sets a secondary index record's delete mark to the given value. This
function is only used by the insert buffer merge mechanism. */
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/page0page.h
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 201
6
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 20
19
, MariaDB Corporation.
Copyright (c) 1994, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -857,6 +857,22 @@ page_rec_is_last(
const
page_t
*
page
)
/*!< in: page */
MY_ATTRIBUTE
((
warn_unused_result
));
/************************************************************//**
true if distance between the records (measured in number of times we have to
move to the next record) is at most the specified value
@param[in] left_rec lefter record
@param[in] right_rec righter record
@param[in] val specified value to compare
@return true if the distance is smaller than the value */
UNIV_INLINE
bool
page_rec_distance_is_at_most
(
/*=========================*/
const
rec_t
*
left_rec
,
const
rec_t
*
right_rec
,
ulint
val
)
MY_ATTRIBUTE
((
warn_unused_result
));
/************************************************************//**
true if the record is the second last user record on a page.
@return true if the second last user record */
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/page0page.ic
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 201
5
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 20
19
, MariaDB Corporation.
Copyright (c) 1994, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -358,6 +358,26 @@ page_rec_is_last(
return(page_rec_get_next_const(rec) == page_get_supremum_rec(page));
}
/************************************************************//**
true if distance between the records (measured in number of times we have to
move to the next record) is at most the specified value */
UNIV_INLINE
bool
page_rec_distance_is_at_most(
/*=========================*/
const rec_t* left_rec,
const rec_t* right_rec,
ulint val)
{
for (ulint i = 0; i <= val; i++) {
if (left_rec == right_rec) {
return (true);
}
left_rec = page_rec_get_next_const(left_rec);
}
return (false);
}
/************************************************************//**
true if the record is the second last user record on a page.
@return true if the second last user record */
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/rem0cmp.h
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017,
2020,
MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -80,7 +80,7 @@ cmp_dfield_dfield(
/** Compare a GIS data tuple to a physical record.
@param[in] dtuple data tuple
@param[in] rec
B
-tree record
@param[in] rec
R
-tree record
@param[in] offsets rec_get_offsets(rec)
@param[in] mode compare mode
@retval negative if dtuple is less than rec */
...
...
@@ -190,43 +190,23 @@ cmp_rec_rec_simple(
duplicate key value if applicable,
or NULL */
MY_ATTRIBUTE
((
nonnull
(
1
,
2
,
3
,
4
),
warn_unused_result
));
/** Compare two B-tree records.
@param[in] rec1 B-tree record
@param[in] rec2 B-tree record
@param[in] offsets1 rec_get_offsets(rec1, index)
@param[in] offsets2 rec_get_offsets(rec2, index)
@param[in] index B-tree index
@param[in] nulls_unequal true if this is for index cardinality
statistics estimation, and innodb_stats_method=nulls_unequal
or innodb_stats_method=nulls_ignored
@param[out] matched_fields number of completely matched fields
within the first field not completely matched
@return the comparison result
@retval 0 if rec1 is equal to rec2
@retval negative if rec1 is less than rec2
@retval positive if rec2 is greater than rec2 */
int
cmp_rec_rec_with_match
(
const
rec_t
*
rec1
,
const
rec_t
*
rec2
,
const
offset_t
*
offsets1
,
const
offset_t
*
offsets2
,
const
dict_index_t
*
index
,
bool
nulls_unequal
,
ulint
*
matched_fields
);
/** Compare two B-tree records.
/** Compare two B-tree
or R-tree
records.
Only the common first fields are compared, and externally stored field
are treated as equal.
@param[in] rec1
B-tree record
@param[in] rec2 B-tree
record
@param[in] rec1
record (possibly not on an index page)
@param[in] rec2 B-tree
or R-tree record in an index page
@param[in] offsets1 rec_get_offsets(rec1, index)
@param[in] offsets2 rec_get_offsets(rec2, index)
@param[in] nulls_unequal true if this is for index cardinality
statistics estimation with
innodb_stats_method=nulls_unequal
or innodb_stats_method=nulls_ignored
@param[out] matched_fields number of completely matched fields
within the first field not completely matched
@ret
urn positive, 0, negative if rec1 is greater, equal, less, than rec2,
respectively */
UNIV_INLINE
@ret
val 0 if rec1 is equal to rec2
@retval negative if rec1 is less than rec2
@retval positive if rec1 is greater than rec2 */
int
cmp_rec_rec
(
const
rec_t
*
rec1
,
...
...
@@ -234,7 +214,9 @@ cmp_rec_rec(
const
offset_t
*
offsets1
,
const
offset_t
*
offsets2
,
const
dict_index_t
*
index
,
ulint
*
matched_fields
=
NULL
);
bool
nulls_unequal
=
false
,
ulint
*
matched_fields
=
NULL
)
MY_ATTRIBUTE
((
nonnull
(
1
,
2
,
3
,
4
,
5
)));
/** Compare two data fields.
@param[in] dfield1 data field
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/rem0cmp.ic
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 2014, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2020, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -52,40 +53,6 @@ cmp_dfield_dfield(
dfield_get_len(dfield2)));
}
/** Compare two B-tree records.
Only the common first fields are compared, and externally stored field
are treated as equal.
@param[in] rec1 B-tree record
@param[in] rec2 B-tree record
@param[in] offsets1 rec_get_offsets(rec1, index)
@param[in] offsets2 rec_get_offsets(rec2, index)
@param[out] matched_fields number of completely matched fields
within the first field not completely matched
@return positive, 0, negative if rec1 is greater, equal, less, than rec2,
respectively */
UNIV_INLINE
int
cmp_rec_rec(
const rec_t* rec1,
const rec_t* rec2,
const offset_t* offsets1,
const offset_t* offsets2,
const dict_index_t* index,
ulint* matched_fields)
{
ulint match_f;
int ret;
ret = cmp_rec_rec_with_match(
rec1, rec2, offsets1, offsets2, index, false, &match_f);
if (matched_fields != NULL) {
*matched_fields = match_f;
}
return(ret);
}
/** Compare two data fields.
@param[in] dfield1 data field
@param[in] dfield2 data field
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/rem0rec.ic
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 201
5
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
19
, MariaDB Corporation.
Copyright (c) 1994, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -1410,6 +1410,7 @@ rec_get_converted_size(
data_size = dtuple_get_data_size(dtuple, 0);
ut_ad(n_ext == dtuple_get_n_ext(dtuple));
extra_size = rec_get_converted_extra_size(
data_size, dtuple_get_n_fields(dtuple), n_ext);
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/row0row.h
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 20
17
, MariaDB Corporation.
Copyright (c) 2016, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -207,8 +207,6 @@ row_rec_to_index_entry_low(
const
rec_t
*
rec
,
/*!< in: record in the index */
const
dict_index_t
*
index
,
/*!< in: index */
const
offset_t
*
offsets
,
/*!< in: rec_get_offsets(rec, index) */
ulint
*
n_ext
,
/*!< out: number of externally
stored columns */
mem_heap_t
*
heap
)
/*!< in: memory heap from which
the memory needed is allocated */
MY_ATTRIBUTE
((
warn_unused_result
));
...
...
@@ -222,8 +220,6 @@ row_rec_to_index_entry(
const
rec_t
*
rec
,
/*!< in: record in the index */
const
dict_index_t
*
index
,
/*!< in: index */
const
offset_t
*
offsets
,
/*!< in/out: rec_get_offsets(rec) */
ulint
*
n_ext
,
/*!< out: number of externally
stored columns */
mem_heap_t
*
heap
)
/*!< in: memory heap from which
the memory needed is allocated */
MY_ATTRIBUTE
((
warn_unused_result
));
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/include/univ.i
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 20
19
, MariaDB Corporation.
Copyright (c) 2013, 20
20
, MariaDB Corporation.
Copyright (c) 2008, Google Inc.
Portions of this file contain modifications contributed and copyrighted by
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/os/os0file.cc
View file @
6373ec3e
/***********************************************************************
Copyright (c) 1995, 201
7
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 1995, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2009, Percona Inc.
Copyright (c) 2013, 20
19
, MariaDB Corporation.
Copyright (c) 2013, 20
20
, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted
by Percona Inc.. Those modifications are
...
...
@@ -1470,6 +1470,12 @@ os_file_get_parent_dir(
return
(
NULL
);
}
if
(
last_slash
-
path
<
0
)
{
/* Sanity check, it prevents gcc from trying to handle this case which
* results in warnings for some optimized builds */
return
(
NULL
);
}
/* Non-trivial directory component */
return
(
mem_strdupl
(
path
,
ulint
(
last_slash
-
path
)));
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/rem/rem0cmp.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 1994, 2019, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2020, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -534,7 +535,7 @@ cmp_data(
/** Compare a GIS data tuple to a physical record.
@param[in] dtuple data tuple
@param[in] rec
B
-tree record
@param[in] rec
R
-tree record
@param[in] offsets rec_get_offsets(rec)
@param[in] mode compare mode
@retval negative if dtuple is less than rec */
...
...
@@ -1096,23 +1097,24 @@ cmp_rec_rec_simple(
return
(
0
);
}
/** Compare two B-tree records.
@param[in] rec1 B-tree record
@param[in] rec2 B-tree record
@param[in] offsets1 rec_get_offsets(rec1, index)
@param[in] offsets2 rec_get_offsets(rec2, index)
@param[in] index B-tree index
@param[in] nulls_unequal true if this is for index cardinality
statistics estimation, and innodb_stats_method=nulls_unequal
or innodb_stats_method=nulls_ignored
@param[out] matched_fields number of completely matched fields
within the first field not completely matched
@return the comparison result
/** Compare two B-tree or R-tree records.
Only the common first fields are compared, and externally stored field
are treated as equal.
@param[in] rec1 record (possibly not on an index page)
@param[in] rec2 B-tree or R-tree record in an index page
@param[in] offsets1 rec_get_offsets(rec1, index)
@param[in] offsets2 rec_get_offsets(rec2, index)
@param[in] nulls_unequal true if this is for index cardinality
statistics estimation with
innodb_stats_method=nulls_unequal
or innodb_stats_method=nulls_ignored
@param[out] matched_fields number of completely matched fields
within the first field not completely matched
@retval 0 if rec1 is equal to rec2
@retval negative if rec1 is less than rec2
@retval positive if rec
2
is greater than rec2 */
@retval positive if rec
1
is greater than rec2 */
int
cmp_rec_rec
_with_match
(
cmp_rec_rec
(
const
rec_t
*
rec1
,
const
rec_t
*
rec2
,
const
offset_t
*
offsets1
,
...
...
@@ -1121,17 +1123,14 @@ cmp_rec_rec_with_match(
bool
nulls_unequal
,
ulint
*
matched_fields
)
{
ulint
rec1_n_fields
;
/* the number of fields in rec */
ulint
rec1_f_len
;
/* length of current field in rec */
const
byte
*
rec1_b_ptr
;
/* pointer to the current byte
in rec field */
ulint
rec2_n_fields
;
/* the number of fields in rec */
ulint
rec2_f_len
;
/* length of current field in rec */
const
byte
*
rec2_b_ptr
;
/* pointer to the current byte
in rec field */
ulint
cur_field
=
0
;
/* current field number */
int
ret
=
0
;
/* return value */
ulint
comp
;
ut_ad
(
rec1
!=
NULL
);
ut_ad
(
rec2
!=
NULL
);
...
...
@@ -1139,10 +1138,12 @@ cmp_rec_rec_with_match(
ut_ad
(
rec_offs_validate
(
rec1
,
index
,
offsets1
));
ut_ad
(
rec_offs_validate
(
rec2
,
index
,
offsets2
));
ut_ad
(
rec_offs_comp
(
offsets1
)
==
rec_offs_comp
(
offsets2
));
ut_ad
(
fil_page_index_page_check
(
page_align
(
rec2
)));
ut_ad
(
!!
dict_index_is_spatial
(
index
)
==
(
fil_page_get_type
(
page_align
(
rec2
))
==
FIL_PAGE_RTREE
));
comp
=
rec_offs_comp
(
offsets1
);
rec1_n_fields
=
rec_offs_n_fields
(
offsets1
);
rec2_n_fields
=
rec_offs_n_fields
(
offsets2
);
ulint
comp
=
rec_offs_comp
(
offsets1
);
ulint
n_fields
;
/* Test if rec is the predefined minimum record */
if
(
UNIV_UNLIKELY
(
rec_get_info_bits
(
rec1
,
comp
)
...
...
@@ -1158,37 +1159,41 @@ cmp_rec_rec_with_match(
goto
order_resolved
;
}
/* Match fields in a loop */
/* For non-leaf spatial index records, the
dict_index_get_n_unique_in_tree() does include the child page
number, because spatial index node pointers only contain
the MBR (minimum bounding rectangle) and the child page number.
for
(;
cur_field
<
rec1_n_fields
&&
cur_field
<
rec2_n_fields
;
cur_field
++
)
{
For B-tree node pointers, the key alone (secondary index
columns and PRIMARY KEY columns) must be unique, and there is
no need to compare the child page number. */
n_fields
=
std
::
min
(
rec_offs_n_fields
(
offsets1
),
rec_offs_n_fields
(
offsets2
));
n_fields
=
std
::
min
(
n_fields
,
dict_index_get_n_unique_in_tree
(
index
));
for
(;
cur_field
<
n_fields
;
cur_field
++
)
{
ulint
mtype
;
ulint
prtype
;
/* If this is node-ptr records then avoid comparing node-ptr
field. Only key field needs to be compared. */
if
(
cur_field
==
dict_index_get_n_unique_in_tree
(
index
))
{
break
;
}
if
(
dict_index_is_ibuf
(
index
))
{
if
(
UNIV_UNLIKELY
(
dict_index_is_ibuf
(
index
)))
{
/* This is for the insert buffer B-tree. */
mtype
=
DATA_BINARY
;
prtype
=
0
;
}
else
{
const
dict_col_t
*
col
;
col
=
dict_index_get_nth_col
(
index
,
cur_field
);
const
dict_col_t
*
col
=
dict_index_get_nth_col
(
index
,
cur_field
);
mtype
=
col
->
mtype
;
prtype
=
col
->
prtype
;
/* If the index is spatial index, we mark the
prtype of the first field as MBR field. */
if
(
cur_field
==
0
&&
dict_index_is_spatial
(
index
))
{
if
(
UNIV_LIKELY
(
!
dict_index_is_spatial
(
index
)))
{
}
else
if
(
cur_field
==
0
)
{
ut_ad
(
DATA_GEOMETRY_MTYPE
(
mtype
));
prtype
|=
DATA_GIS_MBR
;
}
else
if
(
!
page_rec_is_leaf
(
rec2
))
{
/* Compare the child page number. */
ut_ad
(
cur_field
==
1
);
mtype
=
DATA_SYS_CHILD
;
prtype
=
0
;
}
}
...
...
@@ -1226,8 +1231,10 @@ cmp_rec_rec_with_match(
to the common fields */
ut_ad
(
ret
==
0
);
order_resolved:
*
matched_fields
=
cur_field
;
return
(
ret
);
if
(
matched_fields
)
{
*
matched_fields
=
cur_field
;
}
return
ret
;
}
#ifdef UNIV_COMPILE_TEST_FUNCS
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0ftsort.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 2010, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 20
19
, MariaDB Corporation.
Copyright (c) 2015, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -1722,7 +1722,6 @@ row_fts_merge_insert(
corresponding FTS index auxiliary tables */
for
(;;)
{
dtuple_t
*
dtuple
;
ulint
n_ext
;
int
min_rec
=
0
;
if
(
fts_sort_pll_degree
<=
2
)
{
...
...
@@ -1765,7 +1764,7 @@ row_fts_merge_insert(
}
dtuple
=
row_rec_to_index_entry_low
(
mrec
[
min_rec
],
index
,
offsets
[
min_rec
],
&
n_ext
,
mrec
[
min_rec
],
index
,
offsets
[
min_rec
],
tuple_heap
);
row_fts_insert_tuple
(
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0import.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 20
19
, MariaDB Corporation.
Copyright (c) 2015, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -1526,13 +1526,70 @@ IndexPurge::next() UNIV_NOTHROW
mtr_set_log_mode
(
&
m_mtr
,
MTR_LOG_NO_REDO
);
btr_pcur_restore_position
(
BTR_MODIFY_LEAF
,
&
m_pcur
,
&
m_mtr
);
/* The following is based on btr_pcur_move_to_next_user_rec(). */
m_pcur
.
old_stored
=
false
;
ut_ad
(
m_pcur
.
latch_mode
==
BTR_MODIFY_LEAF
);
do
{
if
(
btr_pcur_is_after_last_on_page
(
&
m_pcur
))
{
if
(
btr_pcur_is_after_last_in_tree
(
&
m_pcur
))
{
return
DB_END_OF_INDEX
;
}
if
(
!
btr_pcur_move_to_next_user_rec
(
&
m_pcur
,
&
m_mtr
))
{
buf_block_t
*
block
=
btr_pcur_get_block
(
&
m_pcur
);
uint32_t
next_page
=
btr_page_get_next
(
block
->
frame
);
return
(
DB_END_OF_INDEX
);
}
/* MDEV-13542 FIXME: Make these checks part of
btr_pcur_move_to_next_page(), and introduce a
return status that will be checked in all callers! */
switch
(
next_page
)
{
default:
if
(
next_page
!=
block
->
page
.
id
.
page_no
())
{
break
;
}
/* MDEV-20931 FIXME: Check that
next_page is within the tablespace
bounds! Also check that it is not a
change buffer bitmap page. */
/* fall through */
case
0
:
case
1
:
case
FIL_NULL
:
return
DB_CORRUPTION
;
}
return
(
DB_SUCCESS
);
dict_index_t
*
index
=
m_pcur
.
btr_cur
.
index
;
buf_block_t
*
next_block
=
btr_block_get
(
page_id_t
(
block
->
page
.
id
.
space
(),
next_page
),
block
->
page
.
size
,
BTR_MODIFY_LEAF
,
index
,
&
m_mtr
);
if
(
UNIV_UNLIKELY
(
!
next_block
||
!
fil_page_index_page_check
(
next_block
->
frame
)
||
!!
dict_index_is_spatial
(
index
)
!=
(
fil_page_get_type
(
next_block
->
frame
)
==
FIL_PAGE_RTREE
)
||
page_is_comp
(
next_block
->
frame
)
!=
page_is_comp
(
block
->
frame
)
||
btr_page_get_prev
(
next_block
->
frame
)
!=
block
->
page
.
id
.
page_no
()))
{
return
DB_CORRUPTION
;
}
btr_leaf_page_release
(
block
,
BTR_MODIFY_LEAF
,
&
m_mtr
);
page_cur_set_before_first
(
next_block
,
&
m_pcur
.
btr_cur
.
page_cur
);
ut_d
(
page_check_dir
(
next_block
->
frame
));
}
else
{
btr_pcur_move_to_next_on_page
(
&
m_pcur
);
}
}
while
(
!
btr_pcur_is_on_user_rec
(
&
m_pcur
));
return
DB_SUCCESS
;
}
/**
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0log.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
19
, MariaDB Corporation.
Copyright (c) 2017, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -3559,7 +3559,6 @@ row_log_apply_op(
enum
row_op
op
;
ulint
extra_size
;
ulint
data_size
;
ulint
n_ext
;
dtuple_t
*
entry
;
trx_id_t
trx_id
;
...
...
@@ -3637,10 +3636,10 @@ row_log_apply_op(
}
entry
=
row_rec_to_index_entry_low
(
mrec
-
data_size
,
index
,
offsets
,
&
n_ext
,
heap
);
mrec
-
data_size
,
index
,
offsets
,
heap
);
/* Online index creation is only implemented for secondary
indexes, which never contain off-page columns. */
ut_ad
(
n_ext
==
0
);
ut_ad
(
dtuple_get_n_ext
(
entry
)
==
0
);
row_log_apply_op_low
(
index
,
dup
,
error
,
offsets_heap
,
has_index_lock
,
op
,
trx_id
,
entry
);
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0merge.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 2005, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2014, 20
19
, MariaDB Corporation.
Copyright (c) 2014, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -3535,7 +3535,6 @@ row_merge_insert_index_tuples(
double
curr_progress
=
0
;
dict_index_t
*
old_index
=
NULL
;
const
mrec_t
*
mrec
=
NULL
;
ulint
n_ext
=
0
;
mtr_t
mtr
;
...
...
@@ -3601,8 +3600,6 @@ row_merge_insert_index_tuples(
row buffer to data tuple record */
row_merge_mtuple_to_dtuple
(
index
,
dtuple
,
&
row_buf
->
tuples
[
n_rows
]);
n_ext
=
dtuple_get_n_ext
(
dtuple
);
n_rows
++
;
/* BLOB pointers must be copied from dtuple */
mrec
=
NULL
;
...
...
@@ -3621,7 +3618,7 @@ row_merge_insert_index_tuples(
}
dtuple
=
row_rec_to_index_entry_low
(
mrec
,
index
,
offsets
,
&
n_ext
,
tuple_heap
);
mrec
,
index
,
offsets
,
tuple_heap
);
}
old_index
=
dict_table_get_first_index
(
old_table
);
...
...
@@ -3634,10 +3631,7 @@ row_merge_insert_index_tuples(
}
}
if
(
!
n_ext
)
{
/* There are no externally stored columns. */
}
else
{
ut_ad
(
dict_index_is_clust
(
index
));
if
(
dict_index_is_clust
(
index
)
&&
dtuple_get_n_ext
(
dtuple
))
{
/* Off-page columns can be fetched safely
when concurrent modifications to the table
are disabled. (Purge can process delete-marked
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0mysql.cc
View file @
6373ec3e
...
...
@@ -4681,7 +4681,6 @@ row_scan_index_for_mysql(
ulint
i
;
ulint
cnt
;
mem_heap_t
*
heap
=
NULL
;
ulint
n_ext
;
offset_t
offsets_
[
REC_OFFS_NORMAL_SIZE
];
offset_t
*
offsets
;
rec_offs_init
(
offsets_
);
...
...
@@ -4823,7 +4822,7 @@ row_scan_index_for_mysql(
mem_heap_empty
(
heap
);
prev_entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
&
n_ext
,
heap
);
rec
,
index
,
offsets
,
heap
);
if
(
UNIV_LIKELY_NULL
(
tmp_heap
))
{
mem_heap_free
(
tmp_heap
);
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0row.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1996, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, 20
19
, MariaDB Corporation.
Copyright (c) 2018, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -685,7 +685,6 @@ row_rec_to_index_entry_impl(
const
rec_t
*
rec
,
const
dict_index_t
*
index
,
const
offset_t
*
offsets
,
ulint
*
n_ext
,
mem_heap_t
*
heap
)
{
dtuple_t
*
entry
;
...
...
@@ -703,8 +702,6 @@ row_rec_to_index_entry_impl(
/* Because this function may be invoked by row0merge.cc
on a record whose header is in different format, the check
rec_offs_validate(rec, index, offsets) must be avoided here. */
ut_ad
(
n_ext
);
*
n_ext
=
0
;
rec_len
=
rec_offs_n_fields
(
offsets
);
...
...
@@ -731,7 +728,6 @@ row_rec_to_index_entry_impl(
if
(
rec_offs_nth_extern
(
offsets
,
i
))
{
dfield_set_ext
(
dfield
);
(
*
n_ext
)
++
;
}
}
...
...
@@ -743,18 +739,15 @@ row_rec_to_index_entry_impl(
@param[in] rec index record
@param[in] index index
@param[in] offsets rec_get_offsets(rec, index)
@param[out] n_ext number of externally stored columns
@param[in,out] heap memory heap for allocations */
dtuple_t
*
row_rec_to_index_entry_low
(
const
rec_t
*
rec
,
const
dict_index_t
*
index
,
const
offset_t
*
offsets
,
ulint
*
n_ext
,
mem_heap_t
*
heap
)
{
return
row_rec_to_index_entry_impl
<
false
>
(
rec
,
index
,
offsets
,
n_ext
,
heap
);
return
row_rec_to_index_entry_impl
<
false
>
(
rec
,
index
,
offsets
,
heap
);
}
/*******************************************************************//**
...
...
@@ -767,8 +760,6 @@ row_rec_to_index_entry(
const
rec_t
*
rec
,
/*!< in: record in the index */
const
dict_index_t
*
index
,
/*!< in: index */
const
offset_t
*
offsets
,
/*!< in: rec_get_offsets(rec) */
ulint
*
n_ext
,
/*!< out: number of externally
stored columns */
mem_heap_t
*
heap
)
/*!< in: memory heap from which
the memory needed is allocated */
{
...
...
@@ -790,7 +781,7 @@ row_rec_to_index_entry(
rec_offs_make_valid
(
copy_rec
,
index
,
true
,
const_cast
<
offset_t
*>
(
offsets
));
entry
=
row_rec_to_index_entry_impl
<
true
>
(
copy_rec
,
index
,
offsets
,
n_ext
,
heap
);
copy_rec
,
index
,
offsets
,
heap
);
rec_offs_make_valid
(
rec
,
index
,
true
,
const_cast
<
offset_t
*>
(
offsets
));
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0umod.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
19
, MariaDB Corporation.
Copyright (c) 2017, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -186,6 +186,7 @@ static bool row_undo_mod_must_purge(undo_node_t* node, mtr_t* mtr)
btr_cur_t
*
btr_cur
=
btr_pcur_get_btr_cur
(
&
node
->
pcur
);
ut_ad
(
btr_cur
->
index
->
is_primary
());
DEBUG_SYNC_C
(
"rollback_purge_clust"
);
mtr
->
s_lock
(
&
purge_sys
.
latch
,
__FILE__
,
__LINE__
);
...
...
@@ -319,6 +320,7 @@ row_undo_mod_clust(
==
node
->
new_trx_id
);
btr_pcur_commit_specify_mtr
(
pcur
,
&
mtr
);
DEBUG_SYNC_C
(
"rollback_undo_pk"
);
if
(
err
!=
DB_SUCCESS
)
{
goto
func_exit
;
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0upd.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 20
19
, MariaDB Corporation.
Copyright (c) 2015, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -223,7 +223,6 @@ row_upd_check_references_constraints(
dtuple_t
*
entry
;
trx_t
*
trx
;
const
rec_t
*
rec
;
ulint
n_ext
;
dberr_t
err
;
ibool
got_s_lock
=
FALSE
;
...
...
@@ -240,7 +239,7 @@ row_upd_check_references_constraints(
heap
=
mem_heap_create
(
500
);
entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
&
n_ext
,
heap
);
entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
heap
);
mtr_commit
(
mtr
);
...
...
@@ -341,7 +340,6 @@ wsrep_row_upd_check_foreign_constraints(
dtuple_t
*
entry
;
trx_t
*
trx
;
const
rec_t
*
rec
;
ulint
n_ext
;
dberr_t
err
;
ibool
got_s_lock
=
FALSE
;
ibool
opened
=
FALSE
;
...
...
@@ -359,8 +357,7 @@ wsrep_row_upd_check_foreign_constraints(
heap
=
mem_heap_create
(
500
);
entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
&
n_ext
,
heap
);
entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
heap
);
mtr_commit
(
mtr
);
...
...
@@ -2812,9 +2809,9 @@ row_upd_clust_rec_by_insert(
mtr_commit
(
mtr
);
err
=
row_ins_clust_index_entry
(
index
,
entry
,
thr
,
node
->
upd_ext
?
node
->
upd_ext
->
n_ext
:
0
);
err
=
row_ins_clust_index_entry
(
index
,
entry
,
thr
,
node
->
upd_ext
?
node
->
upd_ext
->
n_ext
:
dtuple_get_n_ext
(
entry
)
);
node
->
state
=
UPD_NODE_INSERT_CLUSTERED
;
mem_heap_free
(
heap
);
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/row/row0vers.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
19
, MariaDB Corporation.
Copyright (c) 2017, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -153,15 +153,13 @@ row_vers_impl_x_locked_low(
const
ulint
rec_del
=
rec_get_deleted_flag
(
rec
,
comp
);
if
(
dict_index_has_virtual
(
index
))
{
ulint
n_ext
;
ulint
est_size
=
DTUPLE_EST_ALLOC
(
index
->
n_fields
);
/* Allocate the dtuple for virtual columns extracted from undo
log with its own heap, so to avoid it being freed as we
iterating in the version loop below. */
v_heap
=
mem_heap_create
(
est_size
);
ientry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
&
n_ext
,
v_heap
);
ientry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
v_heap
);
}
/* We look up if some earlier version, which was modified by
...
...
This diff is collapsed.
Click to expand it.
storage/innobase/trx/trx0rec.cc
View file @
6373ec3e
/*****************************************************************************
Copyright (c) 1996, 201
6
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
19
, MariaDB Corporation.
Copyright (c) 1996, 201
9
, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 20
20
, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -2335,8 +2335,6 @@ trx_undo_prev_version_build(
ut_a
(
ptr
);
if
(
row_upd_changes_field_size_or_external
(
index
,
offsets
,
update
))
{
ulint
n_ext
;
/* We should confirm the existence of disowned external data,
if the previous version record is delete marked. If the trx_id
of the previous record is seen by purge view, we should treat
...
...
@@ -2377,14 +2375,15 @@ trx_undo_prev_version_build(
those fields that update updates to become externally stored
fields. Store the info: */
entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
&
n_ext
,
heap
);
n_ext
+=
btr_push_update_extern_fields
(
entry
,
update
,
heap
);
entry
=
row_rec_to_index_entry
(
rec
,
index
,
offsets
,
heap
);
/* The page containing the clustered index record
corresponding to entry is latched in mtr. Thus the
following call is safe. */
row_upd_index_replace_new_col_vals
(
entry
,
index
,
update
,
heap
);
/* Get number of externally stored columns in updated record */
const
ulint
n_ext
=
dtuple_get_n_ext
(
entry
);
buf
=
static_cast
<
byte
*>
(
mem_heap_alloc
(
heap
,
rec_get_converted_size
(
index
,
entry
,
n_ext
)));
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment