From aaf1b6011116a3b5dd390d96595b64db0abf9111 Mon Sep 17 00:00:00 2001 From: Cam Saul <1455846+camsaul@users.noreply.github.com> Date: Mon, 14 Mar 2022 19:06:49 -0700 Subject: [PATCH] Upgrade Liquibase to latest version; remove final Java source file and need for `clojure -X:deps prep` (#20611) * Upgrade Liquibase to latest version * Try adjusting log * Fix checksums for the TWO migrations with ID = 32 * FINALLY get Liquibase to use Log4j2 * Set Liquibase ConsoleUIService OutputStream to null OutputStream * Manually define a package for our H2 proxy class so Java 8 works * Fix package-name determination code * Update migrations file spec * `databasechangelog` shouldn't be upper-case * Lower-case quartz table names * More MySQL fixes :wrench: * Properties for all the Quartz tables :cry: * Formatting tweaks [ci skip] * Revert a few more busted changes * Fix more busted changes * Bump Liquibase version to 4.8.0 to fix MySQL defaultValueBoolean bug * OMG I think I finally fixed MySQL * Remove Java source file and prep-deps code * Remove two more references to bin/prep.sh * Minor cleanup * Revert unneeded changes * Fix busted indentation * Don't search inside java/ anymore since it's G-O-N-E * Appease the namespace linter * Update src/metabase/db/liquibase/h2.clj --- .../run-presto-kerberos-integration-test.sh | 4 - .github/workflows/backend.yml | 6 - .github/workflows/build-scripts.yml | 2 - .github/workflows/e2e-tests.yml | 5 - bin/build | 3 - bin/build-driver.sh | 3 - bin/build-drivers.sh | 3 - bin/clear-outdated-cpcaches.sh | 4 +- bin/i18n/update-translation-template | 3 - bin/lint-migrations-file.sh | 3 - .../src/lint_migrations_file.clj | 6 +- bin/prep.sh | 39 - bin/release.sh | 3 - build.clj | 20 +- deps.edn | 12 +- java/build.clj | 19 - java/deps.edn | 15 - .../MetabaseMySqlCreateTableSqlGenerator.java | 62 - resources/log4j2.xml | 1 + resources/migrations/000_migrations.yaml | 1149 ++++++++++------- src/metabase/db/liquibase.clj | 32 +- src/metabase/db/liquibase/h2.clj | 51 + src/metabase/db/liquibase/mysql.clj | 69 + test_config/log4j2-test.xml | 1 + 24 files changed, 855 insertions(+), 660 deletions(-) delete mode 100755 bin/prep.sh delete mode 100644 java/build.clj delete mode 100644 java/deps.edn delete mode 100644 java/metabase/db/liquibase/MetabaseMySqlCreateTableSqlGenerator.java create mode 100644 src/metabase/db/liquibase/h2.clj create mode 100644 src/metabase/db/liquibase/mysql.clj diff --git a/.github/scripts/run-presto-kerberos-integration-test.sh b/.github/scripts/run-presto-kerberos-integration-test.sh index 7e2aac1e7c3e0..9a5953ea3b2f6 100755 --- a/.github/scripts/run-presto-kerberos-integration-test.sh +++ b/.github/scripts/run-presto-kerberos-integration-test.sh @@ -48,10 +48,6 @@ keytool -noprompt -import -alias presto-kerberos -keystore $RESOURCES_DIR/cacert ADDITIONAL_OPTS="SSLKeyStorePath=$RESOURCES_DIR/ssl_keystore.jks&SSLKeyStorePassword=presto\ &SSLTrustStorePath=$RESOURCES_DIR/cacerts-with-presto-ca.jks&SSLTrustStorePassword=changeit" -# Prepare dependencies -source "./bin/prep.sh" -prep_deps - # Set up the environment variables pointing to all of this, and run some tests DRIVERS=presto-jdbc \ MB_ENABLE_PRESTO_JDBC_DRIVER=true \ diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index e36afa2fe530e..d068c208d877c 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -26,9 +26,6 @@ jobs: uses: ./.github/actions/prepare-backend with: m2-cache-key: 'eastwood' - - name: Compile Java & AOT Sources - run: | - source ./bin/prep.sh && prep_deps - run: clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:eastwood name: Run Eastwood linter @@ -41,8 +38,5 @@ jobs: uses: ./.github/actions/prepare-backend with: m2-cache-key: 'namespace-decls' - - name: Compile Java & AOT Sources - run: | - source ./bin/prep.sh && prep_deps - run: clojure -X:dev:ee:ee-dev:drivers:drivers-dev:test:namespace-checker name: Check ns forms diff --git a/.github/workflows/build-scripts.yml b/.github/workflows/build-scripts.yml index 41fdd22f5cedb..0ca6ccd5a15dc 100644 --- a/.github/workflows/build-scripts.yml +++ b/.github/workflows/build-scripts.yml @@ -17,8 +17,6 @@ jobs: uses: ./.github/actions/prepare-backend with: m2-cache-key: 'build-scripts' - - name: Compile Java & AOT Sources - run: source ./bin/prep.sh && prep_deps - name: Run metabuild-common build script tests run: clojure -M:test diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 52db5ac5f6b32..999d75144e5b7 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -23,11 +23,6 @@ jobs: - name: Prepare back-end environment uses: ./.github/actions/prepare-backend - - name: Java/AOT prep - run: | - source "./bin/prep.sh" - prep_deps - - run: ./bin/build version - run: ./bin/build translations - run: ./bin/build frontend diff --git a/bin/build b/bin/build index d360de0214452..06d252cc04375 100755 --- a/bin/build +++ b/bin/build @@ -12,8 +12,5 @@ check_clojure_cli source "./bin/clear-outdated-cpcaches.sh" clear_outdated_cpcaches -source "./bin/prep.sh" -prep_deps - cd bin/build-mb clojure -M -m build $@ diff --git a/bin/build-driver.sh b/bin/build-driver.sh index 8380131c246a7..e0e125ac87039 100755 --- a/bin/build-driver.sh +++ b/bin/build-driver.sh @@ -19,8 +19,5 @@ check_clojure_cli source "./bin/clear-outdated-cpcaches.sh" clear_outdated_cpcaches -source "./bin/prep.sh" -prep_deps - cd bin/build-drivers clojure -M -m build-driver $@ diff --git a/bin/build-drivers.sh b/bin/build-drivers.sh index bea160d25b786..e7eda1463753d 100755 --- a/bin/build-drivers.sh +++ b/bin/build-drivers.sh @@ -12,8 +12,5 @@ check_clojure_cli source "./bin/clear-outdated-cpcaches.sh" clear_outdated_cpcaches -source "./bin/prep.sh" -prep_deps - cd bin/build-drivers clojure -M -m build-drivers $@ diff --git a/bin/clear-outdated-cpcaches.sh b/bin/clear-outdated-cpcaches.sh index 89c2e43cd3d97..f97241b40b51c 100755 --- a/bin/clear-outdated-cpcaches.sh +++ b/bin/clear-outdated-cpcaches.sh @@ -12,7 +12,7 @@ clear_outdated_cpcaches() { cd "$script_directory/.." project_root=`pwd` - cpcaches=`find bin java modules -type d -name .cpcache` + cpcaches=`find bin modules -type d -name .cpcache` if [ -d .cpcache ]; then cpcaches=".cpcache $cpcaches" fi @@ -21,7 +21,7 @@ clear_outdated_cpcaches() { return 0 fi - deps_edns="deps.edn $(find bin java modules -type f -name deps.edn)" + deps_edns="deps.edn $(find bin modules -type f -name deps.edn)" # find the OLDEST cpcache and NEWEST deps.edn files. oldest_cpcache="" diff --git a/bin/i18n/update-translation-template b/bin/i18n/update-translation-template index fd86004412399..471bda08fe624 100755 --- a/bin/i18n/update-translation-template +++ b/bin/i18n/update-translation-template @@ -20,9 +20,6 @@ cd "$script_directory/../.." source "./bin/check-clojure-cli.sh" check_clojure_cli -source "./bin/prep.sh" -prep_deps - POT_NAME="locales/metabase.pot" POT_BACKEND_NAME="locales/metabase-backend.pot" # NOTE: hardcoded in .babelrc diff --git a/bin/lint-migrations-file.sh b/bin/lint-migrations-file.sh index a58607b78f60d..cb91037edfce1 100755 --- a/bin/lint-migrations-file.sh +++ b/bin/lint-migrations-file.sh @@ -12,8 +12,5 @@ check_clojure_cli source "./bin/clear-outdated-cpcaches.sh" clear_outdated_cpcaches -source "./bin/prep.sh" -prep_deps - cd bin/lint-migrations-file clojure -M -m lint-migrations-file $@ diff --git a/bin/lint-migrations-file/src/lint_migrations_file.clj b/bin/lint-migrations-file/src/lint_migrations_file.clj index b5f208a8671c6..132fd2b7b509c 100644 --- a/bin/lint-migrations-file/src/lint_migrations_file.clj +++ b/bin/lint-migrations-file/src/lint_migrations_file.clj @@ -106,13 +106,13 @@ (walk/postwalk walk-fn change-set)) (empty? @problem-cols))) -;; TODO -- change sets must be distinct by ID. (s/def ::databaseChangeLog (s/and distinct-change-set-ids? change-set-ids-in-order? no-bare-blob-or-text-types? - (s/+ (s/alt :property (s/keys :req-un [::property]) - :changeSet (s/keys :req-un [::changeSet]))))) + (s/+ (s/alt :property (s/keys :req-un [::property]) + :objectQuotingStrategy (s/keys :req-un [::objectQuotingStrategy]) + :changeSet (s/keys :req-un [::changeSet]))))) (def strict-change-set-cutoff "All change sets with an ID >= this number will be validated with the strict spec." diff --git a/bin/prep.sh b/bin/prep.sh deleted file mode 100755 index b8f17c50fd0b7..0000000000000 --- a/bin/prep.sh +++ /dev/null @@ -1,39 +0,0 @@ -#! /usr/bin/env bash - -# functions for running prep steps to compile Java and AOT source files, needed before running other stuff. - -script_directory=`dirname "${BASH_SOURCE[0]}"` -cd "$script_directory/.." -project_root=`pwd` - -clear_cpcaches() { - cd "$project_root" - for file in `find . -type d -name .cpcache`; do - rm -rf "$file" - done -} - -compile_java_sources() { - cd "$project_root" - - echo "Compile Java source files in $project_root/java if needed..." - if [ ! -d "$project_root/java/target/classes" ]; then - echo 'Compile Java source files' - cd "$project_root" - clojure -Sforce -X:deps prep - else - echo 'Java source files are already compiled' - fi -} - -prep_deps() { - if compile_java_sources; then - echo "Java sources => OK" - else - echo 'Compilation failed (WHY?!); clearing classpath caches and trying again...' - clear_cpcaches - compile_java_sources - fi - - cd "$project_root" -} diff --git a/bin/release.sh b/bin/release.sh index b8fc3c68bb3c0..58ff2c453cebb 100755 --- a/bin/release.sh +++ b/bin/release.sh @@ -12,8 +12,5 @@ check_clojure_cli source "./bin/clear-outdated-cpcaches.sh" clear_outdated_cpcaches -source "./bin/prep.sh" -prep_deps - cd bin/release clojure -M -m release $@ diff --git a/build.clj b/build.clj index 2b52bdf298eaa..c5b936b432d42 100644 --- a/build.clj +++ b/build.clj @@ -103,25 +103,7 @@ {"Manifest-Version" "1.0" "Created-By" "Metabase build.clj" "Build-Jdk-Spec" (System/getProperty "java.specification.version") - "Main-Class" "metabase.core" - "Liquibase-Package" (str/join "," - ["liquibase.change" - "liquibase.changelog" - "liquibase.database" - "liquibase.datatype" - "liquibase.diff" - "liquibase.executor" - "liquibase.ext" - "liquibase.lockservice" - "liquibase.logging" - "liquibase.parser" - "liquibase.precondition" - "liquibase.sdk" - "liquibase.serializer" - "liquibase.snapshot" - "liquibase.sqlgenerator" - "liquibase.structure" - "liquibase.structurecompare"])}) + "Main-Class" "metabase.core"}) (defn manifest ^Manifest [] (doto (Manifest.) diff --git a/deps.edn b/deps.edn index c6be2d5cf03e5..6b29b12a13cb1 100644 --- a/deps.edn +++ b/deps.edn @@ -84,7 +84,7 @@ org.apache.logging.log4j/log4j-api {:mvn/version "2.17.1"} ; add compatibility with log4j 1.2 org.apache.logging.log4j/log4j-core {:mvn/version "2.17.1"} ; apache logging framework org.apache.logging.log4j/log4j-jcl {:mvn/version "2.17.1"} ; allows the commons-logging API to work with log4j 2 - org.apache.logging.log4j/log4j-liquibase {:mvn/version "2.17.1"} ; liquibase logging via log4j 2 + org.apache.logging.log4j/log4j-jul {:mvn/version "2.17.1"} ; java.util.logging (JUL) -> Log4j2 adapter org.apache.logging.log4j/log4j-slf4j-impl {:mvn/version "2.17.1"} ; allows the slf4j API to work with log4j 2 org.apache.poi/poi {:mvn/version "5.2.0"} ; Work with Office documents (e.g. Excel spreadsheets) -- newer version than one specified by Docjure org.apache.poi/poi-ooxml {:mvn/version "5.2.0" @@ -114,7 +114,7 @@ org.eclipse.jetty/jetty-server {:mvn/version "9.4.44.v20210927"} ; web server org.flatland/ordered {:mvn/version "1.15.10"} ; ordered maps & sets org.graalvm.js/js {:mvn/version "22.0.0.2"} ; JavaScript engine - org.liquibase/liquibase-core {:mvn/version "3.6.3" ; migration management (Java lib) + org.liquibase/liquibase-core {:mvn/version "4.8.0" ; migration management (Java lib) :exclusions [ch.qos.logback/logback-classic]} org.mariadb.jdbc/mariadb-java-client {:mvn/version "2.7.5"} ; MySQL/MariaDB driver org.postgresql/postgresql {:mvn/version "42.3.2"} ; Postgres driver @@ -122,7 +122,7 @@ org.slf4j/slf4j-api {:mvn/version "1.7.35"} ; abstraction for logging frameworks -- allows end user to plug in desired logging framework at deployment time org.tcrawley/dynapath {:mvn/version "1.1.0"} ; Dynamically add Jars (e.g. Oracle or Vertica) to classpath org.threeten/threeten-extra {:mvn/version "1.7.0"} ; extra Java 8 java.time classes like DayOfMonth and Quarter - org.yaml/snakeyaml {:mvn/version "1.30"} ; YAML parser (required by liquibase) + org.yaml/snakeyaml {:mvn/version "1.30"} ; YAML parser potemkin/potemkin {:mvn/version "0.4.5" ; utility macros & fns :exclusions [riddley/riddley]} pretty/pretty {:mvn/version "1.0.5"} ; protocol for defining how custom types should be pretty printed @@ -142,9 +142,7 @@ org.clojure/tools.namespace]} user-agent/user-agent {:mvn/version "0.1.0"} ; User-Agent string parser, for Login History page & elsewhere weavejester/dependency {:mvn/version "0.2.1"} ; Dependency graphs and topological sorting - - ;; dummy dependency for the Java source file(s) - metabase/java-deps {:local/root "java"}} + } ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;; !! PLEASE KEEP NEW DEPENDENCIES ABOVE ALPHABETICALLY ORGANIZED AND ADD COMMENTS EXPLAINING THEM. !! ;; !! *PLEASE DO NOT* ADD NEW ONES TO THE BOTTOM OF THE LIST. !! @@ -152,7 +150,7 @@ :paths - ["src" "shared/src" "resources" "java/target/classes"] + ["src" "shared/src" "resources"] :aliases { diff --git a/java/build.clj b/java/build.clj deleted file mode 100644 index 37fe631462cb1..0000000000000 --- a/java/build.clj +++ /dev/null @@ -1,19 +0,0 @@ -(ns build - (:require [clojure.pprint :as pprint] - [clojure.tools.build.api :as b])) - -(def target-dir "target/classes") - -(defn compile-java [_] - (b/delete {:path target-dir}) - (try - (b/javac - {:src-dirs ["."] - :class-dir target-dir - :basis (b/create-basis {:aliases #{:compilation-basis}}) - :javac-opts ["-source" "8", "-target" "8"]}) - (catch Throwable e - (println "Error compiling Java sources:" (ex-message e)) - (pprint/pprint (Throwable->map e)) - (b/delete {:path target-dir}) - (throw e)))) diff --git a/java/deps.edn b/java/deps.edn deleted file mode 100644 index f4e0c9ce13ab2..0000000000000 --- a/java/deps.edn +++ /dev/null @@ -1,15 +0,0 @@ -{:deps/prep-lib - {:ensure "target/classes" - :alias :build - :fn compile-java} - - :paths ["target/classes"] - - :aliases - {:build - {:deps {io.github.clojure/tools.build {:git/tag "v0.7.5" :git/sha "2526f58"}} - :ns-default build} - - ;; dependencies needed for compiling the Java files. - :compilation-basis - {:extra-deps {org.liquibase/liquibase-core {:mvn/version "3.6.3"}}}}} diff --git a/java/metabase/db/liquibase/MetabaseMySqlCreateTableSqlGenerator.java b/java/metabase/db/liquibase/MetabaseMySqlCreateTableSqlGenerator.java deleted file mode 100644 index 8726ea2af618f..0000000000000 --- a/java/metabase/db/liquibase/MetabaseMySqlCreateTableSqlGenerator.java +++ /dev/null @@ -1,62 +0,0 @@ -package metabase.db.liquibase; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -import liquibase.database.Database; -import liquibase.database.core.MySQLDatabase; -import liquibase.exception.ValidationErrors; -import liquibase.sql.Sql; -import liquibase.sql.UnparsedSql; -import liquibase.sqlgenerator.SqlGeneratorChain; -import liquibase.sqlgenerator.core.AbstractSqlGenerator; -import liquibase.sqlgenerator.core.CreateTableGenerator; -import liquibase.statement.core.CreateTableStatement; -import liquibase.structure.DatabaseObject; - -// This class is a simple wrapper around a CreateTableGenerator that appends ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci to the generated SQL -public class MetabaseMySqlCreateTableSqlGenerator extends AbstractSqlGenerator { - private CreateTableGenerator parentGenerator; - - public MetabaseMySqlCreateTableSqlGenerator() { - this.parentGenerator = new CreateTableGenerator(); - } - - @Override - public boolean supports(CreateTableStatement statement, Database database) { - return parentGenerator.supports(statement, database) && (database instanceof MySQLDatabase); - } - - @Override - public int getPriority() { - return parentGenerator.getPriority() + 1; - } - - @Override - public Sql[] generateSql(CreateTableStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { - // it seems like Liquibase actually ignores the `defaultValueComputed` - // that we set in the migrations YAML file -- see - // https://stackoverflow.com/questions/58816496/force-liquibase-to-current-timestamp-instead-of-now - database.setCurrentDateTimeFunction("current_timestamp(6)"); - - Sql[] sqls = this.parentGenerator.generateSql(statement, database, sqlGeneratorChain); - for (int i = 0; i < sqls.length; i++) { - Sql sql = sqls[i]; - if (!sql.toSql().startsWith("CREATE TABLE")) continue; - - Collection affectedObjects = sql.getAffectedDatabaseObjects(); - - sqls[i] = new UnparsedSql(sql.toSql() + " ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci", - sql.getEndDelimiter(), - affectedObjects.toArray(new DatabaseObject[affectedObjects.size()])); - } - return sqls; - } - - @Override - public ValidationErrors validate(CreateTableStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { - return this.parentGenerator.validate(statement, database, sqlGeneratorChain); - } -} diff --git a/resources/log4j2.xml b/resources/log4j2.xml index 9a97c01d8f86f..bf09985d68bc4 100644 --- a/resources/log4j2.xml +++ b/resources/log4j2.xml @@ -28,6 +28,7 @@ + diff --git a/resources/migrations/000_migrations.yaml b/resources/migrations/000_migrations.yaml index 427421e48fddf..e52e44f8fa451 100644 --- a/resources/migrations/000_migrations.yaml +++ b/resources/migrations/000_migrations.yaml @@ -1,16 +1,4 @@ databaseChangeLog: - # The quoting strategy decides when things like column names should be quoted. This is in place to deal with - # Liquibase not knowing about all of the new reserved words in MySQL 8+. Using a column name that is a reserved word - # causes a failure. Quoting all objects breaks H2 support though as it will quote table names but not quote that - # same table name in a foreign key reference which will cause a failure when trying to initially setup the database. - - property: - name: quote_strategy - value: QUOTE_ALL_OBJECTS - dbms: mysql,mariadb - - property: - name: quote_strategy - value: LEGACY - dbms: postgresql,h2 - property: name: timestamp_type value: timestamp with time zone @@ -19,6 +7,14 @@ databaseChangeLog: name: timestamp_type value: timestamp(6) dbms: mysql,mariadb + - property: + name: blob.type + value: blob + dbms: mysql,h2,mariadb + - property: + name: blob.type + value: bytea + dbms: postgresql # In MySQL, use LONGTEXT instead of TEXT (#7006) - property: name: text.type @@ -28,11 +24,22 @@ databaseChangeLog: name: text.type value: longtext dbms: mysql,mariadb + # databasechangelog is uppercase in MySQL and H2 but lower-case in Postgres for reasons + - property: + name: databasechangelog.name + value: DATABASECHANGELOG + dbms: h2,mysql,mariadb + - property: + name: databasechangelog.name + value: databasechangelog + dbms: postgresql + + - objectQuotingStrategy: QUOTE_ALL_OBJECTS - changeSet: id: '1' author: agilliland - objectQuotingStrategy: ${quote_strategy} + validCheckSum: ANY changes: - createTable: columns: @@ -154,7 +161,8 @@ databaseChangeLog: foreignKeyName: fk_userorgperm_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: user_id type: int - column: @@ -163,7 +171,8 @@ databaseChangeLog: foreignKeyName: fk_userorgperm_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int tableName: core_userorgperm @@ -210,7 +219,8 @@ databaseChangeLog: foreignKeyName: fk_permissionviolation_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: user_id type: int tableName: core_permissionsviolation @@ -254,7 +264,8 @@ databaseChangeLog: foreignKeyName: fk_database_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int - column: @@ -319,7 +330,8 @@ databaseChangeLog: foreignKeyName: fk_table_ref_database_id initiallyDeferred: false nullable: false - references: metabase_database(id) + referencedTableName: metabase_database + referencedColumnNames: id name: db_id type: int tableName: metabase_table @@ -385,7 +397,8 @@ databaseChangeLog: foreignKeyName: fk_field_ref_table_id initiallyDeferred: false nullable: false - references: metabase_table(id) + referencedTableName: metabase_table + referencedColumnNames: id name: table_id type: int - column: @@ -430,7 +443,8 @@ databaseChangeLog: foreignKeyName: fk_foreignkey_dest_ref_field_id initiallyDeferred: false nullable: false - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id name: destination_id type: int - column: @@ -439,7 +453,8 @@ databaseChangeLog: foreignKeyName: fk_foreignkey_origin_ref_field_id initiallyDeferred: false nullable: false - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id name: origin_id type: int tableName: metabase_foreignkey @@ -486,7 +501,8 @@ databaseChangeLog: foreignKeyName: fk_fieldvalues_ref_field_id initiallyDeferred: false nullable: false - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id name: field_id type: int tableName: metabase_fieldvalues @@ -526,7 +542,8 @@ databaseChangeLog: foreignKeyName: fk_tablesegment_ref_table_id initiallyDeferred: false nullable: false - references: metabase_table(id) + referencedTableName: metabase_table + referencedColumnNames: id name: table_id type: int - column: @@ -591,7 +608,8 @@ databaseChangeLog: foreignKeyName: fk_query_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: creator_id type: int - column: @@ -600,7 +618,8 @@ databaseChangeLog: foreignKeyName: fk_query_ref_database_id initiallyDeferred: false nullable: false - references: metabase_database(id) + referencedTableName: metabase_database + referencedColumnNames: id name: database_id type: int tableName: query_query @@ -690,7 +709,8 @@ databaseChangeLog: foreignKeyName: fk_queryexecution_ref_query_id initiallyDeferred: false nullable: true - references: query_query(id) + referencedTableName: query_query + referencedColumnNames: id name: query_id type: int - column: @@ -704,7 +724,8 @@ databaseChangeLog: foreignKeyName: fk_queryexecution_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: executor_id type: int tableName: query_queryexecution @@ -773,7 +794,8 @@ databaseChangeLog: foreignKeyName: fk_card_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: creator_id type: int - column: @@ -782,7 +804,8 @@ databaseChangeLog: foreignKeyName: fk_card_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int tableName: report_card @@ -823,7 +846,8 @@ databaseChangeLog: foreignKeyName: fk_cardfavorite_ref_card_id initiallyDeferred: false nullable: false - references: report_card(id) + referencedTableName: report_card + referencedColumnNames: id name: card_id type: int - column: @@ -832,7 +856,8 @@ databaseChangeLog: foreignKeyName: fk_cardfavorite_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: owner_id type: int tableName: report_cardfavorite @@ -890,7 +915,8 @@ databaseChangeLog: foreignKeyName: fk_dashboard_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: creator_id type: int - column: @@ -899,7 +925,8 @@ databaseChangeLog: foreignKeyName: fk_dashboard_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int tableName: report_dashboard @@ -956,7 +983,8 @@ databaseChangeLog: foreignKeyName: fk_dashboardcard_ref_card_id initiallyDeferred: false nullable: false - references: report_card(id) + referencedTableName: report_card + referencedColumnNames: id name: card_id type: int - column: @@ -965,7 +993,8 @@ databaseChangeLog: foreignKeyName: fk_dashboardcard_ref_dashboard_id initiallyDeferred: false nullable: false - references: report_dashboard(id) + referencedTableName: report_dashboard + referencedColumnNames: id name: dashboard_id type: int tableName: report_dashboardcard @@ -996,7 +1025,8 @@ databaseChangeLog: foreignKeyName: fk_dashboardsubscription_ref_dashboard_id initiallyDeferred: false nullable: false - references: report_dashboard(id) + referencedTableName: report_dashboard + referencedColumnNames: id name: dashboard_id type: int - column: @@ -1005,7 +1035,8 @@ databaseChangeLog: foreignKeyName: fk_dashboardsubscription_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: user_id type: int tableName: report_dashboardsubscription @@ -1081,7 +1112,8 @@ databaseChangeLog: foreignKeyName: fk_emailreport_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: creator_id type: int - column: @@ -1090,7 +1122,8 @@ databaseChangeLog: foreignKeyName: fk_emailreport_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int - column: @@ -1126,7 +1159,8 @@ databaseChangeLog: foreignKeyName: fk_emailreport_recipients_ref_emailreport_id initiallyDeferred: false nullable: false - references: report_emailreport(id) + referencedTableName: report_emailreport + referencedColumnNames: id name: emailreport_id type: int - column: @@ -1135,7 +1169,8 @@ databaseChangeLog: foreignKeyName: fk_emailreport_recipients_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: user_id type: int tableName: report_emailreport_recipients @@ -1201,7 +1236,8 @@ databaseChangeLog: foreignKeyName: fk_emailreportexecutions_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int - column: @@ -1210,7 +1246,8 @@ databaseChangeLog: foreignKeyName: fk_emailreportexecutions_ref_report_id initiallyDeferred: false nullable: true - references: report_emailreport(id) + referencedTableName: report_emailreport + referencedColumnNames: id name: report_id type: int tableName: report_emailreportexecutions @@ -1289,7 +1326,8 @@ databaseChangeLog: foreignKeyName: fk_annotation_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: author_id type: int - column: @@ -1298,7 +1336,8 @@ databaseChangeLog: foreignKeyName: fk_annotation_ref_organization_id initiallyDeferred: false nullable: false - references: core_organization(id) + referencedTableName: core_organization + referencedColumnNames: id name: organization_id type: int tableName: annotation_annotation @@ -1334,6 +1373,7 @@ databaseChangeLog: - changeSet: id: '2' author: agilliland + validCheckSum: ANY changes: - createTable: columns: @@ -1349,7 +1389,8 @@ databaseChangeLog: foreignKeyName: fk_session_ref_user_id initiallyDeferred: false nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: user_id type: int - column: @@ -1440,6 +1481,7 @@ databaseChangeLog: - changeSet: id: '7' author: cammsaul + validCheckSum: ANY changes: - addColumn: columns: @@ -1447,7 +1489,8 @@ databaseChangeLog: constraints: foreignKeyName: fk_field_parent_ref_field_id nullable: true - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id name: parent_id type: int tableName: metabase_field @@ -1480,15 +1523,7 @@ databaseChangeLog: - changeSet: id: 10 author: cammsaul - validCheckSum: - - 7:3b90e2fe0ac8e617a1f30ef95d39319b - - 7:97fec69516d0dfe424ea7365f51bb87e - - 8:2e03a495932b4a9aebb9d58a6ad87ca9 - - 8:431360d062cb82d8b27960b3a0abb98c - - 8:5297214d1788d964675d8c6336ac9b6d - - 8:532075ff1717d4a16bb9f27c606db46b - - 8:96e54d9100db3f9cdcc00eaeccc200a3 - - 8:9f03a236be31f54e8e5c894fe5fc7f00 + validCheckSum: ANY changes: - createTable: tableName: revision @@ -1515,7 +1550,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_revision_ref_user_id deferrable: false initiallyDeferred: false @@ -1526,7 +1562,7 @@ databaseChangeLog: nullable: false - column: name: object - type: varchar + type: ${text.type} constraints: nullable: false - column: @@ -1562,9 +1598,7 @@ databaseChangeLog: - changeSet: id: 12 author: agilliland - validCheckSum: - - 8:bedbea570e5dfc694b4cf5a8f6a4f445 - - 8:e862a199cba5b4ce0cba713110f66cfb + validCheckSum: ANY changes: - addColumn: tableName: report_card @@ -1574,7 +1608,8 @@ databaseChangeLog: type: int constraints: nullable: true - references: metabase_database(id) + referencedTableName: metabase_database + referencedColumnNames: id foreignKeyName: fk_report_card_ref_database_id deferrable: false initiallyDeferred: false @@ -1586,7 +1621,8 @@ databaseChangeLog: type: int constraints: nullable: true - references: metabase_table(id) + referencedTableName: metabase_table + referencedColumnNames: id foreignKeyName: fk_report_card_ref_table_id deferrable: false initiallyDeferred: false @@ -1601,9 +1637,7 @@ databaseChangeLog: - changeSet: id: 13 author: agilliland - validCheckSum: - - 7:f27286894439bef33ff93761f9b32bc4 - - 7:1bc8ccc9b1803cda5651f144029be40c + validCheckSum: ANY changes: - createTable: tableName: activity @@ -1630,7 +1664,8 @@ databaseChangeLog: type: int constraints: nullable: true - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_activity_ref_user_id deferrable: false initiallyDeferred: false @@ -1661,7 +1696,7 @@ databaseChangeLog: nullable: true - column: name: details - type: varchar + type: ${text.type} constraints: nullable: false - createIndex: @@ -1695,6 +1730,7 @@ databaseChangeLog: - changeSet: id: 14 author: agilliland + validCheckSum: ANY changes: - createTable: tableName: view_log @@ -1711,7 +1747,8 @@ databaseChangeLog: type: int constraints: nullable: true - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_view_log_ref_user_id deferrable: false initiallyDeferred: false @@ -1750,7 +1787,6 @@ databaseChangeLog: - changeSet: id: 15 author: agilliland - objectQuotingStrategy: ${quote_strategy} changes: - addColumn: tableName: revision @@ -1792,9 +1828,7 @@ databaseChangeLog: - changeSet: id: 18 author: camsaul - validCheckSum: - - 7:07d501a6e52c14691f7f895d137e565f - - 7:329d897d44ba9893fdafc9ce7e876d73 + validCheckSum: ANY changes: - createTable: tableName: data_migrations @@ -1829,6 +1863,7 @@ databaseChangeLog: - changeSet: id: 20 author: agilliland + validCheckSum: ANY changes: - createTable: tableName: pulse @@ -1845,7 +1880,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_pulse_ref_creator_id deferrable: false initiallyDeferred: false @@ -1890,7 +1926,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: pulse(id) + referencedTableName: pulse + referencedColumnNames: id foreignKeyName: fk_pulse_card_ref_pulse_id deferrable: false initiallyDeferred: false @@ -1899,7 +1936,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: report_card(id) + referencedTableName: report_card + referencedColumnNames: id foreignKeyName: fk_pulse_card_ref_card_id deferrable: false initiallyDeferred: false @@ -1935,7 +1973,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: pulse(id) + referencedTableName: pulse + referencedColumnNames: id foreignKeyName: fk_pulse_channel_ref_pulse_id deferrable: false initiallyDeferred: false @@ -2001,7 +2040,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: pulse_channel(id) + referencedTableName: pulse_channel + referencedColumnNames: id foreignKeyName: fk_pulse_channel_recipient_ref_pulse_channel_id deferrable: false initiallyDeferred: false @@ -2010,7 +2050,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_pulse_channel_recipient_ref_user_id deferrable: false initiallyDeferred: false @@ -2022,6 +2063,7 @@ databaseChangeLog: - changeSet: id: 21 author: agilliland + validCheckSum: ANY changes: - createTable: tableName: segment @@ -2038,7 +2080,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: metabase_table(id) + referencedTableName: metabase_table + referencedColumnNames: id foreignKeyName: fk_segment_ref_table_id deferrable: false initiallyDeferred: false @@ -2047,7 +2090,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_segment_ref_creator_id deferrable: false initiallyDeferred: false @@ -2114,7 +2158,6 @@ databaseChangeLog: - changeSet: id: 23 author: agilliland - objectQuotingStrategy: ${quote_strategy} changes: - modifyDataType: tableName: metabase_table @@ -2191,6 +2234,7 @@ databaseChangeLog: - changeSet: id: 25 author: agilliland + validCheckSum: ANY changes: - createTable: tableName: metric @@ -2207,7 +2251,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: metabase_table(id) + referencedTableName: metabase_table + referencedColumnNames: id foreignKeyName: fk_metric_ref_table_id deferrable: false initiallyDeferred: false @@ -2216,7 +2261,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_metric_ref_creator_id deferrable: false initiallyDeferred: false @@ -2286,6 +2332,7 @@ databaseChangeLog: - changeSet: id: 27 author: agilliland + validCheckSum: ANY changes: - createTable: tableName: dashboardcard_series @@ -2302,7 +2349,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: report_dashboardcard(id) + referencedTableName: report_dashboardcard + referencedColumnNames: id foreignKeyName: fk_dashboardcard_series_ref_dashboardcard_id deferrable: false initiallyDeferred: false @@ -2311,7 +2359,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: report_card(id) + referencedTableName: report_card + referencedColumnNames: id foreignKeyName: fk_dashboardcard_series_ref_card_id deferrable: false initiallyDeferred: false @@ -2399,6 +2448,7 @@ databaseChangeLog: - changeSet: id: 32 author: camsaul + validCheckSum: ANY changes: ######################################## label table ######################################## - createTable: @@ -2447,7 +2497,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: report_card(id) + referencedTableName: report_card + referencedColumnNames: id foreignKeyName: fk_card_label_ref_card_id deferrable: false initiallyDeferred: false @@ -2456,7 +2507,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: label(id) + referencedTableName: label + referencedColumnNames: id foreignKeyName: fk_card_label_ref_label_id deferrable: false initiallyDeferred: false @@ -2489,6 +2541,7 @@ databaseChangeLog: - changeSet: id: 32 author: agilliland + validCheckSum: ANY changes: - createTable: tableName: raw_table @@ -2505,7 +2558,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: metabase_database(id) + referencedTableName: metabase_database + referencedColumnNames: id foreignKeyName: fk_rawtable_ref_database deferrable: false initiallyDeferred: false @@ -2564,7 +2618,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: raw_table(id) + referencedTableName: raw_table + referencedColumnNames: id foreignKeyName: fk_rawcolumn_tableid_ref_rawtable deferrable: false initiallyDeferred: false @@ -2593,7 +2648,8 @@ databaseChangeLog: type: int constraints: nullable: true - references: raw_column(id) + referencedTableName: raw_column + referencedColumnNames: id foreignKeyName: fk_rawcolumn_fktarget_ref_rawcolumn deferrable: false initiallyDeferred: false @@ -2748,6 +2804,7 @@ databaseChangeLog: - changeSet: id: 38 author: camsaul + validCheckSum: ANY changes: ######################################## Add "points_of_interest" metadata column to various models ######################################## - addColumn: @@ -2910,14 +2967,16 @@ databaseChangeLog: type: int constraints: nullable: false - references: metric(id) + referencedTableName: metric + referencedColumnNames: id foreignKeyName: fk_metric_important_field_metric_id - column: name: field_id type: int constraints: nullable: false - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id foreignKeyName: fk_metric_important_field_metabase_field_id - addUniqueConstraint: tableName: metric_important_field @@ -2951,9 +3010,7 @@ databaseChangeLog: - changeSet: id: 40 author: camsaul - validCheckSum: - - 8:231d66cf27fc4b4bc066172b435439b5 - - 8:ee7f50a264d6cf8d891bd01241eebd2c + validCheckSum: ANY changes: ############################################################ add PermissionsGroup table ############################################################ - createTable: @@ -2996,14 +3053,16 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_permissions_group_membership_user_id - column: name: group_id type: int constraints: nullable: false - references: permissions_group(id) + referencedTableName: permissions_group + referencedColumnNames: id foreignKeyName: fk_permissions_group_group_id - addUniqueConstraint: tableName: permissions_group_membership @@ -3053,7 +3112,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: permissions_group(id) + referencedTableName: permissions_group + referencedColumnNames: id foreignKeyName: fk_permissions_group_id - createIndex: tableName: permissions @@ -3170,9 +3230,7 @@ databaseChangeLog: - changeSet: id: 43 author: camsaul - validCheckSum: - - 7:b20750a949504e93efced32877a4488f - - 7:dbc18c8ca697fc335869f0ed0eb5f4cb + validCheckSum: ANY changes: - createTable: tableName: permissions_revision @@ -3203,7 +3261,8 @@ databaseChangeLog: remarks: 'The ID of the admin who made this set of changes.' constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_permissions_revision_user_id - column: name: created_at @@ -3246,7 +3305,6 @@ databaseChangeLog: - changeSet: id: 46 author: camsaul - objectQuotingStrategy: ${quote_strategy} changes: - addNotNullConstraint: tableName: report_dashboardcard @@ -3269,6 +3327,7 @@ databaseChangeLog: - changeSet: id: 47 author: camsaul + validCheckSum: ANY changes: ######################################## collection table ######################################## - createTable: @@ -3327,7 +3386,8 @@ databaseChangeLog: type: int remarks: 'Optional ID of Collection this Card belongs to.' constraints: - references: collection(id) + referencedTableName: collection + referencedColumnNames: id foreignKeyName: fk_card_collection_id - createIndex: tableName: report_card @@ -3338,6 +3398,7 @@ databaseChangeLog: - changeSet: id: 48 author: camsaul + validCheckSum: ANY changes: - createTable: tableName: collection_revision @@ -3368,7 +3429,8 @@ databaseChangeLog: remarks: 'The ID of the admin who made this set of changes.' constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_collection_revision_user_id - column: name: created_at @@ -3383,9 +3445,7 @@ databaseChangeLog: - changeSet: id: 49 author: camsaul - validCheckSum: - - 8:56dcab086b21de1df002561efeac8bb6 - - 8:4508e7d5f6d4da3c4a2de3bf5e3c5851 + validCheckSum: ANY changes: ######################################## Card public_uuid & indices ######################################## - addColumn: @@ -3405,7 +3465,8 @@ databaseChangeLog: type: int remarks: 'The ID of the User who first publically shared this Card.' constraints: - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_card_made_public_by_id - createIndex: tableName: report_card @@ -3431,7 +3492,8 @@ databaseChangeLog: type: int remarks: 'The ID of the User who first publically shared this Dashboard.' constraints: - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_dashboard_made_public_by_id - createIndex: tableName: report_dashboard @@ -3447,9 +3509,7 @@ databaseChangeLog: - changeSet: id: 50 author: camsaul - validCheckSum: - - 8:388da4c48984aad647709514e4ba9204 - - 8:98a6ab6428ea7a589507464e34ade58a + validCheckSum: ANY changes: ######################################## new Card columns ######################################## - addColumn: @@ -3490,9 +3550,7 @@ databaseChangeLog: - changeSet: id: 51 author: camsaul - validCheckSum: - - 8:8491a72bd30aac2565c97daf8b84e515 - - 8:676d3f95358dcd572ccce47c950e8ed9 + validCheckSum: ANY changes: - createTable: tableName: query_execution @@ -3580,14 +3638,6 @@ databaseChangeLog: name: hash - column: name: started_at - - property: - name: blob.type - value: blob - dbms: mysql,h2,mariadb - - property: - name: blob.type - value: bytea - dbms: postgresql - changeSet: id: 52 author: camsaul @@ -3652,9 +3702,7 @@ databaseChangeLog: - changeSet: id: 54 author: tlrobinson - validCheckSum: - - 7:695b12a78e897c62c21d41bfb04ab44b - - 7:0857800db71a4757e7202aad4eaed48d + validCheckSum: ANY changes: - addColumn: tableName: pulse @@ -3669,9 +3717,7 @@ databaseChangeLog: - changeSet: id: 55 author: camsaul - validCheckSum: - - 8:87c4becde5fe208ba2c356128df86fba - - 8:11bbd199bfa57b908ea3b1a470197de9 + validCheckSum: ANY changes: - addColumn: tableName: report_dashboard @@ -3707,7 +3753,8 @@ databaseChangeLog: remarks: 'ID of the User who favorited the Dashboard.' constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_dashboard_favorite_user_id deleteCascade: true - column: @@ -3716,7 +3763,8 @@ databaseChangeLog: remarks: 'ID of the Dashboard favorited by the User.' constraints: nullable: false - references: report_dashboard(id) + referencedTableName: report_dashboard + referencedColumnNames: id foreignKeyName: fk_dashboard_favorite_dashboard_id deleteCascade: true - addUniqueConstraint: @@ -3764,6 +3812,7 @@ databaseChangeLog: - changeSet: id: 58 author: senior + validCheckSum: ANY comment: 'Added 0.25.0' changes: - createTable: @@ -3786,7 +3835,8 @@ databaseChangeLog: foreignKeyName: fk_dimension_ref_field_id initiallyDeferred: false nullable: false - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id deleteCascade: true - column: name: name @@ -3809,7 +3859,8 @@ databaseChangeLog: foreignKeyName: fk_dimension_displayfk_ref_field_id initiallyDeferred: false nullable: true - references: metabase_field(id) + referencedTableName: metabase_field + referencedColumnNames: id deleteCascade: true - column: name: created_at @@ -3848,9 +3899,7 @@ databaseChangeLog: - changeSet: id: 60 author: camsaul - validCheckSum: - - 8:4f997b2cd3309882e900493892381f38 - - 8:2141162a1c99a5dd95e5a67c5595e6d7 + validCheckSum: ANY comment: 'Added 0.26.0' changes: - addColumn: @@ -3931,9 +3980,7 @@ databaseChangeLog: id: 66 author: senior comment: 'Added 0.26.0' - validCheckSum: - - 7:e494c2c90fe5c377526da7a6e5ad63a2 - - 7:76d06b44a544105c2a613603b8bdf25f + validCheckSum: ANY changes: - sql: sql: drop table if exists computation_job_result cascade @@ -3943,6 +3990,7 @@ databaseChangeLog: - changeSet: id: 67 author: attekei + validCheckSum: ANY comment: 'Added 0.27.0' changes: - createTable: @@ -3961,7 +4009,8 @@ databaseChangeLog: deferrable: false foreignKeyName: fk_computation_job_ref_user_id initiallyDeferred: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: creator_id type: int - column: @@ -4001,7 +4050,8 @@ databaseChangeLog: foreignKeyName: fk_computation_result_ref_job_id initiallyDeferred: false nullable: false - references: computation_job(id) + referencedTableName: computation_job + referencedColumnNames: id name: job_id type: int - column: @@ -4028,9 +4078,7 @@ databaseChangeLog: id: 68 author: sbelak comment: 'Added 0.27.0' - validCheckSum: - - 8:ca201aeb20c1719a46c6bcc3fc95c81d - - 8:b4ac06d133dfbdc6567d992c7e18c6ec + validCheckSum: ANY changes: - addColumn: tableName: computation_job @@ -4047,9 +4095,7 @@ databaseChangeLog: - changeSet: id: 69 author: senior - validCheckSum: - - 8:97b7768436b9e8d695bae984020d754c - - 8:eadbe00e97eb53df4b3df60462f593f6 + validCheckSum: ANY comment: 'Added 0.27.0' remarks: 'Add columns to the pulse table for alerts' changes: @@ -4112,9 +4158,7 @@ databaseChangeLog: - changeSet: id: 72 author: senior - validCheckSum: - - 8:ed16046dfa04c139f48e9068eb4faee4 - - 8:4dc6debdf779ab9273cf2158a84bb154 + validCheckSum: ANY comment: 'Added 0.28.0' changes: - addColumn: @@ -4202,6 +4246,7 @@ databaseChangeLog: - changeSet: id: 78 author: camsaul + validCheckSum: ANY comment: 'Added 0.30.0' changes: - createTable: @@ -4221,7 +4266,8 @@ databaseChangeLog: remarks: 'ID of the Permissions Group this policy affects.' constraints: nullable: false - references: permissions_group(id) + referencedTableName: permissions_group + referencedColumnNames: id foreignKeyName: fk_gtap_group_id deleteCascade: true - column: @@ -4230,7 +4276,8 @@ databaseChangeLog: remarks: 'ID of the Table that should get automatically replaced as query source for the Permissions Group.' constraints: nullable: false - references: metabase_table(id) + referencedTableName: metabase_table + referencedColumnNames: id foreignKeyName: fk_gtap_table_id deleteCascade: true - column: @@ -4239,7 +4286,8 @@ databaseChangeLog: remarks: 'ID of the Card (Question) to be used to replace the Table.' constraints: nullable: false - references: report_card(id) + referencedTableName: report_card + referencedColumnNames: id foreignKeyName: fk_gtap_card_id - column: name: attribute_remappings @@ -4267,6 +4315,7 @@ databaseChangeLog: - changeSet: id: 79 author: camsaul + validCheckSum: ANY comment: 'Added 0.30.0' changes: - addColumn: @@ -4277,7 +4326,8 @@ databaseChangeLog: type: int remarks: 'Optional ID of Collection this Dashboard belongs to.' constraints: - references: collection(id) + referencedTableName: collection + referencedColumnNames: id foreignKeyName: fk_dashboard_collection_id # TODO - if someone deletes a collection, what should happen to the Dashboards that are in it? Should they # get deleted as well? Or should collection_id be cleared, effectively putting them in the so-called @@ -4296,7 +4346,8 @@ databaseChangeLog: type: int remarks: 'Options ID of Collection this Pulse belongs to.' constraints: - references: collection(id) + referencedTableName: collection + referencedColumnNames: id foreignKeyName: fk_pulse_collection_id - createIndex: tableName: pulse @@ -4420,6 +4471,7 @@ databaseChangeLog: - changeSet: id: 85 author: camsaul + validCheckSum: ANY comment: 'Added 0.30.0' changes: - addColumn: @@ -4430,7 +4482,8 @@ databaseChangeLog: type: int remarks: 'If set, this Collection is a personal Collection, for exclusive use of the User with this ID.' constraints: - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_collection_personal_owner_id unique: true uniqueConstraintName: unique_collection_personal_owner_id @@ -4521,390 +4574,583 @@ databaseChangeLog: # The Quartz Task Scheduler can use a DB to 'cluster' tasks and make sure they are only ran by a single instance where # using a multi-instance Metabase setup. +# Quartz identifiers are upper-case in MySQL and H2 but lower-case in PostgreSQL for reasons... so we'll have to +# define properties for EVERYTHING and use the correct identifiers + + - property: {name: quartz.blob_data.name, dbms: "postgresql", value: blob_data} + - property: {name: quartz.blob_data.name, dbms: "mysql,mariadb,h2", value: BLOB_DATA} + - property: {name: quartz.bool_prop_1.name, dbms: "postgresql", value: bool_prop_1} + - property: {name: quartz.bool_prop_1.name, dbms: "mysql,mariadb,h2", value: BOOL_PROP_1} + - property: {name: quartz.bool_prop_2.name, dbms: "postgresql", value: bool_prop_2} + - property: {name: quartz.bool_prop_2.name, dbms: "mysql,mariadb,h2", value: BOOL_PROP_2} + - property: {name: quartz.calendar.name, dbms: "postgresql", value: calendar} + - property: {name: quartz.calendar.name, dbms: "mysql,mariadb,h2", value: CALENDAR} + - property: {name: quartz.calendar_name.name, dbms: "postgresql", value: calendar_name} + - property: {name: quartz.calendar_name.name, dbms: "mysql,mariadb,h2", value: CALENDAR_NAME} + - property: {name: quartz.checkin_interval.name, dbms: "postgresql", value: checkin_interval} + - property: {name: quartz.checkin_interval.name, dbms: "mysql,mariadb,h2", value: CHECKIN_INTERVAL} + - property: {name: quartz.cron_expression.name, dbms: "postgresql", value: cron_expression} + - property: {name: quartz.cron_expression.name, dbms: "mysql,mariadb,h2", value: CRON_EXPRESSION} + - property: {name: quartz.dec_prop_1.name, dbms: "postgresql", value: dec_prop_1} + - property: {name: quartz.dec_prop_1.name, dbms: "mysql,mariadb,h2", value: DEC_PROP_1} + - property: {name: quartz.dec_prop_2.name, dbms: "postgresql", value: dec_prop_2} + - property: {name: quartz.dec_prop_2.name, dbms: "mysql,mariadb,h2", value: DEC_PROP_2} + - property: {name: quartz.description.name, dbms: "postgresql", value: description} + - property: {name: quartz.description.name, dbms: "mysql,mariadb,h2", value: DESCRIPTION} + - property: {name: quartz.end_time.name, dbms: "postgresql", value: end_time} + - property: {name: quartz.end_time.name, dbms: "mysql,mariadb,h2", value: END_TIME} + - property: {name: quartz.entry_id.name, dbms: "postgresql", value: entry_id} + - property: {name: quartz.entry_id.name, dbms: "mysql,mariadb,h2", value: ENTRY_ID} + - property: {name: quartz.fired_time.name, dbms: "postgresql", value: fired_time} + - property: {name: quartz.fired_time.name, dbms: "mysql,mariadb,h2", value: FIRED_TIME} + - property: {name: quartz.fk_qrtz_blob_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_blob_triggers_triggers} + - property: {name: quartz.fk_qrtz_blob_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_BLOB_TRIGGERS_TRIGGERS} + - property: {name: quartz.fk_qrtz_cron_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_cron_triggers_triggers} + - property: {name: quartz.fk_qrtz_cron_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_CRON_TRIGGERS_TRIGGERS} + - property: {name: quartz.fk_qrtz_simple_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_simple_triggers_triggers} + - property: {name: quartz.fk_qrtz_simple_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_SIMPLE_TRIGGERS_TRIGGERS} + - property: {name: quartz.fk_qrtz_simprop_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_simprop_triggers_triggers} + - property: {name: quartz.fk_qrtz_simprop_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_SIMPROP_TRIGGERS_TRIGGERS} + - property: {name: quartz.fk_qrtz_triggers_job_details.name, dbms: "postgresql", value: fk_qrtz_triggers_job_details} + - property: {name: quartz.fk_qrtz_triggers_job_details.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_TRIGGERS_JOB_DETAILS} + - property: {name: quartz.idx_qrtz_ft_inst_job_req_rcvry.name, dbms: "postgresql", value: idx_qrtz_ft_inst_job_req_rcvry} + - property: {name: quartz.idx_qrtz_ft_inst_job_req_rcvry.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_INST_JOB_REQ_RCVRY} + - property: {name: quartz.idx_qrtz_ft_jg.name, dbms: "postgresql", value: idx_qrtz_ft_jg} + - property: {name: quartz.idx_qrtz_ft_jg.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_JG} + - property: {name: quartz.idx_qrtz_ft_j_g.name, dbms: "postgresql", value: idx_qrtz_ft_j_g} + - property: {name: quartz.idx_qrtz_ft_j_g.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_J_G} + - property: {name: quartz.idx_qrtz_ft_tg.name, dbms: "postgresql", value: idx_qrtz_ft_tg} + - property: {name: quartz.idx_qrtz_ft_tg.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_TG} + - property: {name: quartz.idx_qrtz_ft_trig_inst_name.name, dbms: "postgresql", value: idx_qrtz_ft_trig_inst_name} + - property: {name: quartz.idx_qrtz_ft_trig_inst_name.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_TRIG_INST_NAME} + - property: {name: quartz.idx_qrtz_ft_t_g.name, dbms: "postgresql", value: idx_qrtz_ft_t_g} + - property: {name: quartz.idx_qrtz_ft_t_g.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_T_G} + - property: {name: quartz.idx_qrtz_j_grp.name, dbms: "postgresql", value: idx_qrtz_j_grp} + - property: {name: quartz.idx_qrtz_j_grp.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_J_GRP} + - property: {name: quartz.idx_qrtz_j_req_recovery.name, dbms: "postgresql", value: idx_qrtz_j_req_recovery} + - property: {name: quartz.idx_qrtz_j_req_recovery.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_J_REQ_RECOVERY} + - property: {name: quartz.idx_qrtz_t_c.name, dbms: "postgresql", value: idx_qrtz_t_c} + - property: {name: quartz.idx_qrtz_t_c.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_C} + - property: {name: quartz.idx_qrtz_t_g.name, dbms: "postgresql", value: idx_qrtz_t_g} + - property: {name: quartz.idx_qrtz_t_g.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_G} + - property: {name: quartz.idx_qrtz_t_j.name, dbms: "postgresql", value: idx_qrtz_t_j} + - property: {name: quartz.idx_qrtz_t_j.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_J} + - property: {name: quartz.idx_qrtz_t_jg.name, dbms: "postgresql", value: idx_qrtz_t_jg} + - property: {name: quartz.idx_qrtz_t_jg.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_JG} + - property: {name: quartz.idx_qrtz_t_next_fire_time.name, dbms: "postgresql", value: idx_qrtz_t_next_fire_time} + - property: {name: quartz.idx_qrtz_t_next_fire_time.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NEXT_FIRE_TIME} + - property: {name: quartz.idx_qrtz_t_nft_misfire.name, dbms: "postgresql", value: idx_qrtz_t_nft_misfire} + - property: {name: quartz.idx_qrtz_t_nft_misfire.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_MISFIRE} + - property: {name: quartz.idx_qrtz_t_nft_st.name, dbms: "postgresql", value: idx_qrtz_t_nft_st} + - property: {name: quartz.idx_qrtz_t_nft_st.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_ST} + - property: {name: quartz.idx_qrtz_t_nft_st_misfire.name, dbms: "postgresql", value: idx_qrtz_t_nft_st_misfire} + - property: {name: quartz.idx_qrtz_t_nft_st_misfire.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_ST_MISFIRE} + - property: {name: quartz.idx_qrtz_t_nft_st_misfire_grp.name, dbms: "postgresql", value: idx_qrtz_t_nft_st_misfire_grp} + - property: {name: quartz.idx_qrtz_t_nft_st_misfire_grp.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_ST_MISFIRE_GRP} + - property: {name: quartz.idx_qrtz_t_n_g_state.name, dbms: "postgresql", value: idx_qrtz_t_n_g_state} + - property: {name: quartz.idx_qrtz_t_n_g_state.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_N_G_STATE} + - property: {name: quartz.idx_qrtz_t_n_state.name, dbms: "postgresql", value: idx_qrtz_t_n_state} + - property: {name: quartz.idx_qrtz_t_n_state.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_N_STATE} + - property: {name: quartz.idx_qrtz_t_state.name, dbms: "postgresql", value: idx_qrtz_t_state} + - property: {name: quartz.idx_qrtz_t_state.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_STATE} + - property: {name: quartz.instance_name.name, dbms: "postgresql", value: instance_name} + - property: {name: quartz.instance_name.name, dbms: "mysql,mariadb,h2", value: INSTANCE_NAME} + - property: {name: quartz.int_prop_1.name, dbms: "postgresql", value: int_prop_1} + - property: {name: quartz.int_prop_1.name, dbms: "mysql,mariadb,h2", value: INT_PROP_1} + - property: {name: quartz.int_prop_2.name, dbms: "postgresql", value: int_prop_2} + - property: {name: quartz.int_prop_2.name, dbms: "mysql,mariadb,h2", value: INT_PROP_2} + - property: {name: quartz.is_durable.name, dbms: "postgresql", value: is_durable} + - property: {name: quartz.is_durable.name, dbms: "mysql,mariadb,h2", value: IS_DURABLE} + - property: {name: quartz.is_nonconcurrent.name, dbms: "postgresql", value: is_nonconcurrent} + - property: {name: quartz.is_nonconcurrent.name, dbms: "mysql,mariadb,h2", value: IS_NONCONCURRENT} + - property: {name: quartz.is_update_data.name, dbms: "postgresql", value: is_update_data} + - property: {name: quartz.is_update_data.name, dbms: "mysql,mariadb,h2", value: IS_UPDATE_DATA} + - property: {name: quartz.job_class_name.name, dbms: "postgresql", value: job_class_name} + - property: {name: quartz.job_class_name.name, dbms: "mysql,mariadb,h2", value: JOB_CLASS_NAME} + - property: {name: quartz.job_data.name, dbms: "postgresql", value: job_data} + - property: {name: quartz.job_data.name, dbms: "mysql,mariadb,h2", value: JOB_DATA} + - property: {name: quartz.job_group.name, dbms: "postgresql", value: job_group} + - property: {name: quartz.job_group.name, dbms: "mysql,mariadb,h2", value: JOB_GROUP} + - property: {name: quartz.job_name.name, dbms: "postgresql", value: job_name} + - property: {name: quartz.job_name.name, dbms: "mysql,mariadb,h2", value: JOB_NAME} + - property: {name: quartz.last_checkin_time.name, dbms: "postgresql", value: last_checkin_time} + - property: {name: quartz.last_checkin_time.name, dbms: "mysql,mariadb,h2", value: LAST_CHECKIN_TIME} + - property: {name: quartz.lock_name.name, dbms: "postgresql", value: lock_name} + - property: {name: quartz.lock_name.name, dbms: "mysql,mariadb,h2", value: LOCK_NAME} + - property: {name: quartz.long_prop_1.name, dbms: "postgresql", value: long_prop_1} + - property: {name: quartz.long_prop_1.name, dbms: "mysql,mariadb,h2", value: LONG_PROP_1} + - property: {name: quartz.long_prop_2.name, dbms: "postgresql", value: long_prop_2} + - property: {name: quartz.long_prop_2.name, dbms: "mysql,mariadb,h2", value: LONG_PROP_2} + - property: {name: quartz.misfire_instr.name, dbms: "postgresql", value: misfire_instr} + - property: {name: quartz.misfire_instr.name, dbms: "mysql,mariadb,h2", value: MISFIRE_INSTR} + - property: {name: quartz.next_fire_time.name, dbms: "postgresql", value: next_fire_time} + - property: {name: quartz.next_fire_time.name, dbms: "mysql,mariadb,h2", value: NEXT_FIRE_TIME} + - property: {name: quartz.pk_qrtz_blob_triggers.name, dbms: "postgresql", value: pk_qrtz_blob_triggers} + - property: {name: quartz.pk_qrtz_blob_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_BLOB_TRIGGERS} + - property: {name: quartz.pk_qrtz_calendars.name, dbms: "postgresql", value: pk_qrtz_calendars} + - property: {name: quartz.pk_qrtz_calendars.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_CALENDARS} + - property: {name: quartz.pk_qrtz_cron_triggers.name, dbms: "postgresql", value: pk_qrtz_cron_triggers} + - property: {name: quartz.pk_qrtz_cron_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_CRON_TRIGGERS} + - property: {name: quartz.pk_qrtz_fired_triggers.name, dbms: "postgresql", value: pk_qrtz_fired_triggers} + - property: {name: quartz.pk_qrtz_fired_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_FIRED_TRIGGERS} + - property: {name: quartz.pk_qrtz_job_details.name, dbms: "postgresql", value: pk_qrtz_job_details} + - property: {name: quartz.pk_qrtz_job_details.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_JOB_DETAILS} + - property: {name: quartz.pk_qrtz_locks.name, dbms: "postgresql", value: pk_qrtz_locks} + - property: {name: quartz.pk_qrtz_locks.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_LOCKS} + - property: {name: quartz.pk_qrtz_scheduler_state.name, dbms: "postgresql", value: pk_qrtz_scheduler_state} + - property: {name: quartz.pk_qrtz_scheduler_state.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_SCHEDULER_STATE} + - property: {name: quartz.pk_qrtz_simple_triggers.name, dbms: "postgresql", value: pk_qrtz_simple_triggers} + - property: {name: quartz.pk_qrtz_simple_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_SIMPLE_TRIGGERS} + - property: {name: quartz.pk_qrtz_simprop_triggers.name, dbms: "postgresql", value: pk_qrtz_simprop_triggers} + - property: {name: quartz.pk_qrtz_simprop_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_SIMPROP_TRIGGERS} + - property: {name: quartz.pk_qrtz_triggers.name, dbms: "postgresql", value: pk_qrtz_triggers} + - property: {name: quartz.pk_qrtz_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_TRIGGERS} + - property: {name: quartz.pk_sched_name.name, dbms: "postgresql", value: pk_sched_name} + - property: {name: quartz.pk_sched_name.name, dbms: "mysql,mariadb,h2", value: PK_SCHED_NAME} + - property: {name: quartz.prev_fire_time.name, dbms: "postgresql", value: prev_fire_time} + - property: {name: quartz.prev_fire_time.name, dbms: "mysql,mariadb,h2", value: PREV_FIRE_TIME} + - property: {name: quartz.priority.name, dbms: "postgresql", value: priority} + - property: {name: quartz.priority.name, dbms: "mysql,mariadb,h2", value: PRIORITY} + - property: {name: quartz.qrtz_blob_triggers.name, dbms: "postgresql", value: qrtz_blob_triggers} + - property: {name: quartz.qrtz_blob_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_BLOB_TRIGGERS} + - property: {name: quartz.qrtz_calendars.name, dbms: "postgresql", value: qrtz_calendars} + - property: {name: quartz.qrtz_calendars.name, dbms: "mysql,mariadb,h2", value: QRTZ_CALENDARS} + - property: {name: quartz.qrtz_cron_triggers.name, dbms: "postgresql", value: qrtz_cron_triggers} + - property: {name: quartz.qrtz_cron_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_CRON_TRIGGERS} + - property: {name: quartz.qrtz_fired_triggers.name, dbms: "postgresql", value: qrtz_fired_triggers} + - property: {name: quartz.qrtz_fired_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_FIRED_TRIGGERS} + - property: {name: quartz.qrtz_job_details.name, dbms: "postgresql", value: qrtz_job_details} + - property: {name: quartz.qrtz_job_details.name, dbms: "mysql,mariadb,h2", value: QRTZ_JOB_DETAILS} + - property: {name: quartz.qrtz_locks.name, dbms: "postgresql", value: qrtz_locks} + - property: {name: quartz.qrtz_locks.name, dbms: "mysql,mariadb,h2", value: QRTZ_LOCKS} + - property: {name: quartz.qrtz_paused_trigger_grps.name, dbms: "postgresql", value: qrtz_paused_trigger_grps} + - property: {name: quartz.qrtz_paused_trigger_grps.name, dbms: "mysql,mariadb,h2", value: QRTZ_PAUSED_TRIGGER_GRPS} + - property: {name: quartz.qrtz_scheduler_state.name, dbms: "postgresql", value: qrtz_scheduler_state} + - property: {name: quartz.qrtz_scheduler_state.name, dbms: "mysql,mariadb,h2", value: QRTZ_SCHEDULER_STATE} + - property: {name: quartz.qrtz_simple_triggers.name, dbms: "postgresql", value: qrtz_simple_triggers} + - property: {name: quartz.qrtz_simple_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_SIMPLE_TRIGGERS} + - property: {name: quartz.qrtz_simprop_triggers.name, dbms: "postgresql", value: qrtz_simprop_triggers} + - property: {name: quartz.qrtz_simprop_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_SIMPROP_TRIGGERS} + - property: {name: quartz.qrtz_triggers.name, dbms: "postgresql", value: qrtz_triggers} + - property: {name: quartz.qrtz_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_TRIGGERS} + - property: {name: quartz.repeat_count.name, dbms: "postgresql", value: repeat_count} + - property: {name: quartz.repeat_count.name, dbms: "mysql,mariadb,h2", value: REPEAT_COUNT} + - property: {name: quartz.repeat_interval.name, dbms: "postgresql", value: repeat_interval} + - property: {name: quartz.repeat_interval.name, dbms: "mysql,mariadb,h2", value: REPEAT_INTERVAL} + - property: {name: quartz.requests_recovery.name, dbms: "postgresql", value: requests_recovery} + - property: {name: quartz.requests_recovery.name, dbms: "mysql,mariadb,h2", value: REQUESTS_RECOVERY} + - property: {name: quartz.sched_name.name, dbms: "postgresql", value: sched_name} + - property: {name: quartz.sched_name.name, dbms: "mysql,mariadb,h2", value: SCHED_NAME} + - property: {name: quartz.sched_time.name, dbms: "postgresql", value: sched_time} + - property: {name: quartz.sched_time.name, dbms: "mysql,mariadb,h2", value: SCHED_TIME} + - property: {name: quartz.start_time.name, dbms: "postgresql", value: start_time} + - property: {name: quartz.start_time.name, dbms: "mysql,mariadb,h2", value: START_TIME} + - property: {name: quartz.state.name, dbms: "postgresql", value: state} + - property: {name: quartz.state.name, dbms: "mysql,mariadb,h2", value: STATE} + - property: {name: quartz.str_prop_1.name, dbms: "postgresql", value: str_prop_1} + - property: {name: quartz.str_prop_1.name, dbms: "mysql,mariadb,h2", value: STR_PROP_1} + - property: {name: quartz.str_prop_2.name, dbms: "postgresql", value: str_prop_2} + - property: {name: quartz.str_prop_2.name, dbms: "mysql,mariadb,h2", value: STR_PROP_2} + - property: {name: quartz.str_prop_3.name, dbms: "postgresql", value: str_prop_3} + - property: {name: quartz.str_prop_3.name, dbms: "mysql,mariadb,h2", value: STR_PROP_3} + - property: {name: quartz.times_triggered.name, dbms: "postgresql", value: times_triggered} + - property: {name: quartz.times_triggered.name, dbms: "mysql,mariadb,h2", value: TIMES_TRIGGERED} + - property: {name: quartz.time_zone_id.name, dbms: "postgresql", value: time_zone_id} + - property: {name: quartz.time_zone_id.name, dbms: "mysql,mariadb,h2", value: TIME_ZONE_ID} + - property: {name: quartz.trigger_group.name, dbms: "postgresql", value: trigger_group} + - property: {name: quartz.trigger_group.name, dbms: "mysql,mariadb,h2", value: TRIGGER_GROUP} + - property: {name: quartz.trigger_name.name, dbms: "postgresql", value: trigger_name} + - property: {name: quartz.trigger_name.name, dbms: "mysql,mariadb,h2", value: TRIGGER_NAME} + - property: {name: quartz.trigger_state.name, dbms: "postgresql", value: trigger_state} + - property: {name: quartz.trigger_state.name, dbms: "mysql,mariadb,h2", value: TRIGGER_STATE} + - property: {name: quartz.trigger_type.name, dbms: "postgresql", value: trigger_type} + - property: {name: quartz.trigger_type.name, dbms: "mysql,mariadb,h2", value: TRIGGER_TYPE} + - changeSet: id: 89 author: camsaul - comment: 'Added 0.30.0' + comment: Added 0.30.0 + validCheckSum: ANY changes: - createTable: - tableName: QRTZ_JOB_DETAILS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_job_details.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: JOB_NAME + name: ${quartz.job_name.name} type: varchar(200) constraints: nullable: false - column: - name: JOB_GROUP + name: ${quartz.job_group.name} type: varchar(200) constraints: nullable: false - column: - name: DESCRIPTION + name: ${quartz.description.name} type: varchar(250) - column: - name: JOB_CLASS_NAME + name: ${quartz.job_class_name.name} type: varchar(250) constraints: nullable: false - column: - name: IS_DURABLE + name: ${quartz.is_durable.name} type: bool constraints: nullable: false - column: - name: IS_NONCONCURRENT + name: ${quartz.is_nonconcurrent.name} type: bool constraints: nullable: false - column: - name: IS_UPDATE_DATA + name: ${quartz.is_update_data.name} type: bool constraints: nullable: false - column: - name: REQUESTS_RECOVERY + name: ${quartz.requests_recovery.name} type: bool constraints: nullable: false - column: - name: JOB_DATA + name: ${quartz.job_data.name} type: ${blob.type} - addPrimaryKey: - tableName: QRTZ_JOB_DETAILS - columnNames: SCHED_NAME, JOB_NAME, JOB_GROUP - constraintName: PK_QRTZ_JOB_DETAILS + tableName: ${quartz.qrtz_job_details.name} + columnNames: ${quartz.sched_name.name}, ${quartz.job_name.name}, ${quartz.job_group.name} + constraintName: ${quartz.pk_qrtz_job_details.name} - createTable: - tableName: QRTZ_TRIGGERS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_triggers.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} type: varchar(200) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - column: - name: JOB_NAME + name: ${quartz.job_name.name} type: varchar(200) constraints: nullable: false - column: - name: JOB_GROUP + name: ${quartz.job_group.name} type: varchar(200) constraints: nullable: false - column: - name: DESCRIPTION + name: ${quartz.description.name} type: varchar(250) - column: - name: NEXT_FIRE_TIME + name: ${quartz.next_fire_time.name} type: bigint - column: - name: PREV_FIRE_TIME + name: ${quartz.prev_fire_time.name} type: bigint - column: - name: PRIORITY + name: ${quartz.priority.name} type: integer - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} type: varchar(16) constraints: nullable: false - column: - name: TRIGGER_TYPE + name: ${quartz.trigger_type.name} type: varchar(8) constraints: nullable: false - column: - name: START_TIME + name: ${quartz.start_time.name} type: bigint constraints: nullable: false - column: - name: END_TIME + name: ${quartz.end_time.name} type: bigint - column: - name: CALENDAR_NAME + name: ${quartz.calendar_name.name} type: varchar(200) - column: - name: MISFIRE_INSTR + name: ${quartz.misfire_instr.name} type: smallint - column: - name: JOB_DATA + name: ${quartz.job_data.name} type: ${blob.type} - addPrimaryKey: - tableName: QRTZ_TRIGGERS - columnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: PK_QRTZ_TRIGGERS + tableName: ${quartz.qrtz_triggers.name} + columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.pk_qrtz_triggers.name} - addForeignKeyConstraint: - baseTableName: QRTZ_TRIGGERS - baseColumnNames: SCHED_NAME, JOB_NAME, JOB_GROUP - referencedTableName: QRTZ_JOB_DETAILS - referencedColumnNames: SCHED_NAME, JOB_NAME, JOB_GROUP - constraintName: FK_QRTZ_TRIGGERS_JOB_DETAILS + baseTableName: ${quartz.qrtz_triggers.name} + baseColumnNames: ${quartz.sched_name.name}, ${quartz.job_name.name}, ${quartz.job_group.name} + referencedTableName: ${quartz.qrtz_job_details.name} + referencedColumnNames: ${quartz.sched_name.name}, ${quartz.job_name.name}, ${quartz.job_group.name} + constraintName: ${quartz.fk_qrtz_triggers_job_details.name} - createTable: - tableName: QRTZ_SIMPLE_TRIGGERS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_simple_triggers.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} type: varchar(200) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - column: - name: REPEAT_COUNT + name: ${quartz.repeat_count.name} type: bigint constraints: nullable: false - column: - name: REPEAT_INTERVAL + name: ${quartz.repeat_interval.name} type: bigint constraints: nullable: false - column: - name: TIMES_TRIGGERED + name: ${quartz.times_triggered.name} type: bigint constraints: nullable: false - addPrimaryKey: - tableName: QRTZ_SIMPLE_TRIGGERS - columnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: PK_QRTZ_SIMPLE_TRIGGERS + tableName: ${quartz.qrtz_simple_triggers.name} + columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.pk_qrtz_simple_triggers.name} - addForeignKeyConstraint: - baseTableName: QRTZ_SIMPLE_TRIGGERS - baseColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - referencedColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: FK_QRTZ_SIMPLE_TRIGGERS_TRIGGERS + baseTableName: ${quartz.qrtz_simple_triggers.name} + baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + referencedTableName: ${quartz.qrtz_triggers.name} + referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.fk_qrtz_simple_triggers_triggers.name} - createTable: - tableName: QRTZ_CRON_TRIGGERS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_cron_triggers.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} type: varchar(200) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - column: - name: CRON_EXPRESSION + name: ${quartz.cron_expression.name} type: varchar(120) constraints: nullable: false - column: - name: TIME_ZONE_ID + name: ${quartz.time_zone_id.name} type: varchar(80) - addPrimaryKey: - tableName: QRTZ_CRON_TRIGGERS - columnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: PK_QRTZ_CRON_TRIGGERS + tableName: ${quartz.qrtz_cron_triggers.name} + columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.pk_qrtz_cron_triggers.name} - addForeignKeyConstraint: - baseTableName: QRTZ_CRON_TRIGGERS - baseColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - referencedColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: FK_QRTZ_CRON_TRIGGERS_TRIGGERS + baseTableName: ${quartz.qrtz_cron_triggers.name} + baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + referencedTableName: ${quartz.qrtz_triggers.name} + referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.fk_qrtz_cron_triggers_triggers.name} - createTable: - tableName: QRTZ_SIMPROP_TRIGGERS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_simprop_triggers.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} type: varchar(200) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - column: - name: STR_PROP_1 + name: ${quartz.str_prop_1.name} type: varchar(512) - column: - name: STR_PROP_2 + name: ${quartz.str_prop_2.name} type: varchar(512) - column: - name: STR_PROP_3 + name: ${quartz.str_prop_3.name} type: varchar(512) - column: - name: INT_PROP_1 + name: ${quartz.int_prop_1.name} type: int - column: - name: INT_PROP_2 + name: ${quartz.int_prop_2.name} type: int - column: - name: LONG_PROP_1 + name: ${quartz.long_prop_1.name} type: bigint - column: - name: LONG_PROP_2 + name: ${quartz.long_prop_2.name} type: bigint - column: - name: DEC_PROP_1 + name: ${quartz.dec_prop_1.name} type: numeric(13,4) - column: - name: DEC_PROP_2 + name: ${quartz.dec_prop_2.name} type: numeric(13,4) - column: - name: BOOL_PROP_1 + name: ${quartz.bool_prop_1.name} type: bool - column: - name: BOOL_PROP_2 + name: ${quartz.bool_prop_2.name} type: bool - addPrimaryKey: - tableName: QRTZ_SIMPROP_TRIGGERS - columnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: PK_QRTZ_SIMPROP_TRIGGERS + tableName: ${quartz.qrtz_simprop_triggers.name} + columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.pk_qrtz_simprop_triggers.name} - addForeignKeyConstraint: - baseTableName: QRTZ_SIMPROP_TRIGGERS - baseColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - referencedColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: FK_QRTZ_SIMPROP_TRIGGERS_TRIGGERS + baseTableName: ${quartz.qrtz_simprop_triggers.name} + baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + referencedTableName: ${quartz.qrtz_triggers.name} + referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.fk_qrtz_simprop_triggers_triggers.name} - createTable: - tableName: QRTZ_BLOB_TRIGGERS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_blob_triggers.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} type: varchar(200) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - column: - name: BLOB_DATA + name: ${quartz.blob_data.name} type: ${blob.type} - addPrimaryKey: - tableName: QRTZ_BLOB_TRIGGERS - columnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: PK_QRTZ_BLOB_TRIGGERS + tableName: ${quartz.qrtz_blob_triggers.name} + columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.pk_qrtz_blob_triggers.name} - addForeignKeyConstraint: - baseTableName: QRTZ_BLOB_TRIGGERS - baseColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - referencedTableName: QRTZ_TRIGGERS - referencedColumnNames: SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP - constraintName: FK_QRTZ_BLOB_TRIGGERS_TRIGGERS + baseTableName: ${quartz.qrtz_blob_triggers.name} + baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + referencedTableName: ${quartz.qrtz_triggers.name} + referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.fk_qrtz_blob_triggers_triggers.name} - createTable: - tableName: QRTZ_CALENDARS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_calendars.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: CALENDAR_NAME + name: ${quartz.calendar_name.name} type: varchar(200) constraints: nullable: false - column: - name: CALENDAR + name: ${quartz.calendar.name} type: ${blob.type} constraints: nullable: false - addPrimaryKey: - tableName: QRTZ_CALENDARS - columnNames: SCHED_NAME, CALENDAR_NAME - constraintName: PK_QRTZ_CALENDARS + tableName: ${quartz.qrtz_calendars.name} + columnNames: ${quartz.sched_name.name}, ${quartz.calendar_name.name} + constraintName: ${quartz.pk_qrtz_calendars.name} - createTable: - tableName: QRTZ_PAUSED_TRIGGER_GRPS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_paused_trigger_grps.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - addPrimaryKey: - tableName: QRTZ_PAUSED_TRIGGER_GRPS - columnNames: SCHED_NAME, TRIGGER_GROUP - constraintName: PK_SCHED_NAME + tableName: ${quartz.qrtz_paused_trigger_grps.name} + columnNames: ${quartz.sched_name.name}, ${quartz.trigger_group.name} + constraintName: ${quartz.pk_sched_name.name} - createTable: - tableName: QRTZ_FIRED_TRIGGERS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_fired_triggers.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: ENTRY_ID + name: ${quartz.entry_id.name} type: varchar(95) constraints: nullable: false - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} type: varchar(200) constraints: nullable: false - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} type: varchar(200) constraints: nullable: false - column: - name: INSTANCE_NAME + name: ${quartz.instance_name.name} type: varchar(200) constraints: nullable: false - column: - name: FIRED_TIME + name: ${quartz.fired_time.name} type: bigint constraints: nullable: false @@ -4912,268 +5158,268 @@ databaseChangeLog: # nullable since at the time of this migration we're still using 2.1.7; including it gives us an easy upgrade path in # the future. - column: - name: SCHED_TIME + name: ${quartz.sched_time.name} type: bigint - column: - name: PRIORITY + name: ${quartz.priority.name} type: integer constraints: nullable: false - column: - name: STATE + name: ${quartz.state.name} type: varchar(16) constraints: nullable: false - column: - name: JOB_NAME + name: ${quartz.job_name.name} type: varchar(200) - column: - name: JOB_GROUP + name: ${quartz.job_group.name} type: varchar(200) - column: - name: IS_NONCONCURRENT + name: ${quartz.is_nonconcurrent.name} type: bool - column: - name: REQUESTS_RECOVERY + name: ${quartz.requests_recovery.name} type: bool - addPrimaryKey: - tableName: QRTZ_FIRED_TRIGGERS - columnNames: SCHED_NAME, ENTRY_ID - constraintName: PK_QRTZ_FIRED_TRIGGERS + tableName: ${quartz.qrtz_fired_triggers.name} + columnNames: ${quartz.sched_name.name}, ${quartz.entry_id.name} + constraintName: ${quartz.pk_qrtz_fired_triggers.name} - createTable: - tableName: QRTZ_SCHEDULER_STATE - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_scheduler_state.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: INSTANCE_NAME + name: ${quartz.instance_name.name} type: varchar(200) constraints: nullable: false - column: - name: LAST_CHECKIN_TIME + name: ${quartz.last_checkin_time.name} type: bigint constraints: nullable: false - column: - name: CHECKIN_INTERVAL + name: ${quartz.checkin_interval.name} type: bigint constraints: nullable: false - addPrimaryKey: - tableName: QRTZ_SCHEDULER_STATE - columnNames: SCHED_NAME, INSTANCE_NAME - constraintName: PK_QRTZ_SCHEDULER_STATE + tableName: ${quartz.qrtz_scheduler_state.name} + columnNames: ${quartz.sched_name.name}, ${quartz.instance_name.name} + constraintName: ${quartz.pk_qrtz_scheduler_state.name} - createTable: - tableName: QRTZ_LOCKS - remarks: 'Used for Quartz scheduler.' + tableName: ${quartz.qrtz_locks.name} + remarks: Used for Quartz scheduler. columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} type: varchar(120) constraints: nullable: false - column: - name: LOCK_NAME + name: ${quartz.lock_name.name} type: varchar(40) constraints: nullable: false - addPrimaryKey: - tableName: QRTZ_LOCKS - columnNames: SCHED_NAME, LOCK_NAME - constraintName: PK_QRTZ_LOCKS + tableName: ${quartz.qrtz_locks.name} + columnNames: ${quartz.sched_name.name}, ${quartz.lock_name.name} + constraintName: ${quartz.pk_qrtz_locks.name} - createIndex: - indexName: IDX_QRTZ_J_REQ_RECOVERY - tableName: QRTZ_JOB_DETAILS + indexName: ${quartz.idx_qrtz_j_req_recovery.name} + tableName: ${quartz.qrtz_job_details.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: REQUESTS_RECOVERY + name: ${quartz.requests_recovery.name} - createIndex: - indexName: IDX_QRTZ_J_GRP - tableName: QRTZ_JOB_DETAILS + indexName: ${quartz.idx_qrtz_j_grp.name} + tableName: ${quartz.qrtz_job_details.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: JOB_GROUP + name: ${quartz.job_group.name} - createIndex: - indexName: IDX_QRTZ_T_J - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_j.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: JOB_NAME + name: ${quartz.job_name.name} - column: - name: JOB_GROUP + name: ${quartz.job_group.name} - createIndex: - indexName: IDX_QRTZ_T_JG - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_jg.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: JOB_GROUP + name: ${quartz.job_group.name} - createIndex: - indexName: IDX_QRTZ_T_C - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_c.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: CALENDAR_NAME + name: ${quartz.calendar_name.name} - createIndex: - indexName: IDX_QRTZ_T_G - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_g.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} - createIndex: - indexName: IDX_QRTZ_T_STATE - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_state.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} - createIndex: - indexName: IDX_QRTZ_T_N_STATE - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_n_state.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} - createIndex: - indexName: IDX_QRTZ_T_N_G_STATE - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_n_g_state.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} - createIndex: - indexName: IDX_QRTZ_T_NEXT_FIRE_TIME - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_next_fire_time.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: NEXT_FIRE_TIME + name: ${quartz.next_fire_time.name} - createIndex: - indexName: IDX_QRTZ_T_NFT_ST - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_nft_st.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} - column: - name: NEXT_FIRE_TIME + name: ${quartz.next_fire_time.name} - createIndex: - indexName: IDX_QRTZ_T_NFT_MISFIRE - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_nft_misfire.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: MISFIRE_INSTR + name: ${quartz.misfire_instr.name} - column: - name: NEXT_FIRE_TIME + name: ${quartz.next_fire_time.name} - createIndex: - indexName: IDX_QRTZ_T_NFT_ST_MISFIRE - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_nft_st_misfire.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: MISFIRE_INSTR + name: ${quartz.misfire_instr.name} - column: - name: NEXT_FIRE_TIME + name: ${quartz.next_fire_time.name} - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} - createIndex: - indexName: IDX_QRTZ_T_NFT_ST_MISFIRE_GRP - tableName: QRTZ_TRIGGERS + indexName: ${quartz.idx_qrtz_t_nft_st_misfire_grp.name} + tableName: ${quartz.qrtz_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: MISFIRE_INSTR + name: ${quartz.misfire_instr.name} - column: - name: NEXT_FIRE_TIME + name: ${quartz.next_fire_time.name} - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} - column: - name: TRIGGER_STATE + name: ${quartz.trigger_state.name} - createIndex: - indexName: IDX_QRTZ_FT_TRIG_INST_NAME - tableName: QRTZ_FIRED_TRIGGERS + indexName: ${quartz.idx_qrtz_ft_trig_inst_name.name} + tableName: ${quartz.qrtz_fired_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: INSTANCE_NAME + name: ${quartz.instance_name.name} - createIndex: - indexName: IDX_QRTZ_FT_INST_JOB_REQ_RCVRY - tableName: QRTZ_FIRED_TRIGGERS + indexName: ${quartz.idx_qrtz_ft_inst_job_req_rcvry.name} + tableName: ${quartz.qrtz_fired_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: INSTANCE_NAME + name: ${quartz.instance_name.name} - column: - name: REQUESTS_RECOVERY + name: ${quartz.requests_recovery.name} - createIndex: - indexName: IDX_QRTZ_FT_J_G - tableName: QRTZ_FIRED_TRIGGERS + indexName: ${quartz.idx_qrtz_ft_j_g.name} + tableName: ${quartz.qrtz_fired_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: JOB_NAME + name: ${quartz.job_name.name} - column: - name: JOB_GROUP + name: ${quartz.job_group.name} - createIndex: - indexName: IDX_QRTZ_FT_JG - tableName: QRTZ_FIRED_TRIGGERS + indexName: ${quartz.idx_qrtz_ft_jg.name} + tableName: ${quartz.qrtz_fired_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: JOB_GROUP + name: ${quartz.job_group.name} - createIndex: - indexName: IDX_QRTZ_FT_T_G - tableName: QRTZ_FIRED_TRIGGERS + indexName: ${quartz.idx_qrtz_ft_t_g.name} + tableName: ${quartz.qrtz_fired_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_NAME + name: ${quartz.trigger_name.name} - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} - createIndex: - indexName: IDX_QRTZ_FT_TG - tableName: QRTZ_FIRED_TRIGGERS + indexName: ${quartz.idx_qrtz_ft_tg.name} + tableName: ${quartz.qrtz_fired_triggers.name} columns: - column: - name: SCHED_NAME + name: ${quartz.sched_name.name} - column: - name: TRIGGER_GROUP + name: ${quartz.trigger_group.name} - changeSet: id: 90 @@ -5213,10 +5459,7 @@ databaseChangeLog: id: 92 author: camsaul comment: 'Added 0.31.0' - validCheckSum: - - 8:a875945f36824a0667c740888c00c37f - - 8:83ded48e18fe8f70d6ec09add042124d - - 8:1e5bc2d66778316ea640a561862c23b4 + validCheckSum: ANY changes: - addColumn: tableName: query_execution @@ -5312,6 +5555,7 @@ databaseChangeLog: id: 95 author: senior comment: 'Added 0.31.0' + validCheckSum: ANY # Don't add the constraint if there are already duplicates in the database change log! Migrations will fail! # See #8909 preConditions: @@ -5326,7 +5570,7 @@ databaseChangeLog: - addUniqueConstraint: columnNames: id, author, filename constraintName: idx_databasechangelog_id_author_filename - tableName: DATABASECHANGELOG + tableName: ${databasechangelog.name} # # ADD Field.settings COLUMN # @@ -5448,13 +5692,12 @@ databaseChangeLog: id: 100 author: camsaul comment: 'Added 0.32.0' - preConditions: - - onFail: MARK_RAN - - onUpdateSQL: RUN - - tableExists: - tableName: databasechangelog + validCheckSum: ANY changes: + # databasechangelog is upper-case in MySQL and MariaDB (and H2 for that matter, but H2 will upper-case the + # unquoted identifier) - sql: + dbms: postgresql,h2 sql: >- UPDATE metric SET archived = NOT archived @@ -5464,6 +5707,17 @@ databaseChangeLog: WHERE dbcl.id = '84' AND metric.updated_at < dbcl.dateexecuted ) + - sql: + dbms: mysql,mariadb + sql: >- + UPDATE metric + SET archived = NOT archived + WHERE EXISTS ( + SELECT * + FROM `DATABASECHANGELOG` dbcl + WHERE dbcl.id = '84' + AND metric.updated_at < dbcl.dateexecuted + ) # Very helpful for performance reasons. See #9519 - changeSet: @@ -6450,9 +6704,7 @@ databaseChangeLog: id: 165 author: sb comment: 'Added field_order to Table and database_position to Field' - validCheckSum: - - 8:474a357368a665d5e0701b9eb5f313f9 - - 8:8848644da9dd9e40924ae71ac4c7c370 + validCheckSum: ANY changes: - addColumn: tableName: metabase_field @@ -6508,6 +6760,7 @@ databaseChangeLog: - changeSet: id: 167 author: walterl, camsaul + validCheckSum: ANY comment: 'Added 0.36.0' changes: # If an older version of this Table was created locally (during dev) drop it, we have an updated definition @@ -6545,7 +6798,8 @@ databaseChangeLog: type: int constraints: nullable: false - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id foreignKeyName: fk_snippet_creator_id # This primarily affects tests because under normal # circumstances we don't delete Users, we just archive them @@ -6600,7 +6854,6 @@ databaseChangeLog: id: 169 author: camsaul comment: Added 0.36.0 - objectQuotingStrategy: ${quote_strategy} changes: - dropColumn: tableName: metabase_table @@ -6624,6 +6877,7 @@ databaseChangeLog: - changeSet: id: 171 author: camsaul + validCheckSum: ANY comment: Added 0.36.0 changes: - addColumn: @@ -6635,7 +6889,8 @@ databaseChangeLog: remarks: 'ID of the Snippet Folder (Collection) this Snippet is in, if any' constraints: nullable: true - references: collection(id) + referencedTableName: collection + referencedColumnNames: id foreignKeyName: fk_snippet_collection_id deleteCascade: true - createIndex: @@ -7847,9 +8102,7 @@ databaseChangeLog: id: 275 author: dpsutton comment: 'Added 0.38.0 refingerprint to Database' - validCheckSum: - - 8:b976d49f4eb84664649119f5f63465dd - - 8:447d9e294f59dd1058940defec7e0f40 + validCheckSum: ANY changes: - addColumn: tableName: metabase_database @@ -7864,9 +8117,7 @@ databaseChangeLog: id: 276 author: robroland comment: Added 0.38.0 - Dashboard subscriptions - validCheckSum: - - 8:dfe9b8333b600c739306caa85d95ad55 - - 8:59dd1fb0732c7a9b78bce896c0cff3c0 + validCheckSum: ANY changes: - addColumn: tableName: pulse_card @@ -7877,7 +8128,8 @@ databaseChangeLog: remarks: 'If this Pulse is a Dashboard subscription, the ID of the DashboardCard that corresponds to this PulseCard.' constraints: nullable: true - references: report_dashboardcard(id) + referencedTableName: report_dashboardcard + referencedColumnNames: id foreignKeyName: fk_pulse_card_ref_pulse_card_id deferrable: false initiallyDeferred: false @@ -8029,9 +8281,7 @@ databaseChangeLog: id: 287 author: dpsutton comment: Added 0.39 - Semantic type system - migrate ISO8601 strings - validCheckSum: - - 8:ed47b08ec425a34cf66bd1e96c7b2446 - - 8:0679eedae767a8648383aac2f923e413 + validCheckSum: ANY changes: - sql: sql: >- @@ -8057,11 +8307,7 @@ databaseChangeLog: id: 288 author: dpsutton comment: Added 0.39 - Semantic type system - migrate unix timestamps - validCheckSum: - - 8:4fa37c8edede4a10c39bf5aca13bd1b5 - - 8:96af0fae84744857640d029cf4cd4bb6 - - 8:8a8b10ff335892c18394a6e00676a446 - - 8:943c6dd0c9339729fefcee9207227849 + validCheckSum: ANY changes: - sql: sql: >- @@ -8084,9 +8330,7 @@ databaseChangeLog: id: 289 author: dpsutton comment: Added 0.39 - Semantic type system - migrate unix timestamps (corrects typo- seconds was migrated correctly, not millis and micros) - validCheckSum: - - 8:c5398e06bc1bd497f9b56d3e8497b88a - - 8:9f7f2e9bbf3236f204c644dc8ea7abef + validCheckSum: ANY changes: - sql: sql: >- @@ -8112,6 +8356,7 @@ databaseChangeLog: - changeSet: id: 291 author: camsaul + validCheckSum: ANY comment: Added 0.39.0 changes: - createTable: @@ -8138,7 +8383,8 @@ databaseChangeLog: remarks: "ID of the User that logged in." constraints: foreignKeyName: fk_login_history_user_id - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id nullable: false deleteCascade: true # FK constraint is created later, because we can't create it inline with ON DELETE SET NULL @@ -8510,11 +8756,7 @@ databaseChangeLog: id: 313 author: jeff303 comment: Added 0.42.0 - Secret domain object. - validCheckSum: - - 8:d60aa66f5909d37393ee711dea6996c7 # original checksum under #17649 - - 8:98f3ccbb3e8efc46f5766fcd51f39d0e # changed creator_id to nullable in #19398 - - 8:ccfed82cd5d09891c7a380b428e5fbc5 # no idea where these two values come from :( - - 8:b4864fb1516837c753bf3a607a8ed655 + validCheckSum: ANY changes: - createTable: tableName: secret @@ -8542,7 +8784,8 @@ databaseChangeLog: foreignKeyName: fk_secret_ref_user_id initiallyDeferred: false nullable: true - references: core_user(id) + referencedTableName: core_user + referencedColumnNames: id name: creator_id remarks: User ID who created this secret instance type: int diff --git a/src/metabase/db/liquibase.clj b/src/metabase/db/liquibase.clj index e65c4bea5dd89..c16c25cf6ab08 100644 --- a/src/metabase/db/liquibase.clj +++ b/src/metabase/db/liquibase.clj @@ -3,6 +3,8 @@ (:require [clojure.java.jdbc :as jdbc] [clojure.string :as str] [clojure.tools.logging :as log] + [metabase.db.liquibase.h2 :as liquibase.h2] + [metabase.db.liquibase.mysql :as liquibase.mysql] [metabase.util :as u] [metabase.util.i18n :refer [trs]] [schema.core :as s]) @@ -11,19 +13,37 @@ [liquibase.database Database DatabaseFactory] liquibase.database.jvm.JdbcConnection liquibase.exception.LockException - liquibase.resource.ClassLoaderResourceAccessor - liquibase.sqlgenerator.SqlGeneratorFactory - metabase.db.liquibase.MetabaseMySqlCreateTableSqlGenerator)) + liquibase.resource.ClassLoaderResourceAccessor)) -(.register (SqlGeneratorFactory/getInstance) (MetabaseMySqlCreateTableSqlGenerator.)) +;; register our custom MySQL SQL generators +(liquibase.mysql/register-mysql-generators!) + +;; Liquibase uses java.util.logging (JUL) for logging, so we need to install the JUL -> Log4j2 bridge which replaces the +;; default JUL handler with one that "writes" log messages to Log4j2. (Not sure this is the best place in the world to +;; do this, but Liquibase is the only thing using JUL directly.) +;; +;; See https://logging.apache.org/log4j/2.x/log4j-jul/index.html for more information. +(org.apache.logging.log4j.jul.Log4jBridgeHandler/install true nil true) + +;; Liquibase logs a message for every ChangeSet directly to standard out -- see +;; https://github.com/liquibase/liquibase/issues/2396 -- but we can disable this by setting the ConsoleUIService's +;; output stream to the null output stream +(doto ^liquibase.ui.ConsoleUIService (.getUI (liquibase.Scope/getCurrentScope)) + ;; we can't use `java.io.OutputStream/nullOutputStream` here because it's not available on Java 8 + (.setOutputStream (java.io.PrintStream. (org.apache.commons.io.output.NullOutputStream.)))) (def ^:private ^String changelog-file "liquibase.yaml") (defn- liquibase-connection ^JdbcConnection [^java.sql.Connection jdbc-connection] (JdbcConnection. jdbc-connection)) +(defn- h2? [^JdbcConnection liquibase-conn] + (str/starts-with? (.getURL liquibase-conn) "jdbc:h2")) + (defn- database ^Database [^JdbcConnection liquibase-conn] - (.findCorrectDatabaseImplementation (DatabaseFactory/getInstance) liquibase-conn)) + (if (h2? liquibase-conn) + (liquibase.h2/h2-database liquibase-conn) + (.findCorrectDatabaseImplementation (DatabaseFactory/getInstance) liquibase-conn))) (defn- liquibase ^Liquibase [^Database database] (Liquibase. changelog-file (ClassLoaderResourceAccessor.) database)) @@ -119,7 +139,7 @@ (if (has-unrun-migrations? liquibase) (do (log/info (trs "Migration lock is cleared. Running migrations...")) - (u/auto-retry 3 (let [^Contexts contexts nil] (.update liquibase contexts)))) + (let [^Contexts contexts nil] (.update liquibase contexts))) (log/info (trs "Migration lock cleared, but nothing to do here! Migrations were finished by another instance."))))) diff --git a/src/metabase/db/liquibase/h2.clj b/src/metabase/db/liquibase/h2.clj new file mode 100644 index 0000000000000..fe62c49a3c6fc --- /dev/null +++ b/src/metabase/db/liquibase/h2.clj @@ -0,0 +1,51 @@ +(ns metabase.db.liquibase.h2 + "Custom implementation of the Liquibase H2 adapter that uppercases all identifiers. See #20611 for more details." + (:require [metabase.util :as u]) + (:import liquibase.database.core.H2Database + liquibase.database.jvm.JdbcConnection)) + +(defn- upcase ^String [s] + (some-> s u/upper-case-en)) + +(defn- h2-database* ^H2Database [] + (proxy [H2Database] [] + (quoteObject [object-name object-type] + (let [^H2Database this this] + (proxy-super quoteObject (upcase object-name) object-type))) + + (mustQuoteObjectName [_object-name _object-type] + true))) + +;; HACK! Create a [[java.lang.Package]] for the proxy class if one does not already exist. This is needed because: +;; +;; 1. Liquibase will throw an NPE if the package for the class does not exist -- see +;; https://github.com/liquibase/liquibase/blob/master/liquibase-core/src/main/java/liquibase/logging/core/JavaLogService.java#L45 +;; and https://github.com/liquibase/liquibase/issues/2633 +;; +;; 2. In Java 9+, the JVM will automatically define a package when a class is created; in Java 8, it does not. +;; +;; 3. The Clojure DynamicClassLoader does not create a Package -- see +;; https://clojure.atlassian.net/browse/CLJ-1550?focusedCommentId=13025 +;; +;; This only does anything in REPL-based development; in the uberjar the proxy class will be AOT'ed and will have a +;; package defined for it when it's loaded by the normal JVM classloader rather than the Clojure DynamicClassLoader +(let [klass (class (h2-database*))] + (when-not (.getPackage klass) + (let [method (.getDeclaredMethod + ClassLoader + "definePackage" + (into-array Class [String String String String String String String java.net.URL])) + class-name (.getName klass) + ;; e.g. metabase.db.liquibase.h2.proxy$liquibase.database.core + package-name (.substring class-name 0 (.lastIndexOf class-name "."))] + (doto method + (.setAccessible true) + (.invoke (.getClassLoader klass) (into-array Object [package-name nil nil nil nil nil nil nil])) + (.setAccessible false)) + (assert (.getPackage klass) (format "Failed to create package for proxy class %s." class-name))))) + +(defn h2-database + "A version of the Liquibase H2 implementation that always converts identifiers to uppercase and then quotes them." + ^H2Database [^JdbcConnection conn] + (doto (h2-database*) + (.setConnection conn))) diff --git a/src/metabase/db/liquibase/mysql.clj b/src/metabase/db/liquibase/mysql.clj new file mode 100644 index 0000000000000..7ef3ffe314f76 --- /dev/null +++ b/src/metabase/db/liquibase/mysql.clj @@ -0,0 +1,69 @@ +(ns metabase.db.liquibase.mysql + (:require [clojure.string :as str]) + (:import liquibase.database.core.MySQLDatabase + liquibase.database.Database + [liquibase.sql Sql UnparsedSql] + [liquibase.sqlgenerator.core CreateTableGenerator SetColumnRemarksGenerator] + liquibase.sqlgenerator.SqlGeneratorFactory + liquibase.structure.DatabaseObject)) + +(defn- mysql? [database] + (instance? MySQLDatabase database)) + +(defn- column-remarks-generator + "Custom generator for `ALTER TABLE ... MODIFY COLUMN ... COMMENT` statements. Due to upstream bug + https://github.com/liquibase/liquibase/issues/2634 these do not work correctly in MySQL. This SQL generator is a + no-op generator that skips these statements (most of our column remarks are added in `CREATE TABLE` anyway, so we're + not losing much.)" + ^SetColumnRemarksGenerator [] + (proxy [SetColumnRemarksGenerator] [] + (getPriority [] + (let [^SetColumnRemarksGenerator this this] + (inc (proxy-super getPriority)))) + + (supports [statement database] + (let [^SetColumnRemarksGenerator this this] + (and (proxy-super supports statement database) + (mysql? database)))) + + (generateSql [_statement _database _sql-generator-chain] + (into-array Sql [])))) + +(defn- create-table-generator + "Custom generator for `CREATE TABLE` statements. This does two things: + + - Uses `current_timestamp(6)` as the current date time function + - Adds `CHARACTER SET` and `COLLATE` info at the end of the statement to force UTF-8" + ^CreateTableGenerator [] + (proxy [CreateTableGenerator] [] + (getPriority [] + (let [^CreateTableGenerator this this] + (inc (proxy-super getPriority)))) + + (supports [statement database] + (let [^CreateTableGenerator this this] + (and (proxy-super supports statement database) + (mysql? database)))) + + (generateSql [statement ^Database database sql-generator-chain] + ;; it seems like Liquibase actually ignores the `defaultValueComputed` + ;; that we set in the migrations YAML file -- see + ;; https://stackoverflow.com/questions/58816496/force-liquibase-to-current-timestamp-instead-of-now + (.setCurrentDateTimeFunction database "current_timestamp(6)") + (let [^CreateTableGenerator this this] + (into-array + Sql + (map (fn [^Sql sql] + (if-not (str/starts-with? (.toSql sql) "CREATE TABLE") + sql + (UnparsedSql. (str (.toSql sql) + " ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") + (into-array DatabaseObject (.getAffectedDatabaseObjects sql))))) + (proxy-super generateSql statement database sql-generator-chain))))))) + +(defn register-mysql-generators! + "Register our custom MySQL SQL generators." + [] + (doto (SqlGeneratorFactory/getInstance) + (.register (column-remarks-generator)) + (.register (create-table-generator)))) diff --git a/test_config/log4j2-test.xml b/test_config/log4j2-test.xml index 258e616545586..fbb6f45673650 100644 --- a/test_config/log4j2-test.xml +++ b/test_config/log4j2-test.xml @@ -8,6 +8,7 @@ +