]> granicus.if.org Git - php/commitdiff
Next attempt to fix http://bugs.php.net/bug.php?id=48745. Patch by Andrey.
authorUlf Wendel <uw@php.net>
Wed, 9 Sep 2009 17:03:03 +0000 (17:03 +0000)
committerUlf Wendel <uw@php.net>
Wed, 9 Sep 2009 17:03:03 +0000 (17:03 +0000)
ext/mysql/tests/mysql_fetch_field.phpt
ext/mysql/tests/mysql_list_fields.phpt
ext/mysqlnd/mysqlnd_result_meta.c
ext/mysqlnd/mysqlnd_wireprotocol.c
ext/mysqlnd/mysqlnd_wireprotocol.h

index f9767c82b7fa923f01d76308fd8f9e0efce55985..65c44edc5e1a93509eb94b3fbc4dfc413c08cca3 100644 (file)
@@ -124,9 +124,16 @@ require_once('skipifconnectfailure.inc');
                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 @@ object(stdClass)#%d (13) {
   [%u|b%"zerofill"]=>
   int(0)
 }
+Fetch field from mysql_list_fields result set.
 object(stdClass)#%d (13) {
   [%u|b%"name"]=>
   %unicode|string%(2) "id"
index dc3a3417d37740878a8a33c040e291425f3eb7f1..e0b3fd5e39368a1ecd0225e70b67be8b22a13482 100644 (file)
@@ -2,39 +2,46 @@
 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 @@ print "done!";
 ?>
 --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 @@ if (!mysql_query("DROP TABLE IF EXISTS test2", $link))
 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!
index 7a750039278c501c88f33f3862f7cbff836452c1..95ef93a65b7ea6d4ccea468780d7a9267e038464 100644 (file)
@@ -165,8 +165,15 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
                        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;
                }
 
index 989cc87ed01206be185c7df1b4e805fa3a593399..79c98741e8f84b185d1f491f33304d0c228f0d96 100644 (file)
@@ -1126,7 +1126,16 @@ php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        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;
index cd9d1a465f6f2a69fc98e524aa18ba95cc6b877e..77ee795c35a1be7449c1fa5ab30adce6e870dea5 100644 (file)
@@ -242,6 +242,8 @@ typedef struct st_php_mysql_packet_res_field {
        /* 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;