]> granicus.if.org Git - php/commitdiff
Bugfix #27597 pg_fetch_array not returning false .
authorMarcus Boerger <helly@php.net>
Mon, 15 Mar 2004 19:47:18 +0000 (19:47 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 15 Mar 2004 19:47:18 +0000 (19:47 +0000)
NEWS
ext/pgsql/pgsql.c
ext/pgsql/tests/80_bug27597.phpt [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index cc23ce7c7f0a44a1719c9496bedb416d57754053..d6fa3a380e8f9d7a3b42d07497cf8daa0f1f75c8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -46,6 +46,7 @@ PHP                                                                        NEWS
 - Fixed problem preventing startup errors from being displayed. (Marcus)
 - Fixed start-up problem if both SPL and SimpleXML were enabled. The double
   initialization of apache 1.3 was causing problems here. (Marcus, Derick)
+- Fixed bug #27597 (pg_fetch_array not returning false). (Marcus)
 - Fixed bug #27586 (ArrayObject::getIterator crashes with [] assignment). 
   (Marcus)
 - Fixed bug #27537 (Objects pointing to each other segfaults). (Dmitry)
index 914ad66d65bcc0669b651b60dcbb9e282ed98f6a..2fb1a3075d9af29bda23f0cd5dcf1e3a3992b8d5 100644 (file)
@@ -1403,7 +1403,7 @@ PHP_FUNCTION(pg_fetch_result)
 /* {{{ void php_pgsql_fetch_hash */
 static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, int into_object)
 {
-       zval                *result;
+       zval                *result, *zrow;
        PGresult            *pgsql_result;
        pgsql_result_handle *pg_result;
        int             i, num_fields, pgsql_row, use_row;
@@ -1432,10 +1432,14 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type,
                result_type = PGSQL_ASSOC;
                use_row = 0;
        } else {
-               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ll", &result, &row, &result_type) == FAILURE) {
+               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|zl", &result, &zrow, &result_type) == FAILURE) {
                        return;
                }
-               use_row = ZEND_NUM_ARGS() > 1;
+               use_row = ZEND_NUM_ARGS() > 1 && Z_TYPE_P(zrow) != IS_NULL;
+               if (use_row) {
+                       convert_to_long_ex(&zrow);
+                       row = Z_LVAL_P(zrow);
+               }
        }
 
        if (!(result_type & PGSQL_BOTH)) {
diff --git a/ext/pgsql/tests/80_bug27597.phpt b/ext/pgsql/tests/80_bug27597.phpt
new file mode 100755 (executable)
index 0000000..aa04a4a
--- /dev/null
@@ -0,0 +1,60 @@
+--TEST--
+Bug #27597 pg_fetch_array not returning false 
+--SKIPIF--
+<?php 
+require_once('skipif.inc');
+?>
+--FILE--
+<?php
+
+require_once('config.inc');
+       
+$dbh = @pg_connect($conn_str);
+if (!$dbh) {
+       die ("Could not connect to the server");
+}
+
+@pg_query("DROP TABLE id");
+pg_query("CREATE TABLE id (id INT)");
+
+for ($i=0; $i<4; $i++) {
+       pg_query("INSERT INTO id (id) VALUES ($i)");
+}
+
+function xi_fetch_array($res, $type = PGSQL_ASSOC) {
+       $a = pg_fetch_array($res, NULL, $type) ;
+       return $a ;     
+}
+
+$res = pg_query("SELECT * FROM id");
+$i = 0; // endless-loop protection
+while($row = xi_fetch_array($res)) {
+       print_r($row);
+       if ($i++ > 4) {
+               echo "ENDLESS-LOOP";
+               exit(1);
+       }
+}
+
+pg_close($dbh);
+
+?>
+===DONE===
+--EXPECTF--
+Array
+(
+    [id] => 0
+)
+Array
+(
+    [id] => 1
+)
+Array
+(
+    [id] => 2
+)
+Array
+(
+    [id] => 3
+)
+===DONE===