From fea6f6dcb70e3fa7f60cab970ed444b5e5e2a3fa Mon Sep 17 00:00:00 2001 From: Vasu Nori Date: Fri, 21 May 2010 15:36:06 -0700 Subject: [PATCH] sqlite crashes when closing the database A change was made in the last CL to ask sqlite for all unfinalized statements and then finalizing them before closing the database. But this crashes sqlite! because sqlite's FTS3 module keeps some prepared statements around and they should not be finalized before closing the database. (when sqlite is asked for all unfianlized statements, it also returns the FTS3's reserved prepared statements which should not be finalized!!) Change-Id: I141ab4563985b8cd1305a1228c4cb01bc7281bcb --- core/java/android/database/sqlite/SQLiteDatabase.java | 2 ++ core/jni/android_database_SQLiteDatabase.cpp | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index e6f54e263c3f6..e34e7768ca49a 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -926,6 +926,8 @@ public class SQLiteDatabase extends SQLiteClosable { lock(); try { closeClosable(); + // finalize ALL statements queued up so far + closePendingStatements(); // close this database instance - regardless of its reference count value onAllReferencesReleased(); } finally { diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp index 3d2f54da8cd90..0c50c547c7a56 100644 --- a/core/jni/android_database_SQLiteDatabase.cpp +++ b/core/jni/android_database_SQLiteDatabase.cpp @@ -215,7 +215,6 @@ static void enableSqlProfiling(JNIEnv* env, jobject object, jstring databaseName static void dbclose(JNIEnv* env, jobject object) { sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle); - sqlite3_stmt * pStmt; if (handle != NULL) { // release the memory associated with the traceFuncArg in enableSqlTracing function @@ -228,10 +227,6 @@ static void dbclose(JNIEnv* env, jobject object) if (traceFuncArg != NULL) { free(traceFuncArg); } - // finalize all statements on this handle - while ((pStmt = sqlite3_next_stmt(handle, 0)) != 0 ) { - sqlite3_finalize(pStmt); - } LOGV("Closing database: handle=%p\n", handle); int result = sqlite3_close(handle); if (result == SQLITE_OK) {