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>