summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/func_in.result29
-rw-r--r--mysql-test/r/func_time.result4
-rw-r--r--mysql-test/r/lock_multi.result6
-rw-r--r--mysql-test/t/func_in.test12
-rw-r--r--mysql-test/t/lock_multi.test55
-rw-r--r--regex/regexec.c2
-rw-r--r--sql/ha_innodb.cc29
-rw-r--r--sql/item_cmpfunc.cc32
8 files changed, 96 insertions, 73 deletions
diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result
index f758e2adfd9..e38e2624e19 100644
--- a/mysql-test/r/func_in.result
+++ b/mysql-test/r/func_in.result
@@ -202,35 +202,6 @@ select count(*) from t1 where id not in (1,2);
count(*)
1
drop table t1;
-create table t1 (f1 char(1), f2 int);
-insert into t1 values (1,0),('a',1),('z',2);
-select f1 from t1 where f1 in (1,'z');
-f1
-1
-z
-select f2 from t1 where f2 in (1,'z');
-f2
-0
-1
-Warnings:
-Warning 1292 Truncated incorrect INTEGER value: 'z'
-select f1 from t1 where 'z' in (1,f1);
-f1
-z
-select * from t1 where 'z' in (f2,f1);
-f1 f2
-1 0
-a 1
-z 2
-Warnings:
-Warning 1292 Truncated incorrect DOUBLE value: 'z'
-Warning 1292 Truncated incorrect DOUBLE value: 'z'
-Warning 1292 Truncated incorrect DOUBLE value: 'z'
-select * from t1 where 1 in (f2,f1);
-f1 f2
-1 0
-a 1
-drop table t1;
CREATE TABLE t1 (a int PRIMARY KEY);
INSERT INTO t1 VALUES (44), (45), (46);
SELECT * FROM t1 WHERE a IN (45);
diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result
index 43c9748bace..5ccf7f6baea 100644
--- a/mysql-test/r/func_time.result
+++ b/mysql-test/r/func_time.result
@@ -785,8 +785,8 @@ select f1 from t1 where "2006-1-1" between f1 and 'zzz';
f1
Warnings:
Warning 1292 Incorrect date value: 'zzz' for column 'f1' at row 1
-Warning 1292 Truncated incorrect INTEGER value: 'zzz'
-Warning 1292 Truncated incorrect INTEGER value: 'zzz'
+Warning 1292 Truncated incorrect DOUBLE value: 'zzz'
+Warning 1292 Truncated incorrect DOUBLE value: 'zzz'
select f1 from t1 where makedate(2006,1) between date(f1) and date(f3);
f1
2006-01-01
diff --git a/mysql-test/r/lock_multi.result b/mysql-test/r/lock_multi.result
index b04a5fb0a3e..b9500d1d4f9 100644
--- a/mysql-test/r/lock_multi.result
+++ b/mysql-test/r/lock_multi.result
@@ -74,3 +74,9 @@ ERROR HY000: Can't execute the query because you have a conflicting read lock
UNLOCK TABLES;
DROP DATABASE mysqltest_1;
ERROR HY000: Can't drop database 'mysqltest_1'; database doesn't exist
+create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb;
+lock tables t1 write;
+ alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; //
+ alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; //
+unlock tables;
+drop table t1;
diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test
index 5a5e3ec798d..8ddf1fbe314 100644
--- a/mysql-test/t/func_in.test
+++ b/mysql-test/t/func_in.test
@@ -109,18 +109,6 @@ select count(*) from t1 where id not in (1);
select count(*) from t1 where id not in (1,2);
drop table t1;
-#
-# Bug#18360 Incorrect type coercion in IN() results in false comparison
-#
-create table t1 (f1 char(1), f2 int);
-insert into t1 values (1,0),('a',1),('z',2);
-select f1 from t1 where f1 in (1,'z');
-select f2 from t1 where f2 in (1,'z');
-select f1 from t1 where 'z' in (1,f1);
-select * from t1 where 'z' in (f2,f1);
-select * from t1 where 1 in (f2,f1);
-drop table t1;
-
# End of 4.1 tests
#
diff --git a/mysql-test/t/lock_multi.test b/mysql-test/t/lock_multi.test
index 6ebcf595645..5bebec49b88 100644
--- a/mysql-test/t/lock_multi.test
+++ b/mysql-test/t/lock_multi.test
@@ -191,4 +191,59 @@ disconnect con2;
--error ER_DB_DROP_EXISTS
DROP DATABASE mysqltest_1;
+#
+# Bug #17264: MySQL Server freeze
+#
+connection locker;
+create table t1 (f1 int(12) unsigned not null auto_increment, primary key(f1)) engine=innodb;
+lock tables t1 write;
+connection writer;
+--sleep 2
+delimiter //;
+send alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; //
+delimiter ;//
+connection reader;
+--sleep 2
+delimiter //;
+send alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; alter table t1 auto_increment=0; //
+delimiter ;//
+connection locker;
+--sleep 2
+unlock tables;
+connection writer;
+reap;
+connection reader;
+reap;
+connection locker;
+drop table t1;
+
# End of 5.0 tests
+# Bug#16986 - Deadlock condition with MyISAM tables
+#
+connection locker;
+use mysql;
+LOCK TABLES columns_priv WRITE, db WRITE, host WRITE, user WRITE;
+FLUSH TABLES;
+--sleep 1
+#
+connection reader;
+use mysql;
+#NOTE: This must be a multi-table select, otherwise the deadlock will not occur
+send SELECT user.Select_priv FROM user, db WHERE user.user = db.user LIMIT 1;
+--sleep 1
+#
+connection locker;
+# Make test case independent from earlier grants.
+--replace_result "Table is already up to date" "OK"
+OPTIMIZE TABLES columns_priv, db, host, user;
+UNLOCK TABLES;
+#
+connection reader;
+reap;
+use test;
+#
+connection locker;
+use test;
+#
+connection default;
+
diff --git a/regex/regexec.c b/regex/regexec.c
index b7ad83ba883..88bcc02323d 100644
--- a/regex/regexec.c
+++ b/regex/regexec.c
@@ -19,7 +19,7 @@ static int nope = 0; /* for use in asserts; shuts lint up */
/* macros for manipulating states, small version */
#define states long
-#define states1 states /* for later use in regexec() decision */
+#define states1 long /* for later use in regexec() decision. Ensure Win64 definition is correct.*/
#define CLEAR(v) ((v) = 0)
#define SET0(v, n) ((v) &= ~((states) 1 << (n)))
#define SET1(v, n) ((v) |= (states) 1 << (n))
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index ec504cc1266..97249f35efa 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -6910,17 +6910,28 @@ ha_innobase::store_lock(
stored function call (MySQL does have thd->in_lock_tables
TRUE there). */
- if ((lock_type >= TL_WRITE_CONCURRENT_INSERT
- && lock_type <= TL_WRITE)
- && !(thd->in_lock_tables
- && thd->lex->sql_command == SQLCOM_LOCK_TABLES)
- && !thd->tablespace_op
- && thd->lex->sql_command != SQLCOM_TRUNCATE
- && thd->lex->sql_command != SQLCOM_OPTIMIZE
- && thd->lex->sql_command != SQLCOM_CREATE_TABLE) {
+ if ((lock_type >= TL_WRITE_CONCURRENT_INSERT
+ && lock_type <= TL_WRITE)
+ && !(thd->in_lock_tables
+ && thd->lex->sql_command == SQLCOM_LOCK_TABLES)
+ && !thd->tablespace_op
+ && thd->lex->sql_command != SQLCOM_TRUNCATE
+ && thd->lex->sql_command != SQLCOM_OPTIMIZE
+#ifdef __WIN__
+ /*
+ for alter table on win32 for succesfull operation
+ completion it is used TL_WRITE(=10) lock instead of
+ TL_WRITE_ALLOW_READ(=6), however here in innodb handler
+ TL_WRITE is lifted to TL_WRITE_ALLOW_WRITE, which causes
+ race condition when several clients do alter table
+ simultaneously (bug #17264). This fix avoids the problem.
+ */
+ && thd->lex->sql_command != SQLCOM_ALTER_TABLE
+#endif
+ && thd->lex->sql_command != SQLCOM_CREATE_TABLE) {
lock_type = TL_WRITE_ALLOW_WRITE;
- }
+ }
/* In queries of type INSERT INTO t1 SELECT ... FROM t2 ...
MySQL would use the lock TL_READ_NO_INSERT on t2, and that
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 3bff7878f02..763b79cb48f 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -80,9 +80,6 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems)
NOTES
Aggregation rules:
- If all items are constants the type will be aggregated from all items.
- If there are some non-constant items then only types of non-constant
- items will be used for aggregation.
If there are DATE/TIME fields/functions in the list and no string
fields/functions in the list then:
The INT_RESULT type will be used for aggregation instead of original
@@ -169,34 +166,29 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
}
}
}
- /* Reset to 0 on first occurence of non-const item. 1 otherwise */
- bool is_const= items[0]->const_item();
/*
If the first item is a date/time function then its result should be
compared as int
*/
if (field)
- {
- /* Suppose we are comparing dates and some non-constant items are present. */
+ /* Suppose we are comparing dates */
type[0]= INT_RESULT;
- is_const= 0;
- }
else
type[0]= items[0]->result_type();
for (i= 0; i < nitems ; i++)
{
- if (!items[i]->const_item())
- {
- Item_result result= field && items[i]->result_as_longlong() ?
- INT_RESULT : items[i]->result_type();
- type[0]= is_const ? result : item_cmp_type(type[0], result);
- is_const= 0;
- }
- else if (is_const)
- type[0]= item_cmp_type(type[0], items[i]->result_type());
- else if (field)
- convert_constant_item(thd, field, &items[i]);
+ Item_result result= items[i]->result_type();
+ /*
+ Use INT_RESULT as result type for DATE/TIME fields/functions and
+ for constants successfully converted to DATE/TIME
+ */
+ if (field &&
+ ((!items[i]->const_item() && items[i]->result_as_longlong()) ||
+ (items[i]->const_item() && convert_constant_item(thd, field,
+ &items[i]))))
+ result= INT_RESULT;
+ type[0]= item_cmp_type(type[0], result);
}
if (res == Item::FUNC_ITEM && field)