Manual merge from mysql-5.1.
This commit is contained in:
commit
5ae8ae3a8e
@ -1280,21 +1280,35 @@ sig_handler handle_sigint(int sig)
|
||||
MYSQL *kill_mysql= NULL;
|
||||
|
||||
/* terminate if no query being executed, or we already tried interrupting */
|
||||
if (!executing_query || interrupted_query)
|
||||
/* terminate if no query being executed, or we already tried interrupting */
|
||||
if (!executing_query || (interrupted_query == 2))
|
||||
{
|
||||
tee_fprintf(stdout, "Ctrl-C -- exit!\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
kill_mysql= mysql_init(kill_mysql);
|
||||
if (!mysql_real_connect(kill_mysql,current_host, current_user, opt_password,
|
||||
"", opt_mysql_port, opt_mysql_unix_port,0))
|
||||
{
|
||||
tee_fprintf(stdout, "Ctrl-C -- sorry, cannot connect to server to kill query, giving up ...\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
interrupted_query++;
|
||||
|
||||
/* mysqld < 5 does not understand KILL QUERY, skip to KILL CONNECTION */
|
||||
if ((interrupted_query == 1) && (mysql_get_server_version(&mysql) < 50000))
|
||||
interrupted_query= 2;
|
||||
|
||||
/* kill_buffer is always big enough because max length of %lu is 15 */
|
||||
sprintf(kill_buffer, "KILL /*!50000 QUERY */ %lu", mysql_thread_id(&mysql));
|
||||
mysql_real_query(kill_mysql, kill_buffer, strlen(kill_buffer));
|
||||
sprintf(kill_buffer, "KILL %s%lu",
|
||||
(interrupted_query == 1) ? "QUERY " : "",
|
||||
mysql_thread_id(&mysql));
|
||||
tee_fprintf(stdout, "Ctrl-C -- sending \"%s\" to server ...\n", kill_buffer);
|
||||
mysql_real_query(kill_mysql, kill_buffer, (uint) strlen(kill_buffer));
|
||||
mysql_close(kill_mysql);
|
||||
tee_fprintf(stdout, "Query aborted by Ctrl+C\n");
|
||||
|
||||
interrupted_query= 1;
|
||||
tee_fprintf(stdout, "Ctrl-C -- query aborted.\n");
|
||||
|
||||
return;
|
||||
|
||||
|
@ -17,11 +17,12 @@ main.log_tables # Bug#47924 2009-10-08 alik main.log_ta
|
||||
main.plugin # Bug#47146 Linking problem with example plugin when dtrace enabled
|
||||
main.plugin_load # Bug#47146
|
||||
|
||||
rpl.rpl_cross_version* # Bug #43913 2009-10-26 joro rpl_cross_version can't pass on conflicts complainig clash with --slave-load-tm
|
||||
rpl.rpl_innodb_bug28430* # Bug#46029
|
||||
rpl.rpl_innodb_bug30888* @solaris # Bug#47646 2009-09-25 alik rpl.rpl_innodb_bug30888 fails sporadically on Solaris
|
||||
rpl.rpl_log_pos* # Bug#47743 2009-10-02 alik rpl.rpl_log_pos fails sporadically
|
||||
rpl.rpl_plugin_load* @solaris # Bug#47146
|
||||
rpl.rpl_row_create_table* # Bug#45576: rpl_row_create_table fails on PB2
|
||||
rpl.rpl_log_pos* # Bug#47743 2009-10-02 alik rpl.rpl_log_pos fails sporadically
|
||||
rpl.rpl_timezone* # Bug#47017 2009-10-27 alik rpl_timezone fails on PB-2 with mismatch error
|
||||
rpl.rpl_trigger* # Bug#46656 2009-09-25 alik InnoDB plugin: memory leaks (Valgrind)
|
||||
|
||||
|
@ -93,7 +93,7 @@ kill @id;
|
||||
# We don't drop t3 as this is a temporary table
|
||||
drop table t2;
|
||||
connection master;
|
||||
--error 1053,2013
|
||||
--error 1317,2013
|
||||
reap;
|
||||
connection slave;
|
||||
# The SQL slave thread should now have stopped because the query was killed on
|
||||
|
4
mysql-test/include/have_case_insensitive_fs.inc
Normal file
4
mysql-test/include/have_case_insensitive_fs.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/case_insensitive_fs.require
|
||||
--disable_query_log
|
||||
show variables like 'lower_case_file_system';
|
||||
--enable_query_log
|
@ -1330,4 +1330,12 @@ ALTER TABLE t1 MODIFY COLUMN a SET('a1','a2','a0','xx','a5','a6','a7','a8','a9',
|
||||
affected rows: 2
|
||||
info: Records: 2 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 TIMESTAMP NULL DEFAULT NULL,
|
||||
f2 INT(11) DEFAULT NULL) ENGINE=MYISAM DEFAULT CHARSET=utf8;
|
||||
INSERT INTO t1 VALUES (NULL, NULL), ("2009-10-09 11:46:19", 2);
|
||||
this should affect no rows as there is no real change
|
||||
ALTER TABLE t1 CHANGE COLUMN f1 f1_no_real_change TIMESTAMP NULL DEFAULT NULL;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
2
mysql-test/r/case_insensitive_fs.require
Normal file
2
mysql-test/r/case_insensitive_fs.require
Normal file
@ -0,0 +1,2 @@
|
||||
Variable_name Value
|
||||
lower_case_file_system ON
|
@ -1487,4 +1487,43 @@ MBRINTERSECTS(b, GEOMFROMTEXT('LINESTRING(1 1,1102219 2)') );
|
||||
COUNT(*)
|
||||
2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #48258: Assertion failed when using a spatial index
|
||||
#
|
||||
CREATE TABLE t1(a LINESTRING NOT NULL, SPATIAL KEY(a));
|
||||
INSERT INTO t1 VALUES
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)')),
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)'));
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a = GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a = GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
1
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a < GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a < GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a <= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a <= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
1
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a > GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a > GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a NULL NULL NULL 2 Using where
|
||||
SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
1
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests.
|
||||
|
@ -972,6 +972,18 @@ select min(`col002`) from t1 union select `col002` from t1;
|
||||
min(`col002`)
|
||||
NULL
|
||||
drop table t1;
|
||||
#
|
||||
# Bug #47780: crash when comparing GIS items from subquery
|
||||
#
|
||||
CREATE TABLE t1(a INT, b MULTIPOLYGON);
|
||||
INSERT INTO t1 VALUES
|
||||
(0,
|
||||
GEOMFROMTEXT(
|
||||
'multipolygon(((1 2,3 4,5 6,7 8,9 8),(7 6,5 4,3 2,1 2,3 4)))'));
|
||||
# must not crash
|
||||
SELECT 1 FROM t1 WHERE a <> (SELECT GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
create table t1 (f1 tinyint(1), f2 char(1), f3 varchar(1), f4 geometry, f5 datetime);
|
||||
create view v1 as select * from t1;
|
||||
|
@ -1007,8 +1007,8 @@ DROP TABLE mysqltest1.t2;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, INSERT, CREATE, DROP, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
RENAME TABLE t2 TO t1;
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
@ -1018,8 +1018,8 @@ REVOKE DROP, INSERT ON mysqltest1.t2 FROM mysqltest_1@localhost;
|
||||
SHOW GRANTS;
|
||||
Grants for mysqltest_1@localhost
|
||||
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t1` TO 'mysqltest_1'@'localhost'
|
||||
GRANT SELECT, CREATE, ALTER ON `mysqltest1`.`t2` TO 'mysqltest_1'@'localhost'
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 't1'
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
|
16
mysql-test/r/grant_lowercase_fs.result
Normal file
16
mysql-test/r/grant_lowercase_fs.result
Normal file
@ -0,0 +1,16 @@
|
||||
create database db1;
|
||||
GRANT CREATE ON db1.* to user_1@localhost;
|
||||
GRANT SELECT ON db1.* to USER_1@localhost;
|
||||
CREATE TABLE t1(f1 int);
|
||||
SELECT * FROM t1;
|
||||
ERROR 42000: SELECT command denied to user 'user_1'@'localhost' for table 't1'
|
||||
SELECT * FROM t1;
|
||||
f1
|
||||
CREATE TABLE t2(f1 int);
|
||||
ERROR 42000: CREATE command denied to user 'USER_1'@'localhost' for table 't2'
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_1@localhost;
|
||||
DROP USER user_1@localhost;
|
||||
DROP USER USER_1@localhost;
|
||||
DROP DATABASE db1;
|
||||
use test;
|
@ -10,3 +10,48 @@ create database D1;
|
||||
ERROR 42000: Access denied for user 'sample'@'localhost' to database 'D1'
|
||||
drop user 'sample'@'localhost';
|
||||
drop database if exists d1;
|
||||
CREATE DATABASE d1;
|
||||
USE d1;
|
||||
CREATE TABLE T1(f1 INT);
|
||||
CREATE TABLE t1(f1 INT);
|
||||
GRANT SELECT ON T1 to user_1@localhost;
|
||||
select * from t1;
|
||||
ERROR 42000: SELECT command denied to user 'user_1'@'localhost' for table 't1'
|
||||
select * from T1;
|
||||
f1
|
||||
GRANT SELECT ON t1 to user_1@localhost;
|
||||
select * from information_schema.table_privileges;
|
||||
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE
|
||||
'user_1'@'localhost' NULL d1 T1 SELECT NO
|
||||
'user_1'@'localhost' NULL d1 t1 SELECT NO
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
DROP USER user_1@localhost;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
CREATE DATABASE db1;
|
||||
USE db1;
|
||||
CREATE PROCEDURE p1() BEGIN END;
|
||||
CREATE FUNCTION f1(i INT) RETURNS INT RETURN i+1;
|
||||
GRANT USAGE ON db1.* to user_1@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE db1.P1 to user_1@localhost;
|
||||
GRANT EXECUTE ON FUNCTION db1.f1 to user_1@localhost;
|
||||
GRANT UPDATE ON db1.* to USER_1@localhost;
|
||||
call p1();
|
||||
call P1();
|
||||
select f1(1);
|
||||
f1(1)
|
||||
2
|
||||
call p1();
|
||||
ERROR 42000: execute command denied to user 'USER_1'@'localhost' for routine 'db1.p1'
|
||||
call P1();
|
||||
ERROR 42000: execute command denied to user 'USER_1'@'localhost' for routine 'db1.p1'
|
||||
select f1(1);
|
||||
ERROR 42000: execute command denied to user 'USER_1'@'localhost' for routine 'db1.f1'
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_1@localhost;
|
||||
DROP FUNCTION f1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP USER user_1@localhost;
|
||||
DROP USER USER_1@localhost;
|
||||
DROP DATABASE db1;
|
||||
use test;
|
||||
|
@ -32,19 +32,19 @@ identified by 'looser' ;
|
||||
show grants for second_user@localhost ;
|
||||
Grants for second_user@localhost
|
||||
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
|
||||
GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
|
||||
drop table mysqltest.t9 ;
|
||||
show grants for second_user@localhost ;
|
||||
Grants for second_user@localhost
|
||||
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
|
||||
GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
|
||||
show grants for second_user@localhost ;
|
||||
Grants for second_user@localhost
|
||||
GRANT USAGE ON *.* TO 'second_user'@'localhost' IDENTIFIED BY PASSWORD '*13843FE600B19A81E32AF50D4A6FED25875FF1F3'
|
||||
GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.`t9` TO 'second_user'@'localhost'
|
||||
GRANT SELECT ON `mysqltest`.`t1` TO 'second_user'@'localhost'
|
||||
prepare s_t1 from 'select a as my_col from t1' ;
|
||||
execute s_t1 ;
|
||||
my_col
|
||||
|
@ -4386,6 +4386,35 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where ((`test`.`t1`.`a` = `test`.`t1`.`b`) and (`test`.`t1`.`a` > 1)) limit 2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#47019: Assertion failed: 0, file .\rt_mbr.c, line 138 when
|
||||
# forcing a spatial index
|
||||
#
|
||||
CREATE TABLE t1(a LINESTRING NOT NULL, SPATIAL KEY(a));
|
||||
INSERT INTO t1 VALUES
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)')),
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)'));
|
||||
EXPLAIN SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
||||
1 SIMPLE t2 ALL a NULL NULL NULL 2
|
||||
SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2;
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2 FORCE INDEX(a);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
||||
1 SIMPLE t2 ALL a NULL NULL NULL 2
|
||||
SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2 FORCE INDEX(a);
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
create table t1(a INT, KEY (a));
|
||||
INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
|
||||
|
47
mysql-test/r/sp-bugs.result
Normal file
47
mysql-test/r/sp-bugs.result
Normal file
@ -0,0 +1,47 @@
|
||||
#
|
||||
# Bug #47412: Valgrind warnings / user can read uninitalized memory
|
||||
# using SP variables
|
||||
#
|
||||
CREATE SCHEMA testdb;
|
||||
USE testdb;
|
||||
CREATE FUNCTION f2 () RETURNS INTEGER
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
||||
RETURN f_not_exists () ;
|
||||
END|
|
||||
CREATE PROCEDURE p3 ( arg1 VARCHAR(32) )
|
||||
BEGIN
|
||||
CALL p_not_exists ( );
|
||||
END|
|
||||
# should not return valgrind warnings
|
||||
CALL p3 ( f2 () );
|
||||
ERROR 42000: PROCEDURE testdb.p_not_exists does not exist
|
||||
DROP SCHEMA testdb;
|
||||
CREATE SCHEMA testdb;
|
||||
USE testdb;
|
||||
CREATE FUNCTION f2 () RETURNS INTEGER
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
||||
RETURN f_not_exists () ;
|
||||
END|
|
||||
CREATE PROCEDURE p3 ( arg2 INTEGER )
|
||||
BEGIN
|
||||
CALL p_not_exists ( );
|
||||
END|
|
||||
# should not return valgrind warnings
|
||||
CALL p3 ( f2 () );
|
||||
ERROR 42000: PROCEDURE testdb.p_not_exists does not exist
|
||||
DROP SCHEMA testdb;
|
||||
CREATE SCHEMA testdb;
|
||||
USE testdb;
|
||||
CREATE FUNCTION f2 () RETURNS INTEGER
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
||||
RETURN f_not_exists () ;
|
||||
END|
|
||||
# should not return valgrind warnings
|
||||
SELECT f2 ();
|
||||
f2 ()
|
||||
NULL
|
||||
DROP SCHEMA testdb;
|
||||
End of 5.1 tests
|
@ -1670,3 +1670,19 @@ NULL
|
||||
SELECT non_existent (a) FROM t1 WHERE b = 999999;
|
||||
ERROR 42000: FUNCTION test.non_existent does not exist
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #47788: Crash in TABLE_LIST::hide_view_error on UPDATE + VIEW +
|
||||
# SP + MERGE + ALTER
|
||||
#
|
||||
CREATE TABLE t1 (pk INT, b INT, KEY (b));
|
||||
CREATE ALGORITHM = TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE PROCEDURE p1 (a int) UPDATE IGNORE v1 SET b = a;
|
||||
CALL p1(5);
|
||||
ERROR HY000: The target table v1 of the UPDATE is not updatable
|
||||
ALTER TABLE t1 CHANGE COLUMN b b2 INT;
|
||||
CALL p1(7);
|
||||
ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
|
||||
DROP PROCEDURE p1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
@ -6979,51 +6979,6 @@ CALL p1;
|
||||
ERROR 42S22: Unknown column 'A.b' in 'IN/ALL/ANY subquery'
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug47627 SET @@{global.session}.local_variable in stored routine causes crash
|
||||
#
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
DROP PROCEDURE IF EXISTS p3;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET @@session.v= 10;
|
||||
END//
|
||||
ERROR HY000: Unknown system variable 'v'
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET v= 10;
|
||||
END//
|
||||
call p2()//
|
||||
CREATE PROCEDURE p3()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SELECT @@session.v;
|
||||
END//
|
||||
ERROR HY000: Unknown system variable 'v'
|
||||
CREATE PROCEDURE p4()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET @@global.v= 10;
|
||||
END//
|
||||
ERROR HY000: Unknown system variable 'v'
|
||||
CREATE PROCEDURE p5()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET @@global.query_cache_size= 0;
|
||||
SET @@session.identity= 1;
|
||||
SELECT @@session.identity;
|
||||
SELECT @@global.query_cache_size;
|
||||
END//
|
||||
CALL p5();
|
||||
@@session.identity
|
||||
1
|
||||
@@global.query_cache_size
|
||||
0
|
||||
DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p5;
|
||||
# ------------------------------------------------------------------
|
||||
# -- End of 5.1 tests
|
||||
# ------------------------------------------------------------------
|
||||
|
@ -161,7 +161,7 @@ procs_priv CREATE TABLE `procs_priv` (
|
||||
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
|
||||
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
|
||||
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
|
||||
`Routine_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
|
||||
`Routine_name` char(64) CHARACTER SET utf8 NOT NULL DEFAULT '',
|
||||
`Routine_type` enum('FUNCTION','PROCEDURE') COLLATE utf8_bin NOT NULL,
|
||||
`Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '',
|
||||
`Proc_priv` set('Execute','Alter Routine','Grant') CHARACTER SET utf8 NOT NULL DEFAULT '',
|
||||
|
@ -503,3 +503,14 @@ ERROR HY000: Recursive stored functions and triggers are not allowed.
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
End of 5.0 tests
|
||||
#
|
||||
# Bug #47919 assert in open_table during ALTER temporary table
|
||||
#
|
||||
CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT, PRIMARY KEY (f1));
|
||||
CREATE TEMPORARY TABLE t2 LIKE t1;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
ALTER TABLE t2 COMMENT = 'ABC';
|
||||
UPDATE t2, t1 SET t2.f1 = 2, t1.f1 = 9;
|
||||
ALTER TABLE t2 COMMENT = 'DEF';
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -0,0 +1,50 @@
|
||||
RESET MASTER;
|
||||
CREATE TABLE t1 (a int);
|
||||
### assertion: index file contains regular entries
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
master-bin.000001
|
||||
|
||||
### assertion: show original binlogs
|
||||
show binary logs;
|
||||
Log_name File_size
|
||||
master-bin.000001 #
|
||||
### assertion: binlog contents from regular entries
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a int)
|
||||
FLUSH LOGS;
|
||||
### assertion: index file contains renamed binlog and the new one
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
master-bin-b34582.000001
|
||||
master-bin.000002
|
||||
|
||||
### assertion: original binlog content still exists, despite we
|
||||
### renamed and changed the index file
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin-b34582.000001 # Query # # use `test`; CREATE TABLE t1 (a int)
|
||||
### assertion: user changed binlog index shows correct entries
|
||||
show binary logs;
|
||||
Log_name File_size
|
||||
master-bin-b34582.000001 #
|
||||
master-bin.000002 #
|
||||
DROP TABLE t1;
|
||||
### assertion: purging binlogs up to binlog created after instrumenting index file should work
|
||||
PURGE BINARY LOGS TO 'master-bin.000002';
|
||||
### assertion: show binary logs should only contain latest binlog
|
||||
show binary logs;
|
||||
Log_name File_size
|
||||
master-bin.000002 #
|
||||
### assertion: assert that binlog files were indeed purged (using file_exists calls)
|
||||
### assertion: assert that not purged binlog file exists
|
||||
### assertion: show index file contents and these should match show binary logs issued above
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
master-bin.000002
|
||||
|
||||
RESET MASTER;
|
114
mysql-test/suite/binlog/t/binlog_delete_and_flush_index.test
Normal file
114
mysql-test/suite/binlog/t/binlog_delete_and_flush_index.test
Normal file
@ -0,0 +1,114 @@
|
||||
# BUG#34582: FLUSH LOGS does not close and reopen the binlog index
|
||||
# file
|
||||
#
|
||||
# WHAT
|
||||
# ====
|
||||
#
|
||||
# We want to test that FLUSH LOGS closes and reopens binlog index
|
||||
# file.
|
||||
#
|
||||
# HOW
|
||||
# ===
|
||||
#
|
||||
# PREPARE:
|
||||
# 1. create some binlog events
|
||||
# 2. show index content, binlog events and binlog contents
|
||||
# for mysql-bin.000001
|
||||
# 3. copy the mysql-bin.000001 to mysql-bin-b34582.000001
|
||||
# 4. change the index file so that mysql-bin.000001 is replaced
|
||||
# with mysql-bin-b34582.000001
|
||||
# 5. FLUSH the logs so that new index is closed and reopened
|
||||
#
|
||||
# ASSERTIONS:
|
||||
# 1. index file contents shows mysql-bin-b34582.000001 and
|
||||
# mysql-bin.000002
|
||||
# 1. show binary logs shows current index entries
|
||||
# 2. binlog contents for mysql-bin-b34582.000001 are displayed
|
||||
# 3. Purge binlogs up to the latest one succeeds
|
||||
# 4. SHOW BINARY LOGS presents the latest one only after purging
|
||||
# 5. Purged binlogs files don't exist in the filesystem
|
||||
# 6. Not purged binlog file exists in the filesystem
|
||||
#
|
||||
# CLEAN UP:
|
||||
# 1. RESET MASTER
|
||||
#
|
||||
|
||||
-- source include/have_log_bin.inc
|
||||
|
||||
RESET MASTER;
|
||||
|
||||
-- let $datadir= `SELECT @@datadir`
|
||||
-- let $index=$datadir/master-bin.index
|
||||
-- chmod 0644 $index
|
||||
|
||||
# action: issue one command so that binlog gets some event
|
||||
CREATE TABLE t1 (a int);
|
||||
|
||||
-- echo ### assertion: index file contains regular entries
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SET @index=LOAD_FILE('$index')
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
SELECT @index;
|
||||
|
||||
--echo ### assertion: show original binlogs
|
||||
-- source include/show_binary_logs.inc
|
||||
|
||||
--echo ### assertion: binlog contents from regular entries
|
||||
-- source include/show_binlog_events.inc
|
||||
|
||||
# action: copy binlogs to other names and change entries in index file
|
||||
-- copy_file $datadir/master-bin.000001 $datadir/master-bin-b34582.000001
|
||||
let INDEX_FILE=$index;
|
||||
perl;
|
||||
$file= $ENV{'INDEX_FILE'};
|
||||
open(FILE, ">$file") || die "Unable to open $file.";
|
||||
truncate(FILE,0);
|
||||
close ($file);
|
||||
EOF
|
||||
|
||||
-- append_file $index
|
||||
master-bin-b34582.000001
|
||||
EOF
|
||||
|
||||
# action: should cause rotation, and creation of new binlogs
|
||||
FLUSH LOGS;
|
||||
|
||||
# file is not used anymore - remove it (mysql closed on flush logs).
|
||||
-- remove_file $datadir/master-bin.000001
|
||||
|
||||
-- echo ### assertion: index file contains renamed binlog and the new one
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SET @index=LOAD_FILE('$index')
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
SELECT @index;
|
||||
|
||||
-- echo ### assertion: original binlog content still exists, despite we
|
||||
-- echo ### renamed and changed the index file
|
||||
-- source include/show_binlog_events.inc
|
||||
|
||||
-- echo ### assertion: user changed binlog index shows correct entries
|
||||
-- source include/show_binary_logs.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo ### assertion: purging binlogs up to binlog created after instrumenting index file should work
|
||||
-- let $current_binlog= query_get_value(SHOW MASTER STATUS, File, 1)
|
||||
-- eval PURGE BINARY LOGS TO '$current_binlog'
|
||||
|
||||
-- echo ### assertion: show binary logs should only contain latest binlog
|
||||
-- source include/show_binary_logs.inc
|
||||
|
||||
-- echo ### assertion: assert that binlog files were indeed purged (using file_exists calls)
|
||||
-- error 1
|
||||
-- file_exists $datadir/master-bin-b34852.000001
|
||||
|
||||
-- echo ### assertion: assert that not purged binlog file exists
|
||||
-- file_exists $datadir/$current_binlog
|
||||
|
||||
-- echo ### assertion: show index file contents and these should match show binary logs issued above
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SET @index=LOAD_FILE('$index')
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
SELECT @index;
|
||||
|
||||
RESET MASTER;
|
@ -50,7 +50,7 @@ kill @id;
|
||||
drop table t2,t3;
|
||||
insert into t4 values (3),(4);
|
||||
connection master;
|
||||
--error 0,1053,2013
|
||||
--error 0,1317,2013
|
||||
reap;
|
||||
connection master1;
|
||||
save_master_pos;
|
||||
|
@ -1046,4 +1046,19 @@ ALTER TABLE t1 MODIFY COLUMN a SET('a1','a2','a0','xx','a5','a6','a7','a8','a9',
|
||||
--disable_info
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#43508: Renaming timestamp or date column triggers table copy
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f1 TIMESTAMP NULL DEFAULT NULL,
|
||||
f2 INT(11) DEFAULT NULL) ENGINE=MYISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
INSERT INTO t1 VALUES (NULL, NULL), ("2009-10-09 11:46:19", 2);
|
||||
|
||||
--echo this should affect no rows as there is no real change
|
||||
--enable_info
|
||||
ALTER TABLE t1 CHANGE COLUMN f1 f1_no_real_change TIMESTAMP NULL DEFAULT NULL;
|
||||
--disable_info
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -57,7 +57,7 @@ connection con1;
|
||||
# debug build running without our --debug=make_global..., will be
|
||||
# error 0 (no error). The only important thing to test is that on
|
||||
# debug builds with our --debug=make_global... we don't hang forever.
|
||||
--error 0,1053,2013
|
||||
--error 0,1317,2013
|
||||
reap;
|
||||
|
||||
connection con2;
|
||||
|
@ -881,4 +881,25 @@ SELECT COUNT(*) FROM t1 IGNORE INDEX (b) WHERE
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #48258: Assertion failed when using a spatial index
|
||||
--echo #
|
||||
CREATE TABLE t1(a LINESTRING NOT NULL, SPATIAL KEY(a));
|
||||
INSERT INTO t1 VALUES
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)')),
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)'));
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a = GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
SELECT 1 FROM t1 WHERE a = GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a < GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
SELECT 1 FROM t1 WHERE a < GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a <= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
SELECT 1 FROM t1 WHERE a <= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a > GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
SELECT 1 FROM t1 WHERE a > GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
SELECT 1 FROM t1 WHERE a >= GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)');
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
@ -655,6 +655,22 @@ insert into t1 values (),(),();
|
||||
select min(`col002`) from t1 union select `col002` from t1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #47780: crash when comparing GIS items from subquery
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a INT, b MULTIPOLYGON);
|
||||
INSERT INTO t1 VALUES
|
||||
(0,
|
||||
GEOMFROMTEXT(
|
||||
'multipolygon(((1 2,3 4,5 6,7 8,9 8),(7 6,5 4,3 2,1 2,3 4)))'));
|
||||
|
||||
--echo # must not crash
|
||||
SELECT 1 FROM t1 WHERE a <> (SELECT GEOMETRYCOLLECTIONFROMWKB(b) FROM t1);
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
|
||||
|
30
mysql-test/t/grant_lowercase_fs.test
Normal file
30
mysql-test/t/grant_lowercase_fs.test
Normal file
@ -0,0 +1,30 @@
|
||||
-- source include/have_case_insensitive_fs.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
|
||||
#
|
||||
# Bug#41049 does syntax "grant" case insensitive?
|
||||
#
|
||||
create database db1;
|
||||
GRANT CREATE ON db1.* to user_1@localhost;
|
||||
GRANT SELECT ON db1.* to USER_1@localhost;
|
||||
|
||||
connect (con1,localhost,user_1,,db1);
|
||||
CREATE TABLE t1(f1 int);
|
||||
--error 1142
|
||||
SELECT * FROM t1;
|
||||
connect (con2,localhost,USER_1,,db1);
|
||||
SELECT * FROM t1;
|
||||
--error 1142
|
||||
CREATE TABLE t2(f1 int);
|
||||
|
||||
connection default;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_1@localhost;
|
||||
DROP USER user_1@localhost;
|
||||
DROP USER USER_1@localhost;
|
||||
DROP DATABASE db1;
|
||||
use test;
|
@ -97,7 +97,7 @@ select ((@id := kill_id) - kill_id) from t3;
|
||||
kill @id;
|
||||
|
||||
connection conn1;
|
||||
-- error 1053,2013
|
||||
-- error 1317,2013
|
||||
reap;
|
||||
|
||||
connection default;
|
||||
|
@ -29,3 +29,65 @@ disconnect master;
|
||||
connection default;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# Bug#41049 does syntax "grant" case insensitive?
|
||||
#
|
||||
CREATE DATABASE d1;
|
||||
USE d1;
|
||||
CREATE TABLE T1(f1 INT);
|
||||
CREATE TABLE t1(f1 INT);
|
||||
GRANT SELECT ON T1 to user_1@localhost;
|
||||
|
||||
connect (con1,localhost,user_1,,d1);
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from t1;
|
||||
select * from T1;
|
||||
connection default;
|
||||
GRANT SELECT ON t1 to user_1@localhost;
|
||||
connection con1;
|
||||
select * from information_schema.table_privileges;
|
||||
connection default;
|
||||
disconnect con1;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
DROP USER user_1@localhost;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
|
||||
CREATE DATABASE db1;
|
||||
USE db1;
|
||||
CREATE PROCEDURE p1() BEGIN END;
|
||||
CREATE FUNCTION f1(i INT) RETURNS INT RETURN i+1;
|
||||
|
||||
GRANT USAGE ON db1.* to user_1@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE db1.P1 to user_1@localhost;
|
||||
GRANT EXECUTE ON FUNCTION db1.f1 to user_1@localhost;
|
||||
GRANT UPDATE ON db1.* to USER_1@localhost;
|
||||
|
||||
connect (con1,localhost,user_1,,db1);
|
||||
call p1();
|
||||
call P1();
|
||||
select f1(1);
|
||||
connect (con2,localhost,USER_1,,db1);
|
||||
--error ER_PROCACCESS_DENIED_ERROR
|
||||
call p1();
|
||||
--error ER_PROCACCESS_DENIED_ERROR
|
||||
call P1();
|
||||
--error ER_PROCACCESS_DENIED_ERROR
|
||||
select f1(1);
|
||||
|
||||
connection default;
|
||||
disconnect con1;
|
||||
disconnect con2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_1@localhost;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_1@localhost;
|
||||
DROP FUNCTION f1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP USER user_1@localhost;
|
||||
DROP USER USER_1@localhost;
|
||||
DROP DATABASE db1;
|
||||
use test;
|
||||
|
||||
# End of 5.0 tests
|
||||
|
@ -3739,6 +3739,22 @@ EXPLAIN EXTENDED SELECT a, b FROM t1 WHERE a > 1 AND a = b LIMIT 2;
|
||||
EXPLAIN EXTENDED SELECT a, b FROM t1 WHERE a > 1 AND b = a LIMIT 2;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#47019: Assertion failed: 0, file .\rt_mbr.c, line 138 when
|
||||
--echo # forcing a spatial index
|
||||
--echo #
|
||||
CREATE TABLE t1(a LINESTRING NOT NULL, SPATIAL KEY(a));
|
||||
INSERT INTO t1 VALUES
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)')),
|
||||
(GEOMFROMTEXT('LINESTRING(-1 -1, 1 -1, -1 -1, -1 1, 1 1)'));
|
||||
EXPLAIN SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2;
|
||||
SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2;
|
||||
EXPLAIN SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2 FORCE INDEX(a);
|
||||
SELECT 1 FROM t1 NATURAL LEFT JOIN t1 AS t2 FORCE INDEX(a);
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
|
61
mysql-test/t/sp-bugs.test
Normal file
61
mysql-test/t/sp-bugs.test
Normal file
@ -0,0 +1,61 @@
|
||||
# Test file for stored procedure bugfixes
|
||||
|
||||
--echo #
|
||||
--echo # Bug #47412: Valgrind warnings / user can read uninitalized memory
|
||||
--echo # using SP variables
|
||||
--echo #
|
||||
|
||||
CREATE SCHEMA testdb;
|
||||
USE testdb;
|
||||
DELIMITER |;
|
||||
CREATE FUNCTION f2 () RETURNS INTEGER
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
||||
RETURN f_not_exists () ;
|
||||
END|
|
||||
CREATE PROCEDURE p3 ( arg1 VARCHAR(32) )
|
||||
BEGIN
|
||||
CALL p_not_exists ( );
|
||||
END|
|
||||
DELIMITER ;|
|
||||
--echo # should not return valgrind warnings
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
CALL p3 ( f2 () );
|
||||
|
||||
DROP SCHEMA testdb;
|
||||
|
||||
CREATE SCHEMA testdb;
|
||||
USE testdb;
|
||||
DELIMITER |;
|
||||
CREATE FUNCTION f2 () RETURNS INTEGER
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
||||
RETURN f_not_exists () ;
|
||||
END|
|
||||
CREATE PROCEDURE p3 ( arg2 INTEGER )
|
||||
BEGIN
|
||||
CALL p_not_exists ( );
|
||||
END|
|
||||
DELIMITER ;|
|
||||
--echo # should not return valgrind warnings
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
CALL p3 ( f2 () );
|
||||
|
||||
DROP SCHEMA testdb;
|
||||
|
||||
CREATE SCHEMA testdb;
|
||||
USE testdb;
|
||||
DELIMITER |;
|
||||
CREATE FUNCTION f2 () RETURNS INTEGER
|
||||
BEGIN
|
||||
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' SET @aux = 1;
|
||||
RETURN f_not_exists () ;
|
||||
END|
|
||||
DELIMITER ;|
|
||||
--echo # should not return valgrind warnings
|
||||
SELECT f2 ();
|
||||
|
||||
DROP SCHEMA testdb;
|
||||
|
||||
|
||||
--echo End of 5.1 tests
|
@ -2448,3 +2448,27 @@ SELECT AVG (a) FROM t1 WHERE b = 999999;
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
SELECT non_existent (a) FROM t1 WHERE b = 999999;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #47788: Crash in TABLE_LIST::hide_view_error on UPDATE + VIEW +
|
||||
--echo # SP + MERGE + ALTER
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (pk INT, b INT, KEY (b));
|
||||
CREATE ALGORITHM = TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
|
||||
CREATE PROCEDURE p1 (a int) UPDATE IGNORE v1 SET b = a;
|
||||
|
||||
--error ER_NON_UPDATABLE_TABLE
|
||||
CALL p1(5);
|
||||
|
||||
ALTER TABLE t1 CHANGE COLUMN b b2 INT;
|
||||
|
||||
--error ER_VIEW_INVALID
|
||||
CALL p1(7);
|
||||
|
||||
DROP PROCEDURE p1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -8263,51 +8263,7 @@ CALL p1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug47627 SET @@{global.session}.local_variable in stored routine causes crash
|
||||
--echo #
|
||||
--disable_warnings
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
DROP PROCEDURE IF EXISTS p3;
|
||||
--enable_warnings
|
||||
delimiter //;
|
||||
--error ER_UNKNOWN_SYSTEM_VARIABLE
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET @@session.v= 10;
|
||||
END//
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET v= 10;
|
||||
END//
|
||||
call p2()//
|
||||
--error ER_UNKNOWN_SYSTEM_VARIABLE
|
||||
CREATE PROCEDURE p3()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SELECT @@session.v;
|
||||
END//
|
||||
--error ER_UNKNOWN_SYSTEM_VARIABLE
|
||||
CREATE PROCEDURE p4()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET @@global.v= 10;
|
||||
END//
|
||||
CREATE PROCEDURE p5()
|
||||
BEGIN
|
||||
DECLARE v INT DEFAULT 0;
|
||||
SET @@global.query_cache_size= 0;
|
||||
SET @@session.identity= 1;
|
||||
SELECT @@session.identity;
|
||||
SELECT @@global.query_cache_size;
|
||||
END//
|
||||
delimiter ;//
|
||||
CALL p5();
|
||||
DROP PROCEDURE p2;
|
||||
DROP PROCEDURE p5;
|
||||
|
||||
--echo # ------------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests
|
||||
--echo # ------------------------------------------------------------------
|
||||
|
@ -452,3 +452,18 @@ DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
--echo #
|
||||
--echo # Bug #47919 assert in open_table during ALTER temporary table
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT, PRIMARY KEY (f1));
|
||||
CREATE TEMPORARY TABLE t2 LIKE t1;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
|
||||
ALTER TABLE t2 COMMENT = 'ABC';
|
||||
UPDATE t2, t1 SET t2.f1 = 2, t1.f1 = 9;
|
||||
ALTER TABLE t2 COMMENT = 'DEF';
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -1012,9 +1012,11 @@ static void init_one_value(const struct my_option *option, uchar* *variable,
|
||||
*((longlong*) variable)= (longlong) getopt_ll_limit_value((longlong) value, option, NULL);
|
||||
break;
|
||||
case GET_ULL:
|
||||
case GET_SET:
|
||||
*((ulonglong*) variable)= (ulonglong) getopt_ull_limit_value((ulonglong) value, option, NULL);
|
||||
break;
|
||||
case GET_SET:
|
||||
*((ulonglong*) variable)= (ulonglong) value;
|
||||
break;
|
||||
case GET_DOUBLE:
|
||||
*((double*) variable)= (double) value;
|
||||
break;
|
||||
|
@ -182,7 +182,10 @@ my_ulonglong find_typeset(char *x, TYPELIB *lib, int *err)
|
||||
{
|
||||
(*err)++;
|
||||
i= x;
|
||||
while (*x && *x != field_separator) x++;
|
||||
while (*x && *x != field_separator)
|
||||
x++;
|
||||
if (x[0] && x[1]) // skip separator if found
|
||||
x++;
|
||||
if ((find= find_type(i, lib, 2 | 8) - 1) < 0)
|
||||
DBUG_RETURN(0);
|
||||
result|= (ULL(1) << find);
|
||||
|
@ -62,7 +62,7 @@ CREATE TABLE IF NOT EXISTS time_zone_leap_second ( Transition_time bigint sign
|
||||
|
||||
CREATE TABLE IF NOT EXISTS proc (db char(64) collate utf8_bin DEFAULT '' NOT NULL, name char(64) DEFAULT '' NOT NULL, type enum('FUNCTION','PROCEDURE') NOT NULL, specific_name char(64) DEFAULT '' NOT NULL, language enum('SQL') DEFAULT 'SQL' NOT NULL, sql_data_access enum( 'CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA') DEFAULT 'CONTAINS_SQL' NOT NULL, is_deterministic enum('YES','NO') DEFAULT 'NO' NOT NULL, security_type enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL, param_list blob NOT NULL, returns longblob DEFAULT '' NOT NULL, body longblob NOT NULL, definer char(77) collate utf8_bin DEFAULT '' NOT NULL, created timestamp, modified timestamp, sql_mode set( 'REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'NOT_USED', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE', 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH') DEFAULT '' NOT NULL, comment char(64) collate utf8_bin DEFAULT '' NOT NULL, character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db,name,type)) engine=MyISAM character set utf8 comment='Stored Procedures';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS procs_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(16) binary DEFAULT '' NOT NULL, Routine_name char(64) binary DEFAULT '' NOT NULL, Routine_type enum('FUNCTION','PROCEDURE') NOT NULL, Grantor char(77) DEFAULT '' NOT NULL, Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL, Timestamp timestamp(14), PRIMARY KEY (Host,Db,User,Routine_name,Routine_type), KEY Grantor (Grantor) ) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Procedure privileges';
|
||||
CREATE TABLE IF NOT EXISTS procs_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(16) binary DEFAULT '' NOT NULL, Routine_name char(64) COLLATE utf8_general_ci DEFAULT '' NOT NULL, Routine_type enum('FUNCTION','PROCEDURE') NOT NULL, Grantor char(77) DEFAULT '' NOT NULL, Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL, Timestamp timestamp(14), PRIMARY KEY (Host,Db,User,Routine_name,Routine_type), KEY Grantor (Grantor) ) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Procedure privileges';
|
||||
|
||||
-- Create general_log if CSV is enabled.
|
||||
|
||||
|
@ -337,6 +337,10 @@ ALTER TABLE procs_priv
|
||||
MODIFY Proc_priv set('Execute','Alter Routine','Grant')
|
||||
COLLATE utf8_general_ci DEFAULT '' NOT NULL;
|
||||
|
||||
ALTER IGNORE TABLE procs_priv
|
||||
MODIFY Routine_name char(64)
|
||||
COLLATE utf8_general_ci DEFAULT '' NOT NULL;
|
||||
|
||||
ALTER TABLE procs_priv
|
||||
ADD Routine_type enum('FUNCTION','PROCEDURE')
|
||||
COLLATE utf8_general_ci NOT NULL AFTER Routine_name;
|
||||
|
37
sql/field.cc
37
sql/field.cc
@ -1,4 +1,4 @@
|
||||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/* Copyright 2000-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -6550,20 +6550,9 @@ uint Field::is_equal(Create_field *new_field)
|
||||
}
|
||||
|
||||
|
||||
/* If one of the fields is binary and the other one isn't return 1 else 0 */
|
||||
|
||||
bool Field_str::compare_str_field_flags(Create_field *new_field, uint32 flag_arg)
|
||||
{
|
||||
return (((new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
|
||||
!(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
|
||||
(!(new_field->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
|
||||
(flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
|
||||
}
|
||||
|
||||
|
||||
uint Field_str::is_equal(Create_field *new_field)
|
||||
{
|
||||
if (compare_str_field_flags(new_field, flags))
|
||||
if (field_flags_are_binary() != new_field->field_flags_are_binary())
|
||||
return 0;
|
||||
|
||||
return ((new_field->sql_type == real_type()) &&
|
||||
@ -8329,7 +8318,7 @@ uint Field_blob::max_packed_col_length(uint max_length)
|
||||
|
||||
uint Field_blob::is_equal(Create_field *new_field)
|
||||
{
|
||||
if (compare_str_field_flags(new_field, flags))
|
||||
if (field_flags_are_binary() != new_field->field_flags_are_binary())
|
||||
return 0;
|
||||
|
||||
return ((new_field->sql_type == get_blob_type_from_length(max_data_length()))
|
||||
@ -8889,7 +8878,7 @@ uint Field_enum::is_equal(Create_field *new_field)
|
||||
The fields are compatible if they have the same flags,
|
||||
type, charset and have the same underlying length.
|
||||
*/
|
||||
if (compare_str_field_flags(new_field, flags) ||
|
||||
if (new_field->field_flags_are_binary() != field_flags_are_binary() ||
|
||||
new_field->sql_type != real_type() ||
|
||||
new_field->charset != field_charset ||
|
||||
new_field->pack_length != pack_length())
|
||||
@ -9658,7 +9647,7 @@ bool Create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
|
||||
}
|
||||
|
||||
if (length == 0)
|
||||
fld_length= 0; /* purecov: inspected */
|
||||
fld_length= NULL; /* purecov: inspected */
|
||||
}
|
||||
|
||||
sign_len= fld_type_modifier & UNSIGNED_FLAG ? 0 : 1;
|
||||
@ -9810,8 +9799,7 @@ bool Create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
if (fld_length == NULL)
|
||||
{
|
||||
/* Compressed date YYYYMMDDHHMMSS */
|
||||
length= MAX_DATETIME_COMPRESSED_WIDTH;
|
||||
length= MAX_DATETIME_WIDTH;
|
||||
}
|
||||
else if (length != MAX_DATETIME_WIDTH)
|
||||
{
|
||||
@ -9876,7 +9864,7 @@ bool Create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
|
||||
sql_type= MYSQL_TYPE_NEWDATE;
|
||||
/* fall trough */
|
||||
case MYSQL_TYPE_NEWDATE:
|
||||
length= 10;
|
||||
length= MAX_DATE_WIDTH;
|
||||
break;
|
||||
case MYSQL_TYPE_TIME:
|
||||
length= 10;
|
||||
@ -9957,6 +9945,17 @@ bool Create_field::init(THD *thd, char *fld_name, enum_field_types fld_type,
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
switch (fld_type) {
|
||||
case MYSQL_TYPE_DATE:
|
||||
case MYSQL_TYPE_NEWDATE:
|
||||
case MYSQL_TYPE_TIME:
|
||||
case MYSQL_TYPE_DATETIME:
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
charset= &my_charset_bin;
|
||||
flags|= BINCMP_FLAG;
|
||||
default: break;
|
||||
}
|
||||
|
||||
DBUG_RETURN(FALSE); /* success */
|
||||
}
|
||||
|
||||
|
22
sql/field.h
22
sql/field.h
@ -1,4 +1,4 @@
|
||||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/* Copyright 2000-2008 MySQL AB, 2008, 2009 Sun Microsystems, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -610,6 +610,12 @@ protected:
|
||||
handle_int64(to, from, low_byte_first_from, table->s->db_low_byte_first);
|
||||
return from + sizeof(int64);
|
||||
}
|
||||
|
||||
bool field_flags_are_binary()
|
||||
{
|
||||
return (flags & (BINCMP_FLAG | BINARY_FLAG)) != 0;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -669,7 +675,6 @@ public:
|
||||
friend class Create_field;
|
||||
my_decimal *val_decimal(my_decimal *);
|
||||
virtual bool str_needs_quotes() { return TRUE; }
|
||||
bool compare_str_field_flags(Create_field *new_field, uint32 flags);
|
||||
uint is_equal(Create_field *new_field);
|
||||
};
|
||||
|
||||
@ -1284,12 +1289,12 @@ public:
|
||||
Field_date(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
|
||||
enum utype unireg_check_arg, const char *field_name_arg,
|
||||
CHARSET_INFO *cs)
|
||||
:Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
|
||||
:Field_str(ptr_arg, MAX_DATE_WIDTH, null_ptr_arg, null_bit_arg,
|
||||
unireg_check_arg, field_name_arg, cs)
|
||||
{}
|
||||
Field_date(bool maybe_null_arg, const char *field_name_arg,
|
||||
CHARSET_INFO *cs)
|
||||
:Field_str((uchar*) 0,10, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
:Field_str((uchar*) 0, MAX_DATE_WIDTH, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
NONE, field_name_arg, cs) {}
|
||||
enum_field_types type() const { return MYSQL_TYPE_DATE;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
|
||||
@ -1399,12 +1404,12 @@ public:
|
||||
Field_datetime(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
|
||||
enum utype unireg_check_arg, const char *field_name_arg,
|
||||
CHARSET_INFO *cs)
|
||||
:Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
|
||||
:Field_str(ptr_arg, MAX_DATETIME_WIDTH, null_ptr_arg, null_bit_arg,
|
||||
unireg_check_arg, field_name_arg, cs)
|
||||
{}
|
||||
Field_datetime(bool maybe_null_arg, const char *field_name_arg,
|
||||
CHARSET_INFO *cs)
|
||||
:Field_str((uchar*) 0,19, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
:Field_str((uchar*) 0, MAX_DATETIME_WIDTH, maybe_null_arg ? (uchar*) "": 0,0,
|
||||
NONE, field_name_arg, cs) {}
|
||||
enum_field_types type() const { return MYSQL_TYPE_DATETIME;}
|
||||
#ifdef HAVE_LONG_LONG
|
||||
@ -2076,6 +2081,11 @@ public:
|
||||
Item *on_update_value, LEX_STRING *comment, char *change,
|
||||
List<String> *interval_list, CHARSET_INFO *cs,
|
||||
uint uint_geom_type);
|
||||
|
||||
bool field_flags_are_binary()
|
||||
{
|
||||
return (flags & (BINCMP_FLAG | BINARY_FLAG)) != 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -84,7 +84,9 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
|
||||
|
||||
if (args[0]->field_type() == MYSQL_TYPE_GEOMETRY)
|
||||
{
|
||||
return args[0]->val_str(str);
|
||||
String *str_ret= args[0]->val_str(str);
|
||||
null_value= args[0]->null_value;
|
||||
return str_ret;
|
||||
}
|
||||
|
||||
wkb= args[0]->val_str(&arg_val);
|
||||
@ -94,7 +96,10 @@ String *Item_func_geometry_from_wkb::val_str(String *str)
|
||||
|
||||
str->set_charset(&my_charset_bin);
|
||||
if (str->reserve(SRID_SIZE, 512))
|
||||
return 0;
|
||||
{
|
||||
null_value= TRUE; /* purecov: inspected */
|
||||
return 0; /* purecov: inspected */
|
||||
}
|
||||
str->length(0);
|
||||
str->q_append(srid);
|
||||
if ((null_value=
|
||||
|
@ -1549,7 +1549,6 @@ static int binlog_commit(handlerton *hton, THD *thd, bool all)
|
||||
|
||||
trx_data->at_least_one_stmt_committed = my_b_tell(&trx_data->trans_log) > 0;
|
||||
|
||||
end:
|
||||
if (!all)
|
||||
trx_data->before_stmt_pos = MY_OFF_T_UNDEF; // part of the stmt commit
|
||||
DBUG_RETURN(error);
|
||||
@ -3603,7 +3602,7 @@ void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
}
|
||||
old_name=name;
|
||||
name=0; // Don't free name
|
||||
close(LOG_CLOSE_TO_BE_OPENED);
|
||||
close(LOG_CLOSE_TO_BE_OPENED | LOG_CLOSE_INDEX);
|
||||
|
||||
/*
|
||||
Note that at this point, log_state != LOG_CLOSED (important for is_open()).
|
||||
@ -3618,8 +3617,10 @@ void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
trigger temp tables deletion on slaves.
|
||||
*/
|
||||
|
||||
open(old_name, log_type, new_name_ptr,
|
||||
io_cache_type, no_auto_events, max_size, 1);
|
||||
/* reopen index binlog file, BUG#34582 */
|
||||
if (!open_index_file(index_file_name, 0))
|
||||
open(old_name, log_type, new_name_ptr,
|
||||
io_cache_type, no_auto_events, max_size, 1);
|
||||
my_free(old_name,MYF(0));
|
||||
|
||||
end:
|
||||
|
@ -7541,7 +7541,7 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
}
|
||||
|
||||
if (get_flags(STMT_END_F))
|
||||
if (error= rows_event_stmt_cleanup(rli, thd))
|
||||
if ((error= rows_event_stmt_cleanup(rli, thd)))
|
||||
rli->report(ERROR_LEVEL, error,
|
||||
"Error in %s event: commit of row events failed, "
|
||||
"table `%s`.`%s`",
|
||||
|
@ -1842,7 +1842,7 @@ int Old_rows_log_event::do_apply_event(Relay_log_info const *rli)
|
||||
are involved, commit the transaction and flush the pending event to the
|
||||
binlog.
|
||||
*/
|
||||
if (error= ha_autocommit_or_rollback(thd, 0))
|
||||
if ((error= ha_autocommit_or_rollback(thd, 0)))
|
||||
rli->report(ERROR_LEVEL, error,
|
||||
"Error in %s event: commit of row events failed, "
|
||||
"table `%s`.`%s`",
|
||||
|
@ -5709,6 +5709,27 @@ get_mm_leaf(RANGE_OPT_PARAM *param, COND *conf_func, Field *field,
|
||||
!(conf_func->compare_collation()->state & MY_CS_BINSORT))
|
||||
goto end;
|
||||
|
||||
if (key_part->image_type == Field::itMBR)
|
||||
{
|
||||
switch (type) {
|
||||
case Item_func::SP_EQUALS_FUNC:
|
||||
case Item_func::SP_DISJOINT_FUNC:
|
||||
case Item_func::SP_INTERSECTS_FUNC:
|
||||
case Item_func::SP_TOUCHES_FUNC:
|
||||
case Item_func::SP_CROSSES_FUNC:
|
||||
case Item_func::SP_WITHIN_FUNC:
|
||||
case Item_func::SP_CONTAINS_FUNC:
|
||||
case Item_func::SP_OVERLAPS_FUNC:
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
We cannot involve spatial indexes for queries that
|
||||
don't use MBREQUALS(), MBRDISJOINT(), etc. functions.
|
||||
*/
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
if (param->using_real_indexes)
|
||||
optimize_range= field->optimize_range(param->real_keynr[key_part->key],
|
||||
key_part->part);
|
||||
|
@ -57,6 +57,7 @@ void init_read_record_idx(READ_RECORD *info, THD *thd, TABLE *table,
|
||||
{
|
||||
empty_record(table);
|
||||
bzero((char*) info,sizeof(*info));
|
||||
info->thd= thd;
|
||||
info->table= table;
|
||||
info->file= table->file;
|
||||
info->record= table->record[0];
|
||||
@ -292,6 +293,12 @@ void end_read_record(READ_RECORD *info)
|
||||
|
||||
static int rr_handle_error(READ_RECORD *info, int error)
|
||||
{
|
||||
if (info->thd->killed)
|
||||
{
|
||||
info->thd->send_kill_message();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (error == HA_ERR_END_OF_FILE)
|
||||
error= -1;
|
||||
else
|
||||
@ -312,12 +319,7 @@ static int rr_quick(READ_RECORD *info)
|
||||
int tmp;
|
||||
while ((tmp= info->select->quick->get_next()))
|
||||
{
|
||||
if (info->thd->killed)
|
||||
{
|
||||
my_error(ER_SERVER_SHUTDOWN, MYF(0));
|
||||
return 1;
|
||||
}
|
||||
if (tmp != HA_ERR_RECORD_DELETED)
|
||||
if (info->thd->killed || (tmp != HA_ERR_RECORD_DELETED))
|
||||
{
|
||||
tmp= rr_handle_error(info, tmp);
|
||||
break;
|
||||
@ -380,16 +382,11 @@ int rr_sequential(READ_RECORD *info)
|
||||
int tmp;
|
||||
while ((tmp=info->file->rnd_next(info->record)))
|
||||
{
|
||||
if (info->thd->killed)
|
||||
{
|
||||
info->thd->send_kill_message();
|
||||
return 1;
|
||||
}
|
||||
/*
|
||||
rnd_next can return RECORD_DELETED for MyISAM when one thread is
|
||||
reading and another deleting without locks.
|
||||
*/
|
||||
if (tmp != HA_ERR_RECORD_DELETED)
|
||||
if (info->thd->killed || (tmp != HA_ERR_RECORD_DELETED))
|
||||
{
|
||||
tmp= rr_handle_error(info, tmp);
|
||||
break;
|
||||
|
@ -335,16 +335,18 @@ bool
|
||||
sp_eval_expr(THD *thd, Field *result_field, Item **expr_item_ptr)
|
||||
{
|
||||
Item *expr_item;
|
||||
enum_check_fields save_count_cuted_fields= thd->count_cuted_fields;
|
||||
bool save_abort_on_warning= thd->abort_on_warning;
|
||||
bool save_stmt_modified_non_trans_table=
|
||||
thd->transaction.stmt.modified_non_trans_table;
|
||||
|
||||
DBUG_ENTER("sp_eval_expr");
|
||||
|
||||
if (!*expr_item_ptr)
|
||||
DBUG_RETURN(TRUE);
|
||||
goto error;
|
||||
|
||||
if (!(expr_item= sp_prepare_func_item(thd, expr_item_ptr)))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
bool err_status= FALSE;
|
||||
goto error;
|
||||
|
||||
/*
|
||||
Set THD flags to emit warnings/errors in case of overflow/type errors
|
||||
@ -353,10 +355,6 @@ sp_eval_expr(THD *thd, Field *result_field, Item **expr_item_ptr)
|
||||
Save original values and restore them after save.
|
||||
*/
|
||||
|
||||
enum_check_fields save_count_cuted_fields= thd->count_cuted_fields;
|
||||
bool save_abort_on_warning= thd->abort_on_warning;
|
||||
bool save_stmt_modified_non_trans_table= thd->transaction.stmt.modified_non_trans_table;
|
||||
|
||||
thd->count_cuted_fields= CHECK_FIELD_ERROR_FOR_NULL;
|
||||
thd->abort_on_warning=
|
||||
thd->variables.sql_mode &
|
||||
@ -371,13 +369,18 @@ sp_eval_expr(THD *thd, Field *result_field, Item **expr_item_ptr)
|
||||
thd->abort_on_warning= save_abort_on_warning;
|
||||
thd->transaction.stmt.modified_non_trans_table= save_stmt_modified_non_trans_table;
|
||||
|
||||
if (thd->is_error())
|
||||
{
|
||||
/* Return error status if something went wrong. */
|
||||
err_status= TRUE;
|
||||
}
|
||||
if (!thd->is_error())
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
DBUG_RETURN(err_status);
|
||||
error:
|
||||
/*
|
||||
In case of error during evaluation, leave the result field set to NULL.
|
||||
Sic: we can't do it in the beginning of the function because the
|
||||
result field might be needed for its own re-evaluation, e.g. case of
|
||||
set x = x + 1;
|
||||
*/
|
||||
result_field->set_null();
|
||||
DBUG_RETURN (TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
@ -263,8 +263,7 @@ my_bool acl_init(bool dont_read_acl_tables)
|
||||
acl_cache= new hash_filo(ACL_CACHE_SIZE, 0, 0,
|
||||
(hash_get_key) acl_entry_get_key,
|
||||
(hash_free_key) free,
|
||||
lower_case_file_system ?
|
||||
system_charset_info : &my_charset_bin);
|
||||
&my_charset_utf8_bin);
|
||||
if (dont_read_acl_tables)
|
||||
{
|
||||
DBUG_RETURN(0); /* purecov: tested */
|
||||
@ -2251,12 +2250,13 @@ public:
|
||||
ulong sort;
|
||||
size_t key_length;
|
||||
GRANT_NAME(const char *h, const char *d,const char *u,
|
||||
const char *t, ulong p);
|
||||
GRANT_NAME (TABLE *form);
|
||||
const char *t, ulong p, bool is_routine);
|
||||
GRANT_NAME (TABLE *form, bool is_routine);
|
||||
virtual ~GRANT_NAME() {};
|
||||
virtual bool ok() { return privs != 0; }
|
||||
void set_user_details(const char *h, const char *d,
|
||||
const char *u, const char *t);
|
||||
const char *u, const char *t,
|
||||
bool is_routine);
|
||||
};
|
||||
|
||||
|
||||
@ -2275,7 +2275,8 @@ public:
|
||||
|
||||
|
||||
void GRANT_NAME::set_user_details(const char *h, const char *d,
|
||||
const char *u, const char *t)
|
||||
const char *u, const char *t,
|
||||
bool is_routine)
|
||||
{
|
||||
/* Host given by user */
|
||||
update_hostname(&host, strdup_root(&memex, h));
|
||||
@ -2290,7 +2291,7 @@ void GRANT_NAME::set_user_details(const char *h, const char *d,
|
||||
if (tname != t)
|
||||
{
|
||||
tname= strdup_root(&memex, t);
|
||||
if (lower_case_table_names)
|
||||
if (lower_case_table_names || is_routine)
|
||||
my_casedn_str(files_charset_info, tname);
|
||||
}
|
||||
key_length= strlen(d) + strlen(u)+ strlen(t)+3;
|
||||
@ -2299,22 +2300,22 @@ void GRANT_NAME::set_user_details(const char *h, const char *d,
|
||||
}
|
||||
|
||||
GRANT_NAME::GRANT_NAME(const char *h, const char *d,const char *u,
|
||||
const char *t, ulong p)
|
||||
const char *t, ulong p, bool is_routine)
|
||||
:db(0), tname(0), privs(p)
|
||||
{
|
||||
set_user_details(h, d, u, t);
|
||||
set_user_details(h, d, u, t, is_routine);
|
||||
}
|
||||
|
||||
GRANT_TABLE::GRANT_TABLE(const char *h, const char *d,const char *u,
|
||||
const char *t, ulong p, ulong c)
|
||||
:GRANT_NAME(h,d,u,t,p), cols(c)
|
||||
:GRANT_NAME(h,d,u,t,p, FALSE), cols(c)
|
||||
{
|
||||
(void) hash_init2(&hash_columns,4,system_charset_info,
|
||||
0,0,0, (hash_get_key) get_key_column,0,0);
|
||||
}
|
||||
|
||||
|
||||
GRANT_NAME::GRANT_NAME(TABLE *form)
|
||||
GRANT_NAME::GRANT_NAME(TABLE *form, bool is_routine)
|
||||
{
|
||||
update_hostname(&host, get_field(&memex, form->field[0]));
|
||||
db= get_field(&memex,form->field[1]);
|
||||
@ -2332,6 +2333,9 @@ GRANT_NAME::GRANT_NAME(TABLE *form)
|
||||
if (lower_case_table_names)
|
||||
{
|
||||
my_casedn_str(files_charset_info, db);
|
||||
}
|
||||
if (lower_case_table_names || is_routine)
|
||||
{
|
||||
my_casedn_str(files_charset_info, tname);
|
||||
}
|
||||
key_length= (strlen(db) + strlen(user) + strlen(tname) + 3);
|
||||
@ -2343,7 +2347,7 @@ GRANT_NAME::GRANT_NAME(TABLE *form)
|
||||
|
||||
|
||||
GRANT_TABLE::GRANT_TABLE(TABLE *form, TABLE *col_privs)
|
||||
:GRANT_NAME(form)
|
||||
:GRANT_NAME(form, FALSE)
|
||||
{
|
||||
uchar key[MAX_KEY_LENGTH];
|
||||
|
||||
@ -3338,7 +3342,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
||||
}
|
||||
grant_name= new GRANT_NAME(Str->host.str, db_name,
|
||||
Str->user.str, table_name,
|
||||
rights);
|
||||
rights, TRUE);
|
||||
if (!grant_name)
|
||||
{
|
||||
result= TRUE;
|
||||
@ -3549,10 +3553,10 @@ static my_bool grant_load_procs_priv(TABLE *p_table)
|
||||
MEM_ROOT **save_mem_root_ptr= my_pthread_getspecific_ptr(MEM_ROOT**,
|
||||
THR_MALLOC);
|
||||
DBUG_ENTER("grant_load_procs_priv");
|
||||
(void) hash_init(&proc_priv_hash,system_charset_info,
|
||||
(void) hash_init(&proc_priv_hash, &my_charset_utf8_bin,
|
||||
0,0,0, (hash_get_key) get_grant_table,
|
||||
0,0);
|
||||
(void) hash_init(&func_priv_hash,system_charset_info,
|
||||
(void) hash_init(&func_priv_hash, &my_charset_utf8_bin,
|
||||
0,0,0, (hash_get_key) get_grant_table,
|
||||
0,0);
|
||||
p_table->file->ha_index_init(0, 1);
|
||||
@ -3566,7 +3570,7 @@ static my_bool grant_load_procs_priv(TABLE *p_table)
|
||||
{
|
||||
GRANT_NAME *mem_check;
|
||||
HASH *hash;
|
||||
if (!(mem_check=new (memex_ptr) GRANT_NAME(p_table)))
|
||||
if (!(mem_check=new (memex_ptr) GRANT_NAME(p_table, TRUE)))
|
||||
{
|
||||
/* This could only happen if we are out memory */
|
||||
goto end_unlock;
|
||||
@ -3650,7 +3654,7 @@ static my_bool grant_load(THD *thd, TABLE_LIST *tables)
|
||||
|
||||
thd->variables.sql_mode&= ~MODE_PAD_CHAR_TO_FULL_LENGTH;
|
||||
|
||||
(void) hash_init(&column_priv_hash,system_charset_info,
|
||||
(void) hash_init(&column_priv_hash, &my_charset_utf8_bin,
|
||||
0,0,0, (hash_get_key) get_grant_table,
|
||||
(hash_free_key) free_grant_table,0);
|
||||
|
||||
@ -5452,7 +5456,8 @@ static int handle_grant_struct(uint struct_no, bool drop,
|
||||
host name
|
||||
*/
|
||||
grant_name->set_user_details(user_to->host.str, grant_name->db,
|
||||
user_to->user.str, grant_name->tname);
|
||||
user_to->user.str, grant_name->tname,
|
||||
TRUE);
|
||||
|
||||
/*
|
||||
Since username is part of the hash key, when the user name
|
||||
@ -6139,7 +6144,7 @@ bool sp_revoke_privileges(THD *thd, const char *sp_db, const char *sp_name,
|
||||
for (counter= 0, revoked= 0 ; counter < hash->records ; )
|
||||
{
|
||||
GRANT_NAME *grant_proc= (GRANT_NAME*) hash_element(hash, counter);
|
||||
if (!my_strcasecmp(system_charset_info, grant_proc->db, sp_db) &&
|
||||
if (!my_strcasecmp(&my_charset_utf8_bin, grant_proc->db, sp_db) &&
|
||||
!my_strcasecmp(system_charset_info, grant_proc->tname, sp_name))
|
||||
{
|
||||
LEX_USER lex_user;
|
||||
|
@ -93,6 +93,8 @@ extern char internal_table_name[2];
|
||||
extern char empty_c_string[1];
|
||||
extern MYSQL_PLUGIN_IMPORT const char **errmesg;
|
||||
|
||||
extern bool volatile shutdown_in_progress;
|
||||
|
||||
#define TC_LOG_PAGE_SIZE 8192
|
||||
#define TC_LOG_MIN_SIZE (3*TC_LOG_PAGE_SIZE)
|
||||
|
||||
@ -2140,7 +2142,11 @@ public:
|
||||
{
|
||||
int err= killed_errno();
|
||||
if (err)
|
||||
{
|
||||
if ((err == KILL_CONNECTION) && !shutdown_in_progress)
|
||||
err = KILL_QUERY;
|
||||
my_message(err, ER(err), MYF(0));
|
||||
}
|
||||
}
|
||||
/* return TRUE if we will abort query if we make a warning now */
|
||||
inline bool really_abort_on_warning()
|
||||
|
@ -2066,7 +2066,7 @@ static int check_func_set(THD *thd, struct st_mysql_sys_var *var,
|
||||
const char *strvalue= "NULL", *str;
|
||||
TYPELIB *typelib;
|
||||
ulonglong result;
|
||||
uint error_len;
|
||||
uint error_len= 0; // init as only set on error
|
||||
bool not_used;
|
||||
int length;
|
||||
|
||||
@ -2665,7 +2665,9 @@ uchar* sys_var_pluginvar::value_ptr(THD *thd, enum_var_type type,
|
||||
{
|
||||
if (!(value & mask))
|
||||
continue;
|
||||
str.append(typelib->type_names[i], typelib->type_lengths[i]);
|
||||
str.append(typelib->type_names[i], typelib->type_lengths
|
||||
? typelib->type_lengths[i]
|
||||
: strlen(typelib->type_names[i]));
|
||||
str.append(',');
|
||||
}
|
||||
|
||||
|
@ -2343,6 +2343,9 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
|
||||
/* Fix ORDER list */
|
||||
for (order= (ORDER *)sl->order_list.first; order; order= order->next)
|
||||
order->item= &order->item_ptr;
|
||||
|
||||
/* clear the no_error flag for INSERT/UPDATE IGNORE */
|
||||
sl->no_error= FALSE;
|
||||
}
|
||||
{
|
||||
SELECT_LEX_UNIT *unit= sl->master_unit();
|
||||
|
@ -3563,7 +3563,7 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array,KEY_FIELD *key_field)
|
||||
{
|
||||
if (!(form->keys_in_use_for_query.is_set(key)))
|
||||
continue;
|
||||
if (form->key_info[key].flags & HA_FULLTEXT)
|
||||
if (form->key_info[key].flags & (HA_FULLTEXT | HA_SPATIAL))
|
||||
continue; // ToDo: ft-keys in non-ft queries. SerG
|
||||
|
||||
uint key_parts= (uint) form->key_info[key].key_parts;
|
||||
|
@ -1703,6 +1703,11 @@ bool multi_update::send_data(List<Item> ¬_used_values)
|
||||
TRG_EVENT_UPDATE))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
/*
|
||||
Reset the table->auto_increment_field_not_null as it is valid for
|
||||
only one row.
|
||||
*/
|
||||
table->auto_increment_field_not_null= FALSE;
|
||||
found++;
|
||||
if (!can_compare_record || compare_record(table))
|
||||
{
|
||||
|
@ -11783,17 +11783,8 @@ option_type:
|
||||
;
|
||||
|
||||
option_type2:
|
||||
/* empty */
|
||||
{
|
||||
$$= OPT_DEFAULT;
|
||||
Lex->option_type= OPT_DEFAULT;
|
||||
}
|
||||
| ONE_SHOT_SYM
|
||||
{
|
||||
Lex->one_shot_set= 1;
|
||||
$$= OPT_SESSION;
|
||||
Lex->option_type= OPT_SESSION;
|
||||
}
|
||||
/* empty */ { $$= OPT_DEFAULT; }
|
||||
| ONE_SHOT_SYM { Lex->one_shot_set= 1; $$= OPT_SESSION; }
|
||||
;
|
||||
|
||||
opt_var_type:
|
||||
@ -11804,26 +11795,10 @@ opt_var_type:
|
||||
;
|
||||
|
||||
opt_var_ident_type:
|
||||
/* empty */
|
||||
{
|
||||
$$=OPT_DEFAULT;
|
||||
Lex->option_type= OPT_DEFAULT;
|
||||
}
|
||||
| GLOBAL_SYM '.'
|
||||
{
|
||||
$$=OPT_GLOBAL;
|
||||
Lex->option_type= OPT_GLOBAL;
|
||||
}
|
||||
| LOCAL_SYM '.'
|
||||
{
|
||||
$$=OPT_SESSION;
|
||||
Lex->option_type= OPT_SESSION;
|
||||
}
|
||||
| SESSION_SYM '.'
|
||||
{
|
||||
$$=OPT_SESSION;
|
||||
Lex->option_type= OPT_SESSION;
|
||||
}
|
||||
/* empty */ { $$=OPT_DEFAULT; }
|
||||
| GLOBAL_SYM '.' { $$=OPT_GLOBAL; }
|
||||
| LOCAL_SYM '.' { $$=OPT_SESSION; }
|
||||
| SESSION_SYM '.' { $$=OPT_SESSION; }
|
||||
;
|
||||
|
||||
ext_option_value:
|
||||
@ -12063,22 +12038,8 @@ internal_variable_name:
|
||||
sp_pcontext *spc= lex->spcont;
|
||||
sp_variable_t *spv;
|
||||
|
||||
/*
|
||||
We have to lookup here since local vars can shadow sysvars.
|
||||
|
||||
We also have to inspect the option_type first since the variable
|
||||
identifier might have been prefixed with @@session or @@global
|
||||
prefixes. Without this check we would wrongly identify them
|
||||
as SP local variables.
|
||||
*/
|
||||
if (lex->option_type == OPT_DEFAULT && spc &&
|
||||
(spv= spc->find_variable(&$1)))
|
||||
{
|
||||
/* An SP local variable */
|
||||
$$.var= NULL;
|
||||
$$.base_name= $1;
|
||||
}
|
||||
else
|
||||
/* We have to lookup here since local vars can shadow sysvars */
|
||||
if (!spc || !(spv = spc->find_variable(&$1)))
|
||||
{
|
||||
/* Not an SP local variable */
|
||||
sys_var *tmp=find_sys_var(thd, $1.str, $1.length);
|
||||
@ -12095,6 +12056,12 @@ internal_variable_name:
|
||||
lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* An SP local variable */
|
||||
$$.var= NULL;
|
||||
$$.base_name= $1;
|
||||
}
|
||||
}
|
||||
| ident '.' ident
|
||||
{
|
||||
|
@ -7858,7 +7858,8 @@ static my_bool create_tailoring(CHARSET_INFO *cs, void *(*alloc)(size_t))
|
||||
return 1;
|
||||
}
|
||||
|
||||
cs->caseinfo= my_unicase_default;
|
||||
if (!cs->caseinfo)
|
||||
cs->caseinfo= my_unicase_default;
|
||||
|
||||
if (!(newweights= (uint16**) (*alloc)(256*sizeof(uint16*))))
|
||||
return 1;
|
||||
|
@ -144,55 +144,6 @@ vio_set_cert_stuff(SSL_CTX *ctx, const char *cert_file, const char *key_file,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
vio_verify_callback(int ok, X509_STORE_CTX *ctx)
|
||||
{
|
||||
char buf[256];
|
||||
X509 *err_cert;
|
||||
|
||||
DBUG_ENTER("vio_verify_callback");
|
||||
DBUG_PRINT("enter", ("ok: %d ctx: 0x%lx", ok, (long) ctx));
|
||||
|
||||
err_cert= X509_STORE_CTX_get_current_cert(ctx);
|
||||
X509_NAME_oneline(X509_get_subject_name(err_cert), buf, sizeof(buf));
|
||||
DBUG_PRINT("info", ("cert: %s", buf));
|
||||
if (!ok)
|
||||
{
|
||||
int err, depth;
|
||||
err= X509_STORE_CTX_get_error(ctx);
|
||||
depth= X509_STORE_CTX_get_error_depth(ctx);
|
||||
|
||||
DBUG_PRINT("error",("verify error: %d '%s'",err,
|
||||
X509_verify_cert_error_string(err)));
|
||||
/*
|
||||
Approve cert if depth is greater then "verify_depth", currently
|
||||
verify_depth is always 0 and there is no way to increase it.
|
||||
*/
|
||||
if (verify_depth >= depth)
|
||||
ok= 1;
|
||||
}
|
||||
switch (ctx->error)
|
||||
{
|
||||
case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
|
||||
X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), buf, 256);
|
||||
DBUG_PRINT("info",("issuer= %s\n", buf));
|
||||
break;
|
||||
case X509_V_ERR_CERT_NOT_YET_VALID:
|
||||
case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
|
||||
DBUG_PRINT("error", ("notBefore"));
|
||||
/*ASN1_TIME_print_fp(stderr,X509_get_notBefore(ctx->current_cert));*/
|
||||
break;
|
||||
case X509_V_ERR_CERT_HAS_EXPIRED:
|
||||
case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
|
||||
DBUG_PRINT("error", ("notAfter error"));
|
||||
/*ASN1_TIME_print_fp(stderr,X509_get_notAfter(ctx->current_cert));*/
|
||||
break;
|
||||
}
|
||||
DBUG_PRINT("exit", ("%d", ok));
|
||||
DBUG_RETURN(ok);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __NETWARE__
|
||||
|
||||
/* NetWare SSL cleanup */
|
||||
@ -354,11 +305,7 @@ new_VioSSLConnectorFd(const char *key_file, const char *cert_file,
|
||||
|
||||
/* Init the VioSSLFd as a "connector" ie. the client side */
|
||||
|
||||
/*
|
||||
The verify_callback function is used to control the behaviour
|
||||
when the SSL_VERIFY_PEER flag is set.
|
||||
*/
|
||||
SSL_CTX_set_verify(ssl_fd->ssl_context, verify, vio_verify_callback);
|
||||
SSL_CTX_set_verify(ssl_fd->ssl_context, verify, NULL);
|
||||
|
||||
return ssl_fd;
|
||||
}
|
||||
@ -382,11 +329,7 @@ new_VioSSLAcceptorFd(const char *key_file, const char *cert_file,
|
||||
/* Set max number of cached sessions, returns the previous size */
|
||||
SSL_CTX_sess_set_cache_size(ssl_fd->ssl_context, 128);
|
||||
|
||||
/*
|
||||
The verify_callback function is used to control the behaviour
|
||||
when the SSL_VERIFY_PEER flag is set.
|
||||
*/
|
||||
SSL_CTX_set_verify(ssl_fd->ssl_context, verify, vio_verify_callback);
|
||||
SSL_CTX_set_verify(ssl_fd->ssl_context, verify, NULL);
|
||||
|
||||
/*
|
||||
Set session_id - an identifier for this server session
|
||||
|
Loading…
x
Reference in New Issue
Block a user