Annotation of embedaddon/php/ext/mysqli/tests/mysqli_stmt_bind_result_format.phpt, revision 1.1.1.1
1.1 misho 1: --TEST--
2: Playing with SELECT FORMAT(...) AS _format - see also bugs.php.net/42378
3: --SKIPIF--
4: <?php
5: require_once('skipif.inc');
6: require_once('skipifemb.inc');
7: require_once('skipifconnectfailure.inc');
8: ?>
9: --INI--
10: memory_limit=83886080
11: --FILE--
12: <?php
13: require_once("connect.inc");
14:
15: function create_table($link, $column, $min, $max, $engine, $offset) {
16:
17: if (!mysqli_query($link, 'DROP TABLE IF EXISTS test')) {
18: printf("[%03d] Cannot drop table test, [%d] %s\n",
19: $offset,
20: mysqli_errno($link), mysqli_error($link));
21: return array();
22: }
23:
24: $sql = sprintf("CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, col1 %s) ENGINE=%s",
25: $column, $engine);
26: if (!mysqli_query($link, $sql)) {
27: printf("[%03d] Cannot create table test, [%d] %s\n",
28: $offset + 1,
29: mysqli_errno($link), mysqli_error($link));
30: return array();
31: }
32:
33: $values = array();
34: for ($i = 1; $i <= 100; $i++) {
35: $col1 = mt_rand($min, $max);
36: $values[$i] = $col1;
37: $sql = sprintf("INSERT INTO test(id, col1) VALUES (%d, %f)",
38: $i, $col1);
39: if (!mysqli_query($link, $sql)) {
40: printf("[%03d] Cannot insert data, [%d] %s\n",
41: $offset + 2,
42: mysqli_errno($link), mysqli_error($link));
43: return array();
44: }
45: }
46:
47: return $values;
48: }
49:
50: function test_format($link, $format, $from, $order_by, $expected, $offset) {
51:
52: if (!$stmt = mysqli_stmt_init($link)) {
53: printf("[%03d] Cannot create PS, [%d] %s\n",
54: $offset,
55: mysqli_errno($link), mysqli_error($link));
56: return false;
57: }
58:
59: if ($order_by)
60: $sql = sprintf('SELECT %s AS _format FROM %s ORDER BY %s', $format, $from, $order_by);
61: else
62: $sql = sprintf('SELECT %s AS _format FROM %s', $format, $from);
63:
64: if (!mysqli_stmt_prepare($stmt, $sql)) {
65: printf("[%03d] Cannot prepare PS, [%d] %s\n",
66: $offset + 1,
67: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
68: return false;
69: }
70:
71: if (!mysqli_stmt_execute($stmt)) {
72: printf("[%03d] Cannot execute PS, [%d] %s\n",
73: $offset + 2,
74: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
75: return false;
76: }
77:
78: if (!mysqli_stmt_store_result($stmt)) {
79: printf("[%03d] Cannot store result set, [%d] %s\n",
80: $offset + 3,
81: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
82: return false;
83: }
84:
85: if (!is_array($expected)) {
86:
87: $result = null;
88: if (!mysqli_stmt_bind_result($stmt, $result)) {
89: printf("[%03d] Cannot bind result, [%d] %s\n",
90: $offset + 4,
91: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
92: return false;
93: }
94:
95: if (!mysqli_stmt_fetch($stmt)) {
96: printf("[%03d] Cannot fetch result,, [%d] %s\n",
97: $offset + 5,
98: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
99: return false;
100: }
101:
102: if ($result !== $expected) {
103: printf("[%03d] Expecting %s/%s got %s/%s with %s - %s.\n",
104: $offset + 6,
105: gettype($expected), $expected,
106: gettype($result), $result,
107: $format, $sql);
108: }
109:
110: } else {
111:
112: $order_by_col = $result = null;
113: if (!mysqli_stmt_bind_result($stmt, $order_by_col, $result)) {
114: printf("[%03d] Cannot bind result, [%d] %s\n",
115: $offset + 7,
116: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
117: return false;
118: }
119:
120: reset($expected);
121: while ((list($k, $v) = each($expected)) && mysqli_stmt_fetch($stmt)) {
122: if ($result !== $v) {
123: printf("[%03d] Row %d - expecting %s/%s got %s/%s [%s] with %s - %s.\n",
124: $offset + 8,
125: $k,
126: gettype($v), $v,
127: gettype($result), $result,
128: $order_by_col,
129: $format, $sql);
130: }
131: }
132:
133: }
134:
135: mysqli_stmt_free_result($stmt);
136: mysqli_stmt_close($stmt);
137:
138: return true;
139: }
140:
141: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
142: printf("[001] Cannot connect - [%d] %s\n",
143: mysqli_connect_errno(),
144: mysqli_connect_error());
145:
146: /* select from dual - pseudo table */
147: test_format($link, 'FORMAT(1.01, 0)', 'DUAL', null, '1', 10);
148: test_format($link, 'FORMAT(1.23, 1)', 'DUAL', null, '1.2', 20);
149: test_format($link, 'FORMAT(1.23, 2)', 'DUAL', null, '1.23', 30);
150: test_format($link, 'FORMAT(1234.567, 3)', 'DUAL', null, '1,234.567', 40);
151: /* no typo! */
152: test_format($link, 'FORMAT(1234.567, 4)', 'DUAL', null, '1,234.5670', 50);
153:
154: mysqli_close($link);
155: require_once('table.inc');
156:
157: /* select from existing table */
158: test_format($link, 'FORMAT(id, 0)', 'test', null, '1', 60);
159: test_format($link, 'FORMAT(id + 0.1, 1)', 'test', null, '1.1', 70);
160: test_format($link, 'FORMAT(id + 0.01, 2)', 'test', null, '1.01', 80);
161:
162: /* create new table and select from it */
163: $expected = create_table($link, 'FLOAT', -10000, 10000, $engine, 90);
164: foreach ($expected as $k => $v)
165: $expected[$k] = number_format(round($v), 0, '.', ',');
166: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 100);
167:
168: $expected = create_table($link, 'FLOAT UNSIGNED', 0, 10000, $engine, 110);
169: foreach ($expected as $k => $v)
170: $expected[$k] = number_format(round($v), 0, '.', ',');
171: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 120);
172:
173: $expected = create_table($link, 'TINYINT', -128, 127, $engine, 130);
174: foreach ($expected as $k => $v)
175: $expected[$k] = number_format(round($v), 0, '.', ',');
176: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 140);
177:
178: $expected = create_table($link, 'SMALLINT UNSIGNED', 0, 65535, $engine, 150);
179: foreach ($expected as $k => $v)
180: $expected[$k] = number_format(round($v), 0, '.', ',');
181: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 160);
182:
183: $expected = create_table($link, 'MEDIUMINT', 0, 8388607, $engine, 170);
184: foreach ($expected as $k => $v)
185: $expected[$k] = number_format(round($v), 0, '.', ',');
186: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 180);
187:
188: $expected = create_table($link, 'INT UNSIGNED', 0, 1000, $engine, 190);
189: foreach ($expected as $k => $v)
190: $expected[$k] = number_format(round($v), 0, '.', ',');
191: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 200);
192:
193: $expected = create_table($link, 'BIGINT', -1000, 1000, $engine, 210);
194: foreach ($expected as $k => $v)
195: $expected[$k] = number_format(round($v), 0, '.', ',');
196: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 220);
197:
198: $expected = create_table($link, 'DECIMAL(5,0)', -1000, 1000, $engine, 230);
199: foreach ($expected as $k => $v)
200: $expected[$k] = number_format(round($v), 0, '.', ',');
201: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 240);
202:
203: // http://bugs.php.net/bug.php?id=42378
204: if (!mysqli_query($link, "DROP TABLE IF EXISTS test")) {
205: printf("[300] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
206: }
207:
208: if (mysqli_query($link, "CREATE TABLE `test` (
209: `targetport` int(11) NOT NULL default '0',
210: `sources` double(17,4) default NULL,
211: `current_sources` double(17,0) default NULL,
212: `reports` double(17,4) default NULL,
213: `current_reports` double(17,0) default NULL,
214: `targets` double(17,4) default NULL,
215: `current_targets` double(17,0) default NULL,
216: `maxsources` int(11) default NULL,
217: `maxtargets` int(11) default NULL,
218: `maxreports` int(11) default NULL,
219: `trend` float default NULL,
220: PRIMARY KEY (`targetport`)
221: ) ENGINE=InnoDB DEFAULT CHARSET=latin1")) {
222:
223: do {
224: $values = array();
225: for ($i = 0; $i < 200; $i++) {
226: $current_targets = mt_rand(-100000, 100000) / 10;
227: do {
228: $trend = (mt_rand(0, 3) > 1) ? (mt_rand(-10000, 10000) / 100) : 'NULL';
229: } while (isset($values[$trend]));
230:
231: $sql = sprintf('INSERT INTO test(targetport, current_targets, maxreports, trend) VALUES (%d, %f, %s, %s)',
232: $i,
233: $current_targets,
234: (mt_rand(0, 1) > 0) ? mt_rand(0, 1000) : 'NULL',
235: $trend);
236: if (!mysqli_query($link, $sql)) {
237: printf("[301] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
238: break 2;
239: }
240: if ($current_targets > 0 && $trend != 'NULL')
241: $values[$trend] = $i;
242: }
243: krsort($values);
244:
245: if (!$stmt = mysqli_stmt_init($link)) {
246: printf("[302] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
247: break;
248: }
249:
250: if (!mysqli_stmt_prepare($stmt, 'SELECT trend, targetport, FORMAT(trend, 2) FROM test WHERE current_targets > 0 AND trend IS NOT NULL ORDER BY trend DESC LIMIT 100')) {
251: printf("[303] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
252: break;
253: }
254:
255: if (!mysqli_stmt_execute($stmt)) {
256: printf("[304] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
257: break;
258: }
259:
260: if (!mysqli_stmt_store_result($stmt)) {
261: printf("[305] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
262: break;
263: }
264:
265: $trend = $targetport = $format = null;
266: if (!mysqli_stmt_bind_result($stmt, $trend, $targetport, $format)) {
267:
268: printf("[305] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
269: break;
270: }
271:
272: reset($values);
273: while (mysqli_stmt_fetch($stmt)) {
274: list($exp_trend, $exp_targetport) = each($values);
275: if ($targetport != $exp_targetport) {
276: printf("[306] Values fetched from MySQL seem to be wrong, check manually\n");
277: printf("%s/%s - %s/%s - '%s'\n", $trend, $exp_trend, $targetport, $exp_targetport, $format);
278: }
279: }
280: mysqli_stmt_free_result($stmt);
281: mysqli_stmt_close($stmt);
282:
283: // same but OO interface
284: if (!$stmt = mysqli_stmt_init($link)) {
285: printf("[307] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
286: break;
287: }
288:
289: if (!$stmt->prepare('SELECT trend, targetport, FORMAT(trend, 2) FROM test WHERE current_targets > 0 AND trend IS NOT NULL ORDER BY trend DESC LIMIT 100')) {
290: printf("[308] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
291: break;
292: }
293:
294: if (!$stmt->execute()) {
295: printf("[309] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
296: break;
297: }
298:
299: if (!$stmt->store_result()) {
300: printf("[310] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
301: break;
302: }
303:
304: $trend = $targetport = $format = null;
305: if (!$stmt->bind_result($trend, $targetport, $format)) {
306:
307: printf("[311] [%d] %s\n", mysqli_stmt_errno($link), mysqli_stmt_error($link));
308: break;
309: }
310:
311: reset($values);
312: while ($stmt->fetch()) {
313: list($exp_trend, $exp_targetport) = each($values);
314: if ($targetport != $exp_targetport) {
315: printf("[312] Values fetched from MySQL seem to be wrong, check manually\n");
316: printf("%s/%s - %s/%s - '%s'\n", $trend, $exp_trend, $targetport, $exp_targetport, $format);
317: }
318: }
319: $stmt->free_result();
320: $stmt->close();
321:
322: } while (false);
323:
324: } else {
325: var_dump(mysqli_error($link));
326: }
327:
328:
329: mysqli_close($link);
330: print "done!";
331: ?>
332: --CLEAN--
333: <?php
334: require_once("clean_table.inc");
335: ?>
336: --EXPECTF--
337: done!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>