Merge alik.:/mnt/raid/alik/MySQL/devel/5.1-monty
into alik.:/mnt/raid/alik/MySQL/devel/5.1-rt-merged
This commit is contained in:
commit
18fb4abff4
@ -65,6 +65,8 @@ my_bool hash_check(HASH *hash); /* Only in debug library */
|
|||||||
|
|
||||||
#define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
|
#define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
|
||||||
#define hash_inited(H) ((H)->array.buffer != 0)
|
#define hash_inited(H) ((H)->array.buffer != 0)
|
||||||
|
#define hash_init_opt(A,B,C,D,E,F,G,H) \
|
||||||
|
(!hash_inited(A) && _hash_init(A,B,C,D,E,F,G, H CALLER_INFO))
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,8 @@ int my_TIME_to_str(const MYSQL_TIME *l_time, char *to);
|
|||||||
/*
|
/*
|
||||||
The following must be sorted so that simple intervals comes first.
|
The following must be sorted so that simple intervals comes first.
|
||||||
(get_interval_value() depends on this)
|
(get_interval_value() depends on this)
|
||||||
|
When updating this enum please update
|
||||||
|
LEX_STRING interval_type_to_name[] in sql/time.cc
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum interval_type
|
enum interval_type
|
||||||
|
@ -259,6 +259,36 @@ select distinct a1 from t4 where pk_col not in (1,2,3,4);
|
|||||||
|
|
||||||
drop table t1,t4;
|
drop table t1,t4;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#18819: DELETE IGNORE hangs on foreign key parent delete
|
||||||
|
#
|
||||||
|
# The bug itself does not relate to InnoDB, but we have to use foreign
|
||||||
|
# keys to reproduce it.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t2, t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT NOT NULL PRIMARY KEY) ENGINE= InnoDB;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
i INT NOT NULL,
|
||||||
|
FOREIGN KEY (i) REFERENCES t1 (i) ON DELETE NO ACTION
|
||||||
|
) ENGINE= InnoDB;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
|
||||||
|
DELETE IGNORE FROM t1 WHERE i = 1;
|
||||||
|
|
||||||
|
SELECT * FROM t1, t2;
|
||||||
|
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo End of 4.1 tests.
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #6142: a problem with the empty innodb table
|
# Bug #6142: a problem with the empty innodb table
|
||||||
# (was part of group_min_max.test)
|
# (was part of group_min_max.test)
|
||||||
|
59
mysql-test/include/parser_bug21114.inc
Executable file
59
mysql-test/include/parser_bug21114.inc
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
#
|
||||||
|
# Bug#21114 (Foreign key creation fails to table with name format)
|
||||||
|
#
|
||||||
|
# Trying to trick the parser into thinking $FCT(...) is a function call,
|
||||||
|
# which is not in the CREATE TABLE and FOREIGN KEY ... REFERENCES syntax
|
||||||
|
#
|
||||||
|
# Usage :
|
||||||
|
#
|
||||||
|
# let $engine_type=InnoDb;
|
||||||
|
# let $verbose=1;
|
||||||
|
# let $FCT= <value_1>;
|
||||||
|
# -- source parser_stress_func.inc
|
||||||
|
# let $FCT= <value_2>;
|
||||||
|
# -- source parser_stress_func.inc
|
||||||
|
# let $verbose=0;
|
||||||
|
# let $FCT= <value_3>;
|
||||||
|
# -- source parser_stress_func.inc
|
||||||
|
# let $FCT= <value_4>;
|
||||||
|
# -- source parser_stress_func.inc
|
||||||
|
|
||||||
|
-- disable_warnings
|
||||||
|
eval drop table if exists $FCT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
-- enable_warnings
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
--disable_result_log
|
||||||
|
|
||||||
|
eval CREATE TABLE $FCT(
|
||||||
|
col1 int not null,
|
||||||
|
col2 int not null,
|
||||||
|
col3 varchar(10),
|
||||||
|
CONSTRAINT pk PRIMARY KEY (col1, col2)
|
||||||
|
) ENGINE $engine_type;
|
||||||
|
|
||||||
|
eval CREATE TABLE bug21114_child(
|
||||||
|
pk int not null,
|
||||||
|
fk_col1 int not null,
|
||||||
|
fk_col2 int not null,
|
||||||
|
fk_col3 int not null,
|
||||||
|
fk_col4 int not null,
|
||||||
|
CONSTRAINT fk_fct FOREIGN KEY (fk_col1, fk_col2)
|
||||||
|
REFERENCES $FCT(col1, col2),
|
||||||
|
CONSTRAINT fk_fct_space FOREIGN KEY (fk_col3, fk_col4)
|
||||||
|
REFERENCES $FCT (col1, col2)
|
||||||
|
) ENGINE $engine_type;
|
||||||
|
|
||||||
|
--enable_query_log
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
if ($verbose)
|
||||||
|
{
|
||||||
|
eval SHOW CREATE TABLE $FCT;
|
||||||
|
SHOW CREATE TABLE bug21114_child;
|
||||||
|
}
|
||||||
|
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
eval DROP TABLE $FCT;
|
||||||
|
|
@ -119,4 +119,13 @@ END|
|
|||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE FUNCTION sp_vars_div_zero() RETURNS INTEGER
|
||||||
|
BEGIN
|
||||||
|
DECLARE div_zero INTEGER;
|
||||||
|
SELECT 1/0 INTO div_zero;
|
||||||
|
RETURN div_zero;
|
||||||
|
END|
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
delimiter ;|
|
delimiter ;|
|
||||||
|
@ -1425,6 +1425,7 @@ sub environment_setup () {
|
|||||||
# $ENV{'MYSQL_TCP_PORT'}= '@MYSQL_TCP_PORT@'; # FIXME
|
# $ENV{'MYSQL_TCP_PORT'}= '@MYSQL_TCP_PORT@'; # FIXME
|
||||||
$ENV{'MYSQL_TCP_PORT'}= 3306;
|
$ENV{'MYSQL_TCP_PORT'}= 3306;
|
||||||
|
|
||||||
|
$ENV{'EXE_MYSQL'}= $exe_mysql;
|
||||||
$ENV{MTR_BUILD_THREAD}= 0 unless $ENV{MTR_BUILD_THREAD}; # Set if not set
|
$ENV{MTR_BUILD_THREAD}= 0 unless $ENV{MTR_BUILD_THREAD}; # Set if not set
|
||||||
|
|
||||||
# ----------------------------------------------------
|
# ----------------------------------------------------
|
||||||
@ -1456,6 +1457,9 @@ sub environment_setup () {
|
|||||||
$ENV{'IM_PORT'}= $instance_manager->{port};
|
$ENV{'IM_PORT'}= $instance_manager->{port};
|
||||||
$ENV{'IM_DEFAULTS_PATH'}= $instance_manager->{defaults_file};
|
$ENV{'IM_DEFAULTS_PATH'}= $instance_manager->{defaults_file};
|
||||||
$ENV{'IM_PASSWORD_PATH'}= $instance_manager->{password_file};
|
$ENV{'IM_PASSWORD_PATH'}= $instance_manager->{password_file};
|
||||||
|
$ENV{'IM_PATH_SOCK'}= $instance_manager->{path_sock};
|
||||||
|
$ENV{'IM_USERNAME'}= $instance_manager->{admin_login};
|
||||||
|
$ENV{'IM_PASSWORD'}= $instance_manager->{admin_password};
|
||||||
|
|
||||||
$ENV{'IM_MYSQLD1_SOCK'}= $instance_manager->{instances}->[0]->{path_sock};
|
$ENV{'IM_MYSQLD1_SOCK'}= $instance_manager->{instances}->[0]->{path_sock};
|
||||||
$ENV{'IM_MYSQLD1_PORT'}= $instance_manager->{instances}->[0]->{port};
|
$ENV{'IM_MYSQLD1_PORT'}= $instance_manager->{instances}->[0]->{port};
|
||||||
|
@ -206,13 +206,13 @@ drop event events_test.mysqltest_user1;
|
|||||||
drop user mysqltest_user1@localhost;
|
drop user mysqltest_user1@localhost;
|
||||||
drop database mysqltest_db1;
|
drop database mysqltest_db1;
|
||||||
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select s1 from ttx) do drop table t' at line 1
|
ERROR 42000: This version of MySQL doesn't yet support 'Usage of subqueries or stored function calls as part of this statement'
|
||||||
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select s1 from ttx) second do drop table t' at line 1
|
ERROR 42000: This version of MySQL doesn't yet support 'Usage of subqueries or stored function calls as part of this statement'
|
||||||
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select s1 from ttx) do drop table t' at line 1
|
ERROR 42000: This version of MySQL doesn't yet support 'Usage of subqueries or stored function calls as part of this statement'
|
||||||
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select s1 from ttx) do drop table t' at line 1
|
ERROR 42000: This version of MySQL doesn't yet support 'Usage of subqueries or stored function calls as part of this statement'
|
||||||
drop event if exists e_16;
|
drop event if exists e_16;
|
||||||
drop procedure if exists p_16;
|
drop procedure if exists p_16;
|
||||||
create event e_16 on schedule every 1 second do set @a=5;
|
create event e_16 on schedule every 1 second do set @a=5;
|
||||||
@ -226,4 +226,46 @@ set @a= 6;
|
|||||||
call p_16();
|
call p_16();
|
||||||
drop procedure p_16;
|
drop procedure p_16;
|
||||||
drop event e_16;
|
drop event e_16;
|
||||||
|
drop function if exists f22830;
|
||||||
|
drop event if exists e22830;
|
||||||
|
drop event if exists e22830_1;
|
||||||
|
drop event if exists e22830_2;
|
||||||
|
drop event if exists e22830_3;
|
||||||
|
drop event if exists e22830_4;
|
||||||
|
drop table if exists t1;
|
||||||
|
drop table if exists t2;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (2);
|
||||||
|
create table t2 (a char(20));
|
||||||
|
insert into t2 values ("e22830_1");
|
||||||
|
create function f22830 () returns int return 5;
|
||||||
|
create event e22830 on schedule every f22830() second do select 123;
|
||||||
|
ERROR 42000: This version of MySQL doesn't yet support 'Usage of subqueries or stored function calls as part of this statement'
|
||||||
|
create event e22830_1 on schedule every 1 hour do alter event e22830_1 on schedule every (select 8 from dual) hour;
|
||||||
|
create event e22830_2 on schedule every 1 hour do alter event e22830_2 on schedule every (select 8 from t1) hour;
|
||||||
|
create event e22830_3 on schedule every 1 hour do alter event e22830_3 on schedule every f22830() hour;
|
||||||
|
create event e22830_4 on schedule every 1 hour do alter event e22830_4 on schedule every (select f22830() from dual) hour;
|
||||||
|
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
||||||
|
event_name event_definition interval_value interval_field
|
||||||
|
e22830_1 alter event e22830_1 on schedule every (select 8 from dual) hour 1 HOUR
|
||||||
|
e22830_2 alter event e22830_2 on schedule every (select 8 from t1) hour 1 HOUR
|
||||||
|
e22830_3 alter event e22830_3 on schedule every f22830() hour 1 HOUR
|
||||||
|
e22830_4 alter event e22830_4 on schedule every (select f22830() from dual) hour 1 HOUR
|
||||||
|
set global event_scheduler=on;
|
||||||
|
set global event_scheduler=off;
|
||||||
|
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
||||||
|
event_name event_definition interval_value interval_field
|
||||||
|
e22830_1 alter event e22830_1 on schedule every (select 8 from dual) hour 8 HOUR
|
||||||
|
e22830_2 alter event e22830_2 on schedule every (select 8 from t1) hour 1 HOUR
|
||||||
|
e22830_3 alter event e22830_3 on schedule every f22830() hour 1 HOUR
|
||||||
|
e22830_4 alter event e22830_4 on schedule every (select f22830() from dual) hour 1 HOUR
|
||||||
|
drop function f22830;
|
||||||
|
drop event (select a from t2);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(select a from t2)' at line 1
|
||||||
|
drop event e22830_1;
|
||||||
|
drop event e22830_2;
|
||||||
|
drop event e22830_3;
|
||||||
|
drop event e22830_4;
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
drop database events_test;
|
drop database events_test;
|
||||||
|
@ -4,7 +4,7 @@ CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
|
|||||||
SHOW EVENTS;
|
SHOW EVENTS;
|
||||||
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
|
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
|
||||||
events_test one_event root@localhost RECURRING NULL 10 SECOND # # ENABLED
|
events_test one_event root@localhost RECURRING NULL 10 SECOND # # ENABLED
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT from information_schema.events;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||||
CREATE DATABASE events_test2;
|
CREATE DATABASE events_test2;
|
||||||
@ -57,37 +57,37 @@ USE events_test2;
|
|||||||
CREATE EVENT four_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
CREATE EVENT four_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
||||||
USE events_test;
|
USE events_test;
|
||||||
"We should see 4 events : one_event, two_event, three_event & four_event"
|
"We should see 4 events : one_event, two_event, three_event & four_event"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
|
||||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||||
|
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||||
NULL events_test2 four_event ev_test@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
NULL events_test2 four_event ev_test@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||||
DROP DATABASE events_test2;
|
DROP DATABASE events_test2;
|
||||||
"We should see 3 events : one_event, two_event, three_event"
|
"We should see 3 events : one_event, two_event, three_event"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
|
||||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||||
|
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||||
CREATE DATABASE events_test2;
|
CREATE DATABASE events_test2;
|
||||||
USE events_test2;
|
USE events_test2;
|
||||||
CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
||||||
"Should see 4 events - one, two, three & five"
|
"Should see 4 events - one, two, three & five"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
|
||||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||||
|
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||||
NULL events_test2 five_event root@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
NULL events_test2 five_event root@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||||
REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
|
REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
|
||||||
USE test;
|
USE test;
|
||||||
"Should see 3 events - one, two & three"
|
"Should see 3 events - one, two & three"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
|
||||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||||
|
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||||
"Let's test ALTER EVENT which changes the definer"
|
"Let's test ALTER EVENT which changes the definer"
|
||||||
USE events_test;
|
USE events_test;
|
||||||
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
|
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
|
||||||
@ -111,10 +111,10 @@ ALTER EVENT one_event COMMENT "new comment";
|
|||||||
"test DROP by another user"
|
"test DROP by another user"
|
||||||
DROP EVENT one_event;
|
DROP EVENT one_event;
|
||||||
"One event should not be there"
|
"One event should not be there"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
|
||||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||||
|
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||||
NULL events_test2 five_event root@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
NULL events_test2 five_event root@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||||
DROP USER ev_test@localhost;
|
DROP USER ev_test@localhost;
|
||||||
DROP DATABASE events_test2;
|
DROP DATABASE events_test2;
|
||||||
|
@ -102,6 +102,18 @@ Note 1003 select pi() AS `pi()`,format(sin((pi() / 2)),6) AS `format(sin(pi()/2)
|
|||||||
select degrees(pi()),radians(360);
|
select degrees(pi()),radians(360);
|
||||||
degrees(pi()) radians(360)
|
degrees(pi()) radians(360)
|
||||||
180 6.2831853071796
|
180 6.2831853071796
|
||||||
|
select format(atan(-2, 2), 6);
|
||||||
|
format(atan(-2, 2), 6)
|
||||||
|
-0.785398
|
||||||
|
select format(atan(pi(), 0), 6);
|
||||||
|
format(atan(pi(), 0), 6)
|
||||||
|
1.570796
|
||||||
|
select format(atan2(-2, 2), 6);
|
||||||
|
format(atan2(-2, 2), 6)
|
||||||
|
-0.785398
|
||||||
|
select format(atan2(pi(), 0), 6);
|
||||||
|
format(atan2(pi(), 0), 6)
|
||||||
|
1.570796
|
||||||
SELECT ACOS(1.0);
|
SELECT ACOS(1.0);
|
||||||
ACOS(1.0)
|
ACOS(1.0)
|
||||||
0
|
0
|
||||||
|
@ -8,6 +8,7 @@ mysqld2 offline
|
|||||||
Killing the process...
|
Killing the process...
|
||||||
Sleeping...
|
Sleeping...
|
||||||
Success: the process was restarted.
|
Success: the process was restarted.
|
||||||
|
Success: server is ready to accept connection on socket.
|
||||||
|
|
||||||
--------------------------------------------------------------------
|
--------------------------------------------------------------------
|
||||||
-- Test for BUG#12751
|
-- Test for BUG#12751
|
||||||
|
@ -248,6 +248,22 @@ b
|
|||||||
c
|
c
|
||||||
d
|
d
|
||||||
drop table t1,t4;
|
drop table t1,t4;
|
||||||
|
DROP TABLE IF EXISTS t2, t1;
|
||||||
|
CREATE TABLE t1 (i INT NOT NULL PRIMARY KEY) ENGINE= InnoDB;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
i INT NOT NULL,
|
||||||
|
FOREIGN KEY (i) REFERENCES t1 (i) ON DELETE NO ACTION
|
||||||
|
) ENGINE= InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
DELETE IGNORE FROM t1 WHERE i = 1;
|
||||||
|
Warnings:
|
||||||
|
Error 1451 Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`i`) REFERENCES `t1` (`i`) ON DELETE NO ACTION)
|
||||||
|
SELECT * FROM t1, t2;
|
||||||
|
i i
|
||||||
|
1 1
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
End of 4.1 tests.
|
||||||
create table t1 (
|
create table t1 (
|
||||||
a varchar(30), b varchar(30), primary key(a), key(b)
|
a varchar(30), b varchar(30), primary key(a), key(b)
|
||||||
);
|
);
|
||||||
|
@ -16,7 +16,7 @@ select 4;
|
|||||||
4
|
4
|
||||||
drop table t1;
|
drop table t1;
|
||||||
kill (select count(*) from mysql.user);
|
kill (select count(*) from mysql.user);
|
||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select count(*) from mysql.user)' at line 1
|
ERROR 42000: This version of MySQL doesn't yet support 'Usage of subqueries or stored function calls as part of this statement'
|
||||||
create table t1 (id int primary key);
|
create table t1 (id int primary key);
|
||||||
create table t2 (id int unsigned not null);
|
create table t2 (id int unsigned not null);
|
||||||
insert into t2 select id from t1;
|
insert into t2 select id from t1;
|
||||||
|
@ -218,3 +218,71 @@ unlock tables;
|
|||||||
use mysql;
|
use mysql;
|
||||||
lock tables general_log read local, help_category read local;
|
lock tables general_log read local, help_category read local;
|
||||||
unlock tables;
|
unlock tables;
|
||||||
|
use mysql;
|
||||||
|
RENAME TABLE general_log TO renamed_general_log;
|
||||||
|
ERROR HY000: Cannot rename 'general_log'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to 'general_log'
|
||||||
|
RENAME TABLE slow_log TO renamed_slow_log;
|
||||||
|
ERROR HY000: Cannot rename 'slow_log'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to 'slow_log'
|
||||||
|
truncate table general_log;
|
||||||
|
select * from general_log;
|
||||||
|
event_time user_host thread_id server_id command_type argument
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from general_log
|
||||||
|
truncate table slow_log;
|
||||||
|
select * from slow_log;
|
||||||
|
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
|
||||||
|
create table general_log_new like general_log;
|
||||||
|
rename table general_log TO renamed_general_log, general_log_new TO general_log;
|
||||||
|
create table slow_log_new like slow_log;
|
||||||
|
rename table slow_log TO renamed_slow_log, slow_log_new TO slow_log;
|
||||||
|
rename table general_log TO general_log_new, renamed_general_log TO general_log, slow_log to renamed_slow_log;
|
||||||
|
ERROR HY000: Cannot rename 'slow_log'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to 'slow_log'
|
||||||
|
select * from general_log;
|
||||||
|
event_time user_host thread_id server_id command_type argument
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query create table slow_log_new like slow_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query rename table slow_log TO renamed_slow_log, slow_log_new TO slow_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query rename table general_log TO general_log_new, renamed_general_log TO general_log, slow_log to renamed_slow_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from general_log
|
||||||
|
select * from renamed_general_log;
|
||||||
|
event_time user_host thread_id server_id command_type argument
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from general_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query truncate table slow_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query select * from slow_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query create table general_log_new like general_log
|
||||||
|
TIMESTAMP USER_HOST THREAD_ID 1 Query rename table general_log TO renamed_general_log, general_log_new TO general_log
|
||||||
|
select * from slow_log;
|
||||||
|
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
|
||||||
|
select * from renamed_slow_log;
|
||||||
|
start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text
|
||||||
|
set global general_log='OFF';
|
||||||
|
RENAME TABLE general_log TO general_log2;
|
||||||
|
set global slow_query_log='OFF';
|
||||||
|
RENAME TABLE slow_log TO slow_log2;
|
||||||
|
set global general_log='ON';
|
||||||
|
ERROR HY000: Cannot activate 'general' log
|
||||||
|
set global slow_query_log='ON';
|
||||||
|
ERROR HY000: Cannot activate 'slow query' log
|
||||||
|
RENAME TABLE general_log2 TO general_log;
|
||||||
|
RENAME TABLE slow_log2 TO slow_log;
|
||||||
|
set global general_log='ON';
|
||||||
|
set global slow_query_log='ON';
|
||||||
|
flush logs;
|
||||||
|
flush logs;
|
||||||
|
drop table renamed_general_log, renamed_slow_log;
|
||||||
|
use test;
|
||||||
|
use mysql;
|
||||||
|
repair table general_log;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
mysql.general_log repair status OK
|
||||||
|
repair table slow_log;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
mysql.slow_log repair status OK
|
||||||
|
create table general_log_new like general_log;
|
||||||
|
create table slow_log_new like slow_log;
|
||||||
|
show tables like "%log%";
|
||||||
|
Tables_in_mysql (%log%)
|
||||||
|
general_log
|
||||||
|
general_log_new
|
||||||
|
slow_log
|
||||||
|
slow_log_new
|
||||||
|
drop table slow_log_new, general_log_new;
|
||||||
|
use test;
|
||||||
|
388
mysql-test/r/parser.result
Normal file
388
mysql-test/r/parser.result
Normal file
@ -0,0 +1,388 @@
|
|||||||
|
SET @save_sql_mode=@@sql_mode;
|
||||||
|
set SQL_MODE='';
|
||||||
|
create table ADDDATE(a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
create table ADDDATE (a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
create table BIT_AND(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_AND(a int)' at line 1
|
||||||
|
create table BIT_AND (a int);
|
||||||
|
drop table BIT_AND;
|
||||||
|
create table BIT_OR(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_OR(a int)' at line 1
|
||||||
|
create table BIT_OR (a int);
|
||||||
|
drop table BIT_OR;
|
||||||
|
create table BIT_XOR(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_XOR(a int)' at line 1
|
||||||
|
create table BIT_XOR (a int);
|
||||||
|
drop table BIT_XOR;
|
||||||
|
create table CAST(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CAST(a int)' at line 1
|
||||||
|
create table CAST (a int);
|
||||||
|
drop table CAST;
|
||||||
|
create table COUNT(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(a int)' at line 1
|
||||||
|
create table COUNT (a int);
|
||||||
|
drop table COUNT;
|
||||||
|
create table CURDATE(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURDATE(a int)' at line 1
|
||||||
|
create table CURDATE (a int);
|
||||||
|
drop table CURDATE;
|
||||||
|
create table CURTIME(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURTIME(a int)' at line 1
|
||||||
|
create table CURTIME (a int);
|
||||||
|
drop table CURTIME;
|
||||||
|
create table DATE_ADD(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATE_ADD(a int)' at line 1
|
||||||
|
create table DATE_ADD (a int);
|
||||||
|
drop table DATE_ADD;
|
||||||
|
create table DATE_SUB(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATE_SUB(a int)' at line 1
|
||||||
|
create table DATE_SUB (a int);
|
||||||
|
drop table DATE_SUB;
|
||||||
|
create table EXTRACT(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXTRACT(a int)' at line 1
|
||||||
|
create table EXTRACT (a int);
|
||||||
|
drop table EXTRACT;
|
||||||
|
create table GROUP_CONCAT(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP_CONCAT(a int)' at line 1
|
||||||
|
create table GROUP_CONCAT (a int);
|
||||||
|
drop table GROUP_CONCAT;
|
||||||
|
create table GROUP_UNIQUE_USERS(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP_UNIQUE_USERS(a int)' at line 1
|
||||||
|
create table GROUP_UNIQUE_USERS (a int);
|
||||||
|
drop table GROUP_UNIQUE_USERS;
|
||||||
|
create table MAX(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(a int)' at line 1
|
||||||
|
create table MAX (a int);
|
||||||
|
drop table MAX;
|
||||||
|
create table MID(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MID(a int)' at line 1
|
||||||
|
create table MID (a int);
|
||||||
|
drop table MID;
|
||||||
|
create table MIN(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MIN(a int)' at line 1
|
||||||
|
create table MIN (a int);
|
||||||
|
drop table MIN;
|
||||||
|
create table NOW(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOW(a int)' at line 1
|
||||||
|
create table NOW (a int);
|
||||||
|
drop table NOW;
|
||||||
|
create table POSITION(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'POSITION(a int)' at line 1
|
||||||
|
create table POSITION (a int);
|
||||||
|
drop table POSITION;
|
||||||
|
create table SESSION_USER(a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
create table SESSION_USER (a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
create table STD(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STD(a int)' at line 1
|
||||||
|
create table STD (a int);
|
||||||
|
drop table STD;
|
||||||
|
create table STDDEV(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV(a int)' at line 1
|
||||||
|
create table STDDEV (a int);
|
||||||
|
drop table STDDEV;
|
||||||
|
create table STDDEV_POP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV_POP(a int)' at line 1
|
||||||
|
create table STDDEV_POP (a int);
|
||||||
|
drop table STDDEV_POP;
|
||||||
|
create table STDDEV_SAMP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV_SAMP(a int)' at line 1
|
||||||
|
create table STDDEV_SAMP (a int);
|
||||||
|
drop table STDDEV_SAMP;
|
||||||
|
create table SUBDATE(a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
create table SUBDATE (a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
create table SUBSTR(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUBSTR(a int)' at line 1
|
||||||
|
create table SUBSTR (a int);
|
||||||
|
drop table SUBSTR;
|
||||||
|
create table SUBSTRING(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUBSTRING(a int)' at line 1
|
||||||
|
create table SUBSTRING (a int);
|
||||||
|
drop table SUBSTRING;
|
||||||
|
create table SUM(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUM(a int)' at line 1
|
||||||
|
create table SUM (a int);
|
||||||
|
drop table SUM;
|
||||||
|
create table SYSDATE(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SYSDATE(a int)' at line 1
|
||||||
|
create table SYSDATE (a int);
|
||||||
|
drop table SYSDATE;
|
||||||
|
create table SYSTEM_USER(a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
create table SYSTEM_USER (a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
create table TRIM(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIM(a int)' at line 1
|
||||||
|
create table TRIM (a int);
|
||||||
|
drop table TRIM;
|
||||||
|
create table UNIQUE_USERS(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIQUE_USERS(a int)' at line 1
|
||||||
|
create table UNIQUE_USERS (a int);
|
||||||
|
drop table UNIQUE_USERS;
|
||||||
|
create table VARIANCE(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARIANCE(a int)' at line 1
|
||||||
|
create table VARIANCE (a int);
|
||||||
|
drop table VARIANCE;
|
||||||
|
create table VAR_POP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_POP(a int)' at line 1
|
||||||
|
create table VAR_POP (a int);
|
||||||
|
drop table VAR_POP;
|
||||||
|
create table VAR_SAMP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP(a int)' at line 1
|
||||||
|
create table VAR_SAMP (a int);
|
||||||
|
drop table VAR_SAMP;
|
||||||
|
set SQL_MODE='IGNORE_SPACE';
|
||||||
|
create table ADDDATE(a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
create table ADDDATE (a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
create table BIT_AND(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_AND(a int)' at line 1
|
||||||
|
create table BIT_AND (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_AND (a int)' at line 1
|
||||||
|
create table BIT_OR(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_OR(a int)' at line 1
|
||||||
|
create table BIT_OR (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_OR (a int)' at line 1
|
||||||
|
create table BIT_XOR(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_XOR(a int)' at line 1
|
||||||
|
create table BIT_XOR (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT_XOR (a int)' at line 1
|
||||||
|
create table CAST(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CAST(a int)' at line 1
|
||||||
|
create table CAST (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CAST (a int)' at line 1
|
||||||
|
create table COUNT(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(a int)' at line 1
|
||||||
|
create table COUNT (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT (a int)' at line 1
|
||||||
|
create table CURDATE(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURDATE(a int)' at line 1
|
||||||
|
create table CURDATE (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURDATE (a int)' at line 1
|
||||||
|
create table CURTIME(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURTIME(a int)' at line 1
|
||||||
|
create table CURTIME (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURTIME (a int)' at line 1
|
||||||
|
create table DATE_ADD(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATE_ADD(a int)' at line 1
|
||||||
|
create table DATE_ADD (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATE_ADD (a int)' at line 1
|
||||||
|
create table DATE_SUB(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATE_SUB(a int)' at line 1
|
||||||
|
create table DATE_SUB (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DATE_SUB (a int)' at line 1
|
||||||
|
create table EXTRACT(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXTRACT(a int)' at line 1
|
||||||
|
create table EXTRACT (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXTRACT (a int)' at line 1
|
||||||
|
create table GROUP_CONCAT(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP_CONCAT(a int)' at line 1
|
||||||
|
create table GROUP_CONCAT (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP_CONCAT (a int)' at line 1
|
||||||
|
create table GROUP_UNIQUE_USERS(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP_UNIQUE_USERS(a int)' at line 1
|
||||||
|
create table GROUP_UNIQUE_USERS (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP_UNIQUE_USERS (a int)' at line 1
|
||||||
|
create table MAX(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(a int)' at line 1
|
||||||
|
create table MAX (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX (a int)' at line 1
|
||||||
|
create table MID(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MID(a int)' at line 1
|
||||||
|
create table MID (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MID (a int)' at line 1
|
||||||
|
create table MIN(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MIN(a int)' at line 1
|
||||||
|
create table MIN (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MIN (a int)' at line 1
|
||||||
|
create table NOW(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOW(a int)' at line 1
|
||||||
|
create table NOW (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOW (a int)' at line 1
|
||||||
|
create table POSITION(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'POSITION(a int)' at line 1
|
||||||
|
create table POSITION (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'POSITION (a int)' at line 1
|
||||||
|
create table SESSION_USER(a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
create table SESSION_USER (a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
create table STD(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STD(a int)' at line 1
|
||||||
|
create table STD (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STD (a int)' at line 1
|
||||||
|
create table STDDEV(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV(a int)' at line 1
|
||||||
|
create table STDDEV (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV (a int)' at line 1
|
||||||
|
create table STDDEV_POP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV_POP(a int)' at line 1
|
||||||
|
create table STDDEV_POP (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV_POP (a int)' at line 1
|
||||||
|
create table STDDEV_SAMP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV_SAMP(a int)' at line 1
|
||||||
|
create table STDDEV_SAMP (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STDDEV_SAMP (a int)' at line 1
|
||||||
|
create table SUBDATE(a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
create table SUBDATE (a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
create table SUBSTR(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUBSTR(a int)' at line 1
|
||||||
|
create table SUBSTR (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUBSTR (a int)' at line 1
|
||||||
|
create table SUBSTRING(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUBSTRING(a int)' at line 1
|
||||||
|
create table SUBSTRING (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUBSTRING (a int)' at line 1
|
||||||
|
create table SUM(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUM(a int)' at line 1
|
||||||
|
create table SUM (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SUM (a int)' at line 1
|
||||||
|
create table SYSDATE(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SYSDATE(a int)' at line 1
|
||||||
|
create table SYSDATE (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SYSDATE (a int)' at line 1
|
||||||
|
create table SYSTEM_USER(a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
create table SYSTEM_USER (a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
create table TRIM(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIM(a int)' at line 1
|
||||||
|
create table TRIM (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIM (a int)' at line 1
|
||||||
|
create table UNIQUE_USERS(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIQUE_USERS(a int)' at line 1
|
||||||
|
create table UNIQUE_USERS (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIQUE_USERS (a int)' at line 1
|
||||||
|
create table VARIANCE(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARIANCE(a int)' at line 1
|
||||||
|
create table VARIANCE (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARIANCE (a int)' at line 1
|
||||||
|
create table VAR_POP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_POP(a int)' at line 1
|
||||||
|
create table VAR_POP (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_POP (a int)' at line 1
|
||||||
|
create table VAR_SAMP(a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP(a int)' at line 1
|
||||||
|
create table VAR_SAMP (a int);
|
||||||
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VAR_SAMP (a int)' at line 1
|
||||||
|
SET @@sql_mode=@save_sql_mode;
|
||||||
|
select pi(3.14);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'pi'
|
||||||
|
select tan();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'tan'
|
||||||
|
select tan(1, 2);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'tan'
|
||||||
|
select makedate(1);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'makedate'
|
||||||
|
select makedate(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'makedate'
|
||||||
|
select maketime();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'maketime'
|
||||||
|
select maketime(1);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'maketime'
|
||||||
|
select maketime(1, 2);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'maketime'
|
||||||
|
select maketime(1, 2, 3, 4);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'maketime'
|
||||||
|
select atan();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'atan'
|
||||||
|
select atan2(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'atan2'
|
||||||
|
select benchmark(10, 1+1);
|
||||||
|
benchmark(10, 1+1)
|
||||||
|
0
|
||||||
|
select benchmark(5+5, 2);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'BENCHMARK'
|
||||||
|
select concat();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'concat'
|
||||||
|
select concat("foo");
|
||||||
|
concat("foo")
|
||||||
|
foo
|
||||||
|
select concat_ws();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'concat_ws'
|
||||||
|
select concat_ws("foo");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'concat_ws'
|
||||||
|
set @pwd="my password";
|
||||||
|
select encode("secret", @pwd);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'ENCODE'
|
||||||
|
select decode("encoded-secret", @pwd);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'DECODE'
|
||||||
|
select encrypt();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'encrypt'
|
||||||
|
select encrypt(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'encrypt'
|
||||||
|
select des_encrypt("p1", "p2", "not expected");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'des_encrypt'
|
||||||
|
select des_decrypt("p1", "p2", "not expected");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'des_decrypt'
|
||||||
|
select elt();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'elt'
|
||||||
|
select elt(1);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'elt'
|
||||||
|
select export_set();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'export_set'
|
||||||
|
select export_set("p1");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'export_set'
|
||||||
|
select export_set("p1", "p2");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'export_set'
|
||||||
|
select export_set("p1", "p2", "p3", "p4", "p5", "p6");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'export_set'
|
||||||
|
select field();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'field'
|
||||||
|
select field("p1");
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'field'
|
||||||
|
set @dec=2;
|
||||||
|
select format(pi(), @dec);
|
||||||
|
ERROR 42000: Incorrect parameters in the call to native function 'FORMAT'
|
||||||
|
select from_unixtime();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'from_unixtime'
|
||||||
|
select from_unixtime(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'from_unixtime'
|
||||||
|
select unix_timestamp(1, 2);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'unix_timestamp'
|
||||||
|
select greatest();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'greatest'
|
||||||
|
select greatest(12);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'greatest'
|
||||||
|
select last_insert_id(1, 2);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'last_insert_id'
|
||||||
|
select least();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'least'
|
||||||
|
select least(12);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'least'
|
||||||
|
select locate();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'locate'
|
||||||
|
select locate(1);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'locate'
|
||||||
|
select locate(1, 2, 3, 4);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'locate'
|
||||||
|
select log();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'log'
|
||||||
|
select log(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'log'
|
||||||
|
select make_set();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'make_set'
|
||||||
|
select make_set(1);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'make_set'
|
||||||
|
select master_pos_wait();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'master_pos_wait'
|
||||||
|
select master_pos_wait(1);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'master_pos_wait'
|
||||||
|
select master_pos_wait(1, 2, 3, 4);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'master_pos_wait'
|
||||||
|
select rand(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'rand'
|
||||||
|
select round(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'round'
|
||||||
|
select yearweek();
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
||||||
|
select yearweek(1, 2, 3);
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
867
mysql-test/r/parser_bug21114_innodb.result
Normal file
867
mysql-test/r/parser_bug21114_innodb.result
Normal file
@ -0,0 +1,867 @@
|
|||||||
|
drop table if exists ABS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
SHOW CREATE TABLE ABS;
|
||||||
|
Table Create Table
|
||||||
|
ABS CREATE TABLE `ABS` (
|
||||||
|
`col1` int(11) NOT NULL,
|
||||||
|
`col2` int(11) NOT NULL,
|
||||||
|
`col3` varchar(10) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`col1`,`col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
SHOW CREATE TABLE bug21114_child;
|
||||||
|
Table Create Table
|
||||||
|
bug21114_child CREATE TABLE `bug21114_child` (
|
||||||
|
`pk` int(11) NOT NULL,
|
||||||
|
`fk_col1` int(11) NOT NULL,
|
||||||
|
`fk_col2` int(11) NOT NULL,
|
||||||
|
`fk_col3` int(11) NOT NULL,
|
||||||
|
`fk_col4` int(11) NOT NULL,
|
||||||
|
KEY `fk_fct` (`fk_col1`,`fk_col2`),
|
||||||
|
KEY `fk_fct_space` (`fk_col3`,`fk_col4`),
|
||||||
|
CONSTRAINT `fk_fct` FOREIGN KEY (`fk_col1`, `fk_col2`) REFERENCES `ABS` (`col1`, `col2`),
|
||||||
|
CONSTRAINT `fk_fct_space` FOREIGN KEY (`fk_col3`, `fk_col4`) REFERENCES `ABS` (`col1`, `col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ABS;
|
||||||
|
drop table if exists FIELD;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
SHOW CREATE TABLE FIELD;
|
||||||
|
Table Create Table
|
||||||
|
FIELD CREATE TABLE `FIELD` (
|
||||||
|
`col1` int(11) NOT NULL,
|
||||||
|
`col2` int(11) NOT NULL,
|
||||||
|
`col3` varchar(10) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`col1`,`col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
SHOW CREATE TABLE bug21114_child;
|
||||||
|
Table Create Table
|
||||||
|
bug21114_child CREATE TABLE `bug21114_child` (
|
||||||
|
`pk` int(11) NOT NULL,
|
||||||
|
`fk_col1` int(11) NOT NULL,
|
||||||
|
`fk_col2` int(11) NOT NULL,
|
||||||
|
`fk_col3` int(11) NOT NULL,
|
||||||
|
`fk_col4` int(11) NOT NULL,
|
||||||
|
KEY `fk_fct` (`fk_col1`,`fk_col2`),
|
||||||
|
KEY `fk_fct_space` (`fk_col3`,`fk_col4`),
|
||||||
|
CONSTRAINT `fk_fct` FOREIGN KEY (`fk_col1`, `fk_col2`) REFERENCES `FIELD` (`col1`, `col2`),
|
||||||
|
CONSTRAINT `fk_fct_space` FOREIGN KEY (`fk_col3`, `fk_col4`) REFERENCES `FIELD` (`col1`, `col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FIELD;
|
||||||
|
drop table if exists FORMAT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
SHOW CREATE TABLE FORMAT;
|
||||||
|
Table Create Table
|
||||||
|
FORMAT CREATE TABLE `FORMAT` (
|
||||||
|
`col1` int(11) NOT NULL,
|
||||||
|
`col2` int(11) NOT NULL,
|
||||||
|
`col3` varchar(10) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`col1`,`col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
SHOW CREATE TABLE bug21114_child;
|
||||||
|
Table Create Table
|
||||||
|
bug21114_child CREATE TABLE `bug21114_child` (
|
||||||
|
`pk` int(11) NOT NULL,
|
||||||
|
`fk_col1` int(11) NOT NULL,
|
||||||
|
`fk_col2` int(11) NOT NULL,
|
||||||
|
`fk_col3` int(11) NOT NULL,
|
||||||
|
`fk_col4` int(11) NOT NULL,
|
||||||
|
KEY `fk_fct` (`fk_col1`,`fk_col2`),
|
||||||
|
KEY `fk_fct_space` (`fk_col3`,`fk_col4`),
|
||||||
|
CONSTRAINT `fk_fct` FOREIGN KEY (`fk_col1`, `fk_col2`) REFERENCES `FORMAT` (`col1`, `col2`),
|
||||||
|
CONSTRAINT `fk_fct_space` FOREIGN KEY (`fk_col3`, `fk_col4`) REFERENCES `FORMAT` (`col1`, `col2`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FORMAT;
|
||||||
|
drop table if exists ACOS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ACOS;
|
||||||
|
drop table if exists ADDDATE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ADDDATE;
|
||||||
|
drop table if exists ADDTIME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ADDTIME;
|
||||||
|
drop table if exists AES_DECRYPT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE AES_DECRYPT;
|
||||||
|
drop table if exists AES_ENCRYPT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE AES_ENCRYPT;
|
||||||
|
drop table if exists AREA;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE AREA;
|
||||||
|
drop table if exists ASBINARY;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ASBINARY;
|
||||||
|
drop table if exists ASIN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ASIN;
|
||||||
|
drop table if exists ASTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ASTEXT;
|
||||||
|
drop table if exists ASWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ASWKB;
|
||||||
|
drop table if exists ASWKT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ASWKT;
|
||||||
|
drop table if exists ATAN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ATAN;
|
||||||
|
drop table if exists ATAN2;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ATAN2;
|
||||||
|
drop table if exists BENCHMARK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE BENCHMARK;
|
||||||
|
drop table if exists BIN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE BIN;
|
||||||
|
drop table if exists BIT_COUNT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE BIT_COUNT;
|
||||||
|
drop table if exists BIT_LENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE BIT_LENGTH;
|
||||||
|
drop table if exists CEIL;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CEIL;
|
||||||
|
drop table if exists CEILING;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CEILING;
|
||||||
|
drop table if exists CENTROID;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CENTROID;
|
||||||
|
drop table if exists CHARACTER_LENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CHARACTER_LENGTH;
|
||||||
|
drop table if exists CHAR_LENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CHAR_LENGTH;
|
||||||
|
drop table if exists COERCIBILITY;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE COERCIBILITY;
|
||||||
|
drop table if exists COMPRESS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE COMPRESS;
|
||||||
|
drop table if exists CONCAT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CONCAT;
|
||||||
|
drop table if exists CONCAT_WS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CONCAT_WS;
|
||||||
|
drop table if exists CONNECTION_ID;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CONNECTION_ID;
|
||||||
|
drop table if exists CONV;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CONV;
|
||||||
|
drop table if exists CONVERT_TZ;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CONVERT_TZ;
|
||||||
|
drop table if exists COS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE COS;
|
||||||
|
drop table if exists COT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE COT;
|
||||||
|
drop table if exists CRC32;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CRC32;
|
||||||
|
drop table if exists CROSSES;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE CROSSES;
|
||||||
|
drop table if exists DATEDIFF;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DATEDIFF;
|
||||||
|
drop table if exists DATE_FORMAT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DATE_FORMAT;
|
||||||
|
drop table if exists DAYNAME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DAYNAME;
|
||||||
|
drop table if exists DAYOFMONTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DAYOFMONTH;
|
||||||
|
drop table if exists DAYOFWEEK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DAYOFWEEK;
|
||||||
|
drop table if exists DAYOFYEAR;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DAYOFYEAR;
|
||||||
|
drop table if exists DECODE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DECODE;
|
||||||
|
drop table if exists DEGREES;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DEGREES;
|
||||||
|
drop table if exists DES_DECRYPT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DES_DECRYPT;
|
||||||
|
drop table if exists DES_ENCRYPT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DES_ENCRYPT;
|
||||||
|
drop table if exists DIMENSION;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DIMENSION;
|
||||||
|
drop table if exists DISJOINT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE DISJOINT;
|
||||||
|
drop table if exists ELT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ELT;
|
||||||
|
drop table if exists ENCODE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ENCODE;
|
||||||
|
drop table if exists ENCRYPT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ENCRYPT;
|
||||||
|
drop table if exists ENDPOINT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ENDPOINT;
|
||||||
|
drop table if exists ENVELOPE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ENVELOPE;
|
||||||
|
drop table if exists EQUALS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE EQUALS;
|
||||||
|
drop table if exists EXP;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE EXP;
|
||||||
|
drop table if exists EXPORT_SET;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE EXPORT_SET;
|
||||||
|
drop table if exists EXTERIORRING;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE EXTERIORRING;
|
||||||
|
drop table if exists EXTRACTVALUE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE EXTRACTVALUE;
|
||||||
|
drop table if exists FIND_IN_SET;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FIND_IN_SET;
|
||||||
|
drop table if exists FLOOR;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FLOOR;
|
||||||
|
drop table if exists FOUND_ROWS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FOUND_ROWS;
|
||||||
|
drop table if exists FROM_DAYS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FROM_DAYS;
|
||||||
|
drop table if exists FROM_UNIXTIME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE FROM_UNIXTIME;
|
||||||
|
drop table if exists GEOMCOLLFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMCOLLFROMTEXT;
|
||||||
|
drop table if exists GEOMCOLLFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMCOLLFROMWKB;
|
||||||
|
drop table if exists GEOMETRYCOLLECTIONFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMETRYCOLLECTIONFROMTEXT;
|
||||||
|
drop table if exists GEOMETRYCOLLECTIONFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMETRYCOLLECTIONFROMWKB;
|
||||||
|
drop table if exists GEOMETRYFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMETRYFROMTEXT;
|
||||||
|
drop table if exists GEOMETRYFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMETRYFROMWKB;
|
||||||
|
drop table if exists GEOMETRYN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMETRYN;
|
||||||
|
drop table if exists GEOMETRYTYPE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMETRYTYPE;
|
||||||
|
drop table if exists GEOMFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMFROMTEXT;
|
||||||
|
drop table if exists GEOMFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GEOMFROMWKB;
|
||||||
|
drop table if exists GET_LOCK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GET_LOCK;
|
||||||
|
drop table if exists GLENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GLENGTH;
|
||||||
|
drop table if exists GREATEST;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE GREATEST;
|
||||||
|
drop table if exists HEX;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE HEX;
|
||||||
|
drop table if exists IFNULL;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE IFNULL;
|
||||||
|
drop table if exists INET_ATON;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE INET_ATON;
|
||||||
|
drop table if exists INET_NTOA;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE INET_NTOA;
|
||||||
|
drop table if exists INSTR;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE INSTR;
|
||||||
|
drop table if exists INTERIORRINGN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE INTERIORRINGN;
|
||||||
|
drop table if exists INTERSECTS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE INTERSECTS;
|
||||||
|
drop table if exists ISCLOSED;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ISCLOSED;
|
||||||
|
drop table if exists ISEMPTY;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ISEMPTY;
|
||||||
|
drop table if exists ISNULL;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ISNULL;
|
||||||
|
drop table if exists ISSIMPLE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ISSIMPLE;
|
||||||
|
drop table if exists IS_FREE_LOCK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE IS_FREE_LOCK;
|
||||||
|
drop table if exists IS_USED_LOCK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE IS_USED_LOCK;
|
||||||
|
drop table if exists LAST_DAY;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LAST_DAY;
|
||||||
|
drop table if exists LAST_INSERT_ID;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LAST_INSERT_ID;
|
||||||
|
drop table if exists LCASE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LCASE;
|
||||||
|
drop table if exists LEAST;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LEAST;
|
||||||
|
drop table if exists LENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LENGTH;
|
||||||
|
drop table if exists LINEFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LINEFROMTEXT;
|
||||||
|
drop table if exists LINEFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LINEFROMWKB;
|
||||||
|
drop table if exists LINESTRINGFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LINESTRINGFROMTEXT;
|
||||||
|
drop table if exists LINESTRINGFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LINESTRINGFROMWKB;
|
||||||
|
drop table if exists LN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LN;
|
||||||
|
drop table if exists LOAD_FILE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LOAD_FILE;
|
||||||
|
drop table if exists LOCATE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LOCATE;
|
||||||
|
drop table if exists LOG;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LOG;
|
||||||
|
drop table if exists LOG10;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LOG10;
|
||||||
|
drop table if exists LOG2;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LOG2;
|
||||||
|
drop table if exists LOWER;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LOWER;
|
||||||
|
drop table if exists LPAD;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LPAD;
|
||||||
|
drop table if exists LTRIM;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE LTRIM;
|
||||||
|
drop table if exists MAKEDATE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MAKEDATE;
|
||||||
|
drop table if exists MAKETIME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MAKETIME;
|
||||||
|
drop table if exists MAKE_SET;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MAKE_SET;
|
||||||
|
drop table if exists MASTER_POS_WAIT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MASTER_POS_WAIT;
|
||||||
|
drop table if exists MBRCONTAINS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBRCONTAINS;
|
||||||
|
drop table if exists MBRDISJOINT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBRDISJOINT;
|
||||||
|
drop table if exists MBREQUAL;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBREQUAL;
|
||||||
|
drop table if exists MBRINTERSECTS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBRINTERSECTS;
|
||||||
|
drop table if exists MBROVERLAPS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBROVERLAPS;
|
||||||
|
drop table if exists MBRTOUCHES;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBRTOUCHES;
|
||||||
|
drop table if exists MBRWITHIN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MBRWITHIN;
|
||||||
|
drop table if exists MD5;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MD5;
|
||||||
|
drop table if exists MLINEFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MLINEFROMTEXT;
|
||||||
|
drop table if exists MLINEFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MLINEFROMWKB;
|
||||||
|
drop table if exists MONTHNAME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MONTHNAME;
|
||||||
|
drop table if exists MPOINTFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MPOINTFROMTEXT;
|
||||||
|
drop table if exists MPOINTFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MPOINTFROMWKB;
|
||||||
|
drop table if exists MPOLYFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MPOLYFROMTEXT;
|
||||||
|
drop table if exists MPOLYFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MPOLYFROMWKB;
|
||||||
|
drop table if exists MULTILINESTRINGFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MULTILINESTRINGFROMTEXT;
|
||||||
|
drop table if exists MULTILINESTRINGFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MULTILINESTRINGFROMWKB;
|
||||||
|
drop table if exists MULTIPOINTFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MULTIPOINTFROMTEXT;
|
||||||
|
drop table if exists MULTIPOINTFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MULTIPOINTFROMWKB;
|
||||||
|
drop table if exists MULTIPOLYGONFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MULTIPOLYGONFROMTEXT;
|
||||||
|
drop table if exists MULTIPOLYGONFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE MULTIPOLYGONFROMWKB;
|
||||||
|
drop table if exists NAME_CONST;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE NAME_CONST;
|
||||||
|
drop table if exists NULLIF;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE NULLIF;
|
||||||
|
drop table if exists NUMGEOMETRIES;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE NUMGEOMETRIES;
|
||||||
|
drop table if exists NUMINTERIORRINGS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE NUMINTERIORRINGS;
|
||||||
|
drop table if exists NUMPOINTS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE NUMPOINTS;
|
||||||
|
drop table if exists OCT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE OCT;
|
||||||
|
drop table if exists OCTET_LENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE OCTET_LENGTH;
|
||||||
|
drop table if exists ORD;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ORD;
|
||||||
|
drop table if exists OVERLAPS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE OVERLAPS;
|
||||||
|
drop table if exists PERIOD_ADD;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE PERIOD_ADD;
|
||||||
|
drop table if exists PERIOD_DIFF;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE PERIOD_DIFF;
|
||||||
|
drop table if exists PI;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE PI;
|
||||||
|
drop table if exists POINTFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POINTFROMTEXT;
|
||||||
|
drop table if exists POINTFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POINTFROMWKB;
|
||||||
|
drop table if exists POINTN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POINTN;
|
||||||
|
drop table if exists POLYFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POLYFROMTEXT;
|
||||||
|
drop table if exists POLYFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POLYFROMWKB;
|
||||||
|
drop table if exists POLYGONFROMTEXT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POLYGONFROMTEXT;
|
||||||
|
drop table if exists POLYGONFROMWKB;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POLYGONFROMWKB;
|
||||||
|
drop table if exists POW;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POW;
|
||||||
|
drop table if exists POWER;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE POWER;
|
||||||
|
drop table if exists QUOTE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE QUOTE;
|
||||||
|
drop table if exists RADIANS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE RADIANS;
|
||||||
|
drop table if exists RAND;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE RAND;
|
||||||
|
drop table if exists RELEASE_LOCK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE RELEASE_LOCK;
|
||||||
|
drop table if exists REVERSE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE REVERSE;
|
||||||
|
drop table if exists ROUND;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ROUND;
|
||||||
|
drop table if exists ROW_COUNT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE ROW_COUNT;
|
||||||
|
drop table if exists RPAD;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE RPAD;
|
||||||
|
drop table if exists RTRIM;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE RTRIM;
|
||||||
|
drop table if exists SEC_TO_TIME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SEC_TO_TIME;
|
||||||
|
drop table if exists SESSION_USER;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SESSION_USER;
|
||||||
|
drop table if exists SHA;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SHA;
|
||||||
|
drop table if exists SHA1;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SHA1;
|
||||||
|
drop table if exists SIGN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SIGN;
|
||||||
|
drop table if exists SIN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SIN;
|
||||||
|
drop table if exists SLEEP;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SLEEP;
|
||||||
|
drop table if exists SOUNDEX;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SOUNDEX;
|
||||||
|
drop table if exists SPACE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SPACE;
|
||||||
|
drop table if exists SQRT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SQRT;
|
||||||
|
drop table if exists SRID;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SRID;
|
||||||
|
drop table if exists STARTPOINT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE STARTPOINT;
|
||||||
|
drop table if exists STRCMP;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE STRCMP;
|
||||||
|
drop table if exists STR_TO_DATE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE STR_TO_DATE;
|
||||||
|
drop table if exists SUBDATE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SUBDATE;
|
||||||
|
drop table if exists SUBSTRING_INDEX;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SUBSTRING_INDEX;
|
||||||
|
drop table if exists SUBTIME;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SUBTIME;
|
||||||
|
drop table if exists SYSTEM_USER;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE SYSTEM_USER;
|
||||||
|
drop table if exists TAN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE TAN;
|
||||||
|
drop table if exists TIMEDIFF;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE TIMEDIFF;
|
||||||
|
drop table if exists TIME_FORMAT;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE TIME_FORMAT;
|
||||||
|
drop table if exists TIME_TO_SEC;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE TIME_TO_SEC;
|
||||||
|
drop table if exists TOUCHES;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE TOUCHES;
|
||||||
|
drop table if exists TO_DAYS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE TO_DAYS;
|
||||||
|
drop table if exists UCASE;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UCASE;
|
||||||
|
drop table if exists UNCOMPRESS;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UNCOMPRESS;
|
||||||
|
drop table if exists UNCOMPRESSED_LENGTH;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UNCOMPRESSED_LENGTH;
|
||||||
|
drop table if exists UNHEX;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UNHEX;
|
||||||
|
drop table if exists UNIX_TIMESTAMP;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UNIX_TIMESTAMP;
|
||||||
|
drop table if exists UPDATEXML;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UPDATEXML;
|
||||||
|
drop table if exists UPPER;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UPPER;
|
||||||
|
drop table if exists UUID;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE UUID;
|
||||||
|
drop table if exists VERSION;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE VERSION;
|
||||||
|
drop table if exists WEEKDAY;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE WEEKDAY;
|
||||||
|
drop table if exists WEEKOFYEAR;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE WEEKOFYEAR;
|
||||||
|
drop table if exists WITHIN;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE WITHIN;
|
||||||
|
drop table if exists X;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE X;
|
||||||
|
drop table if exists Y;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE Y;
|
||||||
|
drop table if exists YEARWEEK;
|
||||||
|
drop table if exists bug21114_child;
|
||||||
|
DROP TABLE bug21114_child;
|
||||||
|
DROP TABLE YEARWEEK;
|
@ -502,7 +502,8 @@ deallocate prepare stmt;
|
|||||||
create table t1 (a varchar(20));
|
create table t1 (a varchar(20));
|
||||||
insert into t1 values ('foo');
|
insert into t1 values ('foo');
|
||||||
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
||||||
ERROR 42000: FUNCTION test.char_length does not exist
|
prepare stmt2 FROM 'SELECT not_a_function (a) FROM t1';
|
||||||
|
ERROR 42000: FUNCTION test.not_a_function does not exist
|
||||||
drop table t1;
|
drop table t1;
|
||||||
prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0";
|
prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0";
|
||||||
execute stmt;
|
execute stmt;
|
||||||
@ -956,11 +957,108 @@ GROUP_CONCAT(Track SEPARATOR ', ')
|
|||||||
CAD
|
CAD
|
||||||
DEALLOCATE PREPARE STMT;
|
DEALLOCATE PREPARE STMT;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
End of 4.1 tests
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 (i INT, INDEX(i));
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
PREPARE stmt FROM "SELECT (COUNT(i) = 1), COUNT(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(COUNT(i) = 1) COUNT(i)
|
||||||
|
0 0
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(COUNT(i) = 1) COUNT(i)
|
||||||
|
1 1
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(COUNT(i) = 1) COUNT(i)
|
||||||
|
0 0
|
||||||
|
PREPARE stmt FROM "SELECT (AVG(i) = 1), AVG(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(AVG(i) = 1) AVG(i)
|
||||||
|
NULL NULL
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(AVG(i) = 1) AVG(i)
|
||||||
|
1 1.0000
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(AVG(i) = 1) AVG(i)
|
||||||
|
NULL NULL
|
||||||
|
PREPARE stmt FROM "SELECT (VARIANCE(i) = 1), VARIANCE(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(VARIANCE(i) = 1) VARIANCE(i)
|
||||||
|
NULL NULL
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(VARIANCE(i) = 1) VARIANCE(i)
|
||||||
|
0 0.0000
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(VARIANCE(i) = 1) VARIANCE(i)
|
||||||
|
NULL NULL
|
||||||
|
PREPARE stmt FROM "SELECT (STDDEV(i) = 1), STDDEV(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(STDDEV(i) = 1) STDDEV(i)
|
||||||
|
NULL NULL
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(STDDEV(i) = 1) STDDEV(i)
|
||||||
|
0 0.0000
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(STDDEV(i) = 1) STDDEV(i)
|
||||||
|
NULL NULL
|
||||||
|
PREPARE stmt FROM "SELECT (BIT_OR(i) = 1), BIT_OR(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_OR(i) = 1) BIT_OR(i)
|
||||||
|
0 0
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_OR(i) = 1) BIT_OR(i)
|
||||||
|
1 1
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_OR(i) = 1) BIT_OR(i)
|
||||||
|
0 0
|
||||||
|
PREPARE stmt FROM "SELECT (BIT_AND(i) = 1), BIT_AND(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_AND(i) = 1) BIT_AND(i)
|
||||||
|
0 18446744073709551615
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_AND(i) = 1) BIT_AND(i)
|
||||||
|
1 1
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_AND(i) = 1) BIT_AND(i)
|
||||||
|
0 18446744073709551615
|
||||||
|
PREPARE stmt FROM "SELECT (BIT_XOR(i) = 1), BIT_XOR(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_XOR(i) = 1) BIT_XOR(i)
|
||||||
|
0 0
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_XOR(i) = 1) BIT_XOR(i)
|
||||||
|
1 1
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
(BIT_XOR(i) = 1) BIT_XOR(i)
|
||||||
|
0 0
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
DROP TABLE t1;
|
||||||
|
End of 4.1 tests.
|
||||||
create table t1 (a varchar(20));
|
create table t1 (a varchar(20));
|
||||||
insert into t1 values ('foo');
|
insert into t1 values ('foo');
|
||||||
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
||||||
ERROR 42000: FUNCTION test.char_length does not exist
|
prepare stmt2 FROM 'SELECT not_a_function (a) FROM t1';
|
||||||
|
ERROR 42000: FUNCTION test.not_a_function does not exist
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a char(3) not null, b char(3) not null,
|
create table t1 (a char(3) not null, b char(3) not null,
|
||||||
c char(3) not null, primary key (a, b, c));
|
c char(3) not null, primary key (a, b, c));
|
||||||
@ -1379,6 +1477,7 @@ i
|
|||||||
1
|
1
|
||||||
DEALLOCATE PREPARE stmt;
|
DEALLOCATE PREPARE stmt;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
End of 5.0 tests.
|
End of 5.0 tests.
|
||||||
create procedure proc_1() reset query cache;
|
create procedure proc_1() reset query cache;
|
||||||
call proc_1();
|
call proc_1();
|
||||||
|
@ -54,6 +54,7 @@ Tables_in_test
|
|||||||
t2
|
t2
|
||||||
t4
|
t4
|
||||||
drop table t2, t4;
|
drop table t2, t4;
|
||||||
|
End of 4.1 tests
|
||||||
create table t1(f1 int);
|
create table t1(f1 int);
|
||||||
create view v1 as select * from t1;
|
create view v1 as select * from t1;
|
||||||
alter table v1 rename to v2;
|
alter table v1 rename to v2;
|
||||||
@ -64,3 +65,4 @@ rename table v2 to v1;
|
|||||||
ERROR 42S01: Table 'v1' already exists
|
ERROR 42S01: Table 'v1' already exists
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
End of 5.0 tests
|
||||||
|
@ -1226,6 +1226,30 @@ END;
|
|||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS bug14702()
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS bug14702()
|
||||||
BEGIN
|
BEGIN
|
||||||
END' at line 1
|
END' at line 1
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
||||||
|
ERROR HY000: View's SELECT contains a 'INTO' clause
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
||||||
|
ERROR HY000: View's SELECT contains a 'INTO' clause
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
||||||
|
ERROR HY000: View's SELECT contains a 'INTO' clause
|
||||||
|
CREATE PROCEDURE bug20953()
|
||||||
|
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
||||||
|
ERROR HY000: View's SELECT contains a 'PROCEDURE' clause
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 FROM (SELECT 1) AS d1;
|
||||||
|
ERROR HY000: View's SELECT contains a subquery in the FROM clause
|
||||||
|
CREATE PROCEDURE bug20953(i INT) CREATE VIEW v AS SELECT i;
|
||||||
|
ERROR HY000: View's SELECT contains a variable or parameter
|
||||||
|
CREATE PROCEDURE bug20953()
|
||||||
|
BEGIN
|
||||||
|
DECLARE i INT;
|
||||||
|
CREATE VIEW v AS SELECT i;
|
||||||
|
END |
|
||||||
|
ERROR HY000: View's SELECT contains a variable or parameter
|
||||||
|
PREPARE stmt FROM "CREATE VIEW v AS SELECT ?";
|
||||||
|
ERROR HY000: View's SELECT contains a variable or parameter
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
drop function if exists bug16164;
|
drop function if exists bug16164;
|
||||||
create function bug16164() returns int
|
create function bug16164() returns int
|
||||||
@ -1234,9 +1258,9 @@ show authors;
|
|||||||
return 42;
|
return 42;
|
||||||
end|
|
end|
|
||||||
ERROR 0A000: Not allowed to return a result set from a function
|
ERROR 0A000: Not allowed to return a result set from a function
|
||||||
drop function if exists bug20701|
|
drop function if exists bug20701;
|
||||||
create function bug20701() returns varchar(25) binary return "test"|
|
create function bug20701() returns varchar(25) binary return "test";
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'return value collation'
|
ERROR 42000: This version of MySQL doesn't yet support 'return value collation'
|
||||||
create function bug20701() returns varchar(25) return "test"|
|
create function bug20701() returns varchar(25) return "test";
|
||||||
drop function bug20701|
|
drop function bug20701;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -4,6 +4,7 @@ DROP FUNCTION IF EXISTS sp_vars_check_ret1;
|
|||||||
DROP FUNCTION IF EXISTS sp_vars_check_ret2;
|
DROP FUNCTION IF EXISTS sp_vars_check_ret2;
|
||||||
DROP FUNCTION IF EXISTS sp_vars_check_ret3;
|
DROP FUNCTION IF EXISTS sp_vars_check_ret3;
|
||||||
DROP FUNCTION IF EXISTS sp_vars_check_ret4;
|
DROP FUNCTION IF EXISTS sp_vars_check_ret4;
|
||||||
|
DROP FUNCTION IF EXISTS sp_vars_div_zero;
|
||||||
SET @@sql_mode = 'ansi';
|
SET @@sql_mode = 'ansi';
|
||||||
CREATE PROCEDURE sp_vars_check_dflt()
|
CREATE PROCEDURE sp_vars_check_dflt()
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -88,6 +89,12 @@ CREATE FUNCTION sp_vars_check_ret4() RETURNS DECIMAL(64, 2)
|
|||||||
BEGIN
|
BEGIN
|
||||||
RETURN 12 * 10 + 34 + 0.1234;
|
RETURN 12 * 10 + 34 + 0.1234;
|
||||||
END|
|
END|
|
||||||
|
CREATE FUNCTION sp_vars_div_zero() RETURNS INTEGER
|
||||||
|
BEGIN
|
||||||
|
DECLARE div_zero INTEGER;
|
||||||
|
SELECT 1/0 INTO div_zero;
|
||||||
|
RETURN div_zero;
|
||||||
|
END|
|
||||||
|
|
||||||
---------------------------------------------------------------
|
---------------------------------------------------------------
|
||||||
Calling the routines, created in ANSI mode.
|
Calling the routines, created in ANSI mode.
|
||||||
@ -172,6 +179,9 @@ sp_vars_check_ret4()
|
|||||||
154.12
|
154.12
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
|
Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
|
||||||
|
SELECT sp_vars_div_zero();
|
||||||
|
sp_vars_div_zero()
|
||||||
|
NULL
|
||||||
SET @@sql_mode = 'traditional';
|
SET @@sql_mode = 'traditional';
|
||||||
|
|
||||||
---------------------------------------------------------------
|
---------------------------------------------------------------
|
||||||
@ -257,12 +267,16 @@ sp_vars_check_ret4()
|
|||||||
154.12
|
154.12
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
|
Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
|
||||||
|
SELECT sp_vars_div_zero();
|
||||||
|
sp_vars_div_zero()
|
||||||
|
NULL
|
||||||
DROP PROCEDURE sp_vars_check_dflt;
|
DROP PROCEDURE sp_vars_check_dflt;
|
||||||
DROP PROCEDURE sp_vars_check_assignment;
|
DROP PROCEDURE sp_vars_check_assignment;
|
||||||
DROP FUNCTION sp_vars_check_ret1;
|
DROP FUNCTION sp_vars_check_ret1;
|
||||||
DROP FUNCTION sp_vars_check_ret2;
|
DROP FUNCTION sp_vars_check_ret2;
|
||||||
DROP FUNCTION sp_vars_check_ret3;
|
DROP FUNCTION sp_vars_check_ret3;
|
||||||
DROP FUNCTION sp_vars_check_ret4;
|
DROP FUNCTION sp_vars_check_ret4;
|
||||||
|
DROP FUNCTION sp_vars_div_zero;
|
||||||
CREATE PROCEDURE sp_vars_check_dflt()
|
CREATE PROCEDURE sp_vars_check_dflt()
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE v1 TINYINT DEFAULT 1e200;
|
DECLARE v1 TINYINT DEFAULT 1e200;
|
||||||
@ -346,6 +360,12 @@ CREATE FUNCTION sp_vars_check_ret4() RETURNS DECIMAL(64, 2)
|
|||||||
BEGIN
|
BEGIN
|
||||||
RETURN 12 * 10 + 34 + 0.1234;
|
RETURN 12 * 10 + 34 + 0.1234;
|
||||||
END|
|
END|
|
||||||
|
CREATE FUNCTION sp_vars_div_zero() RETURNS INTEGER
|
||||||
|
BEGIN
|
||||||
|
DECLARE div_zero INTEGER;
|
||||||
|
SELECT 1/0 INTO div_zero;
|
||||||
|
RETURN div_zero;
|
||||||
|
END|
|
||||||
|
|
||||||
---------------------------------------------------------------
|
---------------------------------------------------------------
|
||||||
Calling the routines, created in TRADITIONAL mode.
|
Calling the routines, created in TRADITIONAL mode.
|
||||||
@ -366,6 +386,8 @@ sp_vars_check_ret4()
|
|||||||
154.12
|
154.12
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
|
Note 1265 Data truncated for column 'sp_vars_check_ret4()' at row 1
|
||||||
|
SELECT sp_vars_div_zero();
|
||||||
|
ERROR 22012: Division by 0
|
||||||
SET @@sql_mode = 'ansi';
|
SET @@sql_mode = 'ansi';
|
||||||
DROP PROCEDURE sp_vars_check_dflt;
|
DROP PROCEDURE sp_vars_check_dflt;
|
||||||
DROP PROCEDURE sp_vars_check_assignment;
|
DROP PROCEDURE sp_vars_check_assignment;
|
||||||
@ -373,6 +395,7 @@ DROP FUNCTION sp_vars_check_ret1;
|
|||||||
DROP FUNCTION sp_vars_check_ret2;
|
DROP FUNCTION sp_vars_check_ret2;
|
||||||
DROP FUNCTION sp_vars_check_ret3;
|
DROP FUNCTION sp_vars_check_ret3;
|
||||||
DROP FUNCTION sp_vars_check_ret4;
|
DROP FUNCTION sp_vars_check_ret4;
|
||||||
|
DROP FUNCTION sp_vars_div_zero;
|
||||||
|
|
||||||
---------------------------------------------------------------
|
---------------------------------------------------------------
|
||||||
BIT data type tests
|
BIT data type tests
|
||||||
|
@ -5470,5 +5470,161 @@ CAD
|
|||||||
CHF
|
CHF
|
||||||
DROP FUNCTION bug21493|
|
DROP FUNCTION bug21493|
|
||||||
DROP TABLE t3,t4|
|
DROP TABLE t3,t4|
|
||||||
|
drop function if exists func_20028_a|
|
||||||
|
drop function if exists func_20028_b|
|
||||||
|
drop function if exists func_20028_c|
|
||||||
|
drop procedure if exists proc_20028_a|
|
||||||
|
drop procedure if exists proc_20028_b|
|
||||||
|
drop procedure if exists proc_20028_c|
|
||||||
|
drop table if exists table_20028|
|
||||||
|
create table table_20028 (i int)|
|
||||||
|
SET @save_sql_mode=@@sql_mode|
|
||||||
|
SET sql_mode=''|
|
||||||
|
create function func_20028_a() returns integer
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
return ifnull(temp, 0);
|
||||||
|
end|
|
||||||
|
create function func_20028_b() returns integer
|
||||||
|
begin
|
||||||
|
return func_20028_a();
|
||||||
|
end|
|
||||||
|
create function func_20028_c() returns integer
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='TRADITIONAL';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
return div_zero;
|
||||||
|
end|
|
||||||
|
create procedure proc_20028_a()
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
end|
|
||||||
|
create procedure proc_20028_b()
|
||||||
|
begin
|
||||||
|
call proc_20028_a();
|
||||||
|
end|
|
||||||
|
create procedure proc_20028_c()
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='TRADITIONAL';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
end|
|
||||||
|
select func_20028_a()|
|
||||||
|
func_20028_a()
|
||||||
|
0
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
select func_20028_b()|
|
||||||
|
func_20028_b()
|
||||||
|
0
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
select func_20028_c()|
|
||||||
|
ERROR 22012: Division by 0
|
||||||
|
call proc_20028_a()|
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
call proc_20028_b()|
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
call proc_20028_c()|
|
||||||
|
ERROR 22012: Division by 0
|
||||||
|
SET sql_mode='TRADITIONAL'|
|
||||||
|
drop function func_20028_a|
|
||||||
|
drop function func_20028_b|
|
||||||
|
drop function func_20028_c|
|
||||||
|
drop procedure proc_20028_a|
|
||||||
|
drop procedure proc_20028_b|
|
||||||
|
drop procedure proc_20028_c|
|
||||||
|
create function func_20028_a() returns integer
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
return ifnull(temp, 0);
|
||||||
|
end|
|
||||||
|
create function func_20028_b() returns integer
|
||||||
|
begin
|
||||||
|
return func_20028_a();
|
||||||
|
end|
|
||||||
|
create function func_20028_c() returns integer
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
return div_zero;
|
||||||
|
end|
|
||||||
|
create procedure proc_20028_a()
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
end|
|
||||||
|
create procedure proc_20028_b()
|
||||||
|
begin
|
||||||
|
call proc_20028_a();
|
||||||
|
end|
|
||||||
|
create procedure proc_20028_c()
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
end|
|
||||||
|
select func_20028_a()|
|
||||||
|
func_20028_a()
|
||||||
|
0
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
select func_20028_b()|
|
||||||
|
func_20028_b()
|
||||||
|
0
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
select func_20028_c()|
|
||||||
|
func_20028_c()
|
||||||
|
NULL
|
||||||
|
call proc_20028_a()|
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
call proc_20028_b()|
|
||||||
|
Warnings:
|
||||||
|
Warning 1329 No data - zero rows fetched, selected, or processed
|
||||||
|
call proc_20028_c()|
|
||||||
|
SET @@sql_mode=@save_sql_mode|
|
||||||
|
drop function func_20028_a|
|
||||||
|
drop function func_20028_b|
|
||||||
|
drop function func_20028_c|
|
||||||
|
drop procedure proc_20028_a|
|
||||||
|
drop procedure proc_20028_b|
|
||||||
|
drop procedure proc_20028_c|
|
||||||
|
drop table table_20028|
|
||||||
|
drop procedure if exists proc_21462_a|
|
||||||
|
drop procedure if exists proc_21462_b|
|
||||||
|
create procedure proc_21462_a()
|
||||||
|
begin
|
||||||
|
select "Called A";
|
||||||
|
end|
|
||||||
|
create procedure proc_21462_b(x int)
|
||||||
|
begin
|
||||||
|
select "Called B";
|
||||||
|
end|
|
||||||
|
call proc_21462_a|
|
||||||
|
Called A
|
||||||
|
Called A
|
||||||
|
call proc_21462_a()|
|
||||||
|
Called A
|
||||||
|
Called A
|
||||||
|
call proc_21462_a(1)|
|
||||||
|
ERROR 42000: Incorrect number of arguments for PROCEDURE test.proc_21462_a; expected 0, got 1
|
||||||
|
call proc_21462_b|
|
||||||
|
ERROR 42000: Incorrect number of arguments for PROCEDURE test.proc_21462_b; expected 1, got 0
|
||||||
|
call proc_21462_b()|
|
||||||
|
ERROR 42000: Incorrect number of arguments for PROCEDURE test.proc_21462_b; expected 1, got 0
|
||||||
|
call proc_21462_b(1)|
|
||||||
|
Called B
|
||||||
|
Called B
|
||||||
|
drop procedure proc_21462_a|
|
||||||
|
drop procedure proc_21462_b|
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
@ -1073,10 +1073,11 @@ SELECT @x;
|
|||||||
NULL
|
NULL
|
||||||
SET @x=2;
|
SET @x=2;
|
||||||
UPDATE t1 SET i1 = @x;
|
UPDATE t1 SET i1 = @x;
|
||||||
ERROR 22012: Division by 0
|
Warnings:
|
||||||
|
Error 1365 Division by 0
|
||||||
SELECT @x;
|
SELECT @x;
|
||||||
@x
|
@x
|
||||||
2
|
NULL
|
||||||
SET SQL_MODE='';
|
SET SQL_MODE='';
|
||||||
SET @x=3;
|
SET @x=3;
|
||||||
INSERT INTO t1 VALUES (@x);
|
INSERT INTO t1 VALUES (@x);
|
||||||
@ -1085,10 +1086,12 @@ SELECT @x;
|
|||||||
NULL
|
NULL
|
||||||
SET @x=4;
|
SET @x=4;
|
||||||
UPDATE t1 SET i1 = @x;
|
UPDATE t1 SET i1 = @x;
|
||||||
ERROR 22012: Division by 0
|
Warnings:
|
||||||
|
Error 1365 Division by 0
|
||||||
|
Error 1365 Division by 0
|
||||||
SELECT @x;
|
SELECT @x;
|
||||||
@x
|
@x
|
||||||
4
|
NULL
|
||||||
SET @@sql_mode=@save_sql_mode;
|
SET @@sql_mode=@save_sql_mode;
|
||||||
DROP TRIGGER t1_ai;
|
DROP TRIGGER t1_ai;
|
||||||
DROP TRIGGER t1_au;
|
DROP TRIGGER t1_au;
|
||||||
@ -1174,6 +1177,59 @@ ERROR HY000: String '1234567890abcdefghij1234567890abcdefghij1234567890abcdefghi
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
|
drop table if exists t2;
|
||||||
|
drop table if exists t3;
|
||||||
|
drop table if exists t4;
|
||||||
|
SET @save_sql_mode=@@sql_mode;
|
||||||
|
SET sql_mode='TRADITIONAL'|
|
||||||
|
create table t1 (id int(10) not null primary key, v int(10) )|
|
||||||
|
create table t2 (id int(10) not null primary key, v int(10) )|
|
||||||
|
create table t3 (id int(10) not null primary key, v int(10) )|
|
||||||
|
create table t4 (c int)|
|
||||||
|
create trigger t4_bi before insert on t4 for each row set @t4_bi_called:=1|
|
||||||
|
create trigger t4_bu before update on t4 for each row set @t4_bu_called:=1|
|
||||||
|
insert into t1 values(10, 10)|
|
||||||
|
set @a:=1/0|
|
||||||
|
Warnings:
|
||||||
|
Error 1365 Division by 0
|
||||||
|
select 1/0 from t1|
|
||||||
|
1/0
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Error 1365 Division by 0
|
||||||
|
create trigger t1_bi before insert on t1 for each row set @a:=1/0|
|
||||||
|
insert into t1 values(20, 20)|
|
||||||
|
Warnings:
|
||||||
|
Error 1365 Division by 0
|
||||||
|
drop trigger t1_bi|
|
||||||
|
create trigger t1_bi before insert on t1 for each row
|
||||||
|
begin
|
||||||
|
insert into t2 values (new.id, new.v);
|
||||||
|
update t2 set v=v+1 where id= new.id;
|
||||||
|
replace t3 values (new.id, 0);
|
||||||
|
update t2, t3 set t2.v=new.v, t3.v=new.v where t2.id=t3.id;
|
||||||
|
create temporary table t5 select * from t1;
|
||||||
|
delete from t5;
|
||||||
|
insert into t5 select * from t1;
|
||||||
|
insert into t4 values (0);
|
||||||
|
set @check= (select count(*) from t5);
|
||||||
|
update t4 set c= @check;
|
||||||
|
drop temporary table t5;
|
||||||
|
set @a:=1/0;
|
||||||
|
end|
|
||||||
|
set @check=0, @t4_bi_called=0, @t4_bu_called=0|
|
||||||
|
insert into t1 values(30, 30)|
|
||||||
|
Warnings:
|
||||||
|
Error 1365 Division by 0
|
||||||
|
select @check, @t4_bi_called, @t4_bu_called|
|
||||||
|
@check @t4_bi_called @t4_bu_called
|
||||||
|
2 1 1
|
||||||
|
SET @@sql_mode=@save_sql_mode;
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
drop table t3;
|
||||||
|
drop table t4;
|
||||||
|
drop table if exists t1;
|
||||||
create table t1 (i int, j int key);
|
create table t1 (i int, j int key);
|
||||||
insert into t1 values (1,1), (2,2), (3,3);
|
insert into t1 values (1,1), (2,2), (3,3);
|
||||||
create trigger t1_bu before update on t1 for each row
|
create trigger t1_bu before update on t1 for each row
|
||||||
|
@ -12,6 +12,9 @@ create table t1 (a int, b int);
|
|||||||
insert into t1 values (1,2), (1,3), (2,4), (2,5), (3,10);
|
insert into t1 values (1,2), (1,3), (2,4), (2,5), (3,10);
|
||||||
create view v1 (c,d) as select a,b+@@global.max_user_connections from t1;
|
create view v1 (c,d) as select a,b+@@global.max_user_connections from t1;
|
||||||
ERROR HY000: View's SELECT contains a variable or parameter
|
ERROR HY000: View's SELECT contains a variable or parameter
|
||||||
|
create view v1 (c,d) as select a,b from t1
|
||||||
|
where a = @@global.max_user_connections;
|
||||||
|
ERROR HY000: View's SELECT contains a variable or parameter
|
||||||
create view v1 (c) as select b+1 from t1;
|
create view v1 (c) as select b+1 from t1;
|
||||||
select c from v1;
|
select c from v1;
|
||||||
c
|
c
|
||||||
@ -596,11 +599,6 @@ ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function
|
|||||||
drop view v1;
|
drop view v1;
|
||||||
create view v1 (a,a) as select 'a','a';
|
create view v1 (a,a) as select 'a','a';
|
||||||
ERROR 42S21: Duplicate column name 'a'
|
ERROR 42S21: Duplicate column name 'a'
|
||||||
drop procedure if exists p1;
|
|
||||||
create procedure p1 () begin declare v int; create view v1 as select v; end;//
|
|
||||||
call p1();
|
|
||||||
ERROR HY000: View's SELECT contains a variable or parameter
|
|
||||||
drop procedure p1;
|
|
||||||
create table t1 (col1 int,col2 char(22));
|
create table t1 (col1 int,col2 char(22));
|
||||||
insert into t1 values(5,'Hello, world of views');
|
insert into t1 values(5,'Hello, world of views');
|
||||||
create view v1 as select * from t1;
|
create view v1 as select * from t1;
|
||||||
@ -793,13 +791,13 @@ test.`f``1` ()
|
|||||||
5
|
5
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop function `f``1`;
|
drop function `f``1`;
|
||||||
create function x () returns int return 5;
|
create function a() returns int return 5;
|
||||||
create view v1 as select x ();
|
create view v1 as select a();
|
||||||
select * from v1;
|
select * from v1;
|
||||||
x ()
|
a()
|
||||||
5
|
5
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop function x;
|
drop function a;
|
||||||
create table t2 (col1 char collate latin1_german2_ci);
|
create table t2 (col1 char collate latin1_german2_ci);
|
||||||
create view v2 as select col1 collate latin1_german1_ci from t2;
|
create view v2 as select col1 collate latin1_german1_ci from t2;
|
||||||
show create view v2;
|
show create view v2;
|
||||||
@ -886,6 +884,8 @@ ERROR HY000: View's SELECT contains a 'INTO' clause
|
|||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
create view v1 as select a from t1 procedure analyse();
|
create view v1 as select a from t1 procedure analyse();
|
||||||
ERROR HY000: View's SELECT contains a 'PROCEDURE' clause
|
ERROR HY000: View's SELECT contains a 'PROCEDURE' clause
|
||||||
|
create view v1 as select 1 from (select 1) as d1;
|
||||||
|
ERROR HY000: View's SELECT contains a subquery in the FROM clause
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (s1 int, primary key (s1));
|
create table t1 (s1 int, primary key (s1));
|
||||||
create view v1 as select * from t1;
|
create view v1 as select * from t1;
|
||||||
@ -2956,6 +2956,20 @@ View Create View
|
|||||||
v1 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`pk` AS `pk` from (`t1` join `t2` on(((`t2`.`fk` = `t1`.`pk`) and (`t2`.`ver` = (select max(`t`.`ver`) AS `MAX(t.ver)` from `t2` `t` where (`t`.`org` = `t2`.`org`))))))
|
v1 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`pk` AS `pk` from (`t1` join `t2` on(((`t2`.`fk` = `t1`.`pk`) and (`t2`.`ver` = (select max(`t`.`ver`) AS `MAX(t.ver)` from `t2` `t` where (`t`.`org` = `t2`.`org`))))))
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
DROP FUNCTION IF EXISTS f1;
|
||||||
|
DROP VIEW IF EXISTS v1;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
CREATE VIEW v1 AS SELECT MAX(i) FROM t1;
|
||||||
|
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
||||||
|
SET NEW.i = (SELECT * FROM v1) + 1;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
CREATE FUNCTION f1() RETURNS INT RETURN (SELECT * FROM v1);
|
||||||
|
UPDATE t1 SET i= f1();
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
CREATE TABLE t1(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, val INT UNSIGNED NOT NULL);
|
CREATE TABLE t1(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, val INT UNSIGNED NOT NULL);
|
||||||
CREATE VIEW v1 AS SELECT id, val FROM t1 WHERE val >= 1 AND val <= 5 WITH CHECK OPTION;
|
CREATE VIEW v1 AS SELECT id, val FROM t1 WHERE val >= 1 AND val <= 5 WITH CHECK OPTION;
|
||||||
INSERT INTO v1 (val) VALUES (2);
|
INSERT INTO v1 (val) VALUES (2);
|
||||||
@ -2966,4 +2980,38 @@ UPDATE v1 SET val=6 WHERE id=2;
|
|||||||
ERROR HY000: CHECK OPTION failed 'test.v1'
|
ERROR HY000: CHECK OPTION failed 'test.v1'
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
DROP VIEW IF EXISTS v1, v2;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY, j INT);
|
||||||
|
CREATE VIEW v1 AS SELECT j FROM t1;
|
||||||
|
CREATE VIEW v2 AS SELECT * FROM t1;
|
||||||
|
INSERT INTO t1 (j) VALUES (1);
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
LAST_INSERT_ID()
|
||||||
|
1
|
||||||
|
INSERT INTO v1 (j) VALUES (2);
|
||||||
|
# LAST_INSERT_ID() should not change.
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
LAST_INSERT_ID()
|
||||||
|
1
|
||||||
|
INSERT INTO v2 (j) VALUES (3);
|
||||||
|
# LAST_INSERT_ID() should be updated.
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
LAST_INSERT_ID()
|
||||||
|
3
|
||||||
|
INSERT INTO v1 (j) SELECT j FROM t1;
|
||||||
|
# LAST_INSERT_ID() should not change.
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
LAST_INSERT_ID()
|
||||||
|
3
|
||||||
|
SELECT * FROM t1;
|
||||||
|
i j
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
3 3
|
||||||
|
4 1
|
||||||
|
5 2
|
||||||
|
6 3
|
||||||
|
DROP VIEW v1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.0 tests.
|
End of 5.0 tests.
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
#events : BUG#17619 2006-02-21 andrey Race conditions
|
#events : BUG#17619 2006-02-21 andrey Race conditions
|
||||||
#events_scheduling : BUG#19170 2006-04-26 andrey Test case of 19170 fails on some platforms. Has to be checked.
|
#events_scheduling : BUG#19170 2006-04-26 andrey Test case of 19170 fails on some platforms. Has to be checked.
|
||||||
im_options : Bug#20294 2006-07-24 stewart Instance manager test im_options fails randomly
|
im_options : Bug#20294 2006-07-24 stewart Instance manager test im_options fails randomly
|
||||||
#im_life_cycle : Bug#20368 2006-06-10 alik im_life_cycle test fails
|
|
||||||
im_daemon_life_cycle : BUG#22379 2006-09-15 ingo im_daemon_life_cycle.test fails on merge of 5.1 -> 5.1-engines
|
|
||||||
im_instance_conf : BUG#20294 2006-09-16 ingo Instance manager test im_instance_conf fails randomly
|
im_instance_conf : BUG#20294 2006-09-16 ingo Instance manager test im_instance_conf fails randomly
|
||||||
concurrent_innodb : BUG#21579 2006-08-11 mleich innodb_concurrent random failures with varying differences
|
concurrent_innodb : BUG#21579 2006-08-11 mleich innodb_concurrent random failures with varying differences
|
||||||
ndb_autodiscover : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
|
ndb_autodiscover : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
|
||||||
|
@ -222,13 +222,13 @@ drop database mysqltest_db1;
|
|||||||
#
|
#
|
||||||
# START - BUG#16394: Events: Crash if schedule contains SELECT
|
# START - BUG#16394: Events: Crash if schedule contains SELECT
|
||||||
#
|
#
|
||||||
--error ER_PARSE_ERROR
|
--error ER_NOT_SUPPORTED_YET
|
||||||
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
||||||
--error ER_PARSE_ERROR
|
--error ER_NOT_SUPPORTED_YET
|
||||||
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
||||||
--error ER_PARSE_ERROR
|
--error ER_NOT_SUPPORTED_YET
|
||||||
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
||||||
--error ER_PARSE_ERROR
|
--error ER_NOT_SUPPORTED_YET
|
||||||
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
||||||
#
|
#
|
||||||
# END - BUG#16394: Events: Crash if schedule contains SELECT
|
# END - BUG#16394: Events: Crash if schedule contains SELECT
|
||||||
@ -253,4 +253,47 @@ call p_16();
|
|||||||
|
|
||||||
drop procedure p_16;
|
drop procedure p_16;
|
||||||
drop event e_16;
|
drop event e_16;
|
||||||
|
|
||||||
|
#
|
||||||
|
# START - BUG#22830 Events: crash with procedure which alters events with function
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
drop function if exists f22830;
|
||||||
|
drop event if exists e22830;
|
||||||
|
drop event if exists e22830_1;
|
||||||
|
drop event if exists e22830_2;
|
||||||
|
drop event if exists e22830_3;
|
||||||
|
drop event if exists e22830_4;
|
||||||
|
drop table if exists t1;
|
||||||
|
drop table if exists t2;
|
||||||
|
--enable_warnings
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (2);
|
||||||
|
create table t2 (a char(20));
|
||||||
|
insert into t2 values ("e22830_1");
|
||||||
|
create function f22830 () returns int return 5;
|
||||||
|
--error ER_NOT_SUPPORTED_YET
|
||||||
|
create event e22830 on schedule every f22830() second do select 123;
|
||||||
|
create event e22830_1 on schedule every 1 hour do alter event e22830_1 on schedule every (select 8 from dual) hour;
|
||||||
|
create event e22830_2 on schedule every 1 hour do alter event e22830_2 on schedule every (select 8 from t1) hour;
|
||||||
|
create event e22830_3 on schedule every 1 hour do alter event e22830_3 on schedule every f22830() hour;
|
||||||
|
create event e22830_4 on schedule every 1 hour do alter event e22830_4 on schedule every (select f22830() from dual) hour;
|
||||||
|
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
||||||
|
set global event_scheduler=on;
|
||||||
|
--sleep 0.7
|
||||||
|
set global event_scheduler=off;
|
||||||
|
select event_name, event_definition, interval_value, interval_field from information_schema.events order by event_name;
|
||||||
|
drop function f22830;
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
drop event (select a from t2);
|
||||||
|
drop event e22830_1;
|
||||||
|
drop event e22830_2;
|
||||||
|
drop event e22830_3;
|
||||||
|
drop event e22830_4;
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# End of tests
|
||||||
|
#
|
||||||
drop database events_test;
|
drop database events_test;
|
||||||
|
@ -9,7 +9,7 @@ use events_test;
|
|||||||
CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
|
CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
|
||||||
--replace_column 8 # 9 #
|
--replace_column 8 # 9 #
|
||||||
SHOW EVENTS;
|
SHOW EVENTS;
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT from information_schema.events;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
CREATE DATABASE events_test2;
|
CREATE DATABASE events_test2;
|
||||||
CREATE USER ev_test@localhost;
|
CREATE USER ev_test@localhost;
|
||||||
GRANT ALL ON events_test.* to ev_test@localhost;
|
GRANT ALL ON events_test.* to ev_test@localhost;
|
||||||
@ -55,10 +55,10 @@ CREATE EVENT four_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
|||||||
connection default;
|
connection default;
|
||||||
USE events_test;
|
USE events_test;
|
||||||
--echo "We should see 4 events : one_event, two_event, three_event & four_event"
|
--echo "We should see 4 events : one_event, two_event, three_event & four_event"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
DROP DATABASE events_test2;
|
DROP DATABASE events_test2;
|
||||||
--echo "We should see 3 events : one_event, two_event, three_event"
|
--echo "We should see 3 events : one_event, two_event, three_event"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
|
|
||||||
connection default;
|
connection default;
|
||||||
CREATE DATABASE events_test2;
|
CREATE DATABASE events_test2;
|
||||||
@ -67,13 +67,13 @@ CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
|||||||
|
|
||||||
connection ev_con1;
|
connection ev_con1;
|
||||||
--echo "Should see 4 events - one, two, three & five"
|
--echo "Should see 4 events - one, two, three & five"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
connection default;
|
connection default;
|
||||||
REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
|
REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
|
||||||
connection ev_con1;
|
connection ev_con1;
|
||||||
USE test;
|
USE test;
|
||||||
--echo "Should see 3 events - one, two & three"
|
--echo "Should see 3 events - one, two & three"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
--echo "Let's test ALTER EVENT which changes the definer"
|
--echo "Let's test ALTER EVENT which changes the definer"
|
||||||
USE events_test;
|
USE events_test;
|
||||||
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
|
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
|
||||||
@ -96,7 +96,7 @@ connection ev_con1;
|
|||||||
DROP EVENT one_event;
|
DROP EVENT one_event;
|
||||||
connection default;
|
connection default;
|
||||||
--echo "One event should not be there"
|
--echo "One event should not be there"
|
||||||
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
|
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME;
|
||||||
disconnect ev_con1;
|
disconnect ev_con1;
|
||||||
connection default;
|
connection default;
|
||||||
DROP USER ev_test@localhost;
|
DROP USER ev_test@localhost;
|
||||||
|
@ -98,7 +98,7 @@ select ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'withou
|
|||||||
select distinct ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'with distinct: cutoff at length of shortname' from t1;
|
select distinct ifnull(group_concat(concat(t1.id, ':', t1.name)), 'shortname') as 'with distinct: cutoff at length of shortname' from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
# check zero rows
|
# check zero rows (bug#836)
|
||||||
create table t1(id int);
|
create table t1(id int);
|
||||||
create table t2(id int);
|
create table t2(id int);
|
||||||
insert into t1 values(0),(1);
|
insert into t1 values(0),(1);
|
||||||
|
@ -34,6 +34,11 @@ select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6)
|
|||||||
explain extended select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
|
explain extended select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6);
|
||||||
select degrees(pi()),radians(360);
|
select degrees(pi()),radians(360);
|
||||||
|
|
||||||
|
select format(atan(-2, 2), 6);
|
||||||
|
select format(atan(pi(), 0), 6);
|
||||||
|
select format(atan2(-2, 2), 6);
|
||||||
|
select format(atan2(pi(), 0), 6);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #2338 Trignometric arithmatic problems
|
# Bug #2338 Trignometric arithmatic problems
|
||||||
#
|
#
|
||||||
|
@ -17,6 +17,12 @@
|
|||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
|
# Wait for IM to start accepting connections.
|
||||||
|
|
||||||
|
--exec $MYSQL_TEST_DIR/t/wait_for_socket.sh $EXE_MYSQL $IM_PATH_SOCK $IM_USERNAME $IM_PASSWORD '' 30
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#12751: Instance Manager: client hangs
|
# BUG#12751: Instance Manager: client hangs
|
||||||
#
|
#
|
||||||
|
@ -48,7 +48,7 @@ select 4;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
--error 1064
|
--error ER_NOT_SUPPORTED_YET
|
||||||
kill (select count(*) from mysql.user);
|
kill (select count(*) from mysql.user);
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -314,6 +314,89 @@ use mysql;
|
|||||||
lock tables general_log read local, help_category read local;
|
lock tables general_log read local, help_category read local;
|
||||||
unlock tables;
|
unlock tables;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #17544 Cannot do atomic log rotate and
|
||||||
|
# Bug #21785 Server crashes after rename of the log table
|
||||||
|
#
|
||||||
|
|
||||||
|
use mysql;
|
||||||
|
# Should result in error
|
||||||
|
--error ER_CANT_RENAME_LOG_TABLE
|
||||||
|
RENAME TABLE general_log TO renamed_general_log;
|
||||||
|
--error ER_CANT_RENAME_LOG_TABLE
|
||||||
|
RENAME TABLE slow_log TO renamed_slow_log;
|
||||||
|
|
||||||
|
#check rotate logs
|
||||||
|
truncate table general_log;
|
||||||
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
||||||
|
select * from general_log;
|
||||||
|
|
||||||
|
truncate table slow_log;
|
||||||
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
||||||
|
select * from slow_log;
|
||||||
|
|
||||||
|
create table general_log_new like general_log;
|
||||||
|
rename table general_log TO renamed_general_log, general_log_new TO general_log;
|
||||||
|
|
||||||
|
create table slow_log_new like slow_log;
|
||||||
|
rename table slow_log TO renamed_slow_log, slow_log_new TO slow_log;
|
||||||
|
|
||||||
|
# check that rename checks more then first table in the list
|
||||||
|
--error ER_CANT_RENAME_LOG_TABLE
|
||||||
|
rename table general_log TO general_log_new, renamed_general_log TO general_log, slow_log to renamed_slow_log;
|
||||||
|
|
||||||
|
# now check the content of tables
|
||||||
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
||||||
|
select * from general_log;
|
||||||
|
--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID
|
||||||
|
select * from renamed_general_log;
|
||||||
|
|
||||||
|
# the content of the slow log is empty, but we will try a select anyway
|
||||||
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
||||||
|
select * from slow_log;
|
||||||
|
--replace_column 1 TIMESTAMP 2 USER_HOST
|
||||||
|
select * from renamed_slow_log;
|
||||||
|
|
||||||
|
# check that we can do whatever we want with disabled log
|
||||||
|
set global general_log='OFF';
|
||||||
|
RENAME TABLE general_log TO general_log2;
|
||||||
|
|
||||||
|
set global slow_query_log='OFF';
|
||||||
|
RENAME TABLE slow_log TO slow_log2;
|
||||||
|
|
||||||
|
# this should fail
|
||||||
|
--error ER_CANT_ACTIVATE_LOG
|
||||||
|
set global general_log='ON';
|
||||||
|
--error ER_CANT_ACTIVATE_LOG
|
||||||
|
set global slow_query_log='ON';
|
||||||
|
|
||||||
|
RENAME TABLE general_log2 TO general_log;
|
||||||
|
RENAME TABLE slow_log2 TO slow_log;
|
||||||
|
|
||||||
|
# this should work
|
||||||
|
set global general_log='ON';
|
||||||
|
set global slow_query_log='ON';
|
||||||
|
# now check flush logs
|
||||||
|
flush logs;
|
||||||
|
flush logs;
|
||||||
|
drop table renamed_general_log, renamed_slow_log;
|
||||||
|
use test;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #21966 Strange warnings on repair of the log tables
|
||||||
|
#
|
||||||
|
|
||||||
|
use mysql;
|
||||||
|
# check that no warning occurs on repair of the log tables
|
||||||
|
repair table general_log;
|
||||||
|
repair table slow_log;
|
||||||
|
# check that no warning occurs on "create like" for the log tables
|
||||||
|
create table general_log_new like general_log;
|
||||||
|
create table slow_log_new like slow_log;
|
||||||
|
show tables like "%log%";
|
||||||
|
drop table slow_log_new, general_log_new;
|
||||||
|
use test;
|
||||||
|
|
||||||
# kill all connections
|
# kill all connections
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
|
510
mysql-test/t/parser.test
Normal file
510
mysql-test/t/parser.test
Normal file
@ -0,0 +1,510 @@
|
|||||||
|
#
|
||||||
|
# This file contains tests covering the parser
|
||||||
|
#
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# LEXICAL PARSER (lex)
|
||||||
|
#=============================================================================
|
||||||
|
|
||||||
|
SET @save_sql_mode=@@sql_mode;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Documenting the current behavior, to detect incompatible changes.
|
||||||
|
# In each cases:
|
||||||
|
# - no error is the correct result
|
||||||
|
# - an error is the expected result with the current implementation,
|
||||||
|
# and is a limitation.
|
||||||
|
|
||||||
|
set SQL_MODE='';
|
||||||
|
|
||||||
|
create table ADDDATE(a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
create table ADDDATE (a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_AND(a int);
|
||||||
|
create table BIT_AND (a int);
|
||||||
|
drop table BIT_AND;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_OR(a int);
|
||||||
|
create table BIT_OR (a int);
|
||||||
|
drop table BIT_OR;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_XOR(a int);
|
||||||
|
create table BIT_XOR (a int);
|
||||||
|
drop table BIT_XOR;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CAST(a int);
|
||||||
|
create table CAST (a int);
|
||||||
|
drop table CAST;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table COUNT(a int);
|
||||||
|
create table COUNT (a int);
|
||||||
|
drop table COUNT;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CURDATE(a int);
|
||||||
|
create table CURDATE (a int);
|
||||||
|
drop table CURDATE;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CURTIME(a int);
|
||||||
|
create table CURTIME (a int);
|
||||||
|
drop table CURTIME;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table DATE_ADD(a int);
|
||||||
|
create table DATE_ADD (a int);
|
||||||
|
drop table DATE_ADD;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table DATE_SUB(a int);
|
||||||
|
create table DATE_SUB (a int);
|
||||||
|
drop table DATE_SUB;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table EXTRACT(a int);
|
||||||
|
create table EXTRACT (a int);
|
||||||
|
drop table EXTRACT;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table GROUP_CONCAT(a int);
|
||||||
|
create table GROUP_CONCAT (a int);
|
||||||
|
drop table GROUP_CONCAT;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table GROUP_UNIQUE_USERS(a int);
|
||||||
|
create table GROUP_UNIQUE_USERS (a int);
|
||||||
|
drop table GROUP_UNIQUE_USERS;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MAX(a int);
|
||||||
|
create table MAX (a int);
|
||||||
|
drop table MAX;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MID(a int);
|
||||||
|
create table MID (a int);
|
||||||
|
drop table MID;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MIN(a int);
|
||||||
|
create table MIN (a int);
|
||||||
|
drop table MIN;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table NOW(a int);
|
||||||
|
create table NOW (a int);
|
||||||
|
drop table NOW;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table POSITION(a int);
|
||||||
|
create table POSITION (a int);
|
||||||
|
drop table POSITION;
|
||||||
|
|
||||||
|
create table SESSION_USER(a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
create table SESSION_USER (a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STD(a int);
|
||||||
|
create table STD (a int);
|
||||||
|
drop table STD;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV(a int);
|
||||||
|
create table STDDEV (a int);
|
||||||
|
drop table STDDEV;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV_POP(a int);
|
||||||
|
create table STDDEV_POP (a int);
|
||||||
|
drop table STDDEV_POP;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV_SAMP(a int);
|
||||||
|
create table STDDEV_SAMP (a int);
|
||||||
|
drop table STDDEV_SAMP;
|
||||||
|
|
||||||
|
create table SUBDATE(a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
create table SUBDATE (a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUBSTR(a int);
|
||||||
|
create table SUBSTR (a int);
|
||||||
|
drop table SUBSTR;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUBSTRING(a int);
|
||||||
|
create table SUBSTRING (a int);
|
||||||
|
drop table SUBSTRING;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUM(a int);
|
||||||
|
create table SUM (a int);
|
||||||
|
drop table SUM;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SYSDATE(a int);
|
||||||
|
create table SYSDATE (a int);
|
||||||
|
drop table SYSDATE;
|
||||||
|
|
||||||
|
create table SYSTEM_USER(a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
create table SYSTEM_USER (a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table TRIM(a int);
|
||||||
|
create table TRIM (a int);
|
||||||
|
drop table TRIM;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table UNIQUE_USERS(a int);
|
||||||
|
create table UNIQUE_USERS (a int);
|
||||||
|
drop table UNIQUE_USERS;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VARIANCE(a int);
|
||||||
|
create table VARIANCE (a int);
|
||||||
|
drop table VARIANCE;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VAR_POP(a int);
|
||||||
|
create table VAR_POP (a int);
|
||||||
|
drop table VAR_POP;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VAR_SAMP(a int);
|
||||||
|
create table VAR_SAMP (a int);
|
||||||
|
drop table VAR_SAMP;
|
||||||
|
|
||||||
|
set SQL_MODE='IGNORE_SPACE';
|
||||||
|
|
||||||
|
create table ADDDATE(a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
create table ADDDATE (a int);
|
||||||
|
drop table ADDDATE;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_AND(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_AND (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_OR(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_OR (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_XOR(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table BIT_XOR (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CAST(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CAST (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table COUNT(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table COUNT (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CURDATE(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CURDATE (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CURTIME(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table CURTIME (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table DATE_ADD(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table DATE_ADD (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table DATE_SUB(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table DATE_SUB (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table EXTRACT(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table EXTRACT (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table GROUP_CONCAT(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table GROUP_CONCAT (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table GROUP_UNIQUE_USERS(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table GROUP_UNIQUE_USERS (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MAX(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MAX (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MID(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MID (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MIN(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table MIN (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table NOW(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table NOW (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table POSITION(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table POSITION (a int);
|
||||||
|
|
||||||
|
create table SESSION_USER(a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
create table SESSION_USER (a int);
|
||||||
|
drop table SESSION_USER;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STD(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STD (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV_POP(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV_POP (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV_SAMP(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table STDDEV_SAMP (a int);
|
||||||
|
|
||||||
|
create table SUBDATE(a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
create table SUBDATE (a int);
|
||||||
|
drop table SUBDATE;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUBSTR(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUBSTR (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUBSTRING(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUBSTRING (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUM(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SUM (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SYSDATE(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table SYSDATE (a int);
|
||||||
|
|
||||||
|
create table SYSTEM_USER(a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
create table SYSTEM_USER (a int);
|
||||||
|
drop table SYSTEM_USER;
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table TRIM(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table TRIM (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table UNIQUE_USERS(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table UNIQUE_USERS (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VARIANCE(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VARIANCE (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VAR_POP(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VAR_POP (a int);
|
||||||
|
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VAR_SAMP(a int);
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
create table VAR_SAMP (a int);
|
||||||
|
|
||||||
|
SET @@sql_mode=@save_sql_mode;
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# SYNTACTIC PARSER (bison)
|
||||||
|
#=============================================================================
|
||||||
|
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Bug#21114 (Foreign key creation fails to table with name format)
|
||||||
|
#
|
||||||
|
|
||||||
|
# Test coverage with edge conditions
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select pi(3.14);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select tan();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select tan(1, 2);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select makedate(1);
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select makedate(1, 2, 3);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select maketime();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select maketime(1);
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select maketime(1, 2);
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select maketime(1, 2, 3, 4);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select atan();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select atan2(1, 2, 3);
|
||||||
|
|
||||||
|
select benchmark(10, 1+1);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select benchmark(5+5, 2);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select concat();
|
||||||
|
select concat("foo");
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select concat_ws();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select concat_ws("foo");
|
||||||
|
|
||||||
|
set @pwd="my password";
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select encode("secret", @pwd);
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select decode("encoded-secret", @pwd);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select encrypt();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select encrypt(1, 2, 3);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select des_encrypt("p1", "p2", "not expected");
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select des_decrypt("p1", "p2", "not expected");
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select elt();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select elt(1);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select export_set();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select export_set("p1");
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select export_set("p1", "p2");
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select export_set("p1", "p2", "p3", "p4", "p5", "p6");
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select field();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select field("p1");
|
||||||
|
|
||||||
|
set @dec=2;
|
||||||
|
-- error ER_WRONG_PARAMETERS_TO_NATIVE_FCT
|
||||||
|
select format(pi(), @dec);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select from_unixtime();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select from_unixtime(1, 2, 3);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select unix_timestamp(1, 2);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select greatest();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select greatest(12);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select last_insert_id(1, 2);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select least();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select least(12);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select locate();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select locate(1);
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select locate(1, 2, 3, 4);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select log();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select log(1, 2, 3);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select make_set();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select make_set(1);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select master_pos_wait();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select master_pos_wait(1);
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select master_pos_wait(1, 2, 3, 4);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select rand(1, 2, 3);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select round(1, 2, 3);
|
||||||
|
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select yearweek();
|
||||||
|
-- error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select yearweek(1, 2, 3);
|
||||||
|
|
422
mysql-test/t/parser_bug21114_innodb.test
Normal file
422
mysql-test/t/parser_bug21114_innodb.test
Normal file
@ -0,0 +1,422 @@
|
|||||||
|
-- source include/have_innodb.inc
|
||||||
|
|
||||||
|
let $engine_type=InnoDb;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#21114 (Foreign key creation fails to table with name format)
|
||||||
|
#
|
||||||
|
|
||||||
|
# Testing with the full log for only a few functions,
|
||||||
|
# including FORMAT for witch the bug was reported.
|
||||||
|
|
||||||
|
let $verbose=1;
|
||||||
|
|
||||||
|
let $FCT=ABS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FIELD;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FORMAT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
|
||||||
|
# Ignoring the result of SHOW CREATE (this generates too much noise)
|
||||||
|
# Tests will fail if the create table statement can not be parsed
|
||||||
|
|
||||||
|
let verbose=0;
|
||||||
|
|
||||||
|
let $FCT=ACOS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ADDDATE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ADDTIME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=AES_DECRYPT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=AES_ENCRYPT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=AREA;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ASBINARY;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ASIN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ASTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ASWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ASWKT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ATAN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ATAN2;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=BENCHMARK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=BIN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=BIT_COUNT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=BIT_LENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CEIL;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CEILING;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CENTROID;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CHARACTER_LENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CHAR_LENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=COERCIBILITY;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=COMPRESS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CONCAT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CONCAT_WS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CONNECTION_ID;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CONV;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CONVERT_TZ;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=COS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=COT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CRC32;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=CROSSES;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DATEDIFF;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DATE_FORMAT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DAYNAME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DAYOFMONTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DAYOFWEEK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DAYOFYEAR;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DECODE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DEGREES;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DES_DECRYPT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DES_ENCRYPT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DIMENSION;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=DISJOINT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ELT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ENCODE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ENCRYPT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ENDPOINT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ENVELOPE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=EQUALS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=EXP;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=EXPORT_SET;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=EXTERIORRING;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=EXTRACTVALUE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FIND_IN_SET;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FLOOR;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FOUND_ROWS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FROM_DAYS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=FROM_UNIXTIME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMCOLLFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMCOLLFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMETRYCOLLECTIONFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMETRYCOLLECTIONFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMETRYFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMETRYFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMETRYN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMETRYTYPE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GEOMFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GET_LOCK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GLENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=GREATEST;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=HEX;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=IFNULL;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=INET_ATON;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=INET_NTOA;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=INSTR;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=INTERIORRINGN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=INTERSECTS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ISCLOSED;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ISEMPTY;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ISNULL;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ISSIMPLE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=IS_FREE_LOCK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=IS_USED_LOCK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LAST_DAY;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LAST_INSERT_ID;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LCASE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LEAST;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LINEFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LINEFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LINESTRINGFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LINESTRINGFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LOAD_FILE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LOCATE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LOG;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LOG10;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LOG2;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LOWER;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LPAD;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=LTRIM;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MAKEDATE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MAKETIME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MAKE_SET;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MASTER_POS_WAIT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBRCONTAINS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBRDISJOINT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBREQUAL;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBRINTERSECTS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBROVERLAPS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBRTOUCHES;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MBRWITHIN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MD5;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MLINEFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MLINEFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MONTHNAME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MPOINTFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MPOINTFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MPOLYFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MPOLYFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MULTILINESTRINGFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MULTILINESTRINGFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MULTIPOINTFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MULTIPOINTFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MULTIPOLYGONFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=MULTIPOLYGONFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=NAME_CONST;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=NULLIF;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=NUMGEOMETRIES;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=NUMINTERIORRINGS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=NUMPOINTS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=OCT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=OCTET_LENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ORD;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=OVERLAPS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=PERIOD_ADD;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=PERIOD_DIFF;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=PI;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POINTFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POINTFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POINTN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POLYFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POLYFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POLYGONFROMTEXT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POLYGONFROMWKB;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POW;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=POWER;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=QUOTE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=RADIANS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=RAND;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=RELEASE_LOCK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=REVERSE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ROUND;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=ROW_COUNT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=RPAD;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=RTRIM;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SEC_TO_TIME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SESSION_USER;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SHA;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SHA1;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SIGN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SIN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SLEEP;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SOUNDEX;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SPACE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SQRT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SRID;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=STARTPOINT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=STRCMP;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=STR_TO_DATE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SUBDATE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SUBSTRING_INDEX;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SUBTIME;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=SYSTEM_USER;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=TAN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=TIMEDIFF;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=TIME_FORMAT;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=TIME_TO_SEC;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=TOUCHES;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=TO_DAYS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UCASE;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UNCOMPRESS;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UNCOMPRESSED_LENGTH;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UNHEX;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UNIX_TIMESTAMP;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UPDATEXML;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UPPER;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=UUID;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=VERSION;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=WEEKDAY;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=WEEKOFYEAR;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=WITHIN;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=X;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=Y;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
let $FCT=YEARWEEK;
|
||||||
|
-- source include/parser_bug21114.inc
|
||||||
|
|
@ -523,8 +523,9 @@ deallocate prepare stmt;
|
|||||||
#
|
#
|
||||||
create table t1 (a varchar(20));
|
create table t1 (a varchar(20));
|
||||||
insert into t1 values ('foo');
|
insert into t1 values ('foo');
|
||||||
--error 1305
|
|
||||||
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
||||||
|
-- error ER_SP_DOES_NOT_EXIST
|
||||||
|
prepare stmt2 FROM 'SELECT not_a_function (a) FROM t1';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -988,6 +989,7 @@ execute stmt;
|
|||||||
drop temporary table t1;
|
drop temporary table t1;
|
||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#22085: Crash on the execution of a prepared statement that
|
# BUG#22085: Crash on the execution of a prepared statement that
|
||||||
# uses an IN subquery with aggregate functions in HAVING
|
# uses an IN subquery with aggregate functions in HAVING
|
||||||
@ -1040,7 +1042,81 @@ EXECUTE STMT USING @id,@id;
|
|||||||
DEALLOCATE PREPARE STMT;
|
DEALLOCATE PREPARE STMT;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 4.1 tests
|
#
|
||||||
|
# BUG#21354: (COUNT(*) = 1) not working in SELECT inside prepared
|
||||||
|
# statement
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT, INDEX(i));
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (COUNT(i) = 1), COUNT(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (AVG(i) = 1), AVG(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (VARIANCE(i) = 1), VARIANCE(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (STDDEV(i) = 1), STDDEV(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (BIT_OR(i) = 1), BIT_OR(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (BIT_AND(i) = 1), BIT_AND(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
PREPARE stmt FROM "SELECT (BIT_XOR(i) = 1), BIT_XOR(i) FROM t1 WHERE i = ?";
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 1;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
SET @a = 0;
|
||||||
|
EXECUTE stmt USING @a;
|
||||||
|
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo End of 4.1 tests.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
############################# 5.0 tests start ################################
|
############################# 5.0 tests start ################################
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@ -1051,8 +1127,9 @@ DROP TABLE t1;
|
|||||||
#
|
#
|
||||||
create table t1 (a varchar(20));
|
create table t1 (a varchar(20));
|
||||||
insert into t1 values ('foo');
|
insert into t1 values ('foo');
|
||||||
--error 1305
|
|
||||||
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
prepare stmt FROM 'SELECT char_length (a) FROM t1';
|
||||||
|
-- error ER_SP_DOES_NOT_EXIST
|
||||||
|
prepare stmt2 FROM 'SELECT not_a_function (a) FROM t1';
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1437,6 +1514,26 @@ DEALLOCATE PREPARE stmt;
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#21856: Prepared Statments: crash if bad create
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
let $iterations= 100;
|
||||||
|
--disable_query_log
|
||||||
|
--disable_result_log
|
||||||
|
while ($iterations > 0)
|
||||||
|
{
|
||||||
|
--error ER_PARSE_ERROR
|
||||||
|
PREPARE stmt FROM "CREATE PROCEDURE p1()";
|
||||||
|
dec $iterations;
|
||||||
|
}
|
||||||
|
--enable_query_log
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.0 tests.
|
--echo End of 5.0 tests.
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -72,6 +72,10 @@ disconnect con2;
|
|||||||
disconnect con1;
|
disconnect con1;
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
|
|
||||||
|
--echo End of 4.1 tests
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#14959: ALTER TABLE isn't able to rename a view
|
# Bug#14959: ALTER TABLE isn't able to rename a view
|
||||||
#
|
#
|
||||||
@ -85,4 +89,6 @@ rename table v2 to v1;
|
|||||||
rename table v2 to v1;
|
rename table v2 to v1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
# End of 4.1 tests
|
|
||||||
|
|
||||||
|
--echo End of 5.0 tests
|
||||||
|
@ -1748,6 +1748,8 @@ drop function if exists bug16896;
|
|||||||
--error ER_SP_NO_AGGREGATE
|
--error ER_SP_NO_AGGREGATE
|
||||||
create aggregate function bug16896() returns int return 1;
|
create aggregate function bug16896() returns int return 1;
|
||||||
|
|
||||||
|
#
|
||||||
|
#
|
||||||
# BUG#14702: misleading error message when syntax error in CREATE
|
# BUG#14702: misleading error message when syntax error in CREATE
|
||||||
# PROCEDURE
|
# PROCEDURE
|
||||||
#
|
#
|
||||||
@ -1769,6 +1771,47 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#20953: create proc with a create view that uses local
|
||||||
|
# vars/params should fail to create
|
||||||
|
#
|
||||||
|
# See test case for what syntax is forbidden in a view.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
|
||||||
|
# We do not have to drop this procedure and view because they won't be
|
||||||
|
# created.
|
||||||
|
--error ER_VIEW_SELECT_CLAUSE
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO @a;
|
||||||
|
--error ER_VIEW_SELECT_CLAUSE
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO DUMPFILE "file";
|
||||||
|
--error ER_VIEW_SELECT_CLAUSE
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 INTO OUTFILE "file";
|
||||||
|
--error ER_VIEW_SELECT_CLAUSE
|
||||||
|
CREATE PROCEDURE bug20953()
|
||||||
|
CREATE VIEW v AS SELECT i FROM t1 PROCEDURE ANALYSE();
|
||||||
|
--error ER_VIEW_SELECT_DERIVED
|
||||||
|
CREATE PROCEDURE bug20953() CREATE VIEW v AS SELECT 1 FROM (SELECT 1) AS d1;
|
||||||
|
--error ER_VIEW_SELECT_VARIABLE
|
||||||
|
CREATE PROCEDURE bug20953(i INT) CREATE VIEW v AS SELECT i;
|
||||||
|
delimiter |;
|
||||||
|
--error ER_VIEW_SELECT_VARIABLE
|
||||||
|
CREATE PROCEDURE bug20953()
|
||||||
|
BEGIN
|
||||||
|
DECLARE i INT;
|
||||||
|
CREATE VIEW v AS SELECT i;
|
||||||
|
END |
|
||||||
|
delimiter ;|
|
||||||
|
--error ER_VIEW_SELECT_VARIABLE
|
||||||
|
PREPARE stmt FROM "CREATE VIEW v AS SELECT ?";
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# End of 5.0 tests
|
# End of 5.0 tests
|
||||||
#
|
#
|
||||||
@ -1788,12 +1831,14 @@ begin
|
|||||||
show authors;
|
show authors;
|
||||||
return 42;
|
return 42;
|
||||||
end|
|
end|
|
||||||
|
delimiter ;|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#20701: BINARY keyword should be forbidden in stored routines
|
# BUG#20701: BINARY keyword should be forbidden in stored routines
|
||||||
#
|
#
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop function if exists bug20701|
|
drop function if exists bug20701;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
#
|
#
|
||||||
# This was disabled in 5.1.12. See bug #20701
|
# This was disabled in 5.1.12. See bug #20701
|
||||||
@ -1801,17 +1846,19 @@ drop function if exists bug20701|
|
|||||||
# be removed.
|
# be removed.
|
||||||
#
|
#
|
||||||
--error ER_NOT_SUPPORTED_YET
|
--error ER_NOT_SUPPORTED_YET
|
||||||
create function bug20701() returns varchar(25) binary return "test"|
|
create function bug20701() returns varchar(25) binary return "test";
|
||||||
create function bug20701() returns varchar(25) return "test"|
|
create function bug20701() returns varchar(25) return "test";
|
||||||
drop function bug20701|
|
drop function bug20701;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#NNNN: New bug synopsis
|
# BUG#NNNN: New bug synopsis
|
||||||
#
|
#
|
||||||
#--disable_warnings
|
#--disable_warnings
|
||||||
#drop procedure if exists bugNNNN|
|
#drop procedure if exists bugNNNN;
|
||||||
#drop function if exists bugNNNN|
|
#drop function if exists bugNNNN;
|
||||||
#--enable_warnings
|
#--enable_warnings
|
||||||
#create procedure bugNNNN...
|
#create procedure bugNNNN...
|
||||||
#create function bugNNNN...
|
#create function bugNNNN...
|
||||||
|
@ -15,6 +15,7 @@ DROP FUNCTION IF EXISTS sp_vars_check_ret1;
|
|||||||
DROP FUNCTION IF EXISTS sp_vars_check_ret2;
|
DROP FUNCTION IF EXISTS sp_vars_check_ret2;
|
||||||
DROP FUNCTION IF EXISTS sp_vars_check_ret3;
|
DROP FUNCTION IF EXISTS sp_vars_check_ret3;
|
||||||
DROP FUNCTION IF EXISTS sp_vars_check_ret4;
|
DROP FUNCTION IF EXISTS sp_vars_check_ret4;
|
||||||
|
DROP FUNCTION IF EXISTS sp_vars_div_zero;
|
||||||
|
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
@ -49,6 +50,8 @@ SELECT sp_vars_check_ret3();
|
|||||||
|
|
||||||
SELECT sp_vars_check_ret4();
|
SELECT sp_vars_check_ret4();
|
||||||
|
|
||||||
|
SELECT sp_vars_div_zero();
|
||||||
|
|
||||||
# Check that changing sql_mode after creating a store procedure does not
|
# Check that changing sql_mode after creating a store procedure does not
|
||||||
# matter.
|
# matter.
|
||||||
|
|
||||||
@ -72,6 +75,8 @@ SELECT sp_vars_check_ret3();
|
|||||||
|
|
||||||
SELECT sp_vars_check_ret4();
|
SELECT sp_vars_check_ret4();
|
||||||
|
|
||||||
|
SELECT sp_vars_div_zero();
|
||||||
|
|
||||||
# Create the procedure in TRADITIONAL mode. Check that error will be thrown on
|
# Create the procedure in TRADITIONAL mode. Check that error will be thrown on
|
||||||
# execution.
|
# execution.
|
||||||
|
|
||||||
@ -81,6 +86,7 @@ DROP FUNCTION sp_vars_check_ret1;
|
|||||||
DROP FUNCTION sp_vars_check_ret2;
|
DROP FUNCTION sp_vars_check_ret2;
|
||||||
DROP FUNCTION sp_vars_check_ret3;
|
DROP FUNCTION sp_vars_check_ret3;
|
||||||
DROP FUNCTION sp_vars_check_ret4;
|
DROP FUNCTION sp_vars_check_ret4;
|
||||||
|
DROP FUNCTION sp_vars_div_zero;
|
||||||
|
|
||||||
--source include/sp-vars.inc
|
--source include/sp-vars.inc
|
||||||
|
|
||||||
@ -110,6 +116,9 @@ SELECT sp_vars_check_ret3();
|
|||||||
|
|
||||||
SELECT sp_vars_check_ret4();
|
SELECT sp_vars_check_ret4();
|
||||||
|
|
||||||
|
--error ER_DIVISION_BY_ZERO
|
||||||
|
SELECT sp_vars_div_zero();
|
||||||
|
|
||||||
SET @@sql_mode = 'ansi';
|
SET @@sql_mode = 'ansi';
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -122,6 +131,7 @@ DROP FUNCTION sp_vars_check_ret1;
|
|||||||
DROP FUNCTION sp_vars_check_ret2;
|
DROP FUNCTION sp_vars_check_ret2;
|
||||||
DROP FUNCTION sp_vars_check_ret3;
|
DROP FUNCTION sp_vars_check_ret3;
|
||||||
DROP FUNCTION sp_vars_check_ret4;
|
DROP FUNCTION sp_vars_check_ret4;
|
||||||
|
DROP FUNCTION sp_vars_div_zero;
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
#
|
#
|
||||||
|
@ -6419,6 +6419,170 @@ SELECT bug21493(Member_ID) FROM t3|
|
|||||||
DROP FUNCTION bug21493|
|
DROP FUNCTION bug21493|
|
||||||
DROP TABLE t3,t4|
|
DROP TABLE t3,t4|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#20028 Function with select return no data
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop function if exists func_20028_a|
|
||||||
|
drop function if exists func_20028_b|
|
||||||
|
drop function if exists func_20028_c|
|
||||||
|
drop procedure if exists proc_20028_a|
|
||||||
|
drop procedure if exists proc_20028_b|
|
||||||
|
drop procedure if exists proc_20028_c|
|
||||||
|
drop table if exists table_20028|
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
create table table_20028 (i int)|
|
||||||
|
|
||||||
|
SET @save_sql_mode=@@sql_mode|
|
||||||
|
|
||||||
|
SET sql_mode=''|
|
||||||
|
|
||||||
|
create function func_20028_a() returns integer
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
return ifnull(temp, 0);
|
||||||
|
end|
|
||||||
|
|
||||||
|
create function func_20028_b() returns integer
|
||||||
|
begin
|
||||||
|
return func_20028_a();
|
||||||
|
end|
|
||||||
|
|
||||||
|
create function func_20028_c() returns integer
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='TRADITIONAL';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
return div_zero;
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_20028_a()
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_20028_b()
|
||||||
|
begin
|
||||||
|
call proc_20028_a();
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_20028_c()
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='TRADITIONAL';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
end|
|
||||||
|
|
||||||
|
select func_20028_a()|
|
||||||
|
select func_20028_b()|
|
||||||
|
--error ER_DIVISION_BY_ZERO
|
||||||
|
select func_20028_c()|
|
||||||
|
call proc_20028_a()|
|
||||||
|
call proc_20028_b()|
|
||||||
|
--error ER_DIVISION_BY_ZERO
|
||||||
|
call proc_20028_c()|
|
||||||
|
|
||||||
|
SET sql_mode='TRADITIONAL'|
|
||||||
|
|
||||||
|
drop function func_20028_a|
|
||||||
|
drop function func_20028_b|
|
||||||
|
drop function func_20028_c|
|
||||||
|
drop procedure proc_20028_a|
|
||||||
|
drop procedure proc_20028_b|
|
||||||
|
drop procedure proc_20028_c|
|
||||||
|
|
||||||
|
create function func_20028_a() returns integer
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
return ifnull(temp, 0);
|
||||||
|
end|
|
||||||
|
|
||||||
|
create function func_20028_b() returns integer
|
||||||
|
begin
|
||||||
|
return func_20028_a();
|
||||||
|
end|
|
||||||
|
|
||||||
|
create function func_20028_c() returns integer
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
return div_zero;
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_20028_a()
|
||||||
|
begin
|
||||||
|
declare temp integer;
|
||||||
|
select i into temp from table_20028 limit 1;
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_20028_b()
|
||||||
|
begin
|
||||||
|
call proc_20028_a();
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_20028_c()
|
||||||
|
begin
|
||||||
|
declare div_zero integer;
|
||||||
|
set SQL_MODE='';
|
||||||
|
select 1/0 into div_zero;
|
||||||
|
end|
|
||||||
|
|
||||||
|
select func_20028_a()|
|
||||||
|
select func_20028_b()|
|
||||||
|
select func_20028_c()|
|
||||||
|
call proc_20028_a()|
|
||||||
|
call proc_20028_b()|
|
||||||
|
call proc_20028_c()|
|
||||||
|
|
||||||
|
SET @@sql_mode=@save_sql_mode|
|
||||||
|
|
||||||
|
drop function func_20028_a|
|
||||||
|
drop function func_20028_b|
|
||||||
|
drop function func_20028_c|
|
||||||
|
drop procedure proc_20028_a|
|
||||||
|
drop procedure proc_20028_b|
|
||||||
|
drop procedure proc_20028_c|
|
||||||
|
drop table table_20028|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#21462 Stored procedures with no arguments require parenthesis
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists proc_21462_a|
|
||||||
|
drop procedure if exists proc_21462_b|
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
create procedure proc_21462_a()
|
||||||
|
begin
|
||||||
|
select "Called A";
|
||||||
|
end|
|
||||||
|
|
||||||
|
create procedure proc_21462_b(x int)
|
||||||
|
begin
|
||||||
|
select "Called B";
|
||||||
|
end|
|
||||||
|
|
||||||
|
call proc_21462_a|
|
||||||
|
call proc_21462_a()|
|
||||||
|
-- error ER_SP_WRONG_NO_OF_ARGS
|
||||||
|
call proc_21462_a(1)|
|
||||||
|
|
||||||
|
-- error ER_SP_WRONG_NO_OF_ARGS
|
||||||
|
call proc_21462_b|
|
||||||
|
-- error ER_SP_WRONG_NO_OF_ARGS
|
||||||
|
call proc_21462_b()|
|
||||||
|
call proc_21462_b(1)|
|
||||||
|
|
||||||
|
drop procedure proc_21462_a|
|
||||||
|
drop procedure proc_21462_b|
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
|
||||||
|
@ -1274,7 +1274,6 @@ INSERT INTO t1 VALUES (@x);
|
|||||||
SELECT @x;
|
SELECT @x;
|
||||||
|
|
||||||
SET @x=2;
|
SET @x=2;
|
||||||
--error ER_DIVISION_BY_ZERO
|
|
||||||
UPDATE t1 SET i1 = @x;
|
UPDATE t1 SET i1 = @x;
|
||||||
SELECT @x;
|
SELECT @x;
|
||||||
|
|
||||||
@ -1285,7 +1284,6 @@ INSERT INTO t1 VALUES (@x);
|
|||||||
SELECT @x;
|
SELECT @x;
|
||||||
|
|
||||||
SET @x=4;
|
SET @x=4;
|
||||||
--error ER_DIVISION_BY_ZERO
|
|
||||||
UPDATE t1 SET i1 = @x;
|
UPDATE t1 SET i1 = @x;
|
||||||
SELECT @x;
|
SELECT @x;
|
||||||
|
|
||||||
@ -1420,6 +1418,67 @@ CREATE DEFINER=some_user_name@1234567890abcdefghij1234567890abcdefghij1234567890
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#20028 Function with select return no data
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t1;
|
||||||
|
drop table if exists t2;
|
||||||
|
drop table if exists t3;
|
||||||
|
drop table if exists t4;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
SET @save_sql_mode=@@sql_mode;
|
||||||
|
|
||||||
|
delimiter |;
|
||||||
|
SET sql_mode='TRADITIONAL'|
|
||||||
|
create table t1 (id int(10) not null primary key, v int(10) )|
|
||||||
|
create table t2 (id int(10) not null primary key, v int(10) )|
|
||||||
|
create table t3 (id int(10) not null primary key, v int(10) )|
|
||||||
|
create table t4 (c int)|
|
||||||
|
|
||||||
|
create trigger t4_bi before insert on t4 for each row set @t4_bi_called:=1|
|
||||||
|
create trigger t4_bu before update on t4 for each row set @t4_bu_called:=1|
|
||||||
|
|
||||||
|
insert into t1 values(10, 10)|
|
||||||
|
set @a:=1/0|
|
||||||
|
select 1/0 from t1|
|
||||||
|
|
||||||
|
create trigger t1_bi before insert on t1 for each row set @a:=1/0|
|
||||||
|
|
||||||
|
insert into t1 values(20, 20)|
|
||||||
|
|
||||||
|
drop trigger t1_bi|
|
||||||
|
create trigger t1_bi before insert on t1 for each row
|
||||||
|
begin
|
||||||
|
insert into t2 values (new.id, new.v);
|
||||||
|
update t2 set v=v+1 where id= new.id;
|
||||||
|
replace t3 values (new.id, 0);
|
||||||
|
update t2, t3 set t2.v=new.v, t3.v=new.v where t2.id=t3.id;
|
||||||
|
create temporary table t5 select * from t1;
|
||||||
|
delete from t5;
|
||||||
|
insert into t5 select * from t1;
|
||||||
|
insert into t4 values (0);
|
||||||
|
set @check= (select count(*) from t5);
|
||||||
|
update t4 set c= @check;
|
||||||
|
drop temporary table t5;
|
||||||
|
|
||||||
|
set @a:=1/0;
|
||||||
|
end|
|
||||||
|
|
||||||
|
set @check=0, @t4_bi_called=0, @t4_bu_called=0|
|
||||||
|
insert into t1 values(30, 30)|
|
||||||
|
select @check, @t4_bi_called, @t4_bu_called|
|
||||||
|
|
||||||
|
delimiter ;|
|
||||||
|
|
||||||
|
SET @@sql_mode=@save_sql_mode;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
drop table t2;
|
||||||
|
drop table t3;
|
||||||
|
drop table t4;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#20670 "UPDATE using key and invoking trigger that modifies
|
# Bug#20670 "UPDATE using key and invoking trigger that modifies
|
||||||
|
@ -23,8 +23,11 @@ create table t1 (a int, b int);
|
|||||||
insert into t1 values (1,2), (1,3), (2,4), (2,5), (3,10);
|
insert into t1 values (1,2), (1,3), (2,4), (2,5), (3,10);
|
||||||
|
|
||||||
# view with variable
|
# view with variable
|
||||||
-- error 1351
|
-- error ER_VIEW_SELECT_VARIABLE
|
||||||
create view v1 (c,d) as select a,b+@@global.max_user_connections from t1;
|
create view v1 (c,d) as select a,b+@@global.max_user_connections from t1;
|
||||||
|
-- error ER_VIEW_SELECT_VARIABLE
|
||||||
|
create view v1 (c,d) as select a,b from t1
|
||||||
|
where a = @@global.max_user_connections;
|
||||||
|
|
||||||
# simple view
|
# simple view
|
||||||
create view v1 (c) as select b+1 from t1;
|
create view v1 (c) as select b+1 from t1;
|
||||||
@ -486,19 +489,6 @@ drop view v1;
|
|||||||
-- error 1060
|
-- error 1060
|
||||||
create view v1 (a,a) as select 'a','a';
|
create view v1 (a,a) as select 'a','a';
|
||||||
|
|
||||||
#
|
|
||||||
# SP variables inside view test
|
|
||||||
#
|
|
||||||
--disable_warnings
|
|
||||||
drop procedure if exists p1;
|
|
||||||
--enable_warnings
|
|
||||||
delimiter //;
|
|
||||||
create procedure p1 () begin declare v int; create view v1 as select v; end;//
|
|
||||||
delimiter ;//
|
|
||||||
-- error 1351
|
|
||||||
call p1();
|
|
||||||
drop procedure p1;
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# updatablity should be transitive
|
# updatablity should be transitive
|
||||||
#
|
#
|
||||||
@ -708,11 +698,11 @@ drop function `f``1`;
|
|||||||
#
|
#
|
||||||
# tested problem when function name length close to ALIGN_SIZE
|
# tested problem when function name length close to ALIGN_SIZE
|
||||||
#
|
#
|
||||||
create function x () returns int return 5;
|
create function a() returns int return 5;
|
||||||
create view v1 as select x ();
|
create view v1 as select a();
|
||||||
select * from v1;
|
select * from v1;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop function x;
|
drop function a;
|
||||||
|
|
||||||
#
|
#
|
||||||
# VIEW with collation
|
# VIEW with collation
|
||||||
@ -820,6 +810,8 @@ create view v1 as select 5 into outfile 'ttt';
|
|||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
-- error 1350
|
-- error 1350
|
||||||
create view v1 as select a from t1 procedure analyse();
|
create view v1 as select a from t1 procedure analyse();
|
||||||
|
-- error ER_VIEW_SELECT_DERIVED
|
||||||
|
create view v1 as select 1 from (select 1) as d1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -2886,6 +2878,38 @@ DROP VIEW v1;
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
#
|
#
|
||||||
|
# Bug#19111: TRIGGERs selecting from a VIEW on the firing base table
|
||||||
|
# fail
|
||||||
|
#
|
||||||
|
# Allow to select from a view on a table being modified in a trigger
|
||||||
|
# and stored function, since plain select is allowed there.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP FUNCTION IF EXISTS f1;
|
||||||
|
DROP VIEW IF EXISTS v1;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT);
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
CREATE VIEW v1 AS SELECT MAX(i) FROM t1;
|
||||||
|
|
||||||
|
# Plain 'SET NEW.i = (SELECT MAX(i) FROM t1) + 1' works, so select
|
||||||
|
# from a view should work too.
|
||||||
|
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
||||||
|
SET NEW.i = (SELECT * FROM v1) + 1;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
|
||||||
|
# Plain 'RETURN (SELECT MAX(i) FROM t1)' works in INSERT, so select
|
||||||
|
# from a view should work too.
|
||||||
|
CREATE FUNCTION f1() RETURNS INT RETURN (SELECT * FROM v1);
|
||||||
|
UPDATE t1 SET i= f1();
|
||||||
|
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
# Bug #16813 (WITH CHECK OPTION doesn't work with UPDATE)
|
# Bug #16813 (WITH CHECK OPTION doesn't work with UPDATE)
|
||||||
#
|
#
|
||||||
CREATE TABLE t1(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, val INT UNSIGNED NOT NULL);
|
CREATE TABLE t1(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, val INT UNSIGNED NOT NULL);
|
||||||
@ -2899,4 +2923,43 @@ UPDATE v1 SET val=6 WHERE id=2;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#22584: last_insert_id not updated after inserting a record
|
||||||
|
# through a updatable view
|
||||||
|
#
|
||||||
|
# We still do not update LAST_INSERT_ID if AUTO_INCREMENT column is
|
||||||
|
# not accessible through a view. However, we do not reset the value
|
||||||
|
# of LAST_INSERT_ID, but keep it unchanged.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
DROP VIEW IF EXISTS v1, v2;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY, j INT);
|
||||||
|
CREATE VIEW v1 AS SELECT j FROM t1;
|
||||||
|
CREATE VIEW v2 AS SELECT * FROM t1;
|
||||||
|
|
||||||
|
INSERT INTO t1 (j) VALUES (1);
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
|
||||||
|
INSERT INTO v1 (j) VALUES (2);
|
||||||
|
--echo # LAST_INSERT_ID() should not change.
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
|
||||||
|
INSERT INTO v2 (j) VALUES (3);
|
||||||
|
--echo # LAST_INSERT_ID() should be updated.
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
|
||||||
|
INSERT INTO v1 (j) SELECT j FROM t1;
|
||||||
|
--echo # LAST_INSERT_ID() should not change.
|
||||||
|
SELECT LAST_INSERT_ID();
|
||||||
|
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
DROP VIEW v1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.0 tests.
|
--echo End of 5.0 tests.
|
||||||
|
62
mysql-test/t/wait_for_socket.sh
Executable file
62
mysql-test/t/wait_for_socket.sh
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
if [ $# -ne 6 ]; then
|
||||||
|
echo "Usage: wait_for_socket.sh <executable path> <socket path> <username> <password> <db> <timeout>"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
client_exe="$1"
|
||||||
|
socket_path="$2"
|
||||||
|
username="$3"
|
||||||
|
password="$4"
|
||||||
|
db="$5"
|
||||||
|
total_timeout="$6"
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
if [ -z "$client_exe" ]; then
|
||||||
|
echo "Error: invalid path to client executable ($client_exe)."
|
||||||
|
exit 0;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$client_exe" ]; then
|
||||||
|
echo "Error: client by path '$client_exe' is not available."
|
||||||
|
exit 0;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$socket_path" ]; then
|
||||||
|
echo "Error: invalid socket patch."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
client_args="--silent --socket=$socket_path "
|
||||||
|
|
||||||
|
[ -n "$username" ] && client_args="$client_args --user=$username "
|
||||||
|
[ -n "$password" ] && client_args="$client_args --password=$password "
|
||||||
|
[ -n "$db" ] && client_args="$client_args $db"
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
cur_attempt=1
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
|
||||||
|
if ( echo 'quit' | "$client_exe" $client_args >/dev/null 2>&1 ); then
|
||||||
|
echo "Success: server is ready to accept connection on socket."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ $cur_attempt -ge $total_timeout ] && break
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cur_attempt=`expr $cur_attempt + 1`
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Error: server does not accept connections after $total_timeout seconds."
|
||||||
|
exit 0
|
@ -74,7 +74,7 @@ Guardian_thread::Guardian_thread(Thread_registry &thread_registry_arg,
|
|||||||
uint monitoring_interval_arg) :
|
uint monitoring_interval_arg) :
|
||||||
Guardian_thread_args(thread_registry_arg, instance_map_arg,
|
Guardian_thread_args(thread_registry_arg, instance_map_arg,
|
||||||
monitoring_interval_arg),
|
monitoring_interval_arg),
|
||||||
thread_info(pthread_self()), guarded_instances(0)
|
thread_info(pthread_self(), TRUE), guarded_instances(0)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&LOCK_guardian, 0);
|
pthread_mutex_init(&LOCK_guardian, 0);
|
||||||
pthread_cond_init(&COND_guardian, 0);
|
pthread_cond_init(&COND_guardian, 0);
|
||||||
@ -95,11 +95,11 @@ Guardian_thread::~Guardian_thread()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Guardian_thread::request_shutdown(bool stop_instances_arg)
|
void Guardian_thread::request_shutdown()
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_guardian);
|
pthread_mutex_lock(&LOCK_guardian);
|
||||||
/* stop instances or just clean up Guardian repository */
|
/* stop instances or just clean up Guardian repository */
|
||||||
stop_instances(stop_instances_arg);
|
stop_instances();
|
||||||
shutdown_requested= TRUE;
|
shutdown_requested= TRUE;
|
||||||
pthread_mutex_unlock(&LOCK_guardian);
|
pthread_mutex_unlock(&LOCK_guardian);
|
||||||
}
|
}
|
||||||
@ -154,11 +154,11 @@ void Guardian_thread::process_instance(Instance *instance,
|
|||||||
{
|
{
|
||||||
/* Pid file not created yet, don't go to STARTED state yet */
|
/* Pid file not created yet, don't go to STARTED state yet */
|
||||||
}
|
}
|
||||||
else
|
else if (current_node->state != STARTED)
|
||||||
{
|
{
|
||||||
/* clear status fields */
|
/* clear status fields */
|
||||||
log_info("guardian: instance %s is running, set state to STARTED",
|
log_info("guardian: instance '%s' is running, set state to STARTED.",
|
||||||
instance->options.instance_name.str);
|
(const char *) instance->options.instance_name.str);
|
||||||
current_node->restart_counter= 0;
|
current_node->restart_counter= 0;
|
||||||
current_node->crash_moment= 0;
|
current_node->crash_moment= 0;
|
||||||
current_node->state= STARTED;
|
current_node->state= STARTED;
|
||||||
@ -168,8 +168,8 @@ void Guardian_thread::process_instance(Instance *instance,
|
|||||||
{
|
{
|
||||||
switch (current_node->state) {
|
switch (current_node->state) {
|
||||||
case NOT_STARTED:
|
case NOT_STARTED:
|
||||||
log_info("guardian: starting instance %s",
|
log_info("guardian: starting instance '%s'...",
|
||||||
instance->options.instance_name.str);
|
(const char *) instance->options.instance_name.str);
|
||||||
|
|
||||||
/* NOTE, set state to STARTING _before_ start() is called */
|
/* NOTE, set state to STARTING _before_ start() is called */
|
||||||
current_node->state= STARTING;
|
current_node->state= STARTING;
|
||||||
@ -193,8 +193,8 @@ void Guardian_thread::process_instance(Instance *instance,
|
|||||||
if (instance->is_crashed())
|
if (instance->is_crashed())
|
||||||
{
|
{
|
||||||
instance->start();
|
instance->start();
|
||||||
log_info("guardian: starting instance %s",
|
log_info("guardian: starting instance '%s'...",
|
||||||
instance->options.instance_name.str);
|
(const char *) instance->options.instance_name.str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -211,8 +211,8 @@ void Guardian_thread::process_instance(Instance *instance,
|
|||||||
instance->start();
|
instance->start();
|
||||||
current_node->last_checked= current_time;
|
current_node->last_checked= current_time;
|
||||||
current_node->restart_counter++;
|
current_node->restart_counter++;
|
||||||
log_info("guardian: restarting instance %s",
|
log_info("guardian: restarting instance '%s'...",
|
||||||
instance->options.instance_name.str);
|
(const char *) instance->options.instance_name.str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -250,6 +250,8 @@ void Guardian_thread::run()
|
|||||||
LIST *node;
|
LIST *node;
|
||||||
struct timespec timeout;
|
struct timespec timeout;
|
||||||
|
|
||||||
|
log_info("Guardian: started.");
|
||||||
|
|
||||||
thread_registry.register_thread(&thread_info);
|
thread_registry.register_thread(&thread_info);
|
||||||
|
|
||||||
my_thread_init();
|
my_thread_init();
|
||||||
@ -277,12 +279,16 @@ void Guardian_thread::run()
|
|||||||
&LOCK_guardian, &timeout);
|
&LOCK_guardian, &timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_info("Guardian: stopped.");
|
||||||
|
|
||||||
stopped= TRUE;
|
stopped= TRUE;
|
||||||
pthread_mutex_unlock(&LOCK_guardian);
|
pthread_mutex_unlock(&LOCK_guardian);
|
||||||
/* now, when the Guardian is stopped we can stop the IM */
|
/* now, when the Guardian is stopped we can stop the IM */
|
||||||
thread_registry.unregister_thread(&thread_info);
|
thread_registry.unregister_thread(&thread_info);
|
||||||
thread_registry.request_shutdown();
|
thread_registry.request_shutdown();
|
||||||
my_thread_end();
|
my_thread_end();
|
||||||
|
|
||||||
|
log_info("Guardian: finished.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -414,12 +420,11 @@ int Guardian_thread::stop_guard(Instance *instance)
|
|||||||
|
|
||||||
SYNOPSYS
|
SYNOPSYS
|
||||||
stop_instances()
|
stop_instances()
|
||||||
stop_instances_arg whether we should stop instances at shutdown
|
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Loops through the guarded_instances list and prepares them for shutdown.
|
Loops through the guarded_instances list and prepares them for shutdown.
|
||||||
If stop_instances was requested, we need to issue a stop command and change
|
For each instance we issue a stop command and change the state
|
||||||
the state accordingly. Otherwise we simply delete an entry.
|
accordingly.
|
||||||
|
|
||||||
NOTE
|
NOTE
|
||||||
Guardian object should be locked by the calling function.
|
Guardian object should be locked by the calling function.
|
||||||
@ -429,23 +434,11 @@ int Guardian_thread::stop_guard(Instance *instance)
|
|||||||
1 - error occured
|
1 - error occured
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int Guardian_thread::stop_instances(bool stop_instances_arg)
|
int Guardian_thread::stop_instances()
|
||||||
{
|
{
|
||||||
LIST *node;
|
LIST *node;
|
||||||
node= guarded_instances;
|
node= guarded_instances;
|
||||||
while (node != NULL)
|
while (node != NULL)
|
||||||
{
|
|
||||||
if (!stop_instances_arg)
|
|
||||||
{
|
|
||||||
/* just forget about an instance */
|
|
||||||
guarded_instances= list_delete(guarded_instances, node);
|
|
||||||
/*
|
|
||||||
This should still work fine, as we have only removed the
|
|
||||||
node from the list. The pointer to the next one is still valid
|
|
||||||
*/
|
|
||||||
node= node->next;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
GUARD_NODE *current_node= (GUARD_NODE *) node->data;
|
GUARD_NODE *current_node= (GUARD_NODE *) node->data;
|
||||||
/*
|
/*
|
||||||
@ -465,7 +458,6 @@ int Guardian_thread::stop_instances(bool stop_instances_arg)
|
|||||||
current_node->instance->kill_instance(SIGTERM);
|
current_node->instance->kill_instance(SIGTERM);
|
||||||
node= node->next;
|
node= node->next;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ public:
|
|||||||
/* Initialize or refresh the list of guarded instances */
|
/* Initialize or refresh the list of guarded instances */
|
||||||
int init();
|
int init();
|
||||||
/* Request guardian shutdown. Stop instances if needed */
|
/* Request guardian shutdown. Stop instances if needed */
|
||||||
void request_shutdown(bool stop_instances);
|
void request_shutdown();
|
||||||
/* Start instance protection */
|
/* Start instance protection */
|
||||||
int guard(Instance *instance, bool nolock= FALSE);
|
int guard(Instance *instance, bool nolock= FALSE);
|
||||||
/* Stop instance protection */
|
/* Stop instance protection */
|
||||||
@ -123,7 +123,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/* Prepares Guardian shutdown. Stops instances is needed */
|
/* Prepares Guardian shutdown. Stops instances is needed */
|
||||||
int stop_instances(bool stop_instances_arg);
|
int stop_instances();
|
||||||
/* check instance state and act accordingly */
|
/* check instance state and act accordingly */
|
||||||
void process_instance(Instance *instance, GUARD_NODE *current_node,
|
void process_instance(Instance *instance, GUARD_NODE *current_node,
|
||||||
LIST **guarded_instances, LIST *elem);
|
LIST **guarded_instances, LIST *elem);
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include "mysql_manager_error.h"
|
#include "mysql_manager_error.h"
|
||||||
#include "portability.h"
|
#include "portability.h"
|
||||||
#include "priv.h"
|
#include "priv.h"
|
||||||
|
#include "thread_registry.h"
|
||||||
|
|
||||||
|
|
||||||
const LEX_STRING
|
const LEX_STRING
|
||||||
@ -44,7 +45,8 @@ static const int INSTANCE_NAME_PREFIX_LEN= Instance::DFLT_INSTANCE_NAME.length;
|
|||||||
|
|
||||||
|
|
||||||
static void start_and_monitor_instance(Instance_options *old_instance_options,
|
static void start_and_monitor_instance(Instance_options *old_instance_options,
|
||||||
Instance_map *instance_map);
|
Instance_map *instance_map,
|
||||||
|
Thread_registry *thread_registry);
|
||||||
|
|
||||||
#ifndef __WIN__
|
#ifndef __WIN__
|
||||||
typedef pid_t My_process_info;
|
typedef pid_t My_process_info;
|
||||||
@ -63,7 +65,8 @@ pthread_handler_t proxy(void *arg)
|
|||||||
{
|
{
|
||||||
Instance *instance= (Instance *) arg;
|
Instance *instance= (Instance *) arg;
|
||||||
start_and_monitor_instance(&instance->options,
|
start_and_monitor_instance(&instance->options,
|
||||||
instance->get_map());
|
instance->get_map(),
|
||||||
|
&instance->thread_registry);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,6 +102,7 @@ static int wait_process(My_process_info *pi)
|
|||||||
thread, but we don't know this one). Or we could use waitpid(), but
|
thread, but we don't know this one). Or we could use waitpid(), but
|
||||||
couldn't use wait(), because it could return in any wait() in the program.
|
couldn't use wait(), because it could return in any wait() in the program.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (linuxthreads)
|
if (linuxthreads)
|
||||||
wait(NULL); /* LinuxThreads were detected */
|
wait(NULL); /* LinuxThreads were detected */
|
||||||
else
|
else
|
||||||
@ -165,8 +169,8 @@ static int start_process(Instance_options *instance_options,
|
|||||||
/* exec never returns */
|
/* exec never returns */
|
||||||
exit(1);
|
exit(1);
|
||||||
case -1:
|
case -1:
|
||||||
log_info("cannot create a new process to start instance %s",
|
log_info("cannot create a new process to start instance '%s'.",
|
||||||
instance_options->instance_name.str);
|
(const char *) instance_options->instance_name.str);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -239,11 +243,28 @@ static int start_process(Instance_options *instance_options,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void start_and_monitor_instance(Instance_options *old_instance_options,
|
static void start_and_monitor_instance(Instance_options *old_instance_options,
|
||||||
Instance_map *instance_map)
|
Instance_map *instance_map,
|
||||||
|
Thread_registry *thread_registry)
|
||||||
{
|
{
|
||||||
Instance_name instance_name(&old_instance_options->instance_name);
|
Instance_name instance_name(&old_instance_options->instance_name);
|
||||||
Instance *current_instance;
|
Instance *current_instance;
|
||||||
My_process_info process_info;
|
My_process_info process_info;
|
||||||
|
Thread_info thread_info(pthread_self(), FALSE);
|
||||||
|
|
||||||
|
log_info("Monitoring thread (instance: '%s'): started.",
|
||||||
|
(const char *) instance_name.get_c_str());
|
||||||
|
|
||||||
|
if (!old_instance_options->nonguarded)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Register thread in Thread_registry to wait for it to stop on shutdown
|
||||||
|
only if instance is nuarded. If instance is guarded, the thread will not
|
||||||
|
finish, because nonguarded instances are not stopped on shutdown.
|
||||||
|
*/
|
||||||
|
|
||||||
|
thread_registry->register_thread(&thread_info);
|
||||||
|
my_thread_init();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Lock instance map to guarantee that no instances are deleted during
|
Lock instance map to guarantee that no instances are deleted during
|
||||||
@ -256,7 +277,8 @@ static void start_and_monitor_instance(Instance_options *old_instance_options,
|
|||||||
are using is destroyed. (E.g. by "FLUSH INSTANCES")
|
are using is destroyed. (E.g. by "FLUSH INSTANCES")
|
||||||
*/
|
*/
|
||||||
|
|
||||||
log_info("starting instance %s", (const char *) instance_name.get_c_str());
|
log_info("starting instance %s...",
|
||||||
|
(const char *) instance_name.get_c_str());
|
||||||
|
|
||||||
if (start_process(old_instance_options, &process_info))
|
if (start_process(old_instance_options, &process_info))
|
||||||
{
|
{
|
||||||
@ -279,7 +301,14 @@ static void start_and_monitor_instance(Instance_options *old_instance_options,
|
|||||||
|
|
||||||
instance_map->unlock();
|
instance_map->unlock();
|
||||||
|
|
||||||
return;
|
if (!old_instance_options->nonguarded)
|
||||||
|
{
|
||||||
|
thread_registry->unregister_thread(&thread_info);
|
||||||
|
my_thread_end();
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("Monitoring thread (instance: '%s'): finished.",
|
||||||
|
(const char *) instance_name.get_c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -311,9 +340,9 @@ void Instance::remove_pid()
|
|||||||
int pid;
|
int pid;
|
||||||
if ((pid= options.get_pid()) != 0) /* check the pidfile */
|
if ((pid= options.get_pid()) != 0) /* check the pidfile */
|
||||||
if (options.unlink_pidfile()) /* remove stalled pidfile */
|
if (options.unlink_pidfile()) /* remove stalled pidfile */
|
||||||
log_error("cannot remove pidfile for instance %s, this might be "
|
log_error("cannot remove pidfile for instance '%s', this might be "
|
||||||
"since IM lacks permmissions or hasn't found the pidfile",
|
"since IM lacks permmissions or hasn't found the pidifle",
|
||||||
options.instance_name.str);
|
(const char *) options.instance_name.str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -342,10 +371,6 @@ int Instance::start()
|
|||||||
{
|
{
|
||||||
remove_pid();
|
remove_pid();
|
||||||
|
|
||||||
/*
|
|
||||||
No need to monitor this thread in the Thread_registry, as all
|
|
||||||
instances are to be stopped during shutdown.
|
|
||||||
*/
|
|
||||||
pthread_t proxy_thd_id;
|
pthread_t proxy_thd_id;
|
||||||
pthread_attr_t proxy_thd_attr;
|
pthread_attr_t proxy_thd_attr;
|
||||||
int rc;
|
int rc;
|
||||||
@ -403,7 +428,8 @@ void Instance::set_crash_flag_n_wake_all()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
Instance::Instance(): crashed(FALSE), configured(FALSE)
|
Instance::Instance(Thread_registry &thread_registry_arg):
|
||||||
|
crashed(FALSE), configured(FALSE), thread_registry(thread_registry_arg)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&LOCK_instance, 0);
|
pthread_mutex_init(&LOCK_instance, 0);
|
||||||
pthread_cond_init(&COND_instance_stopped, 0);
|
pthread_cond_init(&COND_instance_stopped, 0);
|
||||||
@ -467,9 +493,9 @@ bool Instance::is_running()
|
|||||||
We have successfully connected to the server using fake
|
We have successfully connected to the server using fake
|
||||||
username/password. Write a warning to the logfile.
|
username/password. Write a warning to the logfile.
|
||||||
*/
|
*/
|
||||||
log_info("The Instance Manager was able to log into you server \
|
log_info("The Instance Manager was able to log into you server "
|
||||||
with faked compiled-in password while checking server status. \
|
"with faked compiled-in password while checking server status. "
|
||||||
Looks like something is wrong.");
|
"Looks like something is wrong.");
|
||||||
pthread_mutex_unlock(&LOCK_instance);
|
pthread_mutex_unlock(&LOCK_instance);
|
||||||
return_val= TRUE; /* server is alive */
|
return_val= TRUE; /* server is alive */
|
||||||
}
|
}
|
||||||
@ -616,10 +642,10 @@ void Instance::kill_instance(int signum)
|
|||||||
/* Kill suceeded */
|
/* Kill suceeded */
|
||||||
if (signum == SIGKILL) /* really killed instance with SIGKILL */
|
if (signum == SIGKILL) /* really killed instance with SIGKILL */
|
||||||
{
|
{
|
||||||
log_error("The instance %s is being stopped forcibly. Normally" \
|
log_error("The instance '%s' is being stopped forcibly. Normally"
|
||||||
"it should not happen. Probably the instance has been" \
|
"it should not happen. Probably the instance has been"
|
||||||
"hanging. You should also check your IM setup",
|
"hanging. You should also check your IM setup",
|
||||||
options.instance_name.str);
|
(const char *) options.instance_name.str);
|
||||||
/* After sucessful hard kill the pidfile need to be removed */
|
/* After sucessful hard kill the pidfile need to be removed */
|
||||||
options.unlink_pidfile();
|
options.unlink_pidfile();
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
class Instance_map;
|
class Instance_map;
|
||||||
|
class Thread_registry;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -87,7 +88,7 @@ public:
|
|||||||
static bool is_mysqld_compatible_name(const LEX_STRING *name);
|
static bool is_mysqld_compatible_name(const LEX_STRING *name);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Instance();
|
Instance(Thread_registry &thread_registry_arg);
|
||||||
|
|
||||||
~Instance();
|
~Instance();
|
||||||
int init(const LEX_STRING *name_arg);
|
int init(const LEX_STRING *name_arg);
|
||||||
@ -120,6 +121,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
enum { DEFAULT_SHUTDOWN_DELAY= 35 };
|
enum { DEFAULT_SHUTDOWN_DELAY= 35 };
|
||||||
Instance_options options;
|
Instance_options options;
|
||||||
|
Thread_registry &thread_registry;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* This attributes is a flag, specifies if the instance has been crashed. */
|
/* This attributes is a flag, specifies if the instance has been crashed. */
|
||||||
|
@ -169,7 +169,7 @@ int Instance_map::process_one_option(const LEX_STRING *group,
|
|||||||
if (!(instance= (Instance *) hash_search(&hash, (byte *) group->str,
|
if (!(instance= (Instance *) hash_search(&hash, (byte *) group->str,
|
||||||
group->length)))
|
group->length)))
|
||||||
{
|
{
|
||||||
if (!(instance= new Instance()))
|
if (!(instance= new Instance(thread_registry)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (instance->init(group) || add_instance(instance))
|
if (instance->init(group) || add_instance(instance))
|
||||||
@ -213,8 +213,10 @@ int Instance_map::process_one_option(const LEX_STRING *group,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Instance_map::Instance_map(const char *default_mysqld_path_arg):
|
Instance_map::Instance_map(const char *default_mysqld_path_arg,
|
||||||
mysqld_path(default_mysqld_path_arg)
|
Thread_registry &thread_registry_arg):
|
||||||
|
mysqld_path(default_mysqld_path_arg),
|
||||||
|
thread_registry(thread_registry_arg)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&LOCK_instance_map, 0);
|
pthread_mutex_init(&LOCK_instance_map, 0);
|
||||||
}
|
}
|
||||||
@ -293,6 +295,8 @@ int Instance_map::flush_instances()
|
|||||||
get_instance_key, delete_instance, 0);
|
get_instance_key, delete_instance, 0);
|
||||||
|
|
||||||
rc= load();
|
rc= load();
|
||||||
|
/* don't init guardian if we failed to load instances */
|
||||||
|
if (!rc)
|
||||||
guardian->init(); // TODO: check error status.
|
guardian->init(); // TODO: check error status.
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -331,7 +335,7 @@ int Instance_map::remove_instance(Instance *instance)
|
|||||||
int Instance_map::create_instance(const LEX_STRING *instance_name,
|
int Instance_map::create_instance(const LEX_STRING *instance_name,
|
||||||
const Named_value_arr *options)
|
const Named_value_arr *options)
|
||||||
{
|
{
|
||||||
Instance *instance= new Instance();
|
Instance *instance= new Instance(thread_registry);
|
||||||
|
|
||||||
if (!instance)
|
if (!instance)
|
||||||
{
|
{
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
class Guardian_thread;
|
class Guardian_thread;
|
||||||
class Instance;
|
class Instance;
|
||||||
class Named_value_arr;
|
class Named_value_arr;
|
||||||
|
class Thread_registry;
|
||||||
|
|
||||||
extern int load_all_groups(char ***groups, const char *filename);
|
extern int load_all_groups(char ***groups, const char *filename);
|
||||||
extern void free_groups(char **groups);
|
extern void free_groups(char **groups);
|
||||||
@ -104,7 +105,8 @@ public:
|
|||||||
int create_instance(const LEX_STRING *instance_name,
|
int create_instance(const LEX_STRING *instance_name,
|
||||||
const Named_value_arr *options);
|
const Named_value_arr *options);
|
||||||
|
|
||||||
Instance_map(const char *default_mysqld_path_arg);
|
Instance_map(const char *default_mysqld_path_arg,
|
||||||
|
Thread_registry &thread_registry_arg);
|
||||||
~Instance_map();
|
~Instance_map();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -130,6 +132,8 @@ private:
|
|||||||
enum { START_HASH_SIZE = 16 };
|
enum { START_HASH_SIZE = 16 };
|
||||||
pthread_mutex_t LOCK_instance_map;
|
pthread_mutex_t LOCK_instance_map;
|
||||||
HASH hash;
|
HASH hash;
|
||||||
|
|
||||||
|
Thread_registry &thread_registry;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_MAP_H */
|
#endif /* INCLUDES_MYSQL_INSTANCE_MANAGER_INSTANCE_MAP_H */
|
||||||
|
@ -87,7 +87,7 @@ private:
|
|||||||
Listener_thread::Listener_thread(const Listener_thread_args &args) :
|
Listener_thread::Listener_thread(const Listener_thread_args &args) :
|
||||||
Listener_thread_args(args.thread_registry, args.user_map, args.instance_map)
|
Listener_thread_args(args.thread_registry, args.user_map, args.instance_map)
|
||||||
,total_connection_count(0)
|
,total_connection_count(0)
|
||||||
,thread_info(pthread_self())
|
,thread_info(pthread_self(), TRUE)
|
||||||
,num_sockets(0)
|
,num_sockets(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -112,6 +112,8 @@ void Listener_thread::run()
|
|||||||
{
|
{
|
||||||
int i, n= 0;
|
int i, n= 0;
|
||||||
|
|
||||||
|
log_info("Listener_thread: started.");
|
||||||
|
|
||||||
#ifndef __WIN__
|
#ifndef __WIN__
|
||||||
/* we use this var to check whether we are running on LinuxThreads */
|
/* we use this var to check whether we are running on LinuxThreads */
|
||||||
pid_t thread_pid;
|
pid_t thread_pid;
|
||||||
@ -164,7 +166,7 @@ void Listener_thread::run()
|
|||||||
if (rc == 0 || rc == -1)
|
if (rc == 0 || rc == -1)
|
||||||
{
|
{
|
||||||
if (rc == -1 && errno != EINTR)
|
if (rc == -1 && errno != EINTR)
|
||||||
log_error("Listener_thread::run(): select() failed, %s",
|
log_error("Listener_thread: select() failed, %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -198,7 +200,7 @@ void Listener_thread::run()
|
|||||||
|
|
||||||
/* III. Release all resources and exit */
|
/* III. Release all resources and exit */
|
||||||
|
|
||||||
log_info("Listener_thread::run(): shutdown requested, exiting...");
|
log_info("Listener_thread: shutdown requested, exiting...");
|
||||||
|
|
||||||
for (i= 0; i < num_sockets; i++)
|
for (i= 0; i < num_sockets; i++)
|
||||||
close(sockets[i]);
|
close(sockets[i]);
|
||||||
@ -209,6 +211,8 @@ void Listener_thread::run()
|
|||||||
|
|
||||||
thread_registry.unregister_thread(&thread_info);
|
thread_registry.unregister_thread(&thread_info);
|
||||||
my_thread_end();
|
my_thread_end();
|
||||||
|
|
||||||
|
log_info("Listener_thread: finished.");
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -230,7 +234,7 @@ int Listener_thread::create_tcp_socket()
|
|||||||
int ip_socket= socket(AF_INET, SOCK_STREAM, 0);
|
int ip_socket= socket(AF_INET, SOCK_STREAM, 0);
|
||||||
if (ip_socket == INVALID_SOCKET)
|
if (ip_socket == INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
log_error("Listener_thead::run(): socket(AF_INET) failed, %s",
|
log_error("Listener_thead: socket(AF_INET) failed, %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -261,7 +265,7 @@ int Listener_thread::create_tcp_socket()
|
|||||||
if (bind(ip_socket, (struct sockaddr *) &ip_socket_address,
|
if (bind(ip_socket, (struct sockaddr *) &ip_socket_address,
|
||||||
sizeof(ip_socket_address)))
|
sizeof(ip_socket_address)))
|
||||||
{
|
{
|
||||||
log_error("Listener_thread::run(): bind(ip socket) failed, '%s'",
|
log_error("Listener_thread: bind(ip socket) failed, '%s'",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(ip_socket);
|
close(ip_socket);
|
||||||
return -1;
|
return -1;
|
||||||
@ -269,7 +273,7 @@ int Listener_thread::create_tcp_socket()
|
|||||||
|
|
||||||
if (listen(ip_socket, LISTEN_BACK_LOG_SIZE))
|
if (listen(ip_socket, LISTEN_BACK_LOG_SIZE))
|
||||||
{
|
{
|
||||||
log_error("Listener_thread::run(): listen(ip socket) failed, %s",
|
log_error("Listener_thread: listen(ip socket) failed, %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(ip_socket);
|
close(ip_socket);
|
||||||
return -1;
|
return -1;
|
||||||
@ -283,7 +287,7 @@ int Listener_thread::create_tcp_socket()
|
|||||||
|
|
||||||
FD_SET(ip_socket, &read_fds);
|
FD_SET(ip_socket, &read_fds);
|
||||||
sockets[num_sockets++]= ip_socket;
|
sockets[num_sockets++]= ip_socket;
|
||||||
log_info("accepting connections on ip socket");
|
log_info("accepting connections on ip socket (port: %d)", (int) im_port);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,7 +298,7 @@ create_unix_socket(struct sockaddr_un &unix_socket_address)
|
|||||||
int unix_socket= socket(AF_UNIX, SOCK_STREAM, 0);
|
int unix_socket= socket(AF_UNIX, SOCK_STREAM, 0);
|
||||||
if (unix_socket == INVALID_SOCKET)
|
if (unix_socket == INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
log_error("Listener_thead::run(): socket(AF_UNIX) failed, %s",
|
log_error("Listener_thead: socket(AF_UNIX) failed, %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -314,7 +318,7 @@ create_unix_socket(struct sockaddr_un &unix_socket_address)
|
|||||||
if (bind(unix_socket, (struct sockaddr *) &unix_socket_address,
|
if (bind(unix_socket, (struct sockaddr *) &unix_socket_address,
|
||||||
sizeof(unix_socket_address)))
|
sizeof(unix_socket_address)))
|
||||||
{
|
{
|
||||||
log_error("Listener_thread::run(): bind(unix socket) failed, "
|
log_error("Listener_thread: bind(unix socket) failed, "
|
||||||
"socket file name is '%s', error '%s'",
|
"socket file name is '%s', error '%s'",
|
||||||
unix_socket_address.sun_path, strerror(errno));
|
unix_socket_address.sun_path, strerror(errno));
|
||||||
close(unix_socket);
|
close(unix_socket);
|
||||||
@ -325,7 +329,7 @@ create_unix_socket(struct sockaddr_un &unix_socket_address)
|
|||||||
|
|
||||||
if (listen(unix_socket, LISTEN_BACK_LOG_SIZE))
|
if (listen(unix_socket, LISTEN_BACK_LOG_SIZE))
|
||||||
{
|
{
|
||||||
log_error("Listener_thread::run(): listen(unix socket) failed, %s",
|
log_error("Listener_thread: listen(unix socket) failed, %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(unix_socket);
|
close(unix_socket);
|
||||||
return -1;
|
return -1;
|
||||||
@ -337,7 +341,7 @@ create_unix_socket(struct sockaddr_un &unix_socket_address)
|
|||||||
/* make sure that instances won't be listening our sockets */
|
/* make sure that instances won't be listening our sockets */
|
||||||
set_no_inherit(unix_socket);
|
set_no_inherit(unix_socket);
|
||||||
|
|
||||||
log_info("accepting connections on unix socket %s",
|
log_info("accepting connections on unix socket '%s'",
|
||||||
unix_socket_address.sun_path);
|
unix_socket_address.sun_path);
|
||||||
sockets[num_sockets++]= unix_socket;
|
sockets[num_sockets++]= unix_socket;
|
||||||
FD_SET(unix_socket, &read_fds);
|
FD_SET(unix_socket, &read_fds);
|
||||||
|
@ -52,8 +52,10 @@ static inline void log(FILE *file, const char *format, va_list args)
|
|||||||
struct tm bd_time; // broken-down time
|
struct tm bd_time; // broken-down time
|
||||||
localtime_r(&now, &bd_time);
|
localtime_r(&now, &bd_time);
|
||||||
|
|
||||||
char buff_date[32];
|
char buff_date[128];
|
||||||
sprintf(buff_date, "%02d%02d%02d %2d:%02d:%02d\t",
|
sprintf(buff_date, "[%d/%lu] [%02d/%02d/%02d %02d:%02d:%02d] ",
|
||||||
|
(int) getpid(),
|
||||||
|
(unsigned long) pthread_self(),
|
||||||
bd_time.tm_year % 100,
|
bd_time.tm_year % 100,
|
||||||
bd_time.tm_mon + 1,
|
bd_time.tm_mon + 1,
|
||||||
bd_time.tm_mday,
|
bd_time.tm_mday,
|
||||||
|
@ -120,6 +120,19 @@ int my_sigwait(const sigset_t *set, int *sig)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void stop_all(Guardian_thread *guardian, Thread_registry *registry)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Let guardian thread know that it should break it's processing cycle,
|
||||||
|
once it wakes up.
|
||||||
|
*/
|
||||||
|
guardian->request_shutdown();
|
||||||
|
/* wake guardian */
|
||||||
|
pthread_cond_signal(&guardian->COND_guardian);
|
||||||
|
/* stop all threads */
|
||||||
|
registry->deliver_shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
manager - entry point to the main instance manager process: start
|
manager - entry point to the main instance manager process: start
|
||||||
listener thread, write pid file and enter into signal handling.
|
listener thread, write pid file and enter into signal handling.
|
||||||
@ -143,7 +156,8 @@ void manager()
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
User_map user_map;
|
User_map user_map;
|
||||||
Instance_map instance_map(Options::Main::default_mysqld_path);
|
Instance_map instance_map(Options::Main::default_mysqld_path,
|
||||||
|
thread_registry);
|
||||||
Guardian_thread guardian_thread(thread_registry,
|
Guardian_thread guardian_thread(thread_registry,
|
||||||
&instance_map,
|
&instance_map,
|
||||||
Options::Main::monitoring_interval);
|
Options::Main::monitoring_interval);
|
||||||
@ -251,7 +265,6 @@ void manager()
|
|||||||
|
|
||||||
/* Load instances. */
|
/* Load instances. */
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
instance_map.guardian->lock();
|
instance_map.guardian->lock();
|
||||||
instance_map.lock();
|
instance_map.lock();
|
||||||
@ -266,7 +279,8 @@ void manager()
|
|||||||
log_error("Cannot init instances repository. This might be caused by "
|
log_error("Cannot init instances repository. This might be caused by "
|
||||||
"the wrong config file options. For instance, missing mysqld "
|
"the wrong config file options. For instance, missing mysqld "
|
||||||
"binary. Aborting.");
|
"binary. Aborting.");
|
||||||
return;
|
stop_all(&guardian_thread, &thread_registry);
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,6 +298,7 @@ void manager()
|
|||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
log_error("manager(): set_stacksize_n_create_thread(listener) failed");
|
log_error("manager(): set_stacksize_n_create_thread(listener) failed");
|
||||||
|
stop_all(&guardian_thread, &thread_registry);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -294,6 +309,8 @@ void manager()
|
|||||||
*/
|
*/
|
||||||
pthread_cond_signal(&guardian_thread.COND_guardian);
|
pthread_cond_signal(&guardian_thread.COND_guardian);
|
||||||
|
|
||||||
|
log_info("Main loop: started.");
|
||||||
|
|
||||||
while (!shutdown_complete)
|
while (!shutdown_complete)
|
||||||
{
|
{
|
||||||
int signo;
|
int signo;
|
||||||
@ -302,9 +319,24 @@ void manager()
|
|||||||
if ((status= my_sigwait(&mask, &signo)) != 0)
|
if ((status= my_sigwait(&mask, &signo)) != 0)
|
||||||
{
|
{
|
||||||
log_error("sigwait() failed");
|
log_error("sigwait() failed");
|
||||||
|
stop_all(&guardian_thread, &thread_registry);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The general idea in this loop is the following:
|
||||||
|
- we are waiting for SIGINT, SIGTERM -- signals that mean we should
|
||||||
|
shutdown;
|
||||||
|
- as shutdown signal is caught, we stop Guardian thread (by calling
|
||||||
|
Guardian_thread::request_shutdown());
|
||||||
|
- as Guardian_thread is stopped, it sends SIGTERM to this thread
|
||||||
|
(by calling Thread_registry::request_shutdown()), so that the
|
||||||
|
my_sigwait() above returns;
|
||||||
|
- as we catch the second SIGTERM, we send signals to all threads
|
||||||
|
registered in Thread_registry (by calling
|
||||||
|
Thread_registry::deliver_shutdown()) and waiting for threads to stop;
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef __WIN__
|
#ifndef __WIN__
|
||||||
/*
|
/*
|
||||||
On some Darwin kernels SIGHUP is delivered along with most
|
On some Darwin kernels SIGHUP is delivered along with most
|
||||||
@ -321,10 +353,11 @@ void manager()
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
log_info("Main loop: got shutdown signal.");
|
||||||
|
|
||||||
if (!guardian_thread.is_stopped())
|
if (!guardian_thread.is_stopped())
|
||||||
{
|
{
|
||||||
bool stop_instances= TRUE;
|
guardian_thread.request_shutdown();
|
||||||
guardian_thread.request_shutdown(stop_instances);
|
|
||||||
pthread_cond_signal(&guardian_thread.COND_guardian);
|
pthread_cond_signal(&guardian_thread.COND_guardian);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -335,6 +368,8 @@ void manager()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_info("Main loop: finished.");
|
||||||
|
|
||||||
err:
|
err:
|
||||||
/* delete the pid file */
|
/* delete the pid file */
|
||||||
my_delete(Options::Main::pid_file_name, MYF(0));
|
my_delete(Options::Main::pid_file_name, MYF(0));
|
||||||
|
@ -97,7 +97,7 @@ Mysql_connection_thread::Mysql_connection_thread(
|
|||||||
args.user_map,
|
args.user_map,
|
||||||
args.connection_id,
|
args.connection_id,
|
||||||
args.instance_map)
|
args.instance_map)
|
||||||
,thread_info(pthread_self())
|
,thread_info(pthread_self(), TRUE)
|
||||||
{
|
{
|
||||||
thread_registry.register_thread(&thread_info);
|
thread_registry.register_thread(&thread_info);
|
||||||
}
|
}
|
||||||
@ -165,7 +165,7 @@ Mysql_connection_thread::~Mysql_connection_thread()
|
|||||||
|
|
||||||
void Mysql_connection_thread::run()
|
void Mysql_connection_thread::run()
|
||||||
{
|
{
|
||||||
log_info("accepted mysql connection %lu", connection_id);
|
log_info("accepted mysql connection %lu", (unsigned long) connection_id);
|
||||||
|
|
||||||
my_thread_init();
|
my_thread_init();
|
||||||
|
|
||||||
@ -175,7 +175,8 @@ void Mysql_connection_thread::run()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info("connection %lu is checked successfully", connection_id);
|
log_info("connection %lu is checked successfully",
|
||||||
|
(unsigned long) connection_id);
|
||||||
|
|
||||||
vio_keepalive(vio, TRUE);
|
vio_keepalive(vio, TRUE);
|
||||||
|
|
||||||
@ -315,7 +316,7 @@ int Mysql_connection_thread::do_command()
|
|||||||
enum enum_server_command command= (enum enum_server_command)
|
enum enum_server_command command= (enum enum_server_command)
|
||||||
(uchar) *packet;
|
(uchar) *packet;
|
||||||
log_info("connection %lu: packet_length=%lu, command=%d",
|
log_info("connection %lu: packet_length=%lu, command=%d",
|
||||||
connection_id, packet_length, command);
|
(int) connection_id, (int) packet_length, (int) command);
|
||||||
return dispatch_command(command, packet + 1, packet_length - 1);
|
return dispatch_command(command, packet + 1, packet_length - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -325,27 +326,33 @@ int Mysql_connection_thread::dispatch_command(enum enum_server_command command,
|
|||||||
{
|
{
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case COM_QUIT: // client exit
|
case COM_QUIT: // client exit
|
||||||
log_info("query for connection %lu received quit command", connection_id);
|
log_info("query for connection %lu received quit command",
|
||||||
|
(unsigned long) connection_id);
|
||||||
return 1;
|
return 1;
|
||||||
case COM_PING:
|
case COM_PING:
|
||||||
log_info("query for connection %lu received ping command", connection_id);
|
log_info("query for connection %lu received ping command",
|
||||||
|
(unsigned long) connection_id);
|
||||||
net_send_ok(&net, connection_id, NULL);
|
net_send_ok(&net, connection_id, NULL);
|
||||||
break;
|
break;
|
||||||
case COM_QUERY:
|
case COM_QUERY:
|
||||||
{
|
{
|
||||||
log_info("query for connection %lu : ----\n%s\n-------------------------",
|
log_info("query for connection %lu : ----\n%s\n-------------------------",
|
||||||
connection_id,packet);
|
(int) connection_id,
|
||||||
|
(const char *) packet);
|
||||||
if (Command *command= parse_command(&instance_map, packet))
|
if (Command *command= parse_command(&instance_map, packet))
|
||||||
{
|
{
|
||||||
int res= 0;
|
int res= 0;
|
||||||
log_info("query for connection %lu successfully parsed",connection_id);
|
log_info("query for connection %lu successfully parsed",
|
||||||
|
(unsigned long) connection_id);
|
||||||
res= command->execute(&net, connection_id);
|
res= command->execute(&net, connection_id);
|
||||||
delete command;
|
delete command;
|
||||||
if (!res)
|
if (!res)
|
||||||
log_info("query for connection %lu executed ok",connection_id);
|
log_info("query for connection %lu executed ok",
|
||||||
|
(unsigned long) connection_id);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_info("query for connection %lu executed err=%d",connection_id,res);
|
log_info("query for connection %lu executed err=%d",
|
||||||
|
(unsigned long) connection_id, (int) res);
|
||||||
net_send_error(&net, res);
|
net_send_error(&net, res);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -358,7 +365,8 @@ int Mysql_connection_thread::dispatch_command(enum enum_server_command command,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
log_info("query for connection %lu received unknown command",connection_id);
|
log_info("query for connection %lu received unknown command",
|
||||||
|
(unsigned long) connection_id);
|
||||||
net_send_error(&net, ER_UNKNOWN_COM_ERROR);
|
net_send_error(&net, ER_UNKNOWN_COM_ERROR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
static char win_dflt_config_file_name[FN_REFLEN];
|
static char win_dflt_config_file_name[FN_REFLEN];
|
||||||
static char win_dflt_password_file_name[FN_REFLEN];
|
static char win_dflt_password_file_name[FN_REFLEN];
|
||||||
static char win_dflt_pid_file_name[FN_REFLEN];
|
static char win_dflt_pid_file_name[FN_REFLEN];
|
||||||
static char win_dflt_socket_file_name[FN_REFLEN];
|
|
||||||
|
|
||||||
static char win_dflt_mysqld_path[FN_REFLEN];
|
static char win_dflt_mysqld_path[FN_REFLEN];
|
||||||
|
|
||||||
@ -54,7 +53,6 @@ my_bool Options::Service::stand_alone;
|
|||||||
const char *Options::Main::config_file= win_dflt_config_file_name;
|
const char *Options::Main::config_file= win_dflt_config_file_name;
|
||||||
const char *Options::Main::password_file_name= win_dflt_password_file_name;
|
const char *Options::Main::password_file_name= win_dflt_password_file_name;
|
||||||
const char *Options::Main::pid_file_name= win_dflt_pid_file_name;
|
const char *Options::Main::pid_file_name= win_dflt_pid_file_name;
|
||||||
const char *Options::Main::socket_file_name= win_dflt_socket_file_name;
|
|
||||||
|
|
||||||
const char *Options::Main::default_mysqld_path= win_dflt_mysqld_path;
|
const char *Options::Main::default_mysqld_path= win_dflt_mysqld_path;
|
||||||
|
|
||||||
@ -262,10 +260,12 @@ static struct my_option my_long_options[] =
|
|||||||
0, 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 0, 0 },
|
0, 0, GET_BOOL, NO_ARG, 0, 0, 1, 0, 0, 0 },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __WIN__
|
||||||
{ "socket", OPT_SOCKET, "Socket file to use for connection.",
|
{ "socket", OPT_SOCKET, "Socket file to use for connection.",
|
||||||
(gptr *) &Options::Main::socket_file_name,
|
(gptr *) &Options::Main::socket_file_name,
|
||||||
(gptr *) &Options::Main::socket_file_name,
|
(gptr *) &Options::Main::socket_file_name,
|
||||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
{ "standalone", OPT_STAND_ALONE, "Run the application in stand alone mode.",
|
{ "standalone", OPT_STAND_ALONE, "Run the application in stand alone mode.",
|
||||||
@ -550,8 +550,6 @@ static int setup_windows_defaults()
|
|||||||
strxmov(win_dflt_password_file_name, dir_name, im_name, DFLT_PASSWD_FILE_EXT,
|
strxmov(win_dflt_password_file_name, dir_name, im_name, DFLT_PASSWD_FILE_EXT,
|
||||||
NullS);
|
NullS);
|
||||||
strxmov(win_dflt_pid_file_name, dir_name, im_name, DFLT_PID_FILE_EXT, NullS);
|
strxmov(win_dflt_pid_file_name, dir_name, im_name, DFLT_PID_FILE_EXT, NullS);
|
||||||
strxmov(win_dflt_socket_file_name, dir_name, im_name, DFLT_SOCKET_FILE_EXT,
|
|
||||||
NullS);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,9 @@ struct Options
|
|||||||
static bool is_forced_default_file;
|
static bool is_forced_default_file;
|
||||||
|
|
||||||
static const char *pid_file_name;
|
static const char *pid_file_name;
|
||||||
|
#ifndef __WIN__
|
||||||
static const char *socket_file_name;
|
static const char *socket_file_name;
|
||||||
|
#endif
|
||||||
static const char *password_file_name;
|
static const char *password_file_name;
|
||||||
static const char *default_mysqld_path;
|
static const char *default_mysqld_path;
|
||||||
static uint monitoring_interval;
|
static uint monitoring_interval;
|
||||||
|
@ -43,8 +43,10 @@ static void handle_signal(int __attribute__((unused)) sig_no)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Thread_info::Thread_info() {}
|
Thread_info::Thread_info() {}
|
||||||
Thread_info::Thread_info(pthread_t thread_id_arg) :
|
Thread_info::Thread_info(pthread_t thread_id_arg,
|
||||||
thread_id(thread_id_arg) {}
|
bool send_signal_on_shutdown_arg) :
|
||||||
|
thread_id(thread_id_arg),
|
||||||
|
send_signal_on_shutdown(send_signal_on_shutdown_arg) {}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: think about moving signal information (now it's shutdown_in_progress)
|
TODO: think about moving signal information (now it's shutdown_in_progress)
|
||||||
@ -86,6 +88,9 @@ Thread_registry::~Thread_registry()
|
|||||||
|
|
||||||
void Thread_registry::register_thread(Thread_info *info)
|
void Thread_registry::register_thread(Thread_info *info)
|
||||||
{
|
{
|
||||||
|
log_info("Thread_registry: registering thread %d...",
|
||||||
|
(int) info->thread_id);
|
||||||
|
|
||||||
#ifndef __WIN__
|
#ifndef __WIN__
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
sa.sa_handler= handle_signal;
|
sa.sa_handler= handle_signal;
|
||||||
@ -112,11 +117,19 @@ void Thread_registry::register_thread(Thread_info *info)
|
|||||||
|
|
||||||
void Thread_registry::unregister_thread(Thread_info *info)
|
void Thread_registry::unregister_thread(Thread_info *info)
|
||||||
{
|
{
|
||||||
|
log_info("Thread_registry: unregistering thread %d...",
|
||||||
|
(int) info->thread_id);
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_thread_registry);
|
pthread_mutex_lock(&LOCK_thread_registry);
|
||||||
info->prev->next= info->next;
|
info->prev->next= info->next;
|
||||||
info->next->prev= info->prev;
|
info->next->prev= info->prev;
|
||||||
|
|
||||||
if (head.next == &head)
|
if (head.next == &head)
|
||||||
|
{
|
||||||
|
log_info("Thread_registry: thread registry is empty!");
|
||||||
pthread_cond_signal(&COND_thread_registry_is_empty);
|
pthread_cond_signal(&COND_thread_registry_is_empty);
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&LOCK_thread_registry);
|
pthread_mutex_unlock(&LOCK_thread_registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,11 +194,6 @@ int Thread_registry::cond_timedwait(Thread_info *info, pthread_cond_t *cond,
|
|||||||
|
|
||||||
void Thread_registry::deliver_shutdown()
|
void Thread_registry::deliver_shutdown()
|
||||||
{
|
{
|
||||||
Thread_info *info;
|
|
||||||
struct timespec shutdown_time;
|
|
||||||
int error;
|
|
||||||
set_timespec(shutdown_time, 1);
|
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_thread_registry);
|
pthread_mutex_lock(&LOCK_thread_registry);
|
||||||
shutdown_in_progress= TRUE;
|
shutdown_in_progress= TRUE;
|
||||||
|
|
||||||
@ -199,29 +207,14 @@ void Thread_registry::deliver_shutdown()
|
|||||||
process_alarm(THR_SERVER_ALARM);
|
process_alarm(THR_SERVER_ALARM);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (info= head.next; info != &head; info= info->next)
|
|
||||||
{
|
|
||||||
pthread_kill(info->thread_id, THREAD_KICK_OFF_SIGNAL);
|
|
||||||
/*
|
/*
|
||||||
sic: race condition here, the thread may not yet fall into
|
sic: race condition here, the thread may not yet fall into
|
||||||
pthread_cond_wait.
|
pthread_cond_wait.
|
||||||
*/
|
*/
|
||||||
if (info->current_cond)
|
|
||||||
pthread_cond_signal(info->current_cond);
|
interrupt_threads();
|
||||||
}
|
|
||||||
/*
|
wait_for_threads_to_unregister();
|
||||||
The common practice is to test predicate before pthread_cond_wait.
|
|
||||||
I don't do that here because the predicate is practically always false
|
|
||||||
before wait - is_shutdown's been just set, and the lock's still not
|
|
||||||
released - the only case when the predicate is false is when no other
|
|
||||||
threads exist.
|
|
||||||
*/
|
|
||||||
while (((error= pthread_cond_timedwait(&COND_thread_registry_is_empty,
|
|
||||||
&LOCK_thread_registry,
|
|
||||||
&shutdown_time)) != ETIMEDOUT &&
|
|
||||||
error != ETIME) &&
|
|
||||||
head.next != &head)
|
|
||||||
;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If previous signals did not reach some threads, they must be sleeping
|
If previous signals did not reach some threads, they must be sleeping
|
||||||
@ -230,11 +223,28 @@ void Thread_registry::deliver_shutdown()
|
|||||||
so this time everybody should be informed (presumably each worker can
|
so this time everybody should be informed (presumably each worker can
|
||||||
get CPU during shutdown_time.)
|
get CPU during shutdown_time.)
|
||||||
*/
|
*/
|
||||||
for (info= head.next; info != &head; info= info->next)
|
|
||||||
|
interrupt_threads();
|
||||||
|
|
||||||
|
/* Get the last chance to threads to stop. */
|
||||||
|
|
||||||
|
wait_for_threads_to_unregister();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Print out threads, that didn't stopped. Thread_registry destructor will
|
||||||
|
probably abort the program if there is still any alive thread.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (head.next != &head)
|
||||||
{
|
{
|
||||||
pthread_kill(info->thread_id, THREAD_KICK_OFF_SIGNAL);
|
log_info("Thread_registry: non-stopped threads:");
|
||||||
if (info->current_cond)
|
|
||||||
pthread_cond_signal(info->current_cond);
|
for (Thread_info *info= head.next; info != &head; info= info->next)
|
||||||
|
log_info(" - %ld", (long int) info->thread_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log_info("Thread_registry: all threads stopped.");
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&LOCK_thread_registry);
|
pthread_mutex_unlock(&LOCK_thread_registry);
|
||||||
@ -245,3 +255,46 @@ void Thread_registry::request_shutdown()
|
|||||||
{
|
{
|
||||||
pthread_kill(sigwait_thread_pid, SIGTERM);
|
pthread_kill(sigwait_thread_pid, SIGTERM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Thread_registry::interrupt_threads()
|
||||||
|
{
|
||||||
|
for (Thread_info *info= head.next; info != &head; info= info->next)
|
||||||
|
{
|
||||||
|
if (!info->send_signal_on_shutdown)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
pthread_kill(info->thread_id, THREAD_KICK_OFF_SIGNAL);
|
||||||
|
if (info->current_cond)
|
||||||
|
pthread_cond_signal(info->current_cond);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Thread_registry::wait_for_threads_to_unregister()
|
||||||
|
{
|
||||||
|
struct timespec shutdown_time;
|
||||||
|
|
||||||
|
set_timespec(shutdown_time, 1);
|
||||||
|
|
||||||
|
log_info("Thread_registry: joining threads...");
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (head.next == &head)
|
||||||
|
{
|
||||||
|
log_info("Thread_registry: emptied.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int error= pthread_cond_timedwait(&COND_thread_registry_is_empty,
|
||||||
|
&LOCK_thread_registry,
|
||||||
|
&shutdown_time);
|
||||||
|
|
||||||
|
if (error == ETIMEDOUT || error == ETIME)
|
||||||
|
{
|
||||||
|
log_info("Thread_registry: threads shutdown timed out.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -67,13 +67,17 @@
|
|||||||
class Thread_info
|
class Thread_info
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Thread_info();
|
Thread_info(pthread_t thread_id_arg, bool send_signal_on_shutdown_arg);
|
||||||
Thread_info(pthread_t thread_id_arg);
|
|
||||||
friend class Thread_registry;
|
friend class Thread_registry;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Thread_info();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
pthread_cond_t *current_cond;
|
pthread_cond_t *current_cond;
|
||||||
Thread_info *prev, *next;
|
Thread_info *prev, *next;
|
||||||
pthread_t thread_id;
|
pthread_t thread_id;
|
||||||
|
bool send_signal_on_shutdown;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -97,6 +101,10 @@ public:
|
|||||||
pthread_mutex_t *mutex);
|
pthread_mutex_t *mutex);
|
||||||
int cond_timedwait(Thread_info *info, pthread_cond_t *cond,
|
int cond_timedwait(Thread_info *info, pthread_cond_t *cond,
|
||||||
pthread_mutex_t *mutex, struct timespec *wait_time);
|
pthread_mutex_t *mutex, struct timespec *wait_time);
|
||||||
|
private:
|
||||||
|
void interrupt_threads();
|
||||||
|
void wait_for_threads_to_unregister();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Thread_info head;
|
Thread_info head;
|
||||||
bool shutdown_in_progress;
|
bool shutdown_in_progress;
|
||||||
|
@ -886,14 +886,29 @@ Event_queue_element::load_from_row(TABLE *table)
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
In DB the values start from 1 but enum interval_type starts
|
We load the interval type from disk as string and then map it to
|
||||||
from 0
|
an integer. This decouples the values of enum interval_type
|
||||||
|
and values actually stored on disk. Therefore the type can be
|
||||||
|
reordered without risking incompatibilities of data between versions.
|
||||||
*/
|
*/
|
||||||
if (!table->field[ET_FIELD_TRANSIENT_INTERVAL]->is_null())
|
if (!table->field[ET_FIELD_TRANSIENT_INTERVAL]->is_null())
|
||||||
interval= (interval_type) ((ulonglong)
|
{
|
||||||
table->field[ET_FIELD_TRANSIENT_INTERVAL]->val_int() - 1);
|
int i;
|
||||||
else
|
char buff[MAX_FIELD_WIDTH];
|
||||||
interval= (interval_type) 0;
|
String str(buff, sizeof(buff), &my_charset_bin);
|
||||||
|
LEX_STRING tmp;
|
||||||
|
|
||||||
|
table->field[ET_FIELD_TRANSIENT_INTERVAL]->val_str(&str);
|
||||||
|
if (!(tmp.length= str.length()))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
tmp.str= str.c_ptr_safe();
|
||||||
|
|
||||||
|
i= find_string_in_array(interval_type_to_name, &tmp, system_charset_info);
|
||||||
|
if (i < 0)
|
||||||
|
goto error;
|
||||||
|
interval= (interval_type) i;
|
||||||
|
}
|
||||||
|
|
||||||
table->field[ET_FIELD_LAST_EXECUTED]->get_date(&last_executed,
|
table->field[ET_FIELD_LAST_EXECUTED]->get_date(&last_executed,
|
||||||
TIME_NO_ZERO_DATE);
|
TIME_NO_ZERO_DATE);
|
||||||
|
@ -188,11 +188,11 @@ mysql_event_fill_row(THD *thd, TABLE *table, Event_parse_data *et,
|
|||||||
fields[ET_FIELD_INTERVAL_EXPR]->store((longlong)et->expression, TRUE);
|
fields[ET_FIELD_INTERVAL_EXPR]->store((longlong)et->expression, TRUE);
|
||||||
|
|
||||||
fields[ET_FIELD_TRANSIENT_INTERVAL]->set_notnull();
|
fields[ET_FIELD_TRANSIENT_INTERVAL]->set_notnull();
|
||||||
/*
|
|
||||||
In the enum (C) intervals start from 0 but in mysql enum valid values
|
fields[ET_FIELD_TRANSIENT_INTERVAL]->
|
||||||
start from 1. Thus +1 offset is needed!
|
store(interval_type_to_name[et->interval].str,
|
||||||
*/
|
interval_type_to_name[et->interval].length,
|
||||||
fields[ET_FIELD_TRANSIENT_INTERVAL]->store((longlong)et->interval+1, TRUE);
|
scs);
|
||||||
|
|
||||||
fields[ET_FIELD_EXECUTE_AT]->set_null();
|
fields[ET_FIELD_EXECUTE_AT]->set_null();
|
||||||
|
|
||||||
|
@ -1483,8 +1483,9 @@ bool handler::check_if_log_table_locking_is_allowed(uint sql_command,
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Deny locking of the log tables, which is incompatible with
|
Deny locking of the log tables, which is incompatible with
|
||||||
concurrent insert. Unless called from a logger THD:
|
concurrent insert. The routine is not called if the table is
|
||||||
general_log_thd or slow_log_thd.
|
being locked from a logger THD (general_log_thd or slow_log_thd)
|
||||||
|
or from a privileged thread (see log.cc for details)
|
||||||
*/
|
*/
|
||||||
if (table->s->log_table &&
|
if (table->s->log_table &&
|
||||||
sql_command != SQLCOM_TRUNCATE &&
|
sql_command != SQLCOM_TRUNCATE &&
|
||||||
|
@ -975,6 +975,10 @@ public:
|
|||||||
thd Handler of the thread, trying to lock the table
|
thd Handler of the thread, trying to lock the table
|
||||||
table Table handler to check
|
table Table handler to check
|
||||||
count Number of locks already granted to the table
|
count Number of locks already granted to the table
|
||||||
|
called_by_privileged_thread TRUE if called from a logger THD
|
||||||
|
(general_log_thd or slow_log_thd)
|
||||||
|
or by a privileged thread, which
|
||||||
|
has the right to lock log tables.
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Check whether a handler allows to lock the table. For instance,
|
Check whether a handler allows to lock the table. For instance,
|
||||||
@ -990,7 +994,7 @@ public:
|
|||||||
virtual bool check_if_locking_is_allowed(uint sql_command,
|
virtual bool check_if_locking_is_allowed(uint sql_command,
|
||||||
ulong type, TABLE *table,
|
ulong type, TABLE *table,
|
||||||
uint count,
|
uint count,
|
||||||
bool called_by_logger_thread)
|
bool called_by_privileged_thread)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
5144
sql/item_create.cc
5144
sql/item_create.cc
File diff suppressed because it is too large
Load Diff
@ -14,148 +14,154 @@
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
/* Functions to create an item. Used by lex.h */
|
/* Functions to create an item. Used by sql/sql_yacc.yy */
|
||||||
|
|
||||||
Item *create_func_abs(Item* a);
|
#ifndef ITEM_CREATE_H
|
||||||
Item *create_func_acos(Item* a);
|
#define ITEM_CREATE_H
|
||||||
Item *create_func_aes_encrypt(Item* a, Item* b);
|
|
||||||
Item *create_func_aes_decrypt(Item* a, Item* b);
|
/**
|
||||||
Item *create_func_ascii(Item* a);
|
Public function builder interface.
|
||||||
Item *create_func_asin(Item* a);
|
The parser (sql/sql_yacc.yy) uses a factory / builder pattern to
|
||||||
Item *create_func_bin(Item* a);
|
construct an <code>Item</code> object for each function call.
|
||||||
Item *create_func_bit_count(Item* a);
|
All the concrete function builders implements this interface,
|
||||||
Item *create_func_bit_length(Item* a);
|
either directly or indirectly with some adapter helpers.
|
||||||
Item *create_func_coercibility(Item* a);
|
Keeping the function creation separated from the bison grammar allows
|
||||||
Item *create_func_ceiling(Item* a);
|
to simplify the parser, and avoid the need to introduce a new token
|
||||||
Item *create_func_char_length(Item* a);
|
for each function, which has undesirable side effects in the grammar.
|
||||||
Item *create_func_cast(Item *a, Cast_target cast_type, int len, int dec,
|
*/
|
||||||
|
|
||||||
|
class Create_func
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
The builder create method.
|
||||||
|
Given the function name and list or arguments, this method creates
|
||||||
|
an <code>Item</code> that represents the function call.
|
||||||
|
In case or errors, a NULL item is returned, and an error is reported.
|
||||||
|
Note that the <code>thd</code> object may be modified by the builder.
|
||||||
|
In particular, the following members/methods can be set/called,
|
||||||
|
depending on the function called and the function possible side effects.
|
||||||
|
<ul>
|
||||||
|
<li><code>thd->lex->binlog_row_based_if_mixed</code></li>
|
||||||
|
<li><code>thd->lex->current_context()</code></li>
|
||||||
|
<li><code>thd->lex->safe_to_cache_query</code></li>
|
||||||
|
<li><code>thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT)</code></li>
|
||||||
|
<li><code>thd->lex->uncacheable(UNCACHEABLE_RAND)</code></li>
|
||||||
|
<li><code>thd->lex->add_time_zone_tables_to_query_tables(thd)</code></li>
|
||||||
|
</ul>
|
||||||
|
@param thd The current thread
|
||||||
|
@param name The function name
|
||||||
|
@param item_list The list of arguments to the function, can be NULL
|
||||||
|
@return An item representing the parsed function call, or NULL
|
||||||
|
*/
|
||||||
|
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** Constructor */
|
||||||
|
Create_func() {}
|
||||||
|
/** Destructor */
|
||||||
|
virtual ~Create_func() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function builder for qualified functions.
|
||||||
|
This builder is used with functions call using a qualified function name
|
||||||
|
syntax, as in <code>db.func(expr, expr, ...)</code>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Create_qfunc : public Create_func
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
The builder create method, for unqualified functions.
|
||||||
|
This builder will use the current database for the database name.
|
||||||
|
@param thd The current thread
|
||||||
|
@param name The function name
|
||||||
|
@param item_list The list of arguments to the function, can be NULL
|
||||||
|
@return An item representing the parsed function call
|
||||||
|
*/
|
||||||
|
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
The builder create method, for qualified functions.
|
||||||
|
@param thd The current thread
|
||||||
|
@param db The database name
|
||||||
|
@param name The function name
|
||||||
|
@param item_list The list of arguments to the function, can be NULL
|
||||||
|
@return An item representing the parsed function call
|
||||||
|
*/
|
||||||
|
virtual Item* create(THD *thd, LEX_STRING db, LEX_STRING name,
|
||||||
|
List<Item> *item_list) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** Constructor. */
|
||||||
|
Create_qfunc() {}
|
||||||
|
/** Destructor. */
|
||||||
|
virtual ~Create_qfunc() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Find the native function builder associated with a given function name.
|
||||||
|
@param thd The current thread
|
||||||
|
@param name The native function name
|
||||||
|
@return The native function builder associated with the name, or NULL
|
||||||
|
*/
|
||||||
|
extern Create_func * find_native_function_builder(THD *thd, LEX_STRING name);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Find the function builder for qualified functions.
|
||||||
|
@param thd The current thread
|
||||||
|
@return A function builder for qualified functions
|
||||||
|
*/
|
||||||
|
extern Create_qfunc * find_qualified_function_builder(THD *thd);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_DLOPEN
|
||||||
|
/**
|
||||||
|
Function builder for User Defined Functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Create_udf_func : public Create_func
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Item* create(THD *thd, LEX_STRING name, List<Item> *item_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
The builder create method, for User Defined Functions.
|
||||||
|
@param thd The current thread
|
||||||
|
@param fct The User Defined Function metadata
|
||||||
|
@param item_list The list of arguments to the function, can be NULL
|
||||||
|
@return An item representing the parsed function call
|
||||||
|
*/
|
||||||
|
Item* create(THD *thd, udf_func *fct, List<Item> *item_list);
|
||||||
|
|
||||||
|
/** Singleton. */
|
||||||
|
static Create_udf_func s_singleton;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** Constructor. */
|
||||||
|
Create_udf_func() {}
|
||||||
|
/** Destructor. */
|
||||||
|
virtual ~Create_udf_func() {}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Builder for cast expressions.
|
||||||
|
@param thd The current thread
|
||||||
|
@param a The item to cast
|
||||||
|
@param cast_type the type casted into
|
||||||
|
@param len TODO
|
||||||
|
@param dec TODO
|
||||||
|
@param cs The character set
|
||||||
|
*/
|
||||||
|
Item*
|
||||||
|
create_func_cast(THD *thd, Item *a, Cast_target cast_type, int len, int dec,
|
||||||
CHARSET_INFO *cs);
|
CHARSET_INFO *cs);
|
||||||
Item *create_func_connection_id(void);
|
|
||||||
Item *create_func_conv(Item* a, Item *b, Item *c);
|
|
||||||
Item *create_func_cos(Item* a);
|
|
||||||
Item *create_func_cot(Item* a);
|
|
||||||
Item *create_func_crc32(Item* a);
|
|
||||||
Item *create_func_date_format(Item* a,Item *b);
|
|
||||||
Item *create_func_dayname(Item* a);
|
|
||||||
Item *create_func_dayofmonth(Item* a);
|
|
||||||
Item *create_func_dayofweek(Item* a);
|
|
||||||
Item *create_func_dayofyear(Item* a);
|
|
||||||
Item *create_func_degrees(Item *);
|
|
||||||
Item *create_func_exp(Item* a);
|
|
||||||
Item *create_func_find_in_set(Item* a, Item *b);
|
|
||||||
Item *create_func_floor(Item* a);
|
|
||||||
Item *create_func_found_rows(void);
|
|
||||||
Item *create_func_from_days(Item* a);
|
|
||||||
Item *create_func_get_lock(Item* a, Item *b);
|
|
||||||
Item *create_func_hex(Item *a);
|
|
||||||
Item *create_func_inet_aton(Item* a);
|
|
||||||
Item *create_func_inet_ntoa(Item* a);
|
|
||||||
|
|
||||||
Item *create_func_ifnull(Item* a, Item *b);
|
#endif
|
||||||
Item *create_func_instr(Item* a, Item *b);
|
|
||||||
Item *create_func_isnull(Item* a);
|
|
||||||
Item *create_func_lcase(Item* a);
|
|
||||||
Item *create_func_length(Item* a);
|
|
||||||
Item *create_func_ln(Item* a);
|
|
||||||
Item *create_func_locate(Item* a, Item *b);
|
|
||||||
Item *create_func_log2(Item* a);
|
|
||||||
Item *create_func_log10(Item* a);
|
|
||||||
Item *create_func_lpad(Item* a, Item *b, Item *c);
|
|
||||||
Item *create_func_ltrim(Item* a);
|
|
||||||
Item *create_func_md5(Item* a);
|
|
||||||
Item *create_func_mod(Item* a, Item *b);
|
|
||||||
Item *create_func_monthname(Item* a);
|
|
||||||
Item *create_func_name_const(Item *a, Item *b);
|
|
||||||
Item *create_func_nullif(Item* a, Item *b);
|
|
||||||
Item *create_func_oct(Item *);
|
|
||||||
Item *create_func_ord(Item* a);
|
|
||||||
Item *create_func_period_add(Item* a, Item *b);
|
|
||||||
Item *create_func_period_diff(Item* a, Item *b);
|
|
||||||
Item *create_func_pi(void);
|
|
||||||
Item *create_func_pow(Item* a, Item *b);
|
|
||||||
Item *create_func_radians(Item *a);
|
|
||||||
Item *create_func_release_lock(Item* a);
|
|
||||||
Item *create_func_repeat(Item* a, Item *b);
|
|
||||||
Item *create_func_reverse(Item* a);
|
|
||||||
Item *create_func_rpad(Item* a, Item *b, Item *c);
|
|
||||||
Item *create_func_rtrim(Item* a);
|
|
||||||
Item *create_func_sec_to_time(Item* a);
|
|
||||||
Item *create_func_sign(Item* a);
|
|
||||||
Item *create_func_sin(Item* a);
|
|
||||||
Item *create_func_sha(Item* a);
|
|
||||||
Item *create_func_sleep(Item* a);
|
|
||||||
Item *create_func_soundex(Item* a);
|
|
||||||
Item *create_func_space(Item *);
|
|
||||||
Item *create_func_sqrt(Item* a);
|
|
||||||
Item *create_func_strcmp(Item* a, Item *b);
|
|
||||||
Item *create_func_tan(Item* a);
|
|
||||||
Item *create_func_time_format(Item *a, Item *b);
|
|
||||||
Item *create_func_time_to_sec(Item* a);
|
|
||||||
Item *create_func_to_days(Item* a);
|
|
||||||
Item *create_func_ucase(Item* a);
|
|
||||||
Item *create_func_unhex(Item* a);
|
|
||||||
Item *create_func_uuid(void);
|
|
||||||
Item *create_func_version(void);
|
|
||||||
Item *create_func_weekday(Item* a);
|
|
||||||
Item *create_load_file(Item* a);
|
|
||||||
Item *create_func_is_free_lock(Item* a);
|
|
||||||
Item *create_func_is_used_lock(Item* a);
|
|
||||||
Item *create_func_quote(Item* a);
|
|
||||||
Item *create_func_xml_extractvalue(Item *a, Item *b);
|
|
||||||
Item *create_func_xml_update(Item *a, Item *b, Item *c);
|
|
||||||
#ifdef HAVE_SPATIAL
|
|
||||||
|
|
||||||
Item *create_func_geometry_from_text(Item *a);
|
|
||||||
Item *create_func_as_wkt(Item *a);
|
|
||||||
Item *create_func_as_wkb(Item *a);
|
|
||||||
Item *create_func_srid(Item *a);
|
|
||||||
Item *create_func_startpoint(Item *a);
|
|
||||||
Item *create_func_endpoint(Item *a);
|
|
||||||
Item *create_func_exteriorring(Item *a);
|
|
||||||
Item *create_func_centroid(Item *a);
|
|
||||||
Item *create_func_envelope(Item *a);
|
|
||||||
Item *create_func_pointn(Item *a, Item *b);
|
|
||||||
Item *create_func_interiorringn(Item *a, Item *b);
|
|
||||||
Item *create_func_geometryn(Item *a, Item *b);
|
|
||||||
|
|
||||||
Item *create_func_equals(Item *a, Item *b);
|
|
||||||
Item *create_func_disjoint(Item *a, Item *b);
|
|
||||||
Item *create_func_intersects(Item *a, Item *b);
|
|
||||||
Item *create_func_touches(Item *a, Item *b);
|
|
||||||
Item *create_func_crosses(Item *a, Item *b);
|
|
||||||
Item *create_func_within(Item *a, Item *b);
|
|
||||||
Item *create_func_contains(Item *a, Item *b);
|
|
||||||
Item *create_func_overlaps(Item *a, Item *b);
|
|
||||||
|
|
||||||
Item *create_func_isempty(Item *a);
|
|
||||||
Item *create_func_issimple(Item *a);
|
|
||||||
Item *create_func_isclosed(Item *a);
|
|
||||||
|
|
||||||
Item *create_func_geometry_type(Item *a);
|
|
||||||
Item *create_func_dimension(Item *a);
|
|
||||||
Item *create_func_x(Item *a);
|
|
||||||
Item *create_func_y(Item *a);
|
|
||||||
Item *create_func_area(Item *a);
|
|
||||||
Item *create_func_glength(Item *a);
|
|
||||||
|
|
||||||
Item *create_func_numpoints(Item *a);
|
|
||||||
Item *create_func_numinteriorring(Item *a);
|
|
||||||
Item *create_func_numgeometries(Item *a);
|
|
||||||
|
|
||||||
Item *create_func_point(Item *a, Item *b);
|
|
||||||
|
|
||||||
#endif /*HAVE_SPATIAL*/
|
|
||||||
|
|
||||||
Item *create_func_compress(Item *a);
|
|
||||||
Item *create_func_uncompress(Item *a);
|
|
||||||
Item *create_func_uncompressed_length(Item *a);
|
|
||||||
|
|
||||||
Item *create_func_datediff(Item *a, Item *b);
|
|
||||||
Item *create_func_weekofyear(Item *a);
|
|
||||||
Item *create_func_makedate(Item* a,Item* b);
|
|
||||||
Item *create_func_addtime(Item* a,Item* b);
|
|
||||||
Item *create_func_subtime(Item* a,Item* b);
|
|
||||||
Item *create_func_timediff(Item* a,Item* b);
|
|
||||||
Item *create_func_maketime(Item* a,Item* b,Item* c);
|
|
||||||
Item *create_func_str_to_date(Item* a,Item* b);
|
|
||||||
Item *create_func_last_day(Item *a);
|
|
||||||
|
@ -348,11 +348,11 @@ public:
|
|||||||
void fix_length_and_dec() { max_length= 10; }
|
void fix_length_and_dec() { max_length= 10; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GEOM_NEW(obj_constructor) new obj_constructor
|
#define GEOM_NEW(thd, obj_constructor) new (thd->mem_root) obj_constructor
|
||||||
|
|
||||||
#else /*HAVE_SPATIAL*/
|
#else /*HAVE_SPATIAL*/
|
||||||
|
|
||||||
#define GEOM_NEW(obj_constructor) NULL
|
#define GEOM_NEW(thd, obj_constructor) NULL
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1065,6 +1065,7 @@ longlong Item_sum_count::val_int()
|
|||||||
void Item_sum_count::cleanup()
|
void Item_sum_count::cleanup()
|
||||||
{
|
{
|
||||||
DBUG_ENTER("Item_sum_count::cleanup");
|
DBUG_ENTER("Item_sum_count::cleanup");
|
||||||
|
count= 0;
|
||||||
Item_sum_int::cleanup();
|
Item_sum_int::cleanup();
|
||||||
used_table_cache= ~(table_map) 0;
|
used_table_cache= ~(table_map) 0;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
@ -260,9 +260,30 @@ public:
|
|||||||
Item_sum(THD *thd, Item_sum *item);
|
Item_sum(THD *thd, Item_sum *item);
|
||||||
enum Type type() const { return SUM_FUNC_ITEM; }
|
enum Type type() const { return SUM_FUNC_ITEM; }
|
||||||
virtual enum Sumfunctype sum_func () const=0;
|
virtual enum Sumfunctype sum_func () const=0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
This method is similar to add(), but it is called when the current
|
||||||
|
aggregation group changes. Thus it performs a combination of
|
||||||
|
clear() and add().
|
||||||
|
*/
|
||||||
inline bool reset() { clear(); return add(); };
|
inline bool reset() { clear(); return add(); };
|
||||||
|
|
||||||
|
/*
|
||||||
|
Prepare this item for evaluation of an aggregate value. This is
|
||||||
|
called by reset() when a group changes, or, for correlated
|
||||||
|
subqueries, between subquery executions. E.g. for COUNT(), this
|
||||||
|
method should set count= 0;
|
||||||
|
*/
|
||||||
virtual void clear()= 0;
|
virtual void clear()= 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
This method is called for the next row in the same group. Its
|
||||||
|
purpose is to aggregate the new value to the previous values in
|
||||||
|
the group (i.e. since clear() was called last time). For example,
|
||||||
|
for COUNT(), do count++.
|
||||||
|
*/
|
||||||
virtual bool add()=0;
|
virtual bool add()=0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Called when new group is started and results are being saved in
|
Called when new group is started and results are being saved in
|
||||||
a temporary table. Similar to reset(), but must also store value in
|
a temporary table. Similar to reset(), but must also store value in
|
||||||
@ -306,7 +327,17 @@ public:
|
|||||||
void make_field(Send_field *field);
|
void make_field(Send_field *field);
|
||||||
void print(String *str);
|
void print(String *str);
|
||||||
void fix_num_length_and_dec();
|
void fix_num_length_and_dec();
|
||||||
void no_rows_in_result() { reset(); }
|
|
||||||
|
/*
|
||||||
|
This function is called by the execution engine to assign 'NO ROWS
|
||||||
|
FOUND' value to an aggregate item, when the underlying result set
|
||||||
|
has no rows. Such value, in a general case, may be different from
|
||||||
|
the default value of the item after 'clear()': e.g. a numeric item
|
||||||
|
may be initialized to 0 by clear() and to NULL by
|
||||||
|
no_rows_in_result().
|
||||||
|
*/
|
||||||
|
void no_rows_in_result() { clear(); }
|
||||||
|
|
||||||
virtual bool setup(THD *thd) {return 0;}
|
virtual bool setup(THD *thd) {return 0;}
|
||||||
virtual void make_unique() {}
|
virtual void make_unique() {}
|
||||||
Item *get_tmp_table_item(THD *thd);
|
Item *get_tmp_table_item(THD *thd);
|
||||||
@ -610,6 +641,11 @@ public:
|
|||||||
const char *func_name() const { return "avg("; }
|
const char *func_name() const { return "avg("; }
|
||||||
Item *copy_or_same(THD* thd);
|
Item *copy_or_same(THD* thd);
|
||||||
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
|
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
count= 0;
|
||||||
|
Item_sum_sum::cleanup();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_sum_variance;
|
class Item_sum_variance;
|
||||||
@ -689,6 +725,12 @@ public:
|
|||||||
Item *copy_or_same(THD* thd);
|
Item *copy_or_same(THD* thd);
|
||||||
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
|
Field *create_tmp_field(bool group, TABLE *table, uint convert_blob_length);
|
||||||
enum Item_result result_type () const { return REAL_RESULT; }
|
enum Item_result result_type () const { return REAL_RESULT; }
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
cur_dec= 0;
|
||||||
|
count= 0;
|
||||||
|
Item_sum_num::cleanup();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_sum_std;
|
class Item_sum_std;
|
||||||
@ -819,6 +861,11 @@ public:
|
|||||||
void update_field();
|
void update_field();
|
||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{ decimals= 0; max_length=21; unsigned_flag= 1; maybe_null= null_value= 0; }
|
{ decimals= 0; max_length=21; unsigned_flag= 1; maybe_null= null_value= 0; }
|
||||||
|
void cleanup()
|
||||||
|
{
|
||||||
|
bits= reset_bits;
|
||||||
|
Item_sum_int::cleanup();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
212
sql/lex.h
212
sql/lex.h
@ -30,16 +30,7 @@ SYM_GROUP sym_group_rtree= {"RTree keys", "HAVE_RTREE_KEYS"};
|
|||||||
#define SYM_OR_NULL(A) A
|
#define SYM_OR_NULL(A) A
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SYM(A) SYM_OR_NULL(A),0,0,&sym_group_common
|
#define SYM(A) SYM_OR_NULL(A),0,&sym_group_common
|
||||||
#define F_SYM(A) SYM_OR_NULL(A)
|
|
||||||
|
|
||||||
#define CREATE_FUNC(A) (void *)(SYM_OR_NULL(A)), &sym_group_common
|
|
||||||
|
|
||||||
#ifdef HAVE_SPATIAL
|
|
||||||
#define CREATE_FUNC_GEOM(A) (void *)(SYM_OR_NULL(A)), &sym_group_geom
|
|
||||||
#else
|
|
||||||
#define CREATE_FUNC_GEOM(A) 0, &sym_group_geom
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Symbols are broken into separated arrays to allow field names with
|
Symbols are broken into separated arrays to allow field names with
|
||||||
@ -588,235 +579,38 @@ static SYMBOL symbols[] = {
|
|||||||
|
|
||||||
|
|
||||||
static SYMBOL sql_functions[] = {
|
static SYMBOL sql_functions[] = {
|
||||||
{ "ABS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_abs)},
|
|
||||||
{ "ACOS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_acos)},
|
|
||||||
{ "ADDDATE", SYM(ADDDATE_SYM)},
|
{ "ADDDATE", SYM(ADDDATE_SYM)},
|
||||||
{ "ADDTIME", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_addtime)},
|
|
||||||
{ "AES_ENCRYPT", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_aes_encrypt)},
|
|
||||||
{ "AES_DECRYPT", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_aes_decrypt)},
|
|
||||||
{ "AREA", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_area)},
|
|
||||||
{ "ASIN", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_asin)},
|
|
||||||
{ "ASBINARY", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_as_wkb)},
|
|
||||||
{ "ASTEXT", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_as_wkt)},
|
|
||||||
{ "ASWKB", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_as_wkb)},
|
|
||||||
{ "ASWKT", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_as_wkt)},
|
|
||||||
{ "ATAN", SYM(ATAN)},
|
|
||||||
{ "ATAN2", SYM(ATAN)},
|
|
||||||
{ "BENCHMARK", SYM(BENCHMARK_SYM)},
|
|
||||||
{ "BIN", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bin)},
|
|
||||||
{ "BIT_COUNT", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_count)},
|
|
||||||
{ "BIT_OR", SYM(BIT_OR)},
|
|
||||||
{ "BIT_AND", SYM(BIT_AND)},
|
{ "BIT_AND", SYM(BIT_AND)},
|
||||||
|
{ "BIT_OR", SYM(BIT_OR)},
|
||||||
{ "BIT_XOR", SYM(BIT_XOR)},
|
{ "BIT_XOR", SYM(BIT_XOR)},
|
||||||
{ "CAST", SYM(CAST_SYM)},
|
{ "CAST", SYM(CAST_SYM)},
|
||||||
{ "CEIL", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ceiling)},
|
|
||||||
{ "CEILING", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ceiling)},
|
|
||||||
{ "BIT_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)},
|
|
||||||
{ "CENTROID", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_centroid)},
|
|
||||||
{ "CHAR_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
|
|
||||||
{ "CHARACTER_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
|
|
||||||
{ "COERCIBILITY", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_coercibility)},
|
|
||||||
{ "COMPRESS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_compress)},
|
|
||||||
{ "CONCAT", SYM(CONCAT)},
|
|
||||||
{ "CONCAT_WS", SYM(CONCAT_WS)},
|
|
||||||
{ "CONNECTION_ID", F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_connection_id)},
|
|
||||||
{ "CONV", F_SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_conv)},
|
|
||||||
{ "CONVERT_TZ", SYM(CONVERT_TZ_SYM)},
|
|
||||||
{ "COUNT", SYM(COUNT_SYM)},
|
{ "COUNT", SYM(COUNT_SYM)},
|
||||||
{ "COS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cos)},
|
|
||||||
{ "COT", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cot)},
|
|
||||||
{ "CRC32", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_crc32)},
|
|
||||||
{ "CROSSES", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_crosses)},
|
|
||||||
{ "CURDATE", SYM(CURDATE)},
|
{ "CURDATE", SYM(CURDATE)},
|
||||||
{ "CURTIME", SYM(CURTIME)},
|
{ "CURTIME", SYM(CURTIME)},
|
||||||
{ "DATE_ADD", SYM(DATE_ADD_INTERVAL)},
|
{ "DATE_ADD", SYM(DATE_ADD_INTERVAL)},
|
||||||
{ "DATEDIFF", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_datediff)},
|
|
||||||
{ "DATE_FORMAT", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_date_format)},
|
|
||||||
{ "DATE_SUB", SYM(DATE_SUB_INTERVAL)},
|
{ "DATE_SUB", SYM(DATE_SUB_INTERVAL)},
|
||||||
{ "DAYNAME", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_dayname)},
|
|
||||||
{ "DAYOFMONTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_dayofmonth)},
|
|
||||||
{ "DAYOFWEEK", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_dayofweek)},
|
|
||||||
{ "DAYOFYEAR", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_dayofyear)},
|
|
||||||
{ "DECODE", SYM(DECODE_SYM)},
|
|
||||||
{ "DEGREES", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_degrees)},
|
|
||||||
{ "DES_ENCRYPT", SYM(DES_ENCRYPT_SYM)},
|
|
||||||
{ "DES_DECRYPT", SYM(DES_DECRYPT_SYM)},
|
|
||||||
{ "DIMENSION", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_dimension)},
|
|
||||||
{ "DISJOINT", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_disjoint)},
|
|
||||||
{ "ELT", SYM(ELT_FUNC)},
|
|
||||||
{ "ENCODE", SYM(ENCODE_SYM)},
|
|
||||||
{ "ENCRYPT", SYM(ENCRYPT)},
|
|
||||||
{ "ENDPOINT", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_endpoint)},
|
|
||||||
{ "ENVELOPE", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_envelope)},
|
|
||||||
{ "EQUALS", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_equals)},
|
|
||||||
{ "EXTERIORRING", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_exteriorring)},
|
|
||||||
{ "EXTRACT", SYM(EXTRACT_SYM)},
|
{ "EXTRACT", SYM(EXTRACT_SYM)},
|
||||||
{ "EXTRACTVALUE", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_xml_extractvalue)},
|
|
||||||
{ "EXP", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_exp)},
|
|
||||||
{ "EXPORT_SET", SYM(EXPORT_SET)},
|
|
||||||
{ "FIELD", SYM(FIELD_FUNC)}, /* For compability */
|
|
||||||
{ "FIND_IN_SET", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_find_in_set)},
|
|
||||||
{ "FLOOR", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_floor)},
|
|
||||||
{ "FORMAT", SYM(FORMAT_SYM)},
|
|
||||||
{ "FOUND_ROWS", F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_found_rows)},
|
|
||||||
{ "FROM_DAYS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_from_days)},
|
|
||||||
{ "FROM_UNIXTIME", SYM(FROM_UNIXTIME)},
|
|
||||||
{ "GET_LOCK", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_get_lock)},
|
|
||||||
{ "GEOMETRYN", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_geometryn)},
|
|
||||||
{ "GEOMETRYTYPE", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_geometry_type)},
|
|
||||||
{ "GEOMCOLLFROMTEXT", SYM(GEOMCOLLFROMTEXT)},
|
|
||||||
{ "GEOMCOLLFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "GEOMETRYCOLLECTIONFROMTEXT",SYM(GEOMCOLLFROMTEXT)},
|
|
||||||
{ "GEOMETRYCOLLECTIONFROMWKB",SYM(GEOMFROMWKB)},
|
|
||||||
{ "GEOMETRYFROMTEXT", SYM(GEOMFROMTEXT)},
|
|
||||||
{ "GEOMETRYFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "GEOMFROMTEXT", SYM(GEOMFROMTEXT)},
|
|
||||||
{ "GEOMFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "GLENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_glength)},
|
|
||||||
{ "GREATEST", SYM(GREATEST_SYM)},
|
|
||||||
{ "GROUP_CONCAT", SYM(GROUP_CONCAT_SYM)},
|
{ "GROUP_CONCAT", SYM(GROUP_CONCAT_SYM)},
|
||||||
{ "GROUP_UNIQUE_USERS", SYM(GROUP_UNIQUE_USERS)},
|
{ "GROUP_UNIQUE_USERS", SYM(GROUP_UNIQUE_USERS)},
|
||||||
{ "HEX", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_hex)},
|
|
||||||
{ "IFNULL", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_ifnull)},
|
|
||||||
{ "INET_ATON", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_inet_aton)},
|
|
||||||
{ "INET_NTOA", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_inet_ntoa)},
|
|
||||||
{ "INSTR", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_instr)},
|
|
||||||
{ "INTERIORRINGN", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_interiorringn)},
|
|
||||||
{ "INTERSECTS", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_intersects)},
|
|
||||||
{ "ISCLOSED", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_isclosed)},
|
|
||||||
{ "ISEMPTY", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_isempty)},
|
|
||||||
{ "ISNULL", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_isnull)},
|
|
||||||
{ "IS_FREE_LOCK", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_free_lock)},
|
|
||||||
{ "IS_USED_LOCK", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_is_used_lock)},
|
|
||||||
{ "LAST_INSERT_ID", SYM(LAST_INSERT_ID)},
|
|
||||||
{ "ISSIMPLE", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_issimple)},
|
|
||||||
{ "LAST_DAY", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_last_day)},
|
|
||||||
{ "LCASE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)},
|
|
||||||
{ "LEAST", SYM(LEAST_SYM)},
|
|
||||||
{ "LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)},
|
|
||||||
{ "LN", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ln)},
|
|
||||||
{ "LINEFROMTEXT", SYM(LINEFROMTEXT)},
|
|
||||||
{ "LINEFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "LINESTRINGFROMTEXT",SYM(LINEFROMTEXT)},
|
|
||||||
{ "LINESTRINGFROMWKB",SYM(GEOMFROMWKB)},
|
|
||||||
{ "LOAD_FILE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_load_file)},
|
|
||||||
{ "LOCATE", SYM(LOCATE)},
|
|
||||||
{ "LOG", SYM(LOG_SYM)},
|
|
||||||
{ "LOG2", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_log2)},
|
|
||||||
{ "LOG10", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_log10)},
|
|
||||||
{ "LOWER", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_lcase)},
|
|
||||||
{ "LPAD", F_SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_lpad)},
|
|
||||||
{ "LTRIM", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ltrim)},
|
|
||||||
{ "MAKE_SET", SYM(MAKE_SET_SYM)},
|
|
||||||
{ "MAKEDATE", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_makedate)},
|
|
||||||
{ "MAKETIME", F_SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_maketime)},
|
|
||||||
{ "MASTER_POS_WAIT", SYM(MASTER_POS_WAIT)},
|
|
||||||
{ "MAX", SYM(MAX_SYM)},
|
{ "MAX", SYM(MAX_SYM)},
|
||||||
{ "MBRCONTAINS", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_contains)},
|
|
||||||
{ "MBRDISJOINT", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_disjoint)},
|
|
||||||
{ "MBREQUAL", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_equals)},
|
|
||||||
{ "MBRINTERSECTS", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_intersects)},
|
|
||||||
{ "MBROVERLAPS", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_overlaps)},
|
|
||||||
{ "MBRTOUCHES", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_touches)},
|
|
||||||
{ "MBRWITHIN", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_within)},
|
|
||||||
{ "MD5", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_md5)},
|
|
||||||
{ "MID", SYM(SUBSTRING)}, /* unireg function */
|
{ "MID", SYM(SUBSTRING)}, /* unireg function */
|
||||||
{ "MIN", SYM(MIN_SYM)},
|
{ "MIN", SYM(MIN_SYM)},
|
||||||
{ "MLINEFROMTEXT", SYM(MLINEFROMTEXT)},
|
|
||||||
{ "MLINEFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "MPOINTFROMTEXT", SYM(MPOINTFROMTEXT)},
|
|
||||||
{ "MPOINTFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "MPOLYFROMTEXT", SYM(MPOLYFROMTEXT)},
|
|
||||||
{ "MPOLYFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "MONTHNAME", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_monthname)},
|
|
||||||
{ "MULTILINESTRINGFROMTEXT",SYM(MLINEFROMTEXT)},
|
|
||||||
{ "MULTILINESTRINGFROMWKB",SYM(GEOMFROMWKB)},
|
|
||||||
{ "MULTIPOINTFROMTEXT",SYM(MPOINTFROMTEXT)},
|
|
||||||
{ "MULTIPOINTFROMWKB",SYM(GEOMFROMWKB)},
|
|
||||||
{ "MULTIPOLYGONFROMTEXT",SYM(MPOLYFROMTEXT)},
|
|
||||||
{ "MULTIPOLYGONFROMWKB",SYM(GEOMFROMWKB)},
|
|
||||||
{ "NAME_CONST", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_name_const)},
|
|
||||||
{ "NOW", SYM(NOW_SYM)},
|
{ "NOW", SYM(NOW_SYM)},
|
||||||
{ "NULLIF", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_nullif)},
|
|
||||||
{ "NUMGEOMETRIES", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_numgeometries)},
|
|
||||||
{ "NUMINTERIORRINGS", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_numinteriorring)},
|
|
||||||
{ "NUMPOINTS", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_numpoints)},
|
|
||||||
{ "OCTET_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_length)},
|
|
||||||
{ "OCT", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_oct)},
|
|
||||||
{ "ORD", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ord)},
|
|
||||||
{ "OVERLAPS", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_overlaps)},
|
|
||||||
{ "PERIOD_ADD", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_period_add)},
|
|
||||||
{ "PERIOD_DIFF", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_period_diff)},
|
|
||||||
{ "PI", F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_pi)},
|
|
||||||
{ "POINTFROMTEXT", SYM(POINTFROMTEXT)},
|
|
||||||
{ "POINTFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "POINTN", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_pointn)},
|
|
||||||
{ "POLYFROMTEXT", SYM(POLYFROMTEXT)},
|
|
||||||
{ "POLYFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "POLYGONFROMTEXT", SYM(POLYFROMTEXT)},
|
|
||||||
{ "POLYGONFROMWKB", SYM(GEOMFROMWKB)},
|
|
||||||
{ "POSITION", SYM(POSITION_SYM)},
|
{ "POSITION", SYM(POSITION_SYM)},
|
||||||
{ "POW", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)},
|
|
||||||
{ "POWER", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)},
|
|
||||||
{ "QUOTE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_quote)},
|
|
||||||
{ "RADIANS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_radians)},
|
|
||||||
{ "RAND", SYM(RAND)},
|
|
||||||
{ "RELEASE_LOCK", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_release_lock)},
|
|
||||||
{ "REVERSE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_reverse)},
|
|
||||||
{ "ROUND", SYM(ROUND)},
|
|
||||||
{ "ROW_COUNT", SYM(ROW_COUNT_SYM)},
|
|
||||||
{ "RPAD", F_SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_rpad)},
|
|
||||||
{ "RTRIM", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_rtrim)},
|
|
||||||
{ "SEC_TO_TIME", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sec_to_time)},
|
|
||||||
{ "SESSION_USER", SYM(USER)},
|
{ "SESSION_USER", SYM(USER)},
|
||||||
{ "SUBDATE", SYM(SUBDATE_SYM)},
|
|
||||||
{ "SIGN", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sign)},
|
|
||||||
{ "SIN", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sin)},
|
|
||||||
{ "SHA", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sha)},
|
|
||||||
{ "SHA1", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sha)},
|
|
||||||
{ "SLEEP", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sleep)},
|
|
||||||
{ "SOUNDEX", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_soundex)},
|
|
||||||
{ "SPACE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_space)},
|
|
||||||
{ "SQRT", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_sqrt)},
|
|
||||||
{ "SRID", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_srid)},
|
|
||||||
{ "STARTPOINT", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_startpoint)},
|
|
||||||
{ "STD", SYM(STD_SYM)},
|
{ "STD", SYM(STD_SYM)},
|
||||||
{ "STDDEV", SYM(STD_SYM)},
|
{ "STDDEV", SYM(STD_SYM)},
|
||||||
{ "STDDEV_POP", SYM(STD_SYM)},
|
{ "STDDEV_POP", SYM(STD_SYM)},
|
||||||
{ "STDDEV_SAMP", SYM(STDDEV_SAMP_SYM)},
|
{ "STDDEV_SAMP", SYM(STDDEV_SAMP_SYM)},
|
||||||
{ "STR_TO_DATE", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_str_to_date)},
|
{ "SUBDATE", SYM(SUBDATE_SYM)},
|
||||||
{ "STRCMP", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_strcmp)},
|
|
||||||
{ "SUBSTR", SYM(SUBSTRING)},
|
{ "SUBSTR", SYM(SUBSTRING)},
|
||||||
{ "SUBSTRING", SYM(SUBSTRING)},
|
{ "SUBSTRING", SYM(SUBSTRING)},
|
||||||
{ "SUBSTRING_INDEX", SYM(SUBSTRING_INDEX)},
|
|
||||||
{ "SUBTIME", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_subtime)},
|
|
||||||
{ "SUM", SYM(SUM_SYM)},
|
{ "SUM", SYM(SUM_SYM)},
|
||||||
{ "SYSDATE", SYM(SYSDATE)},
|
{ "SYSDATE", SYM(SYSDATE)},
|
||||||
{ "SYSTEM_USER", SYM(USER)},
|
{ "SYSTEM_USER", SYM(USER)},
|
||||||
{ "TAN", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_tan)},
|
|
||||||
{ "TIME_FORMAT", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_time_format)},
|
|
||||||
{ "TIME_TO_SEC", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_time_to_sec)},
|
|
||||||
{ "TIMEDIFF", F_SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_timediff)},
|
|
||||||
{ "TO_DAYS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_to_days)},
|
|
||||||
{ "TOUCHES", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_touches)},
|
|
||||||
{ "TRIM", SYM(TRIM)},
|
{ "TRIM", SYM(TRIM)},
|
||||||
{ "UCASE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
|
||||||
{ "UNCOMPRESS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompress)},
|
|
||||||
{ "UNCOMPRESSED_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompressed_length)},
|
|
||||||
{ "UNHEX", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_unhex)},
|
|
||||||
{ "UNIQUE_USERS", SYM(UNIQUE_USERS)},
|
{ "UNIQUE_USERS", SYM(UNIQUE_USERS)},
|
||||||
{ "UNIX_TIMESTAMP", SYM(UNIX_TIMESTAMP)},
|
|
||||||
{ "UPDATEXML", F_SYM(FUNC_ARG3),0,CREATE_FUNC(create_func_xml_update)},
|
|
||||||
{ "UPPER", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
|
||||||
{ "UUID", F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_uuid)},
|
|
||||||
{ "VARIANCE", SYM(VARIANCE_SYM)},
|
{ "VARIANCE", SYM(VARIANCE_SYM)},
|
||||||
{ "VAR_POP", SYM(VARIANCE_SYM)},
|
{ "VAR_POP", SYM(VARIANCE_SYM)},
|
||||||
{ "VAR_SAMP", SYM(VAR_SAMP_SYM)},
|
{ "VAR_SAMP", SYM(VAR_SAMP_SYM)},
|
||||||
{ "VERSION", F_SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_version)},
|
|
||||||
{ "WEEKDAY", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_weekday)},
|
|
||||||
{ "WEEKOFYEAR", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_weekofyear)},
|
|
||||||
{ "WITHIN", F_SYM(FUNC_ARG2),0,CREATE_FUNC_GEOM(create_func_within)},
|
|
||||||
{ "X", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_x)},
|
|
||||||
{ "Y", F_SYM(FUNC_ARG1),0,CREATE_FUNC_GEOM(create_func_y)},
|
|
||||||
{ "YEARWEEK", SYM(YEARWEEK)}
|
|
||||||
};
|
};
|
||||||
|
@ -26,7 +26,6 @@ typedef struct st_symbol {
|
|||||||
const char *name;
|
const char *name;
|
||||||
uint tok;
|
uint tok;
|
||||||
uint length;
|
uint length;
|
||||||
void *create_func;
|
|
||||||
struct st_sym_group *group;
|
struct st_sym_group *group;
|
||||||
} SYMBOL;
|
} SYMBOL;
|
||||||
|
|
||||||
|
@ -691,7 +691,8 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count,
|
|||||||
check_if_locking_is_allowed(thd->lex->sql_command, thd->lex->type,
|
check_if_locking_is_allowed(thd->lex->sql_command, thd->lex->type,
|
||||||
table_ptr[i], count,
|
table_ptr[i], count,
|
||||||
(thd == logger.get_general_log_thd()) ||
|
(thd == logger.get_general_log_thd()) ||
|
||||||
(thd == logger.get_slow_log_thd())))
|
(thd == logger.get_slow_log_thd()) ||
|
||||||
|
(thd == logger.get_privileged_thread())))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
240
sql/log.cc
240
sql/log.cc
@ -173,6 +173,33 @@ public:
|
|||||||
|
|
||||||
handlerton *binlog_hton;
|
handlerton *binlog_hton;
|
||||||
|
|
||||||
|
|
||||||
|
/* Check if a given table is opened log table */
|
||||||
|
int check_if_log_table(uint db_len, const char *db, uint table_name_len,
|
||||||
|
const char *table_name, uint check_if_opened)
|
||||||
|
{
|
||||||
|
if (db_len == 5 &&
|
||||||
|
!(lower_case_table_names ?
|
||||||
|
my_strcasecmp(system_charset_info, db, "mysql") :
|
||||||
|
strcmp(db, "mysql")))
|
||||||
|
{
|
||||||
|
if (table_name_len == 11 && !(lower_case_table_names ?
|
||||||
|
my_strcasecmp(system_charset_info,
|
||||||
|
table_name, "general_log") :
|
||||||
|
strcmp(table_name, "general_log")) &&
|
||||||
|
(!check_if_opened || logger.is_log_table_enabled(QUERY_LOG_GENERAL)))
|
||||||
|
return QUERY_LOG_GENERAL;
|
||||||
|
else
|
||||||
|
if (table_name_len == 8 && !(lower_case_table_names ?
|
||||||
|
my_strcasecmp(system_charset_info, table_name, "slow_log") :
|
||||||
|
strcmp(table_name, "slow_log")) &&
|
||||||
|
(!check_if_opened ||logger.is_log_table_enabled(QUERY_LOG_SLOW)))
|
||||||
|
return QUERY_LOG_SLOW;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Open log table of a given type (general or slow log)
|
Open log table of a given type (general or slow log)
|
||||||
|
|
||||||
@ -273,6 +300,12 @@ bool Log_to_csv_event_handler::open_log_table(uint log_table_type)
|
|||||||
my_pthread_setspecific_ptr(THR_MALLOC, 0);
|
my_pthread_setspecific_ptr(THR_MALLOC, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
After a log table was opened, we should clear privileged thread
|
||||||
|
flag (which allows locking of a log table by a special thread, usually
|
||||||
|
the one who closed log tables temporarily).
|
||||||
|
*/
|
||||||
|
privileged_thread= 0;
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,11 +317,15 @@ Log_to_csv_event_handler::Log_to_csv_event_handler()
|
|||||||
/* logger thread always works with mysql database */
|
/* logger thread always works with mysql database */
|
||||||
general_log_thd->db= my_strdup("mysql", MYF(0));
|
general_log_thd->db= my_strdup("mysql", MYF(0));
|
||||||
general_log_thd->db_length= 5;
|
general_log_thd->db_length= 5;
|
||||||
|
general_log.table= 0;
|
||||||
|
|
||||||
slow_log_thd= new THD;
|
slow_log_thd= new THD;
|
||||||
/* logger thread always works with mysql database */
|
/* logger thread always works with mysql database */
|
||||||
slow_log_thd->db= my_strdup("mysql", MYF(0));;
|
slow_log_thd->db= my_strdup("mysql", MYF(0));;
|
||||||
slow_log_thd->db_length= 5;
|
slow_log_thd->db_length= 5;
|
||||||
|
slow_log.table= 0;
|
||||||
|
/* no privileged thread exists at the moment */
|
||||||
|
privileged_thread= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -341,6 +378,7 @@ bool Log_to_csv_event_handler::reopen_log_table(uint log_table_type)
|
|||||||
return open_log_table(log_table_type);
|
return open_log_table(log_table_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Log_to_csv_event_handler::cleanup()
|
void Log_to_csv_event_handler::cleanup()
|
||||||
{
|
{
|
||||||
if (opt_log)
|
if (opt_log)
|
||||||
@ -395,9 +433,6 @@ bool Log_to_csv_event_handler::
|
|||||||
filled by the Logger (=> no need to load default ones).
|
filled by the Logger (=> no need to load default ones).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* log table entries are not replicated at the moment */
|
|
||||||
tmp_disable_binlog(current_thd);
|
|
||||||
|
|
||||||
/* Set current time. Required for CURRENT_TIMESTAMP to work */
|
/* Set current time. Required for CURRENT_TIMESTAMP to work */
|
||||||
general_log_thd->start_time= event_time;
|
general_log_thd->start_time= event_time;
|
||||||
|
|
||||||
@ -406,21 +441,36 @@ bool Log_to_csv_event_handler::
|
|||||||
default value (which is CURRENT_TIMESTAMP).
|
default value (which is CURRENT_TIMESTAMP).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
table->field[1]->store(user_host, user_host_len, client_cs);
|
/* check that all columns exist */
|
||||||
|
if (!table->field[1] || !table->field[2] || !table->field[3] ||
|
||||||
|
!table->field[4] || !table->field[5])
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/* do a write */
|
||||||
|
if (table->field[1]->store(user_host, user_host_len, client_cs) ||
|
||||||
|
table->field[2]->store((longlong) thread_id, TRUE) ||
|
||||||
|
table->field[3]->store((longlong) server_id, TRUE) ||
|
||||||
|
table->field[4]->store(command_type, command_type_len, client_cs) ||
|
||||||
|
table->field[5]->store(sql_text, sql_text_len, client_cs))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/* mark tables as not null */
|
||||||
table->field[1]->set_notnull();
|
table->field[1]->set_notnull();
|
||||||
table->field[2]->store((longlong) thread_id, TRUE);
|
|
||||||
table->field[2]->set_notnull();
|
table->field[2]->set_notnull();
|
||||||
table->field[3]->store((longlong) server_id, TRUE);
|
|
||||||
table->field[3]->set_notnull();
|
table->field[3]->set_notnull();
|
||||||
table->field[4]->store(command_type, command_type_len, client_cs);
|
|
||||||
table->field[4]->set_notnull();
|
table->field[4]->set_notnull();
|
||||||
table->field[5]->store(sql_text, sql_text_len, client_cs);
|
|
||||||
table->field[5]->set_notnull();
|
table->field[5]->set_notnull();
|
||||||
|
|
||||||
|
/* log table entries are not replicated at the moment */
|
||||||
|
tmp_disable_binlog(current_thd);
|
||||||
|
|
||||||
table->file->ha_write_row(table->record[0]);
|
table->file->ha_write_row(table->record[0]);
|
||||||
|
|
||||||
reenable_binlog(current_thd);
|
reenable_binlog(current_thd);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
err:
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -469,9 +519,6 @@ bool Log_to_csv_event_handler::
|
|||||||
if (unlikely(!logger.is_log_tables_initialized))
|
if (unlikely(!logger.is_log_tables_initialized))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* log table entries are not replicated at the moment */
|
|
||||||
tmp_disable_binlog(current_thd);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set start time for CURRENT_TIMESTAMP to the start of the query.
|
Set start time for CURRENT_TIMESTAMP to the start of the query.
|
||||||
This will be default value for the field[0]
|
This will be default value for the field[0]
|
||||||
@ -484,19 +531,30 @@ bool Log_to_csv_event_handler::
|
|||||||
default value.
|
default value.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!table->field[1] || !table->field[2] || !table->field[3] ||
|
||||||
|
!table->field[4] || !table->field[5] || !table->field[6] ||
|
||||||
|
!table->field[7] || !table->field[8] || !table->field[9] ||
|
||||||
|
!table->field[10])
|
||||||
|
goto err;
|
||||||
|
|
||||||
/* store the value */
|
/* store the value */
|
||||||
table->field[1]->store(user_host, user_host_len, client_cs);
|
if (table->field[1]->store(user_host, user_host_len, client_cs))
|
||||||
|
goto err;
|
||||||
|
|
||||||
if (query_start_arg)
|
if (query_start_arg)
|
||||||
{
|
{
|
||||||
/* fill in query_time field */
|
/* fill in query_time field */
|
||||||
table->field[2]->store(query_time, TRUE);
|
if (table->field[2]->store(query_time, TRUE))
|
||||||
|
goto err;
|
||||||
/* lock_time */
|
/* lock_time */
|
||||||
table->field[3]->store(lock_time, TRUE);
|
if (table->field[3]->store(lock_time, TRUE))
|
||||||
|
goto err;
|
||||||
/* rows_sent */
|
/* rows_sent */
|
||||||
table->field[4]->store((longlong) thd->sent_row_count, TRUE);
|
if (table->field[4]->store((longlong) thd->sent_row_count, TRUE))
|
||||||
|
goto err;
|
||||||
/* rows_examined */
|
/* rows_examined */
|
||||||
table->field[5]->store((longlong) thd->examined_row_count, TRUE);
|
if (table->field[5]->store((longlong) thd->examined_row_count, TRUE))
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -509,14 +567,18 @@ bool Log_to_csv_event_handler::
|
|||||||
/* fill database field */
|
/* fill database field */
|
||||||
if (thd->db)
|
if (thd->db)
|
||||||
{
|
{
|
||||||
table->field[6]->store(thd->db, thd->db_length, client_cs);
|
if (table->field[6]->store(thd->db, thd->db_length, client_cs))
|
||||||
|
goto err;
|
||||||
table->field[6]->set_notnull();
|
table->field[6]->set_notnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt)
|
if (thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt)
|
||||||
{
|
{
|
||||||
table->field[7]->store((longlong)
|
if (table->
|
||||||
thd->first_successful_insert_id_in_prev_stmt_for_binlog, TRUE);
|
field[7]->store((longlong)
|
||||||
|
thd->first_successful_insert_id_in_prev_stmt_for_binlog,
|
||||||
|
TRUE))
|
||||||
|
goto err;
|
||||||
table->field[7]->set_notnull();
|
table->field[7]->set_notnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,16 +590,23 @@ bool Log_to_csv_event_handler::
|
|||||||
*/
|
*/
|
||||||
if (thd->auto_inc_intervals_in_cur_stmt_for_binlog.nb_elements() > 0)
|
if (thd->auto_inc_intervals_in_cur_stmt_for_binlog.nb_elements() > 0)
|
||||||
{
|
{
|
||||||
table->field[8]->store((longlong)
|
if (table->
|
||||||
thd->auto_inc_intervals_in_cur_stmt_for_binlog.minimum(), TRUE);
|
field[8]->store((longlong)
|
||||||
|
thd->auto_inc_intervals_in_cur_stmt_for_binlog.minimum(), TRUE))
|
||||||
|
goto err;
|
||||||
table->field[8]->set_notnull();
|
table->field[8]->set_notnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
table->field[9]->store((longlong) server_id, TRUE);
|
if (table->field[9]->store((longlong) server_id, TRUE))
|
||||||
|
goto err;
|
||||||
table->field[9]->set_notnull();
|
table->field[9]->set_notnull();
|
||||||
|
|
||||||
/* sql_text */
|
/* sql_text */
|
||||||
table->field[10]->store(sql_text,sql_text_len, client_cs);
|
if (table->field[10]->store(sql_text,sql_text_len, client_cs))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/* log table entries are not replicated at the moment */
|
||||||
|
tmp_disable_binlog(current_thd);
|
||||||
|
|
||||||
/* write the row */
|
/* write the row */
|
||||||
table->file->ha_write_row(table->record[0]);
|
table->file->ha_write_row(table->record[0]);
|
||||||
@ -545,6 +614,8 @@ bool Log_to_csv_event_handler::
|
|||||||
reenable_binlog(current_thd);
|
reenable_binlog(current_thd);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
err:
|
||||||
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Log_to_csv_event_handler::
|
bool Log_to_csv_event_handler::
|
||||||
@ -733,61 +804,48 @@ bool LOGGER::reopen_log_table(uint log_table_type)
|
|||||||
return table_log_handler->reopen_log_table(log_table_type);
|
return table_log_handler->reopen_log_table(log_table_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LOGGER::reopen_log_tables()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
we use | and not || here, to ensure that both reopen_log_table
|
||||||
|
are called, even if the first one fails
|
||||||
|
*/
|
||||||
|
if ((opt_slow_log && logger.reopen_log_table(QUERY_LOG_SLOW)) |
|
||||||
|
(opt_log && logger.reopen_log_table(QUERY_LOG_GENERAL)))
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LOGGER::tmp_close_log_tables(THD *thd)
|
||||||
|
{
|
||||||
|
table_log_handler->tmp_close_log_tables(thd);
|
||||||
|
}
|
||||||
|
|
||||||
bool LOGGER::flush_logs(THD *thd)
|
bool LOGGER::flush_logs(THD *thd)
|
||||||
{
|
{
|
||||||
TABLE_LIST close_slow_log, close_general_log;
|
int rc= 0;
|
||||||
|
|
||||||
/* reopen log tables */
|
|
||||||
bzero((char*) &close_slow_log, sizeof(TABLE_LIST));
|
|
||||||
close_slow_log.alias= close_slow_log.table_name=(char*) "slow_log";
|
|
||||||
close_slow_log.table_name_length= 8;
|
|
||||||
close_slow_log.db= (char*) "mysql";
|
|
||||||
close_slow_log.db_length= 5;
|
|
||||||
|
|
||||||
bzero((char*) &close_general_log, sizeof(TABLE_LIST));
|
|
||||||
close_general_log.alias= close_general_log.table_name=(char*) "general_log";
|
|
||||||
close_general_log.table_name_length= 11;
|
|
||||||
close_general_log.db= (char*) "mysql";
|
|
||||||
close_general_log.db_length= 5;
|
|
||||||
|
|
||||||
/* lock tables, in the case they are enabled */
|
|
||||||
if (logger.is_log_tables_initialized)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
This will lock and wait for all but the logger thread to release the
|
|
||||||
tables. Then we could reopen log tables. Then release the name locks.
|
|
||||||
|
|
||||||
NOTE: in fact, the first parameter used in lock_and_wait_for_table_name()
|
|
||||||
and table_log_handler->flush() could be any non-NULL THD, as the
|
|
||||||
underlying code makes certain assumptions about this.
|
|
||||||
Here we use one of the logger handler THD's. Simply because it
|
|
||||||
seems appropriate.
|
|
||||||
*/
|
|
||||||
if (opt_slow_log)
|
|
||||||
lock_and_wait_for_table_name(table_log_handler->general_log_thd,
|
|
||||||
&close_slow_log);
|
|
||||||
if (opt_log)
|
|
||||||
lock_and_wait_for_table_name(table_log_handler->general_log_thd,
|
|
||||||
&close_general_log);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Deny others from logging to general and slow log,
|
Now we lock logger, as nobody should be able to use logging routines while
|
||||||
while reopening tables.
|
log tables are closed
|
||||||
*/
|
*/
|
||||||
logger.lock();
|
logger.lock();
|
||||||
|
if (logger.is_log_tables_initialized)
|
||||||
|
table_log_handler->tmp_close_log_tables(thd); // the locking happens here
|
||||||
|
|
||||||
/* reopen log files */
|
/* reopen log files */
|
||||||
file_log_handler->flush();
|
file_log_handler->flush();
|
||||||
|
|
||||||
/* flush tables, in the case they are enabled */
|
/* reopen tables in the case they were enabled */
|
||||||
if (logger.is_log_tables_initialized)
|
if (logger.is_log_tables_initialized)
|
||||||
table_log_handler->flush(table_log_handler->general_log_thd,
|
{
|
||||||
&close_slow_log, &close_general_log);
|
if (reopen_log_tables())
|
||||||
|
rc= TRUE;
|
||||||
|
}
|
||||||
/* end of log flush */
|
/* end of log flush */
|
||||||
logger.unlock();
|
logger.unlock();
|
||||||
return FALSE;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1095,31 +1153,50 @@ void LOGGER::deactivate_log_handler(THD *thd, uint log_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Log_to_csv_event_handler::flush(THD *thd, TABLE_LIST *close_slow_log,
|
/*
|
||||||
TABLE_LIST *close_general_log)
|
Close log tables temporarily. The thread which closed
|
||||||
|
them this way can lock them in any mode it needs.
|
||||||
|
NOTE: one should call logger.lock() before entering this
|
||||||
|
function.
|
||||||
|
*/
|
||||||
|
void Log_to_csv_event_handler::tmp_close_log_tables(THD *thd)
|
||||||
{
|
{
|
||||||
|
TABLE_LIST close_slow_log, close_general_log;
|
||||||
|
|
||||||
|
/* fill lists, we will need to perform operations on tables */
|
||||||
|
bzero((char*) &close_slow_log, sizeof(TABLE_LIST));
|
||||||
|
close_slow_log.alias= close_slow_log.table_name=(char*) "slow_log";
|
||||||
|
close_slow_log.table_name_length= 8;
|
||||||
|
close_slow_log.db= (char*) "mysql";
|
||||||
|
close_slow_log.db_length= 5;
|
||||||
|
|
||||||
|
bzero((char*) &close_general_log, sizeof(TABLE_LIST));
|
||||||
|
close_general_log.alias= close_general_log.table_name=(char*) "general_log";
|
||||||
|
close_general_log.table_name_length= 11;
|
||||||
|
close_general_log.db= (char*) "mysql";
|
||||||
|
close_general_log.db_length= 5;
|
||||||
|
|
||||||
|
privileged_thread= thd;
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
|
/*
|
||||||
|
NOTE: in fact, the first parameter used in query_cache_invalidate3()
|
||||||
|
could be any non-NULL THD, as the underlying code makes certain
|
||||||
|
assumptions about this.
|
||||||
|
Here we use one of the logger handler THD's. Simply because it
|
||||||
|
seems appropriate.
|
||||||
|
*/
|
||||||
if (opt_log)
|
if (opt_log)
|
||||||
{
|
{
|
||||||
close_log_table(QUERY_LOG_GENERAL, TRUE);
|
close_log_table(QUERY_LOG_GENERAL, TRUE);
|
||||||
query_cache_invalidate3(thd, close_general_log, 0);
|
query_cache_invalidate3(general_log_thd, &close_general_log, 0);
|
||||||
unlock_table_name(thd, close_general_log);
|
|
||||||
}
|
}
|
||||||
if (opt_slow_log)
|
if (opt_slow_log)
|
||||||
{
|
{
|
||||||
close_log_table(QUERY_LOG_SLOW, TRUE);
|
close_log_table(QUERY_LOG_SLOW, TRUE);
|
||||||
query_cache_invalidate3(thd, close_slow_log, 0);
|
query_cache_invalidate3(general_log_thd, &close_slow_log, 0);
|
||||||
unlock_table_name(thd, close_slow_log);
|
|
||||||
}
|
}
|
||||||
VOID(pthread_mutex_unlock(&LOCK_open));
|
VOID(pthread_mutex_unlock(&LOCK_open));
|
||||||
/*
|
|
||||||
we use | and not || here, to ensure that both reopen_log_table
|
|
||||||
are called, even if the first one fails
|
|
||||||
*/
|
|
||||||
if ((opt_slow_log && reopen_log_table(QUERY_LOG_SLOW)) |
|
|
||||||
(opt_log && reopen_log_table(QUERY_LOG_GENERAL)))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the parameters are unused for the log tables */
|
/* the parameters are unused for the log tables */
|
||||||
@ -1187,16 +1264,15 @@ void Log_to_csv_event_handler::
|
|||||||
THD *log_thd, *curr= current_thd;
|
THD *log_thd, *curr= current_thd;
|
||||||
TABLE_LIST *table;
|
TABLE_LIST *table;
|
||||||
|
|
||||||
|
if (!logger.is_log_table_enabled(log_table_type))
|
||||||
|
return; /* do nothing */
|
||||||
|
|
||||||
switch (log_table_type) {
|
switch (log_table_type) {
|
||||||
case QUERY_LOG_GENERAL:
|
case QUERY_LOG_GENERAL:
|
||||||
if (!logger.is_general_log_table_enabled())
|
|
||||||
return; /* do nothing */
|
|
||||||
log_thd= general_log_thd;
|
log_thd= general_log_thd;
|
||||||
table= &general_log;
|
table= &general_log;
|
||||||
break;
|
break;
|
||||||
case QUERY_LOG_SLOW:
|
case QUERY_LOG_SLOW:
|
||||||
if (!logger.is_slow_log_table_enabled())
|
|
||||||
return; /* do nothing */
|
|
||||||
log_thd= slow_log_thd;
|
log_thd= slow_log_thd;
|
||||||
table= &slow_log;
|
table= &slow_log;
|
||||||
break;
|
break;
|
||||||
|
47
sql/log.h
47
sql/log.h
@ -404,6 +404,9 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int check_if_log_table(uint db_len, const char *db, uint table_name_len,
|
||||||
|
const char *table_name, uint check_if_opened);
|
||||||
|
|
||||||
class Log_to_csv_event_handler: public Log_event_handler
|
class Log_to_csv_event_handler: public Log_event_handler
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -412,6 +415,16 @@ class Log_to_csv_event_handler: public Log_event_handler
|
|||||||
THD's of the query. The reason is the locking order and duration.
|
THD's of the query. The reason is the locking order and duration.
|
||||||
*/
|
*/
|
||||||
THD *general_log_thd, *slow_log_thd;
|
THD *general_log_thd, *slow_log_thd;
|
||||||
|
/*
|
||||||
|
This is for the thread, which called tmp_close_log_tables. The thread
|
||||||
|
will be allowed to write-lock the log tables (as it explicitly disabled
|
||||||
|
logging). This is used for such operations as REPAIR, which require
|
||||||
|
exclusive lock on the log tables.
|
||||||
|
NOTE: there can be only one priviliged thread, as one should
|
||||||
|
lock logger with logger.lock() before calling tmp_close_log_tables().
|
||||||
|
So no other thread could get privileged status at the same time.
|
||||||
|
*/
|
||||||
|
THD *privileged_thread;
|
||||||
friend class LOGGER;
|
friend class LOGGER;
|
||||||
TABLE_LIST general_log, slow_log;
|
TABLE_LIST general_log, slow_log;
|
||||||
|
|
||||||
@ -436,13 +449,20 @@ public:
|
|||||||
const char *command_type, uint command_type_len,
|
const char *command_type, uint command_type_len,
|
||||||
const char *sql_text, uint sql_text_len,
|
const char *sql_text, uint sql_text_len,
|
||||||
CHARSET_INFO *client_cs);
|
CHARSET_INFO *client_cs);
|
||||||
bool flush(THD *thd, TABLE_LIST *close_slow_Log,
|
void tmp_close_log_tables(THD *thd);
|
||||||
TABLE_LIST* close_general_log);
|
|
||||||
void close_log_table(uint log_type, bool lock_in_use);
|
void close_log_table(uint log_type, bool lock_in_use);
|
||||||
bool reopen_log_table(uint log_type);
|
bool reopen_log_table(uint log_type);
|
||||||
|
THD* get_privileged_thread()
|
||||||
|
{
|
||||||
|
return privileged_thread;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* type of the log table */
|
||||||
|
#define QUERY_LOG_SLOW 1
|
||||||
|
#define QUERY_LOG_GENERAL 2
|
||||||
|
|
||||||
class Log_to_file_event_handler: public Log_event_handler
|
class Log_to_file_event_handler: public Log_event_handler
|
||||||
{
|
{
|
||||||
MYSQL_QUERY_LOG mysql_log;
|
MYSQL_QUERY_LOG mysql_log;
|
||||||
@ -498,13 +518,18 @@ public:
|
|||||||
{}
|
{}
|
||||||
void lock() { (void) pthread_mutex_lock(&LOCK_logger); }
|
void lock() { (void) pthread_mutex_lock(&LOCK_logger); }
|
||||||
void unlock() { (void) pthread_mutex_unlock(&LOCK_logger); }
|
void unlock() { (void) pthread_mutex_unlock(&LOCK_logger); }
|
||||||
bool is_general_log_table_enabled()
|
void tmp_close_log_tables(THD *thd);
|
||||||
{
|
bool is_log_table_enabled(uint log_table_type)
|
||||||
return table_log_handler && table_log_handler->general_log.table != 0;
|
|
||||||
}
|
|
||||||
bool is_slow_log_table_enabled()
|
|
||||||
{
|
{
|
||||||
|
switch (log_table_type) {
|
||||||
|
case QUERY_LOG_SLOW:
|
||||||
return table_log_handler && table_log_handler->slow_log.table != 0;
|
return table_log_handler && table_log_handler->slow_log.table != 0;
|
||||||
|
case QUERY_LOG_GENERAL:
|
||||||
|
return table_log_handler && table_log_handler->general_log.table != 0;
|
||||||
|
default:
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
return FALSE; /* make compiler happy */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
We want to initialize all log mutexes as soon as possible,
|
We want to initialize all log mutexes as soon as possible,
|
||||||
@ -542,6 +567,7 @@ public:
|
|||||||
|
|
||||||
void close_log_table(uint log_type, bool lock_in_use);
|
void close_log_table(uint log_type, bool lock_in_use);
|
||||||
bool reopen_log_table(uint log_type);
|
bool reopen_log_table(uint log_type);
|
||||||
|
bool reopen_log_tables();
|
||||||
|
|
||||||
/* we use this function to setup all enabled log event handlers */
|
/* we use this function to setup all enabled log event handlers */
|
||||||
int set_handlers(uint error_log_printer,
|
int set_handlers(uint error_log_printer,
|
||||||
@ -564,6 +590,13 @@ public:
|
|||||||
return file_log_handler->get_mysql_log();
|
return file_log_handler->get_mysql_log();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
THD* get_privileged_thread()
|
||||||
|
{
|
||||||
|
if (table_log_handler)
|
||||||
|
return table_log_handler->get_privileged_thread();
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum enum_binlog_format {
|
enum enum_binlog_format {
|
||||||
|
@ -140,6 +140,8 @@ MY_LOCALE *my_locale_by_name(const char *name);
|
|||||||
#define MAX_ACCEPT_RETRY 10 // Test accept this many times
|
#define MAX_ACCEPT_RETRY 10 // Test accept this many times
|
||||||
#define MAX_FIELDS_BEFORE_HASH 32
|
#define MAX_FIELDS_BEFORE_HASH 32
|
||||||
#define USER_VARS_HASH_SIZE 16
|
#define USER_VARS_HASH_SIZE 16
|
||||||
|
#define TABLE_OPEN_CACHE_MIN 64
|
||||||
|
#define TABLE_OPEN_CACHE_DEFAULT 64
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Value of 9236 discovered through binary search 2006-09-26 on Ubuntu Dapper
|
Value of 9236 discovered through binary search 2006-09-26 on Ubuntu Dapper
|
||||||
@ -1451,10 +1453,6 @@ typedef void (*sql_print_message_func)(const char *format, ...)
|
|||||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
extern sql_print_message_func sql_print_message_handlers[];
|
extern sql_print_message_func sql_print_message_handlers[];
|
||||||
|
|
||||||
/* type of the log table */
|
|
||||||
#define QUERY_LOG_SLOW 1
|
|
||||||
#define QUERY_LOG_GENERAL 2
|
|
||||||
|
|
||||||
int error_log_print(enum loglevel level, const char *format,
|
int error_log_print(enum loglevel level, const char *format,
|
||||||
va_list args);
|
va_list args);
|
||||||
|
|
||||||
@ -1485,6 +1483,8 @@ uint find_type2(TYPELIB *lib, const char *find, uint length, CHARSET_INFO *cs);
|
|||||||
void unhex_type2(TYPELIB *lib);
|
void unhex_type2(TYPELIB *lib);
|
||||||
uint check_word(TYPELIB *lib, const char *val, const char *end,
|
uint check_word(TYPELIB *lib, const char *val, const char *end,
|
||||||
const char **end_of_word);
|
const char **end_of_word);
|
||||||
|
int find_string_in_array(LEX_STRING * const haystack, LEX_STRING * const needle,
|
||||||
|
CHARSET_INFO * const cs);
|
||||||
|
|
||||||
|
|
||||||
bool is_keyword(const char *name, uint len);
|
bool is_keyword(const char *name, uint len);
|
||||||
@ -2052,6 +2052,10 @@ inline void kill_delayed_threads(void) {}
|
|||||||
void init_fill_schema_files_row(TABLE* table);
|
void init_fill_schema_files_row(TABLE* table);
|
||||||
bool schema_table_store_record(THD *thd, TABLE *table);
|
bool schema_table_store_record(THD *thd, TABLE *table);
|
||||||
|
|
||||||
|
/* sql/item_create.cc */
|
||||||
|
int item_create_init();
|
||||||
|
void item_create_cleanup();
|
||||||
|
|
||||||
#endif /* MYSQL_SERVER */
|
#endif /* MYSQL_SERVER */
|
||||||
#endif /* MYSQL_CLIENT */
|
#endif /* MYSQL_CLIENT */
|
||||||
|
|
||||||
|
@ -1184,6 +1184,7 @@ void clean_up(bool print_message)
|
|||||||
hostname_cache_free();
|
hostname_cache_free();
|
||||||
item_user_lock_free();
|
item_user_lock_free();
|
||||||
lex_free(); /* Free some memory */
|
lex_free(); /* Free some memory */
|
||||||
|
item_create_cleanup();
|
||||||
set_var_free();
|
set_var_free();
|
||||||
free_charsets();
|
free_charsets();
|
||||||
(void) ha_panic(HA_PANIC_CLOSE); /* close all tables and logs */
|
(void) ha_panic(HA_PANIC_CLOSE); /* close all tables and logs */
|
||||||
@ -2663,19 +2664,43 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
|||||||
|
|
||||||
/* connections and databases needs lots of files */
|
/* connections and databases needs lots of files */
|
||||||
{
|
{
|
||||||
uint files, wanted_files;
|
uint files, wanted_files, max_open_files;
|
||||||
|
|
||||||
wanted_files= 10+(uint) max(max_connections*5,
|
/* MyISAM requires two file handles per table. */
|
||||||
max_connections+table_cache_size*2);
|
wanted_files= 10+max_connections+table_cache_size*2;
|
||||||
set_if_bigger(wanted_files, open_files_limit);
|
/*
|
||||||
files= my_set_max_open_files(wanted_files);
|
We are trying to allocate no less than max_connections*5 file
|
||||||
|
handles (i.e. we are trying to set the limit so that they will
|
||||||
|
be available). In addition, we allocate no less than how much
|
||||||
|
was already allocated. However below we report a warning and
|
||||||
|
recompute values only if we got less file handles than were
|
||||||
|
explicitly requested. No warning and re-computation occur if we
|
||||||
|
can't get max_connections*5 but still got no less than was
|
||||||
|
requested (value of wanted_files).
|
||||||
|
*/
|
||||||
|
max_open_files= max(max(wanted_files, max_connections*5),
|
||||||
|
open_files_limit);
|
||||||
|
files= my_set_max_open_files(max_open_files);
|
||||||
|
|
||||||
if (files < wanted_files)
|
if (files < wanted_files)
|
||||||
{
|
{
|
||||||
if (!open_files_limit)
|
if (!open_files_limit)
|
||||||
{
|
{
|
||||||
max_connections= (ulong) min((files-10),max_connections);
|
/*
|
||||||
table_cache_size= (ulong) max((files-10-max_connections)/2,64);
|
If we have requested too much file handles than we bring
|
||||||
|
max_connections in supported bounds.
|
||||||
|
*/
|
||||||
|
max_connections= (ulong) min(files-10-TABLE_OPEN_CACHE_MIN*2,
|
||||||
|
max_connections);
|
||||||
|
/*
|
||||||
|
Decrease table_cache_size according to max_connections, but
|
||||||
|
not below TABLE_OPEN_CACHE_MIN. Outer min() ensures that we
|
||||||
|
never increase table_cache_size automatically (that could
|
||||||
|
happen if max_connections is decreased above).
|
||||||
|
*/
|
||||||
|
table_cache_size= (ulong) min(max((files-10-max_connections)/2,
|
||||||
|
TABLE_OPEN_CACHE_MIN),
|
||||||
|
table_cache_size);
|
||||||
DBUG_PRINT("warning",
|
DBUG_PRINT("warning",
|
||||||
("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
|
("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
|
||||||
files, max_connections, table_cache_size));
|
files, max_connections, table_cache_size));
|
||||||
@ -2693,6 +2718,8 @@ static int init_common_variables(const char *conf_file_name, int argc,
|
|||||||
return 1;
|
return 1;
|
||||||
init_client_errs();
|
init_client_errs();
|
||||||
lex_init();
|
lex_init();
|
||||||
|
if (item_create_init())
|
||||||
|
return 1;
|
||||||
item_init();
|
item_init();
|
||||||
set_var_init();
|
set_var_init();
|
||||||
mysys_uses_curses=0;
|
mysys_uses_curses=0;
|
||||||
@ -6185,15 +6212,15 @@ The minimum value for this variable is 4096.",
|
|||||||
{"table_cache", OPT_TABLE_OPEN_CACHE,
|
{"table_cache", OPT_TABLE_OPEN_CACHE,
|
||||||
"Deprecated; use --table_open_cache instead.",
|
"Deprecated; use --table_open_cache instead.",
|
||||||
(gptr*) &table_cache_size, (gptr*) &table_cache_size, 0, GET_ULONG,
|
(gptr*) &table_cache_size, (gptr*) &table_cache_size, 0, GET_ULONG,
|
||||||
REQUIRED_ARG, 64, 1, 512*1024L, 0, 1, 0},
|
REQUIRED_ARG, TABLE_OPEN_CACHE_DEFAULT, 1, 512*1024L, 0, 1, 0},
|
||||||
{"table_definition_cache", OPT_TABLE_DEF_CACHE,
|
{"table_definition_cache", OPT_TABLE_DEF_CACHE,
|
||||||
"The number of cached table definitions.",
|
"The number of cached table definitions.",
|
||||||
(gptr*) &table_def_size, (gptr*) &table_def_size,
|
(gptr*) &table_def_size, (gptr*) &table_def_size,
|
||||||
0, GET_ULONG, REQUIRED_ARG, 128, 1, 512*1024L, 0, 1, 0},
|
0, GET_ULONG, REQUIRED_ARG, 128, 1, 512*1024L, 0, 1, 0},
|
||||||
{"table_open_cache", OPT_TABLE_OPEN_CACHE,
|
{"table_open_cache", OPT_TABLE_OPEN_CACHE,
|
||||||
"The number of cached open tables.",
|
"The number of cached open tables.",
|
||||||
(gptr*) &table_cache_size, (gptr*) &table_cache_size,
|
(gptr*) &table_cache_size, (gptr*) &table_cache_size, 0, GET_ULONG,
|
||||||
0, GET_ULONG, REQUIRED_ARG, 64, 1, 512*1024L, 0, 1, 0},
|
REQUIRED_ARG, TABLE_OPEN_CACHE_DEFAULT, 1, 512*1024L, 0, 1, 0},
|
||||||
{"table_lock_wait_timeout", OPT_TABLE_LOCK_WAIT_TIMEOUT,
|
{"table_lock_wait_timeout", OPT_TABLE_LOCK_WAIT_TIMEOUT,
|
||||||
"Timeout in seconds to wait for a table level lock before returning an "
|
"Timeout in seconds to wait for a table level lock before returning an "
|
||||||
"error. Used only if the connection has active cursors.",
|
"error. Used only if the connection has active cursors.",
|
||||||
|
@ -107,4 +107,20 @@ public:
|
|||||||
bool bad_format_errors);
|
bool bad_format_errors);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Custom version of standard offsetof() macro which can be used to get
|
||||||
|
offsets of members in class for non-POD types (according to the current
|
||||||
|
version of C++ standard offsetof() macro can't be used in such cases and
|
||||||
|
attempt to do so causes warnings to be emitted, OTOH in many cases it is
|
||||||
|
still OK to assume that all instances of the class has the same offsets
|
||||||
|
for the same members).
|
||||||
|
|
||||||
|
This is temporary solution which should be removed once File_parser class
|
||||||
|
and related routines are refactored.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define my_offsetof(TYPE, MEMBER) \
|
||||||
|
((size_t)((char *)&(((TYPE *)0x10)->MEMBER) - (char*)0x10))
|
||||||
|
|
||||||
#endif /* _PARSE_FILE_H_ */
|
#endif /* _PARSE_FILE_H_ */
|
||||||
|
@ -6004,4 +6004,10 @@ ER_BAD_LOG_STATEMENT
|
|||||||
ger "Sie können eine Logtabelle nicht '%s', wenn Loggen angeschaltet ist"
|
ger "Sie können eine Logtabelle nicht '%s', wenn Loggen angeschaltet ist"
|
||||||
ER_NON_INSERTABLE_TABLE
|
ER_NON_INSERTABLE_TABLE
|
||||||
eng "The target table %-.100s of the %s is not insertable-into"
|
eng "The target table %-.100s of the %s is not insertable-into"
|
||||||
|
ER_CANT_RENAME_LOG_TABLE
|
||||||
|
eng "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'"
|
||||||
|
ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT 42000
|
||||||
|
eng "Incorrect parameter count in the call to native function '%-.64s'"
|
||||||
|
ER_WRONG_PARAMETERS_TO_NATIVE_FCT 42000
|
||||||
|
eng "Incorrect parameters in the call to native function '%-.64s'"
|
||||||
|
|
||||||
|
@ -1371,6 +1371,10 @@ static bool add_used_routine(LEX *lex, Query_arena *arena,
|
|||||||
const LEX_STRING *key,
|
const LEX_STRING *key,
|
||||||
TABLE_LIST *belong_to_view)
|
TABLE_LIST *belong_to_view)
|
||||||
{
|
{
|
||||||
|
hash_init_opt(&lex->sroutines, system_charset_info,
|
||||||
|
Query_tables_list::START_SROUTINES_HASH_SIZE,
|
||||||
|
0, 0, sp_sroutine_key, 0, 0);
|
||||||
|
|
||||||
if (!hash_search(&lex->sroutines, (byte *)key->str, key->length))
|
if (!hash_search(&lex->sroutines, (byte *)key->str, key->length))
|
||||||
{
|
{
|
||||||
Sroutine_hash_entry *rn=
|
Sroutine_hash_entry *rn=
|
||||||
|
@ -1029,8 +1029,7 @@ sp_head::execute(THD *thd)
|
|||||||
save_sql_mode= thd->variables.sql_mode;
|
save_sql_mode= thd->variables.sql_mode;
|
||||||
thd->variables.sql_mode= m_sql_mode;
|
thd->variables.sql_mode= m_sql_mode;
|
||||||
save_abort_on_warning= thd->abort_on_warning;
|
save_abort_on_warning= thd->abort_on_warning;
|
||||||
thd->abort_on_warning=
|
thd->abort_on_warning= 0;
|
||||||
(m_sql_mode & (MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
It is also more efficient to save/restore current thd->lex once when
|
It is also more efficient to save/restore current thd->lex once when
|
||||||
|
@ -1365,6 +1365,10 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
|
|||||||
Also SELECT::exclude_from_table_unique_test used to exclude from check
|
Also SELECT::exclude_from_table_unique_test used to exclude from check
|
||||||
tables of main SELECT of multi-delete and multi-update
|
tables of main SELECT of multi-delete and multi-update
|
||||||
|
|
||||||
|
We also skip tables with TABLE_LIST::prelocking_placeholder set,
|
||||||
|
because we want to allow SELECTs from them, and their modification
|
||||||
|
will rise the error anyway.
|
||||||
|
|
||||||
TODO: when we will have table/view change detection we can do this check
|
TODO: when we will have table/view change detection we can do this check
|
||||||
only once for PS/SP
|
only once for PS/SP
|
||||||
|
|
||||||
@ -1411,12 +1415,13 @@ TABLE_LIST* unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list)
|
|||||||
if (((! (res= find_table_in_global_list(table_list, d_name, t_name))) &&
|
if (((! (res= find_table_in_global_list(table_list, d_name, t_name))) &&
|
||||||
(! (res= mysql_lock_have_duplicate(thd, table, table_list)))) ||
|
(! (res= mysql_lock_have_duplicate(thd, table, table_list)))) ||
|
||||||
((!res->table || res->table != table->table) &&
|
((!res->table || res->table != table->table) &&
|
||||||
res->select_lex && !res->select_lex->exclude_from_table_unique_test))
|
res->select_lex && !res->select_lex->exclude_from_table_unique_test &&
|
||||||
|
!res->prelocking_placeholder))
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
If we found entry of this table or or table of SELECT which already
|
If we found entry of this table or table of SELECT which already
|
||||||
processed in derived table or top select of multi-update/multi-delete
|
processed in derived table or top select of multi-update/multi-delete
|
||||||
(exclude_from_table_unique_test).
|
(exclude_from_table_unique_test) or prelocking placeholder.
|
||||||
*/
|
*/
|
||||||
table_list= res->next_global;
|
table_list= res->next_global;
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
|
@ -350,7 +350,7 @@ cleanup:
|
|||||||
mysql_unlock_tables(thd, thd->lock);
|
mysql_unlock_tables(thd, thd->lock);
|
||||||
thd->lock=0;
|
thd->lock=0;
|
||||||
}
|
}
|
||||||
if (error < 0)
|
if (error < 0 || (thd->lex->ignore && !thd->is_fatal_error))
|
||||||
{
|
{
|
||||||
thd->row_count_func= deleted;
|
thd->row_count_func= deleted;
|
||||||
send_ok(thd,deleted);
|
send_ok(thd,deleted);
|
||||||
@ -862,6 +862,7 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
|||||||
bool error;
|
bool error;
|
||||||
uint closed_log_tables= 0, lock_logger= 0;
|
uint closed_log_tables= 0, lock_logger= 0;
|
||||||
uint path_length;
|
uint path_length;
|
||||||
|
uint log_type;
|
||||||
DBUG_ENTER("mysql_truncate");
|
DBUG_ENTER("mysql_truncate");
|
||||||
|
|
||||||
bzero((char*) &create_info,sizeof(create_info));
|
bzero((char*) &create_info,sizeof(create_info));
|
||||||
@ -913,28 +914,16 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
|||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_type= check_if_log_table(table_list->db_length, table_list->db,
|
||||||
|
table_list->table_name_length,
|
||||||
|
table_list->table_name, 1);
|
||||||
/* close log tables in use */
|
/* close log tables in use */
|
||||||
if (!my_strcasecmp(system_charset_info, table_list->db, "mysql"))
|
if (log_type)
|
||||||
{
|
|
||||||
if (opt_log &&
|
|
||||||
!my_strcasecmp(system_charset_info, table_list->table_name,
|
|
||||||
"general_log"))
|
|
||||||
{
|
{
|
||||||
lock_logger= 1;
|
lock_logger= 1;
|
||||||
logger.lock();
|
logger.lock();
|
||||||
logger.close_log_table(QUERY_LOG_GENERAL, FALSE);
|
logger.close_log_table(log_type, FALSE);
|
||||||
closed_log_tables= closed_log_tables | QUERY_LOG_GENERAL;
|
closed_log_tables= closed_log_tables | log_type;
|
||||||
}
|
|
||||||
else
|
|
||||||
if (opt_slow_log &&
|
|
||||||
!my_strcasecmp(system_charset_info, table_list->table_name,
|
|
||||||
"slow_log"))
|
|
||||||
{
|
|
||||||
lock_logger= 1;
|
|
||||||
logger.lock();
|
|
||||||
logger.close_log_table(QUERY_LOG_SLOW, FALSE);
|
|
||||||
closed_log_tables= closed_log_tables | QUERY_LOG_SLOW;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove the .frm extension AIX 5.2 64-bit compiler bug (BUG#16155): this
|
// Remove the .frm extension AIX 5.2 64-bit compiler bug (BUG#16155): this
|
||||||
|
@ -151,7 +151,6 @@ void lex_start(THD *thd, const uchar *buf, uint length)
|
|||||||
lex->safe_to_cache_query= 1;
|
lex->safe_to_cache_query= 1;
|
||||||
lex->time_zone_tables_used= 0;
|
lex->time_zone_tables_used= 0;
|
||||||
lex->leaf_tables_insert= 0;
|
lex->leaf_tables_insert= 0;
|
||||||
lex->variables_used= 0;
|
|
||||||
lex->empty_field_list_on_rset= 0;
|
lex->empty_field_list_on_rset= 0;
|
||||||
lex->select_lex.select_number= 1;
|
lex->select_lex.select_number= 1;
|
||||||
lex->next_state=MY_LEX_START;
|
lex->next_state=MY_LEX_START;
|
||||||
@ -1644,9 +1643,18 @@ void Query_tables_list::reset_query_tables_list(bool init)
|
|||||||
query_tables_last= &query_tables;
|
query_tables_last= &query_tables;
|
||||||
query_tables_own_last= 0;
|
query_tables_own_last= 0;
|
||||||
if (init)
|
if (init)
|
||||||
hash_init(&sroutines, system_charset_info, 0, 0, 0, sp_sroutine_key, 0, 0);
|
{
|
||||||
|
/*
|
||||||
|
We delay real initialization of hash (and therefore related
|
||||||
|
memory allocation) until first insertion into this hash.
|
||||||
|
*/
|
||||||
|
hash_clear(&sroutines);
|
||||||
|
}
|
||||||
else if (sroutines.records)
|
else if (sroutines.records)
|
||||||
|
{
|
||||||
|
/* Non-zero sroutines.records means that hash was initialized. */
|
||||||
my_hash_reset(&sroutines);
|
my_hash_reset(&sroutines);
|
||||||
|
}
|
||||||
sroutines_list.empty();
|
sroutines_list.empty();
|
||||||
sroutines_list_own_last= sroutines_list.next;
|
sroutines_list_own_last= sroutines_list.next;
|
||||||
sroutines_list_own_elements= 0;
|
sroutines_list_own_elements= 0;
|
||||||
@ -2141,6 +2149,28 @@ void st_lex::restore_backup_query_tables_list(Query_tables_list *backup)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Checks for usage of routines and/or tables in a parsed statement
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
st_lex:table_or_sp_used()
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
FALSE No routines and tables used
|
||||||
|
TRUE Either or both routines and tables are used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool st_lex::table_or_sp_used()
|
||||||
|
{
|
||||||
|
DBUG_ENTER("table_or_sp_used");
|
||||||
|
|
||||||
|
if (sroutines.records || query_tables)
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
|
DBUG_RETURN(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
|
Do end-of-prepare fixup for list of tables and their merge-VIEWed tables
|
||||||
|
|
||||||
@ -2208,6 +2238,7 @@ void st_select_lex::fix_prepare_information(THD *thd, Item **conds,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
There are st_select_lex::add_table_to_list &
|
There are st_select_lex::add_table_to_list &
|
||||||
st_select_lex::set_lock_for_tables are in sql_parse.cc
|
st_select_lex::set_lock_for_tables are in sql_parse.cc
|
||||||
|
@ -792,7 +792,11 @@ public:
|
|||||||
0 - indicates that this query does not need prelocking.
|
0 - indicates that this query does not need prelocking.
|
||||||
*/
|
*/
|
||||||
TABLE_LIST **query_tables_own_last;
|
TABLE_LIST **query_tables_own_last;
|
||||||
/* Set of stored routines called by statement. */
|
/*
|
||||||
|
Set of stored routines called by statement.
|
||||||
|
(Note that we use lazy-initialization for this hash).
|
||||||
|
*/
|
||||||
|
enum { START_SROUTINES_HASH_SIZE= 16 };
|
||||||
HASH sroutines;
|
HASH sroutines;
|
||||||
/*
|
/*
|
||||||
List linking elements of 'sroutines' set. Allows you to add new elements
|
List linking elements of 'sroutines' set. Allows you to add new elements
|
||||||
@ -867,6 +871,25 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
st_parsing_options contains the flags for constructions that are
|
||||||
|
allowed in the current statement.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct st_parsing_options
|
||||||
|
{
|
||||||
|
bool allows_variable;
|
||||||
|
bool allows_select_into;
|
||||||
|
bool allows_select_procedure;
|
||||||
|
bool allows_derived;
|
||||||
|
|
||||||
|
st_parsing_options()
|
||||||
|
: allows_variable(TRUE), allows_select_into(TRUE),
|
||||||
|
allows_select_procedure(TRUE), allows_derived(TRUE)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* The state of the lex parsing. This is saved in the THD struct */
|
/* The state of the lex parsing. This is saved in the THD struct */
|
||||||
|
|
||||||
typedef struct st_lex : public Query_tables_list
|
typedef struct st_lex : public Query_tables_list
|
||||||
@ -1023,7 +1046,7 @@ typedef struct st_lex : public Query_tables_list
|
|||||||
bool stmt_prepare_mode;
|
bool stmt_prepare_mode;
|
||||||
bool safe_to_cache_query;
|
bool safe_to_cache_query;
|
||||||
bool subqueries, ignore;
|
bool subqueries, ignore;
|
||||||
bool variables_used;
|
st_parsing_options parsing_options;
|
||||||
ALTER_INFO alter_info;
|
ALTER_INFO alter_info;
|
||||||
/* Prepared statements SQL syntax:*/
|
/* Prepared statements SQL syntax:*/
|
||||||
LEX_STRING prepared_stmt_name; /* Statement name (in all queries) */
|
LEX_STRING prepared_stmt_name; /* Statement name (in all queries) */
|
||||||
@ -1180,6 +1203,8 @@ typedef struct st_lex : public Query_tables_list
|
|||||||
|
|
||||||
void reset_n_backup_query_tables_list(Query_tables_list *backup);
|
void reset_n_backup_query_tables_list(Query_tables_list *backup);
|
||||||
void restore_backup_query_tables_list(Query_tables_list *backup);
|
void restore_backup_query_tables_list(Query_tables_list *backup);
|
||||||
|
|
||||||
|
bool table_or_sp_used();
|
||||||
} LEX;
|
} LEX;
|
||||||
|
|
||||||
struct st_lex_local: public st_lex
|
struct st_lex_local: public st_lex
|
||||||
|
@ -3075,11 +3075,6 @@ end_with_restore_list:
|
|||||||
|
|
||||||
case SQLCOM_ALTER_TABLE:
|
case SQLCOM_ALTER_TABLE:
|
||||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||||
#if defined(DONT_ALLOW_SHOW_COMMANDS)
|
|
||||||
my_message(ER_NOT_ALLOWED_COMMAND, ER(ER_NOT_ALLOWED_COMMAND),
|
|
||||||
MYF(0)); /* purecov: inspected */
|
|
||||||
goto error;
|
|
||||||
#else
|
|
||||||
{
|
{
|
||||||
ulong priv=0;
|
ulong priv=0;
|
||||||
ulong priv_needed= ALTER_ACL;
|
ulong priv_needed= ALTER_ACL;
|
||||||
@ -3148,7 +3143,6 @@ end_with_restore_list:
|
|||||||
lex->ignore, &lex->alter_info, 1);
|
lex->ignore, &lex->alter_info, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif /*DONT_ALLOW_SHOW_COMMANDS*/
|
|
||||||
case SQLCOM_RENAME_TABLE:
|
case SQLCOM_RENAME_TABLE:
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||||
@ -3394,9 +3388,17 @@ end_with_restore_list:
|
|||||||
res= mysql_insert(thd, all_tables, lex->field_list, lex->many_values,
|
res= mysql_insert(thd, all_tables, lex->field_list, lex->many_values,
|
||||||
lex->update_list, lex->value_list,
|
lex->update_list, lex->value_list,
|
||||||
lex->duplicates, lex->ignore);
|
lex->duplicates, lex->ignore);
|
||||||
/* do not show last insert ID if VIEW does not have auto_inc */
|
|
||||||
|
/*
|
||||||
|
If we have inserted into a VIEW, and the base table has
|
||||||
|
AUTO_INCREMENT column, but this column is not accessible through
|
||||||
|
a view, then we should restore LAST_INSERT_ID to the value it
|
||||||
|
had before the statement.
|
||||||
|
*/
|
||||||
if (first_table->view && !first_table->contain_auto_increment)
|
if (first_table->view && !first_table->contain_auto_increment)
|
||||||
thd->first_successful_insert_id_in_cur_stmt= 0;
|
thd->first_successful_insert_id_in_cur_stmt=
|
||||||
|
thd->first_successful_insert_id_in_prev_stmt;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SQLCOM_REPLACE_SELECT:
|
case SQLCOM_REPLACE_SELECT:
|
||||||
@ -3456,9 +3458,17 @@ end_with_restore_list:
|
|||||||
/* revert changes for SP */
|
/* revert changes for SP */
|
||||||
select_lex->table_list.first= (byte*) first_table;
|
select_lex->table_list.first= (byte*) first_table;
|
||||||
}
|
}
|
||||||
/* do not show last insert ID if VIEW does not have auto_inc */
|
|
||||||
|
/*
|
||||||
|
If we have inserted into a VIEW, and the base table has
|
||||||
|
AUTO_INCREMENT column, but this column is not accessible through
|
||||||
|
a view, then we should restore LAST_INSERT_ID to the value it
|
||||||
|
had before the statement.
|
||||||
|
*/
|
||||||
if (first_table->view && !first_table->contain_auto_increment)
|
if (first_table->view && !first_table->contain_auto_increment)
|
||||||
thd->first_successful_insert_id_in_cur_stmt= 0;
|
thd->first_successful_insert_id_in_cur_stmt=
|
||||||
|
thd->first_successful_insert_id_in_prev_stmt;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SQLCOM_TRUNCATE:
|
case SQLCOM_TRUNCATE:
|
||||||
@ -3890,6 +3900,12 @@ end_with_restore_list:
|
|||||||
case SQLCOM_ALTER_EVENT:
|
case SQLCOM_ALTER_EVENT:
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(lex->event_parse_data);
|
DBUG_ASSERT(lex->event_parse_data);
|
||||||
|
if (lex->table_or_sp_used())
|
||||||
|
{
|
||||||
|
my_error(ER_NOT_SUPPORTED_YET, MYF(0), "Usage of subqueries or stored "
|
||||||
|
"function calls as part of this statement");
|
||||||
|
break;
|
||||||
|
}
|
||||||
switch (lex->sql_command) {
|
switch (lex->sql_command) {
|
||||||
case SQLCOM_CREATE_EVENT:
|
case SQLCOM_CREATE_EVENT:
|
||||||
res= Events::get_instance()->
|
res= Events::get_instance()->
|
||||||
@ -4191,6 +4207,13 @@ end_with_restore_list:
|
|||||||
{
|
{
|
||||||
Item *it= (Item *)lex->value_list.head();
|
Item *it= (Item *)lex->value_list.head();
|
||||||
|
|
||||||
|
if (lex->table_or_sp_used())
|
||||||
|
{
|
||||||
|
my_error(ER_NOT_SUPPORTED_YET, MYF(0), "Usage of subqueries or stored "
|
||||||
|
"function calls as part of this statement");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if ((!it->fixed && it->fix_fields(lex->thd, &it)) || it->check_cols(1))
|
if ((!it->fixed && it->fix_fields(lex->thd, &it)) || it->check_cols(1))
|
||||||
{
|
{
|
||||||
my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY),
|
my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY),
|
||||||
@ -6091,14 +6114,19 @@ void mysql_parse(THD *thd, char *inBuf, uint length)
|
|||||||
DBUG_ASSERT(thd->net.report_error);
|
DBUG_ASSERT(thd->net.report_error);
|
||||||
DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
|
DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
|
||||||
thd->is_fatal_error));
|
thd->is_fatal_error));
|
||||||
query_cache_abort(&thd->net);
|
|
||||||
lex->unit.cleanup();
|
/*
|
||||||
|
The first thing we do after parse error is freeing sp_head to
|
||||||
|
ensure that we have restored original memroot.
|
||||||
|
*/
|
||||||
if (lex->sphead)
|
if (lex->sphead)
|
||||||
{
|
{
|
||||||
/* Clean up after failed stored procedure/function */
|
/* Clean up after failed stored procedure/function */
|
||||||
delete lex->sphead;
|
delete lex->sphead;
|
||||||
lex->sphead= NULL;
|
lex->sphead= NULL;
|
||||||
}
|
}
|
||||||
|
query_cache_abort(&thd->net);
|
||||||
|
lex->unit.cleanup();
|
||||||
}
|
}
|
||||||
thd->proc_info="freeing items";
|
thd->proc_info="freeing items";
|
||||||
thd->end_statement();
|
thd->end_statement();
|
||||||
|
@ -2811,7 +2811,19 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
|
|||||||
|
|
||||||
error= MYSQLparse((void *)thd) || thd->is_fatal_error ||
|
error= MYSQLparse((void *)thd) || thd->is_fatal_error ||
|
||||||
thd->net.report_error || init_param_array(this);
|
thd->net.report_error || init_param_array(this);
|
||||||
|
|
||||||
|
/*
|
||||||
|
The first thing we do after parse error is freeing sp_head to
|
||||||
|
ensure that we have restored original memroot.
|
||||||
|
*/
|
||||||
|
if (error && lex->sphead)
|
||||||
|
{
|
||||||
|
delete lex->sphead;
|
||||||
|
lex->sphead= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
lex->safe_to_cache_query= FALSE;
|
lex->safe_to_cache_query= FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
While doing context analysis of the query (in check_prepared_statement)
|
While doing context analysis of the query (in check_prepared_statement)
|
||||||
we allocate a lot of additional memory: for open tables, JOINs, derived
|
we allocate a lot of additional memory: for open tables, JOINs, derived
|
||||||
@ -2837,6 +2849,7 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
|
|||||||
if (error == 0)
|
if (error == 0)
|
||||||
error= check_prepared_statement(this, name.str != 0);
|
error= check_prepared_statement(this, name.str != 0);
|
||||||
|
|
||||||
|
/* Free sp_head if check_prepared_statement() failed. */
|
||||||
if (error && lex->sphead)
|
if (error && lex->sphead)
|
||||||
{
|
{
|
||||||
delete lex->sphead;
|
delete lex->sphead;
|
||||||
|
@ -35,7 +35,10 @@ static TABLE_LIST *reverse_table_list(TABLE_LIST *table_list);
|
|||||||
bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
||||||
{
|
{
|
||||||
bool error= 1;
|
bool error= 1;
|
||||||
TABLE_LIST *ren_table= 0;
|
TABLE_LIST *ren_table= 0, *new_table;
|
||||||
|
int to_table;
|
||||||
|
char *rename_log_table[2]= {NULL, NULL};
|
||||||
|
int disable_logs= 0;
|
||||||
DBUG_ENTER("mysql_rename_tables");
|
DBUG_ENTER("mysql_rename_tables");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -52,6 +55,96 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
|||||||
|
|
||||||
if (wait_if_global_read_lock(thd,0,1))
|
if (wait_if_global_read_lock(thd,0,1))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
|
if (logger.is_log_table_enabled(QUERY_LOG_GENERAL) ||
|
||||||
|
logger.is_log_table_enabled(QUERY_LOG_SLOW))
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
Rules for rename of a log table:
|
||||||
|
|
||||||
|
IF 1. Log tables are enabled
|
||||||
|
AND 2. Rename operates on the log table and nothing is being
|
||||||
|
renamed to the log table.
|
||||||
|
DO 3. Throw an error message.
|
||||||
|
ELSE 4. Perform rename.
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (to_table= 0, ren_table= table_list; ren_table;
|
||||||
|
to_table= 1 - to_table, ren_table= ren_table->next_local)
|
||||||
|
{
|
||||||
|
int log_table_rename= 0;
|
||||||
|
|
||||||
|
if ((log_table_rename=
|
||||||
|
check_if_log_table(ren_table->db_length, ren_table->db,
|
||||||
|
ren_table->table_name_length,
|
||||||
|
ren_table->table_name, 1)))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Log table encoutered we will need to disable and lock logs
|
||||||
|
for duration of rename.
|
||||||
|
*/
|
||||||
|
disable_logs= TRUE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
as we use log_table_rename as an array index, we need it to start
|
||||||
|
with 0, while QUERY_LOG_SLOW == 1 and QUERY_LOG_GENERAL == 2.
|
||||||
|
So, we shift the value to start with 0;
|
||||||
|
*/
|
||||||
|
log_table_rename--;
|
||||||
|
if (rename_log_table[log_table_rename])
|
||||||
|
{
|
||||||
|
if (to_table)
|
||||||
|
rename_log_table[log_table_rename]= NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Two renames of "log_table TO" w/o rename "TO log_table" in
|
||||||
|
between.
|
||||||
|
*/
|
||||||
|
my_error(ER_CANT_RENAME_LOG_TABLE, MYF(0), ren_table->table_name,
|
||||||
|
ren_table->table_name);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (to_table)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Attempt to rename a table TO log_table w/o renaming
|
||||||
|
log_table TO some table.
|
||||||
|
*/
|
||||||
|
my_error(ER_CANT_RENAME_LOG_TABLE, MYF(0), ren_table->table_name,
|
||||||
|
ren_table->table_name);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* save the name of the log table to report an error */
|
||||||
|
rename_log_table[log_table_rename]= ren_table->table_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rename_log_table[0] || rename_log_table[1])
|
||||||
|
{
|
||||||
|
if (rename_log_table[0])
|
||||||
|
my_error(ER_CANT_RENAME_LOG_TABLE, MYF(0), rename_log_table[0],
|
||||||
|
rename_log_table[0]);
|
||||||
|
else
|
||||||
|
my_error(ER_CANT_RENAME_LOG_TABLE, MYF(0), rename_log_table[1],
|
||||||
|
rename_log_table[1]);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disable_logs)
|
||||||
|
{
|
||||||
|
logger.lock();
|
||||||
|
logger.tmp_close_log_tables(thd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VOID(pthread_mutex_lock(&LOCK_open));
|
VOID(pthread_mutex_lock(&LOCK_open));
|
||||||
if (lock_table_names(thd, table_list))
|
if (lock_table_names(thd, table_list))
|
||||||
goto err;
|
goto err;
|
||||||
@ -95,6 +188,13 @@ bool mysql_rename_tables(THD *thd, TABLE_LIST *table_list, bool silent)
|
|||||||
|
|
||||||
err:
|
err:
|
||||||
pthread_mutex_unlock(&LOCK_open);
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
|
/* enable logging back if needed */
|
||||||
|
if (disable_logs)
|
||||||
|
{
|
||||||
|
if (logger.reopen_log_tables())
|
||||||
|
error= TRUE;
|
||||||
|
logger.unlock();
|
||||||
|
}
|
||||||
start_waiting_global_read_lock(thd);
|
start_waiting_global_read_lock(thd);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
132
sql/sql_table.cc
132
sql/sql_table.cc
@ -1639,11 +1639,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
|||||||
|
|
||||||
/* Disable drop of enabled log tables */
|
/* Disable drop of enabled log tables */
|
||||||
if (share && share->log_table &&
|
if (share && share->log_table &&
|
||||||
((!my_strcasecmp(system_charset_info, table->table_name,
|
check_if_log_table(table->db_length, table->db,
|
||||||
"general_log") && opt_log &&
|
table->table_name_length, table->table_name, 1))
|
||||||
logger.is_general_log_table_enabled()) ||
|
|
||||||
(!my_strcasecmp(system_charset_info, table->table_name, "slow_log")
|
|
||||||
&& opt_slow_log && logger.is_slow_log_table_enabled())))
|
|
||||||
{
|
{
|
||||||
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "DROP");
|
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "DROP");
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -4043,7 +4040,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
Item *item;
|
Item *item;
|
||||||
Protocol *protocol= thd->protocol;
|
Protocol *protocol= thd->protocol;
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
int result_code;
|
int result_code, disable_logs= 0;
|
||||||
DBUG_ENTER("mysql_admin_table");
|
DBUG_ENTER("mysql_admin_table");
|
||||||
|
|
||||||
if (end_active_trans(thd))
|
if (end_active_trans(thd))
|
||||||
@ -4088,6 +4085,23 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
thd->no_warnings_for_error= no_warnings_for_error;
|
thd->no_warnings_for_error= no_warnings_for_error;
|
||||||
if (view_operator_func == NULL)
|
if (view_operator_func == NULL)
|
||||||
table->required_type=FRMTYPE_TABLE;
|
table->required_type=FRMTYPE_TABLE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
If we want to perform an admin operation on the log table
|
||||||
|
(E.g. rename) and lock_type >= TL_READ_NO_INSERT disable
|
||||||
|
log tables
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (check_if_log_table(table->db_length, table->db,
|
||||||
|
table->table_name_length,
|
||||||
|
table->table_name, 1) &&
|
||||||
|
lock_type >= TL_READ_NO_INSERT)
|
||||||
|
{
|
||||||
|
disable_logs= 1;
|
||||||
|
logger.lock();
|
||||||
|
logger.tmp_close_log_tables(thd);
|
||||||
|
}
|
||||||
|
|
||||||
open_and_lock_tables(thd, table);
|
open_and_lock_tables(thd, table);
|
||||||
thd->no_warnings_for_error= 0;
|
thd->no_warnings_for_error= 0;
|
||||||
table->next_global= save_next_global;
|
table->next_global= save_next_global;
|
||||||
@ -4404,11 +4418,24 @@ send_result_message:
|
|||||||
}
|
}
|
||||||
|
|
||||||
send_eof(thd);
|
send_eof(thd);
|
||||||
|
if (disable_logs)
|
||||||
|
{
|
||||||
|
if (logger.reopen_log_tables())
|
||||||
|
my_error(ER_CANT_ACTIVATE_LOG, MYF(0));
|
||||||
|
logger.unlock();
|
||||||
|
}
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
ha_autocommit_or_rollback(thd, 1);
|
ha_autocommit_or_rollback(thd, 1);
|
||||||
close_thread_tables(thd); // Shouldn't be needed
|
close_thread_tables(thd); // Shouldn't be needed
|
||||||
|
/* enable logging back if needed */
|
||||||
|
if (disable_logs)
|
||||||
|
{
|
||||||
|
if (logger.reopen_log_tables())
|
||||||
|
my_error(ER_CANT_ACTIVATE_LOG, MYF(0));
|
||||||
|
logger.unlock();
|
||||||
|
}
|
||||||
if (table)
|
if (table)
|
||||||
table->table=0;
|
table->table=0;
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
@ -4573,17 +4600,18 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
{
|
{
|
||||||
TABLE *tmp_table;
|
TABLE *tmp_table;
|
||||||
char src_path[FN_REFLEN], dst_path[FN_REFLEN], tmp_path[FN_REFLEN];
|
char src_path[FN_REFLEN], dst_path[FN_REFLEN], tmp_path[FN_REFLEN];
|
||||||
|
char src_table_name_buff[FN_REFLEN], src_db_name_buff[FN_REFLEN];
|
||||||
uint dst_path_length;
|
uint dst_path_length;
|
||||||
char *db= table->db;
|
char *db= table->db;
|
||||||
char *table_name= table->table_name;
|
char *table_name= table->table_name;
|
||||||
char *src_db;
|
char *src_db;
|
||||||
char *src_table= table_ident->table.str;
|
char *src_table= table_ident->table.str;
|
||||||
int err;
|
int err;
|
||||||
bool res= TRUE;
|
bool res= TRUE, unlock_dst_table= FALSE;
|
||||||
enum legacy_db_type not_used;
|
enum legacy_db_type not_used;
|
||||||
HA_CREATE_INFO *create_info;
|
HA_CREATE_INFO *create_info;
|
||||||
|
|
||||||
TABLE_LIST src_tables_list;
|
TABLE_LIST src_tables_list, dst_tables_list;
|
||||||
DBUG_ENTER("mysql_create_like_table");
|
DBUG_ENTER("mysql_create_like_table");
|
||||||
|
|
||||||
if (!(create_info= copy_create_info(lex_create_info)))
|
if (!(create_info= copy_create_info(lex_create_info)))
|
||||||
@ -4609,13 +4637,6 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bzero((gptr)&src_tables_list, sizeof(src_tables_list));
|
|
||||||
src_tables_list.db= src_db;
|
|
||||||
src_tables_list.table_name= src_table;
|
|
||||||
|
|
||||||
if (lock_and_wait_for_table_name(thd, &src_tables_list))
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
if ((tmp_table= find_temporary_table(thd, src_db, src_table)))
|
if ((tmp_table= find_temporary_table(thd, src_db, src_table)))
|
||||||
strxmov(src_path, tmp_table->s->path.str, reg_ext, NullS);
|
strxmov(src_path, tmp_table->s->path.str, reg_ext, NullS);
|
||||||
else
|
else
|
||||||
@ -4642,6 +4663,34 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lower_case_table_names)
|
||||||
|
{
|
||||||
|
if (src_db)
|
||||||
|
{
|
||||||
|
strmake(src_db_name_buff, src_db,
|
||||||
|
min(sizeof(src_db_name_buff) - 1, table_ident->db.length));
|
||||||
|
my_casedn_str(files_charset_info, src_db_name_buff);
|
||||||
|
src_db= src_db_name_buff;
|
||||||
|
}
|
||||||
|
if (src_table)
|
||||||
|
{
|
||||||
|
strmake(src_table_name_buff, src_table,
|
||||||
|
min(sizeof(src_table_name_buff) - 1, table_ident->table.length));
|
||||||
|
my_casedn_str(files_charset_info, src_table_name_buff);
|
||||||
|
src_table= src_table_name_buff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero((gptr)&src_tables_list, sizeof(src_tables_list));
|
||||||
|
src_tables_list.db= src_db;
|
||||||
|
src_tables_list.db_length= table_ident->db.length;
|
||||||
|
src_tables_list.lock_type= TL_READ;
|
||||||
|
src_tables_list.table_name= src_table;
|
||||||
|
src_tables_list.alias= src_table;
|
||||||
|
|
||||||
|
if (simple_open_n_lock_tables(thd, &src_tables_list))
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Validate the destination table
|
Validate the destination table
|
||||||
|
|
||||||
@ -4745,17 +4794,29 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
char buf[2048];
|
char buf[2048];
|
||||||
String query(buf, sizeof(buf), system_charset_info);
|
String query(buf, sizeof(buf), system_charset_info);
|
||||||
query.length(0); // Have to zero it since constructor doesn't
|
query.length(0); // Have to zero it since constructor doesn't
|
||||||
TABLE *table_ptr;
|
uint counter;
|
||||||
int error;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Let's open and lock the table: it will be closed (and
|
Here we open the destination table. This is needed for
|
||||||
unlocked) by close_thread_tables() at the end of the
|
store_create_info() to work. The table will be closed
|
||||||
statement anyway.
|
by close_thread_tables() at the end of the statement.
|
||||||
*/
|
*/
|
||||||
if (!(table_ptr= open_ltable(thd, table, TL_READ_NO_INSERT)))
|
if (open_tables(thd, &table, &counter, 0))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
bzero((gptr)&dst_tables_list, sizeof(dst_tables_list));
|
||||||
|
dst_tables_list.db= table->db;
|
||||||
|
dst_tables_list.table_name= table->table_name;
|
||||||
|
|
||||||
|
/*
|
||||||
|
lock destination table name, to make sure that nobody
|
||||||
|
can drop/alter the table while we execute store_create_info()
|
||||||
|
*/
|
||||||
|
if (lock_and_wait_for_table_name(thd, &dst_tables_list))
|
||||||
|
goto err;
|
||||||
|
else
|
||||||
|
unlock_dst_table= TRUE;
|
||||||
|
|
||||||
int result= store_create_info(thd, table, &query, create_info);
|
int result= store_create_info(thd, table, &query, create_info);
|
||||||
|
|
||||||
DBUG_ASSERT(result == 0); // store_create_info() always return 0
|
DBUG_ASSERT(result == 0); // store_create_info() always return 0
|
||||||
@ -4788,9 +4849,12 @@ table_exists:
|
|||||||
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
|
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
if (unlock_dst_table)
|
||||||
|
{
|
||||||
pthread_mutex_lock(&LOCK_open);
|
pthread_mutex_lock(&LOCK_open);
|
||||||
unlock_table_name(thd, &src_tables_list);
|
unlock_table_name(thd, &dst_tables_list);
|
||||||
pthread_mutex_unlock(&LOCK_open);
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
|
}
|
||||||
DBUG_RETURN(res);
|
DBUG_RETURN(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5179,33 +5243,23 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||||||
LINT_INIT(index_add_buffer);
|
LINT_INIT(index_add_buffer);
|
||||||
LINT_INIT(index_drop_buffer);
|
LINT_INIT(index_drop_buffer);
|
||||||
|
|
||||||
if (table_list && table_list->db &&
|
if (table_list && table_list->db && table_list->table_name)
|
||||||
!my_strcasecmp(system_charset_info, table_list->db, "mysql") &&
|
|
||||||
table_list->table_name)
|
|
||||||
{
|
{
|
||||||
enum enum_table_kind { NOT_LOG_TABLE= 1, GENERAL_LOG, SLOW_LOG }
|
int table_kind= 0;
|
||||||
table_kind= NOT_LOG_TABLE;
|
|
||||||
|
|
||||||
if (!my_strcasecmp(system_charset_info, table_list->table_name,
|
table_kind= check_if_log_table(table_list->db_length, table_list->db,
|
||||||
"general_log"))
|
table_list->table_name_length,
|
||||||
table_kind= GENERAL_LOG;
|
table_list->table_name, 0);
|
||||||
else
|
|
||||||
if (!my_strcasecmp(system_charset_info, table_list->table_name,
|
|
||||||
"slow_log"))
|
|
||||||
table_kind= SLOW_LOG;
|
|
||||||
|
|
||||||
/* Disable alter of enabled log tables */
|
/* Disable alter of enabled log tables */
|
||||||
if ((table_kind == GENERAL_LOG && opt_log &&
|
if (table_kind && logger.is_log_table_enabled(table_kind))
|
||||||
logger.is_general_log_table_enabled()) ||
|
|
||||||
(table_kind == SLOW_LOG && opt_slow_log &&
|
|
||||||
logger.is_slow_log_table_enabled()))
|
|
||||||
{
|
{
|
||||||
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER");
|
my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER");
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable alter of log tables to unsupported engine */
|
/* Disable alter of log tables to unsupported engine */
|
||||||
if ((table_kind == GENERAL_LOG || table_kind == SLOW_LOG) &&
|
if (table_kind &&
|
||||||
(lex_create_info->used_fields & HA_CREATE_USED_ENGINE) &&
|
(lex_create_info->used_fields & HA_CREATE_USED_ENGINE) &&
|
||||||
(!lex_create_info->db_type || /* unknown engine */
|
(!lex_create_info->db_type || /* unknown engine */
|
||||||
!(lex_create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES)))
|
!(lex_create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES)))
|
||||||
|
@ -36,17 +36,17 @@ static File_option triggers_file_parameters[]=
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
{ C_STRING_WITH_LEN("triggers") },
|
{ C_STRING_WITH_LEN("triggers") },
|
||||||
offsetof(class Table_triggers_list, definitions_list),
|
my_offsetof(class Table_triggers_list, definitions_list),
|
||||||
FILE_OPTIONS_STRLIST
|
FILE_OPTIONS_STRLIST
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ C_STRING_WITH_LEN("sql_modes") },
|
{ C_STRING_WITH_LEN("sql_modes") },
|
||||||
offsetof(class Table_triggers_list, definition_modes_list),
|
my_offsetof(class Table_triggers_list, definition_modes_list),
|
||||||
FILE_OPTIONS_ULLLIST
|
FILE_OPTIONS_ULLLIST
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ C_STRING_WITH_LEN("definers") },
|
{ C_STRING_WITH_LEN("definers") },
|
||||||
offsetof(class Table_triggers_list, definers_list),
|
my_offsetof(class Table_triggers_list, definers_list),
|
||||||
FILE_OPTIONS_STRLIST
|
FILE_OPTIONS_STRLIST
|
||||||
},
|
},
|
||||||
{ { 0, 0 }, 0, FILE_OPTIONS_STRING }
|
{ { 0, 0 }, 0, FILE_OPTIONS_STRING }
|
||||||
@ -55,7 +55,7 @@ static File_option triggers_file_parameters[]=
|
|||||||
File_option sql_modes_parameters=
|
File_option sql_modes_parameters=
|
||||||
{
|
{
|
||||||
{ C_STRING_WITH_LEN("sql_modes") },
|
{ C_STRING_WITH_LEN("sql_modes") },
|
||||||
offsetof(class Table_triggers_list, definition_modes_list),
|
my_offsetof(class Table_triggers_list, definition_modes_list),
|
||||||
FILE_OPTIONS_ULLLIST
|
FILE_OPTIONS_ULLLIST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -236,25 +236,9 @@ bool mysql_create_view(THD *thd,
|
|||||||
bool res= FALSE;
|
bool res= FALSE;
|
||||||
DBUG_ENTER("mysql_create_view");
|
DBUG_ENTER("mysql_create_view");
|
||||||
|
|
||||||
if (lex->proc_list.first ||
|
/* This is ensured in the parser. */
|
||||||
lex->result)
|
DBUG_ASSERT(!lex->proc_list.first && !lex->result &&
|
||||||
{
|
!lex->param_list.elements && !lex->derived_tables);
|
||||||
my_error(ER_VIEW_SELECT_CLAUSE, MYF(0), (lex->result ?
|
|
||||||
"INTO" :
|
|
||||||
"PROCEDURE"));
|
|
||||||
res= TRUE;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (lex->derived_tables ||
|
|
||||||
lex->variables_used || lex->param_list.elements)
|
|
||||||
{
|
|
||||||
int err= (lex->derived_tables ?
|
|
||||||
ER_VIEW_SELECT_DERIVED :
|
|
||||||
ER_VIEW_SELECT_VARIABLE);
|
|
||||||
my_message(err, ER(err), MYF(0));
|
|
||||||
res= TRUE;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode != VIEW_CREATE_NEW)
|
if (mode != VIEW_CREATE_NEW)
|
||||||
{
|
{
|
||||||
@ -582,40 +566,40 @@ static const int num_view_backups= 3;
|
|||||||
*/
|
*/
|
||||||
static File_option view_parameters[]=
|
static File_option view_parameters[]=
|
||||||
{{{ C_STRING_WITH_LEN("query")},
|
{{{ C_STRING_WITH_LEN("query")},
|
||||||
offsetof(TABLE_LIST, query),
|
my_offsetof(TABLE_LIST, query),
|
||||||
FILE_OPTIONS_ESTRING},
|
FILE_OPTIONS_ESTRING},
|
||||||
{{ C_STRING_WITH_LEN("md5")},
|
{{ C_STRING_WITH_LEN("md5")},
|
||||||
offsetof(TABLE_LIST, md5),
|
my_offsetof(TABLE_LIST, md5),
|
||||||
FILE_OPTIONS_STRING},
|
FILE_OPTIONS_STRING},
|
||||||
{{ C_STRING_WITH_LEN("updatable")},
|
{{ C_STRING_WITH_LEN("updatable")},
|
||||||
offsetof(TABLE_LIST, updatable_view),
|
my_offsetof(TABLE_LIST, updatable_view),
|
||||||
FILE_OPTIONS_ULONGLONG},
|
FILE_OPTIONS_ULONGLONG},
|
||||||
{{ C_STRING_WITH_LEN("algorithm")},
|
{{ C_STRING_WITH_LEN("algorithm")},
|
||||||
offsetof(TABLE_LIST, algorithm),
|
my_offsetof(TABLE_LIST, algorithm),
|
||||||
FILE_OPTIONS_ULONGLONG},
|
FILE_OPTIONS_ULONGLONG},
|
||||||
{{ C_STRING_WITH_LEN("definer_user")},
|
{{ C_STRING_WITH_LEN("definer_user")},
|
||||||
offsetof(TABLE_LIST, definer.user),
|
my_offsetof(TABLE_LIST, definer.user),
|
||||||
FILE_OPTIONS_STRING},
|
FILE_OPTIONS_STRING},
|
||||||
{{ C_STRING_WITH_LEN("definer_host")},
|
{{ C_STRING_WITH_LEN("definer_host")},
|
||||||
offsetof(TABLE_LIST, definer.host),
|
my_offsetof(TABLE_LIST, definer.host),
|
||||||
FILE_OPTIONS_STRING},
|
FILE_OPTIONS_STRING},
|
||||||
{{ C_STRING_WITH_LEN("suid")},
|
{{ C_STRING_WITH_LEN("suid")},
|
||||||
offsetof(TABLE_LIST, view_suid),
|
my_offsetof(TABLE_LIST, view_suid),
|
||||||
FILE_OPTIONS_ULONGLONG},
|
FILE_OPTIONS_ULONGLONG},
|
||||||
{{ C_STRING_WITH_LEN("with_check_option")},
|
{{ C_STRING_WITH_LEN("with_check_option")},
|
||||||
offsetof(TABLE_LIST, with_check),
|
my_offsetof(TABLE_LIST, with_check),
|
||||||
FILE_OPTIONS_ULONGLONG},
|
FILE_OPTIONS_ULONGLONG},
|
||||||
{{ C_STRING_WITH_LEN("revision")},
|
{{ C_STRING_WITH_LEN("revision")},
|
||||||
offsetof(TABLE_LIST, revision),
|
my_offsetof(TABLE_LIST, revision),
|
||||||
FILE_OPTIONS_REV},
|
FILE_OPTIONS_REV},
|
||||||
{{ C_STRING_WITH_LEN("timestamp")},
|
{{ C_STRING_WITH_LEN("timestamp")},
|
||||||
offsetof(TABLE_LIST, timestamp),
|
my_offsetof(TABLE_LIST, timestamp),
|
||||||
FILE_OPTIONS_TIMESTAMP},
|
FILE_OPTIONS_TIMESTAMP},
|
||||||
{{ C_STRING_WITH_LEN("create-version")},
|
{{ C_STRING_WITH_LEN("create-version")},
|
||||||
offsetof(TABLE_LIST, file_version),
|
my_offsetof(TABLE_LIST, file_version),
|
||||||
FILE_OPTIONS_ULONGLONG},
|
FILE_OPTIONS_ULONGLONG},
|
||||||
{{ C_STRING_WITH_LEN("source")},
|
{{ C_STRING_WITH_LEN("source")},
|
||||||
offsetof(TABLE_LIST, source),
|
my_offsetof(TABLE_LIST, source),
|
||||||
FILE_OPTIONS_ESTRING},
|
FILE_OPTIONS_ESTRING},
|
||||||
{{NullS, 0}, 0,
|
{{NullS, 0}, 0,
|
||||||
FILE_OPTIONS_STRING}
|
FILE_OPTIONS_STRING}
|
||||||
|
1622
sql/sql_yacc.yy
1622
sql/sql_yacc.yy
File diff suppressed because it is too large
Load Diff
@ -312,3 +312,33 @@ outp:
|
|||||||
return (uint32) (to - to_start);
|
return (uint32) (to - to_start);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Searches for a LEX_STRING in an LEX_STRING array.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
find_string_in_array()
|
||||||
|
heap The array
|
||||||
|
needle The string to search for
|
||||||
|
|
||||||
|
NOTE
|
||||||
|
The last LEX_STRING in the array should have str member set to NULL
|
||||||
|
|
||||||
|
RETURN VALUES
|
||||||
|
-1 Not found
|
||||||
|
>=0 Ordinal position
|
||||||
|
*/
|
||||||
|
|
||||||
|
int find_string_in_array(LEX_STRING * const haystack, LEX_STRING * const needle,
|
||||||
|
CHARSET_INFO * const cs)
|
||||||
|
{
|
||||||
|
const LEX_STRING *pos;
|
||||||
|
for (pos= haystack; pos->str; pos++)
|
||||||
|
if (!cs->coll->strnncollsp(cs, (uchar *) pos->str, pos->length,
|
||||||
|
(uchar *) needle->str, needle->length, 0))
|
||||||
|
{
|
||||||
|
return (pos - haystack);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
19
sql/table.cc
19
sql/table.cc
@ -363,25 +363,24 @@ int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags)
|
|||||||
error= open_binary_frm(thd, share, head, file);
|
error= open_binary_frm(thd, share, head, file);
|
||||||
*root_ptr= old_root;
|
*root_ptr= old_root;
|
||||||
|
|
||||||
if (share->db.length == 5 &&
|
if (share->db.length == 5 && !(lower_case_table_names ?
|
||||||
!my_strcasecmp(system_charset_info, share->db.str, "mysql"))
|
my_strcasecmp(system_charset_info, share->db.str, "mysql") :
|
||||||
|
strcmp(share->db.str, "mysql")))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
We can't mark all tables in 'mysql' database as system since we don't
|
We can't mark all tables in 'mysql' database as system since we don't
|
||||||
allow to lock such tables for writing with any other tables (even with
|
allow to lock such tables for writing with any other tables (even with
|
||||||
other system tables) and some privilege tables need this.
|
other system tables) and some privilege tables need this.
|
||||||
*/
|
*/
|
||||||
if (!my_strcasecmp(system_charset_info, share->table_name.str, "proc"))
|
if (!(lower_case_table_names ?
|
||||||
|
my_strcasecmp(system_charset_info, share->table_name.str, "proc") :
|
||||||
|
strcmp(share->table_name.str, "proc")))
|
||||||
share->system_table= 1;
|
share->system_table= 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!my_strcasecmp(system_charset_info, share->table_name.str,
|
share->log_table= check_if_log_table(share->db.length, share->db.str,
|
||||||
"general_log"))
|
share->table_name.length,
|
||||||
share->log_table= QUERY_LOG_GENERAL;
|
share->table_name.str, 0);
|
||||||
else
|
|
||||||
if (!my_strcasecmp(system_charset_info, share->table_name.str,
|
|
||||||
"slow_log"))
|
|
||||||
share->log_table= QUERY_LOG_SLOW;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
error_given= 1;
|
error_given= 1;
|
||||||
|
@ -826,9 +826,9 @@ void ha_tina::update_status()
|
|||||||
bool ha_tina::check_if_locking_is_allowed(uint sql_command,
|
bool ha_tina::check_if_locking_is_allowed(uint sql_command,
|
||||||
ulong type, TABLE *table,
|
ulong type, TABLE *table,
|
||||||
uint count,
|
uint count,
|
||||||
bool called_by_logger_thread)
|
bool called_by_privileged_thread)
|
||||||
{
|
{
|
||||||
if (!called_by_logger_thread)
|
if (!called_by_privileged_thread)
|
||||||
return check_if_log_table_locking_is_allowed(sql_command, type, table);
|
return check_if_log_table_locking_is_allowed(sql_command, type, table);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -265,7 +265,7 @@ err:
|
|||||||
bool ha_myisam::check_if_locking_is_allowed(uint sql_command,
|
bool ha_myisam::check_if_locking_is_allowed(uint sql_command,
|
||||||
ulong type, TABLE *table,
|
ulong type, TABLE *table,
|
||||||
uint count,
|
uint count,
|
||||||
bool called_by_logger_thread)
|
bool called_by_privileged_thread)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
To be able to open and lock for reading system tables like 'mysql.proc',
|
To be able to open and lock for reading system tables like 'mysql.proc',
|
||||||
@ -283,10 +283,10 @@ bool ha_myisam::check_if_locking_is_allowed(uint sql_command,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Deny locking of the log tables, which is incompatible with
|
Deny locking of the log tables, which is incompatible with
|
||||||
concurrent insert. Unless called from a logger THD:
|
concurrent insert. Unless called from a logger THD (general_log_thd
|
||||||
general_log_thd or slow_log_thd.
|
or slow_log_thd) or by a privileged thread.
|
||||||
*/
|
*/
|
||||||
if (!called_by_logger_thread)
|
if (!called_by_privileged_thread)
|
||||||
return check_if_log_table_locking_is_allowed(sql_command, type, table);
|
return check_if_log_table_locking_is_allowed(sql_command, type, table);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -57,7 +57,7 @@ if(@ARGV < 3 || $ARGV[0] eq '--usage' || $ARGV[0] eq '--help')
|
|||||||
$template->param(dsn => $dsn);
|
$template->param(dsn => $dsn);
|
||||||
}
|
}
|
||||||
|
|
||||||
my @releases = ({rel=>'4.1'},{rel=>'5.0'},{rel=>'5.1'});
|
my @releases = ({rel=>'4.1'},{rel=>'5.0'},{rel=>'5.1'}); #,{rel=>'5.1-dd'});
|
||||||
$template->param(releases => \@releases);
|
$template->param(releases => \@releases);
|
||||||
|
|
||||||
my $tables = $dbh->selectall_arrayref("show tables");
|
my $tables = $dbh->selectall_arrayref("show tables");
|
||||||
@ -81,25 +81,29 @@ sub align {
|
|||||||
return @aligned;
|
return @aligned;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(@{$tables})
|
sub do_table {
|
||||||
{
|
my $table= shift;
|
||||||
my $table= @{$_}[0];
|
my $info= shift;
|
||||||
my @columns;
|
my %indexes= %{$_[0]};
|
||||||
my $info= $dbh->selectall_hashref('describe `'.$table.'`',"Field");
|
my @count= @{$_[1]};
|
||||||
my @count = $dbh->selectrow_array('select count(*) from `'.$table.'`');
|
|
||||||
my %columnsize; # used for index calculations
|
|
||||||
|
|
||||||
|
my @columns;
|
||||||
|
my %columnsize; # used for index calculations
|
||||||
# We now work out the DataMemory usage
|
# We now work out the DataMemory usage
|
||||||
|
|
||||||
# sizes for 4.1, 5.0, 5.1
|
# sizes for 4.1, 5.0, 5.1 and 5.1-dd
|
||||||
my @totalsize= (0,0,0);
|
my @totalsize= (0,0,0,0);
|
||||||
|
@totalsize= @totalsize[0..$#releases]; # limit to releases we're outputting
|
||||||
|
my $nrvarsize= 0;
|
||||||
|
|
||||||
foreach(keys %$info)
|
foreach(keys %$info)
|
||||||
{
|
{
|
||||||
my @realsize = (0,0,0);
|
my @realsize = (0,0,0,0);
|
||||||
|
my @varsize = (0,0,0,0);
|
||||||
my $type;
|
my $type;
|
||||||
my $size;
|
my $size;
|
||||||
my $name= $_;
|
my $name= $_;
|
||||||
|
my $is_varsize= 0;
|
||||||
|
|
||||||
if($$info{$_}{Type} =~ /^(.*?)\((\d+)\)/)
|
if($$info{$_}{Type} =~ /^(.*?)\((\d+)\)/)
|
||||||
{
|
{
|
||||||
@ -112,54 +116,86 @@ foreach(@{$tables})
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($type =~ /tinyint/)
|
if($type =~ /tinyint/)
|
||||||
{@realsize=(1,1,1)}
|
{@realsize=(1,1,1,1)}
|
||||||
elsif($type =~ /smallint/)
|
elsif($type =~ /smallint/)
|
||||||
{@realsize=(2,2,2)}
|
{@realsize=(2,2,2,2)}
|
||||||
elsif($type =~ /mediumint/)
|
elsif($type =~ /mediumint/)
|
||||||
{@realsize=(3,3,3)}
|
{@realsize=(3,3,3,3)}
|
||||||
elsif($type =~ /bigint/)
|
elsif($type =~ /bigint/)
|
||||||
{@realsize=(8,8,8)}
|
{@realsize=(8,8,8,8)}
|
||||||
elsif($type =~ /int/)
|
elsif($type =~ /int/)
|
||||||
{@realsize=(4,4,4)}
|
{@realsize=(4,4,4,4)}
|
||||||
elsif($type =~ /float/)
|
elsif($type =~ /float/)
|
||||||
{
|
{
|
||||||
if($size<=24)
|
if($size<=24)
|
||||||
{@realsize=(4,4,4)}
|
{@realsize=(4,4,4,4)}
|
||||||
else
|
else
|
||||||
{@realsize=(8,8,8)}
|
{@realsize=(8,8,8,8)}
|
||||||
}
|
}
|
||||||
elsif($type =~ /double/ || $type =~ /real/)
|
elsif($type =~ /double/ || $type =~ /real/)
|
||||||
{@realsize=(8,8,8)}
|
{@realsize=(8,8,8,8)}
|
||||||
elsif($type =~ /bit/)
|
elsif($type =~ /bit/)
|
||||||
{
|
{
|
||||||
my $a=($size+7)/8;
|
my $a=($size+7)/8;
|
||||||
@realsize = ($a,$a,$a);
|
@realsize = ($a,$a,$a,$a);
|
||||||
}
|
}
|
||||||
elsif($type =~ /datetime/)
|
elsif($type =~ /datetime/)
|
||||||
{@realsize=(8,8,8)}
|
{@realsize=(8,8,8,8)}
|
||||||
elsif($type =~ /timestamp/)
|
elsif($type =~ /timestamp/)
|
||||||
{@realsize=(4,4,4)}
|
{@realsize=(4,4,4,4)}
|
||||||
elsif($type =~ /date/ || $type =~ /time/)
|
elsif($type =~ /date/ || $type =~ /time/)
|
||||||
{@realsize=(3,3,3)}
|
{@realsize=(3,3,3,3)}
|
||||||
elsif($type =~ /year/)
|
elsif($type =~ /year/)
|
||||||
{@realsize=(1,1,1)}
|
{@realsize=(1,1,1,1)}
|
||||||
elsif($type =~ /varchar/ || $type =~ /varbinary/)
|
elsif($type =~ /varchar/ || $type =~ /varbinary/)
|
||||||
{
|
{
|
||||||
my $fixed= 1+$size;
|
my $fixed=$size+ceil($size/256);
|
||||||
my @dynamic=$dbh->selectrow_array("select avg(length(`"
|
my @dynamic=$dbh->selectrow_array("select avg(length(`"
|
||||||
.$name
|
.$name
|
||||||
."`)) from `".$table.'`');
|
."`)) from `".$table.'`');
|
||||||
$dynamic[0]=0 if !$dynamic[0];
|
$dynamic[0]=0 if !$dynamic[0];
|
||||||
@realsize= ($fixed,$fixed,ceil($dynamic[0]));
|
$dynamic[0]+=ceil($dynamic[0]/256); # size bit
|
||||||
|
$nrvarsize++;
|
||||||
|
$is_varsize= 1;
|
||||||
|
$varsize[3]= ceil($dynamic[0]);
|
||||||
|
@realsize= ($fixed,$fixed,ceil($dynamic[0]),$fixed);
|
||||||
}
|
}
|
||||||
elsif($type =~ /binary/ || $type =~ /char/)
|
elsif($type =~ /binary/ || $type =~ /char/)
|
||||||
{@realsize=($size,$size,$size)}
|
{@realsize=($size,$size,$size,$size)}
|
||||||
elsif($type =~ /text/ || $type =~ /blob/)
|
elsif($type =~ /text/ || $type =~ /blob/)
|
||||||
{
|
{
|
||||||
@realsize=(256,256,1);
|
@realsize=(8+256,8+256,8+256,8+256);
|
||||||
$NoOfTables[$_]{val} += 1 foreach 0..$#releases; # blob uses table
|
|
||||||
} # FIXME check if 5.1 is correct
|
|
||||||
|
|
||||||
|
my $blobhunk= 2000;
|
||||||
|
$blobhunk= 8000 if $type=~ /longblob/;
|
||||||
|
$blobhunk= 4000 if $type=~ /mediumblob/;
|
||||||
|
|
||||||
|
my @blobsize=$dbh->selectrow_array("select SUM(CEILING(".
|
||||||
|
"length(`$name`)/$blobhunk))".
|
||||||
|
"from `".$table."`");
|
||||||
|
$blobsize[0]=0 if !defined($blobsize[0]);
|
||||||
|
#$NoOfTables[$_]{val} += 1 foreach 0..$#releases; # blob uses table
|
||||||
|
do_table($table."\$BLOB_$name",
|
||||||
|
{'PK'=>{Type=>'int'},
|
||||||
|
'DIST'=>{Type=>'int'},
|
||||||
|
'PART'=>{Type=>'int'},
|
||||||
|
'DATA'=>{Type=>"binary($blobhunk)"}
|
||||||
|
},
|
||||||
|
{'PRIMARY' => {
|
||||||
|
'unique' => 1,
|
||||||
|
'comment' => '',
|
||||||
|
'columns' => [
|
||||||
|
'PK',
|
||||||
|
'DIST',
|
||||||
|
'PART',
|
||||||
|
],
|
||||||
|
'type' => 'HASH'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
\@blobsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
@realsize= @realsize[0..$#releases];
|
||||||
@realsize= align(4,@realsize);
|
@realsize= align(4,@realsize);
|
||||||
|
|
||||||
$totalsize[$_]+=$realsize[$_] foreach 0..$#totalsize;
|
$totalsize[$_]+=$realsize[$_] foreach 0..$#totalsize;
|
||||||
@ -170,6 +206,7 @@ foreach(@{$tables})
|
|||||||
push @columns, {
|
push @columns, {
|
||||||
name=>$name,
|
name=>$name,
|
||||||
type=>$type,
|
type=>$type,
|
||||||
|
is_varsize=>$is_varsize,
|
||||||
size=>$size,
|
size=>$size,
|
||||||
key=>$$info{$_}{Key},
|
key=>$$info{$_}{Key},
|
||||||
datamemory=>\@realout,
|
datamemory=>\@realout,
|
||||||
@ -183,24 +220,10 @@ foreach(@{$tables})
|
|||||||
# Firstly, we assemble some information about the indexes.
|
# Firstly, we assemble some information about the indexes.
|
||||||
# We use SHOW INDEX instead of using INFORMATION_SCHEMA so
|
# We use SHOW INDEX instead of using INFORMATION_SCHEMA so
|
||||||
# we can still connect to pre-5.0 mysqlds.
|
# we can still connect to pre-5.0 mysqlds.
|
||||||
my %indexes;
|
|
||||||
{
|
|
||||||
my $sth= $dbh->prepare("show index from `".$table.'`');
|
|
||||||
$sth->execute;
|
|
||||||
while(my $i = $sth->fetchrow_hashref)
|
|
||||||
{
|
|
||||||
$indexes{${%$i}{Key_name}}= {
|
|
||||||
type=>${%$i}{Index_type},
|
|
||||||
unique=>!${%$i}{Non_unique},
|
|
||||||
comment=>${%$i}{Comment},
|
|
||||||
} if !defined($indexes{${%$i}{Key_name}});
|
|
||||||
|
|
||||||
$indexes{${%$i}{Key_name}}{columns}[${%$i}{Seq_in_index}-1]=
|
|
||||||
${%$i}{Column_name};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!defined($indexes{PRIMARY})) {
|
if(!defined($indexes{PRIMARY})) {
|
||||||
|
my @usage= ({val=>8},{val=>8},{val=>8},{val=>8});
|
||||||
|
@usage= @usage[0..$#releases];
|
||||||
$indexes{PRIMARY}= {
|
$indexes{PRIMARY}= {
|
||||||
type=>'BTREE',
|
type=>'BTREE',
|
||||||
unique=>1,
|
unique=>1,
|
||||||
@ -212,20 +235,22 @@ foreach(@{$tables})
|
|||||||
type=>'bigint',
|
type=>'bigint',
|
||||||
size=>8,
|
size=>8,
|
||||||
key=>'PRI',
|
key=>'PRI',
|
||||||
datamemory=>[{val=>8},{val=>8},{val=>8}],
|
datamemory=>\@usage,
|
||||||
};
|
};
|
||||||
$columnsize{'HIDDEN_NDB_PKEY'}= [8,8,8];
|
$columnsize{'HIDDEN_NDB_PKEY'}= [8,8,8];
|
||||||
}
|
}
|
||||||
|
|
||||||
my @IndexDataMemory= ({val=>0},{val=>0},{val=>0});
|
my @IndexDataMemory= ({val=>0},{val=>0},{val=>0},{val=>0});
|
||||||
my @RowIndexMemory= ({val=>0},{val=>0},{val=>0});
|
my @RowIndexMemory= ({val=>0},{val=>0},{val=>0},{val=>0});
|
||||||
|
@IndexDataMemory= @IndexDataMemory[0..$#releases];
|
||||||
|
@RowIndexMemory= @RowIndexMemory[0..$#releases];
|
||||||
|
|
||||||
my @indexes;
|
my @indexes;
|
||||||
foreach my $index (keys %indexes) {
|
foreach my $index (keys %indexes) {
|
||||||
my $im41= 25;
|
my $im41= 25;
|
||||||
$im41+=$columnsize{$_}[0] foreach @{$indexes{$index}{columns}};
|
$im41+=$columnsize{$_}[0] foreach @{$indexes{$index}{columns}};
|
||||||
my @im = ({val=>$im41},{val=>25},{val=>25});
|
my @im = ({val=>$im41},{val=>25},{val=>25}); #,{val=>25});
|
||||||
my @dm = ({val=>10},{val=>10},{val=>10});
|
my @dm = ({val=>10},{val=>10},{val=>10}); #,{val=>10});
|
||||||
push @indexes, {
|
push @indexes, {
|
||||||
name=>$index,
|
name=>$index,
|
||||||
type=>$indexes{$index}{type},
|
type=>$indexes{$index}{type},
|
||||||
@ -233,13 +258,22 @@ foreach(@{$tables})
|
|||||||
indexmemory=>\@im,
|
indexmemory=>\@im,
|
||||||
datamemory=>\@dm,
|
datamemory=>\@dm,
|
||||||
};
|
};
|
||||||
$IndexDataMemory[$_]{val}+=$dm[$_]{val} foreach 0..2;
|
$IndexDataMemory[$_]{val}+=$dm[$_]{val} foreach 0..$#releases;
|
||||||
$RowIndexMemory[$_]{val}+=$im[$_]{val} foreach 0..2;
|
$RowIndexMemory[$_]{val}+=$im[$_]{val} foreach 0..$#releases;
|
||||||
}
|
}
|
||||||
|
|
||||||
# total size + 16 bytes overhead
|
# total size + 16 bytes overhead
|
||||||
my @TotalDataMemory;
|
my @TotalDataMemory;
|
||||||
$TotalDataMemory[$_]{val}=$IndexDataMemory[$_]{val}+$totalsize[$_]+16 foreach 0..2;
|
my @RowOverhead = ({val=>16},{val=>16},{val=>16}); #,{val=>24});
|
||||||
|
# 5.1 has ptr to varsize page, and per-varsize overhead
|
||||||
|
my @nrvarsize_mem= ({val=>0},{val=>0},
|
||||||
|
{val=>8}); #,{val=>0});
|
||||||
|
{
|
||||||
|
my @a= align(4,$nrvarsize*2);
|
||||||
|
$nrvarsize_mem[2]{val}+=$a[0]+$nrvarsize*4;
|
||||||
|
}
|
||||||
|
|
||||||
|
$TotalDataMemory[$_]{val}=$IndexDataMemory[$_]{val}+$totalsize[$_]+$RowOverhead[$_]{val}+$nrvarsize_mem[$_]{val} foreach 0..$#releases;
|
||||||
|
|
||||||
my @RowDataMemory;
|
my @RowDataMemory;
|
||||||
push @RowDataMemory,{val=>$_} foreach @totalsize;
|
push @RowDataMemory,{val=>$_} foreach @totalsize;
|
||||||
@ -260,12 +294,18 @@ foreach(@{$tables})
|
|||||||
my @counts;
|
my @counts;
|
||||||
$counts[$_]{val}= $count foreach 0..$#releases;
|
$counts[$_]{val}= $count foreach 0..$#releases;
|
||||||
|
|
||||||
|
my @nrvarsize_rel= ({val=>0},{val=>0},
|
||||||
|
{val=>$nrvarsize}); #,{val=>0});
|
||||||
|
|
||||||
push @table_size, {
|
push @table_size, {
|
||||||
table=>$table,
|
table=>$table,
|
||||||
indexes=>\@indexes,
|
indexes=>\@indexes,
|
||||||
columns=>\@columns,
|
columns=>\@columns,
|
||||||
count=>\@counts,
|
count=>\@counts,
|
||||||
|
RowOverhead=>\@RowOverhead,
|
||||||
RowDataMemory=>\@RowDataMemory,
|
RowDataMemory=>\@RowDataMemory,
|
||||||
|
nrvarsize=>\@nrvarsize_rel,
|
||||||
|
nrvarsize_mem=>\@nrvarsize_mem,
|
||||||
releases=>\@releases,
|
releases=>\@releases,
|
||||||
IndexDataMemory=>\@IndexDataMemory,
|
IndexDataMemory=>\@IndexDataMemory,
|
||||||
TotalDataMemory=>\@TotalDataMemory,
|
TotalDataMemory=>\@TotalDataMemory,
|
||||||
@ -283,6 +323,31 @@ foreach(@{$tables})
|
|||||||
$NoOfIndexes[$_]{val} += @indexes foreach 0..$#releases;
|
$NoOfIndexes[$_]{val} += @indexes foreach 0..$#releases;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach(@{$tables})
|
||||||
|
{
|
||||||
|
my $table= @{$_}[0];
|
||||||
|
my $info= $dbh->selectall_hashref('describe `'.$table.'`',"Field");
|
||||||
|
my @count = $dbh->selectrow_array('select count(*) from `'.$table.'`');
|
||||||
|
|
||||||
|
my %indexes;
|
||||||
|
{
|
||||||
|
my $sth= $dbh->prepare("show index from `".$table.'`');
|
||||||
|
$sth->execute;
|
||||||
|
while(my $i = $sth->fetchrow_hashref)
|
||||||
|
{
|
||||||
|
$indexes{${%$i}{Key_name}}= {
|
||||||
|
type=>${%$i}{Index_type},
|
||||||
|
unique=>!${%$i}{Non_unique},
|
||||||
|
comment=>${%$i}{Comment},
|
||||||
|
} if !defined($indexes{${%$i}{Key_name}});
|
||||||
|
|
||||||
|
$indexes{${%$i}{Key_name}}{columns}[${%$i}{Seq_in_index}-1]=
|
||||||
|
${%$i}{Column_name};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do_table($table, $info, \%indexes, \@count);
|
||||||
|
}
|
||||||
|
|
||||||
my @NoOfTriggers;
|
my @NoOfTriggers;
|
||||||
# for unique hash indexes
|
# for unique hash indexes
|
||||||
$NoOfTriggers[$_]{val} += $NoOfIndexes[$_]{val}*3 foreach 0..$#releases;
|
$NoOfTriggers[$_]{val} += $NoOfIndexes[$_]{val}*3 foreach 0..$#releases;
|
||||||
|
@ -15,6 +15,8 @@ td,th { border: 1px solid black }
|
|||||||
|
|
||||||
<p>This information should be valid for MySQL 4.1 and 5.0. Since 5.1 is not a final release yet, the numbers should be used as a guide only.</p>
|
<p>This information should be valid for MySQL 4.1 and 5.0. Since 5.1 is not a final release yet, the numbers should be used as a guide only.</p>
|
||||||
|
|
||||||
|
<p>5.1-dd is for tables stored on disk. The ndb_size.pl estimates are <b>experimental</b> and should not be trusted. Notably we don't take into account indexed columns being in DataMemory versus non-indexed on disk.</p>
|
||||||
|
|
||||||
<h2>Parameter Settings</h2>
|
<h2>Parameter Settings</h2>
|
||||||
<p><b>NOTE</b> the configuration parameters below do not take into account system tables and other requirements.</p>
|
<p><b>NOTE</b> the configuration parameters below do not take into account system tables and other requirements.</p>
|
||||||
<table>
|
<table>
|
||||||
@ -69,6 +71,7 @@ td,th { border: 1px solid black }
|
|||||||
<tr>
|
<tr>
|
||||||
<th>Column</th>
|
<th>Column</th>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
|
<th>VARSIZE</th>
|
||||||
<th>Size</th>
|
<th>Size</th>
|
||||||
<th>Key</th>
|
<th>Key</th>
|
||||||
<TMPL_LOOP NAME=releases>
|
<TMPL_LOOP NAME=releases>
|
||||||
@ -79,6 +82,7 @@ td,th { border: 1px solid black }
|
|||||||
<tr>
|
<tr>
|
||||||
<td><TMPL_VAR NAME=name></td>
|
<td><TMPL_VAR NAME=name></td>
|
||||||
<td><TMPL_VAR NAME=type></td>
|
<td><TMPL_VAR NAME=type></td>
|
||||||
|
<td><TMPL_IF NAME=is_varsize>YES<TMPL_ELSE> </TMPL_IF></td>
|
||||||
<td><TMPL_VAR NAME=size></td>
|
<td><TMPL_VAR NAME=size></td>
|
||||||
<td><TMPL_VAR NAME=key></td>
|
<td><TMPL_VAR NAME=key></td>
|
||||||
<TMPL_LOOP NAME=datamemory>
|
<TMPL_LOOP NAME=datamemory>
|
||||||
@ -128,10 +132,22 @@ td,th { border: 1px solid black }
|
|||||||
<th><TMPL_VAR NAME=rel></th>
|
<th><TMPL_VAR NAME=rel></th>
|
||||||
</TMPL_LOOP>
|
</TMPL_LOOP>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Nr Varsized Attributes</th>
|
||||||
|
<TMPL_LOOP NAME=nrvarsize>
|
||||||
|
<td><TMPL_VAR NAME=val></td>
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Row Overhead</th>
|
<th>Row Overhead</th>
|
||||||
<TMPL_LOOP NAME=releases>
|
<TMPL_LOOP NAME=RowOverhead>
|
||||||
<td>16</td>
|
<td><TMPL_VAR NAME=val></td>
|
||||||
|
</TMPL_LOOP>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Varsized Overhead</th>
|
||||||
|
<TMPL_LOOP NAME=nrvarsize_mem>
|
||||||
|
<td><TMPL_VAR NAME=val></td>
|
||||||
</TMPL_LOOP>
|
</TMPL_LOOP>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -8685,7 +8685,7 @@ static void test_sqlmode()
|
|||||||
if (!opt_silent)
|
if (!opt_silent)
|
||||||
fprintf(stdout, "\n query: %s", query);
|
fprintf(stdout, "\n query: %s", query);
|
||||||
stmt= mysql_simple_prepare(mysql, query);
|
stmt= mysql_simple_prepare(mysql, query);
|
||||||
check_stmt_r(stmt);
|
check_stmt(stmt);
|
||||||
|
|
||||||
/* ANSI */
|
/* ANSI */
|
||||||
strmov(query, "SET SQL_MODE= \"ANSI\"");
|
strmov(query, "SET SQL_MODE= \"ANSI\"");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user