sqldelight icon indicating copy to clipboard operation
sqldelight copied to clipboard

incorrect code generation for PRAGMA optimize;

Open MohamadJaara opened this issue 8 months ago • 1 comments

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:

  1. create a new file Test.sq
  2. 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


MohamadJaara avatar Mar 24 '25 09:03 MohamadJaara

Similar issue https://github.com/sqldelight/sqldelight/issues/4468

griffio avatar Mar 29 '25 15:03 griffio