@@ -591,6 +591,9 @@ PHP_METHOD(SQLite3, query)
591
591
ZVAL_OBJ (& result -> stmt_obj_zval , Z_OBJ (stmt ));
592
592
593
593
return_code = sqlite3_step (result -> stmt_obj -> stmt );
594
+ result -> stmt_obj -> has_stepped = 1 ;
595
+ ZEND_ASSERT (return_code >= 0 && return_code < (1 << 30 ));
596
+ result -> stmt_obj -> last_step_result = return_code ;
594
597
595
598
switch (return_code ) {
596
599
case SQLITE_ROW : /* Valid Row */
@@ -601,7 +604,6 @@ PHP_METHOD(SQLite3, query)
601
604
free_item -> stmt_obj = stmt_obj ;
602
605
free_item -> stmt_obj_zval = stmt ;
603
606
zend_llist_add_element (& (db_obj -> free_list ), & free_item );
604
- sqlite3_reset (result -> stmt_obj -> stmt );
605
607
break ;
606
608
}
607
609
default :
@@ -610,6 +612,7 @@ PHP_METHOD(SQLite3, query)
610
612
}
611
613
sqlite3_finalize (stmt_obj -> stmt );
612
614
stmt_obj -> initialised = 0 ;
615
+ stmt_obj -> has_stepped = 0 ;
613
616
zval_ptr_dtor (return_value );
614
617
RETURN_FALSE ;
615
618
}
@@ -1432,6 +1435,7 @@ PHP_METHOD(SQLite3Stmt, reset)
1432
1435
SQLITE3_CHECK_INITIALIZED (stmt_obj -> db_obj , stmt_obj -> initialised , SQLite3 );
1433
1436
SQLITE3_CHECK_INITIALIZED_STMT (stmt_obj -> stmt , SQLite3Stmt );
1434
1437
1438
+ stmt_obj -> has_stepped = 0 ;
1435
1439
if (sqlite3_reset (stmt_obj -> stmt ) != SQLITE_OK ) {
1436
1440
php_sqlite3_error (stmt_obj -> db_obj , "Unable to reset statement: %s" , sqlite3_errmsg (sqlite3_db_handle (stmt_obj -> stmt )));
1437
1441
RETURN_FALSE ;
@@ -1782,12 +1786,14 @@ PHP_METHOD(SQLite3Stmt, execute)
1782
1786
}
1783
1787
1784
1788
return_code = sqlite3_step (stmt_obj -> stmt );
1789
+ stmt_obj -> has_stepped = 1 ;
1790
+ ZEND_ASSERT (return_code >= 0 && return_code < (1 << 30 ));
1791
+ stmt_obj -> last_step_result = return_code ;
1785
1792
1786
1793
switch (return_code ) {
1787
1794
case SQLITE_ROW : /* Valid Row */
1788
1795
case SQLITE_DONE : /* Valid but no results */
1789
1796
{
1790
- sqlite3_reset (stmt_obj -> stmt );
1791
1797
object_init_ex (return_value , php_sqlite3_result_entry );
1792
1798
result = Z_SQLITE3_RESULT_P (return_value );
1793
1799
@@ -1800,9 +1806,6 @@ PHP_METHOD(SQLite3Stmt, execute)
1800
1806
1801
1807
break ;
1802
1808
}
1803
- case SQLITE_ERROR :
1804
- sqlite3_reset (stmt_obj -> stmt );
1805
- ZEND_FALLTHROUGH ;
1806
1809
default :
1807
1810
if (!EG (exception )) {
1808
1811
php_sqlite3_error (stmt_obj -> db_obj , "Unable to execute statement: %s" , sqlite3_errmsg (sqlite3_db_handle (stmt_obj -> stmt )));
@@ -1941,7 +1944,14 @@ PHP_METHOD(SQLite3Result, fetchArray)
1941
1944
1942
1945
SQLITE3_CHECK_INITIALIZED (result_obj -> db_obj , result_obj -> stmt_obj -> initialised , SQLite3Result )
1943
1946
1944
- ret = sqlite3_step (result_obj -> stmt_obj -> stmt );
1947
+ if (result_obj -> stmt_obj -> has_stepped ) {
1948
+ ret = result_obj -> stmt_obj -> last_step_result ;
1949
+ } else {
1950
+ ret = sqlite3_step (result_obj -> stmt_obj -> stmt );
1951
+ result_obj -> stmt_obj -> has_stepped = 1 ;
1952
+ ZEND_ASSERT (ret >= 0 && ret < (1 << 30 ));
1953
+ result_obj -> stmt_obj -> last_step_result = ret ;
1954
+ }
1945
1955
switch (ret ) {
1946
1956
case SQLITE_ROW :
1947
1957
/* If there was no return value then just skip fetching */
@@ -1985,6 +1995,7 @@ PHP_METHOD(SQLite3Result, fetchArray)
1985
1995
zend_symtable_add_new (Z_ARR_P (return_value ), result_obj -> column_names [i ], & data );
1986
1996
}
1987
1997
}
1998
+ result_obj -> stmt_obj -> has_stepped = 0 ;
1988
1999
break ;
1989
2000
1990
2001
case SQLITE_DONE :
@@ -2021,6 +2032,7 @@ PHP_METHOD(SQLite3Result, reset)
2021
2032
2022
2033
sqlite3result_clear_column_names_cache (result_obj );
2023
2034
2035
+ result_obj -> stmt_obj -> has_stepped = 0 ;
2024
2036
if (sqlite3_reset (result_obj -> stmt_obj -> stmt ) != SQLITE_OK ) {
2025
2037
RETURN_FALSE ;
2026
2038
}
@@ -2047,6 +2059,7 @@ PHP_METHOD(SQLite3Result, finalize)
2047
2059
zend_llist_del_element (& (result_obj -> db_obj -> free_list ), & result_obj -> stmt_obj_zval ,
2048
2060
(int (* )(void * , void * )) php_sqlite3_compare_stmt_zval_free );
2049
2061
} else {
2062
+ result_obj -> stmt_obj -> has_stepped = 0 ;
2050
2063
sqlite3_reset (result_obj -> stmt_obj -> stmt );
2051
2064
}
2052
2065
@@ -2273,6 +2286,7 @@ static void php_sqlite3_result_object_free_storage(zend_object *object) /* {{{ *
2273
2286
if (!Z_ISNULL (intern -> stmt_obj_zval )) {
2274
2287
if (intern -> stmt_obj && intern -> stmt_obj -> initialised ) {
2275
2288
sqlite3_reset (intern -> stmt_obj -> stmt );
2289
+ intern -> stmt_obj -> has_stepped = 0 ;
2276
2290
}
2277
2291
2278
2292
zval_ptr_dtor (& intern -> stmt_obj_zval );
@@ -2312,6 +2326,7 @@ static zend_object *php_sqlite3_stmt_object_new(zend_class_entry *class_type) /*
2312
2326
object_properties_init (& intern -> zo , class_type );
2313
2327
2314
2328
intern -> zo .handlers = & sqlite3_stmt_object_handlers ;
2329
+ intern -> has_stepped = 0 ;
2315
2330
2316
2331
return & intern -> zo ;
2317
2332
}
0 commit comments