mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge branch '10.0' into 10.1
This commit is contained in:
@ -647,50 +647,59 @@ sub run_test_server ($$$) {
|
||||
my $worker_savename= basename($worker_savedir);
|
||||
my $savedir= "$opt_vardir/log/$worker_savename";
|
||||
|
||||
# Move any core files from e.g. mysqltest
|
||||
foreach my $coref (glob("core*"), glob("*.dmp"))
|
||||
{
|
||||
mtr_report(" - found '$coref', moving it to '$worker_savedir'");
|
||||
move($coref, $worker_savedir);
|
||||
}
|
||||
|
||||
find(
|
||||
{
|
||||
no_chdir => 1,
|
||||
wanted => sub
|
||||
{
|
||||
my $core_file= $File::Find::name;
|
||||
my $core_name= basename($core_file);
|
||||
|
||||
# Name beginning with core, not ending in .gz
|
||||
if (($core_name =~ /^core/ and $core_name !~ /\.gz$/)
|
||||
or (IS_WINDOWS and $core_name =~ /\.dmp$/))
|
||||
{
|
||||
# Ending with .dmp
|
||||
mtr_report(" - found '$core_name'",
|
||||
"($num_saved_cores/$opt_max_save_core)");
|
||||
|
||||
My::CoreDump->show($core_file, $exe_mysqld, $opt_parallel);
|
||||
|
||||
# Limit number of core files saved
|
||||
if ($opt_max_save_core > 0 &&
|
||||
$num_saved_cores >= $opt_max_save_core)
|
||||
{
|
||||
mtr_report(" - deleting it, already saved",
|
||||
"$opt_max_save_core");
|
||||
unlink("$core_file");
|
||||
}
|
||||
else
|
||||
{
|
||||
mtr_compress_file($core_file) unless @opt_cases;
|
||||
++$num_saved_cores;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
$worker_savedir);
|
||||
|
||||
if ($opt_max_save_datadir > 0 &&
|
||||
$num_saved_datadir >= $opt_max_save_datadir)
|
||||
{
|
||||
mtr_report(" - skipping '$worker_savedir/'");
|
||||
rmtree($worker_savedir);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
mtr_report(" - saving '$worker_savedir/' to '$savedir/'");
|
||||
rename($worker_savedir, $savedir);
|
||||
# Move any core files from e.g. mysqltest
|
||||
foreach my $coref (glob("core*"), glob("*.dmp"))
|
||||
{
|
||||
mtr_report(" - found '$coref', moving it to '$savedir'");
|
||||
move($coref, $savedir);
|
||||
}
|
||||
if ($opt_max_save_core > 0) {
|
||||
# Limit number of core files saved
|
||||
find({ no_chdir => 1,
|
||||
wanted => sub {
|
||||
my $core_file= $File::Find::name;
|
||||
my $core_name= basename($core_file);
|
||||
|
||||
# Name beginning with core, not ending in .gz
|
||||
if (($core_name =~ /^core/ and $core_name !~ /\.gz$/)
|
||||
or (IS_WINDOWS and $core_name =~ /\.dmp$/)){
|
||||
# Ending with .dmp
|
||||
mtr_report(" - found '$core_name'",
|
||||
"($num_saved_cores/$opt_max_save_core)");
|
||||
|
||||
My::CoreDump->show($core_file, $exe_mysqld, $opt_parallel);
|
||||
|
||||
if ($num_saved_cores >= $opt_max_save_core) {
|
||||
mtr_report(" - deleting it, already saved",
|
||||
"$opt_max_save_core");
|
||||
unlink("$core_file");
|
||||
} else {
|
||||
mtr_compress_file($core_file) unless @opt_cases;
|
||||
}
|
||||
++$num_saved_cores;
|
||||
}
|
||||
}
|
||||
},
|
||||
$savedir);
|
||||
}
|
||||
}
|
||||
resfile_print_test();
|
||||
$num_saved_datadir++;
|
||||
|
@ -451,3 +451,23 @@ CREATE OR REPLACE TABLE t1 AS SELECT f1();
|
||||
UNLOCK TABLES;
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-11129
|
||||
# CREATE OR REPLACE TABLE t1 AS SELECT spfunc() crashes if spfunc()
|
||||
# references t1
|
||||
#
|
||||
CREATE OR REPLACE TABLE t1(a INT);
|
||||
CREATE FUNCTION f1() RETURNS VARCHAR(16383)
|
||||
BEGIN
|
||||
INSERT INTO t1 VALUES(1);
|
||||
RETURN 'test';
|
||||
END;
|
||||
$$
|
||||
CREATE OR REPLACE TABLE t1 AS SELECT f1();
|
||||
ERROR HY000: Table 't1' is specified twice, both as a target for 'CREATE' and as a separate source for data
|
||||
LOCK TABLE t1 WRITE;
|
||||
CREATE OR REPLACE TABLE t1 AS SELECT f1();
|
||||
ERROR HY000: Table 't1' was not locked with LOCK TABLES
|
||||
UNLOCK TABLES;
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
|
@ -1644,11 +1644,6 @@ drop user mysqluser11@localhost;
|
||||
drop database mysqltest1;
|
||||
End of 5.0 tests
|
||||
set names utf8;
|
||||
grant select on test.* to юзер_юзер@localhost;
|
||||
user()
|
||||
юзер_юзер@localhost
|
||||
revoke all on test.* from юзер_юзер@localhost;
|
||||
drop user юзер_юзер@localhost;
|
||||
grant select on test.* to очень_длинный_юзер890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890@localhost;
|
||||
ERROR HY000: String 'очень_длинный_юзер890123456789012345678901234567890123' is too long for user name (should be no longer than 80)
|
||||
set names default;
|
||||
|
8
mysql-test/r/grant_not_windows.result
Normal file
8
mysql-test/r/grant_not_windows.result
Normal file
@ -0,0 +1,8 @@
|
||||
set names utf8;
|
||||
create user юзер_юзер@localhost;
|
||||
grant select on test.* to юзер_юзер@localhost;
|
||||
user()
|
||||
юзер_юзер@localhost
|
||||
revoke all on test.* from юзер_юзер@localhost;
|
||||
drop user юзер_юзер@localhost;
|
||||
set names default;
|
@ -854,3 +854,12 @@ INSERT IGNORE INTO t1 SELECT t1.a FROM t1,t1 t2,t1 t3,t1 t4,t1 t5,t1 t6,t1 t7;
|
||||
SET GLOBAL myisam_data_pointer_size = @old_myisam_data_pointer_size;
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
create table t1 (i int);
|
||||
create table t2 as select values(i) as a from t1;
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`a` binary(0) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1, t2;
|
||||
End of 5.5 tests
|
||||
|
@ -2546,6 +2546,14 @@ OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)) engine=myisam;
|
||||
INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'),
|
||||
(6,'0'),(7,'0');
|
||||
flush tables test.t1 for export;
|
||||
insert into t1 values (8,'0');
|
||||
ERROR HY000: Table 't1' was locked with a READ lock and can't be updated
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
show variables like 'myisam_block_size';
|
||||
Variable_name Value
|
||||
myisam_block_size 1024
|
||||
|
@ -16,9 +16,3 @@ tmp CREATE TABLE `tmp` (
|
||||
`NULL` binary(0) DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE tmp;
|
||||
CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||
FLUSH TABLES;
|
||||
CREATE TEMPORARY TABLE tmp ENGINE=InnoDB AS SELECT VALUES(a) FROM t1;
|
||||
ERROR HY000: Can't create table `test`.`tmp` (errno: -1 "Internal error < 0 (Not system error)")
|
||||
DROP TABLE t1;
|
||||
|
@ -16,13 +16,3 @@ CREATE TABLE tmp ENGINE = INNODB
|
||||
AS SELECT COALESCE(NULL, NULL, NULL), GREATEST(NULL, NULL), NULL;
|
||||
SHOW CREATE TABLE tmp;
|
||||
DROP TABLE tmp;
|
||||
|
||||
# These 'create table' operations should fail because of
|
||||
# using NULL datatype
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||
FLUSH TABLES;
|
||||
--error 1005
|
||||
CREATE TEMPORARY TABLE tmp ENGINE=InnoDB AS SELECT VALUES(a) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
@ -31,3 +31,19 @@ pk i
|
||||
8 88
|
||||
9 99
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f INT) ENGINE=Aria transactional=1;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f` int(11) DEFAULT NULL
|
||||
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
ALTER TABLE t1 ORDER BY unknown_column;
|
||||
ERROR 42S22: Unknown column 'unknown_column' in 'order clause'
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f` int(11) DEFAULT NULL
|
||||
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -25,3 +25,20 @@ INSERT INTO t1 VALUES (2,0),(3,33),(4,0),(5,55),(6,66),(7,0),(8,88),(9,99);
|
||||
ALTER TABLE t1 ENABLE KEYS;
|
||||
SELECT * FROM t1 WHERE i = 0 OR pk BETWEEN 6 AND 10;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# MDEV-14943
|
||||
# Assertion `block->type == PAGECACHE_EMPTY_PAGE || block->type == type ||
|
||||
# type == PAGECACHE_LSN_PAGE || type == PAGECACHE_READ_UNKNOWN_PAGE ||
|
||||
# block->type == PAGECACHE_READ_UNKNOWN_PAGE' failed in pagecache_read upon
|
||||
# CREATE ... SELECT from Aria table
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f INT) ENGINE=Aria transactional=1;
|
||||
SHOW CREATE TABLE t1;
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
ALTER TABLE t1 ORDER BY unknown_column;
|
||||
SHOW CREATE TABLE t1;
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -2771,3 +2771,11 @@ test.t1 check status OK
|
||||
SET aria_repair_threads=@@global.aria_repair_threads;
|
||||
SET aria_sort_buffer_size=@@global.aria_sort_buffer_size;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b));
|
||||
INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'),
|
||||
(6,'0'),(7,'0');
|
||||
flush tables test.t1 for export;
|
||||
insert into t1 values (8,'0');
|
||||
ERROR HY000: Table 't1' was locked with a READ lock and can't be updated
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
|
@ -2028,6 +2028,19 @@ SET aria_repair_threads=@@global.aria_repair_threads;
|
||||
SET aria_sort_buffer_size=@@global.aria_sort_buffer_size;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Check FLUSH FOR EXPORT
|
||||
#
|
||||
|
||||
CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b));
|
||||
INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'),
|
||||
(6,'0'),(7,'0');
|
||||
flush tables test.t1 for export;
|
||||
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
|
||||
insert into t1 values (8,'0');
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# End of test
|
||||
#
|
||||
|
@ -396,3 +396,28 @@ CREATE OR REPLACE TABLE t1 AS SELECT f1();
|
||||
UNLOCK TABLES;
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-11129
|
||||
--echo # CREATE OR REPLACE TABLE t1 AS SELECT spfunc() crashes if spfunc()
|
||||
--echo # references t1
|
||||
--echo #
|
||||
|
||||
CREATE OR REPLACE TABLE t1(a INT);
|
||||
DELIMITER $$;
|
||||
CREATE FUNCTION f1() RETURNS VARCHAR(16383)
|
||||
BEGIN
|
||||
INSERT INTO t1 VALUES(1);
|
||||
RETURN 'test';
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
--error ER_UPDATE_TABLE_USED
|
||||
CREATE OR REPLACE TABLE t1 AS SELECT f1();
|
||||
LOCK TABLE t1 WRITE;
|
||||
--error ER_TABLE_NOT_LOCKED
|
||||
CREATE OR REPLACE TABLE t1 AS SELECT f1();
|
||||
UNLOCK TABLES;
|
||||
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
|
@ -1568,15 +1568,7 @@ drop database mysqltest1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
# Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte
|
||||
#
|
||||
set names utf8;
|
||||
grant select on test.* to юзер_юзер@localhost;
|
||||
--exec $MYSQL --default-character-set=utf8 --user=юзер_юзер -e "select user()"
|
||||
revoke all on test.* from юзер_юзер@localhost;
|
||||
drop user юзер_юзер@localhost;
|
||||
--error ER_WRONG_STRING_LENGTH
|
||||
grant select on test.* to очень_длинный_юзер890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890@localhost;
|
||||
set names default;
|
||||
|
14
mysql-test/t/grant_not_windows.test
Normal file
14
mysql-test/t/grant_not_windows.test
Normal file
@ -0,0 +1,14 @@
|
||||
# UTF8 parameters to mysql client do not work on Windows
|
||||
--source include/not_windows.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
#
|
||||
# Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte
|
||||
#
|
||||
set names utf8;
|
||||
create user юзер_юзер@localhost;
|
||||
grant select on test.* to юзер_юзер@localhost;
|
||||
--exec $MYSQL --default-character-set=utf8 --user=юзер_юзер -e "select user()"
|
||||
revoke all on test.* from юзер_юзер@localhost;
|
||||
drop user юзер_юзер@localhost;
|
||||
set names default;
|
@ -423,3 +423,13 @@ SET GLOBAL myisam_data_pointer_size = @old_myisam_data_pointer_size;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
#
|
||||
# MDEV-15318 CREATE .. SELECT VALUES produces invalid table structure
|
||||
#
|
||||
create table t1 (i int);
|
||||
create table t2 as select values(i) as a from t1;
|
||||
show create table t2;
|
||||
drop table t1, t2;
|
||||
|
||||
--echo End of 5.5 tests
|
||||
|
@ -1763,6 +1763,19 @@ ALTER TABLE t1 DISABLE KEYS;
|
||||
OPTIMIZE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Check FLUSH FOR EXPORT
|
||||
#
|
||||
|
||||
CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)) engine=myisam;
|
||||
INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'),
|
||||
(6,'0'),(7,'0');
|
||||
flush tables test.t1 for export;
|
||||
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
|
||||
insert into t1 values (8,'0');
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Check some variables
|
||||
#
|
||||
|
@ -53,14 +53,22 @@ drop table t1;
|
||||
|
||||
#
|
||||
# Bug#17939 Wrong table format when using UTF8 strings
|
||||
#
|
||||
--exec $MYSQL --default-character-set=utf8 --table -e "SELECT 'John Doe' as '__tañgè Ñãmé'" 2>&1
|
||||
--exec $MYSQL --default-character-set=utf8 --table -e "SELECT '__tañgè Ñãmé' as 'John Doe'" 2>&1
|
||||
write_file $MYSQL_TMP_DIR/mysql_in;
|
||||
SELECT 'John Doe' as '__tañgè Ñãmé';
|
||||
SELECT '__tañgè Ñãmé' as 'John Doe';
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=utf8 --table < $MYSQL_TMP_DIR/mysql_in 2>&1
|
||||
remove_file $MYSQL_TMP_DIR/mysql_in;
|
||||
|
||||
#
|
||||
# Bug#18265 -- mysql client: No longer right-justifies numeric columns
|
||||
#
|
||||
--exec $MYSQL -t --default-character-set utf8 test -e "create table t1 (i int, j int, k char(25) charset utf8); insert into t1 (i) values (1); insert into t1 (k) values ('<----------------------->'); insert into t1 (k) values ('<-----'); insert into t1 (k) values ('Τη γλώσσα'); insert into t1 (k) values ('ᛖᚴ ᚷᛖᛏ'); select * from t1; DROP TABLE t1;"
|
||||
write_file $MYSQL_TMP_DIR/mysql_in;
|
||||
create table t1 (i int, j int, k char(25) charset utf8); insert into t1 (i) values (1); insert into t1 (k) values ('<----------------------->'); insert into t1 (k) values ('<-----'); insert into t1 (k) values ('Τη γλώσσα'); insert into t1 (k) values ('ᛖᚴ ᚷᛖᛏ'); select * from t1; DROP TABLE t1;
|
||||
EOF
|
||||
--exec $MYSQL -t --default-character-set utf8 test < $MYSQL_TMP_DIR/mysql_in
|
||||
remove_file $MYSQL_TMP_DIR/mysql_in;
|
||||
|
||||
|
||||
#
|
||||
# "DESCRIBE" commands may return strange NULLness flags.
|
||||
|
@ -10,13 +10,43 @@
|
||||
# BUG#16217 - MySQL client misinterprets multi-byte char as escape `\'
|
||||
#
|
||||
|
||||
let $mysql_in= $MYSQL_TMP_DIR/mysql_in;
|
||||
|
||||
# new command \C or charset
|
||||
--exec $MYSQL --default-character-set=utf8 test -e "\C cp932 \g"
|
||||
--exec $MYSQL --default-character-set=cp932 test -e "charset utf8;"
|
||||
write_file $mysql_in;
|
||||
\C cp932 \g
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=utf8 test < $mysql_in
|
||||
remove_file $mysql_in;
|
||||
|
||||
write_file $mysql_in;
|
||||
charset utf8;
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=cp932 test < $mysql_in
|
||||
remove_file $mysql_in;
|
||||
|
||||
# its usage to switch internally in mysql to requested charset
|
||||
--exec $MYSQL --default-character-set=utf8 test -e "charset cp932; select '<27>\'; create table t1 (c_cp932 TEXT CHARACTER SET cp932); insert into t1 values('<27>\'); select * from t1; drop table t1;"
|
||||
--exec $MYSQL --default-character-set=utf8 test -e "charset cp932; select '<27>\'"
|
||||
--exec $MYSQL --default-character-set=utf8 test -e "/*charset cp932 */; set character_set_client= cp932; select '<27>\'"
|
||||
--exec $MYSQL --default-character-set=utf8 test -e "/*!\C cp932 */; set character_set_client= cp932; select '<27>\'"
|
||||
write_file $mysql_in;
|
||||
charset cp932; select '<27>\'; create table t1 (c_cp932 TEXT CHARACTER SET cp932); insert into t1 values('<27>\'); select * from t1; drop table t1;
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=utf8 test < $mysql_in
|
||||
remove_file $mysql_in;
|
||||
|
||||
write_file $mysql_in;
|
||||
charset cp932; select '<27>\'
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=utf8 test < $mysql_in
|
||||
remove_file $mysql_in;
|
||||
|
||||
write_file $mysql_in;
|
||||
/*charset cp932 */; set character_set_client= cp932; select '<27>\'
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=utf8 test < $mysql_in
|
||||
remove_file $mysql_in;
|
||||
|
||||
write_file $mysql_in;
|
||||
/*!\C cp932 */; set character_set_client= cp932; select '<27>\'
|
||||
EOF
|
||||
--exec $MYSQL --default-character-set=utf8 test < $mysql_in
|
||||
remove_file $mysql_in;
|
||||
|
||||
|
@ -8457,10 +8457,10 @@ bool Item_insert_value::fix_fields(THD *thd, Item **items)
|
||||
}
|
||||
else
|
||||
{
|
||||
Field *tmp_field= field_arg->field;
|
||||
/* charset doesn't matter here, it's to avoid sigsegv only */
|
||||
tmp_field= new Field_null(0, 0, Field::NONE, field_arg->field->field_name,
|
||||
&my_charset_bin);
|
||||
static uchar null_bit=1;
|
||||
/* charset doesn't matter here */
|
||||
Field *tmp_field= new Field_string(0, 0, &null_bit, 1, Field::NONE,
|
||||
field_arg->field->field_name, &my_charset_bin);
|
||||
if (tmp_field)
|
||||
{
|
||||
tmp_field->init(field_arg->field->table);
|
||||
|
@ -1322,7 +1322,8 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
|
||||
@param thd thread handle
|
||||
@param table table which should be checked
|
||||
@param table_list list of tables
|
||||
@param check_alias whether to check tables' aliases
|
||||
@param check_flag whether to check tables' aliases
|
||||
Currently this is only used by INSERT
|
||||
|
||||
NOTE: to exclude derived tables from check we use following mechanism:
|
||||
a) during derived table processing set THD::derived_tables_processing
|
||||
@ -1351,9 +1352,9 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
|
||||
|
||||
static
|
||||
TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
bool check_alias)
|
||||
uint check_flag)
|
||||
{
|
||||
TABLE_LIST *res;
|
||||
TABLE_LIST *res= 0;
|
||||
const char *d_name, *t_name, *t_alias;
|
||||
DBUG_ENTER("find_dup_table");
|
||||
DBUG_PRINT("enter", ("table alias: %s", table->alias));
|
||||
@ -1389,17 +1390,15 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
|
||||
retry:
|
||||
DBUG_PRINT("info", ("real table: %s.%s", d_name, t_name));
|
||||
for (TABLE_LIST *tl= table_list;;)
|
||||
for (TABLE_LIST *tl= table_list; tl ; tl= tl->next_global, res= 0)
|
||||
{
|
||||
if (tl &&
|
||||
tl->select_lex && tl->select_lex->master_unit() &&
|
||||
if (tl->select_lex && tl->select_lex->master_unit() &&
|
||||
tl->select_lex->master_unit()->executed)
|
||||
{
|
||||
/*
|
||||
There is no sense to check tables of already executed parts
|
||||
of the query
|
||||
*/
|
||||
tl= tl->next_global;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
@ -1408,21 +1407,29 @@ retry:
|
||||
*/
|
||||
if (! (res= find_table_in_global_list(tl, d_name, t_name)))
|
||||
break;
|
||||
tl= res; // We can continue search after this table
|
||||
|
||||
/* Skip if same underlying table. */
|
||||
if (res->table && (res->table == table->table))
|
||||
goto next;
|
||||
continue;
|
||||
|
||||
if (check_flag & CHECK_DUP_FOR_CREATE)
|
||||
DBUG_RETURN(res);
|
||||
|
||||
/* Skip if table alias does not match. */
|
||||
if (check_alias)
|
||||
if (check_flag & CHECK_DUP_ALLOW_DIFFERENT_ALIAS)
|
||||
{
|
||||
if (my_strcasecmp(table_alias_charset, t_alias, res->alias))
|
||||
goto next;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
Skip if marked to be excluded (could be a derived table) or if
|
||||
entry is a prelocking placeholder.
|
||||
If table is not excluded (could be a derived table) and table is not
|
||||
a prelocking placeholder then we found either a duplicate entry
|
||||
or a table that is part of a derived table (handled below).
|
||||
Examples are:
|
||||
INSERT INTO t1 SELECT * FROM t1;
|
||||
INSERT INTO t1 SELECT * FROM view_containing_t1;
|
||||
*/
|
||||
if (res->select_lex &&
|
||||
!res->select_lex->exclude_from_table_unique_test &&
|
||||
@ -1434,14 +1441,17 @@ retry:
|
||||
processed in derived table or top select of multi-update/multi-delete
|
||||
(exclude_from_table_unique_test) or prelocking placeholder.
|
||||
*/
|
||||
next:
|
||||
tl= res->next_global;
|
||||
DBUG_PRINT("info",
|
||||
("found same copy of table or table which we should skip"));
|
||||
}
|
||||
if (res && res->belong_to_derived)
|
||||
{
|
||||
/* Try to fix */
|
||||
/*
|
||||
We come here for queries of type:
|
||||
INSERT INTO t1 (SELECT tmp.a FROM (select * FROM t1) as tmp);
|
||||
|
||||
Try to fix by materializing the derived table
|
||||
*/
|
||||
TABLE_LIST *derived= res->belong_to_derived;
|
||||
if (derived->is_merged_derived())
|
||||
{
|
||||
@ -1473,7 +1483,7 @@ next:
|
||||
|
||||
TABLE_LIST*
|
||||
unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
bool check_alias)
|
||||
uint check_flag)
|
||||
{
|
||||
TABLE_LIST *dup;
|
||||
|
||||
@ -1487,12 +1497,12 @@ unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
for (child= table->next_global; child && child->parent_l == table;
|
||||
child= child->next_global)
|
||||
{
|
||||
if ((dup= find_dup_table(thd, child, child->next_global, check_alias)))
|
||||
if ((dup= find_dup_table(thd, child, child->next_global, check_flag)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
dup= find_dup_table(thd, table, table_list, check_alias);
|
||||
dup= find_dup_table(thd, table, table_list, check_flag);
|
||||
return dup;
|
||||
}
|
||||
/*
|
||||
|
@ -61,6 +61,10 @@ enum find_item_error_report_type {REPORT_ALL_ERRORS, REPORT_EXCEPT_NOT_FOUND,
|
||||
IGNORE_ERRORS, REPORT_EXCEPT_NON_UNIQUE,
|
||||
IGNORE_EXCEPT_NON_UNIQUE};
|
||||
|
||||
/* Flag bits for unique_table() */
|
||||
#define CHECK_DUP_ALLOW_DIFFERENT_ALIAS 1
|
||||
#define CHECK_DUP_FOR_CREATE 2
|
||||
|
||||
uint create_tmp_table_def_key(THD *thd, char *key, const char *db,
|
||||
const char *table_name);
|
||||
uint get_table_def_key(const TABLE_LIST *table_list, const char **key);
|
||||
@ -280,7 +284,7 @@ void kill_delayed_threads_for_table(TDC_element *element);
|
||||
void close_thread_table(THD *thd, TABLE **table_ptr);
|
||||
bool close_temporary_tables(THD *thd);
|
||||
TABLE_LIST *unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list,
|
||||
bool check_alias);
|
||||
uint check_flag);
|
||||
int drop_temporary_table(THD *thd, TABLE *table, bool *is_trans);
|
||||
void close_temporary_table(THD *thd, TABLE *table, bool free_share,
|
||||
bool delete_table);
|
||||
|
@ -945,7 +945,7 @@ multi_delete::initialize_tables(JOIN *join)
|
||||
TABLE_LIST *tbl= walk->correspondent_table->find_table_for_update();
|
||||
tables_to_delete_from|= tbl->table->map;
|
||||
if (delete_while_scanning &&
|
||||
unique_table(thd, tbl, join->tables_list, false))
|
||||
unique_table(thd, tbl, join->tables_list, 0))
|
||||
{
|
||||
/*
|
||||
If the table we are going to delete from appears
|
||||
|
@ -1550,7 +1550,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
|
||||
{
|
||||
Item *fake_conds= 0;
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, table_list, table_list->next_global, 1)))
|
||||
if ((duplicate= unique_table(thd, table_list, table_list->next_global,
|
||||
CHECK_DUP_ALLOW_DIFFERENT_ALIAS)))
|
||||
{
|
||||
update_non_unique_table_error(table_list, "INSERT", duplicate);
|
||||
DBUG_RETURN(TRUE);
|
||||
|
@ -3417,7 +3417,7 @@ mysql_execute_command(THD *thd)
|
||||
TABLE_LIST *duplicate;
|
||||
if ((duplicate= unique_table(thd, lex->query_tables,
|
||||
lex->query_tables->next_global,
|
||||
0)))
|
||||
CHECK_DUP_FOR_CREATE)))
|
||||
{
|
||||
update_non_unique_table_error(lex->query_tables, "CREATE",
|
||||
duplicate);
|
||||
|
@ -9414,9 +9414,7 @@ bool mysql_trans_prepare_alter_copy_data(THD *thd)
|
||||
|
||||
This needs to be done before external_lock.
|
||||
*/
|
||||
if (ha_enable_transaction(thd, FALSE))
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_RETURN(FALSE);
|
||||
DBUG_RETURN(ha_enable_transaction(thd, FALSE) != 0);
|
||||
}
|
||||
|
||||
|
||||
@ -9472,6 +9470,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
||||
ha_rows examined_rows;
|
||||
ha_rows found_rows;
|
||||
bool auto_increment_field_copied= 0;
|
||||
bool cleanup_done= 0;
|
||||
ulonglong save_sql_mode= thd->variables.sql_mode;
|
||||
ulonglong prev_insert_id, time_to_report_progress;
|
||||
Field **dfield_ptr= to->default_field;
|
||||
@ -9480,15 +9479,23 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
||||
/* Two or 3 stages; Sorting, copying data and update indexes */
|
||||
thd_progress_init(thd, 2 + MY_TEST(order));
|
||||
|
||||
if (mysql_trans_prepare_alter_copy_data(thd))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
if (!(copy= new Copy_field[to->s->fields]))
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
|
||||
if (mysql_trans_prepare_alter_copy_data(thd))
|
||||
{
|
||||
delete [] copy;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
/* We need external lock before we can disable/enable keys */
|
||||
if (to->file->ha_external_lock(thd, F_WRLCK))
|
||||
{
|
||||
/* Undo call to mysql_trans_prepare_alter_copy_data() */
|
||||
ha_enable_transaction(thd, TRUE);
|
||||
delete [] copy;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
alter_table_manage_keys(to, from->file->indexes_are_disabled(), keys_onoff);
|
||||
|
||||
@ -9498,7 +9505,6 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
||||
from->file->info(HA_STATUS_VARIABLE);
|
||||
to->file->ha_start_bulk_insert(from->file->stats.records,
|
||||
ignore ? 0 : HA_CREATE_UNIQUE_INDEX_BY_SORT);
|
||||
|
||||
List_iterator<Create_field> it(create);
|
||||
Create_field *def;
|
||||
copy_end=copy;
|
||||
@ -9702,7 +9708,6 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
||||
}
|
||||
end_read_record(&info);
|
||||
free_io_cache(from);
|
||||
delete [] copy;
|
||||
|
||||
THD_STAGE_INFO(thd, stage_enabling_keys);
|
||||
thd_progress_next_stage(thd);
|
||||
@ -9717,6 +9722,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
||||
to->file->print_error(my_errno,MYF(0));
|
||||
error= 1;
|
||||
}
|
||||
cleanup_done= 1;
|
||||
to->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
|
||||
|
||||
if (mysql_trans_commit_alter_copy_data(thd))
|
||||
@ -9728,6 +9734,16 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
|
||||
*copied= found_count;
|
||||
*deleted=delete_count;
|
||||
to->file->ha_release_auto_increment();
|
||||
delete [] copy;
|
||||
|
||||
if (!cleanup_done)
|
||||
{
|
||||
/* This happens if we get an error during initialzation of data */
|
||||
DBUG_ASSERT(error);
|
||||
to->file->ha_end_bulk_insert();
|
||||
ha_enable_transaction(thd, TRUE);
|
||||
}
|
||||
|
||||
if (to->file->ha_external_lock(thd,F_UNLCK))
|
||||
error=1;
|
||||
if (error < 0 && to->file->extra(HA_EXTRA_PREPARE_FOR_RENAME))
|
||||
|
@ -978,7 +978,7 @@ int_table_flags(HA_NULL_IN_KEY | HA_CAN_FULLTEXT | HA_CAN_SQL_HANDLER |
|
||||
HA_DUPLICATE_POS | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY |
|
||||
HA_FILE_BASED | HA_CAN_GEOMETRY | CANNOT_ROLLBACK_FLAG |
|
||||
HA_CAN_BIT_FIELD | HA_CAN_RTREEKEYS | HA_CAN_REPAIR |
|
||||
HA_CAN_VIRTUAL_COLUMNS |
|
||||
HA_CAN_VIRTUAL_COLUMNS | HA_CAN_EXPORT |
|
||||
HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT),
|
||||
can_enable_indexes(1), bulk_insert_single_undo(BULK_INSERT_NONE)
|
||||
{}
|
||||
@ -1323,6 +1323,7 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
||||
old_proc_info= thd_proc_info(thd, "Checking status");
|
||||
thd_progress_init(thd, 3);
|
||||
error= maria_chk_status(param, file); // Not fatal
|
||||
/* maria_chk_size() will flush the page cache for this file */
|
||||
if (maria_chk_size(param, file))
|
||||
error= 1;
|
||||
if (!error)
|
||||
@ -2222,6 +2223,7 @@ end:
|
||||
_ma_reenable_logging_for_table(file,
|
||||
bulk_insert_single_undo ==
|
||||
BULK_INSERT_SINGLE_UNDO_AND_NO_REPAIR);
|
||||
bulk_insert_single_undo= BULK_INSERT_NONE; // Safety
|
||||
}
|
||||
DBUG_RETURN(err);
|
||||
}
|
||||
|
@ -3520,6 +3520,14 @@ void _ma_tmp_disable_logging_for_table(MARIA_HA *info,
|
||||
{
|
||||
MARIA_SHARE *share= info->s;
|
||||
DBUG_ENTER("_ma_tmp_disable_logging_for_table");
|
||||
|
||||
/*
|
||||
We have to ensure that bitmap is flushed, as it's checking
|
||||
that share->now_transactional is set
|
||||
*/
|
||||
if (share->now_transactional && share->data_file_type == BLOCK_RECORD)
|
||||
_ma_bitmap_flush_all(share);
|
||||
|
||||
if (log_incomplete)
|
||||
{
|
||||
uchar log_data[FILEID_STORE_SIZE];
|
||||
@ -3583,7 +3591,10 @@ my_bool _ma_reenable_logging_for_table(MARIA_HA *info, my_bool flush_pages)
|
||||
|
||||
if (share->now_transactional == share->base.born_transactional ||
|
||||
!info->switched_transactional)
|
||||
{
|
||||
info->switched_transactional= FALSE;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
info->switched_transactional= FALSE;
|
||||
|
||||
if ((share->now_transactional= share->base.born_transactional))
|
||||
|
Reference in New Issue
Block a user