in c/driver/sqlite/sqlite.c [1174:1242]
AdbcStatusCode SqliteStatementExecuteQuery(struct AdbcStatement* statement,
struct ArrowArrayStream* out,
int64_t* rows_affected,
struct AdbcError* error) {
CHECK_STMT_INIT(statement, error);
struct SqliteStatement* stmt = (struct SqliteStatement*)statement->private_data;
if (stmt->target_table) {
return SqliteStatementExecuteIngest(stmt, rows_affected, error);
}
AdbcStatusCode status = SqliteStatementPrepare(statement, error);
if (status != ADBC_STATUS_OK) return status;
if (stmt->binder.schema.release) {
int64_t expected = sqlite3_bind_parameter_count(stmt->stmt);
int64_t actual = stmt->binder.schema.n_children;
if (actual != expected) {
SetError(error,
"[SQLite] Parameter count mismatch: expected %" PRId64
" but found %" PRId64,
expected, actual);
return ADBC_STATUS_INVALID_STATE;
}
}
if (!out) {
// Update
sqlite3_mutex_enter(sqlite3_db_mutex(stmt->conn));
AdbcStatusCode status = ADBC_STATUS_OK;
int64_t rows = 0;
while (1) {
if (stmt->binder.schema.release) {
char finished = 0;
status = AdbcSqliteBinderBindNext(&stmt->binder, stmt->conn, stmt->stmt,
&finished, error);
if (status != ADBC_STATUS_OK || finished) {
break;
}
}
while (sqlite3_step(stmt->stmt) == SQLITE_ROW) {
rows++;
}
if (!stmt->binder.schema.release) break;
}
if (sqlite3_reset(stmt->stmt) != SQLITE_OK) {
status = ADBC_STATUS_IO;
const char* msg = sqlite3_errmsg(stmt->conn);
SetError(error, "[SQLite] Failed to execute query: %s",
(msg == NULL) ? "(unknown error)" : msg);
}
sqlite3_mutex_leave(sqlite3_db_mutex(stmt->conn));
AdbcSqliteBinderRelease(&stmt->binder);
if (rows_affected) *rows_affected = rows;
return status;
}
// Query
if (rows_affected) *rows_affected = -1;
struct AdbcSqliteBinder* binder = stmt->binder.schema.release ? &stmt->binder : NULL;
return AdbcSqliteExportReader(stmt->conn, stmt->stmt, binder, stmt->batch_size, out,
error);
}