Commit 4706f81c authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

merge

parents 7dea61b0 0f6a98c5
/* Copyright (C) 2008-2009 Sun Microsystems, Inc /* Copyright (C) 2008-2010 Sun Microsystems, Inc
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -614,6 +614,9 @@ typedef void (*set_thread_v1_t)(struct PSI_thread *thread); ...@@ -614,6 +614,9 @@ typedef void (*set_thread_v1_t)(struct PSI_thread *thread);
/** Delete the current thread instrumentation. */ /** Delete the current thread instrumentation. */
typedef void (*delete_current_thread_v1_t)(void); typedef void (*delete_current_thread_v1_t)(void);
/** Delete a thread instrumentation. */
typedef void (*delete_thread_v1_t)(struct PSI_thread *thread);
/** /**
Get a mutex instrumentation locker. Get a mutex instrumentation locker.
@param mutex the instrumented mutex to lock @param mutex the instrumented mutex to lock
...@@ -890,6 +893,8 @@ struct PSI_v1 ...@@ -890,6 +893,8 @@ struct PSI_v1
set_thread_v1_t set_thread; set_thread_v1_t set_thread;
/** @sa delete_current_thread_v1_t. */ /** @sa delete_current_thread_v1_t. */
delete_current_thread_v1_t delete_current_thread; delete_current_thread_v1_t delete_current_thread;
/** @sa delete_thread_v1_t. */
delete_thread_v1_t delete_thread;
/** @sa get_thread_mutex_locker_v1_t. */ /** @sa get_thread_mutex_locker_v1_t. */
get_thread_mutex_locker_v1_t get_thread_mutex_locker; get_thread_mutex_locker_v1_t get_thread_mutex_locker;
/** @sa get_thread_rwlock_locker_v1_t. */ /** @sa get_thread_rwlock_locker_v1_t. */
......
...@@ -127,6 +127,7 @@ typedef void (*set_thread_id_v1_t)(struct PSI_thread *thread, ...@@ -127,6 +127,7 @@ typedef void (*set_thread_id_v1_t)(struct PSI_thread *thread,
typedef struct PSI_thread* (*get_thread_v1_t)(void); typedef struct PSI_thread* (*get_thread_v1_t)(void);
typedef void (*set_thread_v1_t)(struct PSI_thread *thread); typedef void (*set_thread_v1_t)(struct PSI_thread *thread);
typedef void (*delete_current_thread_v1_t)(void); typedef void (*delete_current_thread_v1_t)(void);
typedef void (*delete_thread_v1_t)(struct PSI_thread *thread);
typedef struct PSI_mutex_locker* (*get_thread_mutex_locker_v1_t) typedef struct PSI_mutex_locker* (*get_thread_mutex_locker_v1_t)
(struct PSI_mutex *mutex, enum PSI_mutex_operation op); (struct PSI_mutex *mutex, enum PSI_mutex_operation op);
typedef struct PSI_rwlock_locker* (*get_thread_rwlock_locker_v1_t) typedef struct PSI_rwlock_locker* (*get_thread_rwlock_locker_v1_t)
...@@ -204,6 +205,7 @@ struct PSI_v1 ...@@ -204,6 +205,7 @@ struct PSI_v1
get_thread_v1_t get_thread; get_thread_v1_t get_thread;
set_thread_v1_t set_thread; set_thread_v1_t set_thread;
delete_current_thread_v1_t delete_current_thread; delete_current_thread_v1_t delete_current_thread;
delete_thread_v1_t delete_thread;
get_thread_mutex_locker_v1_t get_thread_mutex_locker; get_thread_mutex_locker_v1_t get_thread_mutex_locker;
get_thread_rwlock_locker_v1_t get_thread_rwlock_locker; get_thread_rwlock_locker_v1_t get_thread_rwlock_locker;
get_thread_cond_locker_v1_t get_thread_cond_locker; get_thread_cond_locker_v1_t get_thread_cond_locker;
......
...@@ -16,9 +16,6 @@ main.plugin # Bug#47146 Linking problem with exampl ...@@ -16,9 +16,6 @@ main.plugin # Bug#47146 Linking problem with exampl
main.signal_demo3 @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun main.signal_demo3 @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun
main.sp @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun main.sp @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun
perfschema.tampered_perfschema_table1 @windows # Bug#50478 2010-01-20 alik perfschema.tampered_perfschema_table1 fails sporadically on Windows and Solaris
perfschema.tampered_perfschema_table1 @solaris # Bug#50478 2010-01-20 alik perfschema.tampered_perfschema_table1 fails sporadically on Windows and Solaris
rpl.rpl_heartbeat_basic # BUG#43828 2009-10-22 luis fails sporadically rpl.rpl_heartbeat_basic # BUG#43828 2009-10-22 luis fails sporadically
rpl.rpl_heartbeat_2slaves # BUG#43828 2009-10-22 luis fails sporadically rpl.rpl_heartbeat_2slaves # BUG#43828 2009-10-22 luis fails sporadically
rpl.rpl_innodb_bug28430* # Bug#46029 rpl.rpl_innodb_bug28430* # Bug#46029
......
...@@ -3,7 +3,7 @@ create table t1 (a int check (a>0)); ...@@ -3,7 +3,7 @@ create table t1 (a int check (a>0));
insert into t1 values (1); insert into t1 values (1);
insert into t1 values (0); insert into t1 values (0);
drop table t1; drop table t1;
create table t1 (a int ,b int, check a>b); create table t1 (a int, b int, check (a>b));
insert into t1 values (1,0); insert into t1 values (1,0);
insert into t1 values (0,1); insert into t1 values (0,1);
drop table t1; drop table t1;
...@@ -27,3 +27,19 @@ t1 CREATE TABLE `t1` ( ...@@ -27,3 +27,19 @@ t1 CREATE TABLE `t1` (
UNIQUE KEY `key_2` (`a`) UNIQUE KEY `key_2` (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
drop table if exists t_illegal;
create table t_illegal (a int, b int, check a>b);
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 'a>b)' at line 1
create table t_illegal (a int, b int, constraint abc check a>b);
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 'a>b)' at line 1
create table t_illegal (a int, b int, constraint abc);
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 ')' at line 1
drop table if exists t_11714;
create table t_11714(a int, b int);
alter table t_11714 add constraint cons1;
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 '' at line 1
drop table t_11714;
CREATE TABLE t_illegal (col_1 INT CHECK something (whatever));
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 'something (whatever))' at line 1
CREATE TABLE t_illegal (col_1 INT CHECK something);
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 'something)' at line 1
...@@ -13,3 +13,45 @@ foreign key (a,b) references t3 (c,d) on update set null); ...@@ -13,3 +13,45 @@ foreign key (a,b) references t3 (c,d) on update set null);
create index a on t1 (a); create index a on t1 (a);
create unique index b on t1 (a,b); create unique index b on t1 (a,b);
drop table t1; drop table t1;
drop table if exists t_34455;
create table t_34455 (
a int not null,
foreign key (a) references t3 (a) match full match partial);
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 'match partial)' at line 3
create table t_34455 (
a int not null,
foreign key (a) references t3 (a) on delete set default match full);
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 'match full)' at line 3
create table t_34455 (
a int not null,
foreign key (a) references t3 (a) on update set default match full);
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 'match full)' at line 3
create table t_34455 (
a int not null,
foreign key (a) references t3 (a)
on delete set default on delete set default);
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 'delete set default)' at line 4
create table t_34455 (
a int not null,
foreign key (a) references t3 (a)
on update set default on update set default);
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 'update set default)' at line 4
create table t_34455 (a int not null);
alter table t_34455
add foreign key (a) references t3 (a) match full match partial);
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 'match partial)' at line 2
alter table t_34455
add foreign key (a) references t3 (a) on delete set default match full);
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 'match full)' at line 2
alter table t_34455
add foreign key (a) references t3 (a) on update set default match full);
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 'match full)' at line 2
alter table t_34455
add foreign key (a) references t3 (a)
on delete set default on delete set default);
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 'delete set default)' at line 3
alter table t_34455
add foreign key (a) references t3 (a)
on update set default on update set default);
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 'update set default)' at line 3
drop table t_34455;
...@@ -16,6 +16,7 @@ b CHAR(100) DEFAULT 'initial value') ...@@ -16,6 +16,7 @@ b CHAR(100) DEFAULT 'initial value')
ENGINE=MyISAM; ENGINE=MyISAM;
insert into t1 (id) values (1), (2), (3), (4), (5), (6), (7), (8); insert into t1 (id) values (1), (2), (3), (4), (5), (6), (7), (8);
update performance_schema.SETUP_INSTRUMENTS SET enabled = 'NO'; update performance_schema.SETUP_INSTRUMENTS SET enabled = 'NO';
update performance_schema.SETUP_CONSUMERS set enabled = 'NO';
set @dump_all=FALSE; set @dump_all=FALSE;
"Verifying file aggregate consistency" "Verifying file aggregate consistency"
SELECT EVENT_NAME, e.COUNT_READ, SUM(i.COUNT_READ) SELECT EVENT_NAME, e.COUNT_READ, SUM(i.COUNT_READ)
...@@ -51,14 +52,14 @@ SELECT EVENT_NAME, e.SUM_TIMER_WAIT, SUM(i.SUM_TIMER_WAIT) ...@@ -51,14 +52,14 @@ SELECT EVENT_NAME, e.SUM_TIMER_WAIT, SUM(i.SUM_TIMER_WAIT)
FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME) JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.SUM_TIMER_WAIT <> SUM(i.SUM_TIMER_WAIT)) HAVING (e.SUM_TIMER_WAIT < SUM(i.SUM_TIMER_WAIT))
OR @dump_all; OR @dump_all;
EVENT_NAME SUM_TIMER_WAIT SUM(i.SUM_TIMER_WAIT) EVENT_NAME SUM_TIMER_WAIT SUM(i.SUM_TIMER_WAIT)
SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(i.MIN_TIMER_WAIT) SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(i.MIN_TIMER_WAIT)
FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME) JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MIN_TIMER_WAIT <> MIN(i.MIN_TIMER_WAIT)) HAVING (e.MIN_TIMER_WAIT > MIN(i.MIN_TIMER_WAIT))
AND (MIN(i.MIN_TIMER_WAIT) != 0) AND (MIN(i.MIN_TIMER_WAIT) != 0)
OR @dump_all; OR @dump_all;
EVENT_NAME MIN_TIMER_WAIT MIN(i.MIN_TIMER_WAIT) EVENT_NAME MIN_TIMER_WAIT MIN(i.MIN_TIMER_WAIT)
...@@ -66,7 +67,7 @@ SELECT EVENT_NAME, e.MAX_TIMER_WAIT, MAX(i.MAX_TIMER_WAIT) ...@@ -66,7 +67,7 @@ SELECT EVENT_NAME, e.MAX_TIMER_WAIT, MAX(i.MAX_TIMER_WAIT)
FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME) JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MAX_TIMER_WAIT <> MAX(i.MAX_TIMER_WAIT)) HAVING (e.MAX_TIMER_WAIT < MAX(i.MAX_TIMER_WAIT))
OR @dump_all; OR @dump_all;
EVENT_NAME MAX_TIMER_WAIT MAX(i.MAX_TIMER_WAIT) EVENT_NAME MAX_TIMER_WAIT MAX(i.MAX_TIMER_WAIT)
"Verifying waits aggregate consistency (thread)" "Verifying waits aggregate consistency (thread)"
...@@ -75,7 +76,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e ...@@ -75,7 +76,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t
USING (EVENT_NAME) USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.SUM_TIMER_WAIT <> SUM(t.SUM_TIMER_WAIT)) HAVING (e.SUM_TIMER_WAIT < SUM(t.SUM_TIMER_WAIT))
OR @dump_all; OR @dump_all;
EVENT_NAME SUM_TIMER_WAIT SUM(t.SUM_TIMER_WAIT) EVENT_NAME SUM_TIMER_WAIT SUM(t.SUM_TIMER_WAIT)
SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(t.MIN_TIMER_WAIT) SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(t.MIN_TIMER_WAIT)
...@@ -83,7 +84,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e ...@@ -83,7 +84,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t
USING (EVENT_NAME) USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MIN_TIMER_WAIT <> MIN(t.MIN_TIMER_WAIT)) HAVING (e.MIN_TIMER_WAIT > MIN(t.MIN_TIMER_WAIT))
AND (MIN(t.MIN_TIMER_WAIT) != 0) AND (MIN(t.MIN_TIMER_WAIT) != 0)
OR @dump_all; OR @dump_all;
EVENT_NAME MIN_TIMER_WAIT MIN(t.MIN_TIMER_WAIT) EVENT_NAME MIN_TIMER_WAIT MIN(t.MIN_TIMER_WAIT)
...@@ -92,7 +93,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e ...@@ -92,7 +93,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t
USING (EVENT_NAME) USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MAX_TIMER_WAIT <> MAX(t.MAX_TIMER_WAIT)) HAVING (e.MAX_TIMER_WAIT < MAX(t.MAX_TIMER_WAIT))
OR @dump_all; OR @dump_all;
EVENT_NAME MAX_TIMER_WAIT MAX(t.MAX_TIMER_WAIT) EVENT_NAME MAX_TIMER_WAIT MAX(t.MAX_TIMER_WAIT)
update performance_schema.SETUP_CONSUMERS set enabled = 'YES'; update performance_schema.SETUP_CONSUMERS set enabled = 'YES';
......
select * from performance_schema.MUTEX_INSTANCES limit 1; select * from performance_schema.MUTEX_INSTANCES limit 1;
NAME OBJECT_INSTANCE_BEGIN LOCKED_BY_THREAD_ID NAME OBJECT_INSTANCE_BEGIN LOCKED_BY_THREAD_ID
# # NULL # # #
select * from performance_schema.MUTEX_INSTANCES select * from performance_schema.MUTEX_INSTANCES
where name='FOO'; where name='FOO';
NAME OBJECT_INSTANCE_BEGIN LOCKED_BY_THREAD_ID NAME OBJECT_INSTANCE_BEGIN LOCKED_BY_THREAD_ID
......
select * from performance_schema.RWLOCK_INSTANCES limit 1; select * from performance_schema.RWLOCK_INSTANCES limit 1;
NAME OBJECT_INSTANCE_BEGIN WRITE_LOCKED_BY_THREAD_ID READ_LOCKED_BY_COUNT NAME OBJECT_INSTANCE_BEGIN WRITE_LOCKED_BY_THREAD_ID READ_LOCKED_BY_COUNT
# # NULL 0 # # # #
select * from performance_schema.RWLOCK_INSTANCES select * from performance_schema.RWLOCK_INSTANCES
where name='FOO'; where name='FOO';
NAME OBJECT_INSTANCE_BEGIN WRITE_LOCKED_BY_THREAD_ID READ_LOCKED_BY_COUNT NAME OBJECT_INSTANCE_BEGIN WRITE_LOCKED_BY_THREAD_ID READ_LOCKED_BY_COUNT
......
...@@ -16,7 +16,8 @@ wait/synch/mutex/sql/LOCK_delayed_create YES YES ...@@ -16,7 +16,8 @@ wait/synch/mutex/sql/LOCK_delayed_create YES YES
wait/synch/mutex/sql/LOCK_delayed_insert YES YES wait/synch/mutex/sql/LOCK_delayed_insert YES YES
select * from performance_schema.SETUP_INSTRUMENTS select * from performance_schema.SETUP_INSTRUMENTS
where name like 'Wait/Synch/Rwlock/sql/%' where name like 'Wait/Synch/Rwlock/sql/%'
order by name limit 10; and name not in ('wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock')
order by name limit 10;
NAME ENABLED TIMED NAME ENABLED TIMED
wait/synch/rwlock/sql/LOCK_dboptions YES YES wait/synch/rwlock/sql/LOCK_dboptions YES YES
wait/synch/rwlock/sql/LOCK_grant YES YES wait/synch/rwlock/sql/LOCK_grant YES YES
......
# Copyright (C) 2009 Sun Microsystems, Inc # Copyright (C) 2009-2010 Sun Microsystems, Inc
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
...@@ -50,6 +50,8 @@ insert into t1 (id) values (1), (2), (3), (4), (5), (6), (7), (8); ...@@ -50,6 +50,8 @@ insert into t1 (id) values (1), (2), (3), (4), (5), (6), (7), (8);
# Stop recording data, so the select below don't add noise. # Stop recording data, so the select below don't add noise.
update performance_schema.SETUP_INSTRUMENTS SET enabled = 'NO'; update performance_schema.SETUP_INSTRUMENTS SET enabled = 'NO';
# Disable all consumers, for long standing waits
update performance_schema.SETUP_CONSUMERS set enabled = 'NO';
# Helper to debug # Helper to debug
set @dump_all=FALSE; set @dump_all=FALSE;
...@@ -132,14 +134,14 @@ SELECT EVENT_NAME, e.SUM_TIMER_WAIT, SUM(i.SUM_TIMER_WAIT) ...@@ -132,14 +134,14 @@ SELECT EVENT_NAME, e.SUM_TIMER_WAIT, SUM(i.SUM_TIMER_WAIT)
FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME) JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.SUM_TIMER_WAIT <> SUM(i.SUM_TIMER_WAIT)) HAVING (e.SUM_TIMER_WAIT < SUM(i.SUM_TIMER_WAIT))
OR @dump_all; OR @dump_all;
SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(i.MIN_TIMER_WAIT) SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(i.MIN_TIMER_WAIT)
FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME) JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MIN_TIMER_WAIT <> MIN(i.MIN_TIMER_WAIT)) HAVING (e.MIN_TIMER_WAIT > MIN(i.MIN_TIMER_WAIT))
AND (MIN(i.MIN_TIMER_WAIT) != 0) AND (MIN(i.MIN_TIMER_WAIT) != 0)
OR @dump_all; OR @dump_all;
...@@ -147,7 +149,7 @@ SELECT EVENT_NAME, e.MAX_TIMER_WAIT, MAX(i.MAX_TIMER_WAIT) ...@@ -147,7 +149,7 @@ SELECT EVENT_NAME, e.MAX_TIMER_WAIT, MAX(i.MAX_TIMER_WAIT)
FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME) JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE AS i USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MAX_TIMER_WAIT <> MAX(i.MAX_TIMER_WAIT)) HAVING (e.MAX_TIMER_WAIT < MAX(i.MAX_TIMER_WAIT))
OR @dump_all; OR @dump_all;
--echo "Verifying waits aggregate consistency (thread)" --echo "Verifying waits aggregate consistency (thread)"
...@@ -157,7 +159,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e ...@@ -157,7 +159,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t
USING (EVENT_NAME) USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.SUM_TIMER_WAIT <> SUM(t.SUM_TIMER_WAIT)) HAVING (e.SUM_TIMER_WAIT < SUM(t.SUM_TIMER_WAIT))
OR @dump_all; OR @dump_all;
SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(t.MIN_TIMER_WAIT) SELECT EVENT_NAME, e.MIN_TIMER_WAIT, MIN(t.MIN_TIMER_WAIT)
...@@ -165,7 +167,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e ...@@ -165,7 +167,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t
USING (EVENT_NAME) USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MIN_TIMER_WAIT <> MIN(t.MIN_TIMER_WAIT)) HAVING (e.MIN_TIMER_WAIT > MIN(t.MIN_TIMER_WAIT))
AND (MIN(t.MIN_TIMER_WAIT) != 0) AND (MIN(t.MIN_TIMER_WAIT) != 0)
OR @dump_all; OR @dump_all;
...@@ -174,7 +176,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e ...@@ -174,7 +176,7 @@ FROM performance_schema.EVENTS_WAITS_SUMMARY_BY_EVENT_NAME AS e
JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t JOIN performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME AS t
USING (EVENT_NAME) USING (EVENT_NAME)
GROUP BY EVENT_NAME GROUP BY EVENT_NAME
HAVING (e.MAX_TIMER_WAIT <> MAX(t.MAX_TIMER_WAIT)) HAVING (e.MAX_TIMER_WAIT < MAX(t.MAX_TIMER_WAIT))
OR @dump_all; OR @dump_all;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_perfschema.inc --source include/have_perfschema.inc
--replace_column 1 # 2 # --replace_column 1 # 2 # 3 #
select * from performance_schema.MUTEX_INSTANCES limit 1; select * from performance_schema.MUTEX_INSTANCES limit 1;
select * from performance_schema.MUTEX_INSTANCES select * from performance_schema.MUTEX_INSTANCES
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_perfschema.inc --source include/have_perfschema.inc
--replace_column 1 # 2 # --replace_column 1 # 2 # 3 # 4 #
select * from performance_schema.RWLOCK_INSTANCES limit 1; select * from performance_schema.RWLOCK_INSTANCES limit 1;
select * from performance_schema.RWLOCK_INSTANCES select * from performance_schema.RWLOCK_INSTANCES
......
...@@ -36,8 +36,11 @@ select * from performance_schema.SETUP_INSTRUMENTS ...@@ -36,8 +36,11 @@ select * from performance_schema.SETUP_INSTRUMENTS
and name not in ('wait/synch/mutex/sql/DEBUG_SYNC::mutex') and name not in ('wait/synch/mutex/sql/DEBUG_SYNC::mutex')
order by name limit 10; order by name limit 10;
# CRYPTO_dynlock_value::lock is dependent on the build (SSL)
select * from performance_schema.SETUP_INSTRUMENTS select * from performance_schema.SETUP_INSTRUMENTS
where name like 'Wait/Synch/Rwlock/sql/%' where name like 'Wait/Synch/Rwlock/sql/%'
and name not in ('wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock')
order by name limit 10; order by name limit 10;
# COND_handler_count is dependent on the build (Windows only) # COND_handler_count is dependent on the build (Windows only)
......
...@@ -10,7 +10,7 @@ create table t1 (a int check (a>0)); ...@@ -10,7 +10,7 @@ create table t1 (a int check (a>0));
insert into t1 values (1); insert into t1 values (1);
insert into t1 values (0); insert into t1 values (0);
drop table t1; drop table t1;
create table t1 (a int ,b int, check a>b); create table t1 (a int, b int, check (a>b));
insert into t1 values (1,0); insert into t1 values (1,0);
insert into t1 values (0,1); insert into t1 values (0,1);
drop table t1; drop table t1;
...@@ -29,3 +29,45 @@ show create table t1; ...@@ -29,3 +29,45 @@ show create table t1;
drop table t1; drop table t1;
# End of 4.1 tests # End of 4.1 tests
#
# Bug#35578 (Parser allows useless/illegal CREATE TABLE syntax)
#
--disable_warnings
drop table if exists t_illegal;
--enable_warnings
--error ER_PARSE_ERROR
create table t_illegal (a int, b int, check a>b);
--error ER_PARSE_ERROR
create table t_illegal (a int, b int, constraint abc check a>b);
--error ER_PARSE_ERROR
create table t_illegal (a int, b int, constraint abc);
#
# Bug#11714 (Non-sensical ALTER TABLE ADD CONSTRAINT allowed)
#
--disable_warnings
drop table if exists t_11714;
--enable_warnings
create table t_11714(a int, b int);
--error ER_PARSE_ERROR
alter table t_11714 add constraint cons1;
drop table t_11714;
#
# Bug#38696 (CREATE TABLE ... CHECK ... allows illegal syntax)
--error ER_PARSE_ERROR
CREATE TABLE t_illegal (col_1 INT CHECK something (whatever));
--error ER_PARSE_ERROR
CREATE TABLE t_illegal (col_1 INT CHECK something);
...@@ -23,3 +23,75 @@ create unique index b on t1 (a,b); ...@@ -23,3 +23,75 @@ create unique index b on t1 (a,b);
drop table t1; drop table t1;
# End of 4.1 tests # End of 4.1 tests
#
# Bug#34455 (Ambiguous foreign keys syntax is accepted)
#
--disable_warnings
drop table if exists t_34455;
--enable_warnings
# 2 match clauses, illegal
--error ER_PARSE_ERROR
create table t_34455 (
a int not null,
foreign key (a) references t3 (a) match full match partial);
# match after on delete, illegal
--error ER_PARSE_ERROR
create table t_34455 (
a int not null,
foreign key (a) references t3 (a) on delete set default match full);
# match after on update, illegal
--error ER_PARSE_ERROR
create table t_34455 (
a int not null,
foreign key (a) references t3 (a) on update set default match full);
# 2 on delete clauses, illegal
--error ER_PARSE_ERROR
create table t_34455 (
a int not null,
foreign key (a) references t3 (a)
on delete set default on delete set default);
# 2 on update clauses, illegal
--error ER_PARSE_ERROR
create table t_34455 (
a int not null,
foreign key (a) references t3 (a)
on update set default on update set default);
create table t_34455 (a int not null);
# 2 match clauses, illegal
--error ER_PARSE_ERROR
alter table t_34455
add foreign key (a) references t3 (a) match full match partial);
# match after on delete, illegal
--error ER_PARSE_ERROR
alter table t_34455
add foreign key (a) references t3 (a) on delete set default match full);
# match after on update, illegal
--error ER_PARSE_ERROR
alter table t_34455
add foreign key (a) references t3 (a) on update set default match full);
# 2 on delete clauses, illegal
--error ER_PARSE_ERROR
alter table t_34455
add foreign key (a) references t3 (a)
on delete set default on delete set default);
# 2 on update clauses, illegal
--error ER_PARSE_ERROR
alter table t_34455
add foreign key (a) references t3 (a)
on update set default on update set default);
drop table t_34455;
...@@ -74,6 +74,8 @@ static MYSQL_FILE instrumented_stdin; ...@@ -74,6 +74,8 @@ static MYSQL_FILE instrumented_stdin;
*/ */
my_bool my_basic_init(void) my_bool my_basic_init(void)
{ {
char * str;
if (my_basic_init_done) if (my_basic_init_done)
return 0; return 0;
my_basic_init_done= 1; my_basic_init_done= 1;
...@@ -82,6 +84,19 @@ my_bool my_basic_init(void) ...@@ -82,6 +84,19 @@ my_bool my_basic_init(void)
my_umask= 0660; /* Default umask for new files */ my_umask= 0660; /* Default umask for new files */
my_umask_dir= 0700; /* Default umask for new directories */ my_umask_dir= 0700; /* Default umask for new directories */
#ifndef VMS
/* Default creation of new files */
if ((str= getenv("UMASK")) != 0)
my_umask= (int) (atoi_octal(str) | 0600);
/* Default creation of new dir's */
if ((str= getenv("UMASK_DIR")) != 0)
my_umask_dir= (int) (atoi_octal(str) | 0700);
#endif
/* $HOME is needed early to parse configuration files located in ~/ */
if ((home_dir= getenv("HOME")) != 0)
home_dir= intern_filename(home_dir_buff, home_dir);
init_glob_errs(); init_glob_errs();
instrumented_stdin.m_file= stdin; instrumented_stdin.m_file= stdin;
...@@ -124,7 +139,6 @@ my_bool my_basic_init(void) ...@@ -124,7 +139,6 @@ my_bool my_basic_init(void)
my_bool my_init(void) my_bool my_init(void)
{ {
char * str;
if (my_init_done) if (my_init_done)
return 0; return 0;
my_init_done= 1; my_init_done= 1;
...@@ -142,24 +156,11 @@ my_bool my_init(void) ...@@ -142,24 +156,11 @@ my_bool my_init(void)
{ {
DBUG_ENTER("my_init"); DBUG_ENTER("my_init");
DBUG_PROCESS((char*) (my_progname ? my_progname : "unknown")); DBUG_PROCESS((char*) (my_progname ? my_progname : "unknown"));
if (!home_dir)
{ /* Don't initialize twice */
my_win_init(); my_win_init();
if ((home_dir=getenv("HOME")) != 0)
home_dir=intern_filename(home_dir_buff,home_dir);
#ifndef VMS
/* Default creation of new files */
if ((str=getenv("UMASK")) != 0)
my_umask=(int) (atoi_octal(str) | 0600);
/* Default creation of new dir's */
if ((str=getenv("UMASK_DIR")) != 0)
my_umask_dir=(int) (atoi_octal(str) | 0700);
#endif
#ifdef VMS #ifdef VMS
init_ctype(); /* Stupid linker don't link _ctype.c */ init_ctype(); /* Stupid linker don't link _ctype.c */
#endif #endif
DBUG_PRINT("exit",("home: '%s'",home_dir)); DBUG_PRINT("exit", ("home: '%s'", home_dir));
}
#ifdef __WIN__ #ifdef __WIN__
win32_init_tcp_ip(); win32_init_tcp_ip();
#endif #endif
......
...@@ -317,6 +317,10 @@ static PSI_thread_key key_thread_handle_con_sockets; ...@@ -317,6 +317,10 @@ static PSI_thread_key key_thread_handle_con_sockets;
#ifdef __WIN__ #ifdef __WIN__
static PSI_thread_key key_thread_handle_shutdown; static PSI_thread_key key_thread_handle_shutdown;
#endif /* __WIN__ */ #endif /* __WIN__ */
#if defined (HAVE_OPENSSL) && !defined(HAVE_YASSL)
static PSI_rwlock_key key_rwlock_openssl;
#endif
#endif /* HAVE_PSI_INTERFACE */ #endif /* HAVE_PSI_INTERFACE */
/* the default log output is log tables */ /* the default log output is log tables */
...@@ -1561,7 +1565,7 @@ static void clean_up_mutexes() ...@@ -1561,7 +1565,7 @@ static void clean_up_mutexes()
mysql_mutex_destroy(&LOCK_des_key_file); mysql_mutex_destroy(&LOCK_des_key_file);
#ifndef HAVE_YASSL #ifndef HAVE_YASSL
for (int i= 0; i < CRYPTO_num_locks(); ++i) for (int i= 0; i < CRYPTO_num_locks(); ++i)
rwlock_destroy(&openssl_stdlocks[i].lock); mysql_rwlock_destroy(&openssl_stdlocks[i].lock);
OPENSSL_free(openssl_stdlocks); OPENSSL_free(openssl_stdlocks);
#endif #endif
#endif #endif
...@@ -3753,7 +3757,7 @@ static int init_thread_environment() ...@@ -3753,7 +3757,7 @@ static int init_thread_environment()
openssl_stdlocks= (openssl_lock_t*) OPENSSL_malloc(CRYPTO_num_locks() * openssl_stdlocks= (openssl_lock_t*) OPENSSL_malloc(CRYPTO_num_locks() *
sizeof(openssl_lock_t)); sizeof(openssl_lock_t));
for (int i= 0; i < CRYPTO_num_locks(); ++i) for (int i= 0; i < CRYPTO_num_locks(); ++i)
my_rwlock_init(&openssl_stdlocks[i].lock, NULL); mysql_rwlock_init(key_rwlock_openssl, &openssl_stdlocks[i].lock);
CRYPTO_set_dynlock_create_callback(openssl_dynlock_create); CRYPTO_set_dynlock_create_callback(openssl_dynlock_create);
CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy); CRYPTO_set_dynlock_destroy_callback(openssl_dynlock_destroy);
CRYPTO_set_dynlock_lock_callback(openssl_lock); CRYPTO_set_dynlock_lock_callback(openssl_lock);
...@@ -3807,7 +3811,7 @@ static unsigned long openssl_id_function() ...@@ -3807,7 +3811,7 @@ static unsigned long openssl_id_function()
static openssl_lock_t *openssl_dynlock_create(const char *file, int line) static openssl_lock_t *openssl_dynlock_create(const char *file, int line)
{ {
openssl_lock_t *lock= new openssl_lock_t; openssl_lock_t *lock= new openssl_lock_t;
my_rwlock_init(&lock->lock, NULL); mysql_rwlock_init(key_rwlock_openssl, &lock->lock);
return lock; return lock;
} }
...@@ -3815,7 +3819,7 @@ static openssl_lock_t *openssl_dynlock_create(const char *file, int line) ...@@ -3815,7 +3819,7 @@ static openssl_lock_t *openssl_dynlock_create(const char *file, int line)
static void openssl_dynlock_destroy(openssl_lock_t *lock, const char *file, static void openssl_dynlock_destroy(openssl_lock_t *lock, const char *file,
int line) int line)
{ {
rwlock_destroy(&lock->lock); mysql_rwlock_destroy(&lock->lock);
delete lock; delete lock;
} }
...@@ -3841,16 +3845,16 @@ static void openssl_lock(int mode, openssl_lock_t *lock, const char *file, ...@@ -3841,16 +3845,16 @@ static void openssl_lock(int mode, openssl_lock_t *lock, const char *file,
switch (mode) { switch (mode) {
case CRYPTO_LOCK|CRYPTO_READ: case CRYPTO_LOCK|CRYPTO_READ:
what = "read lock"; what = "read lock";
err = rw_rdlock(&lock->lock); err= mysql_rwlock_rdlock(&lock->lock);
break; break;
case CRYPTO_LOCK|CRYPTO_WRITE: case CRYPTO_LOCK|CRYPTO_WRITE:
what = "write lock"; what = "write lock";
err = rw_wrlock(&lock->lock); err= mysql_rwlock_wrlock(&lock->lock);
break; break;
case CRYPTO_UNLOCK|CRYPTO_READ: case CRYPTO_UNLOCK|CRYPTO_READ:
case CRYPTO_UNLOCK|CRYPTO_WRITE: case CRYPTO_UNLOCK|CRYPTO_WRITE:
what = "unlock"; what = "unlock";
err = rw_unlock(&lock->lock); err= mysql_rwlock_unlock(&lock->lock);
break; break;
default: default:
/* Unknown locking mode. */ /* Unknown locking mode. */
...@@ -7983,6 +7987,9 @@ PSI_rwlock_key key_rwlock_LOCK_grant, key_rwlock_LOCK_logger, ...@@ -7983,6 +7987,9 @@ PSI_rwlock_key key_rwlock_LOCK_grant, key_rwlock_LOCK_logger,
static PSI_rwlock_info all_server_rwlocks[]= static PSI_rwlock_info all_server_rwlocks[]=
{ {
#if defined (HAVE_OPENSSL) && !defined(HAVE_YASSL)
{ &key_rwlock_openssl, "CRYPTO_dynlock_value::lock", 0},
#endif
{ &key_rwlock_LOCK_grant, "LOCK_grant", PSI_FLAG_GLOBAL}, { &key_rwlock_LOCK_grant, "LOCK_grant", PSI_FLAG_GLOBAL},
{ &key_rwlock_LOCK_logger, "LOGGER::LOCK_logger", 0}, { &key_rwlock_LOCK_logger, "LOGGER::LOCK_logger", 0},
{ &key_rwlock_LOCK_sys_init_connect, "LOCK_sys_init_connect", PSI_FLAG_GLOBAL}, { &key_rwlock_LOCK_sys_init_connect, "LOCK_sys_init_connect", PSI_FLAG_GLOBAL},
......
...@@ -1905,7 +1905,9 @@ struct LEX: public Query_tables_list ...@@ -1905,7 +1905,9 @@ struct LEX: public Query_tables_list
uint profile_options; uint profile_options;
uint uint_geom_type; uint uint_geom_type;
uint grant, grant_tot_col, which_columns; uint grant, grant_tot_col, which_columns;
uint fk_delete_opt, fk_update_opt, fk_match_option; enum Foreign_key::fk_match_opt fk_match_option;
enum Foreign_key::fk_option fk_update_opt;
enum Foreign_key::fk_option fk_delete_opt;
uint slave_thd_opt, start_transaction_opt; uint slave_thd_opt, start_transaction_opt;
int nest_level; int nest_level;
/* /*
......
...@@ -756,6 +756,7 @@ static bool add_create_index (LEX *lex, Key::Keytype type, ...@@ -756,6 +756,7 @@ static bool add_create_index (LEX *lex, Key::Keytype type,
struct p_elem_val *p_elem_value; struct p_elem_val *p_elem_value;
enum index_hint_type index_hint; enum index_hint_type index_hint;
enum enum_filetype filetype; enum enum_filetype filetype;
enum Foreign_key::fk_option m_fk_option;
Diag_condition_item_name diag_condition_item_name; Diag_condition_item_name diag_condition_item_name;
} }
...@@ -765,10 +766,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -765,10 +766,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%pure_parser /* We have threads */ %pure_parser /* We have threads */
/* /*
Currently there are 172 shift/reduce conflicts. Currently there are 169 shift/reduce conflicts.
We should not introduce new conflicts any more. We should not introduce new conflicts any more.
*/ */
%expect 172 %expect 169
/* /*
Comments for TOKENS. Comments for TOKENS.
...@@ -1422,7 +1423,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -1422,7 +1423,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
type type_with_opt_collate int_type real_type order_dir lock_option type type_with_opt_collate int_type real_type order_dir lock_option
udf_type if_exists opt_local opt_table_options table_options udf_type if_exists opt_local opt_table_options table_options
table_option opt_if_not_exists opt_no_write_to_binlog table_option opt_if_not_exists opt_no_write_to_binlog
delete_option opt_temporary all_or_any opt_distinct opt_temporary all_or_any opt_distinct
opt_ignore_leaves fulltext_options spatial_type union_option opt_ignore_leaves fulltext_options spatial_type union_option
start_transaction_opts opt_chain opt_release start_transaction_opts opt_chain opt_release
union_opt select_derived_init option_type2 union_opt select_derived_init option_type2
...@@ -1430,6 +1431,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -1430,6 +1431,9 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
opt_ev_status opt_ev_on_completion ev_on_completion opt_ev_comment opt_ev_status opt_ev_on_completion ev_on_completion opt_ev_comment
ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_sql_stmt ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_sql_stmt
%type <m_fk_option>
delete_option
%type <ulong_num> %type <ulong_num>
ulong_num real_ulong_num merge_insert_types ulong_num real_ulong_num merge_insert_types
...@@ -1544,7 +1548,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ...@@ -1544,7 +1548,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
opt_precision opt_ignore opt_column opt_restrict opt_precision opt_ignore opt_column opt_restrict
grant revoke set lock unlock string_list field_options field_option grant revoke set lock unlock string_list field_options field_option
field_opt_list opt_binary ascii unicode table_lock_list table_lock field_opt_list opt_binary ascii unicode table_lock_list table_lock
ref_list opt_on_delete opt_on_delete_list opt_on_delete_item use ref_list opt_match_clause opt_on_update_delete use
opt_delete_options opt_delete_option varchar nchar nvarchar opt_delete_options opt_delete_option varchar nchar nvarchar
opt_outer table_list table_name table_alias_ref_list table_alias_ref opt_outer table_list table_name table_alias_ref_list table_alias_ref
opt_option opt_place opt_option opt_place
...@@ -5282,10 +5286,6 @@ key_def: ...@@ -5282,10 +5286,6 @@ key_def:
/* Only used for ALTER TABLE. Ignored otherwise. */ /* Only used for ALTER TABLE. Ignored otherwise. */
lex->alter_info.flags|= ALTER_FOREIGN_KEY; lex->alter_info.flags|= ALTER_FOREIGN_KEY;
} }
| constraint opt_check_constraint
{
Lex->col_list.empty(); /* Alloced by sql_alloc */
}
| opt_constraint check_constraint | opt_constraint check_constraint
{ {
Lex->col_list.empty(); /* Alloced by sql_alloc */ Lex->col_list.empty(); /* Alloced by sql_alloc */
...@@ -5298,7 +5298,7 @@ opt_check_constraint: ...@@ -5298,7 +5298,7 @@ opt_check_constraint:
; ;
check_constraint: check_constraint:
CHECK_SYM expr CHECK_SYM '(' expr ')'
; ;
opt_constraint: opt_constraint:
...@@ -5837,21 +5837,20 @@ opt_primary: ...@@ -5837,21 +5837,20 @@ opt_primary:
; ;
references: references:
REFERENCES table_ident REFERENCES
{ table_ident
LEX *lex=Lex;
lex->fk_delete_opt= lex->fk_update_opt= lex->fk_match_option= 0;
lex->ref_list.empty();
}
opt_ref_list opt_ref_list
opt_match_clause
opt_on_update_delete
{ {
$$=$2; $$=$2;
} }
; ;
opt_ref_list: opt_ref_list:
/* empty */ opt_on_delete {} /* empty */
| '(' ref_list ')' opt_on_delete {} { Lex->ref_list.empty(); }
| '(' ref_list ')'
; ;
ref_list: ref_list:
...@@ -5867,34 +5866,64 @@ ref_list: ...@@ -5867,34 +5866,64 @@ ref_list:
Key_part_spec *key= new Key_part_spec($1, 0); Key_part_spec *key= new Key_part_spec($1, 0);
if (key == NULL) if (key == NULL)
MYSQL_YYABORT; MYSQL_YYABORT;
Lex->ref_list.push_back(key); LEX *lex= Lex;
lex->ref_list.empty();
lex->ref_list.push_back(key);
} }
; ;
opt_on_delete: opt_match_clause:
/* empty */ {} /* empty */
| opt_on_delete_list {} { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; }
; | MATCH FULL
{ Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; }
opt_on_delete_list: | MATCH PARTIAL
opt_on_delete_list opt_on_delete_item {} { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; }
| opt_on_delete_item {} | MATCH SIMPLE_SYM
{ Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; }
; ;
opt_on_delete_item: opt_on_update_delete:
ON DELETE_SYM delete_option { Lex->fk_delete_opt= $3; } /* empty */
| ON UPDATE_SYM delete_option { Lex->fk_update_opt= $3; } {
| MATCH FULL { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } LEX *lex= Lex;
| MATCH PARTIAL { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } lex->fk_update_opt= Foreign_key::FK_OPTION_UNDEF;
| MATCH SIMPLE_SYM { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } lex->fk_delete_opt= Foreign_key::FK_OPTION_UNDEF;
}
| ON UPDATE_SYM delete_option
{
LEX *lex= Lex;
lex->fk_update_opt= $3;
lex->fk_delete_opt= Foreign_key::FK_OPTION_UNDEF;
}
| ON DELETE_SYM delete_option
{
LEX *lex= Lex;
lex->fk_update_opt= Foreign_key::FK_OPTION_UNDEF;
lex->fk_delete_opt= $3;
}
| ON UPDATE_SYM delete_option
ON DELETE_SYM delete_option
{
LEX *lex= Lex;
lex->fk_update_opt= $3;
lex->fk_delete_opt= $6;
}
| ON DELETE_SYM delete_option
ON UPDATE_SYM delete_option
{
LEX *lex= Lex;
lex->fk_update_opt= $6;
lex->fk_delete_opt= $3;
}
; ;
delete_option: delete_option:
RESTRICT { $$= (int) Foreign_key::FK_OPTION_RESTRICT; } RESTRICT { $$= Foreign_key::FK_OPTION_RESTRICT; }
| CASCADE { $$= (int) Foreign_key::FK_OPTION_CASCADE; } | CASCADE { $$= Foreign_key::FK_OPTION_CASCADE; }
| SET NULL_SYM { $$= (int) Foreign_key::FK_OPTION_SET_NULL; } | SET NULL_SYM { $$= Foreign_key::FK_OPTION_SET_NULL; }
| NO_SYM ACTION { $$= (int) Foreign_key::FK_OPTION_NO_ACTION; } | NO_SYM ACTION { $$= Foreign_key::FK_OPTION_NO_ACTION; }
| SET DEFAULT { $$= (int) Foreign_key::FK_OPTION_DEFAULT; } | SET DEFAULT { $$= Foreign_key::FK_OPTION_DEFAULT; }
; ;
normal_key_type: normal_key_type:
......
...@@ -1081,6 +1081,13 @@ static void delete_current_thread_v1(void) ...@@ -1081,6 +1081,13 @@ static void delete_current_thread_v1(void)
} }
} }
static void delete_thread_v1(PSI_thread *thread)
{
PFS_thread *pfs= reinterpret_cast<PFS_thread*> (thread);
if (pfs != NULL)
destroy_thread(pfs);
}
static PSI_mutex_locker* static PSI_mutex_locker*
get_thread_mutex_locker_v1(PSI_mutex *mutex, PSI_mutex_operation op) get_thread_mutex_locker_v1(PSI_mutex *mutex, PSI_mutex_operation op)
{ {
...@@ -2007,6 +2014,7 @@ PSI_v1 PFS_v1= ...@@ -2007,6 +2014,7 @@ PSI_v1 PFS_v1=
get_thread_v1, get_thread_v1,
set_thread_v1, set_thread_v1,
delete_current_thread_v1, delete_current_thread_v1,
delete_thread_v1,
get_thread_mutex_locker_v1, get_thread_mutex_locker_v1,
get_thread_rwlock_locker_v1, get_thread_rwlock_locker_v1,
get_thread_cond_locker_v1, get_thread_cond_locker_v1,
......
...@@ -219,7 +219,7 @@ int PFS_engine_table::read_row(TABLE *table, ...@@ -219,7 +219,7 @@ int PFS_engine_table::read_row(TABLE *table,
if (! m_share_ptr->m_checked) if (! m_share_ptr->m_checked)
{ {
my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0), my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0),
PERFORMANCE_SCHEMA_str.str, m_share_ptr->m_name); PERFORMANCE_SCHEMA_str.str, m_share_ptr->m_name.str);
return HA_ERR_TABLE_NEEDS_UPGRADE; return HA_ERR_TABLE_NEEDS_UPGRADE;
} }
...@@ -256,7 +256,7 @@ int PFS_engine_table::update_row(TABLE *table, ...@@ -256,7 +256,7 @@ int PFS_engine_table::update_row(TABLE *table,
if (! m_share_ptr->m_checked) if (! m_share_ptr->m_checked)
{ {
my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0), my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0),
PERFORMANCE_SCHEMA_str.str, m_share_ptr->m_name); PERFORMANCE_SCHEMA_str.str, m_share_ptr->m_name.str);
return HA_ERR_TABLE_NEEDS_UPGRADE; return HA_ERR_TABLE_NEEDS_UPGRADE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment