]> granicus.if.org Git - php/commitdiff
- Fixed bug #46139 (PDOStatement->setFetchMode() forgets FETCH_PROPS_LATE)
authorFelipe Pena <felipe@php.net>
Fri, 10 Oct 2008 16:46:10 +0000 (16:46 +0000)
committerFelipe Pena <felipe@php.net>
Fri, 10 Oct 2008 16:46:10 +0000 (16:46 +0000)
  Initial patch by: chsc at peytz dot dk

MFB:
- Fixed bug #41971 (PDOStatement::fetch and PDOStatement::setFetchMode causes unexpected behavior)
- Fixed bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode)

ext/pdo/pdo_stmt.c

index 80b4ed970aa27190bfbfd83359b9ec53c54fe583..428e296f7e5d2e5497a6422c6e9b415e7f43e1c9 100755 (executable)
@@ -897,15 +897,16 @@ static int do_fetch_opt_finish(pdo_stmt_t *stmt, int free_ctor_agrs TSRMLS_DC) /
 static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
        enum pdo_fetch_type how, enum pdo_fetch_orientation ori, long offset, zval *return_all TSRMLS_DC) /* {{{ */
 {
-       int flags = how & PDO_FETCH_FLAGS, idx, old_arg_count = 0;
+       int 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) {
                how = stmt->default_fetch_type;
        }
+       flags = how & PDO_FETCH_FLAGS;
+       how = how & ~PDO_FETCH_FLAGS;
 
        if (!do_fetch_common(stmt, ori, offset, do_bind TSRMLS_CC)) {
                return 0;
@@ -1489,7 +1490,7 @@ static PHP_METHOD(PDOStatement, fetchAll)
        zval *arg2;
        zend_class_entry *old_ce;
        zval *old_ctor_args, *ctor_args = NULL;
-       int error = 0, old_arg_count;
+       int error = 0, flags, old_arg_count;
        PHP_STMT_GET_OBJ;         
 
        if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lzz", &how, &arg2, &ctor_args)) {
@@ -1581,20 +1582,25 @@ static PHP_METHOD(PDOStatement, fetchAll)
                }
        }
 
+       flags = how & PDO_FETCH_FLAGS;
+       
        if ((how & ~PDO_FETCH_FLAGS) == PDO_FETCH_USE_DEFAULT) {
+               flags |= stmt->default_fetch_type & PDO_FETCH_FLAGS;
                how |= stmt->default_fetch_type & ~PDO_FETCH_FLAGS;
        }
 
        if (!error)     {
                PDO_STMT_CLEAR_ERR();
                MAKE_STD_ZVAL(data);
-               if (how & PDO_FETCH_GROUP) {
+               if (    (how & PDO_FETCH_GROUP) || how == PDO_FETCH_KEY_PAIR || 
+                       (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)
+               ) {
                        array_init(return_value);
                        return_all = return_value;
                } else {
                        return_all = 0;
                }
-               if (!do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)) {
+               if (!do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)) {
                        FREE_ZVAL(data);
                        error = 2;
                }
@@ -1603,13 +1609,15 @@ static PHP_METHOD(PDOStatement, fetchAll)
                if ((how & PDO_FETCH_GROUP)) {
                        do {
                                MAKE_STD_ZVAL(data);
-                       } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
+                       } while (do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
+               } else if (how == PDO_FETCH_KEY_PAIR || (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)) {
+                       while (do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
                } else {
                        array_init(return_value);
                        do {
                                add_next_index_zval(return_value, data);
                                MAKE_STD_ZVAL(data);
-                       } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
+                       } while (do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
                }
                FREE_ZVAL(data);
        }