From: Ilia Alshanetsky Date: Fri, 11 Jan 2008 01:47:55 +0000 (+0000) Subject: MFB: Fixed a bug with PDO::FETCH_COLUMN|PDO::FETCH_GROUP mode when a column X-Git-Tag: php-5.2.6RC1~179 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aa51dce93aa8a4192e6704857bd59857c7c48724;p=php MFB: Fixed a bug with PDO::FETCH_COLUMN|PDO::FETCH_GROUP mode when a column # by which to group by data is specified. --- diff --git a/NEWS b/NEWS index 29a955de76..e52d229de6 100644 --- 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) diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index d2e180d3c4..36e6b3d7a2 100755 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -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);