Annotation of embedaddon/php/ext/mysqli/tests/mysqli_last_insert_id.phpt, revision 1.1.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>