Commit a99af484 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-5317 out parameters in PREPARE "SELECT ... INTO"

originally based on the patch by Antony T Curtis
parent 278f7fdd
......@@ -256,9 +256,14 @@ execute stmt1 using @my_key ;
execute full_info ;
--disable_metadata
# the next statement must fail
--error 1064
# the next statement does not fail anymore
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
execute stmt1 using @result;
--enable_metadata
execute full_info ;
--disable_metadata
select @result;
......
......@@ -2265,7 +2265,46 @@ def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? from t9 where c1= 1' at line 1
execute stmt1 using @result;
execute full_info ;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @arg01 8 20 1 Y 32896 0 63
def @arg02 8 20 0 Y 32896 0 63
def @arg03 8 20 0 Y 32896 0 63
def @arg04 8 20 0 Y 32896 0 63
def @arg05 8 20 0 Y 32896 0 63
def @arg06 8 20 0 Y 32896 0 63
def @arg07 5 23 0 Y 32896 31 63
def @arg08 5 23 0 Y 32896 31 63
def @arg09 5 23 0 Y 32896 31 63
def @arg10 5 23 0 Y 32896 31 63
def @arg11 246 83 0 Y 32896 30 63
def @arg12 246 83 0 Y 32896 30 63
def @arg13 250 16777215 0 Y 0 31 8
def @arg14 250 16777215 0 Y 0 31 8
def @arg15 250 16777215 19 Y 0 31 8
def @arg16 250 16777215 0 Y 0 31 8
def @arg17 8 20 0 Y 32928 0 63
def @arg18 8 20 0 Y 32896 0 63
def @arg19 8 20 0 Y 32896 0 63
def @arg20 250 16777215 0 Y 0 31 8
def @arg21 250 16777215 0 Y 0 31 8
def @arg22 250 16777215 0 Y 0 31 8
def @arg23 250 16777215 0 Y 128 31 63
def @arg24 250 16777215 0 Y 0 31 8
def @arg25 250 16777215 0 Y 128 31 63
def @arg26 250 16777215 0 Y 0 31 8
def @arg27 250 16777215 0 Y 128 31 63
def @arg28 250 16777215 0 Y 0 31 8
def @arg29 250 16777215 0 Y 128 31 63
def @arg30 250 16777215 0 Y 0 31 8
def @arg31 250 16777215 0 Y 0 31 8
def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
select @result;
@result
1
test_sequence
-- insert into numeric columns --
insert into t9
......
......@@ -2248,7 +2248,46 @@ def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? from t9 where c1= 1' at line 1
execute stmt1 using @result;
execute full_info ;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @arg01 8 20 1 Y 32896 0 63
def @arg02 8 20 0 Y 32896 0 63
def @arg03 8 20 0 Y 32896 0 63
def @arg04 8 20 0 Y 32896 0 63
def @arg05 8 20 0 Y 32896 0 63
def @arg06 8 20 0 Y 32896 0 63
def @arg07 5 23 0 Y 32896 31 63
def @arg08 5 23 0 Y 32896 31 63
def @arg09 5 23 0 Y 32896 31 63
def @arg10 5 23 0 Y 32896 31 63
def @arg11 246 83 0 Y 32896 30 63
def @arg12 246 83 0 Y 32896 30 63
def @arg13 250 16777215 0 Y 0 31 8
def @arg14 250 16777215 0 Y 0 31 8
def @arg15 250 16777215 19 Y 0 31 8
def @arg16 250 16777215 0 Y 0 31 8
def @arg17 8 20 0 Y 32928 0 63
def @arg18 8 20 0 Y 32896 0 63
def @arg19 8 20 0 Y 32896 0 63
def @arg20 250 16777215 0 Y 0 31 8
def @arg21 250 16777215 0 Y 0 31 8
def @arg22 250 16777215 0 Y 0 31 8
def @arg23 250 16777215 0 Y 128 31 63
def @arg24 250 16777215 0 Y 0 31 8
def @arg25 250 16777215 0 Y 128 31 63
def @arg26 250 16777215 0 Y 0 31 8
def @arg27 250 16777215 0 Y 128 31 63
def @arg28 250 16777215 0 Y 0 31 8
def @arg29 250 16777215 0 Y 128 31 63
def @arg30 250 16777215 0 Y 0 31 8
def @arg31 250 16777215 0 Y 0 31 8
def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
select @result;
@result
1
test_sequence
-- insert into numeric columns --
insert into t9
......
......@@ -2249,7 +2249,46 @@ def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? from t9 where c1= 1' at line 1
execute stmt1 using @result;
execute full_info ;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @arg01 8 20 1 Y 32896 0 63
def @arg02 8 20 0 Y 32896 0 63
def @arg03 8 20 0 Y 32896 0 63
def @arg04 8 20 0 Y 32896 0 63
def @arg05 8 20 0 Y 32896 0 63
def @arg06 8 20 0 Y 32896 0 63
def @arg07 5 23 0 Y 32896 31 63
def @arg08 5 23 0 Y 32896 31 63
def @arg09 5 23 0 Y 32896 31 63
def @arg10 5 23 0 Y 32896 31 63
def @arg11 246 83 0 Y 32896 30 63
def @arg12 246 83 0 Y 32896 30 63
def @arg13 250 16777215 0 Y 0 31 8
def @arg14 250 16777215 0 Y 0 31 8
def @arg15 250 16777215 19 Y 0 31 8
def @arg16 250 16777215 0 Y 0 31 8
def @arg17 8 20 0 Y 32928 0 63
def @arg18 8 20 0 Y 32896 0 63
def @arg19 8 20 0 Y 32896 0 63
def @arg20 250 16777215 0 Y 0 31 8
def @arg21 250 16777215 0 Y 0 31 8
def @arg22 250 16777215 0 Y 0 31 8
def @arg23 250 16777215 0 Y 0 31 8
def @arg24 250 16777215 0 Y 0 31 8
def @arg25 250 16777215 0 Y 0 31 8
def @arg26 250 16777215 0 Y 0 31 8
def @arg27 250 16777215 0 Y 0 31 8
def @arg28 250 16777215 0 Y 0 31 8
def @arg29 250 16777215 0 Y 0 31 8
def @arg30 250 16777215 0 Y 0 31 8
def @arg31 250 16777215 0 Y 0 31 8
def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
select @result;
@result
1
test_sequence
-- insert into numeric columns --
insert into t9
......
......@@ -2185,7 +2185,46 @@ def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? from t9 where c1= 1' at line 1
execute stmt1 using @result;
execute full_info ;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @arg01 8 20 1 Y 32896 0 63
def @arg02 8 20 0 Y 32896 0 63
def @arg03 8 20 0 Y 32896 0 63
def @arg04 8 20 0 Y 32896 0 63
def @arg05 8 20 0 Y 32896 0 63
def @arg06 8 20 0 Y 32896 0 63
def @arg07 5 23 0 Y 32896 31 63
def @arg08 5 23 0 Y 32896 31 63
def @arg09 5 23 0 Y 32896 31 63
def @arg10 5 23 0 Y 32896 31 63
def @arg11 246 83 0 Y 32896 30 63
def @arg12 246 83 0 Y 32896 30 63
def @arg13 250 16777215 0 Y 0 31 8
def @arg14 250 16777215 0 Y 0 31 8
def @arg15 250 16777215 19 Y 0 31 8
def @arg16 250 16777215 0 Y 0 31 8
def @arg17 8 20 0 Y 32928 0 63
def @arg18 8 20 0 Y 32896 0 63
def @arg19 8 20 0 Y 32896 0 63
def @arg20 250 16777215 0 Y 0 31 8
def @arg21 250 16777215 0 Y 0 31 8
def @arg22 250 16777215 0 Y 0 31 8
def @arg23 250 16777215 0 Y 128 31 63
def @arg24 250 16777215 0 Y 0 31 8
def @arg25 250 16777215 0 Y 128 31 63
def @arg26 250 16777215 0 Y 0 31 8
def @arg27 250 16777215 0 Y 128 31 63
def @arg28 250 16777215 0 Y 0 31 8
def @arg29 250 16777215 0 Y 128 31 63
def @arg30 250 16777215 0 Y 0 31 8
def @arg31 250 16777215 0 Y 0 31 8
def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
select @result;
@result
1
test_sequence
-- insert into numeric columns --
insert into t9
......@@ -5539,7 +5578,46 @@ def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? from t9 where c1= 1' at line 1
execute stmt1 using @result;
execute full_info ;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @arg01 8 20 1 Y 32896 0 63
def @arg02 8 20 0 Y 32896 0 63
def @arg03 8 20 0 Y 32896 0 63
def @arg04 8 20 0 Y 32896 0 63
def @arg05 8 20 0 Y 32896 0 63
def @arg06 8 20 0 Y 32896 0 63
def @arg07 5 23 0 Y 32896 31 63
def @arg08 5 23 0 Y 32896 31 63
def @arg09 5 23 0 Y 32896 31 63
def @arg10 5 23 0 Y 32896 31 63
def @arg11 246 83 0 Y 32896 30 63
def @arg12 246 83 0 Y 32896 30 63
def @arg13 250 16777215 0 Y 0 31 8
def @arg14 250 16777215 0 Y 0 31 8
def @arg15 250 16777215 19 Y 0 31 8
def @arg16 250 16777215 0 Y 0 31 8
def @arg17 8 20 0 Y 32928 0 63
def @arg18 8 20 0 Y 32896 0 63
def @arg19 8 20 0 Y 32896 0 63
def @arg20 250 16777215 0 Y 0 31 8
def @arg21 250 16777215 0 Y 0 31 8
def @arg22 250 16777215 0 Y 0 31 8
def @arg23 250 16777215 0 Y 128 31 63
def @arg24 250 16777215 0 Y 0 31 8
def @arg25 250 16777215 0 Y 128 31 63
def @arg26 250 16777215 0 Y 0 31 8
def @arg27 250 16777215 0 Y 128 31 63
def @arg28 250 16777215 0 Y 0 31 8
def @arg29 250 16777215 0 Y 128 31 63
def @arg30 250 16777215 0 Y 0 31 8
def @arg31 250 16777215 0 Y 0 31 8
def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
select @result;
@result
1
test_sequence
-- insert into numeric columns --
insert into t9
......
......@@ -2265,7 +2265,46 @@ def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
prepare stmt1 from "select c1 into ? from t9 where c1= 1" ;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '? from t9 where c1= 1' at line 1
execute stmt1 using @result;
execute full_info ;
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def @arg01 8 20 1 Y 32896 0 63
def @arg02 8 20 0 Y 32896 0 63
def @arg03 8 20 0 Y 32896 0 63
def @arg04 8 20 0 Y 32896 0 63
def @arg05 8 20 0 Y 32896 0 63
def @arg06 8 20 0 Y 32896 0 63
def @arg07 5 23 0 Y 32896 31 63
def @arg08 5 23 0 Y 32896 31 63
def @arg09 5 23 0 Y 32896 31 63
def @arg10 5 23 0 Y 32896 31 63
def @arg11 246 83 0 Y 32896 30 63
def @arg12 246 83 0 Y 32896 30 63
def @arg13 250 16777215 0 Y 0 31 8
def @arg14 250 16777215 0 Y 0 31 8
def @arg15 250 16777215 19 Y 0 31 8
def @arg16 250 16777215 0 Y 0 31 8
def @arg17 8 20 0 Y 32928 0 63
def @arg18 8 20 0 Y 32896 0 63
def @arg19 8 20 0 Y 32896 0 63
def @arg20 250 16777215 0 Y 0 31 8
def @arg21 250 16777215 0 Y 0 31 8
def @arg22 250 16777215 0 Y 0 31 8
def @arg23 250 16777215 0 Y 128 31 63
def @arg24 250 16777215 0 Y 0 31 8
def @arg25 250 16777215 0 Y 128 31 63
def @arg26 250 16777215 0 Y 0 31 8
def @arg27 250 16777215 0 Y 128 31 63
def @arg28 250 16777215 0 Y 0 31 8
def @arg29 250 16777215 0 Y 128 31 63
def @arg30 250 16777215 0 Y 0 31 8
def @arg31 250 16777215 0 Y 0 31 8
def @arg32 250 16777215 0 Y 0 31 8
@arg01 @arg02 @arg03 @arg04 @arg05 @arg06 @arg07 @arg08 @arg09 @arg10 @arg11 @arg12 @arg13 @arg14 @arg15 @arg16 @arg17 @arg18 @arg19 @arg20 @arg21 @arg22 @arg23 @arg24 @arg25 @arg26 @arg27 @arg28 @arg29 @arg30 @arg31 @arg32
0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 1991-01-01 01:01:01 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
select @result;
@result
1
test_sequence
-- insert into numeric columns --
insert into t9
......
include/master-slave.inc
[connection master]
create table t1 (a int, b int);
create table t2 (c int);
insert t1 values (1, 2), (3, 4);
create function fn1(x int) returns int deterministic
begin
insert t2 values (x);
return x;
end|
prepare stmt1 from "select fn1(a) into ? from t1 where b= 2";
execute stmt1 using @result;
select * from t2;
c
1
1
select @result;
@result
1
select * from t2;
c
1
1
drop table t1, t2;
drop function fn1;
include/rpl_end.inc
source include/master-slave.inc;
create table t1 (a int, b int);
create table t2 (c int);
insert t1 values (1, 2), (3, 4);
delimiter |;
create function fn1(x int) returns int deterministic
begin
insert t2 values (x);
return x;
end|
delimiter ;|
prepare stmt1 from "select fn1(a) into ? from t1 where b= 2";
execute stmt1 using @result;
select * from t2;
select @result;
sync_slave_with_master;
select * from t2;
connection master;
drop table t1, t2;
drop function fn1;
source include/rpl_end.inc;
......@@ -3230,7 +3230,7 @@ default_set_param_func(Item_param *param,
Item_param::Item_param(uint pos_in_query_arg) :
state(NO_VALUE),
state(NO_VALUE), inout(IN_PARAM),
item_result_type(STRING_RESULT),
/* Don't pretend to be a literal unless value for this item is set. */
item_type(PARAM_ITEM),
......
......@@ -2242,6 +2242,7 @@ public:
STRING_VALUE, TIME_VALUE, LONG_DATA_VALUE,
DECIMAL_VALUE
} state;
enum { IN_PARAM, OUT_PARAM } inout;
/*
A buffer for string and long data values. Historically all allocated
......
......@@ -3743,6 +3743,11 @@ bool my_var_sp::set(THD *thd, Item *item)
return thd->spcont->set_variable(thd, offset, &item);
}
bool my_var_param::set(THD *thd, Item *item)
{
return param->set_value(thd, 0, &item);
}
int select_dumpvar::send_data(List<Item> &items)
{
List_iterator_fast<my_var> var_li(var_list);
......
......@@ -4781,6 +4781,17 @@ public:
virtual bool set(THD *thd, Item *val) = 0;
};
class my_var_param: public my_var {
public:
Settable_routine_parameter *param;
my_var_param(Item_param *p)
: my_var(null_lex_str, PARAM_VAR),
param(p->get_settable_routine_parameter())
{ p->inout= Item_param::OUT_PARAM; }
~my_var_param() { }
bool set(THD *thd, Item *val);
};
class my_var_sp: public my_var {
public:
uint offset;
......
......@@ -1186,6 +1186,30 @@ static bool insert_params_from_vars(Prepared_statement *stmt,
DBUG_RETURN(0);
}
static bool update_vars_from_params(Prepared_statement *stmt,
List<LEX_STRING>& varnames)
{
Item_param **begin= stmt->param_array;
Item_param **end= begin + stmt->param_count;
LEX_STRING *varname;
List_iterator<LEX_STRING> var_it(varnames);
DBUG_ENTER("update_vars_from_params");
for (Item_param **it= begin; it < end; ++it)
{
Item_param *param= *it;
varname= var_it++;
if (param->inout != Item_param::OUT_PARAM)
continue;
Item_func_set_user_var *suv= new Item_func_set_user_var(*varname, param);
if (suv->fix_fields(stmt->thd, 0))
DBUG_RETURN(1);
suv->save_item_result(param);
if (suv->update())
DBUG_RETURN(1);
}
DBUG_RETURN(0);
}
/**
Do the same as insert_params_from_vars but also construct query text for
......@@ -3681,6 +3705,11 @@ reexecute:
if (! error) /* Success */
goto reexecute;
}
/* Assign values for OUT-parameters (SELECT INTO) in the SQL PS */
if (!packet)
update_vars_from_params(this, thd->lex->prepared_stmt_params);
reset_stmt_params(this);
return error;
......
......@@ -11527,6 +11527,10 @@ select_outvar:
{
$$ = Lex->result ? new my_var_user($2) : NULL;
}
| param_marker
{
$$ = Lex->result ? new my_var_param($1) : NULL;
}
| ident_or_text
{
sp_variable *t;
......
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