@@ -730,8 +730,6 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
730
730
return true;
731
731
}
732
732
733
- RETVAL_FALSE ;
734
-
735
733
switch (how ) {
736
734
case PDO_FETCH_USE_DEFAULT :
737
735
case PDO_FETCH_ASSOC :
@@ -852,8 +850,6 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
852
850
zval_ptr_dtor (& unserialization_string );
853
851
if (unserialize_res == FAILURE ) {
854
852
pdo_raise_impl_error (stmt -> dbh , stmt , "HY000" , "cannot unserialize class" );
855
- zval_ptr_dtor (return_value );
856
- ZVAL_NULL (return_value );
857
853
return false;
858
854
}
859
855
column_index_to_fetch ++ ;
@@ -925,20 +921,14 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
925
921
case PDO_FETCH_FUNC :
926
922
ZVAL_COPY_VALUE (& fetch_function_params [fetch_function_param_num ++ ], & val );
927
923
break ;
928
-
929
- default :
930
- zval_ptr_dtor (& val );
931
- zend_value_error ("Fetch mode must be a bitmask of PDO::FETCH_* constants" );
932
- return 0 ;
924
+ EMPTY_SWITCH_DEFAULT_CASE ();
933
925
}
934
926
}
935
927
936
928
/* Run constructor for objects if not already run and not unserialized */
937
929
if (how == PDO_FETCH_CLASS && ce -> constructor && !(flags & (PDO_FETCH_PROPS_LATE | PDO_FETCH_SERIALIZE ))) {
938
930
bool failed = pdo_call_fetch_object_constructor (ce -> constructor , ctor_arguments , return_value );
939
931
if (UNEXPECTED (failed )) {
940
- zval_ptr_dtor (return_value );
941
- RETVAL_FALSE ;
942
932
return false;
943
933
}
944
934
} else if (how == PDO_FETCH_FUNC ) {
@@ -1046,6 +1036,7 @@ PHP_METHOD(PDOStatement, fetch)
1046
1036
return ;
1047
1037
}
1048
1038
if (!do_fetch (stmt , return_value , how , ori , off , NULL )) {
1039
+ zval_ptr_dtor (return_value );
1049
1040
PDO_HANDLE_STMT_ERR ();
1050
1041
RETURN_FALSE ;
1051
1042
}
@@ -1083,6 +1074,7 @@ PHP_METHOD(PDOStatement, fetchObject)
1083
1074
stmt -> fetch .cls .ctor_args = ctor_args ;
1084
1075
1085
1076
if (!do_fetch (stmt , return_value , PDO_FETCH_CLASS , PDO_FETCH_ORI_NEXT , /* offset */ 0 , NULL )) {
1077
+ zval_ptr_dtor (return_value );
1086
1078
PDO_HANDLE_STMT_ERR ();
1087
1079
RETVAL_FALSE ;
1088
1080
}
@@ -1254,8 +1246,14 @@ PHP_METHOD(PDOStatement, fetchAll)
1254
1246
1255
1247
if (fetch_mode == PDO_FETCH_KEY_PAIR ) {
1256
1248
while (pdo_do_key_pair_fetch (stmt , PDO_FETCH_ORI_NEXT , /* offset */ 0 , Z_ARRVAL_P (return_value )));
1257
- PDO_HANDLE_STMT_ERR ();
1258
- return ;
1249
+ /* Inline PDO_HANDLE_STMT_ERR(); as we need to free the return value */
1250
+ if (UNEXPECTED (EG (exception ) || strcmp (stmt -> error_code , PDO_ERR_NONE ) != 0 )) {
1251
+ zval_ptr_dtor (return_value );
1252
+ if (strcmp (stmt -> error_code , PDO_ERR_NONE ) != 0 ) {
1253
+ pdo_handle_error (stmt -> dbh , stmt );
1254
+ }
1255
+ RETURN_EMPTY_ARRAY ();
1256
+ }
1259
1257
}
1260
1258
1261
1259
// Need to handle the "broken" PDO_FETCH_GROUP|PDO_FETCH_UNIQUE fetch case
@@ -1287,7 +1285,15 @@ PHP_METHOD(PDOStatement, fetchAll)
1287
1285
stmt -> fetch .cls .ce = old_ce ;
1288
1286
stmt -> fetch .cls .ctor_args = old_ctor_args ;
1289
1287
1290
- PDO_HANDLE_STMT_ERR ();
1288
+ /* Inline PDO_HANDLE_STMT_ERR(); as we need to free the return value */
1289
+ if (UNEXPECTED (EG (exception ) || strcmp (stmt -> error_code , PDO_ERR_NONE ) != 0 )) {
1290
+ zval_ptr_dtor (& data );
1291
+ zval_ptr_dtor (return_value );
1292
+ if (strcmp (stmt -> error_code , PDO_ERR_NONE ) != 0 ) {
1293
+ pdo_handle_error (stmt -> dbh , stmt );
1294
+ }
1295
+ RETURN_EMPTY_ARRAY ();
1296
+ }
1291
1297
}
1292
1298
/* }}} */
1293
1299
0 commit comments