List:Commits« Previous MessageNext Message »
From:uwendel Date:July 18 2007 5:42pm
Subject:PHP mysqlnd svn commit: r785 - trunk/tests/ext/mysqli
View as plain text  
Author: uwendel
Date: 2007-07-18 19:42:20 +0200 (Wed, 18 Jul 2007)
New Revision: 785

Modified:
   trunk/tests/ext/mysqli/mysqli_insert_id.phpt
Log:
Improving the test to check multiple-insert syntax and compare results with
LAST_INSERT_ID()


Modified: trunk/tests/ext/mysqli/mysqli_insert_id.phpt
===================================================================
--- trunk/tests/ext/mysqli/mysqli_insert_id.phpt	2007-07-18 17:10:17 UTC (rev 784)
+++ trunk/tests/ext/mysqli/mysqli_insert_id.phpt	2007-07-18 17:42:20 UTC (rev 785)
@@ -5,50 +5,111 @@
 <?php require_once('skipifemb.inc'); ?>
 --FILE--
 <?php
-    include "connect.inc";
+	include "connect.inc";
 
-    $tmp    = NULL;   
-    $link   = NULL;    
-    
-    if (!is_null($tmp = @mysqli_insert_id()))
-        printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
-        
-    if (!is_null($tmp = @mysqli_insert_id($link)))
-        printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+	$tmp    = NULL;
+	$link   = NULL;
 
-    require('table.inc');
-    
-    if (0 !== ($tmp = mysqli_insert_id($link)))
-        printf("[003] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
-        
-    if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id LIMIT 1")) {
-        printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-    }    
-    if (0 !== ($tmp = mysqli_insert_id($link)))
-        printf("[005] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
-    mysqli_free_result($res);        
+	if (!is_null($tmp = @mysqli_insert_id()))
+		printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
 
-    // no auto_increment column
-    if (!$res = mysqli_query($link, "INSERT INTO test(id, label) VALUES (100, 'a')")) {
-        printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-    }    
-    if (0 !== ($tmp = mysqli_insert_id($link)))
-        printf("[007] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);    
-    
-    if (!$res = mysqli_query($link, "ALTER TABLE test MODIFY id INT NOT NULL
AUTO_INCREMENT")) {
-        printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-    }
-    if (!$res = mysqli_query($link, "INSERT INTO test(label) VALUES ('a')")) {
-        printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-    }    
-    if (0 === ($tmp = mysqli_insert_id($link)))
-        printf("[010] Expecting int/any non zero, got %s/%s\n", gettype($tmp), $tmp);
-        
-    mysqli_close($link);  
-    
-    var_dump(mysqli_insert_id($link));
-      
-    print "done!";
+	if (!is_null($tmp = @mysqli_insert_id($link)))
+		printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+
+	require('table.inc');
+
+	if (0 !== ($tmp = mysqli_insert_id($link)))
+		printf("[003] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
+
+	if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id LIMIT 1")) {
+		printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+	}
+	if (0 !== ($tmp = mysqli_insert_id($link)))
+		printf("[005] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
+	mysqli_free_result($res);
+
+	// no auto_increment column
+	if (!$res = mysqli_query($link, "INSERT INTO test(id, label) VALUES (100, 'a')")) {
+		printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+	}
+	if (0 !== ($tmp = mysqli_insert_id($link)))
+		printf("[007] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
+
+	if (!$res = mysqli_query($link, "ALTER TABLE test MODIFY id INT NOT NULL
AUTO_INCREMENT")) {
+		printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+	}
+
+	if (!$res = mysqli_query($link, "INSERT INTO test(label) VALUES ('a')")) {
+		printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+	}
+	if (($last_id = mysqli_insert_id($link)) <= 0)
+		printf("[010] Expecting int/any >0, got %s/%s\n", gettype($last_id), $last_id);
+
+	if (mysqli_query($link, "LOCK TABLE test WRITE")) {
+		/* we need exclusive access for a moment */
+		/* let's hope nobody changes auto_increment_increment while this code executes */
+		do {
+			if (!$res = mysqli_query($link, 'SELECT @@auto_increment_increment AS inc')) {
+				printf("[011] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+				break;
+			}
+			if (!$row = mysqli_fetch_assoc($res)) {
+				printf("[012] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+				break;
+			}
+			mysqli_free_result($res);
+			$inc = $row['inc'];
+
+			if (!mysqli_query($link, "INSERT INTO test(label) VALUES ('b')")) {
+				printf("[013] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+				break;
+			}
+			if (($next_id = mysqli_insert_id($link)) <= $last_id)
+				/*
+				very likely a bug, but someone could have done something on the server
+				between the second last insert and the lock, therefore don't stop just bail
+				*/
+				printf("[014] Expecting int/any > %d, got %s/%s\n", $last_id, gettype($next_id),
$next_id);
+
+			$last_id = $next_id;
+			if (!mysqli_query($link, "INSERT INTO test(label) VALUES ('c'), ('d'), ('e')")) {
+				printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+				break;
+			}
+			/*
+			Note: For a multiple-row insert, LAST_INSERT_ID() and mysql_insert_id() actually
+			return the AUTO_INCREMENT key from the first of the inserted rows. This allows
+			multiple-row inserts to be reproduced correctly on other servers in a replication
setup.
+			*/
+			if (($next_id = mysqli_insert_id($link)) != $last_id + $inc) {
+				printf("[016] Expecting int/%d, got %s/%s\n", $last_id + 1, gettype($next_id),
$next_id);
+				break;
+			}
+
+			if (!$res = mysqli_query($link, "SELECT LAST_INSERT_ID() AS last_id")) {
+				printf("[017] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+				break;
+			}
+			if (!$row = mysqli_fetch_assoc($res)) {
+				printf("[018] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+				break;
+			}
+			mysqli_free_result($res);
+
+			if ($next_id != $row['last_id']) {
+				printf("[018] Something is wrong, check manually. Expecting %s got %s.\n",
+					$next_id, $row['last_id']);
+				break;
+			}
+		} while (false);
+		mysqli_query($link, "UNLOCK TABLE test");
+	}
+
+	mysqli_close($link);
+
+	var_dump(mysqli_insert_id($link));
+
+	print "done!";
 ?>
 --EXPECTF--
 Warning: mysqli_insert_id(): Couldn't fetch mysqli in %s on line %d

Thread
PHP mysqlnd svn commit: r785 - trunk/tests/ext/mysqliuwendel18 Jul