Skip to content

Commit d5d0995

Browse files
committed
Avoid query rerun. Closes: #13587
1 parent 0306983 commit d5d0995

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

ext/sqlite3/php_sqlite3_structs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct _php_sqlite3_result_object {
107107
zend_string **column_names;
108108

109109
int is_prepared_statement;
110+
int complete;
110111
zend_object zo;
111112
};
112113

ext/sqlite3/sqlite3.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -598,8 +598,11 @@ PHP_METHOD(SQLite3, query)
598598
return_code = sqlite3_step(result->stmt_obj->stmt);
599599

600600
switch (return_code) {
601-
case SQLITE_ROW: /* Valid Row */
602601
case SQLITE_DONE: /* Valid but no results */
602+
{
603+
result->complete = 1;
604+
}
605+
case SQLITE_ROW: /* Valid Row */
603606
{
604607
php_sqlite3_free_list *free_item;
605608
free_item = emalloc(sizeof(php_sqlite3_free_list));
@@ -610,6 +613,7 @@ PHP_METHOD(SQLite3, query)
610613
break;
611614
}
612615
default:
616+
result->complete = 1;
613617
if (!EG(exception)) {
614618
php_sqlite3_error(db_obj, sqlite3_errcode(db_obj->db), "Unable to execute statement: %s", sqlite3_errmsg(db_obj->db));
615619
}
@@ -700,6 +704,9 @@ PHP_METHOD(SQLite3, querySingle)
700704
return_code = sqlite3_step(stmt);
701705

702706
switch (return_code) {
707+
php_sqlite3_result *result_obj;
708+
zval *object = ZEND_THIS;
709+
result_obj = Z_SQLITE3_RESULT_P(object);
703710
case SQLITE_ROW: /* Valid Row */
704711
{
705712
if (!entire_row) {
@@ -717,6 +724,8 @@ PHP_METHOD(SQLite3, querySingle)
717724
}
718725
case SQLITE_DONE: /* Valid but no results */
719726
{
727+
result_obj->complete = 1;
728+
720729
if (!entire_row) {
721730
RETVAL_NULL();
722731
} else {
@@ -725,6 +734,7 @@ PHP_METHOD(SQLite3, querySingle)
725734
break;
726735
}
727736
default:
737+
result_obj->complete = 1;
728738
if (!EG(exception)) {
729739
php_sqlite3_error(db_obj, sqlite3_errcode(db_obj->db), "Unable to execute statement: %s", sqlite3_errmsg(db_obj->db));
730740
}
@@ -1798,14 +1808,16 @@ PHP_METHOD(SQLite3Stmt, execute)
17981808

17991809
return_code = sqlite3_step(stmt_obj->stmt);
18001810

1811+
sqlite3_reset(stmt_obj->stmt);
1812+
object_init_ex(return_value, php_sqlite3_result_entry);
1813+
result = Z_SQLITE3_RESULT_P(return_value);
18011814
switch (return_code) {
1802-
case SQLITE_ROW: /* Valid Row */
18031815
case SQLITE_DONE: /* Valid but no results */
1816+
{
1817+
result->complete = 1;
1818+
}
1819+
case SQLITE_ROW: /* Valid Row */
18041820
{
1805-
sqlite3_reset(stmt_obj->stmt);
1806-
object_init_ex(return_value, php_sqlite3_result_entry);
1807-
result = Z_SQLITE3_RESULT_P(return_value);
1808-
18091821
result->is_prepared_statement = 1;
18101822
result->db_obj = stmt_obj->db_obj;
18111823
result->stmt_obj = stmt_obj;
@@ -1816,9 +1828,11 @@ PHP_METHOD(SQLite3Stmt, execute)
18161828
break;
18171829
}
18181830
case SQLITE_ERROR:
1831+
result_obj->complete = 1;
18191832
sqlite3_reset(stmt_obj->stmt);
18201833
ZEND_FALLTHROUGH;
18211834
default:
1835+
result_obj->complete = 1;
18221836
if (!EG(exception)) {
18231837
php_sqlite3_error(stmt_obj->db_obj, sqlite3_errcode(sqlite3_db_handle(stmt_obj->stmt)), "Unable to execute statement: %s", sqlite3_errmsg(sqlite3_db_handle(stmt_obj->stmt)));
18241838
}
@@ -1886,6 +1900,10 @@ PHP_METHOD(SQLite3Result, numColumns)
18861900

18871901
SQLITE3_CHECK_INITIALIZED(result_obj->db_obj, result_obj->stmt_obj->initialised, SQLite3Result)
18881902

1903+
if (result_obj->complete) {
1904+
RETURN_FALSE;
1905+
}
1906+
18891907
RETURN_LONG(sqlite3_column_count(result_obj->stmt_obj->stmt));
18901908
}
18911909
/* }}} */
@@ -1953,6 +1971,10 @@ PHP_METHOD(SQLite3Result, fetchArray)
19531971

19541972
SQLITE3_CHECK_INITIALIZED(result_obj->db_obj, result_obj->stmt_obj->initialised, SQLite3Result)
19551973

1974+
if (result_obj->complete==1) {
1975+
return;
1976+
}
1977+
19561978
ret = sqlite3_step(result_obj->stmt_obj->stmt);
19571979
switch (ret) {
19581980
case SQLITE_ROW:
@@ -2006,6 +2028,7 @@ PHP_METHOD(SQLite3Result, fetchArray)
20062028
break;
20072029

20082030
default:
2031+
result_obj->complete = 1;
20092032
php_sqlite3_error(result_obj->db_obj, sqlite3_errcode(sqlite3_db_handle(result_obj->stmt_obj->stmt)), "Unable to execute statement: %s", sqlite3_errmsg(sqlite3_db_handle(result_obj->stmt_obj->stmt)));
20102033
}
20112034
}

0 commit comments

Comments
 (0)