diff options
| -rw-r--r-- | core/java/android/database/DatabaseUtils.java | 6 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/database/DatabaseGeneralTest.java | 15 |
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); + } + } } |