From 3a7569662ee6286a9c9138963b0f70beba90a561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Barto=C5=A1?= Date: Tue, 24 Jun 2025 18:26:30 +0200 Subject: [PATCH] Use updated PostgresDatabase from Liquibase 4.32.0 (#40530) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Bartoš --- .../liquibase/UpdatedPostgresDatabase.java | 54 +++++++++++++++++++ .../services/liquibase.database.Database | 3 +- .../keycloak/config/database/Database.java | 2 +- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/UpdatedPostgresDatabase.java diff --git a/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/UpdatedPostgresDatabase.java b/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/UpdatedPostgresDatabase.java new file mode 100644 index 00000000000..2e5add267f4 --- /dev/null +++ b/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/UpdatedPostgresDatabase.java @@ -0,0 +1,54 @@ +package org.keycloak.connections.jpa.updater.liquibase; + +import liquibase.GlobalConfiguration; +import liquibase.database.ObjectQuotingStrategy; +import liquibase.database.core.PostgresDatabase; +import liquibase.structure.DatabaseObject; +import liquibase.structure.core.Catalog; +import liquibase.structure.core.Schema; +import liquibase.util.StringUtil; + +import java.util.Locale; + +/** + * Workaround for keycloak#39917 + * Remove it once Liquibase 4.32.0 is used + */ +public class UpdatedPostgresDatabase extends PostgresDatabase { + + @Override + public int getPriority() { + return super.getPriority() + 1; // Always take precedence over factory PostgresDatabase + } + + /** + * Use updated version present in Liquibase 4.32.0 - PostgresDatabase.correctObjectName() + */ + @Override + public String correctObjectName(String objectName, Class objectType) { + if ((objectName == null) || (quotingStrategy != ObjectQuotingStrategy.LEGACY)) { + return super.correctObjectName(objectName, objectType); + } + // + // Check preserve case flag for schema + // + if (objectType.equals(Schema.class) && Boolean.TRUE.equals(GlobalConfiguration.PRESERVE_SCHEMA_CASE.getCurrentValue())) { + return objectName; + } + + if (objectType.equals(Catalog.class) && !StringUtil.hasLowerCase(objectName)) { + return objectName; + } + + if (objectName.contains("-") + || hasMixedCase(objectName) + || startsWithNumeric(objectName) + || isReservedWord(objectName)) { + return objectName; + } else { + return objectName.toLowerCase(Locale.US); + } + } + + +} diff --git a/model/jpa/src/main/resources/META-INF/services/liquibase.database.Database b/model/jpa/src/main/resources/META-INF/services/liquibase.database.Database index 238e52b6de4..065c8fb4012 100644 --- a/model/jpa/src/main/resources/META-INF/services/liquibase.database.Database +++ b/model/jpa/src/main/resources/META-INF/services/liquibase.database.Database @@ -17,4 +17,5 @@ org.keycloak.connections.jpa.updater.liquibase.PostgresPlusDatabase org.keycloak.connections.jpa.updater.liquibase.UpdatedMariaDBDatabase -org.keycloak.connections.jpa.updater.liquibase.UpdatedMySqlDatabase \ No newline at end of file +org.keycloak.connections.jpa.updater.liquibase.UpdatedMySqlDatabase +org.keycloak.connections.jpa.updater.liquibase.UpdatedPostgresDatabase \ No newline at end of file diff --git a/quarkus/config-api/src/main/java/org/keycloak/config/database/Database.java b/quarkus/config-api/src/main/java/org/keycloak/config/database/Database.java index 27a1db913e2..93f2574a2af 100644 --- a/quarkus/config-api/src/main/java/org/keycloak/config/database/Database.java +++ b/quarkus/config-api/src/main/java/org/keycloak/config/database/Database.java @@ -210,7 +210,7 @@ public final class Database { getProperty(DatabaseOptions.DB_URL_PORT, namedProperty, "5432"), getProperty(DatabaseOptions.DB_URL_DATABASE, namedProperty, "keycloak"), getProperty(DatabaseOptions.DB_URL_PROPERTIES, namedProperty)), - asList("liquibase.database.core.PostgresDatabase", "org.keycloak.connections.jpa.updater.liquibase.PostgresPlusDatabase"), + asList("org.keycloak.connections.jpa.updater.liquibase.UpdatedPostgresDatabase", "org.keycloak.connections.jpa.updater.liquibase.PostgresPlusDatabase"), "postgres" ), MSSQL("mssql",