Queries do not import entity classes from root package directory when necessary
SQLDelight Version
2.0.1
Operating System
Linux
Gradle Version
8.4
Kotlin Version
1.9.21
Dialect
SQLite 3.35
AGP Version
8.1.0
Describe the Bug
Storing query files in a sub-module results in generated Kotlin files that miss import statements for the entity classes. This only happens if query functions use the RETURNING statement, since then they need to refer to the entity class.
My queries are inside a module called queries. I have the following query:
insert:
INSERT INTO users (name, emoji) VALUES (?, ?) RETURNING *;
My generated query looks like this:
package namespace.queries
import app.cash.sqldelight.ExecutableQuery
import app.cash.sqldelight.Query
import app.cash.sqldelight.SuspendingTransacterImpl
import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlCursor
import app.cash.sqldelight.db.SqlDriver
import kotlin.Any
import kotlin.Long
import kotlin.String
public class UserQueries(
driver: SqlDriver,
) : SuspendingTransacterImpl(driver) {
public fun <T : Any> insert(
name: String,
emoji: String,
mapper: (
id: Long,
name: String,
emoji: String,
) -> T,
): ExecutableQuery<T> = InsertQuery(name, emoji) { cursor ->
mapper(
cursor.getLong(0)!!,
cursor.getString(1)!!,
cursor.getString(2)!!
)
}
public fun insert(name: String, emoji: String): ExecutableQuery<Users> = insert(name, emoji) { id,
name_, emoji_ ->
Users(
id,
name_,
emoji_
)
}
public fun <T : Any> selectAll(mapper: (
id: Long,
name: String,
emoji: String,
) -> T): Query<T> = Query(272_669_366, arrayOf("users"), driver, "User.sq", "selectAll",
"SELECT * FROM users") { cursor ->
mapper(
cursor.getLong(0)!!,
cursor.getString(1)!!,
cursor.getString(2)!!
)
}
public fun selectAll(): Query<net.zerotask.karaoke.server.database.Users> = selectAll { id, name,
emoji ->
net.zerotask.karaoke.server.database.Users(
id,
name,
emoji
)
}
public suspend fun deleteAll() {
driver.execute(1_629_935_527, """DELETE FROM users""", 0).await()
notifyQueries(1_629_935_527) { emit ->
emit("users")
}
}
private inner class InsertQuery<out T : Any>(
public val name: String,
public val emoji: String,
mapper: (SqlCursor) -> T,
) : ExecutableQuery<T>(mapper) {
override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> =
driver.executeQuery(2_135_066_792,
"""INSERT INTO users (name, emoji) VALUES (?, ?) RETURNING *""", mapper, 2) {
bindString(0, name)
bindString(1, emoji)
}
override fun toString(): String = "User.sq:insert"
}
}
However, the entities themselves are in the namespace package. My sqldelight configuration is:
sqldelight {
databases {
create("Database") {
packageName.set("namespace")
dialect(libs.sqldelight.sqlite.dialect)
generateAsync.set(true)
}
}
}
Stacktrace
None available
Gradle Build Script
plugins {
alias(libs.plugins.kotlinJvm)
alias(libs.plugins.sqldelight)
}
group = "namespace"
version = "1.0.0"
sqldelight {
databases {
create("Database") {
packageName.set("namespace")
dialect(libs.sqldelight.sqlite.dialect)
generateAsync.set(true)
}
}
}
dependencies {
implementation(libs.sqldelight.sqlite)
}
🤔 This could be fixed by https://github.com/cashapp/sqldelight/pull/4885 issue https://github.com/cashapp/sqldelight/issues/4448
- It just missed the 2.0.1 release
Maybe try the snapshot release 2.1.0-SNAPSHOT and see if that works for you
To setup a build for snapshot -> https://cashapp.github.io/sqldelight/2.0.1/#snapshots