cashapp / sqldelight

SQLDelight - Generates typesafe Kotlin APIs from SQL
https://cashapp.github.io/sqldelight/
Apache License 2.0
6.01k stars 501 forks source link

AndroidSqliteDriver fails to create single Table when not In-memory #5291

Open Mithrandir21 opened 2 weeks ago

Mithrandir21 commented 2 weeks ago

SQLDelight Version

2.0.2

Application Operating System

Android, iOS, Native

Describe the Bug

When using a not in-memory DB on Android, a single table fails to be created while multiple others are successfully created. Creation of tables can be verified by removing any usage of the failing Table, allowing for testing of other successfully created tables in the DB.

The database and all tables are successfully created on Desktop, which only uses in-memory. Link Exact codebase and commit provided to showcase failing and successful case.

Simplest version of the failing Table:

CREATE TABLE DatabaseNews (
    id INTEGER PRIMARY KEY NOT NULL,
    title TEXT NOT NULL
);

Android failing setup:

actual class DriverFactory(private val context: Context) {
    actual fun createDriver(): SqlDriver {
        return AndroidSqliteDriver(
            schema = Database.Schema,
            context = context,
            name = "Domain.db" // <-- Omitting this field will lead to creating in-memory DB and successful DB creation.
        )
    }
}

This commit showcases the fail vs success in openly available repo, allowing for reproducing issue: https://github.com/Mithrandir21/monkey_barrel_comedy_app/commit/5d9c0f4f865ca7448f0d1ec64641430458349d9e

SQLite logcat output does not show any specific failure:

30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA page_size"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA foreign_keys"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA journal_mode"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA journal_mode=TRUNCATE"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA synchronous"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA journal_size_limit"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA journal_size_limit=524288"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA wal_autocheckpoint"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA wal_autocheckpoint=100"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "CREATE TABLE IF NOT EXISTS android_metadata (locale TEXT)"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "SELECT locale FROM android_metadata UNION SELECT NULL ORDER BY locale DESC LIMIT 1"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA user_version;"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "PRAGMA user_version;"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "BEGIN IMMEDIATE;"
30293-30293 SQLiteLog               pm.bam.mbc   E  (1) no such table: DatabaseNews in "DELETE FROM DatabaseNews"
30293-30293 SQLiteStatements        pm.bam.mbc   V  /data/user/0/pm.bam.mbc/databases/Domain.db: "ROLLBACK;"
30293-30293 AndroidRuntime          pm.bam.mbc   E  FATAL EXCEPTION: main
Process: pm.bam.mbc, PID: 30293
android.database.sqlite.SQLiteException: no such table: DatabaseNews (code 1 SQLITE_ERROR): , while compiling: DELETE FROM DatabaseNews

Stacktrace

FATAL EXCEPTION: main
Process: pm.bam.mbc, PID: 29947
android.database.sqlite.SQLiteException: no such table: DatabaseNews (code 1 SQLITE_ERROR): , while compiling: DELETE FROM DatabaseNews
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1069)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:673)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:62)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:34)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1392)
at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.compileStatement(FrameworkSQLiteDatabase.kt:51)
at app.cash.sqldelight.driver.android.AndroidSqliteDriver$execute$1.invoke(AndroidSqliteDriver.kt:184)
at app.cash.sqldelight.driver.android.AndroidSqliteDriver$execute$1.invoke(AndroidSqliteDriver.kt:184)
at app.cash.sqldelight.driver.android.AndroidSqliteDriver.execute-zeHU3Mk(AndroidSqliteDriver.kt:163)
at app.cash.sqldelight.driver.android.AndroidSqliteDriver.execute(AndroidSqliteDriver.kt:184)
at app.cash.sqldelight.db.SqlDriver$DefaultImpls.execute$default(SqlDriver.kt:63)
at pmbammbcdomain.DatabaseNewsQueries.deleteAll(DatabaseNewsQueries.kt:170)
...
...
...