diff --git a/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/GeneratedColumnSqlGenerator.java b/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/GeneratedColumnSqlGenerator.java index ab426c90d9..9d3793cdbe 100644 --- a/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/GeneratedColumnSqlGenerator.java +++ b/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/GeneratedColumnSqlGenerator.java @@ -22,6 +22,8 @@ import java.util.List; import liquibase.database.Database; import liquibase.database.core.PostgresDatabase; +import liquibase.datatype.DataTypeFactory; +import liquibase.datatype.DatabaseDataType; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGenerator; @@ -89,8 +91,9 @@ public class GeneratedColumnSqlGenerator extends AddColumnGenerator { protected void handleGeneratedColumn(final GeneratedColumnStatement statement, final Database database, final StringBuilder sqlBuilder) { if (database instanceof PostgresDatabase) { // assemble the GENERATED ALWAYS AS section of the query using the json property selection function. + DatabaseDataType columnType = DataTypeFactory.getInstance().fromDescription(statement.getColumnType(), database).toDatabaseDataType(database); sqlBuilder.append(" GENERATED ALWAYS AS ((").append(statement.getJsonColumn()).append("->>'").append(statement.getJsonProperty()) - .append("')::").append(statement.getColumnType()).append(") stored"); + .append("')::").append(columnType).append(") stored"); } } } diff --git a/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/KeycloakKeyDataType.java b/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/KeycloakKeyDataType.java new file mode 100644 index 0000000000..8d809b573f --- /dev/null +++ b/model/map-jpa/src/main/java/org/keycloak/models/map/storage/jpa/liquibase/extension/KeycloakKeyDataType.java @@ -0,0 +1,51 @@ +/* + * Copyright 2022 Red Hat, Inc. and/or its affiliates + * and other contributors as indicated by the @author tags. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.keycloak.models.map.storage.jpa.liquibase.extension; + +import liquibase.change.core.LoadDataChange; +import liquibase.database.Database; +import liquibase.datatype.DataTypeInfo; +import liquibase.datatype.DatabaseDataType; +import liquibase.datatype.LiquibaseDataType; +import liquibase.datatype.core.VarcharType; + +/** + * A {@link LiquibaseDataType} used in columns that reference an entity that can be external to the JPA storage. In other + * words, they reference objects that might be stored in different storages, with different id formats than those used + * by the JPA storage. + *
+ * Its usage is encouraged to bring consistency to all columns that might reference external entities. + * + * @author Stefan Guilhen + */ +@DataTypeInfo(name="kc_key", minParameters = 0, maxParameters = 0, priority = LiquibaseDataType.PRIORITY_DEFAULT) +public class KeycloakKeyDataType extends LiquibaseDataType { + + @Override + public DatabaseDataType toDatabaseDataType(Database database) { + // convert the type into a varchar of size 4000. + VarcharType varcharType = new VarcharType(); + varcharType.addParameter("4000"); + return varcharType.toDatabaseDataType(database); + } + + @Override + public LoadDataChange.LOAD_DATA_TYPE getLoadTypeName() { + return LoadDataChange.LOAD_DATA_TYPE.STRING; + } +} diff --git a/model/map-jpa/src/main/resources/META-INF/auth-sessions/jpa-auth-sessions-changelog-1.xml b/model/map-jpa/src/main/resources/META-INF/auth-sessions/jpa-auth-sessions-changelog-1.xml index a697746e0c..a455e93c31 100644 --- a/model/map-jpa/src/main/resources/META-INF/auth-sessions/jpa-auth-sessions-changelog-1.xml +++ b/model/map-jpa/src/main/resources/META-INF/auth-sessions/jpa-auth-sessions-changelog-1.xml @@ -36,7 +36,7 @@ limitations under the License.