MFB: Fixed a bug with PDO::FETCH_COLUMN|PDO::FETCH_GROUP mode when a column

# by which to group by data is specified.
This commit is contained in:
Ilia Alshanetsky 2008-01-11 01:48:19 +00:00
parent 2f5e6e896e
commit f4078bfc73

View File

@ -860,6 +860,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;
how = how & ~PDO_FETCH_FLAGS;
if (how == PDO_FETCH_USE_DEFAULT) {
@ -875,6 +876,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;
@ -916,8 +923,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 {
@ -1020,7 +1031,11 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
if (return_all) {
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 */
@ -1503,7 +1518,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);