Annotation of embedaddon/php/ext/mysqli/tests/bug42378.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: Bug #42378 (bind_result memory exhaustion, SELECT column, FORMAT(...) AS _format)
! 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: print "$column\n";
! 24:
! 25: $sql = sprintf("CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, col1 %s) ENGINE=%s",
! 26: $column, $engine);
! 27: if (!mysqli_query($link, $sql)) {
! 28: printf("[%03d] Cannot create table test, [%d] %s\n",
! 29: $offset + 1,
! 30: mysqli_errno($link), mysqli_error($link));
! 31: return array();
! 32: }
! 33:
! 34: $values = array();
! 35: for ($i = 1; $i <= 100; $i++) {
! 36: $col1 = mt_rand($min, $max);
! 37: $values[$i] = $col1;
! 38: $sql = sprintf("INSERT INTO test(id, col1) VALUES (%d, %f)",
! 39: $i, $col1);
! 40: if (!mysqli_query($link, $sql)) {
! 41: printf("[%03d] Cannot insert data, [%d] %s\n",
! 42: $offset + 2,
! 43: mysqli_errno($link), mysqli_error($link));
! 44: return array();
! 45: }
! 46: }
! 47:
! 48: return $values;
! 49: }
! 50:
! 51: function test_format($link, $format, $from, $order_by, $expected, $offset) {
! 52:
! 53: if (!$stmt = mysqli_stmt_init($link)) {
! 54: printf("[%03d] Cannot create PS, [%d] %s\n",
! 55: $offset,
! 56: mysqli_errno($link), mysqli_error($link));
! 57: return false;
! 58: }
! 59: print "$format\n";
! 60:
! 61: if ($order_by)
! 62: $sql = sprintf('SELECT %s AS _format FROM %s ORDER BY %s', $format, $from, $order_by);
! 63: else
! 64: $sql = sprintf('SELECT %s AS _format FROM %s', $format, $from);
! 65:
! 66: if (!mysqli_stmt_prepare($stmt, $sql)) {
! 67: printf("[%03d] Cannot prepare PS, [%d] %s\n",
! 68: $offset + 1,
! 69: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 70: return false;
! 71: }
! 72:
! 73: if (!mysqli_stmt_execute($stmt)) {
! 74: printf("[%03d] Cannot execute PS, [%d] %s\n",
! 75: $offset + 2,
! 76: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 77: return false;
! 78: }
! 79:
! 80: if (!mysqli_stmt_store_result($stmt)) {
! 81: printf("[%03d] Cannot store result set, [%d] %s\n",
! 82: $offset + 3,
! 83: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 84: return false;
! 85: }
! 86:
! 87: if (!is_array($expected)) {
! 88:
! 89: $result = null;
! 90: if (!mysqli_stmt_bind_result($stmt, $result)) {
! 91: printf("[%03d] Cannot bind result, [%d] %s\n",
! 92: $offset + 4,
! 93: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 94: return false;
! 95: }
! 96:
! 97: if (!mysqli_stmt_fetch($stmt)) {
! 98: printf("[%03d] Cannot fetch result,, [%d] %s\n",
! 99: $offset + 5,
! 100: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 101: return false;
! 102: }
! 103:
! 104: if ($result !== $expected) {
! 105: printf("[%03d] Expecting %s/%s got %s/%s with %s - %s.\n",
! 106: $offset + 6,
! 107: gettype($expected), $expected,
! 108: gettype($result), $result,
! 109: $format, $sql);
! 110: }
! 111:
! 112: } else {
! 113:
! 114: $order_by_col = $result = null;
! 115: if (!is_null($order_by)) {
! 116: if (!mysqli_stmt_bind_result($stmt, $order_by_col, $result)) {
! 117: printf("[%03d] Cannot bind result, [%d] %s\n",
! 118: $offset + 7,
! 119: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 120: return false;
! 121: }
! 122: } else {
! 123: if (!mysqli_stmt_bind_result($stmt, $result)) {
! 124: printf("[%03d] Cannot bind result, [%d] %s\n",
! 125: $offset + 7,
! 126: mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
! 127: return false;
! 128: }
! 129: }
! 130:
! 131: if (!empty($expected))
! 132: reset($expected);
! 133: while ((list($k, $v) = each($expected)) && mysqli_stmt_fetch($stmt)) {
! 134: if (!empty($expected)) {
! 135: if ($result !== $v) {
! 136: printf("[%03d] Row %d - expecting %s/%s got %s/%s [%s] with %s - %s.\n",
! 137: $offset + 8,
! 138: $k,
! 139: gettype($v), $v,
! 140: gettype($result), $result,
! 141: $order_by_col,
! 142: $format, $sql);
! 143: }
! 144: }
! 145: }
! 146:
! 147: }
! 148:
! 149: mysqli_stmt_free_result($stmt);
! 150: mysqli_stmt_close($stmt);
! 151:
! 152: return true;
! 153: }
! 154:
! 155: if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
! 156: printf("[001] Cannot connect - [%d] %s\n",
! 157: mysqli_connect_errno(),
! 158: mysqli_connect_error());
! 159:
! 160: /* create new table and select from it */
! 161: $expected = create_table($link, 'FLOAT', -10000, 10000, $engine, 90);
! 162: foreach ($expected as $k => $v)
! 163: $expected[$k] = number_format(round($v), 0, '.', ',');
! 164: test_format($link, 'FORMAT(col1, 0)', 'test', NULL, array(), 100);
! 165:
! 166: $expected = create_table($link, 'FLOAT', -10000, 10000, $engine, 110);
! 167: foreach ($expected as $k => $v)
! 168: $expected[$k] = number_format(round($v), 0, '.', ',');
! 169: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 120);
! 170:
! 171: $expected = create_table($link, 'FLOAT UNSIGNED', 0, 10000, $engine, 130);
! 172: foreach ($expected as $k => $v)
! 173: $expected[$k] = number_format(round($v), 0, '.', ',');
! 174: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 140);
! 175:
! 176: $expected = create_table($link, 'DECIMAL(5,0)', -1000, 1000, $engine, 150);
! 177: foreach ($expected as $k => $v)
! 178: $expected[$k] = number_format(round($v), 0, '.', ',');
! 179: test_format($link, 'id AS order_by_col, FORMAT(col1, 0)', 'test', 'id', $expected, 160);
! 180:
! 181: mysqli_close($link);
! 182: print "done!";
! 183: ?>
! 184: --CLEAN--
! 185: <?php
! 186: require_once("clean_table.inc");
! 187: ?>
! 188: --EXPECTF--
! 189: FLOAT
! 190: FORMAT(col1, 0)
! 191: FLOAT
! 192: id AS order_by_col, FORMAT(col1, 0)
! 193: FLOAT UNSIGNED
! 194: id AS order_by_col, FORMAT(col1, 0)
! 195: DECIMAL(5,0)
! 196: id AS order_by_col, FORMAT(col1, 0)
! 197: done!
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>