summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2017-09-14 08:09:44 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2017-09-14 08:09:44 +0300
commitc97e504a5fa470c7ee4717f1e38ce12b61174741 (patch)
tree5cfe4c45f1f8226b940abd46d0a428124cf8d269
parent178540b904f3eca70488a3d1a0a55f5676087c04 (diff)
parentcfd51c01e17cd2689764a6c47de1e218adf9aaec (diff)
downloadmariadb-git-c97e504a5fa470c7ee4717f1e38ce12b61174741.tar.gz
Merge 10.2 into bb-10.2-ext
-rw-r--r--mysql-test/r/default.result7
-rw-r--r--mysql-test/r/func_json.result6
-rw-r--r--mysql-test/suite/gcol/r/gcol_update.result30
-rw-r--r--mysql-test/suite/gcol/t/gcol_update.test41
-rw-r--r--mysql-test/suite/innodb/r/innodb-wl5522-debug.result9
-rw-r--r--mysql-test/suite/innodb/t/innodb-wl5522-debug.test9
-rw-r--r--mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result9
-rw-r--r--mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test9
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_purge_run_now_basic.result27
-rw-r--r--mysql-test/suite/sys_vars/r/innodb_purge_stop_now_basic.result27
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_innodb.result28
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test53
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test53
-rw-r--r--mysql-test/t/default.test10
-rw-r--r--mysql-test/t/func_json.test6
-rw-r--r--sql/item.cc4
-rw-r--r--sql/item_jsonfunc.cc2
-rw-r--r--storage/innobase/buf/buf0lru.cc5
-rw-r--r--storage/innobase/handler/ha_innodb.cc60
-rw-r--r--storage/innobase/include/fil0fil.h5
-rw-r--r--storage/innobase/include/page0page.h4
-rw-r--r--storage/innobase/include/page0page.ic4
-rw-r--r--storage/innobase/include/rem0rec.h50
-rw-r--r--storage/innobase/page/page0page.cc6
-rw-r--r--storage/innobase/rem/rem0rec.cc165
-rw-r--r--storage/innobase/row/row0log.cc62
-rw-r--r--storage/innobase/row/row0merge.cc6
27 files changed, 270 insertions, 427 deletions
diff --git a/mysql-test/r/default.result b/mysql-test/r/default.result
index 9aa07a42eab..a03da4f8df1 100644
--- a/mysql-test/r/default.result
+++ b/mysql-test/r/default.result
@@ -3372,4 +3372,11 @@ create table t1 (col1 int default(-(default(col1))));
ERROR 01000: Expression for field `col1` is refering to uninitialized field `col1`
create table t1 (col int default (yearweek((exp(710)))));
ERROR 22003: DOUBLE value is out of range in 'exp(710)'
+#
+# MDEV-13707 Server in ORACLE mode crashes on ALTER with wrong DEFAULT clause
+#
+CREATE OR REPLACE TABLE t1(i int);
+ALTER TABLE t1 ADD b CHAR(255) DEFAULT `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`;
+ERROR 42S22: Unknown column 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' in 'DEFAULT'
+DROP TABLE t1;
# end of 10.2 test
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result
index f8a4f3572d5..b1d3d96aa73 100644
--- a/mysql-test/r/func_json.result
+++ b/mysql-test/r/func_json.result
@@ -699,6 +699,12 @@ select @str, @path, JSON_EXTRACT(@str, @path);
select json_array(5,json_query('[1,2]','$'));
json_array(5,json_query('[1,2]','$'))
[5, [1,2]]
+SELECT JSON_ARRAY('1. ě 2. š 3. č 4. ř 5. ž 6. ý 7. á 8. í 9. é 10. ů 11. ú') AS json_data;
+json_data
+["1. ě 2. š 3. č 4. ř 5. ž 6. ý 7. á 8. í 9. é 10. ů 11. ú"]
+SELECT JSON_OBJECT("user","Jožko Mrkvičká") as json_data;
+json_data
+{"user": "Jožko Mrkvičká"}
#
# Start of 10.3 tests
#
diff --git a/mysql-test/suite/gcol/r/gcol_update.result b/mysql-test/suite/gcol/r/gcol_update.result
index 380d1c1efef..720ff533bac 100644
--- a/mysql-test/suite/gcol/r/gcol_update.result
+++ b/mysql-test/suite/gcol/r/gcol_update.result
@@ -1,13 +1,19 @@
-set global innodb_purge_stop_now = 1;
+SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
+connect purge_control,localhost,root;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
create table t1(f1 int not null, f2 blob not null, f3 blob not null,
vchar char(2) as (substr(f3,2,2)) virtual,
primary key(f1, f3(5)), index(vchar))engine=innodb;
insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000));
update t1 set f1=5 where f1=1;
delete from t1 where f1=5;
-set global innodb_purge_run_now=1;
-set global innodb_fast_shutdown=0;
-set global innodb_purge_stop_now = 1;
+connection purge_control;
+COMMIT;
+InnoDB 0 transactions not purged
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
drop table t1;
create table t1(f1 int not null, f2 blob not null, f3 blob not null,
vchar char(2) as (substr(f3,2,2)) virtual,
@@ -15,9 +21,11 @@ primary key(f1, f3(5)), index(vchar, f3(2)))engine=innodb;
insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000));
update t1 set f1=5 where f1=1;
delete from t1 where f1=5;
-set global innodb_purge_run_now=1;
-set global innodb_fast_shutdown=0;
-set global innodb_purge_stop_now = 1;
+connection purge_control;
+COMMIT;
+InnoDB 0 transactions not purged
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
drop table t1;
create table t1(f1 int not null, f2 blob not null, f3 blob not null,
vchar blob as (f3) virtual,
@@ -25,6 +33,10 @@ primary key(f1, f3(5)), index(vchar(3)))engine=innodb;
insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000));
update t1 set f1=5 where f1=1;
delete from t1 where f1=5;
-set global innodb_purge_run_now=1;
-set global innodb_fast_shutdown=0;
+connection purge_control;
+COMMIT;
+InnoDB 0 transactions not purged
+disconnect purge_control;
+connection default;
drop table t1;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
diff --git a/mysql-test/suite/gcol/t/gcol_update.test b/mysql-test/suite/gcol/t/gcol_update.test
index 0a7265bebac..8652ce7a638 100644
--- a/mysql-test/suite/gcol/t/gcol_update.test
+++ b/mysql-test/suite/gcol/t/gcol_update.test
@@ -1,9 +1,12 @@
---source include/have_debug.inc
--source include/have_innodb.inc
-# The embedded server does not support restarting.
---source include/not_embedded.inc
-set global innodb_purge_stop_now = 1;
+SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
+
+connect (purge_control,localhost,root);
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+
+connection default;
# Index on virtual column
@@ -16,10 +19,12 @@ insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000));
update t1 set f1=5 where f1=1;
delete from t1 where f1=5;
-set global innodb_purge_run_now=1;
-set global innodb_fast_shutdown=0;
---source include/restart_mysqld.inc
-set global innodb_purge_stop_now = 1;
+connection purge_control;
+COMMIT;
+--source ../../innodb/include/wait_all_purged.inc
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
+
drop table t1;
# Index on virtual column and blob
@@ -33,10 +38,11 @@ insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000));
update t1 set f1=5 where f1=1;
delete from t1 where f1=5;
-set global innodb_purge_run_now=1;
-set global innodb_fast_shutdown=0;
---source include/restart_mysqld.inc
-set global innodb_purge_stop_now = 1;
+connection purge_control;
+COMMIT;
+--source ../../innodb/include/wait_all_purged.inc
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
drop table t1;
# Index on virtual column of blob type
@@ -50,7 +56,12 @@ insert into t1(f1,f2,f3) values(1, repeat('a',8000), repeat('b', 9000));
update t1 set f1=5 where f1=1;
delete from t1 where f1=5;
-set global innodb_purge_run_now=1;
-set global innodb_fast_shutdown=0;
---source include/restart_mysqld.inc
+connection purge_control;
+COMMIT;
+--source ../../innodb/include/wait_all_purged.inc
+disconnect purge_control;
+
+connection default;
drop table t1;
+
+SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
diff --git a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
index 4d748d6ebed..99e9c49eee9 100644
--- a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
+++ b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result
@@ -494,7 +494,9 @@ c4 VARCHAR(2048),
INDEX idx1(c2),
INDEX idx2(c3(512)),
INDEX idx3(c4(512))) Engine=InnoDB;
-SET GLOBAL INNODB_PURGE_STOP_NOW=ON;
+connect purge_control,localhost,root;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
SET GLOBAL innodb_disable_background_merge=ON;
SET GLOBAL innodb_monitor_reset = ibuf_merges;
SET GLOBAL innodb_monitor_reset = ibuf_merges_insert;
@@ -659,7 +661,10 @@ FROM information_schema.innodb_metrics
WHERE name = 'ibuf_merges_inserts' AND count > 0;
name
SET GLOBAL innodb_disable_background_merge=OFF;
-SET GLOBAL INNODB_PURGE_RUN_NOW=ON;
+connection purge_control;
+COMMIT;
+disconnect purge_control;
+connection default;
DROP TABLE test_wl5522.t1;
CREATE TABLE test_wl5522.t1 (
c1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
diff --git a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test
index 6b6506e8481..ca37521b9cf 100644
--- a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test
+++ b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test
@@ -1055,7 +1055,9 @@ CREATE TABLE test_wl5522.t1 (
INDEX idx3(c4(512))) Engine=InnoDB;
# Stop purge so that it doesn't remove the delete marked entries.
-SET GLOBAL INNODB_PURGE_STOP_NOW=ON;
+connect (purge_control,localhost,root);
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
# Disable change buffer merge from the master thread, additionally
# enable aggressive flushing so that more changes are buffered.
@@ -1125,7 +1127,10 @@ SELECT name
SET GLOBAL innodb_disable_background_merge=OFF;
# Enable normal operation
-SET GLOBAL INNODB_PURGE_RUN_NOW=ON;
+connection purge_control;
+COMMIT;
+disconnect purge_control;
+connection default;
DROP TABLE test_wl5522.t1;
diff --git a/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result b/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result
index d20cc452612..394a2ea1f09 100644
--- a/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result
+++ b/mysql-test/suite/innodb_zip/r/wl5522_debug_zip.result
@@ -123,7 +123,9 @@ INDEX idx1(c2),
INDEX idx2(c3(512)),
INDEX idx3(c4(512))) Engine=InnoDB
ROW_FORMAT=COMPRESSED;
-SET GLOBAL INNODB_PURGE_STOP_NOW=ON;
+connect purge_control,localhost,root;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
SET GLOBAL innodb_disable_background_merge=ON;
SET GLOBAL innodb_monitor_reset = ibuf_merges;
SET GLOBAL innodb_monitor_reset = ibuf_merges_insert;
@@ -288,7 +290,10 @@ FROM information_schema.innodb_metrics
WHERE name = 'ibuf_merges_inserts' AND count > 0;
name
SET GLOBAL innodb_disable_background_merge=OFF;
-SET GLOBAL INNODB_PURGE_RUN_NOW=ON;
+connection purge_control;
+COMMIT;
+disconnect purge_control;
+connection default;
DROP TABLE test_wl5522.t1;
CREATE TABLE test_wl5522.t1 (
c1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
diff --git a/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test b/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test
index 0898a32fbf5..986c0508891 100644
--- a/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test
+++ b/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test
@@ -321,7 +321,9 @@ CREATE TABLE test_wl5522.t1 (
ROW_FORMAT=COMPRESSED;
# Stop purge so that it doesn't remove the delete marked entries.
-SET GLOBAL INNODB_PURGE_STOP_NOW=ON;
+connect (purge_control,localhost,root);
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
# Disable change buffer merge from the master thread, additionally
# enable aggressive flushing so that more changes are buffered.
@@ -391,7 +393,10 @@ SELECT name
SET GLOBAL innodb_disable_background_merge=OFF;
# Enable normal operation
-SET GLOBAL INNODB_PURGE_RUN_NOW=ON;
+connection purge_control;
+COMMIT;
+disconnect purge_control;
+connection default;
DROP TABLE test_wl5522.t1;
diff --git a/mysql-test/suite/sys_vars/r/innodb_purge_run_now_basic.result b/mysql-test/suite/sys_vars/r/innodb_purge_run_now_basic.result
deleted file mode 100644
index 41204422767..00000000000
--- a/mysql-test/suite/sys_vars/r/innodb_purge_run_now_basic.result
+++ /dev/null
@@ -1,27 +0,0 @@
-SELECT name, count
-FROM information_schema.innodb_metrics
-WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-name count
-purge_stop_count 0
-purge_resume_count 0
-SET @orig = @@global.innodb_purge_run_now;
-SELECT @orig;
-@orig
-0
-SET GLOBAL innodb_purge_stop_now = ON;
-SELECT name, count
-FROM information_schema.innodb_metrics
-WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-name count
-purge_stop_count 1
-purge_resume_count 0
-SET GLOBAL innodb_purge_run_now = ON;
-SELECT @@global.innodb_purge_run_now;
-@@global.innodb_purge_run_now
-0
-SELECT name, count
-FROM information_schema.innodb_metrics
-WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-name count
-purge_stop_count 1
-purge_resume_count 1
diff --git a/mysql-test/suite/sys_vars/r/innodb_purge_stop_now_basic.result b/mysql-test/suite/sys_vars/r/innodb_purge_stop_now_basic.result
deleted file mode 100644
index 41204422767..00000000000
--- a/mysql-test/suite/sys_vars/r/innodb_purge_stop_now_basic.result
+++ /dev/null
@@ -1,27 +0,0 @@
-SELECT name, count
-FROM information_schema.innodb_metrics
-WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-name count
-purge_stop_count 0
-purge_resume_count 0
-SET @orig = @@global.innodb_purge_run_now;
-SELECT @orig;
-@orig
-0
-SET GLOBAL innodb_purge_stop_now = ON;
-SELECT name, count
-FROM information_schema.innodb_metrics
-WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-name count
-purge_stop_count 1
-purge_resume_count 0
-SET GLOBAL innodb_purge_run_now = ON;
-SELECT @@global.innodb_purge_run_now;
-@@global.innodb_purge_run_now
-0
-SELECT name, count
-FROM information_schema.innodb_metrics
-WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-name count
-purge_stop_count 1
-purge_resume_count 1
diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
index b2c8ada4b27..548142ef523 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
@@ -2274,34 +2274,6 @@ NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
-VARIABLE_NAME INNODB_PURGE_RUN_NOW
-SESSION_VALUE NULL
-GLOBAL_VALUE OFF
-GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE OFF
-VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BOOLEAN
-VARIABLE_COMMENT Set purge state to RUN
-NUMERIC_MIN_VALUE NULL
-NUMERIC_MAX_VALUE NULL
-NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST OFF,ON
-READ_ONLY NO
-COMMAND_LINE_ARGUMENT OPTIONAL
-VARIABLE_NAME INNODB_PURGE_STOP_NOW
-SESSION_VALUE NULL
-GLOBAL_VALUE OFF
-GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE OFF
-VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BOOLEAN
-VARIABLE_COMMENT Set purge state to STOP
-NUMERIC_MIN_VALUE NULL
-NUMERIC_MAX_VALUE NULL
-NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST OFF,ON
-READ_ONLY NO
-COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_PURGE_THREADS
SESSION_VALUE NULL
GLOBAL_VALUE 4
diff --git a/mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test b/mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test
deleted file mode 100644
index 0704784dbcc..00000000000
--- a/mysql-test/suite/sys_vars/t/innodb_purge_run_now_basic.test
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# Basic test for innodb_purge_run_now, note it is a duplicate of
-# innodb_purge_stop_now.
-#
-
--- source include/have_innodb.inc
-
-# The config variable is a debug variable for now
--- source include/have_debug.inc
-
---disable_query_log
-# Enable metrics for the counters we are going to use
-set global innodb_monitor_enable = purge_stop_count;
-set global innodb_monitor_enable = purge_resume_count;
---enable_query_log
-
-# Should be 0 for both
-SELECT name, count
- FROM information_schema.innodb_metrics
- WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-
-# Check the default value
-SET @orig = @@global.innodb_purge_run_now;
-SELECT @orig;
-
-# Stop of purge
-SET GLOBAL innodb_purge_stop_now = ON;
-
-# Stop count should now be 1
-SELECT name, count
- FROM information_schema.innodb_metrics
- WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-
-SET GLOBAL innodb_purge_run_now = ON;
-
-# Should always be OFF
-SELECT @@global.innodb_purge_run_now;
-
-# Both should be 1 now
-SELECT name, count
- FROM information_schema.innodb_metrics
- WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-
---disable_query_log
-set global innodb_monitor_disable = all;
-set global innodb_monitor_reset_all = all;
-
--- disable_warnings
-set global innodb_monitor_enable = default;
-set global innodb_monitor_disable = default;
-set global innodb_monitor_reset = default;
-set global innodb_monitor_reset_all = default;
--- enable_warnings
diff --git a/mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test b/mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test
deleted file mode 100644
index 0704784dbcc..00000000000
--- a/mysql-test/suite/sys_vars/t/innodb_purge_stop_now_basic.test
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# Basic test for innodb_purge_run_now, note it is a duplicate of
-# innodb_purge_stop_now.
-#
-
--- source include/have_innodb.inc
-
-# The config variable is a debug variable for now
--- source include/have_debug.inc
-
---disable_query_log
-# Enable metrics for the counters we are going to use
-set global innodb_monitor_enable = purge_stop_count;
-set global innodb_monitor_enable = purge_resume_count;
---enable_query_log
-
-# Should be 0 for both
-SELECT name, count
- FROM information_schema.innodb_metrics
- WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-
-# Check the default value
-SET @orig = @@global.innodb_purge_run_now;
-SELECT @orig;
-
-# Stop of purge
-SET GLOBAL innodb_purge_stop_now = ON;
-
-# Stop count should now be 1
-SELECT name, count
- FROM information_schema.innodb_metrics
- WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-
-SET GLOBAL innodb_purge_run_now = ON;
-
-# Should always be OFF
-SELECT @@global.innodb_purge_run_now;
-
-# Both should be 1 now
-SELECT name, count
- FROM information_schema.innodb_metrics
- WHERE name = 'purge_stop_count' OR name = 'purge_resume_count';
-
---disable_query_log
-set global innodb_monitor_disable = all;
-set global innodb_monitor_reset_all = all;
-
--- disable_warnings
-set global innodb_monitor_enable = default;
-set global innodb_monitor_disable = default;
-set global innodb_monitor_reset = default;
-set global innodb_monitor_reset_all = default;
--- enable_warnings
diff --git a/mysql-test/t/default.test b/mysql-test/t/default.test
index a3b349bb384..7ee3b590a83 100644
--- a/mysql-test/t/default.test
+++ b/mysql-test/t/default.test
@@ -2093,4 +2093,14 @@ create table t1 (col1 int default(-(default(col1))));
--error ER_DATA_OUT_OF_RANGE
create table t1 (col int default (yearweek((exp(710)))));
+--echo #
+--echo # MDEV-13707 Server in ORACLE mode crashes on ALTER with wrong DEFAULT clause
+--echo #
+
+CREATE OR REPLACE TABLE t1(i int);
+--error ER_BAD_FIELD_ERROR
+ALTER TABLE t1 ADD b CHAR(255) DEFAULT `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`;
+DROP TABLE t1;
+
+
--echo # end of 10.2 test
diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test
index 14479d0df1b..a34cede537c 100644
--- a/mysql-test/t/func_json.test
+++ b/mysql-test/t/func_json.test
@@ -354,6 +354,12 @@ select @str, @path, JSON_EXTRACT(@str, @path);
#
select json_array(5,json_query('[1,2]','$'));
+#
+# MDEV-13633 JSON_ARRAY() - bad output with some UTF8 characters.
+#
+
+SELECT JSON_ARRAY('1. ě 2. š 3. č 4. ř 5. ž 6. ý 7. á 8. í 9. é 10. ů 11. ú') AS json_data;
+SELECT JSON_OBJECT("user","Jožko Mrkvičká") as json_data;
--echo #
--echo # Start of 10.3 tests
diff --git a/sql/item.cc b/sql/item.cc
index 4468a01cc6f..1942551f28e 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -1490,9 +1490,9 @@ static inline
void mark_unsupported_func(const char *where, const char *processor_name)
{
char buff[64];
- sprintf(buff, "%s::%s", where ? where: "", processor_name);
+ my_snprintf(buff, sizeof(buff), "%s::%s", where ? where: "", processor_name);
DBUG_ENTER(buff);
- sprintf(buff, "%s returns TRUE: unsupported function", processor_name);
+ my_snprintf(buff, sizeof(buff), "%s returns TRUE: unsupported function", processor_name);
DBUG_PRINT("info", ("%s", buff));
DBUG_VOID_RETURN;
}
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc
index 4585427b442..27d5cea3652 100644
--- a/sql/item_jsonfunc.cc
+++ b/sql/item_jsonfunc.cc
@@ -1474,6 +1474,7 @@ String *Item_func_json_array::val_str(String *str)
uint n_arg;
str->length(0);
+ str->set_charset(collation.collation);
if (str->append("[", 1) ||
((arg_count > 0) && append_json_value(str, args[0], &tmp_val)))
@@ -1798,6 +1799,7 @@ String *Item_func_json_object::val_str(String *str)
uint n_arg;
str->length(0);
+ str->set_charset(collation.collation);
if (str->append("{", 1) ||
(arg_count > 0 &&
diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc
index 1e7b7065b12..2137760e815 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.cc
@@ -2697,14 +2697,13 @@ buf_LRU_print_instance(
const byte* frame;
case BUF_BLOCK_FILE_PAGE:
frame = buf_block_get_frame((buf_block_t*) bpage);
- fprintf(stderr, "\ntype " ULINTPF
- " index id " IB_ID_FMT "\n",
+ fprintf(stderr, "\ntype %u index id " IB_ID_FMT "\n",
fil_page_get_type(frame),
btr_page_get_index_id(frame));
break;
case BUF_BLOCK_ZIP_PAGE:
frame = bpage->zip.data;
- fprintf(stderr, "\ntype " ULINTPF " size " ULINTPF
+ fprintf(stderr, "\ntype %u size " ULINTPF
" index id " IB_ID_FMT "\n",
fil_page_get_type(frame),
bpage->size.physical(),
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 4dadfcf58ae..968c309e673 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -19766,8 +19766,6 @@ innobase_fts_find_ranking(FT_INFO* fts_hdl, uchar*, uint)
#ifdef UNIV_DEBUG
static my_bool innodb_background_drop_list_empty = TRUE;
-static my_bool innodb_purge_run_now = TRUE;
-static my_bool innodb_purge_stop_now = TRUE;
static my_bool innodb_log_checkpoint_now = TRUE;
static my_bool innodb_buf_flush_list_now = TRUE;
static uint innodb_merge_threshold_set_all_debug
@@ -19792,52 +19790,6 @@ wait_background_drop_list_empty(
}
/****************************************************************//**
-Set the purge state to RUN. If purge is disabled then it
-is a no-op. This function is registered as a callback with MySQL. */
-static
-void
-purge_run_now_set(
-/*==============*/
- THD* thd /*!< in: thread handle */
- MY_ATTRIBUTE((unused)),
- struct st_mysql_sys_var* var /*!< in: pointer to system
- variable */
- MY_ATTRIBUTE((unused)),
- void* var_ptr /*!< out: where the formal
- string goes */
- MY_ATTRIBUTE((unused)),
- const void* save) /*!< in: immediate result from
- check function */
-{
- if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
- trx_purge_run();
- }
-}
-
-/****************************************************************//**
-Set the purge state to STOP. If purge is disabled then it
-is a no-op. This function is registered as a callback with MySQL. */
-static
-void
-purge_stop_now_set(
-/*===============*/
- THD* thd /*!< in: thread handle */
- MY_ATTRIBUTE((unused)),
- struct st_mysql_sys_var* var /*!< in: pointer to system
- variable */
- MY_ATTRIBUTE((unused)),
- void* var_ptr /*!< out: where the formal
- string goes */
- MY_ATTRIBUTE((unused)),
- const void* save) /*!< in: immediate result from
- check function */
-{
- if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
- trx_purge_stop();
- }
-}
-
-/****************************************************************//**
Force innodb to checkpoint. */
static
void
@@ -20645,16 +20597,6 @@ static MYSQL_SYSVAR_BOOL(background_drop_list_empty,
"Wait for the background drop list to become empty",
NULL, wait_background_drop_list_empty, FALSE);
-static MYSQL_SYSVAR_BOOL(purge_run_now, innodb_purge_run_now,
- PLUGIN_VAR_OPCMDARG,
- "Set purge state to RUN",
- NULL, purge_run_now_set, FALSE);
-
-static MYSQL_SYSVAR_BOOL(purge_stop_now, innodb_purge_stop_now,
- PLUGIN_VAR_OPCMDARG,
- "Set purge state to STOP",
- NULL, purge_stop_now_set, FALSE);
-
static MYSQL_SYSVAR_BOOL(log_checkpoint_now, innodb_log_checkpoint_now,
PLUGIN_VAR_OPCMDARG,
"Force checkpoint now",
@@ -21928,8 +21870,6 @@ static struct st_mysql_sys_var* innobase_system_variables[]= {
MYSQL_SYSVAR(purge_batch_size),
#ifdef UNIV_DEBUG
MYSQL_SYSVAR(background_drop_list_empty),
- MYSQL_SYSVAR(purge_run_now),
- MYSQL_SYSVAR(purge_stop_now),
MYSQL_SYSVAR(log_checkpoint_now),
MYSQL_SYSVAR(buf_flush_list_now),
MYSQL_SYSVAR(merge_threshold_set_all_debug),
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index 3b53fa28be3..d3336c5f5b5 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -1321,9 +1321,8 @@ fil_page_reset_type(
@param[in] page file page
@return page type */
inline
-ulint
-fil_page_get_type(
- const byte* page)
+uint16_t
+fil_page_get_type(const byte* page)
{
return(mach_read_from_2(page + FIL_PAGE_TYPE));
}
diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h
index 0aca13ac159..9243bcaa717 100644
--- a/storage/innobase/include/page0page.h
+++ b/storage/innobase/include/page0page.h
@@ -1,6 +1,6 @@
/*****************************************************************************
Copyright (c) 1994, 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
the terms of the GNU General Public License as published by the Free Software
@@ -264,7 +264,7 @@ page_set_ssn_id(
/*************************************************************//**
Reads the given header field. */
UNIV_INLINE
-ulint
+uint16_t
page_header_get_field(
/*==================*/
const page_t* page, /*!< in: page */
diff --git a/storage/innobase/include/page0page.ic b/storage/innobase/include/page0page.ic
index 2ad5f26dcc1..db98f2e6558 100644
--- a/storage/innobase/include/page0page.ic
+++ b/storage/innobase/include/page0page.ic
@@ -170,7 +170,7 @@ page_set_ssn_id(
/*************************************************************//**
Reads the given header field. */
UNIV_INLINE
-ulint
+uint16_t
page_header_get_field(
/*==================*/
const page_t* page, /*!< in: page */
@@ -731,7 +731,7 @@ page_dir_set_n_heap(
ulint n_heap) /*!< in: number of records */
{
ut_ad(n_heap < 0x8000);
- ut_ad(!page_zip || n_heap
+ ut_ad(!page_zip || uint16_t(n_heap)
== (page_header_get_field(page, PAGE_N_HEAP) & 0x7fff) + 1);
page_header_set_field(page, page_zip, PAGE_N_HEAP, n_heap
diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h
index a5e3268b7d7..61220d4f533 100644
--- a/storage/innobase/include/rem0rec.h
+++ b/storage/innobase/include/rem0rec.h
@@ -777,19 +777,42 @@ rec_copy(
const rec_t* rec,
const ulint* offsets);
-/**********************************************************//**
-Determines the size of a data tuple prefix in a temporary file.
-@return total size */
+/** Determine the size of a data tuple prefix in a temporary file.
+@param[in] index clustered or secondary index
+@param[in] fields data fields
+@param[in] n_fields number of data fields
+@param[out] extra record header size
+@return total size, in bytes */
ulint
rec_get_converted_size_temp(
-/*========================*/
- const dict_index_t* index, /*!< in: record descriptor */
- const dfield_t* fields, /*!< in: array of data fields */
- ulint n_fields,/*!< in: number of data fields */
- const dtuple_t* v_entry,/*!< in: dtuple contains virtual column
- data */
- ulint* extra) /*!< out: extra size */
- MY_ATTRIBUTE((warn_unused_result));
+ const dict_index_t* index,
+ const dfield_t* fields,
+ ulint n_fields,
+ ulint* extra)
+ MY_ATTRIBUTE((warn_unused_result, nonnull(1,2)));
+
+/** Determine the converted size of virtual column data in a temporary file.
+@see rec_convert_dtuple_to_temp_v()
+@param[in] index clustered index
+@param[in] v clustered index record augmented with the values
+ of virtual columns
+@return size in bytes */
+ulint
+rec_get_converted_size_temp_v(const dict_index_t* index, const dtuple_t* v)
+ MY_ATTRIBUTE((warn_unused_result, nonnull));
+
+/** Write indexed virtual column data into a temporary file.
+@see rec_get_converted_size_temp_v()
+@param[out] rec serialized record
+@param[in] index clustered index
+@param[in] v_entry clustered index record augmented with the values
+ of virtual columns */
+void
+rec_convert_dtuple_to_temp_v(
+ byte* rec,
+ const dict_index_t* index,
+ const dtuple_t* v_entry)
+ MY_ATTRIBUTE((nonnull));
/******************************************************//**
Determine the offset to each field in temporary file.
@@ -812,10 +835,7 @@ rec_convert_dtuple_to_temp(
rec_t* rec, /*!< out: record */
const dict_index_t* index, /*!< in: record descriptor */
const dfield_t* fields, /*!< in: array of data fields */
- ulint n_fields, /*!< in: number of fields */
- const dtuple_t* v_entry); /*!< in: dtuple contains
- virtual column data */
-
+ ulint n_fields); /*!< in: number of fields */
/**************************************************************//**
Copies the first n fields of a physical record to a new physical record in
diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc
index 3765f8112a1..b2c27acfbaa 100644
--- a/storage/innobase/page/page0page.cc
+++ b/storage/innobase/page/page0page.cc
@@ -2117,7 +2117,7 @@ page_simple_validate_old(
goto func_exit;
}
- if (UNIV_UNLIKELY(page_header_get_field(page, PAGE_N_RECS)
+ if (UNIV_UNLIKELY(ulint(page_header_get_field(page, PAGE_N_RECS))
+ PAGE_HEAP_NO_USER_LOW
!= count + 1)) {
ib::error() << "n recs wrong "
@@ -2308,7 +2308,7 @@ page_simple_validate_new(
goto func_exit;
}
- if (UNIV_UNLIKELY(page_header_get_field(page, PAGE_N_RECS)
+ if (UNIV_UNLIKELY(ulint(page_header_get_field(page, PAGE_N_RECS))
+ PAGE_HEAP_NO_USER_LOW
!= count + 1)) {
ib::error() << "n recs wrong "
@@ -2615,7 +2615,7 @@ n_owned_zero:
goto func_exit;
}
- if (UNIV_UNLIKELY(page_header_get_field(page, PAGE_N_RECS)
+ if (UNIV_UNLIKELY(ulint(page_header_get_field(page, PAGE_N_RECS))
+ PAGE_HEAP_NO_USER_LOW
!= count + 1)) {
ib::error() << "n recs wrong "
diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc
index 4ad4730f37d..66e8ccec178 100644
--- a/storage/innobase/rem/rem0rec.cc
+++ b/storage/innobase/rem/rem0rec.cc
@@ -786,8 +786,6 @@ rec_get_converted_size_comp_prefix_low(
it does not */
const dfield_t* fields, /*!< in: array of data fields */
ulint n_fields,/*!< in: number of data fields */
- const dtuple_t* v_entry,/*!< in: dtuple contains virtual column
- data */
ulint* extra, /*!< out: extra size */
bool temp) /*!< in: whether this is a
temporary file record */
@@ -795,20 +793,15 @@ rec_get_converted_size_comp_prefix_low(
ulint extra_size;
ulint data_size;
ulint i;
- ulint n_null = (n_fields > 0) ? index->n_nullable : 0;
- ulint n_v_fields;
+ ut_ad(n_fields > 0);
ut_ad(n_fields <= dict_index_get_n_fields(index));
ut_ad(!temp || extra);
- /* At the time being, only temp file record could possible
- store virtual columns */
- ut_ad(!v_entry || (dict_index_is_clust(index) && temp));
- n_v_fields = v_entry ? dtuple_get_n_v_fields(v_entry) : 0;
+ ut_d(ulint n_null = index->n_nullable);
extra_size = temp
- ? UT_BITS_IN_BYTES(n_null)
- : REC_N_NEW_EXTRA_BYTES
- + UT_BITS_IN_BYTES(n_null);
+ ? UT_BITS_IN_BYTES(index->n_nullable)
+ : REC_N_NEW_EXTRA_BYTES + UT_BITS_IN_BYTES(index->n_nullable);
data_size = 0;
if (temp && dict_table_is_comp(index->table)) {
@@ -910,42 +903,50 @@ rec_get_converted_size_comp_prefix_low(
*extra = extra_size;
}
- /* Log virtual columns */
- if (n_v_fields != 0) {
- /* length marker */
- data_size += 2;
-
- for (i = 0; i < n_v_fields; i++) {
- dfield_t* vfield;
- ulint flen;
-
- const dict_v_col_t* col
- = dict_table_get_nth_v_col(index->table, i);
-
- /* Only those indexed needs to be logged */
- if (col->m_col.ord_part) {
- data_size += mach_get_compressed_size(
- i + REC_MAX_N_FIELDS);
- vfield = dtuple_get_nth_v_field(
- v_entry, col->v_pos);
-
- flen = vfield->len;
-
- if (flen != UNIV_SQL_NULL) {
- flen = ut_min(
- flen,
- static_cast<ulint>(
- DICT_MAX_FIELD_LEN_BY_FORMAT(
- index->table)));
- data_size += flen;
- }
-
- data_size += mach_get_compressed_size(flen);
- }
+ return(extra_size + data_size);
+}
+
+/** Determine the converted size of virtual column data in a temporary file.
+@see rec_convert_dtuple_to_temp_v()
+@param[in] index clustered index
+@param[in] v clustered index record augmented with the values
+ of virtual columns
+@return size in bytes */
+ulint
+rec_get_converted_size_temp_v(const dict_index_t* index, const dtuple_t* v)
+{
+ ut_ad(dict_index_is_clust(index));
+
+ /* length marker */
+ ulint data_size = 2;
+ const ulint n_v_fields = dtuple_get_n_v_fields(v);
+
+ for (ulint i = 0; i < n_v_fields; i++) {
+ const dict_v_col_t* col
+ = dict_table_get_nth_v_col(index->table, i);
+
+ /* Only those indexed needs to be logged */
+ if (!col->m_col.ord_part) {
+ continue;
+ }
+
+ data_size += mach_get_compressed_size(i + REC_MAX_N_FIELDS);
+ const dfield_t* vfield = dtuple_get_nth_v_field(v, col->v_pos);
+ ulint flen = vfield->len;
+
+ if (flen != UNIV_SQL_NULL) {
+ flen = ut_min(
+ flen,
+ static_cast<ulint>(
+ DICT_MAX_FIELD_LEN_BY_FORMAT(
+ index->table)));
+ data_size += flen;
}
+
+ data_size += mach_get_compressed_size(flen);
}
- return(extra_size + data_size);
+ return(data_size);
}
/**********************************************************//**
@@ -961,7 +962,7 @@ rec_get_converted_size_comp_prefix(
{
ut_ad(dict_table_is_comp(index->table));
return(rec_get_converted_size_comp_prefix_low(
- index, fields, n_fields, NULL, extra, false));
+ index, fields, n_fields, extra, false));
}
/**********************************************************//**
@@ -1007,7 +1008,7 @@ rec_get_converted_size_comp(
}
return(size + rec_get_converted_size_comp_prefix_low(
- index, fields, n_fields, NULL, extra, false));
+ index, fields, n_fields, extra, false));
}
/***********************************************************//**
@@ -1190,8 +1191,6 @@ rec_convert_dtuple_to_rec_comp(
const dict_index_t* index, /*!< in: record descriptor */
const dfield_t* fields, /*!< in: array of data fields */
ulint n_fields,/*!< in: number of data fields */
- const dtuple_t* v_entry,/*!< in: dtuple contains
- virtual column data */
ulint status, /*!< in: status bits of the record */
bool temp) /*!< in: whether to use the
format for temporary files in
@@ -1207,10 +1206,11 @@ rec_convert_dtuple_to_rec_comp(
ulint n_node_ptr_field;
ulint fixed_len;
ulint null_mask = 1;
- ulint n_null;
- ulint num_v = v_entry ? dtuple_get_n_v_fields(v_entry) : 0;
+ ut_ad(n_fields > 0);
ut_ad(temp || dict_table_is_comp(index->table));
+ ulint n_null = index->n_nullable;
+ const ulint n_null_bytes = UT_BITS_IN_BYTES(n_null);
if (temp) {
ut_ad(status == REC_STATUS_ORDINARY);
@@ -1223,8 +1223,6 @@ rec_convert_dtuple_to_rec_comp(
temp = false;
}
} else {
- ut_ad(v_entry == NULL);
- ut_ad(num_v == 0);
nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1);
switch (UNIV_EXPECT(status, REC_STATUS_ORDINARY)) {
@@ -1250,13 +1248,9 @@ rec_convert_dtuple_to_rec_comp(
}
end = rec;
-
- if (n_fields != 0) {
- n_null = index->n_nullable;
- lens = nulls - UT_BITS_IN_BYTES(n_null);
- /* clear the SQL-null flags */
- memset(lens + 1, 0, nulls - lens);
- }
+ /* clear the SQL-null flags */
+ lens = nulls - n_null_bytes;
+ memset(lens + 1, 0, nulls - lens);
/* Store the data and the offsets */
@@ -1351,13 +1345,25 @@ rec_convert_dtuple_to_rec_comp(
end += len;
}
}
+}
- if (!num_v) {
- return;
- }
+/** Write indexed virtual column data into a temporary file.
+@see rec_get_converted_size_temp_v()
+@param[out] rec serialized record
+@param[in] index clustered index
+@param[in] v_entry clustered index record augmented with the values
+ of virtual columns */
+void
+rec_convert_dtuple_to_temp_v(
+ byte* rec,
+ const dict_index_t* index,
+ const dtuple_t* v_entry)
+{
+ ut_ad(dict_index_is_clust(index));
+ const ulint num_v = dtuple_get_n_v_fields(v_entry);
/* reserve 2 bytes for writing length */
- byte* ptr = end;
+ byte* ptr = rec;
ptr += 2;
/* Now log information on indexed virtual columns */
@@ -1400,7 +1406,7 @@ rec_convert_dtuple_to_rec_comp(
}
}
- mach_write_to_2(end, ptr - end);
+ mach_write_to_2(rec, ptr - rec);
}
/*********************************************************//**
@@ -1426,8 +1432,7 @@ rec_convert_dtuple_to_rec_new(
rec = buf + extra_size;
rec_convert_dtuple_to_rec_comp(
- rec, index, dtuple->fields, dtuple->n_fields, NULL,
- status, false);
+ rec, index, dtuple->fields, dtuple->n_fields, status, false);
/* Set the info bits of the record */
rec_set_info_and_status_bits(rec, dtuple_get_info_bits(dtuple));
@@ -1490,21 +1495,21 @@ rec_convert_dtuple_to_rec(
return(rec);
}
-/**********************************************************//**
-Determines the size of a data tuple prefix in ROW_FORMAT=COMPACT.
-@return total size */
+/** Determine the size of a data tuple prefix in a temporary file.
+@param[in] index clustered or secondary index
+@param[in] fields data fields
+@param[in] n_fields number of data fields
+@param[out] extra record header size
+@return total size, in bytes */
ulint
rec_get_converted_size_temp(
-/*========================*/
- const dict_index_t* index, /*!< in: record descriptor */
- const dfield_t* fields, /*!< in: array of data fields */
- ulint n_fields,/*!< in: number of data fields */
- const dtuple_t* v_entry,/*!< in: dtuple contains virtual column
- data */
- ulint* extra) /*!< out: extra size */
+ const dict_index_t* index,
+ const dfield_t* fields,
+ ulint n_fields,
+ ulint* extra)
{
return(rec_get_converted_size_comp_prefix_low(
- index, fields, n_fields, v_entry, extra, true));
+ index, fields, n_fields, extra, true));
}
/******************************************************//**
@@ -1530,11 +1535,9 @@ rec_convert_dtuple_to_temp(
rec_t* rec, /*!< out: record */
const dict_index_t* index, /*!< in: record descriptor */
const dfield_t* fields, /*!< in: array of data fields */
- ulint n_fields, /*!< in: number of fields */
- const dtuple_t* v_entry) /*!< in: dtuple contains
- virtual column data */
+ ulint n_fields) /*!< in: number of fields */
{
- rec_convert_dtuple_to_rec_comp(rec, index, fields, n_fields, v_entry,
+ rec_convert_dtuple_to_rec_comp(rec, index, fields, n_fields,
REC_STATUS_ORDINARY, true);
}
diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc
index 31a5402dc15..9e946757df3 100644
--- a/storage/innobase/row/row0log.cc
+++ b/storage/innobase/row/row0log.cc
@@ -302,7 +302,7 @@ row_log_online_op(
extra_size+1 (and reserve 0 as the end-of-chunk marker). */
size = rec_get_converted_size_temp(
- index, tuple->fields, tuple->n_fields, NULL, &extra_size);
+ index, tuple->fields, tuple->n_fields, &extra_size);
ut_ad(size >= extra_size);
ut_ad(size <= sizeof log->tail.buf);
@@ -350,7 +350,7 @@ row_log_online_op(
}
rec_convert_dtuple_to_temp(
- b + extra_size, index, tuple->fields, tuple->n_fields, NULL);
+ b + extra_size, index, tuple->fields, tuple->n_fields);
b += size;
if (mrec_size >= avail_size) {
@@ -641,7 +641,7 @@ row_log_table_delete(
ut_ad(DATA_ROLL_PTR_LEN == dtuple_get_nth_field(
old_pk, old_pk->n_fields - 1)->len);
old_pk_size = rec_get_converted_size_temp(
- new_index, old_pk->fields, old_pk->n_fields, NULL,
+ new_index, old_pk->fields, old_pk->n_fields,
&old_pk_extra_size);
ut_ad(old_pk_extra_size < 0x100);
@@ -671,9 +671,7 @@ row_log_table_delete(
/* Check if we need to log virtual column data */
if (ventry->n_v_fields > 0) {
- ulint v_extra;
- mrec_size += rec_get_converted_size_temp(
- new_index, NULL, 0, ventry, &v_extra);
+ mrec_size += rec_get_converted_size_temp_v(new_index, ventry);
}
if (byte* b = row_log_table_open(index->online_log,
@@ -687,7 +685,7 @@ row_log_table_delete(
rec_convert_dtuple_to_temp(
b + old_pk_extra_size, new_index,
- old_pk->fields, old_pk->n_fields, NULL);
+ old_pk->fields, old_pk->n_fields);
b += old_pk_size;
@@ -720,8 +718,7 @@ row_log_table_delete(
/* log virtual columns */
if (ventry->n_v_fields > 0) {
- rec_convert_dtuple_to_temp(
- b, new_index, NULL, 0, ventry);
+ rec_convert_dtuple_to_temp_v(b, new_index, ventry);
b += mach_read_from_2(b);
}
@@ -812,15 +809,16 @@ row_log_table_low_redundant(
}
size = rec_get_converted_size_temp(
- index, tuple->fields, tuple->n_fields, ventry, &extra_size);
+ index, tuple->fields, tuple->n_fields, &extra_size);
+ ulint v_size = ventry
+ ? rec_get_converted_size_temp_v(index, ventry) : 0;
- mrec_size = ROW_LOG_HEADER_SIZE + size + (extra_size >= 0x80);
+ mrec_size = ROW_LOG_HEADER_SIZE + size + v_size + (extra_size >= 0x80);
if (num_v) {
if (o_ventry) {
- ulint v_extra = 0;
- mrec_size += rec_get_converted_size_temp(
- index, NULL, 0, o_ventry, &v_extra);
+ mrec_size += rec_get_converted_size_temp_v(
+ index, o_ventry);
}
} else if (index->table->n_v_cols) {
mrec_size += 2;
@@ -839,7 +837,7 @@ row_log_table_low_redundant(
old_pk_size = rec_get_converted_size_temp(
new_index, old_pk->fields, old_pk->n_fields,
- ventry, &old_pk_extra_size);
+ &old_pk_extra_size);
ut_ad(old_pk_extra_size < 0x100);
mrec_size += 1/*old_pk_extra_size*/ + old_pk_size;
}
@@ -853,8 +851,7 @@ row_log_table_low_redundant(
rec_convert_dtuple_to_temp(
b + old_pk_extra_size, new_index,
- old_pk->fields, old_pk->n_fields,
- ventry);
+ old_pk->fields, old_pk->n_fields);
b += old_pk_size;
}
@@ -867,14 +864,17 @@ row_log_table_low_redundant(
}
rec_convert_dtuple_to_temp(
- b + extra_size, index, tuple->fields, tuple->n_fields,
- ventry);
+ b + extra_size, index, tuple->fields, tuple->n_fields);
b += size;
+ if (ventry) {
+ rec_convert_dtuple_to_temp_v(b, new_index, ventry);
+ b += v_size;
+ }
if (num_v) {
if (o_ventry) {
- rec_convert_dtuple_to_temp(
- b, new_index, NULL, 0, o_ventry);
+ rec_convert_dtuple_to_temp_v(
+ b, new_index, o_ventry);
b += mach_read_from_2(b);
}
} else if (index->table->n_v_cols) {
@@ -964,13 +964,11 @@ row_log_table_low(
+ (extra_size >= 0x80) + rec_offs_size(offsets) - omit_size;
if (ventry && ventry->n_v_fields > 0) {
- ulint v_extra = 0;
- mrec_size += rec_get_converted_size_temp(
- new_index, NULL, 0, ventry, &v_extra);
+ mrec_size += rec_get_converted_size_temp_v(new_index, ventry);
if (o_ventry) {
- mrec_size += rec_get_converted_size_temp(
- new_index, NULL, 0, o_ventry, &v_extra);
+ mrec_size += rec_get_converted_size_temp_v(
+ new_index, o_ventry);
}
} else if (index->table->n_v_cols) {
/* Always leave 2 bytes length marker for virtual column
@@ -992,7 +990,7 @@ row_log_table_low(
old_pk_size = rec_get_converted_size_temp(
new_index, old_pk->fields, old_pk->n_fields,
- NULL, &old_pk_extra_size);
+ &old_pk_extra_size);
ut_ad(old_pk_extra_size < 0x100);
mrec_size += 1/*old_pk_extra_size*/ + old_pk_size;
}
@@ -1006,8 +1004,7 @@ row_log_table_low(
rec_convert_dtuple_to_temp(
b + old_pk_extra_size, new_index,
- old_pk->fields, old_pk->n_fields,
- NULL);
+ old_pk->fields, old_pk->n_fields);
b += old_pk_size;
}
@@ -1025,13 +1022,12 @@ row_log_table_low(
b += rec_offs_data_size(offsets);
if (ventry && ventry->n_v_fields > 0) {
- rec_convert_dtuple_to_temp(
- b, new_index, NULL, 0, ventry);
+ rec_convert_dtuple_to_temp_v(b, new_index, ventry);
b += mach_read_from_2(b);
if (o_ventry) {
- rec_convert_dtuple_to_temp(
- b, new_index, NULL, 0, o_ventry);
+ rec_convert_dtuple_to_temp_v(
+ b, new_index, o_ventry);
b += mach_read_from_2(b);
}
} else if (index->table->n_v_cols) {
diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc
index cba453ced24..85fac6c0bba 100644
--- a/storage/innobase/row/row0merge.cc
+++ b/storage/innobase/row/row0merge.cc
@@ -407,7 +407,7 @@ row_merge_buf_encode(
ulint extra_size;
size = rec_get_converted_size_temp(
- index, entry->fields, n_fields, NULL, &extra_size);
+ index, entry->fields, n_fields, &extra_size);
ut_ad(size >= extra_size);
/* Encode extra_size + 1 */
@@ -420,7 +420,7 @@ row_merge_buf_encode(
}
rec_convert_dtuple_to_temp(*b + extra_size, index,
- entry->fields, n_fields, NULL);
+ entry->fields, n_fields);
*b += size;
}
@@ -893,7 +893,7 @@ row_merge_buf_add(
ulint extra;
size = rec_get_converted_size_temp(
- index, entry->fields, n_fields, NULL, &extra);
+ index, entry->fields, n_fields, &extra);
ut_ad(data_size + extra_size == size);
ut_ad(extra_size == extra);