Annotation of embedaddon/php/ext/mysqli/tests/bug42378.phpt, revision 1.1.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>