Skip to content

Commit c8c3bc7

Browse files
committed
fix: EXPOSED-701 [Oracle] Insert into table using only database default values fails
Oracle currently generates a statement like `INSERT ... DEFAULT VALUES` if an insert operation is performed with no provided column set. This fails because that syntax is not supported. This switches to the `INSERT ... VALUES(DEFAULT, ...)` syntax instead and includes a test for this case.
1 parent e622c7c commit c8c3bc7

File tree

2 files changed

+38
-0
lines changed
  • exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors
  • exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/dml

2 files changed

+38
-0
lines changed

exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/OracleDialect.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,22 @@ internal object OracleFunctionProvider : FunctionProvider() {
367367
}
368368
}
369369

370+
override fun insert(
371+
ignore: Boolean,
372+
table: Table,
373+
columns: List<Column<*>>,
374+
expr: String,
375+
transaction: Transaction
376+
): String {
377+
val def = super.insert(ignore, table, columns, expr, transaction)
378+
return if (def.endsWith(" $DEFAULT_VALUE_EXPRESSION")) {
379+
val oracleDefaults = "VALUES(DEFAULT${", DEFAULT".repeat(table.columns.lastIndex)})"
380+
"${def.removeSuffix(DEFAULT_VALUE_EXPRESSION)}$oracleDefaults"
381+
} else {
382+
def
383+
}
384+
}
385+
370386
override fun explain(
371387
analyze: Boolean,
372388
options: String?,

exposed-tests/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/dml/InsertTests.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import org.jetbrains.exposed.dao.id.IdTable
88
import org.jetbrains.exposed.dao.id.IntIdTable
99
import org.jetbrains.exposed.sql.*
1010
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
11+
import org.jetbrains.exposed.sql.SqlExpressionBuilder.isNull
12+
import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
1113
import org.jetbrains.exposed.sql.kotlin.datetime.CurrentTimestamp
1214
import org.jetbrains.exposed.sql.kotlin.datetime.timestamp
1315
import org.jetbrains.exposed.sql.statements.BatchInsertStatement
@@ -788,4 +790,24 @@ class InsertTests : DatabaseTestsBase() {
788790
}
789791
}
790792
}
793+
794+
@Test
795+
fun testInsertOfDefaultValuesOnly() {
796+
val defaultAmount = 101
797+
val defaultLabel = "none"
798+
val defaultsOnlyTable = object : Table("defaults_only") {
799+
val amount = integer("amount").default(defaultAmount)
800+
val label = varchar("label", 32).default(defaultLabel)
801+
val active = bool("active").nullable()
802+
}
803+
804+
withTables(defaultsOnlyTable) {
805+
defaultsOnlyTable.insert { }
806+
807+
val defaultsOnlyInserted = (defaultsOnlyTable.amount eq defaultAmount) and
808+
(defaultsOnlyTable.label like defaultLabel) and
809+
defaultsOnlyTable.active.isNull()
810+
assertEquals(1, defaultsOnlyTable.selectAll().where { defaultsOnlyInserted }.count())
811+
}
812+
}
791813
}

0 commit comments

Comments
 (0)