1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Post review fixes for BUG#16474: SP crashed MySQL.

mysql-test/r/ps.result:
  Added test coverage for "order by" in prepared statements (related to BUG#16474).
mysql-test/r/sp.result:
  Added reference to test case for BUG#16474.
mysql-test/t/ps.test:
  Added test coverage for "order by" in prepared statements (related to BUG#16474).
mysql-test/t/sp.test:
  Added reference to test case for BUG#16474.
sql/sql_select.cc:
  Fixed comment and test for basic_const_item() instead of is_splocal().
This commit is contained in:
unknown
2006-03-28 14:16:21 +02:00
parent fb36d923ce
commit 537ec1e6df
5 changed files with 94 additions and 2 deletions

View File

@ -880,3 +880,49 @@ select row_count();
row_count() row_count()
1 1
drop table t1; drop table t1;
create table t1 (a int, b int);
insert into t1 (a,b) values (2,8),(1,9),(3,7);
prepare stmt from "select * from t1 order by ?";
execute stmt using @a;
a b
2 8
1 9
3 7
set @a=1;
execute stmt using @a;
a b
1 9
2 8
3 7
set @a=2;
execute stmt using @a;
a b
3 7
2 8
1 9
deallocate prepare stmt;
select * from t1 order by 1;
a b
1 9
2 8
3 7
prepare stmt from "select * from t1 order by ?+1";
set @a=0;
execute stmt using @a;
a b
2 8
1 9
3 7
set @a=1;
execute stmt using @a;
a b
2 8
1 9
3 7
deallocate prepare stmt;
select * from t1 order by 1+1;
a b
2 8
1 9
3 7
drop table t1;

View File

@ -4885,5 +4885,11 @@ b
a a
drop procedure bug16474_1| drop procedure bug16474_1|
drop procedure bug16474_2| drop procedure bug16474_2|
set @x = 2|
select * from t1 order by @x|
id data
c 2
b 3
a 1
delete from t1| delete from t1|
drop table t1,t2; drop table t1,t2;

View File

@ -933,4 +933,38 @@ execute ins_call;
select row_count(); select row_count();
drop table t1; drop table t1;
#
# BUG#16474: SP crashed MySQL
# (when using "order by localvar", where 'localvar' is just that.
# The actual bug test is in sp.test, this is just testing that we get the
# expected result for prepared statements too, i.e. place holders work as
# textual substitution. If it's a single integer, it works as the (deprecated)
# "order by column#", otherwise it's an expression.
#
create table t1 (a int, b int);
insert into t1 (a,b) values (2,8),(1,9),(3,7);
# Will order by index
prepare stmt from "select * from t1 order by ?";
execute stmt using @a;
set @a=1;
execute stmt using @a;
set @a=2;
execute stmt using @a;
deallocate prepare stmt;
# For reference:
select * from t1 order by 1;
# Will not order by index.
prepare stmt from "select * from t1 order by ?+1";
set @a=0;
execute stmt using @a;
set @a=1;
execute stmt using @a;
deallocate prepare stmt;
# For reference:
select * from t1 order by 1+1;
drop table t1;
# End of 5.0 tests # End of 5.0 tests

View File

@ -5745,6 +5745,11 @@ call bug16474_2(1)|
call bug16474_2(2)| call bug16474_2(2)|
drop procedure bug16474_1| drop procedure bug16474_1|
drop procedure bug16474_2| drop procedure bug16474_2|
# For reference: user variables are expressions too and do not affect ordering.
set @x = 2|
select * from t1 order by @x|
delete from t1| delete from t1|

View File

@ -12327,9 +12327,10 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
/* /*
Local SP variables may be int but are expressions, not positions. Local SP variables may be int but are expressions, not positions.
(And they must be fixed.) (And they can't be used before fix_fields is called for them).
*/ */
if (order_item->type() == Item::INT_ITEM && !order_item->is_splocal()) // if (order_item->type() == Item::INT_ITEM && !order_item->is_splocal())
if (order_item->type() == Item::INT_ITEM && order_item->basic_const_item())
{ /* Order by position */ { /* Order by position */
uint count= (uint) order_item->val_int(); uint count= (uint) order_item->val_int();
if (!count || count > fields.elements) if (!count || count > fields.elements)