diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-07-03 10:25:38 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-07-03 10:25:38 +0300 |
commit | 186a998b5b932851d64666c92e3062c9e997e77b (patch) | |
tree | 606b064a57936b2e6f10e0b396ed6d5165a6d419 | |
parent | c3289d27eef39a47fed2ce1ff239013ed6870f39 (diff) | |
parent | 400cf017152c732387c89deaa082b43c8fb42d71 (diff) | |
download | mariadb-git-186a998b5b932851d64666c92e3062c9e997e77b.tar.gz |
Merge 10.2 into 10.3
-rw-r--r-- | cmake/os/Windows.cmake | 2 | ||||
-rw-r--r-- | mysql-test/main/check_constraint.result | 37 | ||||
-rw-r--r-- | mysql-test/main/check_constraint.test | 28 | ||||
-rw-r--r-- | mysql-test/main/constraints.result | 2 | ||||
-rw-r--r-- | mysql-test/main/type_json.result | 2 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/suite.opt | 2 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/unsupported_redo.result | 3 | ||||
-rw-r--r-- | mysql-test/suite/mariabackup/unsupported_redo.test | 1 | ||||
-rw-r--r-- | sql/table.cc | 12 | ||||
-rw-r--r-- | storage/innobase/os/os0file.cc | 98 |
10 files changed, 142 insertions, 45 deletions
diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake index da7dd3180a3..0caa67b20ab 100644 --- a/cmake/os/Windows.cmake +++ b/cmake/os/Windows.cmake @@ -47,7 +47,7 @@ IF(CMAKE_C_COMPILER MATCHES "icl") ENDIF() ADD_DEFINITIONS(-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE) -ADD_DEFINITIONS(-D_WIN32_WINNT=0x0600) +ADD_DEFINITIONS(-D_WIN32_WINNT=0x0A00) # We do not want the windows.h macros min/max ADD_DEFINITIONS(-DNOMINMAX) # Speed up build process excluding unused header files diff --git a/mysql-test/main/check_constraint.result b/mysql-test/main/check_constraint.result index 9a32e6f12bc..9a228f9ccc7 100644 --- a/mysql-test/main/check_constraint.result +++ b/mysql-test/main/check_constraint.result @@ -10,9 +10,9 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 insert into t1 values (100,100); insert into t1 values (1,1); -ERROR 23000: CONSTRAINT `a` failed for `test`.`t1` +ERROR 23000: CONSTRAINT `t1.a` failed for `test`.`t1` insert into t1 values (20,1); -ERROR 23000: CONSTRAINT `b` failed for `test`.`t1` +ERROR 23000: CONSTRAINT `t1.b` failed for `test`.`t1` insert into t1 values (20,30); ERROR 23000: CONSTRAINT `min` failed for `test`.`t1` insert into t1 values (500,500); @@ -60,7 +60,7 @@ t1 CREATE TABLE `t1` ( CONSTRAINT `CONSTRAINT_1` CHECK (`a` + `b` + `c` < 500) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 insert into t1 values(105,105,105); -ERROR 23000: CONSTRAINT `c` failed for `test`.`t1` +ERROR 23000: CONSTRAINT `t1.c` failed for `test`.`t1` insert into t1 values(249,249,9); ERROR 23000: CONSTRAINT `CONSTRAINT_1` failed for `test`.`t1` insert into t1 values(105,105,9); @@ -145,7 +145,7 @@ ERROR HY000: Function or expression '@b' cannot be used in the CHECK clause of ` create table t1 (a int check (a = 1)); insert t1 values (1); insert t1 values (2); -ERROR 23000: CONSTRAINT `a` failed for `test`.`t1` +ERROR 23000: CONSTRAINT `t1.a` failed for `test`.`t1` insert t1 values (NULL); select * from t1; a @@ -165,13 +165,13 @@ ERROR 22007: Truncated incorrect DOUBLE value: 'Ken' SHOW WARNINGS; Level Code Message Error 1292 Truncated incorrect DOUBLE value: 'Ken' -Error 4025 CONSTRAINT `FirstName` failed for `test`.`t1` +Error 4025 CONSTRAINT `t1.FirstName` failed for `test`.`t1` INSERT INTO t1 VALUES (NULL, 'Ken'),(NULL, 'Brian'); ERROR 22007: Truncated incorrect DOUBLE value: 'Ken' SHOW WARNINGS; Level Code Message Error 1292 Truncated incorrect DOUBLE value: 'Ken' -Error 4025 CONSTRAINT `FirstName` failed for `test`.`t1` +Error 4025 CONSTRAINT `t1.FirstName` failed for `test`.`t1` INSERT IGNORE INTO t1 VALUES (NULL, 'Ken'); Warnings: Warning 1292 Truncated incorrect DOUBLE value: 'Ken' @@ -197,3 +197,28 @@ EmployeeID FirstName 5 Ken 6 Brian drop table t1; +# +# MDEV-16630: Ambiguous error message when check constraint +# matches table name +# +use test; +drop table if exists t; +create table t(a int, b int check(b>0), +constraint b check(a<b), constraint a check(a>0), +constraint x check (a>10)); +show create table t; +Table Create Table +t CREATE TABLE `t` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL CHECK (`b` > 0), + CONSTRAINT `b` CHECK (`a` < `b`), + CONSTRAINT `a` CHECK (`a` > 0), + CONSTRAINT `x` CHECK (`a` > 10) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +# Field constraint 'b' will fail +insert into t values (-1, 0); +ERROR 23000: CONSTRAINT `t.b` failed for `test`.`t` +# Table constraint 'b' will fail +insert into t values (1,1); +ERROR 23000: CONSTRAINT `b` failed for `test`.`t` +drop table t; diff --git a/mysql-test/main/check_constraint.test b/mysql-test/main/check_constraint.test index 02081071bd4..be06c3ec579 100644 --- a/mysql-test/main/check_constraint.test +++ b/mysql-test/main/check_constraint.test @@ -135,3 +135,31 @@ INSERT INTO t1 VALUES (NULL, 'Ken'),(NULL, 'Brian'); set sql_mode=default; select * from t1; drop table t1; + +--echo # +--echo # MDEV-16630: Ambiguous error message when check constraint +--echo # matches table name +--echo # + +use test; +--disable_warnings +drop table if exists t; +--enable_warnings + +create table t(a int, b int check(b>0), + constraint b check(a<b), constraint a check(a>0), + constraint x check (a>10)); + +show create table t; + +# Generate error when field constraint 'b' is violated +--echo # Field constraint 'b' will fail +--error ER_CONSTRAINT_FAILED +insert into t values (-1, 0); + +# Generate error when table constraint 'b' is violated. +--echo # Table constraint 'b' will fail +--error ER_CONSTRAINT_FAILED +insert into t values (1,1); + +drop table t; diff --git a/mysql-test/main/constraints.result b/mysql-test/main/constraints.result index fe9398ea8ce..57cfbfb3d37 100644 --- a/mysql-test/main/constraints.result +++ b/mysql-test/main/constraints.result @@ -7,7 +7,7 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 insert into t1 values (1); insert into t1 values (0); -ERROR 23000: CONSTRAINT `a` failed for `test`.`t1` +ERROR 23000: CONSTRAINT `t1.a` failed for `test`.`t1` drop table t1; create table t1 (a int, b int, check (a>b)); show create table t1; diff --git a/mysql-test/main/type_json.result b/mysql-test/main/type_json.result index 2c1fdbe2b95..0045847097b 100644 --- a/mysql-test/main/type_json.result +++ b/mysql-test/main/type_json.result @@ -20,7 +20,7 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 insert t1 values ('[]'); insert t1 values ('a'); -ERROR 23000: CONSTRAINT `a` failed for `test`.`t1` +ERROR 23000: CONSTRAINT `t1.a` failed for `test`.`t1` set timestamp=unix_timestamp('2010:11:12 13:14:15'); create or replace table t1(a json default(json_object('now', now()))); show create table t1; diff --git a/mysql-test/suite/mariabackup/suite.opt b/mysql-test/suite/mariabackup/suite.opt index 3b5cc4f4c45..de3637814b2 100644 --- a/mysql-test/suite/mariabackup/suite.opt +++ b/mysql-test/suite/mariabackup/suite.opt @@ -1 +1 @@ ---innodb --loose-changed_page_bitmaps --innodb-sys-tables +--innodb --loose-changed_page_bitmaps --innodb-sys-tables --innodb-flush-log-at-trx-commit=2 diff --git a/mysql-test/suite/mariabackup/unsupported_redo.result b/mysql-test/suite/mariabackup/unsupported_redo.result index 543e564d8a8..a1f95c099cd 100644 --- a/mysql-test/suite/mariabackup/unsupported_redo.result +++ b/mysql-test/suite/mariabackup/unsupported_redo.result @@ -5,9 +5,6 @@ call mtr.add_suppression("InnoDB: If you are installing InnoDB, remember that yo call mtr.add_suppression("InnoDB: Ignoring tablespace for `test`\\.`t21` because it could not be opened"); call mtr.add_suppression("InnoDB: Cannot open datafile for read-only: "); call mtr.add_suppression("Table .* in the InnoDB data dictionary has tablespace id .*, but tablespace with that id or name does not exist"); -SELECT @@GLOBAL.innodb_flush_log_at_trx_commit; -@@GLOBAL.innodb_flush_log_at_trx_commit -1 CREATE TABLE t1(i INT PRIMARY KEY auto_increment, a int) ENGINE INNODB; ALTER TABLE t1 FORCE, ALGORITHM=INPLACE; # Fails during full backup diff --git a/mysql-test/suite/mariabackup/unsupported_redo.test b/mysql-test/suite/mariabackup/unsupported_redo.test index 9d54c5bbe87..319ee2c7571 100644 --- a/mysql-test/suite/mariabackup/unsupported_redo.test +++ b/mysql-test/suite/mariabackup/unsupported_redo.test @@ -10,7 +10,6 @@ call mtr.add_suppression("Table .* in the InnoDB data dictionary has tablespace let $basedir=$MYSQLTEST_VARDIR/tmp/backup; let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; -SELECT @@GLOBAL.innodb_flush_log_at_trx_commit; CREATE TABLE t1(i INT PRIMARY KEY auto_increment, a int) ENGINE INNODB; --source ../../suite/innodb/include/no_checkpoint_start.inc ALTER TABLE t1 FORCE, ALGORITHM=INPLACE; diff --git a/sql/table.cc b/sql/table.cc index f33e90d73b8..8dedb926141 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -5245,8 +5245,18 @@ int TABLE::verify_constraints(bool ignore_failure) if (((*chk)->expr->val_int() == 0 && !(*chk)->expr->null_value) || in_use->is_error()) { + StringBuffer<MAX_FIELD_WIDTH> field_error(system_charset_info); + enum_vcol_info_type vcol_type= (*chk)->get_vcol_type(); + DBUG_ASSERT(vcol_type == VCOL_CHECK_TABLE || + vcol_type == VCOL_CHECK_FIELD); + if (vcol_type == VCOL_CHECK_FIELD) + { + field_error.append(s->table_name.str); + field_error.append("."); + } + field_error.append((*chk)->name.str); my_error(ER_CONSTRAINT_FAILED, - MYF(ignore_failure ? ME_JUST_WARNING : 0), (*chk)->name.str, + MYF(ignore_failure ? ME_JUST_WARNING : 0), field_error.c_ptr(), s->db.str, s->error_table_name()); return ignore_failure ? VIEW_CHECK_SKIP : VIEW_CHECK_ERROR; } diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 5d9ad7bab67..c6da047e8c5 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -4062,6 +4062,32 @@ next_file: return(status); } +/** Check that IO of specific size is possible for the file +opened with FILE_FLAG_NO_BUFFERING. + +The requirement is that IO is multiple of the disk sector size. + +@param[in] file file handle +@param[in] io_size expected io size +@return true - unbuffered io of requested size is possible, false otherwise. + +@note: this function only works correctly with Windows 8 or later, +(GetFileInformationByHandleEx with FileStorageInfo is only supported there). +It will return true on earlier Windows version. + */ +static bool unbuffered_io_possible(HANDLE file, size_t io_size) +{ + FILE_STORAGE_INFO info; + if (GetFileInformationByHandleEx( + file, FileStorageInfo, &info, sizeof(info))) { + ULONG sector_size = info.LogicalBytesPerSector; + if (sector_size) + return io_size % sector_size == 0; + } + return true; +} + + /** NOTE! Use the corresponding macro os_file_create(), not directly this function! Opens an existing file or creates a new. @@ -4237,46 +4263,58 @@ os_file_create_func( access |= GENERIC_WRITE; } - do { + for (;;) { + const char *operation; + /* Use default security attributes and no template file. */ file = CreateFile( - (LPCTSTR) name, access, share_mode, NULL, + name, access, share_mode, NULL, create_flag, attributes, NULL); - if (file == INVALID_HANDLE_VALUE) { - const char* operation; + /* If FILE_FLAG_NO_BUFFERING was set, check if this can work at all, + for expected IO sizes. Reopen without the unbuffered flag, if it is won't work*/ + if ((file != INVALID_HANDLE_VALUE) + && (attributes & FILE_FLAG_NO_BUFFERING) + && (type == OS_LOG_FILE) + && !unbuffered_io_possible(file, OS_FILE_LOG_BLOCK_SIZE)) { + ut_a(CloseHandle(file)); + attributes &= ~FILE_FLAG_NO_BUFFERING; + create_flag = OPEN_ALWAYS; + continue; + } - operation = (create_mode == OS_FILE_CREATE - && !read_only) - ? "create" : "open"; + *success = (file != INVALID_HANDLE_VALUE); + if (*success) { + break; + } - *success = false; + operation = (create_mode == OS_FILE_CREATE && !read_only) ? + "create" : "open"; - if (on_error_no_exit) { - retry = os_file_handle_error_no_exit( - name, operation, on_error_silent); - } else { - retry = os_file_handle_error(name, operation); - } - } else { - - retry = false; + if (on_error_no_exit) { + retry = os_file_handle_error_no_exit( + name, operation, on_error_silent); + } + else { + retry = os_file_handle_error(name, operation); + } - *success = true; + if (!retry) { + break; + } + } - if (srv_use_native_aio && ((attributes & FILE_FLAG_OVERLAPPED) != 0)) { - /* Bind the file handle to completion port. Completion port - might not be created yet, in some stages of backup, but - must always be there for the server.*/ - HANDLE port =(type == OS_LOG_FILE)? - log_completion_port : data_completion_port; - ut_a(port || srv_operation != SRV_OPERATION_NORMAL); - if (port) { - ut_a(CreateIoCompletionPort(file, port, 0, 0)); - } - } + if (*success && srv_use_native_aio && (attributes & FILE_FLAG_OVERLAPPED)) { + /* Bind the file handle to completion port. Completion port + might not be created yet, in some stages of backup, but + must always be there for the server.*/ + HANDLE port = (type == OS_LOG_FILE) ? + log_completion_port : data_completion_port; + ut_a(port || srv_operation != SRV_OPERATION_NORMAL); + if (port) { + ut_a(CreateIoCompletionPort(file, port, 0, 0)); } - } while (retry); + } return(file); } |