Skip to content

Commit

Permalink
fix: EXPOSED-527 BUG: mergeFrom(...) using a query with const-conditi…
Browse files Browse the repository at this point in the history
…on dosn't work (#2236)
  • Loading branch information
obabichevjb committed Sep 19, 2024
1 parent 8f8499c commit baf3add
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 0 deletions.
1 change: 1 addition & 0 deletions exposed-core/api/exposed-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -3188,6 +3188,7 @@ public class org/jetbrains/exposed/sql/statements/InsertStatement : org/jetbrain

public class org/jetbrains/exposed/sql/statements/MergeSelectStatement : org/jetbrains/exposed/sql/statements/MergeStatement {
public fun <init> (Lorg/jetbrains/exposed/sql/Table;Lorg/jetbrains/exposed/sql/QueryAlias;Lorg/jetbrains/exposed/sql/Op;)V
public fun arguments ()Ljava/lang/Iterable;
public final fun getOn ()Lorg/jetbrains/exposed/sql/Op;
public fun prepareSQL (Lorg/jetbrains/exposed/sql/Transaction;Z)Ljava/lang/String;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,14 @@ open class MergeSelectStatement(
private val selectQuery: QueryAlias,
val on: Op<Boolean>
) : MergeStatement(dest) {
override fun arguments(): Iterable<Iterable<Pair<IColumnType<*>, Any?>>> {
val queryArguments = selectQuery.query.arguments().firstOrNull() ?: emptyList()
val mergeStatementArguments = super.arguments().firstOrNull() ?: emptyList()
return listOf(
queryArguments + mergeStatementArguments
)
}

override fun prepareSQL(transaction: Transaction, prepared: Boolean): String {
return transaction.db.dialect.functionProvider.mergeSelect(table, selectQuery, transaction, clauses, on, prepared)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,24 @@ class MergeSelectTest : MergeBaseTest() {
assertNull(dest.selectAll().where { dest.key inList listOf("only-in-source-2", "only-in-source-3") }.firstOrNull())
}
}

@Test
fun testMergeFromWithConstCondition() {
val filteredSourceQuery = Source.selectAll().where { Source.key eq "only-in-source-1" }.alias("sub")

withMergeTestTablesAndDefaultData { dest, source ->
dest.mergeFrom(
filteredSourceQuery,
on = { Dest.key eq filteredSourceQuery[Source.key] },
) {
whenNotMatchedInsert {
it[dest.key] = filteredSourceQuery[source.key]
it[dest.value] = filteredSourceQuery[source.value]
}
}

assertEquals(1, dest.getByKey("only-in-source-1")[dest.value])
assertNull(dest.selectAll().where { Dest.key eq "only-in-source-2" }.firstOrNull())
}
}
}

0 comments on commit baf3add

Please sign in to comment.