1--TEST--
2mysqli_query() - Stored Procedures
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifconnectfailure.inc');
7require_once('connect.inc');
8if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
9	die(sprintf('skip Cannot connect to MySQL, [%d] %s.', mysqli_connect_errno(), mysqli_connect_error()));
10}
11if (mysqli_get_server_version($link) <= 50000) {
12	die(sprintf('skip Needs MySQL 5.0+, found version %d.', mysqli_get_server_version($link)));
13}
14?>
15--FILE--
16<?php
17	require_once('connect.inc');
18	require_once('table.inc');
19
20	if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
21		printf("[001] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
22
23	if (mysqli_query($link, 'CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id, label FROM test ORDER BY id ASC;
24END;')) {
25		/* stored proc which returns one result set */
26		if (mysqli_multi_query($link, 'CALL p()')) {
27			do {
28				if ($res = mysqli_use_result($link)) {
29					// skip results, don't fetch all from server
30					var_dump(mysqli_fetch_assoc($res));
31					mysqli_free_result($res);
32				}
33			} while (mysqli_more_results($link) && mysqli_next_result($link));
34
35		} else {
36			printf("[003] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
37		}
38
39		if (mysqli_multi_query($link, 'CALL p()')) {
40			do {
41				if ($res = mysqli_store_result($link)) {
42					// fetch all results from server, but skip on client side
43					var_dump(mysqli_fetch_assoc($res));
44					mysqli_free_result($res);
45				}
46			} while (mysqli_more_results($link) && mysqli_next_result($link));
47
48		} else {
49			printf("[004] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
50		}
51
52		if (mysqli_multi_query($link, 'CALL p()')) {
53			do {
54				if ($res = mysqli_store_result($link)) {
55					// fetch all results from server, but skip on client side
56					var_dump(mysqli_fetch_assoc($res));
57					while (mysqli_fetch_assoc($res))
58						;
59					mysqli_free_result($res);
60				}
61			} while (mysqli_more_results($link) && mysqli_next_result($link));
62
63		} else {
64			printf("[005] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
65		}
66
67	} else {
68		printf("[002] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
69	}
70
71	if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
72		printf("[006] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
73
74	if (mysqli_query($link, 'CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id, label FROM test ORDER BY id ASC; SELECT id FROM test ORDER BY id ASC; END;')) {
75		/* stored proc which returns two result sets */
76
77		if (mysqli_multi_query($link, 'CALL p()')) {
78			do {
79				if ($res = mysqli_store_result($link)) {
80					// fetch all results from server, but skip on client side
81					var_dump(mysqli_fetch_assoc($res));
82					mysqli_free_result($res);
83				}
84			} while (mysqli_more_results($link) && mysqli_next_result($link));
85
86		} else {
87			printf("[008] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
88		}
89
90	} else {
91		printf("[007] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
92	}
93
94	if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
95		printf("[009] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
96
97	if (mysqli_real_query($link, 'CREATE PROCEDURE p(OUT ver_param VARCHAR(25)) BEGIN SELECT VERSION() INTO ver_param; END;')) {
98		/* no result set, just output parameter */
99		if (!mysqli_query($link, 'CALL p(@version)'))
100			printf("[011] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
101
102		if (!mysqli_query($link, "SET @version = 'unknown'"))
103			printf("[012] Cannot reset user variable, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
104
105		if (!mysqli_query($link, 'CALL p(@version)'))
106			printf("[013] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
107
108		if (!$res = mysqli_query($link, 'SELECT @version as _vers'))
109			printf("[014] Cannot fetch user variable, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
110
111		if (!$row = mysqli_fetch_assoc($res) ||
112				$row['_vers'] == 'unknown')
113			printf("[015] Results seem wrong, got %s, [%d] %s\n",
114				$row['_vers'],
115				mysqli_errno($link), mysqli_error($link));
116		mysqli_free_result($res);
117
118	} else {
119		printf("[010] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
120	}
121
122	if (!mysqli_query($link, 'DROP PROCEDURE IF EXISTS p'))
123		printf("[016] [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
124
125	if (mysqli_real_query($link, 'CREATE PROCEDURE p(IN ver_in VARCHAR(25), OUT ver_out VARCHAR(25)) BEGIN SELECT ver_in INTO ver_out; END;')) {
126		/* no result set, one input, one output parameter */
127		if (!mysqli_query($link, "CALL p('myversion', @version)"))
128			printf("[018] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
129
130		if (!mysqli_query($link, "SET @version = 'unknown'"))
131			printf("[019] Cannot reset user variable, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
132
133		if (!mysqli_query($link, "CALL p('myversion', @version)"))
134			printf("[020] Cannot call SP, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
135
136		if (!$res = mysqli_query($link, 'SELECT @version as _vers'))
137			printf("[021] Cannot fetch user variable, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
138
139		if (!$row = mysqli_fetch_assoc($res) ||
140				$row['_vers'] == 'myversion')
141			printf("[022] Results seem wrong, got %s, [%d] %s\n",
142				$row['_vers'],
143				mysqli_errno($link), mysqli_error($link));
144		mysqli_free_result($res);
145
146	} else {
147		printf("[017] Cannot create SP, [%d] %s.\n", mysqli_errno($link), mysqli_error($link));
148	}
149
150	mysqli_close($link);
151	print "done!";
152?>
153--CLEAN--
154<?php
155require_once("connect.inc");
156if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
157   printf("[c001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
158
159if (!mysqli_query($link, "DROP TABLE IF EXISTS test"))
160	printf("[c002] Cannot drop table, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
161
162@mysqli_query($link, "DROP PROCEDURE IS EXISTS p");
163
164mysqli_close($link);
165?>
166--EXPECTF--
167array(2) {
168  [%u|b%"id"]=>
169  %unicode|string%(1) "1"
170  [%u|b%"label"]=>
171  %unicode|string%(1) "a"
172}
173array(2) {
174  [%u|b%"id"]=>
175  %unicode|string%(1) "1"
176  [%u|b%"label"]=>
177  %unicode|string%(1) "a"
178}
179array(2) {
180  [%u|b%"id"]=>
181  %unicode|string%(1) "1"
182  [%u|b%"label"]=>
183  %unicode|string%(1) "a"
184}
185array(2) {
186  [%u|b%"id"]=>
187  %unicode|string%(1) "1"
188  [%u|b%"label"]=>
189  %unicode|string%(1) "a"
190}
191array(1) {
192  [%u|b%"id"]=>
193  %unicode|string%(1) "1"
194}
195done!