uw                                       Wed, 09 Sep 2009 17:03:03 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=288202

Log:
Next attempt to fix http://bugs.php.net/bug.php?id=48745. Patch by Andrey.

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_fetch_field.phpt
    U   php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_list_fields.phpt
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.h
    U   php/php-src/trunk/ext/mysql/tests/mysql_fetch_field.phpt
    U   php/php-src/trunk/ext/mysql/tests/mysql_list_fields.phpt
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h

Modified: php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_fetch_field.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_fetch_field.phpt	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_fetch_field.phpt	2009-09-09 17:03:03 UTC (rev 288202)
@@ -124,9 +124,16 @@
 		printf("[017] [%d] %s\n", mysql_errno($link), mysql_error($link));
 	}
 	$res = mysql_list_fields($db, 'test');
-	while ($tmp = mysql_fetch_field($res))
-		if ($tmp->name == 'id')
+	$found = false;
+	while ($tmp = mysql_fetch_field($res)) {
+		if ($tmp->name == 'id') {
+			printf("Fetch field from mysql_list_fields result set.\n");
+			$found = true;
 			var_dump($tmp);
+		}
+	}
+	if (!$found)
+		printf("[018] mysqli_list_fields result set processing has failed.\n");

 	mysql_free_result($res);

@@ -227,6 +234,7 @@
   [%u|b%"zerofill"]=>
   int(0)
 }
+Fetch field from mysql_list_fields result set.
 object(stdClass)#%d (13) {
   [%u|b%"name"]=>
   %unicode|string%(2) "id"

Modified: php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_list_fields.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_list_fields.phpt	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/branches/PHP_5_3/ext/mysql/tests/mysql_list_fields.phpt	2009-09-09 17:03:03 UTC (rev 288202)
@@ -12,30 +12,37 @@
 $tmp    = NULL;
 $link   = NULL;

-// This will implicitly try to connect, and we don't want it
-//if (false !== ($tmp = mysql_list_fields($link, $link)))
-//	printf("[002] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
-
 require 'table.inc';

 if (!$res = mysql_list_fields($db, 'test', $link))
 	printf("[003] [%d] %s\n", mysql_errno($link), mysql_error($link));

 if (2 !== ($num = mysql_num_fields($res)))
