Commit cb35648e authored by unknown's avatar unknown

fixed ORDER BY ?

new tests to ensure that prepared statement *really* work
(and that MySQL not picks up some number from arbitrary location
that happens to match the parameter's value)


mysql-test/include/ps_query.inc:
  new tests to ensure that prepared statement *really* work
  (and that MySQL not picks up some number from arbitrary location
  that happens to match the parameter's value)
mysql-test/r/ps_2myisam.result:
  results updated
mysql-test/r/ps_3innodb.result:
  results updated
mysql-test/r/ps_4heap.result:
  results updated
mysql-test/r/ps_5merge.result:
  results updated
mysql-test/r/ps_6bdb.result:
  results updated
sql/sql_select.cc:
  don't shortcut - it backfires!
  (in particular - when itemptr is Item_param :)
parent bf95f919
...@@ -246,6 +246,11 @@ select a,b from t1 order by 2 ; ...@@ -246,6 +246,11 @@ select a,b from t1 order by 2 ;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
order by ? '; order by ? ';
execute stmt1 using @arg00; execute stmt1 using @arg00;
set @arg00=1 ;
execute stmt1 using @arg00;
set @arg00=0 ;
--error 1054
execute stmt1 using @arg00;
##### parameter used in limit clause ##### parameter used in limit clause
set @arg00=1; set @arg00=1;
......
...@@ -334,6 +334,16 @@ a b ...@@ -334,6 +334,16 @@ a b
1 one 1 one
3 three 3 three
2 two 2 two
set @arg00=1 ;
execute stmt1 using @arg00;
a b
1 one
2 two
3 three
4 four
set @arg00=0 ;
execute stmt1 using @arg00;
ERROR 42S22: Unknown column '?' in 'order clause'
set @arg00=1; set @arg00=1;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
limit 1 '; limit 1 ';
......
...@@ -334,6 +334,16 @@ a b ...@@ -334,6 +334,16 @@ a b
1 one 1 one
3 three 3 three
2 two 2 two
set @arg00=1 ;
execute stmt1 using @arg00;
a b
1 one
2 two
3 three
4 four
set @arg00=0 ;
execute stmt1 using @arg00;
ERROR 42S22: Unknown column '?' in 'order clause'
set @arg00=1; set @arg00=1;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
limit 1 '; limit 1 ';
......
...@@ -335,6 +335,16 @@ a b ...@@ -335,6 +335,16 @@ a b
1 one 1 one
3 three 3 three
2 two 2 two
set @arg00=1 ;
execute stmt1 using @arg00;
a b
1 one
2 two
3 three
4 four
set @arg00=0 ;
execute stmt1 using @arg00;
ERROR 42S22: Unknown column '?' in 'order clause'
set @arg00=1; set @arg00=1;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
limit 1 '; limit 1 ';
......
...@@ -377,6 +377,16 @@ a b ...@@ -377,6 +377,16 @@ a b
1 one 1 one
3 three 3 three
2 two 2 two
set @arg00=1 ;
execute stmt1 using @arg00;
a b
1 one
2 two
3 three
4 four
set @arg00=0 ;
execute stmt1 using @arg00;
ERROR 42S22: Unknown column '?' in 'order clause'
set @arg00=1; set @arg00=1;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
limit 1 '; limit 1 ';
...@@ -1560,6 +1570,16 @@ a b ...@@ -1560,6 +1570,16 @@ a b
1 one 1 one
3 three 3 three
2 two 2 two
set @arg00=1 ;
execute stmt1 using @arg00;
a b
1 one
2 two
3 three
4 four
set @arg00=0 ;
execute stmt1 using @arg00;
ERROR 42S22: Unknown column '?' in 'order clause'
set @arg00=1; set @arg00=1;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
limit 1 '; limit 1 ';
......
...@@ -334,6 +334,16 @@ a b ...@@ -334,6 +334,16 @@ a b
1 one 1 one
3 three 3 three
2 two 2 two
set @arg00=1 ;
execute stmt1 using @arg00;
a b
1 one
2 two
3 three
4 four
set @arg00=0 ;
execute stmt1 using @arg00;
ERROR 42S22: Unknown column '?' in 'order clause'
set @arg00=1; set @arg00=1;
prepare stmt1 from ' select a,b from t1 prepare stmt1 from ' select a,b from t1
limit 1 '; limit 1 ';
......
...@@ -8000,7 +8000,7 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, ...@@ -8000,7 +8000,7 @@ find_order_in_list(THD *thd, Item **ref_pointer_array,
Item *itemptr=*order->item; Item *itemptr=*order->item;
if (itemptr->type() == Item::INT_ITEM) if (itemptr->type() == Item::INT_ITEM)
{ /* Order by position */ { /* Order by position */
uint count= (uint) ((Item_int*)itemptr)->value; uint count= itemptr->val_int();
if (!count || count > fields.elements) if (!count || count > fields.elements)
{ {
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR), my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),
......
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