summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2014-08-13 21:04:05 +0200
committerSergei Golubchik <serg@mariadb.org>2014-10-10 22:27:39 +0200
commita99af484cd9360c2cea92798bcde594adcf23b7e (patch)
treeb9c61f61a82cba37c8509f623e45aeb53495281c
parent278f7fdd7e62b71bb1693c97b69c0ad515da9e2c (diff)
downloadmariadb-git-a99af484cd9360c2cea92798bcde594adcf23b7e.tar.gz
MDEV-5317 out parameters in PREPARE "SELECT ... INTO"
originally based on the patch by Antony T Curtis
-rw-r--r--mysql-test/include/ps_conv.inc9
-rw-r--r--mysql-test/r/ps_2myisam.result41
-rw-r--r--mysql-test/r/ps_3innodb.result41
-rw-r--r--mysql-test/r/ps_4heap.result41
-rw-r--r--mysql-test/r/ps_5merge.result82
-rw-r--r--mysql-test/suite/maria/ps_maria.result41
-rw-r--r--mysql-test/suite/rpl/r/prepare_select_into.result26
-rw-r--r--mysql-test/suite/rpl/t/prepare_select_into.test27
-rw-r--r--sql/item.cc2
-rw-r--r--sql/item.h1
-rw-r--r--sql/sql_class.cc5
-rw-r--r--sql/sql_class.h11
-rw-r--r--sql/sql_prepare.cc29
-rw-r--r--sql/sql_yacc.yy4
14 files changed, 351 insertions, 9 deletions
diff --git a/mysql-test/include/ps_conv.inc b/mysql-test/include/ps_conv.inc
index 2e42542d19a..dba182e0b3e 100644
--- a/mysql-test/include/ps_conv.inc
+++ b/mysql-test/include/ps_conv.inc
@@ -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;
+
diff --git a/mysql-test/r/ps_2myisam.result b/mysql-test/r/ps_2myisam.result
index 6ca76191db5..75a6b669a40 100644
--- a/mysql-test/r/ps_2myisam.result
+++ b/mysql-test/r/ps_2myisam.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
diff --git a/mysql-test/r/ps_3innodb.result b/mysql-test/r/ps_3innodb.result
index 47237790ae5..17be5e53418 100644
--- a/mysql-test/r/ps_3innodb.result
+++ b/mysql-test/r/ps_3innodb.result
@@ -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
diff --git a/mysql-test/r/ps_4heap.result b/mysql-test/r/ps_4heap.result
index 57532797dd7..5c0f01788a6 100644
--- a/mysql-test/r/ps_4heap.result
+++ b/mysql-test/r/ps_4heap.result
@@ -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
diff --git a/mysql-test/r/ps_5merge.result b/mysql-test/r/ps_5merge.result
index 9a9f457a212..861dba2bd04 100644
--- a/mysql-test/r/ps_5merge.result
+++ b/mysql-test/r/ps_5merge.result
@@ -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
diff --git a/mysql-test/suite/maria/ps_maria.result b/mysql-test/suite/maria/ps_maria.result
index 774bf8af54a..30b877e042c 100644
--- a/mysql-test/suite/maria/ps_maria.result
+++ b/mysql-test/suite/maria/ps_maria.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
diff --git a/mysql-test/suite/rpl/r/prepare_select_into.result b/mysql-test/suite/rpl/r/prepare_select_into.result
new file mode 100644
index 00000000000..ebf64f24967
--- /dev/null
+++ b/mysql-test/suite/rpl/r/prepare_select_into.result
@@ -0,0 +1,26 @@
+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
diff --git a/mysql-test/suite/rpl/t/prepare_select_into.test b/mysql-test/suite/rpl/t/prepare_select_into.test
new file mode 100644
index 00000000000..995b81020a1
--- /dev/null
+++ b/mysql-test/suite/rpl/t/prepare_select_into.test
@@ -0,0 +1,27 @@
+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;
+
diff --git a/sql/item.cc b/sql/item.cc
index 21baf779781..ef426a87a62 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -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),
diff --git a/sql/item.h b/sql/item.h
index a9021f355ec..1cef9b75fdd 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -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
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 12c30a8ea38..430bfbf760d 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -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);
diff --git a/sql/sql_class.h b/sql/sql_class.h
index acf4d79b5c5..243cc4459a0 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -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;
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 86936700c7d..9f195b93e23 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -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;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 333b3a21837..517c98fd06b 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -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;