mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
merging with mysql-5.0-bugteam tree.
This commit is contained in:
commit
c75cd3d70f
55 changed files with 923 additions and 162 deletions
|
@ -2728,8 +2728,10 @@ then
|
|||
AC_SUBST(THREAD_LOBJECTS)
|
||||
fi
|
||||
|
||||
if test "$with_server" != "no"
|
||||
if test "$with_server" = "no"
|
||||
then
|
||||
AM_CONDITIONAL([BUILD_INNODB_TOOLS], [false])
|
||||
else
|
||||
server_scripts="mysqld_safe mysql_install_db"
|
||||
sql_server_dirs="strings mysys dbug extra regex"
|
||||
|
||||
|
|
|
@ -185,11 +185,36 @@ static const char *get_ha_error_msg(int code)
|
|||
}
|
||||
|
||||
|
||||
#if defined(__WIN__)
|
||||
static my_bool print_win_error_msg(DWORD error, my_bool verbose)
|
||||
{
|
||||
LPTSTR s;
|
||||
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL, error, 0, (LPTSTR)&s, 0,
|
||||
NULL))
|
||||
{
|
||||
if (verbose)
|
||||
printf("Win32 error code %d: %s", error, s);
|
||||
else
|
||||
puts(s);
|
||||
LocalFree(s);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int main(int argc,char *argv[])
|
||||
{
|
||||
int error,code,found;
|
||||
const char *msg;
|
||||
char *unknown_error = 0;
|
||||
#if defined(__WIN__)
|
||||
my_bool skip_win_message= 0;
|
||||
#endif
|
||||
MY_INIT(argv[0]);
|
||||
|
||||
if (get_options(&argc,&argv))
|
||||
|
@ -286,8 +311,15 @@ int main(int argc,char *argv[])
|
|||
/* Error message still not found, look in handler error codes */
|
||||
if (!(msg=get_ha_error_msg(code)))
|
||||
{
|
||||
fprintf(stderr,"Illegal error code: %d\n",code);
|
||||
error=1;
|
||||
#if defined(__WIN__)
|
||||
if (!(skip_win_message= !print_win_error_msg((DWORD)code, verbose)))
|
||||
{
|
||||
#endif
|
||||
fprintf(stderr,"Illegal error code: %d\n",code);
|
||||
error=1;
|
||||
#if defined(__WIN__)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -298,6 +330,10 @@ int main(int argc,char *argv[])
|
|||
puts(msg);
|
||||
}
|
||||
}
|
||||
#if defined(__WIN__)
|
||||
if (!skip_win_message)
|
||||
print_win_error_msg((DWORD)code, verbose);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,12 +11,12 @@
|
|||
#
|
||||
# Dump all global variables
|
||||
#
|
||||
show global variables;
|
||||
SHOW GLOBAL VARIABLES WHERE variable_name != 'timestamp';
|
||||
|
||||
#
|
||||
# Dump all databases
|
||||
#
|
||||
show databases;
|
||||
SHOW DATABASES;
|
||||
|
||||
#
|
||||
# Dump the "test" database, all it's tables and their data
|
||||
|
@ -29,23 +29,23 @@ show databases;
|
|||
#
|
||||
--exec $MYSQL_DUMP --skip-comments --no-data mysql
|
||||
use mysql;
|
||||
select * from columns_priv;
|
||||
select * from db order by host, db, user;
|
||||
select * from func;
|
||||
select * from help_category;
|
||||
select * from help_keyword;
|
||||
select * from help_relation;
|
||||
select * from help_relation;
|
||||
select * from host;
|
||||
select * from proc;
|
||||
select * from procs_priv;
|
||||
select * from tables_priv;
|
||||
select * from time_zone;
|
||||
select * from time_zone_leap_second;
|
||||
select * from time_zone_name;
|
||||
select * from time_zone_transition;
|
||||
select * from time_zone_transition_type;
|
||||
select * from user;
|
||||
SELECT * FROM columns_priv;
|
||||
SELECT * FROM db ORDER BY host, db, user;
|
||||
SELECT * FROM func;
|
||||
SELECT * FROM help_category;
|
||||
SELECT * FROM help_keyword;
|
||||
SELECT * FROM help_relation;
|
||||
SELECT * FROM help_relation;
|
||||
SELECT * FROM host;
|
||||
SELECT * FROM proc;
|
||||
SELECT * FROM procs_priv;
|
||||
SELECT * FROM tables_priv;
|
||||
SELECT * FROM time_zone;
|
||||
SELECT * FROM time_zone_leap_second;
|
||||
SELECT * FROM time_zone_name;
|
||||
SELECT * FROM time_zone_transition;
|
||||
SELECT * FROM time_zone_transition_type;
|
||||
SELECT * FROM user;
|
||||
|
||||
|
||||
|
||||
|
|
11
mysql-test/r/ctype_filesystem.result
Normal file
11
mysql-test/r/ctype_filesystem.result
Normal file
|
@ -0,0 +1,11 @@
|
|||
SET CHARACTER SET utf8;
|
||||
SHOW VARIABLES like 'character_sets_dir';
|
||||
Variable_name Value
|
||||
character_sets_dir MYSQL_TEST_DIR/ß/
|
||||
SHOW VARIABLES like 'character_set_filesystem';
|
||||
Variable_name Value
|
||||
character_set_filesystem latin1
|
||||
SHOW VARIABLES like 'character_set_client';
|
||||
Variable_name Value
|
||||
character_set_client utf8
|
||||
SET CHARACTER SET default;
|
|
@ -1813,3 +1813,35 @@ select hex(_utf8 B'001111111111');
|
|||
ERROR HY000: Invalid utf8 character string: 'FF'
|
||||
select (_utf8 X'616263FF');
|
||||
ERROR HY000: Invalid utf8 character string: 'FF'
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL);
|
||||
INSERT INTO t1 VALUES (70000, 1092), (70001, 1085), (70002, 1065);
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;
|
||||
CONVERT(a, CHAR) CONVERT(b, CHAR)
|
||||
70002 1065
|
||||
70001 1085
|
||||
70000 1092
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1;
|
||||
CONVERT(a, CHAR) CONVERT(b, CHAR)
|
||||
70000 1092
|
||||
70001 1085
|
||||
70002 1065
|
||||
ALTER TABLE t1 ADD UNIQUE (b);
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;
|
||||
CONVERT(a, CHAR) CONVERT(b, CHAR)
|
||||
70002 1065
|
||||
70001 1085
|
||||
70000 1092
|
||||
DROP INDEX b ON t1;
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;
|
||||
CONVERT(a, CHAR) CONVERT(b, CHAR)
|
||||
70002 1065
|
||||
70001 1085
|
||||
70000 1092
|
||||
ALTER TABLE t1 ADD INDEX (b);
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) from t1 GROUP BY b;
|
||||
CONVERT(a, CHAR) CONVERT(b, CHAR)
|
||||
70002 1065
|
||||
70001 1085
|
||||
70000 1092
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -469,3 +469,31 @@ SELECT * FROM t1 WHERE MATCH(a) AGAINST ('"aaaa"' IN BOOLEAN MODE);
|
|||
a
|
||||
aaaaa aaaa
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a VARCHAR(255), b INT, FULLTEXT(a), KEY(b));
|
||||
INSERT INTO t1 VALUES('test', 1),('test', 1),('test', 1),('test', 1),
|
||||
('test', 1),('test', 2),('test', 3),('test', 4);
|
||||
EXPLAIN SELECT * FROM t1
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 fulltext b,a a 0 1 Using where
|
||||
EXPLAIN SELECT * FROM t1 USE INDEX(a)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 fulltext a a 0 1 Using where
|
||||
EXPLAIN SELECT * FROM t1 FORCE INDEX(a)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 fulltext a a 0 1 Using where
|
||||
EXPLAIN SELECT * FROM t1 IGNORE INDEX(a)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref b b 5 const 4 Using where
|
||||
EXPLAIN SELECT * FROM t1 USE INDEX(b)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref b b 5 const 4 Using where
|
||||
EXPLAIN SELECT * FROM t1 FORCE INDEX(b)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref b b 5 const 4 Using where
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -1425,4 +1425,27 @@ SELECT AVG(a), CAST(AVG(a) AS DECIMAL) FROM t1;
|
|||
AVG(a) CAST(AVG(a) AS DECIMAL)
|
||||
15 15
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (1,1), (1,2), (1,3);
|
||||
SET SQL_MODE='ONLY_FULL_GROUP_BY';
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
3
|
||||
SELECT COUNT(*) FROM t1 where a=1;
|
||||
COUNT(*)
|
||||
3
|
||||
SELECT COUNT(*),a FROM t1;
|
||||
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
SELECT COUNT(*) FROM t1 a JOIN t1 b ON a.a= b.a;
|
||||
COUNT(*)
|
||||
9
|
||||
SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a)
|
||||
FROM t1 outr;
|
||||
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
SELECT COUNT(*) FROM t1 a JOIN t1 outr
|
||||
ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a);
|
||||
COUNT(*)
|
||||
0
|
||||
SET SQL_MODE=default;
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -256,3 +256,15 @@ a
|
|||
select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f");
|
||||
str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f")
|
||||
2003-01-02 10:11:12.001200
|
||||
select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10'),time('00:00:00');
|
||||
timediff('2008-09-29 20:10:10','2008-09-30 20:10:10') time('00:00:00')
|
||||
-24:00:00 00:00:00
|
||||
select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')>time('00:00:00');
|
||||
timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')>time('00:00:00')
|
||||
0
|
||||
select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')<time('00:00:00');
|
||||
timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')<time('00:00:00')
|
||||
1
|
||||
SELECT CAST(time('-73:42:12') AS DECIMAL);
|
||||
CAST(time('-73:42:12') AS DECIMAL)
|
||||
-734212
|
||||
|
|
|
@ -1261,4 +1261,10 @@ a b c
|
|||
5 1 1
|
||||
4 1 1
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (a char(50)) ENGINE=InnoDB;
|
||||
CREATE INDEX i1 on t1 (a(3));
|
||||
SELECT * FROM t1 WHERE a = 'abcde';
|
||||
a
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -378,29 +378,6 @@ where 0=1;
|
|||
delete t1, t2 from t2,t1
|
||||
where t1.id1=t2.id2 and 0=1;
|
||||
drop table t1,t2;
|
||||
create table t1 ( a int not null, b int not null) ;
|
||||
alter table t1 add index i1(a);
|
||||
delete from t1 where a > 2000000;
|
||||
create table t2 like t1;
|
||||
insert into t2 select * from t1;
|
||||
select 't2 rows before small delete', count(*) from t1;
|
||||
t2 rows before small delete count(*)
|
||||
t2 rows before small delete 2000000
|
||||
delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 2;
|
||||
select 't2 rows after small delete', count(*) from t2;
|
||||
t2 rows after small delete count(*)
|
||||
t2 rows after small delete 1999999
|
||||
select 't1 rows after small delete', count(*) from t1;
|
||||
t1 rows after small delete count(*)
|
||||
t1 rows after small delete 1999999
|
||||
delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 100*1000;
|
||||
select 't2 rows after big delete', count(*) from t2;
|
||||
t2 rows after big delete count(*)
|
||||
t2 rows after big delete 1900001
|
||||
select 't1 rows after big delete', count(*) from t1;
|
||||
t1 rows after big delete count(*)
|
||||
t1 rows after big delete 1900001
|
||||
drop table t1,t2;
|
||||
CREATE TABLE t1 ( a int );
|
||||
CREATE TABLE t2 ( a int );
|
||||
DELETE t1 FROM t1, t2 AS t3;
|
||||
|
|
25
mysql-test/r/multi_update2.result
Normal file
25
mysql-test/r/multi_update2.result
Normal file
|
@ -0,0 +1,25 @@
|
|||
DROP TABLE IF EXISTS t1,t2;
|
||||
CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL) ;
|
||||
# The protocolling of many inserts into t1 is suppressed.
|
||||
ALTER TABLE t1 ADD INDEX i1(a);
|
||||
DELETE FROM t1 WHERE a > 2000000;
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
SELECT 't2 rows before small delete', COUNT(*) FROM t1;
|
||||
t2 rows before small delete COUNT(*)
|
||||
t2 rows before small delete 2000000
|
||||
DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 2;
|
||||
SELECT 't2 rows after small delete', COUNT(*) FROM t2;
|
||||
t2 rows after small delete COUNT(*)
|
||||
t2 rows after small delete 1999999
|
||||
SELECT 't1 rows after small delete', COUNT(*) FROM t1;
|
||||
t1 rows after small delete COUNT(*)
|
||||
t1 rows after small delete 1999999
|
||||
DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 100*1000;
|
||||
SELECT 't2 rows after big delete', COUNT(*) FROM t2;
|
||||
t2 rows after big delete COUNT(*)
|
||||
t2 rows after big delete 1900001
|
||||
SELECT 't1 rows after big delete', COUNT(*) FROM t1;
|
||||
t1 rows after big delete COUNT(*)
|
||||
t1 rows after big delete 1900001
|
||||
DROP TABLE t1,t2;
|
6
mysql-test/r/perror-win.result
Normal file
6
mysql-test/r/perror-win.result
Normal file
|
@ -0,0 +1,6 @@
|
|||
MySQL error code 150: Foreign key constraint is incorrectly formed
|
||||
Win32 error code 150: System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed.
|
||||
OS error code 23: Too many open files in system
|
||||
Win32 error code 23: Data error (cyclic redundancy check).
|
||||
Win32 error code 1062: The service has not been started.
|
||||
Illegal error code: 30000
|
|
@ -4407,4 +4407,49 @@ pk a
|
|||
3 30
|
||||
2 20
|
||||
DROP TABLE t1,t2;
|
||||
CREATE TABLE t1 (s1 char(1));
|
||||
INSERT INTO t1 VALUES ('a');
|
||||
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
|
||||
s1
|
||||
a
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(id BIGINT);
|
||||
CREATE TABLE t2(id1 BIGINT, id2 BIGINT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
INSERT INTO t2 VALUES (2,1),(3,1);
|
||||
SELECT * FROM t1 i WHERE 1 IN (SELECT l.id2 FROM t2 l WHERE i.id=l.id1);
|
||||
id
|
||||
2
|
||||
3
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (id int);
|
||||
CREATE TABLE t2 (id int, c int);
|
||||
INSERT INTO t1 (id) VALUES (1);
|
||||
INSERT INTO t2 (id) VALUES (1);
|
||||
INSERT INTO t1 (id) VALUES (1);
|
||||
INSERT INTO t2 (id) VALUES (1);
|
||||
CREATE VIEW v1 AS
|
||||
SELECT t2.c AS c FROM t1, t2
|
||||
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
|
||||
UPDATE v1 SET c=1;
|
||||
CREATE VIEW v2 (a,b) AS
|
||||
SELECT t2.id, t2.c AS c FROM t1, t2
|
||||
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
|
||||
INSERT INTO v2(a,b) VALUES (2,2);
|
||||
ERROR HY000: CHECK OPTION failed 'test.v2'
|
||||
INSERT INTO v2(a,b) VALUES (1,2);
|
||||
SELECT * FROM v1;
|
||||
c
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
2
|
||||
2
|
||||
CREATE VIEW v3 AS
|
||||
SELECT t2.c AS c FROM t2
|
||||
WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
|
||||
DELETE FROM v3;
|
||||
DROP VIEW v1,v2,v3;
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.0 tests.
|
||||
|
|
|
@ -110,7 +110,7 @@ i ts
|
|||
362793610 1981-07-01 04:00:00
|
||||
select from_unixtime(362793609);
|
||||
from_unixtime(362793609)
|
||||
1981-07-01 03:59:60
|
||||
1981-07-01 03:59:59
|
||||
drop table t1;
|
||||
create table t1 (ts timestamp);
|
||||
set time_zone='UTC';
|
||||
|
|
|
@ -17,6 +17,9 @@ insert into t1 values
|
|||
insert into t1 values
|
||||
(unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'),
|
||||
(unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00');
|
||||
insert into t1 values
|
||||
(unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'),
|
||||
(unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00');
|
||||
select i, from_unixtime(i), c from t1;
|
||||
i from_unixtime(i) c
|
||||
1072904422 2004-01-01 00:00:00 2004-01-01 00:00:00
|
||||
|
@ -31,6 +34,8 @@ i from_unixtime(i) c
|
|||
1099180821 2004-10-31 02:59:59 2004-10-31 02:59:59
|
||||
362793608 1981-07-01 03:59:59 1981-07-01 03:59:59
|
||||
362793610 1981-07-01 04:00:00 1981-07-01 04:00:00
|
||||
1230768022 2009-01-01 02:59:59 2009-01-01 02:59:59
|
||||
1230768024 2009-01-01 03:00:00 2009-01-01 03:00:00
|
||||
drop table t1;
|
||||
create table t1 (ts timestamp);
|
||||
insert into t1 values (19730101235900), (20040101235900);
|
||||
|
@ -39,3 +44,6 @@ ts
|
|||
1973-01-01 23:59:00
|
||||
2004-01-01 23:59:00
|
||||
drop table t1;
|
||||
SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024);
|
||||
FROM_UNIXTIME(1230768022) FROM_UNIXTIME(1230768023) FROM_UNIXTIME(1230768024)
|
||||
2009-01-01 02:59:59 2009-01-01 02:59:59 2009-01-01 03:00:00
|
||||
|
|
|
@ -625,7 +625,7 @@ drop table t1;
|
|||
create table t1 (a int, b int);
|
||||
create view v1 as select a, sum(b) from t1 group by a;
|
||||
select b from v1 use index (some_index) where b=1;
|
||||
ERROR HY000: Incorrect usage of USE INDEX and VIEW
|
||||
ERROR HY000: Key 'some_index' doesn't exist in table 'v1'
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
create table t1 (col1 char(5),col2 char(5));
|
||||
|
@ -3567,11 +3567,11 @@ CREATE TABLE t1 (a INT);
|
|||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
SELECT * FROM v1 USE KEY(non_existant);
|
||||
ERROR HY000: Incorrect usage of USE INDEX and VIEW
|
||||
ERROR HY000: Key 'non_existant' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 FORCE KEY(non_existant);
|
||||
ERROR HY000: Incorrect usage of FORCE INDEX and VIEW
|
||||
ERROR HY000: Key 'non_existant' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 IGNORE KEY(non_existant);
|
||||
ERROR HY000: Incorrect usage of IGNORE INDEX and VIEW
|
||||
ERROR HY000: Key 'non_existant' doesn't exist in table 'v1'
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b INT NOT NULL DEFAULT 0,
|
||||
|
@ -3679,6 +3679,31 @@ DROP VIEW v1;
|
|||
|
||||
CREATE VIEW v1 AS SELECT 1;
|
||||
DROP VIEW v1;
|
||||
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, INDEX (c2));
|
||||
INSERT INTO t1 VALUES (1,1), (2,2), (3,3);
|
||||
SELECT * FROM t1 USE INDEX (PRIMARY) WHERE c1=2;
|
||||
c1 c2
|
||||
2 2
|
||||
SELECT * FROM t1 USE INDEX (c2) WHERE c2=2;
|
||||
c1 c2
|
||||
2 2
|
||||
CREATE VIEW v1 AS SELECT c1, c2 FROM t1;
|
||||
SHOW INDEX FROM v1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
SELECT * FROM v1 USE INDEX (PRIMARY) WHERE c1=2;
|
||||
ERROR HY000: Key 'PRIMARY' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 FORCE INDEX (PRIMARY) WHERE c1=2;
|
||||
ERROR HY000: Key 'PRIMARY' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 IGNORE INDEX (PRIMARY) WHERE c1=2;
|
||||
ERROR HY000: Key 'PRIMARY' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 USE INDEX (c2) WHERE c2=2;
|
||||
ERROR HY000: Key 'c2' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 FORCE INDEX (c2) WHERE c2=2;
|
||||
ERROR HY000: Key 'c2' doesn't exist in table 'v1'
|
||||
SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2;
|
||||
ERROR HY000: Key 'c2' doesn't exist in table 'v1'
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.0 tests.
|
||||
# -----------------------------------------------------------------
|
||||
|
|
Binary file not shown.
2
mysql-test/t/ctype_filesystem-master.opt
Normal file
2
mysql-test/t/ctype_filesystem-master.opt
Normal file
|
@ -0,0 +1,2 @@
|
|||
--character-sets-dir=$MYSQL_TEST_DIR/ß
|
||||
--character-set-filesystem=latin1
|
6
mysql-test/t/ctype_filesystem.test
Normal file
6
mysql-test/t/ctype_filesystem.test
Normal file
|
@ -0,0 +1,6 @@
|
|||
SET CHARACTER SET utf8;
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
SHOW VARIABLES like 'character_sets_dir';
|
||||
SHOW VARIABLES like 'character_set_filesystem';
|
||||
SHOW VARIABLES like 'character_set_client';
|
||||
SET CHARACTER SET default;
|
|
@ -1437,3 +1437,20 @@ select hex(_utf8 X'616263FF');
|
|||
select hex(_utf8 B'001111111111');
|
||||
--error ER_INVALID_CHARACTER_STRING
|
||||
select (_utf8 X'616263FF');
|
||||
|
||||
#
|
||||
# Bug #36772: When using UTF8, CONVERT with GROUP BY returns truncated results
|
||||
#
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL);
|
||||
INSERT INTO t1 VALUES (70000, 1092), (70001, 1085), (70002, 1065);
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1;
|
||||
ALTER TABLE t1 ADD UNIQUE (b);
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;
|
||||
DROP INDEX b ON t1;
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;
|
||||
ALTER TABLE t1 ADD INDEX (b);
|
||||
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) from t1 GROUP BY b;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -396,3 +396,30 @@ SELECT * FROM t1 WHERE MATCH(a) AGAINST ('"aaaa"' IN BOOLEAN MODE);
|
|||
DROP TABLE t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# BUG#38842 - Fix for 25951 seems incorrect
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(255), b INT, FULLTEXT(a), KEY(b));
|
||||
INSERT INTO t1 VALUES('test', 1),('test', 1),('test', 1),('test', 1),
|
||||
('test', 1),('test', 2),('test', 3),('test', 4);
|
||||
|
||||
EXPLAIN SELECT * FROM t1
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 USE INDEX(a)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 FORCE INDEX(a)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 IGNORE INDEX(a)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 USE INDEX(b)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
|
||||
EXPLAIN SELECT * FROM t1 FORCE INDEX(b)
|
||||
WHERE MATCH(a) AGAINST('test' IN BOOLEAN MODE) AND b=1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -926,5 +926,34 @@ SELECT AVG(a), CAST(AVG(a) AS DECIMAL) FROM t1;
|
|||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #39656: Behaviour different for agg functions with & without where -
|
||||
# ONLY_FULL_GROUP_BY
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (1,1), (1,2), (1,3);
|
||||
|
||||
SET SQL_MODE='ONLY_FULL_GROUP_BY';
|
||||
|
||||
SELECT COUNT(*) FROM t1;
|
||||
SELECT COUNT(*) FROM t1 where a=1;
|
||||
|
||||
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
|
||||
SELECT COUNT(*),a FROM t1;
|
||||
|
||||
SELECT COUNT(*) FROM t1 a JOIN t1 b ON a.a= b.a;
|
||||
|
||||
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
|
||||
SELECT COUNT(*), (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a)
|
||||
FROM t1 outr;
|
||||
|
||||
SELECT COUNT(*) FROM t1 a JOIN t1 outr
|
||||
ON a.a= (SELECT count(*) FROM t1 inr WHERE inr.a = outr.a);
|
||||
|
||||
SET SQL_MODE=default;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
###
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -135,3 +135,20 @@ select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f");
|
|||
--enable_ps_protocol
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Bug#37553: MySql Error Compare TimeDiff & Time
|
||||
#
|
||||
|
||||
# calculations involving negative time values ignored sign
|
||||
select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10'),time('00:00:00');
|
||||
select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')>time('00:00:00');
|
||||
select timediff('2008-09-29 20:10:10','2008-09-30 20:10:10')<time('00:00:00');
|
||||
|
||||
# show that conversion to DECIMAL no longer drops sign
|
||||
SELECT CAST(time('-73:42:12') AS DECIMAL);
|
||||
|
||||
|
||||
# End of 5.0 tests
|
||||
|
|
|
@ -1014,4 +1014,15 @@ SELECT a, b, c FROM t1 WHERE b = 1 ORDER BY a DESC LIMIT 5;
|
|||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#37284 Crash in Field_string::type()
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
CREATE TABLE t1 (a char(50)) ENGINE=InnoDB;
|
||||
CREATE INDEX i1 on t1 (a(3));
|
||||
SELECT * FROM t1 WHERE a = 'abcde';
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
drop table if exists t1,t2,t3;
|
||||
drop database if exists mysqltest;
|
||||
drop view if exists v1;
|
||||
--error 0,1141,1147
|
||||
--error 0,ER_NONEXISTING_GRANT,ER_NONEXISTING_TABLE_GRANT
|
||||
revoke all privileges on mysqltest.t1 from mysqltest_1@localhost;
|
||||
--error 0,1141,1147
|
||||
--error 0,ER_NONEXISTING_GRANT,ER_NONEXISTING_TABLE_GRANT
|
||||
revoke all privileges on mysqltest.* from mysqltest_1@localhost;
|
||||
delete from mysql.user where user=_binary'mysqltest_1';
|
||||
--enable_warnings
|
||||
|
@ -159,9 +159,9 @@ create table t2 (n int(10) not null primary key, d int(10));
|
|||
insert into t1 values(1,1);
|
||||
insert into t2 values(1,10),(2,20);
|
||||
LOCK TABLES t1 write, t2 read;
|
||||
--error 1099
|
||||
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
|
||||
DELETE t1.*, t2.* FROM t1,t2 where t1.n=t2.n;
|
||||
--error 1099
|
||||
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
|
||||
UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n;
|
||||
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
|
||||
unlock tables;
|
||||
|
@ -182,7 +182,7 @@ create table t1 (n int(10), d int(10));
|
|||
create table t2 (n int(10), d int(10));
|
||||
insert into t1 values(1,1);
|
||||
insert into t2 values(1,10),(2,20);
|
||||
--error 1175
|
||||
--error ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE
|
||||
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
|
||||
set sql_safe_updates=0;
|
||||
drop table t1,t2;
|
||||
|
@ -195,7 +195,7 @@ set timestamp=1038000000;
|
|||
UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n;
|
||||
select n,d,unix_timestamp(t) from t1;
|
||||
select n,d,unix_timestamp(t) from t2;
|
||||
--error 1064
|
||||
--error ER_PARSE_ERROR
|
||||
UPDATE t1,t2 SET 1=2 WHERE t1.n=t2.n;
|
||||
drop table t1,t2;
|
||||
set timestamp=0;
|
||||
|
@ -322,41 +322,6 @@ delete t1, t2 from t2,t1
|
|||
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Test for bug #1820.
|
||||
#
|
||||
|
||||
create table t1 ( a int not null, b int not null) ;
|
||||
--disable_query_log
|
||||
insert into t1 values (1,1),(2,2),(3,3),(4,4);
|
||||
let $1=19;
|
||||
set @d=4;
|
||||
while ($1)
|
||||
{
|
||||
eval insert into t1 select a+@d,b+@d from t1;
|
||||
eval set @d=@d*2;
|
||||
dec $1;
|
||||
}
|
||||
|
||||
--enable_query_log
|
||||
alter table t1 add index i1(a);
|
||||
delete from t1 where a > 2000000;
|
||||
create table t2 like t1;
|
||||
insert into t2 select * from t1;
|
||||
|
||||
select 't2 rows before small delete', count(*) from t1;
|
||||
delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 2;
|
||||
select 't2 rows after small delete', count(*) from t2;
|
||||
select 't1 rows after small delete', count(*) from t1;
|
||||
|
||||
## Try deleting many rows
|
||||
|
||||
delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 100*1000;
|
||||
select 't2 rows after big delete', count(*) from t2;
|
||||
select 't1 rows after big delete', count(*) from t1;
|
||||
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# Test alias (this is not correct in 4.0)
|
||||
#
|
||||
|
@ -366,7 +331,7 @@ CREATE TABLE t2 ( a int );
|
|||
DELETE t1 FROM t1, t2 AS t3;
|
||||
DELETE t4 FROM t1, t1 AS t4;
|
||||
DELETE t3 FROM t1 AS t3, t1 AS t4;
|
||||
--error 1109
|
||||
--error ER_UNKNOWN_TABLE
|
||||
DELETE t1 FROM t1 AS t3, t2 AS t4;
|
||||
INSERT INTO t1 values (1),(2);
|
||||
INSERT INTO t2 values (1),(2);
|
||||
|
@ -421,7 +386,7 @@ drop database mysqltest;
|
|||
create table t1 (a int, primary key (a));
|
||||
create table t2 (a int, primary key (a));
|
||||
create table t3 (a int, primary key (a));
|
||||
-- error 1109
|
||||
-- error ER_UNKNOWN_TABLE
|
||||
delete t1,t3 from t1,t2 where t1.a=t2.a and t2.a=(select t3.a from t3 where t1.a=t3.a);
|
||||
drop table t1, t2, t3;
|
||||
|
||||
|
@ -430,9 +395,9 @@ drop table t1, t2, t3;
|
|||
#
|
||||
create table t1 (col1 int);
|
||||
create table t2 (col1 int);
|
||||
-- error 1093
|
||||
-- error ER_UPDATE_TABLE_USED
|
||||
update t1,t2 set t1.col1 = (select max(col1) from t1) where t1.col1 = t2.col1;
|
||||
-- error 1093
|
||||
-- error ER_UPDATE_TABLE_USED
|
||||
delete t1 from t1,t2 where t1.col1 < (select max(col1) from t1) and t1.col1 = t2.col1;
|
||||
drop table t1,t2;
|
||||
|
||||
|
@ -457,7 +422,7 @@ drop table t1, t2;
|
|||
#
|
||||
create table t1(a int);
|
||||
create table t2(a int);
|
||||
--error 1093
|
||||
--error ER_UPDATE_TABLE_USED
|
||||
delete from t1,t2 using t1,t2 where t1.a=(select a from t1);
|
||||
drop table t1, t2;
|
||||
# End of 4.1 tests
|
||||
|
|
1
mysql-test/t/multi_update2-master.opt
Normal file
1
mysql-test/t/multi_update2-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--set-variable=tmp_table_size=1024
|
43
mysql-test/t/multi_update2.test
Normal file
43
mysql-test/t/multi_update2.test
Normal file
|
@ -0,0 +1,43 @@
|
|||
#
|
||||
# Test of update statement that uses many tables.
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Bug#1820 Rows not deleted from second table on multi-table delete
|
||||
#
|
||||
|
||||
CREATE TABLE t1 ( a INT NOT NULL, b INT NOT NULL) ;
|
||||
--echo # The protocolling of many inserts into t1 is suppressed.
|
||||
--disable_query_log
|
||||
INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4);
|
||||
let $1=19;
|
||||
set @d=4;
|
||||
while ($1)
|
||||
{
|
||||
eval INSERT INTO t1 SELECT a+@d,b+@d FROM t1;
|
||||
eval SET @d=@d*2;
|
||||
dec $1;
|
||||
}
|
||||
|
||||
--enable_query_log
|
||||
ALTER TABLE t1 ADD INDEX i1(a);
|
||||
DELETE FROM t1 WHERE a > 2000000;
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
|
||||
SELECT 't2 rows before small delete', COUNT(*) FROM t1;
|
||||
DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 2;
|
||||
SELECT 't2 rows after small delete', COUNT(*) FROM t2;
|
||||
SELECT 't1 rows after small delete', COUNT(*) FROM t1;
|
||||
|
||||
## Try deleting many rows
|
||||
|
||||
DELETE t1,t2 FROM t1,t2 WHERE t1.b=t2.a AND t1.a < 100*1000;
|
||||
SELECT 't2 rows after big delete', COUNT(*) FROM t2;
|
||||
SELECT 't1 rows after big delete', COUNT(*) FROM t1;
|
||||
|
||||
DROP TABLE t1,t2;
|
14
mysql-test/t/perror-win.test
Normal file
14
mysql-test/t/perror-win.test
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Windows-specific tests
|
||||
--source include/windows.inc
|
||||
--require r/have_perror.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$MY_PERROR") > 0 as "have_perror";
|
||||
enable_query_log;
|
||||
|
||||
|
||||
--exec $MY_PERROR 150 2>&1
|
||||
--exec $MY_PERROR 23 2>&1
|
||||
--exec $MY_PERROR 1062 2>&1
|
||||
--error 1
|
||||
--exec $MY_PERROR 30000 2>&1
|
||||
|
|
@ -3307,5 +3307,57 @@ SELECT * FROM t1
|
|||
WHERE EXISTS (SELECT DISTINCT a FROM t2 WHERE t1.a < t2.a ORDER BY b);
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
#
|
||||
# Bug#20835 (literal string with =any values)
|
||||
#
|
||||
CREATE TABLE t1 (s1 char(1));
|
||||
INSERT INTO t1 VALUES ('a');
|
||||
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#40519 Subselect query using bigint fails
|
||||
#
|
||||
CREATE TABLE t1(id BIGINT);
|
||||
CREATE TABLE t2(id1 BIGINT, id2 BIGINT);
|
||||
INSERT INTO t1 VALUES (1),(2),(3);
|
||||
INSERT INTO t2 VALUES (2,1),(3,1);
|
||||
SELECT * FROM t1 i WHERE 1 IN (SELECT l.id2 FROM t2 l WHERE i.id=l.id1);
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# Bug#37460 Assertion failed:
|
||||
# !table->file || table->file->inited == handler::NONE
|
||||
#
|
||||
CREATE TABLE t1 (id int);
|
||||
CREATE TABLE t2 (id int, c int);
|
||||
|
||||
INSERT INTO t1 (id) VALUES (1);
|
||||
INSERT INTO t2 (id) VALUES (1);
|
||||
INSERT INTO t1 (id) VALUES (1);
|
||||
INSERT INTO t2 (id) VALUES (1);
|
||||
|
||||
CREATE VIEW v1 AS
|
||||
SELECT t2.c AS c FROM t1, t2
|
||||
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
|
||||
UPDATE v1 SET c=1;
|
||||
|
||||
CREATE VIEW v2 (a,b) AS
|
||||
SELECT t2.id, t2.c AS c FROM t1, t2
|
||||
WHERE t1.id=t2.id AND 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
|
||||
|
||||
--error 1369
|
||||
INSERT INTO v2(a,b) VALUES (2,2);
|
||||
INSERT INTO v2(a,b) VALUES (1,2);
|
||||
SELECT * FROM v1;
|
||||
|
||||
CREATE VIEW v3 AS
|
||||
SELECT t2.c AS c FROM t2
|
||||
WHERE 1 IN (SELECT id FROM t1) WITH CHECK OPTION;
|
||||
|
||||
DELETE FROM v3;
|
||||
|
||||
DROP VIEW v1,v2,v3;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
|
|
@ -45,6 +45,10 @@ insert into t1 values
|
|||
(unix_timestamp('1981-07-01 03:59:59'),'1981-07-01 03:59:59'),
|
||||
(unix_timestamp('1981-07-01 04:00:00'),'1981-07-01 04:00:00');
|
||||
|
||||
insert into t1 values
|
||||
(unix_timestamp('2009-01-01 02:59:59'),'2009-01-01 02:59:59'),
|
||||
(unix_timestamp('2009-01-01 03:00:00'),'2009-01-01 03:00:00');
|
||||
|
||||
select i, from_unixtime(i), c from t1;
|
||||
drop table t1;
|
||||
|
||||
|
@ -58,4 +62,12 @@ insert into t1 values (19730101235900), (20040101235900);
|
|||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Test Bug #39920: MySQL cannot deal with Leap Second expression in string
|
||||
# literal
|
||||
#
|
||||
|
||||
# 2009-01-01 02:59:59, 2009-01-01 02:59:60 and 2009-01-01 03:00:00
|
||||
SELECT FROM_UNIXTIME(1230768022), FROM_UNIXTIME(1230768023), FROM_UNIXTIME(1230768024);
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
|
@ -510,7 +510,7 @@ drop table t1;
|
|||
#
|
||||
create table t1 (a int, b int);
|
||||
create view v1 as select a, sum(b) from t1 group by a;
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
select b from v1 use index (some_index) where b=1;
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
@ -3424,11 +3424,11 @@ drop table t1;
|
|||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 USE KEY(non_existant);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 FORCE KEY(non_existant);
|
||||
--error ER_WRONG_USAGE
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 IGNORE KEY(non_existant);
|
||||
|
||||
DROP VIEW v1;
|
||||
|
@ -3568,6 +3568,32 @@ DROP VIEW v1;
|
|||
CREATE VIEW v1 AS SELECT 1;
|
||||
DROP VIEW v1;
|
||||
|
||||
#
|
||||
# Bug #33461: SELECT ... FROM <view> USE INDEX (...) throws an error
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, INDEX (c2));
|
||||
INSERT INTO t1 VALUES (1,1), (2,2), (3,3);
|
||||
SELECT * FROM t1 USE INDEX (PRIMARY) WHERE c1=2;
|
||||
SELECT * FROM t1 USE INDEX (c2) WHERE c2=2;
|
||||
|
||||
CREATE VIEW v1 AS SELECT c1, c2 FROM t1;
|
||||
SHOW INDEX FROM v1;
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 USE INDEX (PRIMARY) WHERE c1=2;
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 FORCE INDEX (PRIMARY) WHERE c1=2;
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 IGNORE INDEX (PRIMARY) WHERE c1=2;
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 USE INDEX (c2) WHERE c2=2;
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 FORCE INDEX (c2) WHERE c2=2;
|
||||
--error ER_KEY_DOES_NOT_EXITS
|
||||
SELECT * FROM v1 IGNORE INDEX (c2) WHERE c2=2;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.0 tests.
|
||||
|
|
|
@ -5372,6 +5372,7 @@ int Field_newdate::store_time(MYSQL_TIME *ltime, timestamp_type time_type)
|
|||
{
|
||||
char buff[MAX_DATE_STRING_REP_LENGTH];
|
||||
String str(buff, sizeof(buff), &my_charset_latin1);
|
||||
tmp= 0;
|
||||
make_date((DATE_TIME_FORMAT *) 0, ltime, &str);
|
||||
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
|
||||
str.ptr(), str.length(), MYSQL_TIMESTAMP_DATE, 1);
|
||||
|
@ -5608,6 +5609,7 @@ int Field_datetime::store_time(MYSQL_TIME *ltime,timestamp_type time_type)
|
|||
{
|
||||
char buff[MAX_DATE_STRING_REP_LENGTH];
|
||||
String str(buff, sizeof(buff), &my_charset_latin1);
|
||||
tmp= 0;
|
||||
make_datetime((DATE_TIME_FORMAT *) 0, ltime, &str);
|
||||
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
|
||||
str.ptr(), str.length(), MYSQL_TIMESTAMP_DATETIME,1);
|
||||
|
|
|
@ -1320,6 +1320,14 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
|
|||
thr_lock_init(&share->lock);
|
||||
pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Free tmp_share.scheme allocated in the parse_url()
|
||||
as we found share in the hash and tmp_share isn't needed anymore.
|
||||
*/
|
||||
my_free((gptr) tmp_share.scheme, MYF(MY_ALLOW_ZERO_PTR));
|
||||
}
|
||||
share->use_count++;
|
||||
pthread_mutex_unlock(&federated_mutex);
|
||||
|
||||
|
|
|
@ -1957,8 +1957,53 @@ bool handler::get_error_message(int error, String* buf)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
Check for incompatible collation changes.
|
||||
|
||||
@retval
|
||||
HA_ADMIN_NEEDS_UPGRADE Table may have data requiring upgrade.
|
||||
@retval
|
||||
0 No upgrade required.
|
||||
*/
|
||||
|
||||
int handler::check_collation_compatibility()
|
||||
{
|
||||
ulong mysql_version= table->s->mysql_version;
|
||||
|
||||
if (mysql_version < 50048)
|
||||
{
|
||||
KEY *key= table->key_info;
|
||||
KEY *key_end= key + table->s->keys;
|
||||
for (; key < key_end; key++)
|
||||
{
|
||||
KEY_PART_INFO *key_part= key->key_part;
|
||||
KEY_PART_INFO *key_part_end= key_part + key->key_parts;
|
||||
for (; key_part < key_part_end; key_part++)
|
||||
{
|
||||
if (!key_part->fieldnr)
|
||||
continue;
|
||||
Field *field= table->field[key_part->fieldnr - 1];
|
||||
uint cs_number= field->charset()->number;
|
||||
if (mysql_version < 50048 &&
|
||||
(cs_number == 11 || /* ascii_general_ci - bug #29499, bug #27562 */
|
||||
cs_number == 41 || /* latin7_general_ci - bug #29461 */
|
||||
cs_number == 42 || /* latin7_general_cs - bug #29461 */
|
||||
cs_number == 20 || /* latin7_estonian_cs - bug #29461 */
|
||||
cs_number == 21 || /* latin2_hungarian_ci - bug #29461 */
|
||||
cs_number == 22 || /* koi8u_general_ci - bug #29461 */
|
||||
cs_number == 23 || /* cp1251_ukrainian_ci - bug #29461 */
|
||||
cs_number == 26)) /* cp1250_general_ci - bug #29461 */
|
||||
return HA_ADMIN_NEEDS_UPGRADE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int handler::ha_check_for_upgrade(HA_CHECK_OPT *check_opt)
|
||||
{
|
||||
int error;
|
||||
KEY *keyinfo, *keyend;
|
||||
KEY_PART_INFO *keypart, *keypartend;
|
||||
|
||||
|
@ -1987,6 +2032,10 @@ int handler::ha_check_for_upgrade(HA_CHECK_OPT *check_opt)
|
|||
}
|
||||
if (table->s->frm_version != FRM_VER_TRUE_VARCHAR)
|
||||
return HA_ADMIN_NEEDS_ALTER;
|
||||
|
||||
if ((error= check_collation_compatibility()))
|
||||
return error;
|
||||
|
||||
return check_for_upgrade(check_opt);
|
||||
}
|
||||
|
||||
|
|
|
@ -787,6 +787,7 @@ protected:
|
|||
virtual int check_for_upgrade(HA_CHECK_OPT *check_opt)
|
||||
{ return 0; }
|
||||
public:
|
||||
int check_collation_compatibility();
|
||||
int ha_check_for_upgrade(HA_CHECK_OPT *check_opt);
|
||||
int check_old_types();
|
||||
/* to be actually called to get 'check()' functionality*/
|
||||
|
|
|
@ -745,11 +745,11 @@ Arg_comparator::can_compare_as_dates(Item *a, Item *b, ulonglong *const_value)
|
|||
obtained value
|
||||
*/
|
||||
|
||||
ulonglong
|
||||
longlong
|
||||
get_time_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
||||
Item *warn_item, bool *is_null)
|
||||
{
|
||||
ulonglong value;
|
||||
longlong value;
|
||||
Item *item= **item_arg;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
|
@ -761,7 +761,7 @@ get_time_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
|||
else
|
||||
{
|
||||
*is_null= item->get_time(<ime);
|
||||
value= !*is_null ? TIME_to_ulonglong_datetime(<ime) : 0;
|
||||
value= !*is_null ? (longlong) TIME_to_ulonglong_datetime(<ime) : 0;
|
||||
}
|
||||
/*
|
||||
Do not cache GET_USER_VAR() function as its const_item() may return TRUE
|
||||
|
@ -886,11 +886,11 @@ void Arg_comparator::set_datetime_cmp_func(Item **a1, Item **b1)
|
|||
obtained value
|
||||
*/
|
||||
|
||||
ulonglong
|
||||
longlong
|
||||
get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
||||
Item *warn_item, bool *is_null)
|
||||
{
|
||||
ulonglong value= 0;
|
||||
longlong value= 0;
|
||||
String buf, *str= 0;
|
||||
Item *item= **item_arg;
|
||||
|
||||
|
@ -925,7 +925,7 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
|||
enum_field_types f_type= warn_item->field_type();
|
||||
timestamp_type t_type= f_type ==
|
||||
MYSQL_TYPE_DATE ? MYSQL_TIMESTAMP_DATE : MYSQL_TIMESTAMP_DATETIME;
|
||||
value= get_date_from_str(thd, str, t_type, warn_item->name, &error);
|
||||
value= (longlong) get_date_from_str(thd, str, t_type, warn_item->name, &error);
|
||||
/*
|
||||
If str did not contain a valid date according to the current
|
||||
SQL_MODE, get_date_from_str() has already thrown a warning,
|
||||
|
@ -979,7 +979,7 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
|||
int Arg_comparator::compare_datetime()
|
||||
{
|
||||
bool a_is_null, b_is_null;
|
||||
ulonglong a_value, b_value;
|
||||
longlong a_value, b_value;
|
||||
|
||||
/* Get DATE/DATETIME/TIME value of the 'a' item. */
|
||||
a_value= (*get_value_func)(thd, &a, &a_cache, *b, &a_is_null);
|
||||
|
@ -1434,7 +1434,8 @@ bool Item_in_optimizer::fix_left(THD *thd, Item **ref)
|
|||
}
|
||||
not_null_tables_cache= args[0]->not_null_tables();
|
||||
with_sum_func= args[0]->with_sum_func;
|
||||
const_item_cache= args[0]->const_item();
|
||||
if ((const_item_cache= args[0]->const_item()))
|
||||
cache->store(args[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,8 +42,8 @@ class Arg_comparator: public Sql_alloc
|
|||
bool is_nulls_eq; // TRUE <=> compare for the EQUAL_FUNC
|
||||
enum enum_date_cmp_type { CMP_DATE_DFLT= 0, CMP_DATE_WITH_DATE,
|
||||
CMP_DATE_WITH_STR, CMP_STR_WITH_DATE };
|
||||
ulonglong (*get_value_func)(THD *thd, Item ***item_arg, Item **cache_arg,
|
||||
Item *warn_item, bool *is_null);
|
||||
longlong (*get_value_func)(THD *thd, Item ***item_arg, Item **cache_arg,
|
||||
Item *warn_item, bool *is_null);
|
||||
public:
|
||||
DTCollation cmp_collation;
|
||||
|
||||
|
@ -1028,7 +1028,7 @@ public:
|
|||
*/
|
||||
class cmp_item_datetime :public cmp_item
|
||||
{
|
||||
ulonglong value;
|
||||
longlong value;
|
||||
public:
|
||||
THD *thd;
|
||||
/* Item used for issuing warnings. */
|
||||
|
|
|
@ -2275,7 +2275,7 @@ void Item_func_min_max::fix_length_and_dec()
|
|||
|
||||
uint Item_func_min_max::cmp_datetimes(ulonglong *value)
|
||||
{
|
||||
ulonglong min_max;
|
||||
longlong min_max;
|
||||
uint min_max_idx= 0;
|
||||
LINT_INIT(min_max);
|
||||
|
||||
|
@ -2283,7 +2283,7 @@ uint Item_func_min_max::cmp_datetimes(ulonglong *value)
|
|||
{
|
||||
Item **arg= args + i;
|
||||
bool is_null;
|
||||
ulonglong res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null);
|
||||
longlong res= get_datetime_value(thd, &arg, 0, datetime_item, &is_null);
|
||||
if ((null_value= args[i]->null_value))
|
||||
return 0;
|
||||
if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
|
||||
|
@ -5024,7 +5024,9 @@ bool Item_func_match::fix_index()
|
|||
for (keynr=0 ; keynr < table->s->keys ; keynr++)
|
||||
{
|
||||
if ((table->key_info[keynr].flags & HA_FULLTEXT) &&
|
||||
(table->s->keys_in_use.is_set(keynr)))
|
||||
(flags & FT_BOOL ? table->keys_in_use_for_query.is_set(keynr) :
|
||||
table->s->keys_in_use.is_set(keynr)))
|
||||
|
||||
{
|
||||
ft_to_key[fts]=keynr;
|
||||
ft_cnt[fts]=0;
|
||||
|
|
|
@ -2550,6 +2550,8 @@ void Item_char_typecast::fix_length_and_dec()
|
|||
and thus avoid unnecessary character set conversion.
|
||||
- If the argument is not a number, then from_cs is set to
|
||||
the argument's charset.
|
||||
|
||||
Note (TODO): we could use repertoire technique here.
|
||||
*/
|
||||
from_cs= (args[0]->result_type() == INT_RESULT ||
|
||||
args[0]->result_type() == DECIMAL_RESULT ||
|
||||
|
@ -2557,12 +2559,13 @@ void Item_char_typecast::fix_length_and_dec()
|
|||
(cast_cs->mbminlen == 1 ? cast_cs : &my_charset_latin1) :
|
||||
args[0]->collation.collation;
|
||||
charset_conversion= (cast_cs->mbmaxlen > 1) ||
|
||||
!my_charset_same(from_cs, cast_cs) &&
|
||||
from_cs != &my_charset_bin &&
|
||||
cast_cs != &my_charset_bin;
|
||||
(!my_charset_same(from_cs, cast_cs) &&
|
||||
from_cs != &my_charset_bin &&
|
||||
cast_cs != &my_charset_bin);
|
||||
collation.set(cast_cs, DERIVATION_IMPLICIT);
|
||||
char_length= (cast_length >= 0) ? cast_length :
|
||||
args[0]->max_length/from_cs->mbmaxlen;
|
||||
char_length= (cast_length >= 0) ?
|
||||
cast_length :
|
||||
args[0]->max_length / args[0]->collation.collation->mbmaxlen;
|
||||
max_length= char_length * cast_cs->mbmaxlen;
|
||||
}
|
||||
|
||||
|
|
|
@ -408,6 +408,7 @@ public:
|
|||
{
|
||||
return save_time_in_field(field);
|
||||
}
|
||||
bool result_as_longlong() { return TRUE; }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ my_decimal *date2my_decimal(MYSQL_TIME *ltime, my_decimal *dec)
|
|||
date = (ltime->year*100L + ltime->month)*100L + ltime->day;
|
||||
if (ltime->time_type > MYSQL_TIMESTAMP_DATE)
|
||||
date= ((date*100L + ltime->hour)*100L+ ltime->minute)*100L + ltime->second;
|
||||
if (int2my_decimal(E_DEC_FATAL_ERROR, date, FALSE, dec))
|
||||
if (int2my_decimal(E_DEC_FATAL_ERROR, ltime->neg ? -date : date, FALSE, dec))
|
||||
return dec;
|
||||
if (ltime->second_part)
|
||||
{
|
||||
|
|
|
@ -435,6 +435,7 @@ MY_LOCALE *my_locale_by_number(uint number);
|
|||
#define UNCACHEABLE_PREPARE 16
|
||||
/* For uncorrelated SELECT in an UNION with some correlated SELECTs */
|
||||
#define UNCACHEABLE_UNITED 32
|
||||
#define UNCACHEABLE_CHECKOPTION 64
|
||||
|
||||
/* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */
|
||||
#define UNDEF_POS (-1)
|
||||
|
@ -1556,8 +1557,8 @@ void make_date(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time,
|
|||
String *str);
|
||||
void make_time(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time,
|
||||
String *str);
|
||||
ulonglong get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
||||
Item *warn_item, bool *is_null);
|
||||
longlong get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
||||
Item *warn_item, bool *is_null);
|
||||
|
||||
int test_if_number(char *str,int *res,bool allow_wildcards);
|
||||
void change_byte(byte *,uint,char,char);
|
||||
|
|
|
@ -3035,12 +3035,14 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
|||
sys_init_connect.value_length= strlen(opt_init_connect);
|
||||
else
|
||||
sys_init_connect.value=my_strdup("",MYF(0));
|
||||
sys_init_connect.is_os_charset= TRUE;
|
||||
|
||||
sys_init_slave.value_length= 0;
|
||||
if ((sys_init_slave.value= opt_init_slave))
|
||||
sys_init_slave.value_length= strlen(opt_init_slave);
|
||||
else
|
||||
sys_init_slave.value=my_strdup("",MYF(0));
|
||||
sys_init_slave.is_os_charset= TRUE;
|
||||
|
||||
if (use_temp_pool && bitmap_init(&temp_pool,0,1024,1))
|
||||
return 1;
|
||||
|
@ -3840,6 +3842,9 @@ we force server id to 2, but this MySQL server will not act as a slave.");
|
|||
: mysqld_unix_port),
|
||||
mysqld_port,
|
||||
MYSQL_COMPILATION_COMMENT);
|
||||
#if defined(_WIN32) && !defined(EMBEDDED_LIBRARY)
|
||||
Service.SetRunning();
|
||||
#endif
|
||||
|
||||
#if defined(__NT__) || defined(HAVE_SMEM)
|
||||
handle_connections_methods();
|
||||
|
|
|
@ -245,10 +245,6 @@ void NTService::ServiceMain(DWORD argc, LPTSTR *argv)
|
|||
if (!pService->StartService())
|
||||
goto error;
|
||||
|
||||
// Check that the service is now running.
|
||||
if (!pService->SetStatus(SERVICE_RUNNING,NO_ERROR, 0, 0, 0))
|
||||
goto error;
|
||||
|
||||
// wait for exit event
|
||||
WaitForSingleObject (pService->hExitEvent, INFINITE);
|
||||
|
||||
|
@ -264,6 +260,14 @@ error:
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
void NTService::SetRunning()
|
||||
{
|
||||
if (pService)
|
||||
pService->SetStatus(SERVICE_RUNNING,NO_ERROR, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
StartService() - starts the appliaction thread
|
||||
-------------------------------------------------------------------------- */
|
||||
|
|
|
@ -56,7 +56,19 @@ class NTService
|
|||
BOOL IsService(LPCSTR ServiceName);
|
||||
BOOL got_service_option(char **argv, char *service_option);
|
||||
BOOL is_super_user();
|
||||
void Stop(void); //to be called from app. to stop service
|
||||
|
||||
/*
|
||||
SetRunning() is to be called by the application
|
||||
when initialization completes and it can accept
|
||||
stop request
|
||||
*/
|
||||
void SetRunning(void);
|
||||
|
||||
/*
|
||||
Stop() is to be called by the application to stop
|
||||
the service
|
||||
*/
|
||||
void Stop(void);
|
||||
|
||||
protected:
|
||||
LPSTR ServiceName;
|
||||
|
|
|
@ -138,7 +138,7 @@ sys_var_thd_ulong sys_auto_increment_offset("auto_increment_offset",
|
|||
sys_var_bool_ptr sys_automatic_sp_privileges("automatic_sp_privileges",
|
||||
&sp_automatic_privileges);
|
||||
|
||||
sys_var_const_str sys_basedir("basedir", mysql_home);
|
||||
sys_var_const_os_str sys_basedir("basedir", mysql_home);
|
||||
sys_var_long_ptr sys_binlog_cache_size("binlog_cache_size",
|
||||
&binlog_cache_size);
|
||||
sys_var_thd_ulong sys_bulk_insert_buff_size("bulk_insert_buffer_size",
|
||||
|
@ -151,6 +151,8 @@ sys_var_character_set_client sys_character_set_client("character_set_client");
|
|||
sys_var_character_set_connection sys_character_set_connection("character_set_connection");
|
||||
sys_var_character_set_results sys_character_set_results("character_set_results");
|
||||
sys_var_character_set_filesystem sys_character_set_filesystem("character_set_filesystem");
|
||||
sys_var_const_os_str sys_character_sets_dir("character_sets_dir",
|
||||
mysql_charsets_dir);
|
||||
sys_var_thd_ulong sys_completion_type("completion_type",
|
||||
&SV::completion_type,
|
||||
check_completion_type,
|
||||
|
@ -162,7 +164,7 @@ sys_var_long_ptr sys_concurrent_insert("concurrent_insert",
|
|||
&myisam_concurrent_insert);
|
||||
sys_var_long_ptr sys_connect_timeout("connect_timeout",
|
||||
&connect_timeout);
|
||||
sys_var_const_str sys_datadir("datadir", mysql_real_data_home);
|
||||
sys_var_const_os_str sys_datadir("datadir", mysql_real_data_home);
|
||||
sys_var_enum sys_delay_key_write("delay_key_write",
|
||||
&delay_key_write_options,
|
||||
&delay_key_write_typelib,
|
||||
|
@ -311,6 +313,7 @@ sys_var_thd_ulong sys_optimizer_prune_level("optimizer_prune_level",
|
|||
&SV::optimizer_prune_level);
|
||||
sys_var_thd_ulong sys_optimizer_search_depth("optimizer_search_depth",
|
||||
&SV::optimizer_search_depth);
|
||||
sys_var_const_os_str sys_plugin_dir("plugin_dir", opt_plugin_dir);
|
||||
sys_var_thd_ulong sys_preload_buff_size("preload_buffer_size",
|
||||
&SV::preload_buff_size);
|
||||
sys_var_thd_ulong sys_read_buff_size("read_buffer_size",
|
||||
|
@ -338,7 +341,7 @@ sys_var_thd_ulong sys_query_alloc_block_size("query_alloc_block_size",
|
|||
sys_var_thd_ulong sys_query_prealloc_size("query_prealloc_size",
|
||||
&SV::query_prealloc_size,
|
||||
0, fix_thd_mem_root);
|
||||
sys_var_readonly sys_tmpdir("tmpdir", OPT_GLOBAL, SHOW_CHAR, get_tmpdir);
|
||||
sys_var_readonly_os sys_tmpdir("tmpdir", OPT_GLOBAL, SHOW_CHAR, get_tmpdir);
|
||||
sys_var_thd_ulong sys_trans_alloc_block_size("transaction_alloc_block_size",
|
||||
&SV::trans_alloc_block_size,
|
||||
0, fix_trans_mem_root);
|
||||
|
@ -363,9 +366,11 @@ sys_var_bool_ptr sys_secure_auth("secure_auth", &opt_secure_auth);
|
|||
sys_var_const_str_ptr sys_secure_file_priv("secure_file_priv",
|
||||
&opt_secure_file_priv);
|
||||
sys_var_long_ptr sys_server_id("server_id", &server_id, fix_server_id);
|
||||
#ifdef HAVE_REPLICATION
|
||||
sys_var_bool_ptr sys_slave_compressed_protocol("slave_compressed_protocol",
|
||||
&opt_slave_compressed_protocol);
|
||||
#ifdef HAVE_REPLICATION
|
||||
sys_var_const_os_str_ptr sys_slave_load_tmpdir("slave_load_tmpdir",
|
||||
&slave_load_tmpdir);
|
||||
sys_var_long_ptr sys_slave_net_timeout("slave_net_timeout",
|
||||
&slave_net_timeout);
|
||||
sys_var_long_ptr sys_slave_trans_retries("slave_transaction_retries",
|
||||
|
@ -380,17 +385,17 @@ sys_var_thd_sql_mode sys_sql_mode("sql_mode",
|
|||
#ifdef HAVE_OPENSSL
|
||||
extern char *opt_ssl_ca, *opt_ssl_capath, *opt_ssl_cert, *opt_ssl_cipher,
|
||||
*opt_ssl_key;
|
||||
sys_var_const_str_ptr sys_ssl_ca("ssl_ca", &opt_ssl_ca);
|
||||
sys_var_const_str_ptr sys_ssl_capath("ssl_capath", &opt_ssl_capath);
|
||||
sys_var_const_str_ptr sys_ssl_cert("ssl_cert", &opt_ssl_cert);
|
||||
sys_var_const_str_ptr sys_ssl_cipher("ssl_cipher", &opt_ssl_cipher);
|
||||
sys_var_const_str_ptr sys_ssl_key("ssl_key", &opt_ssl_key);
|
||||
sys_var_const_os_str_ptr sys_ssl_ca("ssl_ca", &opt_ssl_ca);
|
||||
sys_var_const_os_str_ptr sys_ssl_capath("ssl_capath", &opt_ssl_capath);
|
||||
sys_var_const_os_str_ptr sys_ssl_cert("ssl_cert", &opt_ssl_cert);
|
||||
sys_var_const_os_str_ptr sys_ssl_cipher("ssl_cipher", &opt_ssl_cipher);
|
||||
sys_var_const_os_str_ptr sys_ssl_key("ssl_key", &opt_ssl_key);
|
||||
#else
|
||||
sys_var_const_str sys_ssl_ca("ssl_ca", NULL);
|
||||
sys_var_const_str sys_ssl_capath("ssl_capath", NULL);
|
||||
sys_var_const_str sys_ssl_cert("ssl_cert", NULL);
|
||||
sys_var_const_str sys_ssl_cipher("ssl_cipher", NULL);
|
||||
sys_var_const_str sys_ssl_key("ssl_key", NULL);
|
||||
sys_var_const_os_str sys_ssl_ca("ssl_ca", NULL);
|
||||
sys_var_const_os_str sys_ssl_capath("ssl_capath", NULL);
|
||||
sys_var_const_os_str sys_ssl_cert("ssl_cert", NULL);
|
||||
sys_var_const_os_str sys_ssl_cipher("ssl_cipher", NULL);
|
||||
sys_var_const_os_str sys_ssl_key("ssl_key", NULL);
|
||||
#endif
|
||||
sys_var_thd_enum
|
||||
sys_updatable_views_with_limit("updatable_views_with_limit",
|
||||
|
@ -460,6 +465,14 @@ sys_var_long_ptr sys_innodb_commit_concurrency("innodb_commit_concurrency",
|
|||
sys_var_long_ptr sys_innodb_flush_log_at_trx_commit(
|
||||
"innodb_flush_log_at_trx_commit",
|
||||
&srv_flush_log_at_trx_commit);
|
||||
sys_var_const_os_str_ptr sys_innodb_data_file_path("innodb_data_file_path",
|
||||
&innobase_data_file_path);
|
||||
sys_var_const_os_str_ptr sys_innodb_data_home_dir("innodb_data_home_dir",
|
||||
&innobase_data_home_dir);
|
||||
sys_var_const_os_str_ptr sys_innodb_log_arch_dir("innodb_log_arch_dir",
|
||||
&innobase_log_arch_dir);
|
||||
sys_var_const_os_str_ptr sys_innodb_log_group_home_dir("innodb_log_group_home_dir",
|
||||
&innobase_log_group_home_dir);
|
||||
#endif
|
||||
|
||||
/* Condition pushdown to storage engine */
|
||||
|
@ -844,7 +857,7 @@ struct show_var_st init_vars[]= {
|
|||
{sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS},
|
||||
{sys_character_set_server.name, (char*) &sys_character_set_server,SHOW_SYS},
|
||||
{sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS},
|
||||
{"character_sets_dir", mysql_charsets_dir, SHOW_CHAR},
|
||||
{sys_character_sets_dir.name, (char *) &sys_character_sets_dir, SHOW_SYS},
|
||||
{sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS},
|
||||
{sys_collation_database.name,(char*) &sys_collation_database, SHOW_SYS},
|
||||
{sys_collation_server.name,(char*) &sys_collation_server, SHOW_SYS},
|
||||
|
@ -905,8 +918,8 @@ struct show_var_st init_vars[]= {
|
|||
{"innodb_checksums", (char*) &innobase_use_checksums, SHOW_MY_BOOL},
|
||||
{sys_innodb_commit_concurrency.name, (char*) &sys_innodb_commit_concurrency, SHOW_SYS},
|
||||
{sys_innodb_concurrency_tickets.name, (char*) &sys_innodb_concurrency_tickets, SHOW_SYS},
|
||||
{"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR},
|
||||
{"innodb_data_home_dir", (char*) &innobase_data_home_dir, SHOW_CHAR_PTR},
|
||||
{sys_innodb_data_file_path.name, (char*) &sys_innodb_data_file_path, SHOW_SYS},
|
||||
{sys_innodb_data_home_dir.name, (char*) &sys_innodb_data_home_dir, SHOW_SYS},
|
||||
{"innodb_adaptive_hash_index", (char*) &innobase_adaptive_hash_index, SHOW_MY_BOOL},
|
||||
{"innodb_doublewrite", (char*) &innobase_use_doublewrite, SHOW_MY_BOOL},
|
||||
{sys_innodb_fast_shutdown.name,(char*) &sys_innodb_fast_shutdown, SHOW_SYS},
|
||||
|
@ -917,12 +930,12 @@ struct show_var_st init_vars[]= {
|
|||
{"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG },
|
||||
{"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG },
|
||||
{"innodb_locks_unsafe_for_binlog", (char*) &innobase_locks_unsafe_for_binlog, SHOW_MY_BOOL},
|
||||
{"innodb_log_arch_dir", (char*) &innobase_log_arch_dir, SHOW_CHAR_PTR},
|
||||
{sys_innodb_log_arch_dir.name, (char*) &sys_innodb_log_arch_dir, SHOW_SYS},
|
||||
{"innodb_log_archive", (char*) &innobase_log_archive, SHOW_MY_BOOL},
|
||||
{"innodb_log_buffer_size", (char*) &innobase_log_buffer_size, SHOW_LONG },
|
||||
{"innodb_log_file_size", (char*) &innobase_log_file_size, SHOW_LONGLONG},
|
||||
{"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG},
|
||||
{"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
|
||||
{sys_innodb_log_group_home_dir.name, (char*) &sys_innodb_log_group_home_dir, SHOW_SYS},
|
||||
{sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS},
|
||||
{sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS},
|
||||
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
|
||||
|
@ -1026,7 +1039,7 @@ struct show_var_st init_vars[]= {
|
|||
{sys_optimizer_search_depth.name,(char*) &sys_optimizer_search_depth,
|
||||
SHOW_SYS},
|
||||
{"pid_file", (char*) pidfile_name, SHOW_CHAR},
|
||||
{"plugin_dir", (char*) opt_plugin_dir, SHOW_CHAR},
|
||||
{sys_plugin_dir.name, (char*) &sys_plugin_dir, SHOW_SYS},
|
||||
{"port", (char*) &mysqld_port, SHOW_INT},
|
||||
{sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS},
|
||||
{"protocol_version", (char*) &protocol_version, SHOW_INT},
|
||||
|
@ -1068,7 +1081,7 @@ struct show_var_st init_vars[]= {
|
|||
#ifdef HAVE_REPLICATION
|
||||
{sys_slave_compressed_protocol.name,
|
||||
(char*) &sys_slave_compressed_protocol, SHOW_SYS},
|
||||
{"slave_load_tmpdir", (char*) &slave_load_tmpdir, SHOW_CHAR_PTR},
|
||||
{sys_slave_load_tmpdir.name,(char*) &sys_slave_load_tmpdir, SHOW_SYS},
|
||||
{sys_slave_net_timeout.name,(char*) &sys_slave_net_timeout, SHOW_SYS},
|
||||
{"slave_skip_errors", (char*) &slave_error_mask, SHOW_SLAVE_SKIP_ERRORS},
|
||||
{sys_slave_trans_retries.name,(char*) &sys_slave_trans_retries, SHOW_SYS},
|
||||
|
@ -1175,6 +1188,7 @@ bool update_sys_var_str(sys_var_str *var_str, rw_lock_t *var_mutex,
|
|||
old_value= var_str->value;
|
||||
var_str->value= res;
|
||||
var_str->value_length= new_length;
|
||||
var_str->is_os_charset= FALSE;
|
||||
rw_unlock(var_mutex);
|
||||
my_free(old_value, MYF(MY_ALLOW_ZERO_PTR));
|
||||
return 0;
|
||||
|
@ -1914,11 +1928,11 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
|
|||
char *str= (char*) value_ptr(thd, var_type, base);
|
||||
if (str)
|
||||
tmp= new Item_string(str, strlen(str),
|
||||
system_charset_info, DERIVATION_SYSCONST);
|
||||
charset(thd), DERIVATION_SYSCONST);
|
||||
else
|
||||
{
|
||||
tmp= new Item_null();
|
||||
tmp->collation.set(system_charset_info, DERIVATION_SYSCONST);
|
||||
tmp->collation.set(charset(thd), DERIVATION_SYSCONST);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||
return tmp;
|
||||
|
@ -1930,6 +1944,13 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
|
|||
}
|
||||
|
||||
|
||||
CHARSET_INFO *sys_var::charset(THD *thd)
|
||||
{
|
||||
return is_os_charset ? thd->variables.character_set_filesystem :
|
||||
system_charset_info;
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_thd_enum::update(THD *thd, set_var *var)
|
||||
{
|
||||
if (var->type == OPT_GLOBAL)
|
||||
|
|
|
@ -46,9 +46,17 @@ public:
|
|||
|
||||
sys_after_update_func after_update;
|
||||
bool no_support_one_shot;
|
||||
/*
|
||||
true if the value is in character_set_filesystem,
|
||||
false otherwise.
|
||||
Note that we can't use a pointer to the charset as the system var is
|
||||
instantiated in global scope and the charset pointers are initialized
|
||||
later.
|
||||
*/
|
||||
bool is_os_charset;
|
||||
sys_var(const char *name_arg, sys_after_update_func func= NULL)
|
||||
:name(name_arg), after_update(func)
|
||||
, no_support_one_shot(1)
|
||||
, no_support_one_shot(1), is_os_charset(FALSE)
|
||||
{}
|
||||
virtual ~sys_var() {}
|
||||
virtual bool check(THD *thd, set_var *var);
|
||||
|
@ -68,6 +76,7 @@ public:
|
|||
Item *item(THD *thd, enum_var_type type, LEX_STRING *base);
|
||||
virtual bool is_struct() { return 0; }
|
||||
virtual bool is_readonly() const { return 0; }
|
||||
CHARSET_INFO *charset(THD *thd);
|
||||
};
|
||||
|
||||
|
||||
|
@ -247,6 +256,17 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class sys_var_const_os_str: public sys_var_const_str
|
||||
{
|
||||
public:
|
||||
sys_var_const_os_str(const char *name_arg, const char *value_arg)
|
||||
:sys_var_const_str(name_arg, value_arg)
|
||||
{
|
||||
is_os_charset= TRUE;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class sys_var_const_str_ptr :public sys_var
|
||||
{
|
||||
public:
|
||||
|
@ -276,6 +296,17 @@ public:
|
|||
};
|
||||
|
||||
|
||||
class sys_var_const_os_str_ptr :public sys_var_const_str_ptr
|
||||
{
|
||||
public:
|
||||
sys_var_const_os_str_ptr(const char *name_arg, char **value_arg)
|
||||
:sys_var_const_str_ptr(name_arg, value_arg)
|
||||
{
|
||||
is_os_charset= TRUE;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class sys_var_enum :public sys_var
|
||||
{
|
||||
uint *value;
|
||||
|
@ -791,6 +822,20 @@ public:
|
|||
bool is_readonly() const { return 1; }
|
||||
};
|
||||
|
||||
|
||||
class sys_var_readonly_os: public sys_var_readonly
|
||||
{
|
||||
public:
|
||||
sys_var_readonly_os(const char *name_arg, enum_var_type type,
|
||||
SHOW_TYPE show_type_arg,
|
||||
sys_value_ptr_func value_ptr_func_arg)
|
||||
:sys_var_readonly(name_arg, type, show_type_arg, value_ptr_func_arg)
|
||||
{
|
||||
is_os_charset= TRUE;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class sys_var_thd_time_zone :public sys_var_thd
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -2102,7 +2102,10 @@ bool reopen_table(TABLE *table,bool locked)
|
|||
for (key=0 ; key < table->s->keys ; key++)
|
||||
{
|
||||
for (part=0 ; part < table->key_info[key].usable_key_parts ; part++)
|
||||
{
|
||||
table->key_info[key].key_part[part].field->table= table;
|
||||
table->key_info[key].key_part[part].field->orig_table= table;
|
||||
}
|
||||
}
|
||||
if (table->triggers)
|
||||
table->triggers->set_table(table);
|
||||
|
|
|
@ -390,11 +390,21 @@ inline int setup_without_group(THD *thd, Item **ref_pointer_array,
|
|||
{
|
||||
int res;
|
||||
nesting_map save_allow_sum_func=thd->lex->allow_sum_func ;
|
||||
/*
|
||||
Need to save the value, so we can turn off only the new NON_AGG_FIELD
|
||||
additions coming from the WHERE
|
||||
*/
|
||||
uint8 saved_flag= thd->lex->current_select->full_group_by_flag;
|
||||
DBUG_ENTER("setup_without_group");
|
||||
|
||||
thd->lex->allow_sum_func&= ~(1 << thd->lex->current_select->nest_level);
|
||||
res= setup_conds(thd, tables, leaves, conds);
|
||||
|
||||
/* it's not wrong to have non-aggregated columns in a WHERE */
|
||||
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY)
|
||||
thd->lex->current_select->full_group_by_flag= saved_flag |
|
||||
(thd->lex->current_select->full_group_by_flag & ~NON_AGG_FIELD_USED);
|
||||
|
||||
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
|
||||
res= res || setup_order(thd, ref_pointer_array, tables, fields, all_fields,
|
||||
order);
|
||||
|
|
|
@ -1441,6 +1441,7 @@ static bool show_status_array(THD *thd, const char *wild,
|
|||
char name_buffer[80];
|
||||
int len;
|
||||
LEX_STRING null_lex_str;
|
||||
CHARSET_INFO *charset= system_charset_info;
|
||||
DBUG_ENTER("show_status_array");
|
||||
|
||||
null_lex_str.str= 0; // For sys_var->value_ptr()
|
||||
|
@ -1469,9 +1470,10 @@ static bool show_status_array(THD *thd, const char *wild,
|
|||
long nr;
|
||||
if (show_type == SHOW_SYS)
|
||||
{
|
||||
show_type= ((sys_var*) value)->show_type();
|
||||
value= (char*) ((sys_var*) value)->value_ptr(thd, value_type,
|
||||
&null_lex_str);
|
||||
sys_var *var= ((sys_var *) value);
|
||||
show_type= var->show_type();
|
||||
value= (char*) var->value_ptr(thd, value_type, &null_lex_str);
|
||||
charset= var->charset(thd);
|
||||
}
|
||||
|
||||
pos= end= buff;
|
||||
|
@ -1794,7 +1796,7 @@ static bool show_status_array(THD *thd, const char *wild,
|
|||
restore_record(table, s->default_values);
|
||||
table->field[0]->store(name_buffer, strlen(name_buffer),
|
||||
system_charset_info);
|
||||
table->field[1]->store(pos, (uint32) (end - pos), system_charset_info);
|
||||
table->field[1]->store(pos, (uint32) (end - pos), charset);
|
||||
if (schema_table_store_record(thd, table))
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
|
|
@ -1249,6 +1249,32 @@ multi_update::initialize_tables(JOIN *join)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
enable uncacheable flag if we update a view with check option
|
||||
and check option has a subselect, otherwise, the check option
|
||||
can be evaluated after the subselect was freed as independent
|
||||
(See full_local in JOIN::join_free()).
|
||||
*/
|
||||
if (table_ref->check_option && !join->select_lex->uncacheable)
|
||||
{
|
||||
SELECT_LEX_UNIT *tmp_unit;
|
||||
SELECT_LEX *sl;
|
||||
for (tmp_unit= join->select_lex->first_inner_unit();
|
||||
tmp_unit;
|
||||
tmp_unit= tmp_unit->next_unit())
|
||||
{
|
||||
for (sl= tmp_unit->first_select(); sl; sl= sl->next_select())
|
||||
{
|
||||
if (sl->master_unit()->item)
|
||||
{
|
||||
join->select_lex->uncacheable|= UNCACHEABLE_CHECKOPTION;
|
||||
goto loop_end;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
loop_end:
|
||||
|
||||
if (table == first_table_for_update && table_ref->check_option)
|
||||
{
|
||||
table_map unupdated_tables= table_ref->check_option->used_tables() &
|
||||
|
|
|
@ -980,13 +980,14 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
|
|||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
if (table->use_index || table->ignore_index)
|
||||
List<String> *index_list= table->use_index ? table->use_index
|
||||
: table->ignore_index;
|
||||
if (index_list)
|
||||
{
|
||||
my_error(ER_WRONG_USAGE, MYF(0),
|
||||
table->ignore_index ? "IGNORE INDEX" :
|
||||
(table->force_index ? "FORCE INDEX" : "USE INDEX"),
|
||||
"VIEW");
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_ASSERT(index_list->head()); // should never fail
|
||||
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), index_list->head()->c_ptr(),
|
||||
table->table_name);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
/* check loop via view definition */
|
||||
|
|
|
@ -1073,6 +1073,7 @@ Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
|||
localtime_r(&tmp_t, &tmp_tm);
|
||||
localtime_to_TIME(tmp, &tmp_tm);
|
||||
tmp->time_type= MYSQL_TIMESTAMP_DATETIME;
|
||||
adjust_leap_second(tmp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1157,6 +1158,7 @@ Time_zone_utc::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
|||
gmtime_r(&tmp_t, &tmp_tm);
|
||||
localtime_to_TIME(tmp, &tmp_tm);
|
||||
tmp->time_type= MYSQL_TIMESTAMP_DATETIME;
|
||||
adjust_leap_second(tmp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1260,6 +1262,7 @@ void
|
|||
Time_zone_db::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
||||
{
|
||||
::gmt_sec_to_TIME(tmp, t, tz_info);
|
||||
adjust_leap_second(tmp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2373,6 +2376,25 @@ Time_zone *my_tz_find_with_opening_tz_tables(THD *thd, const String *name)
|
|||
DBUG_RETURN(tz);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Convert leap seconds into non-leap
|
||||
|
||||
This function will convert the leap seconds added by the OS to
|
||||
non-leap seconds, e.g. 23:59:59, 23:59:60 -> 23:59:59, 00:00:01 ...
|
||||
This check is not checking for years on purpose : although it's not a
|
||||
complete check this way it doesn't require looking (and having installed)
|
||||
the leap seconds table.
|
||||
|
||||
@param[in,out] broken down time structure as filled in by the OS
|
||||
*/
|
||||
|
||||
void Time_zone::adjust_leap_second(MYSQL_TIME *t)
|
||||
{
|
||||
if (t->second == 60 || t->second == 61)
|
||||
t->second= 59;
|
||||
}
|
||||
|
||||
#endif /* !defined(TESTTIME) && !defined(TZINFO2SQL) */
|
||||
|
||||
|
||||
|
|
|
@ -55,6 +55,9 @@ public:
|
|||
allocated on MEM_ROOT and should not require destruction.
|
||||
*/
|
||||
virtual ~Time_zone() {};
|
||||
|
||||
protected:
|
||||
static inline void adjust_leap_second(MYSQL_TIME *t);
|
||||
};
|
||||
|
||||
extern Time_zone * my_tz_UTC;
|
||||
|
|
|
@ -16218,7 +16218,87 @@ static void test_bug38486(void)
|
|||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
static void test_bug40365(void)
|
||||
{
|
||||
uint rc, i;
|
||||
MYSQL_STMT *stmt= 0;
|
||||
MYSQL_BIND my_bind[2];
|
||||
my_bool is_null[2]= {0};
|
||||
MYSQL_TIME tm[2];
|
||||
|
||||
DBUG_ENTER("test_bug40365");
|
||||
|
||||
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
|
||||
myquery(rc);
|
||||
rc= mysql_query(mysql, "CREATE TABLE t1(c1 DATETIME, \
|
||||
c2 DATE)");
|
||||
myquery(rc);
|
||||
|
||||
stmt= mysql_simple_prepare(mysql, "INSERT INTO t1 VALUES(?, ?)");
|
||||
check_stmt(stmt);
|
||||
verify_param_count(stmt, 2);
|
||||
|
||||
bzero((char*) my_bind, sizeof(my_bind));
|
||||
my_bind[0].buffer_type= MYSQL_TYPE_DATETIME;
|
||||
my_bind[1].buffer_type= MYSQL_TYPE_DATE;
|
||||
for (i= 0; i < (int) array_elements(my_bind); i++)
|
||||
{
|
||||
my_bind[i].buffer= (void *) &tm[i];
|
||||
my_bind[i].is_null= &is_null[i];
|
||||
}
|
||||
|
||||
rc= mysql_stmt_bind_param(stmt, my_bind);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
for (i= 0; i < (int) array_elements(my_bind); i++)
|
||||
{
|
||||
tm[i].neg= 0;
|
||||
tm[i].second_part= 0;
|
||||
tm[i].year= 2009;
|
||||
tm[i].month= 2;
|
||||
tm[i].day= 29;
|
||||
tm[i].hour= 0;
|
||||
tm[i].minute= 0;
|
||||
tm[i].second= 0;
|
||||
}
|
||||
rc= mysql_stmt_execute(stmt);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
rc= mysql_commit(mysql);
|
||||
myquery(rc);
|
||||
mysql_stmt_close(stmt);
|
||||
|
||||
stmt= mysql_simple_prepare(mysql, "SELECT * FROM t1");
|
||||
check_stmt(stmt);
|
||||
|
||||
rc= mysql_stmt_bind_result(stmt, my_bind);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
rc= mysql_stmt_execute(stmt);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
rc= mysql_stmt_store_result(stmt);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
rc= mysql_stmt_fetch(stmt);
|
||||
check_execute(stmt, rc);
|
||||
|
||||
if (!opt_silent)
|
||||
fprintf(stdout, "\n");
|
||||
|
||||
for (i= 0; i < array_elements(my_bind); i++)
|
||||
{
|
||||
if (!opt_silent)
|
||||
fprintf(stdout, "\ntime[%d]: %02d-%02d-%02d ",
|
||||
i, tm[i].year, tm[i].month, tm[i].day);
|
||||
DIE_UNLESS(tm[i].year == 0);
|
||||
DIE_UNLESS(tm[i].month == 0);
|
||||
DIE_UNLESS(tm[i].day == 0);
|
||||
}
|
||||
mysql_stmt_close(stmt);
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
/*
|
||||
Read and parse arguments and MySQL options from my.cnf
|
||||
*/
|
||||
|
@ -16514,6 +16594,7 @@ static struct my_tests_st my_tests[]= {
|
|||
{ "test_bug31669", test_bug31669 },
|
||||
{ "test_bug32265", test_bug32265 },
|
||||
{ "test_bug38486", test_bug38486 },
|
||||
{ "test_bug40365", test_bug40365 },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue