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

1.1       misho       1: --TEST--
                      2: MySQL PDO->exec(), affected rows
                      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: ?>
                      9: --FILE--
                     10: <?php
                     11:        function exec_and_count($offset, &$db, $sql, $exp = NULL) {
                     12: 
                     13:                try {
                     14: 
                     15:                        $ret = $db->exec($sql);
                     16:                        if (!is_null($exp) && ($ret !== $exp)) {
                     17:                                printf("[%03d] Expecting '%s'/%s got '%s'/%s when running '%s', [%s] %s\n",
                     18:                                        $offset, $exp, gettype($exp), $ret, gettype($ret), $sql,
                     19:                                        $db->errorCode(), implode(' ', $db->errorInfo()));
                     20:                                return false;
                     21:                        }
                     22: 
                     23:                } catch (PDOException $e) {
                     24:                        printf("[%03d] '%s' has failed, [%s] %s\n",
                     25:                                $offset, $sql, $db->errorCode(), implode(' ', $db->errorInfo()));
                     26:                        return false;
                     27:                }
                     28: 
                     29:                return true;
                     30:        }
                     31: 
                     32:        require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
                     33:        $db = MySQLPDOTest::factory();
                     34:        MySQLPDOTest::createTestTable($db, MySQLPDOTest::detect_transactional_mysql_engine($db));
                     35: 
                     36:        /* affected rows related */
                     37:        try {
                     38: 
                     39:                exec_and_count(2, $db, 'DROP TABLE IF EXISTS test', 0);
                     40:                exec_and_count(3, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0);
                     41:                exec_and_count(4, $db, "INSERT INTO test(id, col1) VALUES (1, 'a')", 1);
                     42:                exec_and_count(5, $db, "INSERT INTO test(id, col1) VALUES (2, 'b'), (3, 'c')", 2);
                     43:                exec_and_count(6, $db, "UPDATE test SET id = 4 WHERE id = 3", 1);
                     44:                exec_and_count(7, $db, "INSERT INTO test(id, col1) VALUES (1, 'd') ON DUPLICATE KEY UPDATE id = 3", 2);
                     45:                exec_and_count(8, $db, "UPDATE test SET id = 5 WHERE id = 5", 0);
                     46:                exec_and_count(9, $db, "INSERT INTO test(id, col1) VALUES (5, 'e') ON DUPLICATE KEY UPDATE id = 6", 1);
                     47:                exec_and_count(10, $db, "REPLACE INTO test(id, col1) VALUES (5, 'f')", 2);
                     48:                exec_and_count(11, $db, "REPLACE INTO test(id, col1) VALUES (6, 'g')", 1);
                     49:                exec_and_count(12, $db, 'DELETE FROM test WHERE id > 2', 4);
                     50:                exec_and_count(13, $db, 'DROP TABLE test', 0);
                     51:                exec_and_count(14, $db, 'SET @myvar = 1', 0);
                     52: 
                     53:                exec_and_count(15, $db, 'THIS IS NOT VALID SQL, I HOPE', false);
                     54:                printf("[016] [%s] %s\n", $db->errorCode(), implode(' ', $db->errorInfo()));
                     55: 
                     56:                exec_and_count(36, $db, sprintf('CREATE TABLE test(id INT NOT NULL PRIMARY KEY, col1 CHAR(10)) ENGINE=%s', PDO_MYSQL_TEST_ENGINE), 0);
                     57:                exec_and_count(37, $db, "INSERT INTO test(id, col1) VALUES (1, 'a')", 1);
                     58:                // Results may vary. Typically you will get 1. But the MySQL 5.1 manual states: Truncation operations do not return the number of deleted rows.
                     59:                // Don't rely on any return value!
                     60:                exec_and_count(38, $db, 'TRUNCATE TABLE test', NULL);
                     61: 
                     62:        } catch (PDOException $e) {
                     63:                printf("[001] %s, [%s] %s\n",
                     64:                        $e->getMessage(),
                     65:                        $db->errorCode(), implode(' ', $db->errorInfo()));
                     66:        }
                     67: 
                     68: 
                     69:        /* CREATE, DROP, CALL SP and SF */
                     70:        if (MySQLPDOTest::getServerVersion($db) > 50000) {
                     71:                // let's try to play with stored procedures
                     72:                try {
                     73:                        $ignore_exception = true;
                     74:                        exec_and_count(18, $db, 'DROP PROCEDURE IF EXISTS p', 0);
                     75:                        exec_and_count(19, $db, 'CREATE PROCEDURE p(OUT ver_param VARCHAR(255)) BEGIN SELECT VERSION() INTO ver_param; END;', 0);
                     76:                        // we got this far without problems. If there's an issue from now on, its a failure
                     77:                        $ignore_exception = false;
                     78:                        exec_and_count(20, $db, 'CALL p(@version)', 0);
                     79:                        $stmt = $db->query('SELECT @version AS p_version');
                     80:                        $tmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
                     81:                        if (count($tmp) > 1 || !isset($tmp[0]['p_version'])) {
                     82:                                printf("[022] Data seems wrong, dumping\n");
                     83:                                var_dump($tmp);
                     84:                        } else {
                     85:                                $p_version = $tmp[0]['p_version'];
                     86:                        }
                     87: 
                     88:                        $stmt = $db->query('SELECT VERSION() AS _version');
                     89:                        $tmp  = $stmt->fetchAll(PDO::FETCH_ASSOC);
                     90:                        if (count($tmp) > 1 || !isset($tmp[0]['_version'])) {
                     91:                                printf("[023] Data seems wrong, dumping\n");
                     92:                                var_dump($tmp);
                     93:                        } else {
                     94:                                if ($p_version !== $tmp[0]['_version']) {
                     95:                                        printf("[024] Found different version strings, SP returned '%s'/%s, SELECT returned '%s'/%s\n",
                     96:                                                $p_version, gettype($p_version),
                     97:                                                $tmp[0]['_version'], gettype($tmp[0]['_version']));
                     98:                                }
                     99:                        }
                    100:                        exec_and_count(25, $db, 'DROP PROCEDURE IF EXISTS p', 0);
                    101: 
                    102:                } catch (PDOException $e) {
                    103:                        // ignore it, we might not have sufficient permissions
                    104:                        if (!$ignore_exception)
                    105:                                printf("[021] %s, [%s] %s\n",
                    106:                                        $e->getMessage(),
                    107:                                        $db->errorCode(), implode(' ', $db->errorInfo()));
                    108:                }
                    109: 
                    110:                // stored function
                    111:                try {
                    112:                        $ignore_exception = true;
                    113:                        exec_and_count(27, $db, 'DROP FUNCTION IF EXISTS f', 0);
                    114:                        exec_and_count(28, $db, 'CREATE FUNCTION f( ver_param VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC RETURN ver_param;', 0);
                    115:                        // we got this far without problems. If there's an issue from now on, its a failure
                    116:                        $ignore_exception = false;
                    117:                        $stmt = $db->query('SELECT f(VERSION()) AS f_version');
                    118:                        $tmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    119:                        if (count($tmp) > 1 || !isset($tmp[0]['f_version'])) {
                    120:                                printf("[029] Data seems wrong, dumping\n");
                    121:                                var_dump($tmp);
                    122:                        } else {
                    123:                                $f_version = $tmp[0]['f_version'];
                    124:                        }
                    125:                        $stmt = $db->query('SELECT VERSION() AS _version');
                    126:                        $tmp  = $stmt->fetchAll(PDO::FETCH_ASSOC);
                    127:                        if (count($tmp) > 1 || !isset($tmp[0]['_version'])) {
                    128:                                printf("[030] Data seems wrong, dumping\n");
                    129:                                var_dump($tmp);
                    130:                        } else {
                    131:                                if ($f_version !== $tmp[0]['_version']) {
                    132:                                        printf("[031] Found different version strings, SF returned '%s'/%s, SELECT returned '%s'/%s\n",
                    133:                                                $f_version, gettype($f_version),
                    134:                                                $tmp[0]['_version'], gettype($tmp[0]['_version']));
                    135:                                }
                    136:                        }
                    137:                        exec_and_count(32, $db, 'DROP FUNCTION IF EXISTS f', 0);
                    138: 
                    139:                } catch (PDOException $e) {
                    140:                        // ignore it, we might not have sufficient permissions
                    141:                        if (!$ignore_exception)
                    142:                                printf("[026] %s, [%s] %s\n",
                    143:                                        $e->getMessage(),
                    144:                                        $db->errorCode(), implode(' ', $db->errorInfo()));
                    145:                }
                    146:        }
                    147: 
                    148:        // multi query
                    149:        try {
                    150: 
                    151:                $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
                    152:                $exp = 0;
                    153: 
                    154:                $tmp = @$db->exec(sprintf('DROP TABLE IF EXISTS test; CREATE TABLE test(id INT) ENGINE=%s', PDO_MYSQL_TEST_ENGINE));
                    155:                if ($exp !== $tmp)
                    156:                        printf("[034] Expecting %s/%s got %s/%s, [%s] %s\n",
                    157:                                $exp, gettype($exp),
                    158:                                $tmp, gettype($tmp),
                    159:                                $db->errorCode(), var_export($db->errorInfo(), true));
                    160: 
                    161:                // this is interesting: if we get sort of affected rows, what will happen now?
                    162:                $tmp = @$db->exec('INSERT INTO test(id) VALUES (1); INSERT INTO test(id) VALUES (2)');
                    163:                printf("[035] With emulated PS it works but makes no sense given that exec() returns sort of affected rows...\n");
                    164: 
                    165: 
                    166:        } catch (PDOException $e) {
                    167:                printf("[033] %s, [%s] %s\n",
                    168:                        $e->getMessage(),
                    169:                        $db->errorCode(), implode(' ', $db->errorInfo()));
                    170:        }
                    171:        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
                    172: 
                    173:        print "done!";
                    174: ?>
                    175: --CLEAN--
                    176: <?php
                    177: require dirname(__FILE__) . '/mysql_pdo_test.inc';
                    178: $db = MySQLPDOTest::factory();
                    179: @$db->exec('DROP TABLE IF EXISTS test');
                    180: ?>
                    181: --EXPECTF--
                    182: Warning: PDO::exec(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'THIS IS NOT VALID SQL, I HOPE' at line 1 in %s on line %d
                    183: [016] [42000] 42000 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'THIS IS NOT VALID SQL, I HOPE' at line %d
                    184: [035] With emulated PS it works but makes no sense given that exec() returns sort of affected rows...
                    185: done!

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