Annotation of embedaddon/php/ext/pdo_mysql/tests/pdo_mysql_stmt_variable_columncount.phpt, revision 1.1.1.1

1.1       misho       1: --TEST--
                      2: MySQL Prepared Statements and different column counts
                      3: --SKIPIF--
                      4: <?php
                      5: require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
                      6: require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
                      7: MySQLPDOTest::skip();
                      8: $db = MySQLPDOTest::factory();
                      9: 
                     10: $row = $db->query('SELECT VERSION() as _version')->fetch(PDO::FETCH_ASSOC);
                     11: $matches = array();
                     12: if (!preg_match('/^(\d+)\.(\d+)\.(\d+)/ismU', $row['_version'], $matches))
                     13:        die(sprintf("skip Cannot determine MySQL Server version\n"));
                     14: 
                     15: $version = $matches[0] * 10000 + $matches[1] * 100 + $matches[2];
                     16: if ($version < 50000)
                     17:        die(sprintf("skip Need MySQL Server 5.0.0+, found %d.%02d.%02d (%d)\n",
                     18:                $matches[0], $matches[1], $matches[2], $version));
                     19: ?>
                     20: --FILE--
                     21: <?php
                     22:        require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
                     23:        $db = MySQLPDOTest::factory();
                     24: 
                     25:        function check_result($offset, $stmt, $columns) {
                     26: 
                     27:                do {
                     28:                                $row = $stmt->fetch(PDO::FETCH_ASSOC);
                     29:                } while ($stmt->nextRowSet());
                     30: 
                     31:                if (!isset($row['one']) || ($row['one'] != 1)) {
                     32:                                printf("[%03d + 1] Expecting array('one' => 1), got %s\n", $offset, var_export($row, true));
                     33:                                return false;
                     34:                }
                     35: 
                     36:                if (($columns == 2) &&
                     37:                        (!isset($row['two']) || ($row['two'] != 2))) {
                     38:                                printf("[%03d + 2] Expecting array('one' => 1, 'two' => 2), got %s\n", $offset, var_export($row, true));
                     39:                                return false;
                     40:                } else if (($columns == 1) && isset($row['two'])) {
                     41:                                printf("[%03d + 3] Expecting one array element got two\n", $offset);
                     42:                                return false;
                     43:                }
                     44: 
                     45:                return true;
                     46:        }
                     47: 
                     48:        try {
                     49: 
                     50:                // What will happen if a PS returns a differen number of result set column upon each execution?
                     51:                // Lets try with a SP accepting parameters...
                     52:                $db->exec('DROP PROCEDURE IF EXISTS p');
                     53:                $db->exec('CREATE PROCEDURE p(IN cols INT) BEGIN IF cols < 2 THEN SELECT cols AS "one"; ELSE SELECT 1 AS "one", cols AS "two"; END IF; END;');
                     54: 
                     55:                // Emulates PS first
                     56:                $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
                     57:                $stmt = $db->prepare('CALL p(?)');
                     58: 
                     59:                $columns = null;
                     60:                $stmt->bindParam(1, $columns);
                     61:                for ($i = 0; $i < 5; $i++) {
                     62:                        $columns = ($i % 2) + 1;
                     63:                        $stmt->execute();
                     64:                        check_result($i, $stmt, $columns);
                     65:                }
                     66: 
                     67:                if (MySQLPDOTest::isPDOMySQLnd()) {
                     68:                        // Native PS
                     69:                        // Libmysql cannot handle such a stored procedure. You will see leaks with libmysql
                     70:                        $db = MySQLPDOTest::factory();
                     71:                        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
                     72:                        $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
                     73:                        $stmt = $db->prepare('CALL p(?)');
                     74:                        $stmt->bindParam(1, $columns);
                     75:                        for ($i = 5; $i < 10; $i++) {
                     76:                                $columns = ($i % 2) + 1;
                     77:                                $stmt->execute();
                     78:                                check_result($i, $stmt, $columns);
                     79:                        }
                     80:                }
                     81: 
                     82:                // And now without parameters... - this gives a different control flow inside PDO
                     83:                $db->exec('DROP PROCEDURE IF EXISTS p');
                     84:                $db->exec('CREATE PROCEDURE p() BEGIN DECLARE cols INT; SELECT @numcols INTO cols; IF cols < 2 THEN SET @numcols = 2; SELECT cols AS "one"; ELSE SET @numcols = 1; SELECT 1 AS "one", cols AS "two"; END IF; END;');
                     85: 
                     86:                                // Emulates PS first
                     87:                $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
                     88:                $db->exec('SET @numcols = 1');
                     89:                $stmt = $db->prepare('CALL p()');
                     90:                $stmt->execute();
                     91:                check_result(11, $stmt, 1);
                     92:                $stmt->execute();
                     93:                check_result(12, $stmt, 2);
                     94:                $db->exec('SET @numcols = 1');
                     95:                $stmt->execute();
                     96:                check_result(13, $stmt, 1);
                     97: 
                     98:                if (MySQLPDOTest::isPDOMySQLnd()) {
                     99:                        // Native PS
                    100:                        // Libmysql cannot handle such a stored procedure. You will see leaks with libmysql
                    101:                        $db = MySQLPDOTest::factory();
                    102:                        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
                    103:                        $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 1);
                    104:                        $db->exec('SET @numcols = 1');
                    105:                        $stmt = $db->prepare('CALL p()');
                    106:                        $stmt->execute();
                    107:                        check_result(14, $stmt, 1);
                    108:                        $stmt->execute();
                    109:                        check_result(15, $stmt, 2);
                    110:                        $db->exec('SET @numcols = 1');
                    111:                        $stmt->execute();
                    112:                        check_result(16, $stmt, 1);
                    113:                }
                    114: 
                    115:        } catch (PDOException $e) {
                    116:                printf("[99] %s [%s] %s\n",
                    117:                        $e->getMessage(), $db->errorCode(), implode(' ', $db->errorInfo()));
                    118:        }
                    119: 
                    120:        print "done!";
                    121: ?>
                    122: --EXPECTF--
                    123: done!

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>