summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/os/Windows.cmake12
-rw-r--r--mysql-test/suite/innodb/r/blob_cmp_empty.result19
-rw-r--r--mysql-test/suite/innodb/t/blob_cmp_empty.test26
-rw-r--r--mysql-test/suite/innodb_gis/disabled.def1
-rw-r--r--storage/innobase/row/row0sel.cc8
-rw-r--r--storage/perfschema/my_thread.h4
6 files changed, 69 insertions, 1 deletions
diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake
index da75c73d585..f951eed7651 100644
--- a/cmake/os/Windows.cmake
+++ b/cmake/os/Windows.cmake
@@ -177,8 +177,20 @@ IF(MSVC)
IF((NOT "${${flag}}" MATCHES "/Zi") AND (NOT "${${flag}}" MATCHES "/Z7"))
STRING(APPEND ${flag} " /Zi")
ENDIF()
+ # Remove inlining flags, added by CMake, if any.
+ # Compiler default is fine.
+ STRING(REGEX REPLACE "/Ob[0-3]" "" "${flag}" "${${flag}}" )
ENDFOREACH()
+ # Allow to overwrite the inlining flag
+ SET(MSVC_INLINE "" CACHE STRING
+ "MSVC Inlining option, either empty, or one of /Ob0,/Ob1,/Ob2,/Ob3")
+ IF(MSVC_INLINE MATCHES "/Ob[0-3]")
+ ADD_COMPILE_OPTIONS(${MSVC_INLINE})
+ ELSEIF(NOT(MSVC_INLINE STREQUAL ""))
+ MESSAGE(FATAL_ERROR "Invalid option for MSVC_INLINE")
+ ENDIF()
+
IF(WITH_ASAN OR WITH_UBSAN)
# Workaround something Linux specific
SET(SECURITY_HARDENED 0 CACHE INTERNAL "" FORCE)
diff --git a/mysql-test/suite/innodb/r/blob_cmp_empty.result b/mysql-test/suite/innodb/r/blob_cmp_empty.result
new file mode 100644
index 00000000000..24ae8e1c01e
--- /dev/null
+++ b/mysql-test/suite/innodb/r/blob_cmp_empty.result
@@ -0,0 +1,19 @@
+connect prevent_purge,localhost,root,,;
+start transaction with consistent snapshot;
+connection default;
+SET @fill_amount = (@@innodb_page_size / 2 ) + 1;
+CREATE TABLE t1 (col_text TEXT NOT NULL, KEY (col_text(9))) ENGINE=InnoDB;
+INSERT INTO t1 (col_text) VALUES (REPEAT('x', @fill_amount));
+UPDATE t1 SET col_text='';
+UPDATE t1 SET col_text=REPEAT('y', @fill_amount);
+connect con1,localhost,root,,;
+SET @fill_amount = (@@innodb_page_size / 2 ) + 1;
+BEGIN;
+INSERT INTO t1 (col_text) VALUES (REPEAT('z', @fill_amount));
+connection default;
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+disconnect con1;
+disconnect prevent_purge;
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/blob_cmp_empty.test b/mysql-test/suite/innodb/t/blob_cmp_empty.test
new file mode 100644
index 00000000000..f41ac79b16f
--- /dev/null
+++ b/mysql-test/suite/innodb/t/blob_cmp_empty.test
@@ -0,0 +1,26 @@
+--source include/innodb_row_format.inc
+--source include/count_sessions.inc
+--connect(prevent_purge,localhost,root,,)
+start transaction with consistent snapshot;
+
+--connection default
+SET @fill_amount = (@@innodb_page_size / 2 ) + 1;
+CREATE TABLE t1 (col_text TEXT NOT NULL, KEY (col_text(9))) ENGINE=InnoDB;
+
+INSERT INTO t1 (col_text) VALUES (REPEAT('x', @fill_amount));
+UPDATE t1 SET col_text='';
+UPDATE t1 SET col_text=REPEAT('y', @fill_amount);
+
+--connect(con1,localhost,root,,)
+SET @fill_amount = (@@innodb_page_size / 2 ) + 1;
+BEGIN;
+INSERT INTO t1 (col_text) VALUES (REPEAT('z', @fill_amount));
+
+--connection default
+# If the bug is not fixed, CHECK TABLE will complain about wrong secondary index
+# rows count
+CHECK TABLE t1;
+--disconnect con1
+--disconnect prevent_purge
+DROP TABLE t1;
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/suite/innodb_gis/disabled.def b/mysql-test/suite/innodb_gis/disabled.def
index bf500c1cb93..2d4d3686dd1 100644
--- a/mysql-test/suite/innodb_gis/disabled.def
+++ b/mysql-test/suite/innodb_gis/disabled.def
@@ -12,3 +12,4 @@
rtree_concurrent_srch : MDEV-15284 COUNT(*) mismatch
rtree_recovery : MDEV-15284 COUNT(*) mismatch
+rtree_compress2 : MDEV-16269 CHECK TABLE reports wrong count
diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc
index ab4da856d1d..c3d3411c3c3 100644
--- a/storage/innobase/row/row0sel.cc
+++ b/storage/innobase/row/row0sel.cc
@@ -357,11 +357,16 @@ row_sel_sec_rec_is_for_clust_rec(
}
len = clust_len;
+ ulint prefix_len = ifield->prefix_len;
if (rec_offs_nth_extern(clust_offs, clust_pos)) {
+ /* BLOB can contain prefix. */
len -= BTR_EXTERN_FIELD_REF_SIZE;
+ if (!len) {
+ goto compare_blobs;
+ }
}
- if (ulint prefix_len = ifield->prefix_len) {
+ if (prefix_len) {
len = dtype_get_at_most_n_mbchars(
col->prtype, col->mbminlen,
col->mbmaxlen, prefix_len, len,
@@ -374,6 +379,7 @@ row_sel_sec_rec_is_for_clust_rec(
check_for_blob:
if (rec_offs_nth_extern(clust_offs,
clust_pos)) {
+compare_blobs:
if (!row_sel_sec_rec_is_for_blob(
col->mtype, col->prtype,
col->mbminlen,
diff --git a/storage/perfschema/my_thread.h b/storage/perfschema/my_thread.h
index 5ddea9b1303..c1a079ce34d 100644
--- a/storage/perfschema/my_thread.h
+++ b/storage/perfschema/my_thread.h
@@ -14,6 +14,10 @@
#include <pthread_np.h>
#endif
+#if defined(HAVE_INTEGER_PTHREAD_SELF)
+#include <cstdint>
+#endif
+
typedef pthread_key_t thread_local_key_t;
typedef pthread_t my_thread_handle;
typedef pthread_attr_t my_thread_attr_t;