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

ext/pdo/pdo_stmt.c

index 9c1759093d708d10a0cd5f0766f2eba0b7b95a24..d42dfb9660987f733ae11421e7c00295efe72643 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);