From afd0147e6958134a9efdb2f0f1ae470314ab5580 Mon Sep 17 00:00:00 2001 From: Tapac Date: Tue, 24 Mar 2020 00:53:48 +0300 Subject: [PATCH] Exposed tries to create the same foreign key constraint even if one already exists #843 --- .../main/kotlin/org/jetbrains/exposed/sql/Queries.kt | 2 +- .../kotlin/org/jetbrains/exposed/sql/SchemaUtils.kt | 4 ++-- .../org/jetbrains/exposed/sql/vendors/Default.kt | 10 ++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Queries.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Queries.kt index fa507b0813..cc9e2da6a2 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Queries.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Queries.kt @@ -287,7 +287,7 @@ private fun checkMissingIndices(vararg tables: Table): List { val fKeyConstraints = currentDialect.columnConstraints(*tables).keys val existingIndices = currentDialect.existingIndices(*tables) fun List.filterFKeys() = if (isMysql) - filterNot { (it.table.tableName.inProperCase() to it.columns.singleOrNull()?.let { c -> tr.identity(c) }) in fKeyConstraints } + filterNot { it.table to it.columns.singleOrNull() in fKeyConstraints } else this diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/SchemaUtils.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/SchemaUtils.kt index a0f4ee001f..b7399869a5 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/SchemaUtils.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/SchemaUtils.kt @@ -149,10 +149,10 @@ object SchemaUtils { for (column in table.columns) { val foreignKey = column.foreignKey if (foreignKey != null) { - val existingConstraint = existingColumnConstraint[table.tableName.inProperCase() to identity(column)]?.firstOrNull() + val existingConstraint = existingColumnConstraint[table to column]?.firstOrNull() if (existingConstraint == null) { statements.addAll(createFKey(column)) - } else if (existingConstraint.targetTable != foreignKey.targetTable + } else if (existingConstraint.target.table != foreignKey.target.table || foreignKey.deleteRule != existingConstraint.deleteRule || foreignKey.updateRule != existingConstraint.updateRule) { statements.addAll(existingConstraint.dropStatement()) diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/Default.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/Default.kt index a19dbb289d..a469a4d1e7 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/Default.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/Default.kt @@ -7,8 +7,6 @@ import java.nio.ByteBuffer import java.util.* import java.util.concurrent.ConcurrentHashMap -internal typealias TableAndColumnName = Pair - /** * Provides definitions for all the supported SQL data types. * By default, definitions from the SQL standard are provided but if a vendor doesn't support a specific type, or it is @@ -523,7 +521,7 @@ interface DatabaseDialect { fun tableColumns(vararg tables: Table): Map> = emptyMap() /** Returns a map with the foreign key constraints of all the defined columns in each of the specified [tables]. */ - fun columnConstraints(vararg tables: Table): Map> = emptyMap() + fun columnConstraints(vararg tables: Table): Map>, List> = emptyMap() /** Returns a map with all the defined indices in each of the specified [tables]. */ fun existingIndices(vararg tables: Table): Map> = emptyMap() @@ -613,15 +611,15 @@ abstract class VendorDialect( override fun tableColumns(vararg tables: Table): Map> = TransactionManager.current().connection.metadata { columns(*tables) } - override fun columnConstraints(vararg tables: Table): Map, List> { - val constraints = HashMap, MutableList>() + override fun columnConstraints(vararg tables: Table): Map>, List> { + val constraints = HashMap>, MutableList>() val tablesToLoad = tables.filter { !columnConstraintsCache.containsKey(it.nameInDatabaseCase()) } fillConstraintCacheForTables(tablesToLoad) tables.forEach { table -> columnConstraintsCache[table.nameInDatabaseCase()].orEmpty().forEach { - constraints.getOrPut(it.fromTable to it.fromColumn) { arrayListOf() }.add(it) + constraints.getOrPut(it.from.table to it.from) { arrayListOf() }.add(it) } }