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