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