sqldelight
sqldelight copied to clipboard
incorrect code generation for PRAGMA optimize;
SQLDelight Version
2.0.1
Operating System
MacOS 15.3.2 (24D81)
Gradle Version
8.8
Kotlin Version
1.9.23
Dialect
3-38
AGP Version
No response
Describe the Bug
steps to repro:
- create a new file Test.sq
- add the following SQL query
optimize:
PRAGMA optimize;
Expected Behavior: The code generation should create a correct Kotlin function, for example:
public fun optimize(): ExecutableQuery<String> = Query(-329_664_196, driver, "Debug.sq",
"optimize", "PRAGMA optimize") { cursor ->
cursor.getString(0)!!
}
Actual Behavior: Two functions are generated with an incorrect overload:
public class TestQueries(
driver: SqlDriver,
) : TransacterImpl(driver) {
public fun optimize(): ExecutableQuery<String> = Query(-329_664_196, driver, "Test.sq",
"optimize", "PRAGMA optimize") { cursor ->
cursor.getString(0)!!
}
public fun optimize() {
driver.execute(-329_664_196, """PRAGMA optimize""", 0)
}
}
This causes the following error message and prevents the code from compiling:
Conflicting overloads: public final fun optimize(): ExecutableQuery<String> defined in com.wire.kalium.persistence.TestQueries, public final fun optimize(): Unit defined in com.wire.kalium.persistence.TestQueries
Workaround: Wrapping the SQL query in a transaction resolves the compile issue. For example:
optimize {
PRAGMA optimize;
}
will output a valid code
public class TestQueries(
driver: SqlDriver,
) : TransacterImpl(driver) {
public fun optimize(): ExecutableQuery<String> = OptimizeQuery() { cursor ->
cursor.getString(0)!!
}
private inner class OptimizeQuery<out T : Any>(
mapper: (SqlCursor) -> T,
) : ExecutableQuery<T>(mapper) {
override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> =
transactionWithResult {
driver.executeQuery(1_020_290_541, """PRAGMA optimize""", mapper, 0)
}
override fun toString(): String = "Test.sq:optimize"
}
}
Stacktrace
Gradle Build Script
Similar issue https://github.com/sqldelight/sqldelight/issues/4468