diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/OracleDialect.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/OracleDialect.kt index b8057d9fb2..c5d9428984 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/OracleDialect.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/OracleDialect.kt @@ -241,11 +241,7 @@ internal object OracleFunctionProvider : FunctionProvider() { transaction: Transaction ): String { val def = super.update(target, columnsAndValues, null, where, transaction) - return when { - limit != null && where != null -> "$def AND ROWNUM <= $limit" - limit != null -> "$def WHERE ROWNUM <= $limit" - else -> def - } + return def.appendLimitClause(limit, endsWithWhere = where != null) } override fun update( @@ -318,10 +314,16 @@ internal object OracleFunctionProvider : FunctionProvider() { limit: Int?, transaction: Transaction ): String { - if (limit != null) { - transaction.throwUnsupportedException("Oracle doesn't support LIMIT in DELETE clause.") + val def = super.delete(ignore, table, where, null, transaction) + return def.appendLimitClause(limit, endsWithWhere = where != null) + } + + private fun String.appendLimitClause(limit: Int?, endsWithWhere: Boolean): String { + return when { + limit != null && endsWithWhere -> "$this AND ROWNUM <= $limit" + limit != null -> "$this WHERE ROWNUM <= $limit" + else -> this } - return super.delete(ignore, table, where, null, transaction) } override fun delete( diff --git a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/dml/DeleteTests.kt b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/dml/DeleteTests.kt index b727ceeb94..7d9350cfcb 100644 --- a/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/dml/DeleteTests.kt +++ b/exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/dml/DeleteTests.kt @@ -22,7 +22,7 @@ import kotlin.test.expect class DeleteTests : DatabaseTestsBase() { private val limitNotSupported by lazy { val extra = setOf(TestDB.SQLITE).takeUnless { SQLiteDialect.ENABLE_UPDATE_DELETE_LIMIT }.orEmpty() - TestDB.ALL_POSTGRES_LIKE + TestDB.ALL_ORACLE_LIKE + extra + TestDB.ALL_POSTGRES_LIKE + extra } @Test