Clear statement cache if schema changes.
If DDL statement is executed then the prepared statement cache must be cleaned up on active connections, otherwise their column result information can be outdated. Bug: 183028015 Test: atest CtsDatabaseTestCases Change-Id: I7e51007afb029c0591e48eaa0be908bcb92df576
This commit is contained in:
@@ -1392,6 +1392,10 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
|
||||
return sql.replaceAll("[\\s]*\\n+[\\s]*", " ");
|
||||
}
|
||||
|
||||
void clearPreparedStatementCache() {
|
||||
mPreparedStatementCache.evictAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Holder type for a prepared statement.
|
||||
*
|
||||
|
||||
@@ -1126,6 +1126,16 @@ public final class SQLiteConnectionPool implements Closeable {
|
||||
mConnectionWaiterPool = waiter;
|
||||
}
|
||||
|
||||
void clearAcquiredConnectionsPreparedStatementCache() {
|
||||
synchronized (mLock) {
|
||||
if (!mAcquiredConnections.isEmpty()) {
|
||||
for (SQLiteConnection connection : mAcquiredConnections.keySet()) {
|
||||
connection.clearPreparedStatementCache();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dumps debugging information about this connection pool.
|
||||
*
|
||||
|
||||
@@ -2088,10 +2088,12 @@ public final class SQLiteDatabase extends SQLiteClosable {
|
||||
try (SQLiteStatement statement = new SQLiteStatement(this, sql, bindArgs)) {
|
||||
return statement.executeUpdateDelete();
|
||||
} finally {
|
||||
// If schema was updated, close non-primary connections, otherwise they might
|
||||
// have outdated schema information
|
||||
// If schema was updated, close non-primary connections and clear prepared
|
||||
// statement caches of active connections, otherwise they might have outdated
|
||||
// schema information.
|
||||
if (statementType == DatabaseUtils.STATEMENT_DDL) {
|
||||
mConnectionPoolLocked.closeAvailableNonPrimaryConnectionsAndLogExceptions();
|
||||
mConnectionPoolLocked.clearAcquiredConnectionsPreparedStatementCache();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user