-	printf("[004] Expecting two fields, got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));
+	printf("[004] Expecting two fields from 'test', got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));

 mysql_free_result($res);

-if (!mysql_query("DROP TABLE IF EXISTS test2", $link) ||
-	!mysql_query("CREATE TABLE test2(id INT)", $link))
+if (!mysql_query("DROP TABLE IF EXISTS test2", $link))
 	printf("[005] [%d] %s\n", mysql_errno($link), mysql_error($link));

-if (!$res = mysql_list_fields($db, 'test', $link))
+if (!$res = @mysql_list_fields($db, 'test2', $link))
 	printf("[006] [%d] %s\n", mysql_errno($link), mysql_error($link));

+if (!$res = mysql_list_fields($db, 'test', $link))
+	printf("[007] [%d] %s\n", mysql_errno($link), mysql_error($link));
+
 if (2 !== ($num = mysql_num_fields($res)))
-	printf("[007] Expecting 3 fields from test and test2, got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));
+	printf("[008] Expecting 2 fields from 'test', got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));

+var_dump(mysql_fetch_assoc($res));
+for ($field_offset = 0; $field_offset < mysql_num_fields($res); $field_offset++) {
+	printf("Field Offset %d\n", $field_offset);
+	printf("mysql_field_flags(): %s\n", mysql_field_flags($res, $field_offset));
+	printf("mysql_field_len(): %s\n", mysql_field_len($res, $field_offset));
+	printf("mysql_field_name(): %s\n", mysql_field_name($res, $field_offset));
+	printf("mysql_field_type(): %s\n", mysql_field_type($res, $field_offset));
+}
+
 mysql_free_result($res);
 mysql_close($link);

@@ -57,4 +64,16 @@
 mysql_close($link);
 ?>
 --EXPECTF--
+[006] [%d] %s
+bool(false)
+Field Offset 0
+mysql_field_flags()%s
+mysql_field_len(): 11
+mysql_field_name(): id
+mysql_field_type(): int
+Field Offset 1
+mysql_field_flags()%s
+mysql_field_len(): 1
+mysql_field_name(): label
+mysql_field_type(): string
 done!

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_result_meta.c	2009-09-09 17:03:03 UTC (rev 288202)
@@ -165,8 +165,15 @@
 			PACKET_FREE_ALLOCA(field_packet);
 			DBG_RETURN(FAIL);
 		}
+		if (field_packet.error_info.error_no) {
+			conn->error_info = field_packet.error_info;
+			/* Return back from CONN_QUERY_SENT */
+			PACKET_FREE_ALLOCA(field_packet);
+			DBG_RETURN(FAIL);
+		}
+
 		if (field_packet.stupid_list_fields_eof == TRUE) {
-			meta->field_count = i + 1;
+			meta->field_count = i;
 			break;
 		}


Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c	2009-09-09 17:03:03 UTC (rev 288202)
@@ -1126,7 +1126,16 @@
 	if (packet->skip_parsing) {
 		DBG_RETURN(PASS);
 	}
-	if (*p == 0xFE && packet->header.size < 8) {
+	if (*p == 0xFF) {
+		/* Error */
+		p++;
+		php_mysqlnd_read_error_from_line(p, packet->header.size - 1,
+										 packet->error_info.error, sizeof(packet->error_info.error),
+										 &packet->error_info.error_no, packet->error_info.sqlstate
+										 TSRMLS_CC);
+		DBG_ERR_FMT("Server error : (%d) %s", packet->error_info.error_no, packet->error_info.error);
+		DBG_RETURN(PASS);
+	} else if (*p == 0xFE && packet->header.size < 8) {
 		/* Premature EOF. That should be COM_FIELD_LIST */
 		DBG_INF("Premature EOF. That should be COM_FIELD_LIST");
 		packet->stupid_list_fields_eof = TRUE;

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.h
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.h	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.h	2009-09-09 17:03:03 UTC (rev 288202)
@@ -242,6 +242,8 @@
 	/* For table definitions, empty for result sets */
 	zend_bool				skip_parsing;
 	zend_bool				stupid_list_fields_eof;
+
+	mysqlnd_error_info		error_info;
 } php_mysql_packet_res_field;



Modified: php/php-src/trunk/ext/mysql/tests/mysql_fetch_field.phpt
===================================================================
--- php/php-src/trunk/ext/mysql/tests/mysql_fetch_field.phpt	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/trunk/ext/mysql/tests/mysql_fetch_field.phpt	2009-09-09 17:03:03 UTC (rev 288202)
@@ -124,9 +124,16 @@
 		printf("[017] [%d] %s\n", mysql_errno($link), mysql_error($link));
 	}
 	$res = mysql_list_fields($db, 'test');
-	while ($tmp = mysql_fetch_field($res))
-		if ($tmp->name == 'id')
+	$found = false;
+	while ($tmp = mysql_fetch_field($res)) {
+		if ($tmp->name == 'id') {
+			printf("Fetch field from mysql_list_fields result set.\n");
+			$found = true;
 			var_dump($tmp);
+		}
+	}
+	if (!$found)
+		printf("[018] mysqli_list_fields result set processing has failed.\n");

 	mysql_free_result($res);

@@ -227,6 +234,7 @@
   [%u|b%"zerofill"]=>
   int(0)
 }
+Fetch field from mysql_list_fields result set.
 object(stdClass)#%d (13) {
   [%u|b%"name"]=>
   %unicode|string%(2) "id"

Modified: php/php-src/trunk/ext/mysql/tests/mysql_list_fields.phpt
===================================================================
--- php/php-src/trunk/ext/mysql/tests/mysql_list_fields.phpt	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/trunk/ext/mysql/tests/mysql_list_fields.phpt	2009-09-09 17:03:03 UTC (rev 288202)
@@ -2,40 +2,47 @@
 mysql_list_fields()
 --SKIPIF--
 <?php
-require_once('skipif.inc');
-require_once('skipifconnectfailure.inc');
+require_once 'skipif.inc';
+require_once 'skipifconnectfailure.inc';
 ?>
 --FILE--
 <?php
-include_once "connect.inc";
+require_once 'connect.inc';

 $tmp    = NULL;
 $link   = NULL;

-// This will implicitly try to connect, and we don't want it
-//if (false !== ($tmp = mysql_list_fields($link, $link)))
-//	printf("[002] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
+require 'table.inc';

-require('table.inc');
-
 if (!$res = mysql_list_fields($db, 'test', $link))
 	printf("[003] [%d] %s\n", mysql_errno($link), mysql_error($link));

 if (2 !== ($num = mysql_num_fields($res)))
-	printf("[004] Expecting two fields, got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));
+	printf("[004] Expecting two fields from 'test', got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));

 mysql_free_result($res);

-if (!mysql_query("DROP TABLE IF EXISTS test2", $link) ||
-	!mysql_query("CREATE TABLE test2(id INT)", $link))
+if (!mysql_query("DROP TABLE IF EXISTS test2", $link))
 	printf("[005] [%d] %s\n", mysql_errno($link), mysql_error($link));

-if (!$res = mysql_list_fields($db, 'test%', $link))
+if (!$res = @mysql_list_fields($db, 'test2', $link))
 	printf("[006] [%d] %s\n", mysql_errno($link), mysql_error($link));

-if (3 !== ($num = mysql_num_fields($res)))
-	printf("[007] Expecting 3 fields from test and test2, got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));
+if (!$res = mysql_list_fields($db, 'test', $link))
+	printf("[007] [%d] %s\n", mysql_errno($link), mysql_error($link));

+if (2 !== ($num = mysql_num_fields($res)))
+	printf("[008] Expecting 2 fields from 'test', got %d. [%d] %s\n", $num, mysql_errno($link), mysql_error($link));
+
+var_dump(mysql_fetch_assoc($res));
+for ($field_offset = 0; $field_offset < mysql_num_fields($res); $field_offset++) {
+	printf("Field Offset %d\n", $field_offset);
+	printf("mysql_field_flags(): %s\n", mysql_field_flags($res, $field_offset));
+	printf("mysql_field_len(): %s\n", mysql_field_len($res, $field_offset));
+	printf("mysql_field_name(): %s\n", mysql_field_name($res, $field_offset));
+	printf("mysql_field_type(): %s\n", mysql_field_type($res, $field_offset));
+}
+
 mysql_free_result($res);
 mysql_close($link);

@@ -43,7 +50,7 @@
 ?>
 --CLEAN--
 <?php
-require_once('connect.inc');
+require_once 'connect.inc';
 if (!$link = my_mysql_connect($host, $user, $passwd, $db, $port, $socket))
 	printf("[c001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
 		$host, $user, $db, $port, $socket);
@@ -57,4 +64,16 @@
 mysql_close($link);
 ?>
 --EXPECTF--
+[006] [%d] %s
+bool(false)
+Field Offset 0
+mysql_field_flags()%s
+mysql_field_len(): 11
+mysql_field_name(): id
+mysql_field_type(): int
+Field Offset 1
+mysql_field_flags()%s
+mysql_field_len(): 1
+mysql_field_name(): label
+mysql_field_type(): string
 done!

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_result_meta.c	2009-09-09 17:03:03 UTC (rev 288202)
@@ -165,8 +165,15 @@
 			PACKET_FREE_ALLOCA(field_packet);
 			DBG_RETURN(FAIL);
 		}
+		if (field_packet.error_info.error_no) {
+			conn->error_info = field_packet.error_info;
+			/* Return back from CONN_QUERY_SENT */
+			PACKET_FREE_ALLOCA(field_packet);
+			DBG_RETURN(FAIL);
+		}
+
 		if (field_packet.stupid_list_fields_eof == TRUE) {
-			meta->field_count = i + 1;
+			meta->field_count = i;
 			break;
 		}


Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c	2009-09-09 17:03:03 UTC (rev 288202)
@@ -1126,7 +1126,16 @@
 	if (packet->skip_parsing) {
 		DBG_RETURN(PASS);
 	}
-	if (*p == 0xFE && packet->header.size < 8) {
+	if (*p == 0xFF) {
+		/* Error */
+		p++;
+		php_mysqlnd_read_error_from_line(p, packet->header.size - 1,
+										 packet->error_info.error, sizeof(packet->error_info.error),
+										 &packet->error_info.error_no, packet->error_info.sqlstate
+										 TSRMLS_CC);
+		DBG_ERR_FMT("Server error : (%d) %s", packet->error_info.error_no, packet->error_info.error);
+		DBG_RETURN(PASS);
+	} else if (*p == 0xFE && packet->header.size < 8) {
 		/* Premature EOF. That should be COM_FIELD_LIST */
 		DBG_INF("Premature EOF. That should be COM_FIELD_LIST");
 		packet->stupid_list_fields_eof = TRUE;

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h	2009-09-09 15:43:18 UTC (rev 288201)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h	2009-09-09 17:03:03 UTC (rev 288202)
@@ -242,6 +242,8 @@
 	/* For table definitions, empty for result sets */
 	zend_bool				skip_parsing;
 	zend_bool				stupid_list_fields_eof;
+
+	mysqlnd_error_info		error_info;
 } php_mysql_packet_res_field;


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to