Merge bk-internal.mysql.com:/data0/bk/mysql-5.0
into bk-internal.mysql.com:/data0/bk/mysql-5.0-opt mysql-test/r/sp.result: Auto merged mysql-test/t/sp.test: Auto merged mysql-test/t/strict.test: Auto merged mysql-test/t/subselect3.test: Auto merged sql/mysqld.cc: Auto merged sql/sp_head.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_table.cc: Auto merged sql/sql_update.cc: Auto merged sql/sql_view.cc: Manual merge
This commit is contained in:
commit
5697c0c10c
@ -708,7 +708,6 @@ mysql-test/r/*.err
|
|||||||
mysql-test/r/*.log
|
mysql-test/r/*.log
|
||||||
mysql-test/r/*.out
|
mysql-test/r/*.out
|
||||||
mysql-test/r/*.reject
|
mysql-test/r/*.reject
|
||||||
mysql-test/r/*.warnings
|
|
||||||
mysql-test/r/alter_table.err
|
mysql-test/r/alter_table.err
|
||||||
mysql-test/r/archive.err
|
mysql-test/r/archive.err
|
||||||
mysql-test/r/bdb-alter-table-1.err
|
mysql-test/r/bdb-alter-table-1.err
|
||||||
|
@ -379,7 +379,13 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
|
|||||||
|
|
||||||
ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
|
ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
|
||||||
{
|
{
|
||||||
register ulong nr=0;
|
/*
|
||||||
|
Note, if a key consists of a combination of numeric and
|
||||||
|
a text columns, it most likely won't work well.
|
||||||
|
Making text columns work with NEW_HASH_FUNCTION
|
||||||
|
needs also changes in strings/ctype-xxx.c.
|
||||||
|
*/
|
||||||
|
ulong nr= 1, nr2= 4;
|
||||||
HA_KEYSEG *seg,*endseg;
|
HA_KEYSEG *seg,*endseg;
|
||||||
|
|
||||||
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
|
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
|
||||||
@ -401,14 +407,15 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
|
|||||||
}
|
}
|
||||||
if (seg->type == HA_KEYTYPE_TEXT)
|
if (seg->type == HA_KEYTYPE_TEXT)
|
||||||
{
|
{
|
||||||
seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,NULL);
|
seg->charset->coll->hash_sort(seg->charset, pos, ((uchar*)key)-pos,
|
||||||
|
&nr, &nr2);
|
||||||
}
|
}
|
||||||
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
|
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
|
||||||
{
|
{
|
||||||
uint pack_length= 2; /* Key packing is constant */
|
uint pack_length= 2; /* Key packing is constant */
|
||||||
uint length= uint2korr(pos);
|
uint length= uint2korr(pos);
|
||||||
seg->charset->hash_sort(seg->charset, pos+pack_length, length, &nr,
|
seg->charset->coll->hash_sort(seg->charset, pos+pack_length, length,
|
||||||
NULL);
|
&nr, &nr2);
|
||||||
key+= pack_length;
|
key+= pack_length;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -428,7 +435,7 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key)
|
|||||||
|
|
||||||
ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
|
ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
|
||||||
{
|
{
|
||||||
register ulong nr=0;
|
ulong nr= 1, nr2= 4;
|
||||||
HA_KEYSEG *seg,*endseg;
|
HA_KEYSEG *seg,*endseg;
|
||||||
|
|
||||||
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
|
for (seg=keydef->seg,endseg=seg+keydef->keysegs ; seg < endseg ; seg++)
|
||||||
@ -444,14 +451,16 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec)
|
|||||||
}
|
}
|
||||||
if (seg->type == HA_KEYTYPE_TEXT)
|
if (seg->type == HA_KEYTYPE_TEXT)
|
||||||
{
|
{
|
||||||
seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,NULL);
|
uint char_length= seg->length; /* TODO: fix to use my_charpos() */
|
||||||
|
seg->charset->coll->hash_sort(seg->charset, pos, char_length,
|
||||||
|
&nr, &nr2);
|
||||||
}
|
}
|
||||||
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
|
else if (seg->type == HA_KEYTYPE_VARTEXT1) /* Any VARCHAR segments */
|
||||||
{
|
{
|
||||||
uint pack_length= seg->bit_start;
|
uint pack_length= seg->bit_start;
|
||||||
uint length= (pack_length == 1 ? (uint) *(uchar*) pos : uint2korr(pos));
|
uint length= (pack_length == 1 ? (uint) *(uchar*) pos : uint2korr(pos));
|
||||||
seg->charset->hash_sort(seg->charset, pos+pack_length,
|
seg->charset->coll->hash_sort(seg->charset, pos+pack_length,
|
||||||
length, &nr, NULL);
|
length, &nr, &nr2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1792,6 +1792,18 @@ sub environment_setup () {
|
|||||||
$ENV{'CHARSETSDIR'}= $path_charsetsdir;
|
$ENV{'CHARSETSDIR'}= $path_charsetsdir;
|
||||||
$ENV{'UMASK'}= "0660"; # The octal *string*
|
$ENV{'UMASK'}= "0660"; # The octal *string*
|
||||||
$ENV{'UMASK_DIR'}= "0770"; # The octal *string*
|
$ENV{'UMASK_DIR'}= "0770"; # The octal *string*
|
||||||
|
|
||||||
|
#
|
||||||
|
# MySQL tests can produce output in various character sets
|
||||||
|
# (especially, ctype_xxx.test). To avoid confusing Perl
|
||||||
|
# with output which is incompatible with the current locale
|
||||||
|
# settings, we reset the current values of LC_ALL and LC_CTYPE to "C".
|
||||||
|
# For details, please see
|
||||||
|
# Bug#27636 tests fails if LC_* variables set to *_*.UTF-8
|
||||||
|
#
|
||||||
|
$ENV{'LC_ALL'}= "C";
|
||||||
|
$ENV{'LC_CTYPE'}= "C";
|
||||||
|
|
||||||
$ENV{'LC_COLLATE'}= "C";
|
$ENV{'LC_COLLATE'}= "C";
|
||||||
$ENV{'USE_RUNNING_SERVER'}= $opt_extern;
|
$ENV{'USE_RUNNING_SERVER'}= $opt_extern;
|
||||||
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
||||||
|
12
mysql-test/r/binlog_killed.result
Normal file
12
mysql-test/r/binlog_killed.result
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
create table t1 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
|
||||||
|
create table t2 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=MyISAM;
|
||||||
|
create table t3 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
|
||||||
|
select get_lock("a", 20);
|
||||||
|
get_lock("a", 20)
|
||||||
|
1
|
||||||
|
reset master;
|
||||||
|
insert into t2 values (null, null), (null, get_lock("a", 10));
|
||||||
|
select @result /* must be zero either way */;
|
||||||
|
@result
|
||||||
|
0
|
||||||
|
drop table t1,t2,t3;
|
@ -380,3 +380,27 @@ drop function f2;
|
|||||||
drop table t2;
|
drop table t2;
|
||||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
|
||||||
drop user `a@`@localhost;
|
drop user `a@`@localhost;
|
||||||
|
drop database if exists mysqltest_1;
|
||||||
|
drop database if exists mysqltest_2;
|
||||||
|
drop user mysqltest_u1@localhost;
|
||||||
|
create database mysqltest_1;
|
||||||
|
create database mysqltest_2;
|
||||||
|
grant all on mysqltest_1.* to mysqltest_u1@localhost;
|
||||||
|
use mysqltest_2;
|
||||||
|
create table t1 (i int);
|
||||||
|
show create table mysqltest_2.t1;
|
||||||
|
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't1'
|
||||||
|
create table t1 like mysqltest_2.t1;
|
||||||
|
ERROR 42000: SELECT command denied to user 'mysqltest_u1'@'localhost' for table 't1'
|
||||||
|
grant select on mysqltest_2.t1 to mysqltest_u1@localhost;
|
||||||
|
show create table mysqltest_2.t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`i` int(11) default NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
create table t1 like mysqltest_2.t1;
|
||||||
|
use test;
|
||||||
|
drop database mysqltest_1;
|
||||||
|
drop database mysqltest_2;
|
||||||
|
drop user mysqltest_u1@localhost;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -80,3 +80,7 @@ ERROR 23000: Duplicate entry '2003-03-22' for key 1
|
|||||||
drop table t2;
|
drop table t2;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;
|
||||||
|
LOAD DATA INFILE "../std_data_ln/words.dat" INTO TABLE t1;
|
||||||
|
ERROR 23000: Duplicate entry 'Aarhus' for key 1
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -1030,7 +1030,7 @@ select bug12329();
|
|||||||
bug12329()
|
bug12329()
|
||||||
101
|
101
|
||||||
execute stmt1;
|
execute stmt1;
|
||||||
ERROR HY000: Table 't2' was not locked with LOCK TABLES
|
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||||
deallocate prepare stmt1;
|
deallocate prepare stmt1;
|
||||||
drop function bug12329;
|
drop function bug12329;
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
@ -1152,12 +1152,12 @@ create trigger t1_ai after insert on t1 for each row insert into t2 values (new.
|
|||||||
create view v1 as select * from t1;
|
create view v1 as select * from t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
insert into v1 values (1);
|
insert into v1 values (1);
|
||||||
ERROR HY000: Table 't2' was not locked with LOCK TABLES
|
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||||
drop trigger t1_ai;
|
drop trigger t1_ai;
|
||||||
create function bug11555_1() returns int return (select max(i) from t2);
|
create function bug11555_1() returns int return (select max(i) from t2);
|
||||||
create trigger t1_ai after insert on t1 for each row set @a:=bug11555_1();
|
create trigger t1_ai after insert on t1 for each row set @a:=bug11555_1();
|
||||||
insert into v1 values (2);
|
insert into v1 values (2);
|
||||||
ERROR HY000: Table 't2' was not locked with LOCK TABLES
|
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||||
drop function bug11555_1;
|
drop function bug11555_1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
|
@ -254,4 +254,17 @@ execute stmt;
|
|||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
drop function bug19634;
|
drop function bug19634;
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
drop table if exists bug_27907_logs;
|
||||||
|
drop table if exists bug_27907_t1;
|
||||||
|
create table bug_27907_logs (a int);
|
||||||
|
create table bug_27907_t1 (a int);
|
||||||
|
create trigger bug_27907_t1_ai after insert on bug_27907_t1
|
||||||
|
for each row
|
||||||
|
begin
|
||||||
|
insert into bug_27907_logs (a) values (1);
|
||||||
|
end|
|
||||||
|
drop table bug_27907_logs;
|
||||||
|
insert into bug_27907_t1(a) values (1);
|
||||||
|
ERROR 42S02: Table 'test.bug_27907_logs' doesn't exist
|
||||||
|
drop table bug_27907_t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -6018,6 +6018,8 @@ select bug20777(9223372036854775810) as '9223372036854775810 2**63+2';
|
|||||||
select bug20777(-9223372036854775808) as 'lower bounds signed bigint';
|
select bug20777(-9223372036854775808) as 'lower bounds signed bigint';
|
||||||
lower bounds signed bigint
|
lower bounds signed bigint
|
||||||
0
|
0
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Out of range value adjusted for column 'f1' at row 1
|
||||||
select bug20777(9223372036854775807) as 'upper bounds signed bigint';
|
select bug20777(9223372036854775807) as 'upper bounds signed bigint';
|
||||||
upper bounds signed bigint
|
upper bounds signed bigint
|
||||||
9223372036854775807
|
9223372036854775807
|
||||||
@ -6030,9 +6032,13 @@ upper bounds unsigned bigint
|
|||||||
select bug20777(18446744073709551616) as 'upper bounds unsigned bigint + 1';
|
select bug20777(18446744073709551616) as 'upper bounds unsigned bigint + 1';
|
||||||
upper bounds unsigned bigint + 1
|
upper bounds unsigned bigint + 1
|
||||||
18446744073709551615
|
18446744073709551615
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Out of range value adjusted for column 'f1' at row 1
|
||||||
select bug20777(-1) as 'lower bounds unsigned bigint - 1';
|
select bug20777(-1) as 'lower bounds unsigned bigint - 1';
|
||||||
lower bounds unsigned bigint - 1
|
lower bounds unsigned bigint - 1
|
||||||
0
|
0
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Out of range value adjusted for column 'f1' at row 1
|
||||||
create table examplebug20777 as select
|
create table examplebug20777 as select
|
||||||
0 as 'i',
|
0 as 'i',
|
||||||
bug20777(9223372036854775806) as '2**63-2',
|
bug20777(9223372036854775806) as '2**63-2',
|
||||||
@ -6044,7 +6050,12 @@ bug20777(18446744073709551615) as '2**64-1',
|
|||||||
bug20777(18446744073709551616) as '2**64',
|
bug20777(18446744073709551616) as '2**64',
|
||||||
bug20777(0) as '0',
|
bug20777(0) as '0',
|
||||||
bug20777(-1) as '-1';
|
bug20777(-1) as '-1';
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Out of range value adjusted for column 'f1' at row 1
|
||||||
|
Warning 1264 Out of range value adjusted for column 'f1' at row 1
|
||||||
insert into examplebug20777 values (1, 9223372036854775806, 9223372036854775807, 223372036854775808, 9223372036854775809, 18446744073709551614, 18446744073709551615, 8446744073709551616, 0, -1);
|
insert into examplebug20777 values (1, 9223372036854775806, 9223372036854775807, 223372036854775808, 9223372036854775809, 18446744073709551614, 18446744073709551615, 8446744073709551616, 0, -1);
|
||||||
|
Warnings:
|
||||||
|
Warning 1264 Out of range value adjusted for column '-1' at row 1
|
||||||
show create table examplebug20777;
|
show create table examplebug20777;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
examplebug20777 CREATE TABLE `examplebug20777` (
|
examplebug20777 CREATE TABLE `examplebug20777` (
|
||||||
|
@ -820,9 +820,9 @@ call p1();
|
|||||||
drop trigger t1_bi;
|
drop trigger t1_bi;
|
||||||
create trigger t1_bi after insert on t1 for each row insert into t3 values (new.id);
|
create trigger t1_bi after insert on t1 for each row insert into t3 values (new.id);
|
||||||
execute stmt1;
|
execute stmt1;
|
||||||
ERROR HY000: Table 't3' was not locked with LOCK TABLES
|
ERROR 42S02: Table 'test.t3' doesn't exist
|
||||||
call p1();
|
call p1();
|
||||||
ERROR HY000: Table 't3' was not locked with LOCK TABLES
|
ERROR 42S02: Table 'test.t3' doesn't exist
|
||||||
deallocate prepare stmt1;
|
deallocate prepare stmt1;
|
||||||
drop procedure p1;
|
drop procedure p1;
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
247
mysql-test/t/binlog_killed.test
Normal file
247
mysql-test/t/binlog_killed.test
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
-- source include/have_innodb.inc
|
||||||
|
--source include/not_embedded.inc
|
||||||
|
|
||||||
|
###
|
||||||
|
### bug#22725 : incorrect killed error in binlogged query
|
||||||
|
###
|
||||||
|
|
||||||
|
connect (con1, localhost, root,,);
|
||||||
|
connect (con2, localhost, root,,);
|
||||||
|
|
||||||
|
create table t1 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
|
||||||
|
create table t2 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=MyISAM;
|
||||||
|
create table t3 (a int auto_increment, b int, PRIMARY KEY (a)) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
#
|
||||||
|
# effective test for bug#22725
|
||||||
|
#
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
select get_lock("a", 20);
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
reset master;
|
||||||
|
send insert into t2 values (null, null), (null, get_lock("a", 10));
|
||||||
|
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
|
||||||
|
disable_abort_on_error;
|
||||||
|
disable_query_log;
|
||||||
|
disable_result_log;
|
||||||
|
|
||||||
|
eval kill query $ID;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
--error 0,ER_QUERY_INTERRUPTED
|
||||||
|
reap;
|
||||||
|
let $rows= `select count(*) from t2 /* must be 2 or 0 */`;
|
||||||
|
|
||||||
|
--exec $MYSQL_BINLOG --start-position=126 $MYSQLTEST_VARDIR/log/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/kill_query_calling_sp.binlog
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval select
|
||||||
|
(@a:=load_file("$MYSQLTEST_VARDIR/tmp/kill_query_calling_sp.binlog"))
|
||||||
|
is not null;
|
||||||
|
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||||
|
let $error_code= `select @a like "%#%error_code=0%" /* must return 1 or 0*/`;
|
||||||
|
let $insert_binlogged= `select @a like "%insert into%" /* must return 1 or 0 */`;
|
||||||
|
eval set @result= $rows- $error_code - $insert_binlogged;
|
||||||
|
|
||||||
|
enable_abort_on_error;
|
||||||
|
enable_query_log;
|
||||||
|
enable_result_log;
|
||||||
|
|
||||||
|
select @result /* must be zero either way */;
|
||||||
|
|
||||||
|
# the functions are either *insensitive* to killing or killing can cause
|
||||||
|
# strange problmes with the error propagation out of SF's stack
|
||||||
|
# Bug#27563, Bug#27565, BUG#24971
|
||||||
|
#
|
||||||
|
# TODO: use if's block as regression test for the bugs or remove
|
||||||
|
#
|
||||||
|
if (0)
|
||||||
|
{
|
||||||
|
delimiter |;
|
||||||
|
create function bug27563()
|
||||||
|
RETURNS int(11)
|
||||||
|
DETERMINISTIC
|
||||||
|
begin
|
||||||
|
select get_lock("a", 10) into @a;
|
||||||
|
return 1;
|
||||||
|
end|
|
||||||
|
delimiter ;|
|
||||||
|
|
||||||
|
# the function is sensitive to killing requiring innodb though with wrong client error
|
||||||
|
# TO FIX in BUG#27565; TODO: remove --error 1105 afterwards
|
||||||
|
delimiter |;
|
||||||
|
create function bug27565()
|
||||||
|
RETURNS int(11)
|
||||||
|
DETERMINISTIC
|
||||||
|
begin
|
||||||
|
select a from t1 where a=1 into @a for update;
|
||||||
|
return 1;
|
||||||
|
end|
|
||||||
|
delimiter ;|
|
||||||
|
|
||||||
|
reset master;
|
||||||
|
|
||||||
|
|
||||||
|
### ta table case: killing causes rollback
|
||||||
|
|
||||||
|
# A. autocommit ON
|
||||||
|
connection con1;
|
||||||
|
select get_lock("a", 20);
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
send insert into t1 values (bug27563(),1);
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
eval kill query $ID;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
# todo (re-record test): after bugs 27563,27565 got fixed affected rows will report zero
|
||||||
|
--enable_info
|
||||||
|
# todo: remove 0 return after fixing Bug#27563
|
||||||
|
--error 0,ER_QUERY_INTERRUPTED
|
||||||
|
reap; ### pb: wrong error
|
||||||
|
--disable_info
|
||||||
|
###--replace_column 2 # 5 #
|
||||||
|
### show binlog events from 98 /* nothing in binlog unless Bug#27563 */;
|
||||||
|
show master status /* must be only FD event unless Bug#27563 */;
|
||||||
|
select count(*) from t1 /* must be zero unless Bug#27563 */;
|
||||||
|
|
||||||
|
# M. multi-statement-ta
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
begin;
|
||||||
|
send insert into t1 values (bug27563(),1);
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
eval kill query $ID;
|
||||||
|
connection con2;
|
||||||
|
# todo (re-record test): after bugs 27563,27565 got fixed affected rows will report zero
|
||||||
|
--enable_info
|
||||||
|
# todo: remove 0 return after fixing Bug#27563
|
||||||
|
--error 0,ER_QUERY_INTERRUPTED
|
||||||
|
reap;
|
||||||
|
--disable_info
|
||||||
|
select count(*) from t1 /* must be zero unless Bug#27563 */;
|
||||||
|
commit;
|
||||||
|
|
||||||
|
|
||||||
|
### non-ta table case: killing must be recorded in binlog
|
||||||
|
|
||||||
|
reset master;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
send insert into t2 values (bug27563(),1);
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
eval kill query $ID;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
# todo: remove 0 return after fixing Bug#27563
|
||||||
|
--error 0,ER_QUERY_INTERRUPTED
|
||||||
|
reap;
|
||||||
|
select count(*) from t2 /* must be one */;
|
||||||
|
#show binlog events from 98 /* must have the insert on non-ta table */;
|
||||||
|
show master status /* must have the insert event more to FD */;
|
||||||
|
# the value of the error flag of KILLED_QUERY is tested further
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
select RELEASE_LOCK("a");
|
||||||
|
|
||||||
|
### test with effective killing of SF()
|
||||||
|
|
||||||
|
delete from t1;
|
||||||
|
delete from t2;
|
||||||
|
insert into t1 values (1,1);
|
||||||
|
insert into t2 values (1,1);
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#27565
|
||||||
|
# test where KILL is propagated as error to the top level
|
||||||
|
# still another bug with the error message to the user
|
||||||
|
# todo: fix reexecute the result file after fixing
|
||||||
|
#
|
||||||
|
begin; update t1 set b=0 where a=1;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
send update t2 set b=bug27565()-1 where a=1;
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
eval kill query $ID;
|
||||||
|
commit;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
# todo: fix Bug #27565 killed query of SF() is not reported correctly and
|
||||||
|
# remove 1105 (wrong)
|
||||||
|
#--error ER_QUERY_INTERRUPTED
|
||||||
|
--error 1105,ER_QUERY_INTERRUPTED
|
||||||
|
reap; ### pb: wrong error
|
||||||
|
select * from t1 /* must be: (1,0) */;
|
||||||
|
select * from t2 /* must be as before: (1,1) */;
|
||||||
|
|
||||||
|
## bug#22725 with effective and propagating killing
|
||||||
|
#
|
||||||
|
# top-level ta-table
|
||||||
|
connection con1;
|
||||||
|
delete from t3;
|
||||||
|
reset master;
|
||||||
|
begin; update t1 set b=0 where a=1;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
# the query won't perform completely since the function gets interrupted
|
||||||
|
send insert into t3 values (0,0),(1,bug27565());
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
eval kill query $ID;
|
||||||
|
rollback;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
# todo: fix Bug #27565 killed query of SF() is not reported correctly and
|
||||||
|
# remove 1105 (wrong)
|
||||||
|
#--error ER_QUERY_INTERRUPTED
|
||||||
|
--error 1105,ER_QUERY_INTERRUPTED
|
||||||
|
reap; ### pb: wrong error
|
||||||
|
select count(*) from t3 /* must be zero */;
|
||||||
|
show master status /* nothing in binlog */;
|
||||||
|
|
||||||
|
# top-level non-ta-table
|
||||||
|
connection con1;
|
||||||
|
delete from t2;
|
||||||
|
reset master;
|
||||||
|
begin; update t1 set b=0 where a=1;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
let $ID= `select connection_id()`;
|
||||||
|
# the query won't perform completely since the function gets intrurrupted
|
||||||
|
send insert into t2 values (0,0),(1,bug27565()) /* non-ta t2 */;
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
eval kill query $ID;
|
||||||
|
rollback;
|
||||||
|
|
||||||
|
connection con2;
|
||||||
|
# todo: fix Bug #27565 killed query of SF() is not reported correctly and
|
||||||
|
# remove 1105 (wrong)
|
||||||
|
#--error ER_QUERY_INTERRUPTED
|
||||||
|
--error 1105,ER_QUERY_INTERRUPTED
|
||||||
|
reap; ### pb: wrong error
|
||||||
|
|
||||||
|
select count(*) from t2 /* count must be one */;
|
||||||
|
show master status /* insert into non-ta must be in binlog */;
|
||||||
|
|
||||||
|
drop function bug27563;
|
||||||
|
drop function bug27565;
|
||||||
|
}
|
||||||
|
|
||||||
|
system rm $MYSQLTEST_VARDIR/tmp/kill_query_calling_sp.binlog ;
|
||||||
|
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
|
@ -10,7 +10,9 @@
|
|||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
ndb_load : Bug#17233
|
|
||||||
user_limits : Bug#23921 random failure of user_limits.test
|
user_limits : Bug#23921 random failure of user_limits.test
|
||||||
im_life_cycle : Bug#27851: Instance manager test im_life_cycle fails randomly
|
im_life_cycle : Bug#27851: Instance manager test im_life_cycle fails randomly
|
||||||
im_daemon_life_cycle : Bug#20294: Instance manager tests fail randomly
|
im_daemon_life_cycle : Bug#20294: Instance manager tests fail randomly
|
||||||
|
im_options_set : Bug#20294: Instance manager tests fail randomly
|
||||||
|
im_options_unset : Bug#20294: Instance manager tests fail randomly
|
||||||
|
im_utils : Bug#20294: Instance manager tests fail randomly
|
||||||
|
@ -513,3 +513,47 @@ disconnect bug13310;
|
|||||||
connection default;
|
connection default;
|
||||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
|
REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
|
||||||
drop user `a@`@localhost;
|
drop user `a@`@localhost;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#25578 "CREATE TABLE LIKE does not require any privileges on source table"
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
drop database if exists mysqltest_1;
|
||||||
|
drop database if exists mysqltest_2;
|
||||||
|
--enable_warnings
|
||||||
|
--error 0,ER_CANNOT_USER
|
||||||
|
drop user mysqltest_u1@localhost;
|
||||||
|
|
||||||
|
create database mysqltest_1;
|
||||||
|
create database mysqltest_2;
|
||||||
|
grant all on mysqltest_1.* to mysqltest_u1@localhost;
|
||||||
|
use mysqltest_2;
|
||||||
|
create table t1 (i int);
|
||||||
|
|
||||||
|
# Connect as user with all rights on mysqltest_1 but with no rights on mysqltest_2.
|
||||||
|
connect (user1,localhost,mysqltest_u1,,mysqltest_1);
|
||||||
|
connection user1;
|
||||||
|
# As expected error is emitted
|
||||||
|
--error ER_TABLEACCESS_DENIED_ERROR
|
||||||
|
show create table mysqltest_2.t1;
|
||||||
|
# This should emit error as well
|
||||||
|
--error ER_TABLEACCESS_DENIED_ERROR
|
||||||
|
create table t1 like mysqltest_2.t1;
|
||||||
|
|
||||||
|
# Now let us check that SELECT privilege on the source is enough
|
||||||
|
connection default;
|
||||||
|
grant select on mysqltest_2.t1 to mysqltest_u1@localhost;
|
||||||
|
connection user1;
|
||||||
|
show create table mysqltest_2.t1;
|
||||||
|
create table t1 like mysqltest_2.t1;
|
||||||
|
|
||||||
|
# Clean-up
|
||||||
|
connection default;
|
||||||
|
use test;
|
||||||
|
drop database mysqltest_1;
|
||||||
|
drop database mysqltest_2;
|
||||||
|
drop user mysqltest_u1@localhost;
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
@ -262,7 +262,7 @@ EOF
|
|||||||
--exec $MYSQL test -e "show status" 2>&1 > /dev/null
|
--exec $MYSQL test -e "show status" 2>&1 > /dev/null
|
||||||
--exec $MYSQL --help 2>&1 > /dev/null
|
--exec $MYSQL --help 2>&1 > /dev/null
|
||||||
--exec $MYSQL --version 2>&1 > /dev/null
|
--exec $MYSQL --version 2>&1 > /dev/null
|
||||||
--enable_quary_log
|
--enable_query_log
|
||||||
|
|
||||||
#
|
#
|
||||||
# bug #26851: Mysql Client --pager Buffer Overflow
|
# bug #26851: Mysql Client --pager Buffer Overflow
|
||||||
|
@ -46,11 +46,6 @@ select otto from (select 1 as otto) as t1;
|
|||||||
--error 0
|
--error 0
|
||||||
select otto from (select 1 as otto) as t1;
|
select otto from (select 1 as otto) as t1;
|
||||||
|
|
||||||
# expectation <> response
|
|
||||||
-- // --error 1054
|
|
||||||
-- // select otto from (select 1 as otto) as t1;
|
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# Negative case(statement):
|
# Negative case(statement):
|
||||||
# The derived table t1 does not contain a column named 'friedrich' .
|
# The derived table t1 does not contain a column named 'friedrich' .
|
||||||
@ -331,9 +326,9 @@ select 3 from t1 ;
|
|||||||
# This is a comment
|
# This is a comment
|
||||||
# This is a ; comment
|
# This is a ; comment
|
||||||
# This is a -- comment
|
# This is a -- comment
|
||||||
-- This is also a comment
|
# -- This is also a comment
|
||||||
-- # This is also a comment
|
# -- # This is also a comment
|
||||||
-- This is also a ; comment
|
# -- This is also a ; comment
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# Test comments with embedded command
|
# Test comments with embedded command
|
||||||
@ -1871,7 +1866,7 @@ DROP TABLE t1;
|
|||||||
--disable_query_log
|
--disable_query_log
|
||||||
--exec $MYSQL_TEST --help 2>&1 > /dev/null
|
--exec $MYSQL_TEST --help 2>&1 > /dev/null
|
||||||
--exec $MYSQL_TEST --version 2>&1 > /dev/null
|
--exec $MYSQL_TEST --version 2>&1 > /dev/null
|
||||||
--enable_quary_log
|
--enable_query_log
|
||||||
--disable_abort_on_error
|
--disable_abort_on_error
|
||||||
--error 1
|
--error 1
|
||||||
--exec $MYSQL_TEST a b c 2>&1 > /dev/null
|
--exec $MYSQL_TEST a b c 2>&1 > /dev/null
|
||||||
|
@ -719,10 +719,10 @@ CREATE TABLE t1 (a INT UNSIGNED NOT NULL, b TIME);
|
|||||||
INSERT INTO t1 (a) VALUES (100000), (0), (100), (1000000),(10000), (1000), (10);
|
INSERT INTO t1 (a) VALUES (100000), (0), (100), (1000000),(10000), (1000), (10);
|
||||||
UPDATE t1 SET b = SEC_TO_TIME(a);
|
UPDATE t1 SET b = SEC_TO_TIME(a);
|
||||||
|
|
||||||
-- Correct ORDER
|
# Correct ORDER
|
||||||
SELECT a, b FROM t1 ORDER BY b DESC;
|
SELECT a, b FROM t1 ORDER BY b DESC;
|
||||||
|
|
||||||
-- must be ordered as the above
|
# must be ordered as the above
|
||||||
SELECT a, b FROM t1 ORDER BY SEC_TO_TIME(a) DESC;
|
SELECT a, b FROM t1 ORDER BY SEC_TO_TIME(a) DESC;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -7,10 +7,8 @@ select (1,2,3) IN ((3,2,3), (1,2,3), (1,3,3));
|
|||||||
select row(10,2,3) IN (row(3,2,3), row(1,2,3), row(1,3,3));
|
select row(10,2,3) IN (row(3,2,3), row(1,2,3), row(1,3,3));
|
||||||
select row(1,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3));
|
select row(1,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3));
|
||||||
select row(10,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3));
|
select row(10,2,3) IN (row(3,NULL,3), row(1,2,3), row(1,3,3));
|
||||||
--disable_ps_warnings
|
|
||||||
select row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a'));
|
select row('a',1.5,3) IN (row(1,2,3), row('a',1.5,3), row('a','a','a'));
|
||||||
select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3));
|
select row('a',0,3) IN (row(3,2,3), row('a','a','3'), row(1,3,3));
|
||||||
--enable_ps_warnings
|
|
||||||
select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3));
|
select row('a',0,3) IN (row(3,2,3), row('a','0','3'), row(1,3,3));
|
||||||
select row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3));
|
select row('a',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3));
|
||||||
select row('b',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3));
|
select row('b',1.5,3) IN (row(3,NULL,3), row('a',1.5,3), row(1,3,3));
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
# Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986)
|
# Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986)
|
||||||
|
|
||||||
source include/master-slave.inc;
|
source include/master-slave.inc;
|
||||||
|
source include/have_innodb.inc;
|
||||||
|
|
||||||
connection slave;
|
connection slave;
|
||||||
reset master;
|
reset master;
|
||||||
@ -150,5 +151,14 @@ drop table t2;
|
|||||||
connection master;
|
connection master;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
# BUG#17233 LOAD DATA INFILE: failure causes mysqld dbug_assert, binlog not flushed
|
||||||
|
CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;
|
||||||
|
|
||||||
|
--error 1062
|
||||||
|
LOAD DATA INFILE "../std_data_ln/words.dat" INTO TABLE t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
sync_with_master;
|
sync_with_master;
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@ -1454,7 +1454,7 @@ select bug12329();
|
|||||||
# Until we implement proper mechanism for invalidation of PS/SP when table
|
# Until we implement proper mechanism for invalidation of PS/SP when table
|
||||||
# or SP's are changed the following statement will fail with 'Table ... was
|
# or SP's are changed the following statement will fail with 'Table ... was
|
||||||
# not locked' error (this mechanism should be based on the new TDC).
|
# not locked' error (this mechanism should be based on the new TDC).
|
||||||
--error 1100
|
--error ER_NO_SUCH_TABLE
|
||||||
execute stmt1;
|
execute stmt1;
|
||||||
deallocate prepare stmt1;
|
deallocate prepare stmt1;
|
||||||
drop function bug12329;
|
drop function bug12329;
|
||||||
@ -1639,13 +1639,13 @@ create trigger t1_ai after insert on t1 for each row insert into t2 values (new.
|
|||||||
create view v1 as select * from t1;
|
create view v1 as select * from t1;
|
||||||
drop table t2;
|
drop table t2;
|
||||||
# Limitation, the desired error is ER_VIEW_INVALID
|
# Limitation, the desired error is ER_VIEW_INVALID
|
||||||
--error ER_TABLE_NOT_LOCKED
|
--error ER_NO_SUCH_TABLE
|
||||||
insert into v1 values (1);
|
insert into v1 values (1);
|
||||||
drop trigger t1_ai;
|
drop trigger t1_ai;
|
||||||
create function bug11555_1() returns int return (select max(i) from t2);
|
create function bug11555_1() returns int return (select max(i) from t2);
|
||||||
create trigger t1_ai after insert on t1 for each row set @a:=bug11555_1();
|
create trigger t1_ai after insert on t1 for each row set @a:=bug11555_1();
|
||||||
# Limitation, the desired error is ER_VIEW_INVALID
|
# Limitation, the desired error is ER_VIEW_INVALID
|
||||||
--error ER_TABLE_NOT_LOCKED
|
--error ER_NO_SUCH_TABLE
|
||||||
insert into v1 values (2);
|
insert into v1 values (2);
|
||||||
drop function bug11555_1;
|
drop function bug11555_1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -301,5 +301,36 @@ deallocate prepare stmt;
|
|||||||
drop function bug19634;
|
drop function bug19634;
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #27907 Misleading error message when opening/locking tables
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists bug_27907_logs;
|
||||||
|
drop table if exists bug_27907_t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
create table bug_27907_logs (a int);
|
||||||
|
create table bug_27907_t1 (a int);
|
||||||
|
|
||||||
|
delimiter |;
|
||||||
|
|
||||||
|
create trigger bug_27907_t1_ai after insert on bug_27907_t1
|
||||||
|
for each row
|
||||||
|
begin
|
||||||
|
insert into bug_27907_logs (a) values (1);
|
||||||
|
end|
|
||||||
|
|
||||||
|
delimiter ;|
|
||||||
|
|
||||||
|
drop table bug_27907_logs;
|
||||||
|
|
||||||
|
#
|
||||||
|
# was failing before with error ER_NOT_LOCKED
|
||||||
|
#
|
||||||
|
--error ER_NO_SUCH_TABLE
|
||||||
|
insert into bug_27907_t1(a) values (1);
|
||||||
|
|
||||||
|
drop table bug_27907_t1;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
@ -6975,7 +6975,7 @@ use test|
|
|||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop function if exists bug20777|
|
drop function if exists bug20777|
|
||||||
drop table if exists examplebug20777|
|
drop table if exists examplebug20777|
|
||||||
--enabled_warnings
|
--enable_warnings
|
||||||
create function bug20777(f1 bigint unsigned) returns bigint unsigned
|
create function bug20777(f1 bigint unsigned) returns bigint unsigned
|
||||||
begin
|
begin
|
||||||
set f1 = (f1 - 10); set f1 = (f1 + 10);
|
set f1 = (f1 - 10); set f1 = (f1 + 10);
|
||||||
|
@ -975,9 +975,7 @@ select * from t1;
|
|||||||
# Check that select don't abort even in strict mode (for now)
|
# Check that select don't abort even in strict mode (for now)
|
||||||
set sql_mode='traditional';
|
set sql_mode='traditional';
|
||||||
|
|
||||||
--disable_ps_warnings
|
|
||||||
select count(*) from t1 where STR_TO_DATE('2004.12.12 10:22:61','%Y.%m.%d %T') IS NULL;
|
select count(*) from t1 where STR_TO_DATE('2004.12.12 10:22:61','%Y.%m.%d %T') IS NULL;
|
||||||
--enable_ps_warnings
|
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
@ -260,11 +260,11 @@ insert into t2 values
|
|||||||
('dd', 1, NULL);
|
('dd', 1, NULL);
|
||||||
alter table t1 add index idx(ie1,ie2);
|
alter table t1 add index idx(ie1,ie2);
|
||||||
|
|
||||||
--cc 3 NULL NULL
|
# cc 3 NULL NULL
|
||||||
select oref, a, b, (a,b) in (select ie1,ie2 from t1 where oref=t2.oref) Z from t2 where a=3 and b is null ;
|
select oref, a, b, (a,b) in (select ie1,ie2 from t1 where oref=t2.oref) Z from t2 where a=3 and b is null ;
|
||||||
insert into t2 values ('new1', 10,10);
|
insert into t2 values ('new1', 10,10);
|
||||||
insert into t1 values ('new1', 1234, 10, NULL);
|
insert into t1 values ('new1', 1234, 10, NULL);
|
||||||
-- new1, 10, 10, NULL,
|
# new1, 10, 10, NULL,
|
||||||
select oref, a, b, (a,b) in (select ie1,ie2 from t1 where oref=t2.oref) Z from t2 where a=10 and b=10;
|
select oref, a, b, (a,b) in (select ie1,ie2 from t1 where oref=t2.oref) Z from t2 where a=10 and b=10;
|
||||||
explain extended
|
explain extended
|
||||||
select oref, a, b, (a,b) in (select ie1,ie2 from t1 where oref=t2.oref) Z from t2 where a=10 and b=10;
|
select oref, a, b, (a,b) in (select ie1,ie2 from t1 where oref=t2.oref) Z from t2 where a=10 and b=10;
|
||||||
|
@ -1000,9 +1000,9 @@ create trigger t1_bi after insert on t1 for each row insert into t3 values (new.
|
|||||||
# Until we implement proper mechanism for invalidation of PS/SP when table
|
# Until we implement proper mechanism for invalidation of PS/SP when table
|
||||||
# or SP's are changed these two statements will fail with 'Table ... was
|
# or SP's are changed these two statements will fail with 'Table ... was
|
||||||
# not locked' error (this mechanism should be based on the new TDC).
|
# not locked' error (this mechanism should be based on the new TDC).
|
||||||
--error 1100 #ER_TABLE_NOT_LOCKED
|
--error ER_NO_SUCH_TABLE
|
||||||
execute stmt1;
|
execute stmt1;
|
||||||
--error 1100 #ER_TABLE_NOT_LOCKED
|
--error ER_NO_SUCH_TABLE
|
||||||
call p1();
|
call p1();
|
||||||
deallocate prepare stmt1;
|
deallocate prepare stmt1;
|
||||||
drop procedure p1;
|
drop procedure p1;
|
||||||
|
@ -162,6 +162,7 @@
|
|||||||
|
|
||||||
#define HA_LEX_CREATE_TMP_TABLE 1
|
#define HA_LEX_CREATE_TMP_TABLE 1
|
||||||
#define HA_LEX_CREATE_IF_NOT_EXISTS 2
|
#define HA_LEX_CREATE_IF_NOT_EXISTS 2
|
||||||
|
#define HA_LEX_CREATE_TABLE_LIKE 4
|
||||||
#define HA_OPTION_NO_CHECKSUM (1L << 17)
|
#define HA_OPTION_NO_CHECKSUM (1L << 17)
|
||||||
#define HA_OPTION_NO_DELAY_KEY_WRITE (1L << 18)
|
#define HA_OPTION_NO_DELAY_KEY_WRITE (1L << 18)
|
||||||
#define HA_MAX_REC_LENGTH 65535
|
#define HA_MAX_REC_LENGTH 65535
|
||||||
|
@ -1279,20 +1279,31 @@ Query_log_event::Query_log_event()
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Query_log_event::Query_log_event()
|
SYNOPSIS
|
||||||
|
Query_log_event::Query_log_event()
|
||||||
|
thd - thread handle
|
||||||
|
query_arg - array of char representing the query
|
||||||
|
query_length - size of the `query_arg' array
|
||||||
|
using_trans - there is a modified transactional table
|
||||||
|
suppress_use - suppress the generation of 'USE' statements
|
||||||
|
killed_status_arg - an optional with default to THD::KILLED_NO_VALUE
|
||||||
|
if the value is different from the default, the arg
|
||||||
|
is set to the current thd->killed value.
|
||||||
|
A caller might need to masquerade thd->killed with
|
||||||
|
THD::NOT_KILLED.
|
||||||
|
DESCRIPTION
|
||||||
|
Creates an event for binlogging
|
||||||
|
The value for local `killed_status' can be supplied by caller.
|
||||||
*/
|
*/
|
||||||
Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
|
Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
|
||||||
ulong query_length, bool using_trans,
|
ulong query_length, bool using_trans,
|
||||||
bool suppress_use)
|
bool suppress_use, THD::killed_state killed_status_arg)
|
||||||
:Log_event(thd_arg,
|
:Log_event(thd_arg,
|
||||||
((thd_arg->tmp_table_used ? LOG_EVENT_THREAD_SPECIFIC_F : 0)
|
((thd_arg->tmp_table_used ? LOG_EVENT_THREAD_SPECIFIC_F : 0)
|
||||||
| (suppress_use ? LOG_EVENT_SUPPRESS_USE_F : 0)),
|
| (suppress_use ? LOG_EVENT_SUPPRESS_USE_F : 0)),
|
||||||
using_trans),
|
using_trans),
|
||||||
data_buf(0), query(query_arg), catalog(thd_arg->catalog),
|
data_buf(0), query(query_arg), catalog(thd_arg->catalog),
|
||||||
db(thd_arg->db), q_len((uint32) query_length),
|
db(thd_arg->db), q_len((uint32) query_length),
|
||||||
error_code((thd_arg->killed != THD::NOT_KILLED) ?
|
|
||||||
((thd_arg->system_thread & SYSTEM_THREAD_DELAYED_INSERT) ?
|
|
||||||
0 : thd->killed_errno()) : thd_arg->net.last_errno),
|
|
||||||
thread_id(thd_arg->thread_id),
|
thread_id(thd_arg->thread_id),
|
||||||
/* save the original thread id; we already know the server id */
|
/* save the original thread id; we already know the server id */
|
||||||
slave_proxy_id(thd_arg->variables.pseudo_thread_id),
|
slave_proxy_id(thd_arg->variables.pseudo_thread_id),
|
||||||
@ -1304,6 +1315,14 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
|
|||||||
charset_database_number(0)
|
charset_database_number(0)
|
||||||
{
|
{
|
||||||
time_t end_time;
|
time_t end_time;
|
||||||
|
|
||||||
|
if (killed_status_arg == THD::KILLED_NO_VALUE)
|
||||||
|
killed_status_arg= thd_arg->killed;
|
||||||
|
error_code=
|
||||||
|
(killed_status_arg == THD::NOT_KILLED) ? thd_arg->net.last_errno :
|
||||||
|
((thd_arg->system_thread & SYSTEM_THREAD_DELAYED_INSERT) ? 0 :
|
||||||
|
thd->killed_errno());
|
||||||
|
|
||||||
time(&end_time);
|
time(&end_time);
|
||||||
exec_time = (ulong) (end_time - thd->start_time);
|
exec_time = (ulong) (end_time - thd->start_time);
|
||||||
catalog_len = (catalog) ? (uint32) strlen(catalog) : 0;
|
catalog_len = (catalog) ? (uint32) strlen(catalog) : 0;
|
||||||
|
@ -804,7 +804,8 @@ public:
|
|||||||
#ifndef MYSQL_CLIENT
|
#ifndef MYSQL_CLIENT
|
||||||
|
|
||||||
Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length,
|
Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length,
|
||||||
bool using_trans, bool suppress_use);
|
bool using_trans, bool suppress_use,
|
||||||
|
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
|
||||||
const char* get_db() { return db; }
|
const char* get_db() { return db; }
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
void pack_info(Protocol* protocol);
|
void pack_info(Protocol* protocol);
|
||||||
|
@ -816,9 +816,8 @@ bool mysql_alter_table(THD *thd, char *new_db, char *new_name,
|
|||||||
Alter_info *alter_info,
|
Alter_info *alter_info,
|
||||||
uint order_num, ORDER *order, bool ignore);
|
uint order_num, ORDER *order, bool ignore);
|
||||||
bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list);
|
bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list);
|
||||||
bool mysql_create_like_table(THD *thd, TABLE_LIST *table,
|
bool mysql_create_like_table(THD *thd, TABLE_LIST *table, TABLE_LIST *src_table,
|
||||||
HA_CREATE_INFO *create_info,
|
HA_CREATE_INFO *create_info);
|
||||||
Table_ident *src_table);
|
|
||||||
bool mysql_rename_table(enum db_type base,
|
bool mysql_rename_table(enum db_type base,
|
||||||
const char *old_db,
|
const char *old_db,
|
||||||
const char * old_name,
|
const char * old_name,
|
||||||
|
@ -346,7 +346,15 @@ bool opt_endinfo, using_udf_functions;
|
|||||||
my_bool locked_in_memory;
|
my_bool locked_in_memory;
|
||||||
bool opt_using_transactions, using_update_log;
|
bool opt_using_transactions, using_update_log;
|
||||||
bool volatile abort_loop;
|
bool volatile abort_loop;
|
||||||
bool volatile shutdown_in_progress, grant_option;
|
bool volatile shutdown_in_progress;
|
||||||
|
/**
|
||||||
|
@brief 'grant_option' is used to indicate if privileges needs
|
||||||
|
to be checked, in which case the lock, LOCK_grant, is used
|
||||||
|
to protect access to the grant table.
|
||||||
|
@note This flag is dropped in 5.1
|
||||||
|
@see grant_init()
|
||||||
|
*/
|
||||||
|
bool volatile grant_option;
|
||||||
|
|
||||||
my_bool opt_skip_slave_start = 0; // If set, slave is not autostarted
|
my_bool opt_skip_slave_start = 0; // If set, slave is not autostarted
|
||||||
my_bool opt_reckless_slave = 0;
|
my_bool opt_reckless_slave = 0;
|
||||||
|
@ -539,7 +539,7 @@ sp_head::init_strings(THD *thd, LEX *lex)
|
|||||||
Trim "garbage" at the end. This is sometimes needed with the
|
Trim "garbage" at the end. This is sometimes needed with the
|
||||||
"/ * ! VERSION... * /" wrapper in dump files.
|
"/ * ! VERSION... * /" wrapper in dump files.
|
||||||
*/
|
*/
|
||||||
endp= skip_rear_comments((char*) m_body_begin, (char*) endp);
|
endp= skip_rear_comments(thd->charset(), (char*) m_body_begin, (char*) endp);
|
||||||
|
|
||||||
m_body.length= endp - m_body_begin;
|
m_body.length= endp - m_body_begin;
|
||||||
m_body.str= strmake_root(root, m_body_begin, m_body.length);
|
m_body.str= strmake_root(root, m_body_begin, m_body.length);
|
||||||
|
@ -2995,7 +2995,7 @@ bool mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
grant_option=TRUE;
|
|
||||||
thd->mem_root= old_root;
|
thd->mem_root= old_root;
|
||||||
pthread_mutex_unlock(&acl_cache->lock);
|
pthread_mutex_unlock(&acl_cache->lock);
|
||||||
|
|
||||||
@ -3162,7 +3162,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
grant_option=TRUE;
|
|
||||||
thd->mem_root= old_root;
|
thd->mem_root= old_root;
|
||||||
pthread_mutex_unlock(&acl_cache->lock);
|
pthread_mutex_unlock(&acl_cache->lock);
|
||||||
if (!result && !no_error)
|
if (!result && !no_error)
|
||||||
@ -3338,6 +3338,8 @@ my_bool grant_init()
|
|||||||
delete thd;
|
delete thd;
|
||||||
/* Remember that we don't have a THD */
|
/* Remember that we don't have a THD */
|
||||||
my_pthread_setspecific_ptr(THR_THD, 0);
|
my_pthread_setspecific_ptr(THR_THD, 0);
|
||||||
|
/* Set the grant option flag so we will check grants */
|
||||||
|
grant_option= TRUE;
|
||||||
DBUG_RETURN(return_val);
|
DBUG_RETURN(return_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3367,7 +3369,6 @@ static my_bool grant_load(TABLE_LIST *tables)
|
|||||||
THR_MALLOC);
|
THR_MALLOC);
|
||||||
DBUG_ENTER("grant_load");
|
DBUG_ENTER("grant_load");
|
||||||
|
|
||||||
grant_option = FALSE;
|
|
||||||
(void) hash_init(&column_priv_hash,system_charset_info,
|
(void) hash_init(&column_priv_hash,system_charset_info,
|
||||||
0,0,0, (hash_get_key) get_grant_table,
|
0,0,0, (hash_get_key) get_grant_table,
|
||||||
(hash_free_key) free_grant_table,0);
|
(hash_free_key) free_grant_table,0);
|
||||||
@ -3478,7 +3479,6 @@ static my_bool grant_load(TABLE_LIST *tables)
|
|||||||
}
|
}
|
||||||
while (!p_table->file->index_next(p_table->record[0]));
|
while (!p_table->file->index_next(p_table->record[0]));
|
||||||
}
|
}
|
||||||
grant_option= TRUE;
|
|
||||||
return_val=0; // Return ok
|
return_val=0; // Return ok
|
||||||
|
|
||||||
end_unlock:
|
end_unlock:
|
||||||
@ -3511,7 +3511,6 @@ my_bool grant_reload(THD *thd)
|
|||||||
{
|
{
|
||||||
TABLE_LIST tables[3];
|
TABLE_LIST tables[3];
|
||||||
HASH old_column_priv_hash, old_proc_priv_hash, old_func_priv_hash;
|
HASH old_column_priv_hash, old_proc_priv_hash, old_func_priv_hash;
|
||||||
bool old_grant_option;
|
|
||||||
MEM_ROOT old_mem;
|
MEM_ROOT old_mem;
|
||||||
my_bool return_val= 1;
|
my_bool return_val= 1;
|
||||||
DBUG_ENTER("grant_reload");
|
DBUG_ENTER("grant_reload");
|
||||||
@ -3541,7 +3540,6 @@ my_bool grant_reload(THD *thd)
|
|||||||
old_column_priv_hash= column_priv_hash;
|
old_column_priv_hash= column_priv_hash;
|
||||||
old_proc_priv_hash= proc_priv_hash;
|
old_proc_priv_hash= proc_priv_hash;
|
||||||
old_func_priv_hash= func_priv_hash;
|
old_func_priv_hash= func_priv_hash;
|
||||||
old_grant_option= grant_option;
|
|
||||||
old_mem= memex;
|
old_mem= memex;
|
||||||
|
|
||||||
if ((return_val= grant_load(tables)))
|
if ((return_val= grant_load(tables)))
|
||||||
@ -3551,7 +3549,6 @@ my_bool grant_reload(THD *thd)
|
|||||||
column_priv_hash= old_column_priv_hash; /* purecov: deadcode */
|
column_priv_hash= old_column_priv_hash; /* purecov: deadcode */
|
||||||
proc_priv_hash= old_proc_priv_hash;
|
proc_priv_hash= old_proc_priv_hash;
|
||||||
func_priv_hash= old_func_priv_hash;
|
func_priv_hash= old_func_priv_hash;
|
||||||
grant_option= old_grant_option; /* purecov: deadcode */
|
|
||||||
memex= old_mem; /* purecov: deadcode */
|
memex= old_mem; /* purecov: deadcode */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1669,10 +1669,17 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
|
|||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((thd->locked_tables) && (thd->locked_tables->lock_count > 0))
|
/*
|
||||||
my_error(ER_TABLE_NOT_LOCKED, MYF(0), alias);
|
No table in the locked tables list. In case of explicit LOCK TABLES
|
||||||
else
|
this can happen if a user did not include the able into the list.
|
||||||
|
In case of pre-locked mode locked tables list is generated automatically,
|
||||||
|
so we may only end up here if the table did not exist when
|
||||||
|
locked tables list was created.
|
||||||
|
*/
|
||||||
|
if (thd->prelocked_mode == PRELOCKED)
|
||||||
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias);
|
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->alias);
|
||||||
|
else
|
||||||
|
my_error(ER_TABLE_NOT_LOCKED, MYF(0), alias);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1397,7 +1397,14 @@ public:
|
|||||||
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
|
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
|
||||||
MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
|
MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
|
||||||
|
|
||||||
enum killed_state { NOT_KILLED=0, KILL_BAD_DATA=1, KILL_CONNECTION=ER_SERVER_SHUTDOWN, KILL_QUERY=ER_QUERY_INTERRUPTED };
|
enum killed_state
|
||||||
|
{
|
||||||
|
NOT_KILLED=0,
|
||||||
|
KILL_BAD_DATA=1,
|
||||||
|
KILL_CONNECTION=ER_SERVER_SHUTDOWN,
|
||||||
|
KILL_QUERY=ER_QUERY_INTERRUPTED,
|
||||||
|
KILLED_NO_VALUE /* means neither of the states */
|
||||||
|
};
|
||||||
killed_state volatile killed;
|
killed_state volatile killed;
|
||||||
|
|
||||||
/* scramble - random string sent to client on handshake */
|
/* scramble - random string sent to client on handshake */
|
||||||
@ -1670,7 +1677,8 @@ public:
|
|||||||
void end_statement();
|
void end_statement();
|
||||||
inline int killed_errno() const
|
inline int killed_errno() const
|
||||||
{
|
{
|
||||||
return killed != KILL_BAD_DATA ? killed : 0;
|
killed_state killed_val; /* to cache the volatile 'killed' */
|
||||||
|
return (killed_val= killed) != KILL_BAD_DATA ? killed_val : 0;
|
||||||
}
|
}
|
||||||
inline void send_kill_message() const
|
inline void send_kill_message() const
|
||||||
{
|
{
|
||||||
|
@ -870,9 +870,35 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
if (error <= 0)
|
if (error <= 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
[Guilhem wrote] Temporary errors may have filled
|
||||||
|
thd->net.last_error/errno. For example if there has
|
||||||
|
been a disk full error when writing the row, and it was
|
||||||
|
MyISAM, then thd->net.last_error/errno will be set to
|
||||||
|
"disk full"... and the my_pwrite() will wait until free
|
||||||
|
space appears, and so when it finishes then the
|
||||||
|
write_row() was entirely successful
|
||||||
|
*/
|
||||||
|
/* todo: consider removing */
|
||||||
thd->clear_error();
|
thd->clear_error();
|
||||||
|
}
|
||||||
|
/* bug#22725:
|
||||||
|
|
||||||
|
A query which per-row-loop can not be interrupted with
|
||||||
|
KILLED, like INSERT, and that does not invoke stored
|
||||||
|
routines can be binlogged with neglecting the KILLED error.
|
||||||
|
|
||||||
|
If there was no error (error == zero) until after the end of
|
||||||
|
inserting loop the KILLED flag that appeared later can be
|
||||||
|
disregarded since previously possible invocation of stored
|
||||||
|
routines did not result in any error due to the KILLED. In
|
||||||
|
such case the flag is ignored for constructing binlog event.
|
||||||
|
*/
|
||||||
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
Query_log_event qinfo(thd, thd->query, thd->query_length,
|
||||||
transactional_table, FALSE);
|
transactional_table, FALSE,
|
||||||
|
(error>0) ? thd->killed : THD::NOT_KILLED);
|
||||||
|
DBUG_ASSERT(thd->killed != THD::KILL_BAD_DATA || error > 0);
|
||||||
if (mysql_bin_log.write(&qinfo) && transactional_table)
|
if (mysql_bin_log.write(&qinfo) && transactional_table)
|
||||||
error=1;
|
error=1;
|
||||||
}
|
}
|
||||||
|
@ -1098,6 +1098,7 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
skip_rear_comments()
|
skip_rear_comments()
|
||||||
|
cs character set
|
||||||
begin pointer to the beginning of statement
|
begin pointer to the beginning of statement
|
||||||
end pointer to the end of statement
|
end pointer to the end of statement
|
||||||
|
|
||||||
@ -1108,10 +1109,11 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root)
|
|||||||
Pointer to the last non-comment symbol of the statement.
|
Pointer to the last non-comment symbol of the statement.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *skip_rear_comments(char *begin, char *end)
|
char *skip_rear_comments(CHARSET_INFO *cs, char *begin, char *end)
|
||||||
{
|
{
|
||||||
while (begin < end && (end[-1] <= ' ' || end[-1] == '*' ||
|
while (begin < end && (end[-1] == '*' ||
|
||||||
end[-1] == '/' || end[-1] == ';'))
|
end[-1] == '/' || end[-1] == ';' ||
|
||||||
|
my_isspace(cs, end[-1])))
|
||||||
end-= 1;
|
end-= 1;
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
@ -1271,4 +1271,4 @@ extern void lex_free(void);
|
|||||||
extern void lex_start(THD *thd);
|
extern void lex_start(THD *thd);
|
||||||
extern void lex_end(LEX *lex);
|
extern void lex_end(LEX *lex);
|
||||||
extern int MYSQLlex(void *arg, void *yythd);
|
extern int MYSQLlex(void *arg, void *yythd);
|
||||||
extern char *skip_rear_comments(char *begin, char *end);
|
extern char *skip_rear_comments(CHARSET_INFO *cs, char *begin, char *end);
|
||||||
|
@ -414,9 +414,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
if (transactional_table)
|
|
||||||
ha_autocommit_or_rollback(thd,error);
|
|
||||||
|
|
||||||
if (read_file_from_client)
|
if (read_file_from_client)
|
||||||
while (!read_info.next_line())
|
while (!read_info.next_line())
|
||||||
;
|
;
|
||||||
@ -460,6 +457,9 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /*!EMBEDDED_LIBRARY*/
|
#endif /*!EMBEDDED_LIBRARY*/
|
||||||
|
if (transactional_table)
|
||||||
|
ha_autocommit_or_rollback(thd,error);
|
||||||
|
|
||||||
error= -1; // Error on read
|
error= -1; // Error on read
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,7 @@ static bool check_db_used(THD *thd,TABLE_LIST *tables);
|
|||||||
static void remove_escape(char *name);
|
static void remove_escape(char *name);
|
||||||
static bool append_file_to_dir(THD *thd, const char **filename_ptr,
|
static bool append_file_to_dir(THD *thd, const char **filename_ptr,
|
||||||
const char *table_name);
|
const char *table_name);
|
||||||
|
static bool check_show_create_table_access(THD *thd, TABLE_LIST *table);
|
||||||
|
|
||||||
const char *any_db="*any*"; // Special symbol for check_access
|
const char *any_db="*any*"; // Special symbol for check_access
|
||||||
|
|
||||||
@ -3080,9 +3081,9 @@ mysql_execute_command(THD *thd)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* regular create */
|
/* regular create */
|
||||||
if (lex->name)
|
if (lex->create_info.options & HA_LEX_CREATE_TABLE_LIKE)
|
||||||
res= mysql_create_like_table(thd, create_table, &create_info,
|
res= mysql_create_like_table(thd, create_table, select_tables,
|
||||||
(Table_ident *)lex->name);
|
&create_info);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res= mysql_create_table(thd, create_table->db,
|
res= mysql_create_table(thd, create_table->db,
|
||||||
@ -3319,11 +3320,7 @@ end_with_restore_list:
|
|||||||
first_table->skip_temporary= 1;
|
first_table->skip_temporary= 1;
|
||||||
|
|
||||||
if (check_db_used(thd, all_tables) ||
|
if (check_db_used(thd, all_tables) ||
|
||||||
check_access(thd, SELECT_ACL | EXTRA_ACL, first_table->db,
|
check_show_create_table_access(thd, first_table))
|
||||||
&first_table->grant.privilege, 0, 0,
|
|
||||||
test(first_table->schema_table)))
|
|
||||||
goto error;
|
|
||||||
if (grant_option && check_grant(thd, SELECT_ACL, all_tables, 2, UINT_MAX, 0))
|
|
||||||
goto error;
|
goto error;
|
||||||
res= mysqld_show_create(thd, first_table);
|
res= mysqld_show_create(thd, first_table);
|
||||||
break;
|
break;
|
||||||
@ -7519,6 +7516,25 @@ bool insert_precheck(THD *thd, TABLE_LIST *tables)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Check privileges for SHOW CREATE TABLE statement.
|
||||||
|
|
||||||
|
@param thd Thread context
|
||||||
|
@param table Target table
|
||||||
|
|
||||||
|
@retval TRUE Failure
|
||||||
|
@retval FALSE Success
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool check_show_create_table_access(THD *thd, TABLE_LIST *table)
|
||||||
|
{
|
||||||
|
return check_access(thd, SELECT_ACL | EXTRA_ACL, table->db,
|
||||||
|
&table->grant.privilege, 0, 0,
|
||||||
|
test(table->schema_table)) ||
|
||||||
|
grant_option && check_grant(thd, SELECT_ACL, table, 2, UINT_MAX, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
CREATE TABLE query pre-check
|
CREATE TABLE query pre-check
|
||||||
|
|
||||||
@ -7583,6 +7599,11 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
|
|||||||
if (tables && check_table_access(thd, SELECT_ACL, tables,0))
|
if (tables && check_table_access(thd, SELECT_ACL, tables,0))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
else if (lex->create_info.options & HA_LEX_CREATE_TABLE_LIKE)
|
||||||
|
{
|
||||||
|
if (check_show_create_table_access(thd, tables))
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
error= FALSE;
|
error= FALSE;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -2719,7 +2719,8 @@ bool mysql_preload_keys(THD* thd, TABLE_LIST* tables)
|
|||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
mysql_create_like_table()
|
mysql_create_like_table()
|
||||||
thd Thread object
|
thd Thread object
|
||||||
table Table list (one table only)
|
table Table list element for target table
|
||||||
|
src_table Table list element for source table
|
||||||
create_info Create info
|
create_info Create info
|
||||||
table_ident Src table_ident
|
table_ident Src table_ident
|
||||||
|
|
||||||
@ -2728,61 +2729,52 @@ bool mysql_preload_keys(THD* thd, TABLE_LIST* tables)
|
|||||||
TRUE error
|
TRUE error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST *src_table,
|
||||||
HA_CREATE_INFO *create_info,
|
HA_CREATE_INFO *create_info)
|
||||||
Table_ident *table_ident)
|
|
||||||
{
|
{
|
||||||
TABLE **tmp_table;
|
TABLE **tmp_table;
|
||||||
char src_path[FN_REFLEN], dst_path[FN_REFLEN];
|
char src_path[FN_REFLEN], dst_path[FN_REFLEN];
|
||||||
char *db= table->db;
|
char *db= table->db;
|
||||||
char *table_name= table->table_name;
|
char *table_name= table->table_name;
|
||||||
char *src_db;
|
|
||||||
char *src_table= table_ident->table.str;
|
|
||||||
int err;
|
int err;
|
||||||
bool res= TRUE;
|
bool res= TRUE;
|
||||||
db_type not_used;
|
db_type not_used;
|
||||||
|
|
||||||
TABLE_LIST src_tables_list;
|
|
||||||
DBUG_ENTER("mysql_create_like_table");
|
DBUG_ENTER("mysql_create_like_table");
|
||||||
DBUG_ASSERT(table_ident->db.str); /* Must be set in the parser */
|
|
||||||
src_db= table_ident->db.str;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Validate the source table
|
By taking name-lock on the source table and holding LOCK_open mutex we
|
||||||
|
ensure that no concurrent DDL operation will mess with this table. Note
|
||||||
|
that holding only name-lock is not enough for this, because it won't block
|
||||||
|
other DDL statements that only take name-locks on the table and don't
|
||||||
|
open it (simple name-locks are not exclusive between each other).
|
||||||
|
|
||||||
|
Unfortunately, simply opening this table is not enough for our purproses,
|
||||||
|
since in 5.0 ALTER TABLE may change .FRM files on disk even if there are
|
||||||
|
connections that still have old version of table open. This 'optimization'
|
||||||
|
was removed in 5.1 so there we open the source table instead of taking
|
||||||
|
name-lock on it.
|
||||||
|
|
||||||
|
We also have to acquire LOCK_open to make copying of .frm file, call to
|
||||||
|
ha_create_table() and binlogging atomic against concurrent DML and DDL
|
||||||
|
operations on the target table.
|
||||||
*/
|
*/
|
||||||
if (table_ident->table.length > NAME_LEN ||
|
if (lock_and_wait_for_table_name(thd, src_table))
|
||||||
(table_ident->table.length &&
|
|
||||||
check_table_name(src_table,table_ident->table.length)))
|
|
||||||
{
|
|
||||||
my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table);
|
|
||||||
DBUG_RETURN(TRUE);
|
|
||||||
}
|
|
||||||
if (!src_db || check_db_name(src_db))
|
|
||||||
{
|
|
||||||
my_error(ER_WRONG_DB_NAME, MYF(0), src_db ? src_db : "NULL");
|
|
||||||
DBUG_RETURN(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bzero((gptr)&src_tables_list, sizeof(src_tables_list));
|
|
||||||
src_tables_list.db= src_db;
|
|
||||||
src_tables_list.table_name= src_table;
|
|
||||||
|
|
||||||
if (lock_and_wait_for_table_name(thd, &src_tables_list))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if ((tmp_table= find_temporary_table(thd, src_db, src_table)))
|
pthread_mutex_lock(&LOCK_open);
|
||||||
|
|
||||||
|
if ((tmp_table= find_temporary_table(thd, src_table->db,
|
||||||
|
src_table->table_name)))
|
||||||
strxmov(src_path, (*tmp_table)->s->path, reg_ext, NullS);
|
strxmov(src_path, (*tmp_table)->s->path, reg_ext, NullS);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strxmov(src_path, mysql_data_home, "/", src_db, "/", src_table,
|
strxmov(src_path, mysql_data_home, "/", src_table->db, "/",
|
||||||
reg_ext, NullS);
|
src_table->table_name, reg_ext, NullS);
|
||||||
/* Resolve symlinks (for windows) */
|
/* Resolve symlinks (for windows) */
|
||||||
fn_format(src_path, src_path, "", "", MYF(MY_UNPACK_FILENAME));
|
fn_format(src_path, src_path, "", "", MYF(MY_UNPACK_FILENAME));
|
||||||
if (lower_case_table_names)
|
|
||||||
my_casedn_str(files_charset_info, src_path);
|
|
||||||
if (access(src_path, F_OK))
|
if (access(src_path, F_OK))
|
||||||
{
|
{
|
||||||
my_error(ER_BAD_TABLE_ERROR, MYF(0), src_table);
|
my_error(ER_BAD_TABLE_ERROR, MYF(0), src_table->table_name);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2792,10 +2784,13 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
*/
|
*/
|
||||||
if (mysql_frm_type(thd, src_path, ¬_used) != FRMTYPE_TABLE)
|
if (mysql_frm_type(thd, src_path, ¬_used) != FRMTYPE_TABLE)
|
||||||
{
|
{
|
||||||
my_error(ER_WRONG_OBJECT, MYF(0), src_db, src_table, "BASE TABLE");
|
my_error(ER_WRONG_OBJECT, MYF(0), src_table->db, src_table->table_name,
|
||||||
|
"BASE TABLE");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("sleep_create_like_before_check_if_exists", my_sleep(6000000););
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Validate the destination table
|
Validate the destination table
|
||||||
|
|
||||||
@ -2811,27 +2806,22 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool exists;
|
|
||||||
strxmov(dst_path, mysql_data_home, "/", db, "/", table_name,
|
strxmov(dst_path, mysql_data_home, "/", db, "/", table_name,
|
||||||
reg_ext, NullS);
|
reg_ext, NullS);
|
||||||
fn_format(dst_path, dst_path, "", "", MYF(MY_UNPACK_FILENAME));
|
fn_format(dst_path, dst_path, "", "", MYF(MY_UNPACK_FILENAME));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Note that this critical section should actually cover most
|
Note that starting from 5.1 we obtain name-lock on target
|
||||||
of mysql_create_like_table() function. See bugs #18950 and
|
table instead of inspecting table cache for presence
|
||||||
#23667 for more information.
|
|
||||||
Also note that starting from 5.1 we obtain name-lock on
|
|
||||||
target table instead of inspecting table cache for presence
|
|
||||||
of open placeholders (see comment in mysql_create_table()).
|
of open placeholders (see comment in mysql_create_table()).
|
||||||
*/
|
*/
|
||||||
pthread_mutex_lock(&LOCK_open);
|
if (table_cache_has_open_placeholder(thd, db, table_name) ||
|
||||||
exists= (table_cache_has_open_placeholder(thd, db, table_name) ||
|
!access(dst_path, F_OK))
|
||||||
!access(dst_path, F_OK));
|
|
||||||
pthread_mutex_unlock(&LOCK_open);
|
|
||||||
if (exists)
|
|
||||||
goto table_exists;
|
goto table_exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("sleep_create_like_before_copy", my_sleep(6000000););
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create a new table by copying from source table
|
Create a new table by copying from source table
|
||||||
*/
|
*/
|
||||||
@ -2844,6 +2834,8 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("sleep_create_like_before_ha_create", my_sleep(6000000););
|
||||||
|
|
||||||
/*
|
/*
|
||||||
As mysql_truncate don't work on a new table at this stage of
|
As mysql_truncate don't work on a new table at this stage of
|
||||||
creation, instead create the table directly (for both normal
|
creation, instead create the table directly (for both normal
|
||||||
@ -2868,6 +2860,8 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
goto err; /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("sleep_create_like_before_binlogging", my_sleep(6000000););
|
||||||
|
|
||||||
// Must be written before unlock
|
// Must be written before unlock
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
@ -2892,8 +2886,7 @@ table_exists:
|
|||||||
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
|
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
pthread_mutex_lock(&LOCK_open);
|
unlock_table_name(thd, src_table);
|
||||||
unlock_table_name(thd, &src_tables_list);
|
|
||||||
pthread_mutex_unlock(&LOCK_open);
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
DBUG_RETURN(res);
|
DBUG_RETURN(res);
|
||||||
}
|
}
|
||||||
|
@ -521,6 +521,37 @@ int mysql_update(THD *thd,
|
|||||||
table->file->unlock_row();
|
table->file->unlock_row();
|
||||||
thd->row_count++;
|
thd->row_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
todo bug#27571: to avoid asynchronization of `error' and
|
||||||
|
`error_code' of binlog event constructor
|
||||||
|
|
||||||
|
The concept, which is a bit different for insert(!), is to
|
||||||
|
replace `error' assignment with the following lines
|
||||||
|
|
||||||
|
killed_status= thd->killed; // get the status of the volatile
|
||||||
|
|
||||||
|
Notice: thd->killed is type of "state" whereas the lhs has
|
||||||
|
"status" the suffix which translates according to WordNet: a state
|
||||||
|
at a particular time - at the time of the end of per-row loop in
|
||||||
|
our case. Binlogging ops are conducted with the status.
|
||||||
|
|
||||||
|
error= (killed_status == THD::NOT_KILLED)? error : 1;
|
||||||
|
|
||||||
|
which applies to most mysql_$query functions.
|
||||||
|
Event's constructor will accept `killed_status' as an argument:
|
||||||
|
|
||||||
|
Query_log_event qinfo(..., killed_status);
|
||||||
|
|
||||||
|
thd->killed might be changed after killed_status had got cached and this
|
||||||
|
won't affect binlogging event but other effects remain.
|
||||||
|
|
||||||
|
Open issue: In a case the error happened not because of KILLED -
|
||||||
|
and then KILLED was caught later still within the loop - we shall
|
||||||
|
do something to avoid binlogging of incorrect ER_SERVER_SHUTDOWN
|
||||||
|
error_code.
|
||||||
|
*/
|
||||||
|
|
||||||
if (thd->killed && !error)
|
if (thd->killed && !error)
|
||||||
error= 1; // Aborted
|
error= 1; // Aborted
|
||||||
end_read_record(&info);
|
end_read_record(&info);
|
||||||
|
@ -824,6 +824,103 @@ loop_out:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* fill structure */
|
||||||
|
view->query.str= (char*)str.ptr();
|
||||||
|
view->query.length= str.length()-1; // we do not need last \0
|
||||||
|
view->source.str= thd->query + thd->lex->create_view_select_start;
|
||||||
|
view->source.length= (char *)skip_rear_comments((char *)view->source.str,
|
||||||
|
(char *)thd->query +
|
||||||
|
thd->query_length) -
|
||||||
|
view->source.str;
|
||||||
|
view->file_version= 1;
|
||||||
|
view->calc_md5(md5);
|
||||||
|
view->md5.str= md5;
|
||||||
|
view->md5.length= 32;
|
||||||
|
can_be_merged= lex->can_be_merged();
|
||||||
|
if (lex->create_view_algorithm == VIEW_ALGORITHM_MERGE &&
|
||||||
|
!lex->can_be_merged())
|
||||||
|
{
|
||||||
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_VIEW_MERGE,
|
||||||
|
ER(ER_WARN_VIEW_MERGE));
|
||||||
|
lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
|
||||||
|
}
|
||||||
|
view->algorithm= lex->create_view_algorithm;
|
||||||
|
view->definer.user= lex->definer->user;
|
||||||
|
view->definer.host= lex->definer->host;
|
||||||
|
view->view_suid= lex->create_view_suid;
|
||||||
|
view->with_check= lex->create_view_check;
|
||||||
|
if ((view->updatable_view= (can_be_merged &&
|
||||||
|
view->algorithm != VIEW_ALGORITHM_TMPTABLE)))
|
||||||
|
{
|
||||||
|
/* TODO: change here when we will support UNIONs */
|
||||||
|
for (TABLE_LIST *tbl= (TABLE_LIST *)lex->select_lex.table_list.first;
|
||||||
|
tbl;
|
||||||
|
tbl= tbl->next_local)
|
||||||
|
{
|
||||||
|
if ((tbl->view && !tbl->updatable_view) || tbl->schema_table)
|
||||||
|
{
|
||||||
|
view->updatable_view= 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (TABLE_LIST *up= tbl; up; up= up->embedding)
|
||||||
|
{
|
||||||
|
if (up->outer_join)
|
||||||
|
{
|
||||||
|
view->updatable_view= 0;
|
||||||
|
goto loop_out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* fill structure */
|
||||||
|
view->query.str= (char*)str.ptr();
|
||||||
|
view->query.length= str.length()-1; // we do not need last \0
|
||||||
|
view->source.str= thd->query + thd->lex->create_view_select_start;
|
||||||
|
view->source.length= (char *)skip_rear_comments(thd->charset(),
|
||||||
|
(char *)view->source.str,
|
||||||
|
(char *)thd->query +
|
||||||
|
thd->query_length) -
|
||||||
|
view->source.str;
|
||||||
|
view->file_version= 1;
|
||||||
|
view->calc_md5(md5);
|
||||||
|
view->md5.str= md5;
|
||||||
|
view->md5.length= 32;
|
||||||
|
can_be_merged= lex->can_be_merged();
|
||||||
|
if (lex->create_view_algorithm == VIEW_ALGORITHM_MERGE &&
|
||||||
|
!lex->can_be_merged())
|
||||||
|
{
|
||||||
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_VIEW_MERGE,
|
||||||
|
ER(ER_WARN_VIEW_MERGE));
|
||||||
|
lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
|
||||||
|
}
|
||||||
|
view->algorithm= lex->create_view_algorithm;
|
||||||
|
view->definer.user= lex->definer->user;
|
||||||
|
view->definer.host= lex->definer->host;
|
||||||
|
view->view_suid= lex->create_view_suid;
|
||||||
|
view->with_check= lex->create_view_check;
|
||||||
|
if ((view->updatable_view= (can_be_merged &&
|
||||||
|
view->algorithm != VIEW_ALGORITHM_TMPTABLE)))
|
||||||
|
{
|
||||||
|
/* TODO: change here when we will support UNIONs */
|
||||||
|
for (TABLE_LIST *tbl= (TABLE_LIST *)lex->select_lex.table_list.first;
|
||||||
|
tbl;
|
||||||
|
tbl= tbl->next_local)
|
||||||
|
{
|
||||||
|
if ((tbl->view && !tbl->updatable_view) || tbl->schema_table)
|
||||||
|
{
|
||||||
|
view->updatable_view= 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (TABLE_LIST *up= tbl; up; up= up->embedding)
|
||||||
|
{
|
||||||
|
if (up->outer_join)
|
||||||
|
{
|
||||||
|
view->updatable_view= 0;
|
||||||
|
goto loop_out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
Check that table of main select do not used in subqueries.
|
Check that table of main select do not used in subqueries.
|
||||||
|
|
||||||
|
@ -1483,7 +1483,6 @@ create:
|
|||||||
lex->create_info.options=$2 | $4;
|
lex->create_info.options=$2 | $4;
|
||||||
lex->create_info.db_type= (enum db_type) lex->thd->variables.table_type;
|
lex->create_info.db_type= (enum db_type) lex->thd->variables.table_type;
|
||||||
lex->create_info.default_table_charset= NULL;
|
lex->create_info.default_table_charset= NULL;
|
||||||
lex->name=0;
|
|
||||||
}
|
}
|
||||||
create2
|
create2
|
||||||
{ Lex->current_select= &Lex->select_lex; }
|
{ Lex->current_select= &Lex->select_lex; }
|
||||||
@ -2763,27 +2762,15 @@ create2:
|
|||||||
| opt_create_table_options create3 {}
|
| opt_create_table_options create3 {}
|
||||||
| LIKE table_ident
|
| LIKE table_ident
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
Lex->create_info.options|= HA_LEX_CREATE_TABLE_LIKE;
|
||||||
THD *thd= lex->thd;
|
if (!Lex->select_lex.add_table_to_list(YYTHD, $2, NULL, 0, TL_READ))
|
||||||
if (!(lex->name= (char *)$2))
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
if ($2->db.str == NULL &&
|
|
||||||
thd->copy_db_to(&($2->db.str), &($2->db.length)))
|
|
||||||
{
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
| '(' LIKE table_ident ')'
|
| '(' LIKE table_ident ')'
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
Lex->create_info.options|= HA_LEX_CREATE_TABLE_LIKE;
|
||||||
THD *thd= lex->thd;
|
if (!Lex->select_lex.add_table_to_list(YYTHD, $3, NULL, 0, TL_READ))
|
||||||
if (!(lex->name= (char *)$3))
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
if ($3->db.str == NULL &&
|
|
||||||
thd->copy_db_to(&($3->db.str), &($3->db.length)))
|
|
||||||
{
|
|
||||||
MYSQL_YYABORT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -15560,6 +15560,69 @@ static void test_bug24179()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bug#27876 (SF with cyrillic variable name fails during execution (regression))
|
||||||
|
*/
|
||||||
|
static void test_bug27876()
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
MYSQL_RES *result;
|
||||||
|
|
||||||
|
char utf8_func[] =
|
||||||
|
{
|
||||||
|
0xd1, 0x84, 0xd1, 0x83, 0xd0, 0xbd, 0xd0, 0xba,
|
||||||
|
0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb9, 0xd0, 0xba,
|
||||||
|
0xd0, 0xb0,
|
||||||
|
0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
char utf8_param[] =
|
||||||
|
{
|
||||||
|
0xd0, 0xbf, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0,
|
||||||
|
0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x8a,
|
||||||
|
0xd1, 0x80, 0x5f, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1,
|
||||||
|
0x80, 0xd1, 0x81, 0xd0, 0xb8, 0xd1, 0x8f,
|
||||||
|
0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
char query[500];
|
||||||
|
|
||||||
|
DBUG_ENTER("test_bug27876");
|
||||||
|
myheader("test_bug27876");
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "set names utf8");
|
||||||
|
myquery(rc);
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "select version()");
|
||||||
|
myquery(rc);
|
||||||
|
result= mysql_store_result(mysql);
|
||||||
|
mytest(result);
|
||||||
|
|
||||||
|
sprintf(query, "DROP FUNCTION IF EXISTS %s", utf8_func);
|
||||||
|
rc= mysql_query(mysql, query);
|
||||||
|
myquery(rc);
|
||||||
|
|
||||||
|
sprintf(query,
|
||||||
|
"CREATE FUNCTION %s( %s VARCHAR(25))"
|
||||||
|
" RETURNS VARCHAR(25) DETERMINISTIC RETURN %s",
|
||||||
|
utf8_func, utf8_param, utf8_param);
|
||||||
|
rc= mysql_query(mysql, query);
|
||||||
|
myquery(rc);
|
||||||
|
sprintf(query, "SELECT %s(VERSION())", utf8_func);
|
||||||
|
rc= mysql_query(mysql, query);
|
||||||
|
myquery(rc);
|
||||||
|
result= mysql_store_result(mysql);
|
||||||
|
mytest(result);
|
||||||
|
|
||||||
|
sprintf(query, "DROP FUNCTION %s", utf8_func);
|
||||||
|
rc= mysql_query(mysql, query);
|
||||||
|
myquery(rc);
|
||||||
|
|
||||||
|
rc= mysql_query(mysql, "set names default");
|
||||||
|
myquery(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Read and parse arguments and MySQL options from my.cnf
|
Read and parse arguments and MySQL options from my.cnf
|
||||||
*/
|
*/
|
||||||
@ -15840,6 +15903,7 @@ static struct my_tests_st my_tests[]= {
|
|||||||
{ "test_bug23383", test_bug23383 },
|
{ "test_bug23383", test_bug23383 },
|
||||||
{ "test_bug21635", test_bug21635 },
|
{ "test_bug21635", test_bug21635 },
|
||||||
{ "test_bug24179", test_bug24179 },
|
{ "test_bug24179", test_bug24179 },
|
||||||
|
{ "test_bug27876", test_bug27876 },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user