Annotation of embedaddon/php/ext/mysqli/tests/mysqli_last_insert_id.phpt, revision 1.1

1.1     ! misho       1: --TEST--
        !             2: API vs. SQL LAST_INSERT_ID()
        !             3: --SKIPIF--
        !             4: <?php
        !             5:   require_once('skipif.inc');
        !             6:   require_once('skipifconnectfailure.inc');
        !             7: ?>
        !             8: --FILE--
        !             9: <?php
        !            10:        /*
        !            11:        CAUTION: the insert_id() API call is not supposed to return
        !            12:        the same value as a call to the LAST_INSERT_ID() SQL function.
        !            13:        It is not necessarily a bug if API and SQL function return different
        !            14:        values. Check the MySQL C API reference manual for details.
        !            15:        */
        !            16:        require_once("connect.inc");
        !            17: 
        !            18:        function get_sql_id($link) {
        !            19:                if (!($res = $link->query("SELECT LAST_INSERT_ID() AS _id"))) {
        !            20:                        printf("[003] [%d] %s\n", $link->errno, $link->error);
        !            21:                        return NULL;
        !            22:                }
        !            23:                $row = $res->fetch_assoc();
        !            24:                $res->close();
        !            25: 
        !            26:                return $row['_id'];
        !            27:        }
        !            28: 
        !            29:        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
        !            30:                printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
        !            31:                        $host, $user, $db, $port, $socket);
        !            32: 
        !            33:        if (!$link->query("DROP TABLE IF EXISTS test") ||
        !            34:                !$link->query("CREATE TABLE test (id INT auto_increment, label varchar(10) not null, PRIMARY KEY (id)) ENGINE=MyISAM") ||
        !            35:                !$link->query("INSERT INTO test (id, label) VALUES (null, 'a')")) {
        !            36:                printf("[002] [%d] %s\n", $link->errno, $link->error);
        !            37:        }
        !            38: 
        !            39:        $api_id = $link->insert_id;
        !            40:        $sql_id = get_sql_id($link);
        !            41:        printf("API: %d, SQL: %d\n", $api_id, $sql_id);
        !            42: 
        !            43:        if ($api_id < 1)
        !            44:                printf("[004] Expecting id > 0 got %d, [%d] %s\n", $api_id, $link->errno, $link->error) ;
        !            45:        if ($api_id != $sql_id)
        !            46:                printf("[005] SQL id %d should be equal to API id %d\n", $sql_id, $api_id);
        !            47: 
        !            48:        // Not an INSERT, API value must become 0
        !            49:        if (!($res = $link->query("SELECT 1 FROM DUAL")))
        !            50:                printf("[006] [%d] %s\n", $link->errno, $link->error);
        !            51:        else
        !            52:                $res->close();
        !            53: 
        !            54:        $api_id = $link->insert_id;
        !            55:        $new_sql_id = get_sql_id($link);
        !            56:        if (0 !== $api_id) {
        !            57:                printf("[007] API id should have been reset to 0 because previous query was SELECT, got API %d, SQL %d\n",
        !            58:                  $api_id, $new_sql_id);
        !            59:        }
        !            60:        if ($new_sql_id != $sql_id) {
        !            61:                printf("[008] The servers LAST_INSERT_ID() changed unexpectedly from %d to %d\n", $sql_id, $new_sql_id);
        !            62:        }
        !            63: 
        !            64:        // Insert fails, LAST_INSERT_ID shall not change, API shall return 0
        !            65:        if ($link->query("INSERT INTO test (id, label) VALUES (null, null)")) {
        !            66:                printf("[009] The INSERT did not fail as planned, [%d] %s\n", $link->errno, $link->error);
        !            67:        }
        !            68:        $api_id = $link->insert_id;
        !            69:        $new_sql_id = get_sql_id($link);
        !            70: 
        !            71:        if (0 !== $api_id) {
        !            72:                printf("[010] API id should have been reset to 0 because previous query was SELECT, got API %d, SQL %d\n",
        !            73:                  $api_id, $new_sql_id);
        !            74:        }
        !            75:        if ($new_sql_id != $sql_id) {
        !            76:                printf("[011] The servers LAST_INSERT_ID() changed unexpectedly from %d to %d\n", $sql_id, $new_sql_id);
        !            77:        }
        !            78: 
        !            79:        // Sequence counter pattern...
        !            80:        if (!$link->query("UPDATE test SET id=LAST_INSERT_ID(id+1)"))
        !            81:          printf("[012] [%d] %s\n", $link->errno, $link->error);
        !            82: 
        !            83:        $api_id = $link->insert_id;
        !            84:        $new_sql_id = get_sql_id($link);
        !            85:        if ($api_id < 1)
        !            86:                printf("[013] Expecting id > 0 got %d, [%d] %s\n", $api_id, $link->errno, $link->error) ;
        !            87:        if ($api_id != $new_sql_id)
        !            88:                printf("[014] SQL id %d should be equal to API id %d\n", $new_sql_id, $api_id);
        !            89:        if ($sql_id == $new_sql_id)
        !            90:                printf("[015] SQL id %d should have had changed, got %d\n", $sql_id, $new_sql_id);
        !            91: 
        !            92:        $sql_id = $new_sql_id;
        !            93: 
        !            94:        // Not an INSERT (after UPDATE), API value must become 0
        !            95:        if (!$link->query("SET @myvar=1"))
        !            96:                printf("[016] [%d] %s\n", $link->errno, $link->error);
        !            97: 
        !            98:        $api_id = $link->insert_id;
        !            99:        $new_sql_id = get_sql_id($link);
        !           100:        if (0 !== $api_id) {
        !           101:                printf("[017] API id should have been reset to 0 because previous query was SET, got API %d, SQL %d\n",
        !           102:                  $api_id, $new_sql_id);
        !           103:        }
        !           104:        if ($new_sql_id != $sql_id) {
        !           105:                printf("[018] The servers LAST_INSERT_ID() changed unexpectedly from %d to %d\n", $sql_id, $new_sql_id);
        !           106:        }
        !           107: 
        !           108:        if (!$link->query("INSERT INTO test(id, label) VALUES (LAST_INSERT_ID(id + 1), 'b')"))
        !           109:                printf("[019] [%d] %s\n", $link->errno, $link->error);
        !           110: 
        !           111:        $api_id = $link->insert_id;
        !           112:        $sql_id = get_sql_id($link);
        !           113:        if ($api_id != $sql_id)
        !           114:                printf("[020] SQL id %d should be equal to API id %d\n", $sql_id, $api_id);
        !           115: 
        !           116:        if (!$link->query("INSERT INTO test(label) VALUES ('c')"))
        !           117:                printf("[021] [%d] %s\n", $link->errno, $link->error);
        !           118: 
        !           119:        $api_id = $link->insert_id;
        !           120:        $sql_id = get_sql_id($link);
        !           121:        if ($api_id != $sql_id)
        !           122:                printf("[022] SQL id %d should be equal to API id %d\n", $sql_id, $api_id);
        !           123: 
        !           124:        if (!($res = $link->query("SELECT id, label FROM test ORDER BY id ASC")))
        !           125:                printf("[023] [%d] %s\n", $link->errno, $link->error);
        !           126: 
        !           127:        printf("Dumping table contents before INSERT...SELECT experiments...\n");
        !           128:        while ($row = $res->fetch_assoc()) {
        !           129:                printf("id = %d, label = '%s'\n", $row['id'], $row['label']);
        !           130:        }
        !           131:        $res->close();
        !           132: 
        !           133:        if (!$link->query("INSERT INTO test(label) SELECT CONCAT(label, id) FROM test ORDER BY id ASC"))
        !           134:          printf("[024] [%d] %s\n", $link->errno, $link->error);
        !           135: 
        !           136:        $api_id = $link->insert_id;
        !           137:        $sql_id = get_sql_id($link);
        !           138:        if ($api_id != $sql_id)
        !           139:                printf("[025] SQL id %d should be equal to API id %d\n", $sql_id, $api_id);
        !           140: 
        !           141:        if ($link->query("INSERT INTO test(id, label) SELECT id, CONCAT(label, id) FROM test ORDER BY id ASC"))
        !           142:          printf("[026] INSERT should have failed because of duplicate PK value, [%d] %s\n", $link->errno, $link->error);
        !           143: 
        !           144:        $api_id = $link->insert_id;
        !           145:        $new_sql_id = get_sql_id($link);
        !           146:        if (0 !== $api_id) {
        !           147:                printf("[027] API id should have been reset to 0 because previous query failed, got API %d, SQL %d\n",
        !           148:                  $api_id, $new_sql_id);
        !           149:        }
        !           150:        if ($new_sql_id != $sql_id) {
        !           151:                printf("[028] The servers LAST_INSERT_ID() changed unexpectedly from %d to %d\n", $sql_id, $new_sql_id);
        !           152:        }
        !           153: 
        !           154:        /* API insert id will be 101 because of UPDATE, SQL unchanged */
        !           155:        if (!$link->query(sprintf("INSERT INTO test(id, label) VALUES (%d, 'z') ON DUPLICATE KEY UPDATE id = 101", $sql_id)     ))
        !           156:          printf("[029] [%d] %s\n", $link->errno, $link->error);
        !           157: 
        !           158:        $api_id = $link->insert_id;
        !           159:        $new_sql_id = get_sql_id($link);
        !           160:        if ($api_id != 101)
        !           161:                printf("[030] API id should be %d got %d\n", $sql_id, $api_id);
        !           162:        if ($new_sql_id != $sql_id) {
        !           163:                printf("[031] The servers LAST_INSERT_ID() changed unexpectedly from %d to %d\n", $sql_id, $new_sql_id);
        !           164:        }
        !           165: 
        !           166:        if (!($res = $link->query("SELECT id, label FROM test ORDER BY id ASC")))
        !           167:                printf("[032] [%d] %s\n", $link->errno, $link->error);
        !           168: 
        !           169:        printf("Dumping table contents after INSERT...SELECT...\n");
        !           170:        while ($row = $res->fetch_assoc()) {
        !           171:                printf("id = %d, label = '%s'\n", $row['id'], $row['label']);
        !           172:        }
        !           173:        $res->close();
        !           174: 
        !           175:        print "done!";
        !           176: ?>
        !           177: --CLEAN--
        !           178: <?php
        !           179:        require_once("clean_table.inc");
        !           180: ?>
        !           181: --EXPECTF--
        !           182: API: %d, SQL: %d
        !           183: Dumping table contents before INSERT...SELECT experiments...
        !           184: id = %d, label = 'b'
        !           185: id = %d, label = 'a'
        !           186: id = %d, label = 'c'
        !           187: Dumping table contents after INSERT...SELECT...
        !           188: id = %d, label = 'b'
        !           189: id = %d, label = 'a'
        !           190: id = %d, label = 'c'
        !           191: id = %d, label = 'a%d'
        !           192: id = %d, label = 'c%d'
        !           193: id = 101, label = 'b%d'
        !           194: done!

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