mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge 10.2 into 10.3
This commit is contained in:
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
12
sql/table.cc
12
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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
operation = (create_mode == OS_FILE_CREATE
|
||||
&& !read_only)
|
||||
? "create" : "open";
|
||||
|
||||
*success = 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);
|
||||
}
|
||||
} else {
|
||||
|
||||
retry = false;
|
||||
|
||||
*success = true;
|
||||
|
||||
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 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;
|
||||
}
|
||||
} while (retry);
|
||||
|
||||
*success = (file != INVALID_HANDLE_VALUE);
|
||||
if (*success) {
|
||||
break;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (!retry) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
return(file);
|
||||
}
|
||||
|
Reference in New Issue
Block a user