]> granicus.if.org Git - php/commitdiff
MFB: Fixed a bug with PDO::FETCH_COLUMN|PDO::FETCH_GROUP mode when a column
authorIlia Alshanetsky <iliaa@php.net>
Fri, 11 Jan 2008 01:47:55 +0000 (01:47 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Fri, 11 Jan 2008 01:47:55 +0000 (01:47 +0000)
# by which to group by data is specified.

NEWS
ext/pdo/pdo_stmt.c

diff --git a/NEWS b/NEWS
index 29a955de76255a7bb5d745c7e3b147a4e30e110f..e52d229de65181ba76afc46abed5c04a40ca9b5c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ PHP                                                                        NEWS
 - Fixed weired behavior in CGI parameter parsing. (Dmitry, Hannes Magnusson)
 - Fixed a safe_mode bypass in cURL identified by Maksymilian Arciemowicz.
   (Ilia)
+- Fixed a bug with PDO::FETCH_COLUMN|PDO::FETCH_GROUP mode when a column # by
+  which to group by data is specified. (Ilia)
 
 - Fixed bug #43793 (zlib filter is unable to auto-detect gzip/zlib file headers).
   (Greg)
index d2e180d3c4d7154ab3e5e92fedb696f04fa103a1..36e6b3d7a2972adea628c10424fb1f005e86d5ea 100755 (executable)
@@ -894,6 +894,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
        int flags = how & PDO_FETCH_FLAGS, idx, old_arg_count = 0;
        zend_class_entry *ce = NULL, *old_ce = NULL;
        zval grp_val, *grp, **pgrp, *retval, *old_ctor_args = NULL;
+       int colno;
 
        if (how == PDO_FETCH_USE_DEFAULT) {
                how = stmt->default_fetch_type;
@@ -909,6 +910,12 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                return 1;
        }
 
+       if (flags & PDO_FETCH_GROUP && stmt->fetch.column == -1) {
+               colno = 1;
+       } else {
+               colno = stmt->fetch.column;
+       }
+
        if (return_value) {
                int i = 0;
 
@@ -945,8 +952,12 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                                break;
 
                        case PDO_FETCH_COLUMN:
-                               if (stmt->fetch.column >= 0 && stmt->fetch.column < stmt->column_count) {
-                                       fetch_value(stmt, return_value, stmt->fetch.column, NULL TSRMLS_CC);
+                               if (colno >= 0 && colno < stmt->column_count) {
+                                       if (flags == PDO_FETCH_GROUP && stmt->fetch.column == -1) {
+                                               fetch_value(stmt, return_value, 1, NULL TSRMLS_CC);
+                                       } else {
+                                               fetch_value(stmt, return_value, colno, NULL TSRMLS_CC); 
+                                       }
                                        if (!return_all) {
                                                return 1;
                                        } else {
@@ -1049,7 +1060,11 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                
                if (return_all && how != PDO_FETCH_KEY_PAIR) {
                        INIT_PZVAL(&grp_val);
-                       fetch_value(stmt, &grp_val, i, NULL TSRMLS_CC);
+                       if (flags == PDO_FETCH_GROUP && how == PDO_FETCH_COLUMN && stmt->fetch.column > 0) {
+                               fetch_value(stmt, &grp_val, colno, NULL TSRMLS_CC);
+                       } else {
+                               fetch_value(stmt, &grp_val, i, NULL TSRMLS_CC);
+                       }
                        convert_to_string(&grp_val);
                        if (how == PDO_FETCH_COLUMN) {
                                i = stmt->column_count; /* no more data to fetch */
@@ -1527,7 +1542,7 @@ static PHP_METHOD(PDOStatement, fetchAll)
                switch(ZEND_NUM_ARGS()) {
                case 0:
                case 1:
-                       stmt->fetch.column = how & PDO_FETCH_GROUP ? 1 : 0;
+                       stmt->fetch.column = how & PDO_FETCH_GROUP ? -1 : 0;
                        break;
                case 2:
                        convert_to_long(arg2);