2671 Davi Arnaut 2008-10-15 [merge]
Merge mysql-5.0-bugteam into mysql-5.1-bugteam.
modified:
mysql-test/r/limit.result
mysql-test/r/sp.result
mysql-test/t/limit.test
mysql-test/t/sp.test
sql/item.cc
sql/sql_lex.cc
2670 Davi Arnaut 2008-10-15
Bug#38477: my_pthread_setprio can change dispatch class on Solaris, not just priority
The problem is that the function used by the server to increase
the thread's priority (pthread_setschedparam) has the unintended
side-effect of changing the calling thread scheduling policy,
possibly overwriting a scheduling policy set by a sysadmin.
The solution is to rely on the pthread_setschedprio function, if
available, as it only changes the scheduling priority and does not
change the scheduling policy. This function is usually available on
Solaris and Linux, but it use won't work by default on Linux as the
the default scheduling policy only accepts a static priority 0 -- this
is acceptable for now as priority changing on Linux is broken anyway.
modified:
configure.in
include/my_pthread.h
=== modified file 'mysql-test/r/limit.result'
--- a/mysql-test/r/limit.result 2008-02-28 14:34:08 +0000
+++ b/mysql-test/r/limit.result 2008-10-15 21:34:51 +0000
@@ -111,3 +111,6 @@ set @a=-14632475938453979136;
execute s using @a, @a;
ERROR HY000: Incorrect arguments to EXECUTE
End of 5.0 tests
+select 1 as a limit 4294967296,10;
+a
+End of 5.1 tests
=== modified file 'mysql-test/r/sp.result'
--- a/mysql-test/r/sp.result 2008-09-20 14:52:34 +0000
+++ b/mysql-test/r/sp.result 2008-10-16 01:50:56 +0000
@@ -6846,6 +6846,19 @@ select substr(`str`, `pos`+ 1 ) into `st
end $
call `p2`('s s s s s s');
drop procedure `p2`;
+drop table if exists t1;
+drop procedure if exists p1;
+create procedure p1() begin select * from t1; end$
+call p1$
+ERROR 42S02: Table 'test.t1' doesn't exist
+create table t1 (a integer)$
+call p1$
+a
+alter table t1 add b integer;
+call p1$
+a
+drop table t1;
+drop procedure p1;
# ------------------------------------------------------------------
# -- End of 5.0 tests
# ------------------------------------------------------------------
=== modified file 'mysql-test/t/limit.test'
--- a/mysql-test/t/limit.test 2008-02-28 23:22:50 +0000
+++ b/mysql-test/t/limit.test 2008-10-16 01:50:56 +0000
@@ -95,3 +95,11 @@ set @a=-14632475938453979136;
execute s using @a, @a;
--echo End of 5.0 tests
+
+#
+# Bug#37075: offset of limit clause might be truncated to 0 on 32-bits server w/o big tables
+#
+
+select 1 as a limit 4294967296,10;
+
+--echo End of 5.1 tests
=== modified file 'mysql-test/t/sp.test'
--- a/mysql-test/t/sp.test 2008-09-20 14:52:34 +0000
+++ b/mysql-test/t/sp.test 2008-10-16 01:50:56 +0000
@@ -8041,6 +8041,28 @@ delimiter ;$
call `p2`('s s s s s s');
drop procedure `p2`;
+#
+# Bug#38823: Invalid memory access when a SP statement does wildcard expansion
+#
+
+--disable_warnings
+drop table if exists t1;
+drop procedure if exists p1;
+--enable_warnings
+
+delimiter $;
+create procedure p1() begin select * from t1; end$
+--error ER_NO_SUCH_TABLE
+call p1$
+create table t1 (a integer)$
+call p1$
+alter table t1 add b integer;
+call p1$
+delimiter ;$
+
+drop table t1;
+drop procedure p1;
+
--echo # ------------------------------------------------------------------
--echo # -- End of 5.0 tests
--echo # ------------------------------------------------------------------
=== modified file 'sql/item.cc'
--- a/sql/item.cc 2008-10-13 10:22:36 +0000
+++ b/sql/item.cc 2008-10-16 01:50:56 +0000
@@ -1805,7 +1805,8 @@ Item_field::Item_field(THD *thd, Name_re
be allocated in the statement memory, not in table memory (the table
structure can go away and pop up again between subsequent executions
of a prepared statement or after the close_tables_for_reopen() call
- in mysql_multi_update_prepare()).
+ in mysql_multi_update_prepare() or due to wildcard expansion in stored
+ procedures).
*/
{
if (db_name)
=== modified file 'sql/sql_lex.cc'
--- a/sql/sql_lex.cc 2008-10-07 21:52:49 +0000
+++ b/sql/sql_lex.cc 2008-10-16 01:50:56 +0000
@@ -2397,15 +2397,20 @@ void st_select_lex_unit::set_limit(st_se
val= sl->select_limit ? sl->select_limit->val_uint() : HA_POS_ERROR;
select_limit_val= (ha_rows)val;
#ifndef BIG_TABLES
- /*
+ /*
Check for overflow : ha_rows can be smaller then ulonglong if
BIG_TABLES is off.
*/
if (val != (ulonglong)select_limit_val)
select_limit_val= HA_POS_ERROR;
#endif
- offset_limit_cnt= (ha_rows)(sl->offset_limit ? sl->offset_limit->val_uint() :
- ULL(0));
+ val= sl->offset_limit ? sl->offset_limit->val_uint() : ULL(0);
+ offset_limit_cnt= (ha_rows)val;
+#ifndef BIG_TABLES
+ /* Check for truncation. */
+ if (val != (ulonglong)offset_limit_cnt)
+ offset_limit_cnt= HA_POS_ERROR;
+#endif
select_limit_cnt= select_limit_val + offset_limit_cnt;
if (select_limit_cnt < select_limit_val)
select_limit_cnt= HA_POS_ERROR; // no limit
| Thread |
|---|
| • bzr push into mysql-5.1 branch (davi:2670 to 2671) | Davi Arnaut | 16 Oct |