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>