summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/database/DatabaseUtils.java6
-rw-r--r--core/tests/coretests/src/android/database/DatabaseGeneralTest.java15
2 files changed, 21 insertions, 0 deletions
diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java
index 8cd3d7b5bc68..3d019f07cb84 100644
--- a/core/java/android/database/DatabaseUtils.java
+++ b/core/java/android/database/DatabaseUtils.java
@@ -1408,6 +1408,12 @@ public class DatabaseUtils {
} else if (prefixSql.equals("END")) {
return STATEMENT_COMMIT;
} else if (prefixSql.equals("ROL")) {
+ boolean isRollbackToSavepoint = sql.toUpperCase(Locale.ROOT).contains(" TO ");
+ if (isRollbackToSavepoint) {
+ Log.w(TAG, "Statement '" + sql
+ + "' may not work on API levels 16-27, use ';" + sql + "' instead");
+ return STATEMENT_OTHER;
+ }
return STATEMENT_ABORT;
} else if (prefixSql.equals("BEG")) {
return STATEMENT_BEGIN;
diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
index 335cea772a74..50e29c2863c2 100644
--- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
@@ -1221,4 +1221,19 @@ public class DatabaseGeneralTest extends AndroidTestCase implements PerformanceT
InstrumentationRegistry.getInstrumentation()).executeShellCommand(cmd);
}
+ @SmallTest
+ public void testSavepointRollbacks() {
+ try (SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(":memory:", null)) {
+ db.execSQL("drop table if exists data");
+ db.execSQL("create table if not exists data (id INTEGER PRIMARY KEY, val TEXT)");
+ db.execSQL("begin deferred transaction");
+ db.execSQL("insert into data (val) values('row 1')");
+ db.execSQL("savepoint foo");
+ db.execSQL("insert into data (val) values('row 2')");
+ db.execSQL("rollback to foo");
+ db.execSQL("commit transaction");
+ long rowCount = DatabaseUtils.longForQuery(db, "select count(*) from data", null);
+ assertEquals(1, rowCount);
+ }
+ }
}