From d79971b8a5d44e32bb5ea08c6389b2d20b468396 Mon Sep 17 00:00:00 2001 From: baezzys Date: Sun, 17 Aug 2025 23:55:02 +0900 Subject: [PATCH] Add migration script integration tests - Implement 4.x to 5.0 migration validation for all supported databases - Add 4.x baseline schema files for migration testing - Use TestContainers for major databases, embedded for others - Auto-disable tests when Docker unavailable Resolves: https://github.com/spring-projects/spring-batch/issues/4289 Signed-off-by: baezzys --- .../batch/core/schema-db2-v4.sql | 80 +++++++++++++++++ .../batch/core/schema-derby-v4.sql | 80 +++++++++++++++++ .../batch/core/schema-h2-v4.sql | 80 +++++++++++++++++ .../batch/core/schema-hsqldb-v4.sql | 86 +++++++++++++++++++ .../batch/core/schema-mysql-v4.sql | 76 ++++++++++++++++ .../batch/core/schema-oracle-v4.sql | 80 +++++++++++++++++ .../batch/core/schema-postgresql-v4.sql | 80 +++++++++++++++++ .../batch/core/schema-sqlite-v4.sql | 83 ++++++++++++++++++ .../batch/core/schema-sqlserver-v4.sql | 80 +++++++++++++++++ .../batch/core/schema-sybase-v4.sql | 80 +++++++++++++++++ .../DB2MigrationScriptIntegrationTests.java | 67 +++++++++++++++ .../DerbyMigrationScriptIntegrationTests.java | 52 +++++++++++ .../H2MigrationScriptIntegrationTests.java | 46 ++++++++++ ...HSQLDBMigrationScriptIntegrationTests.java | 51 +++++++++++ .../MySQLMigrationScriptIntegrationTests.java | 57 ++++++++++++ ...OracleMigrationScriptIntegrationTests.java | 59 +++++++++++++ ...greSQLMigrationScriptIntegrationTests.java | 57 ++++++++++++ ...ServerMigrationScriptIntegrationTests.java | 60 +++++++++++++ ...SQLiteMigrationScriptIntegrationTests.java | 54 ++++++++++++ ...SybaseMigrationScriptIntegrationTests.java | 73 ++++++++++++++++ 20 files changed, 1381 insertions(+) create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-db2-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-derby-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-h2-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-hsqldb-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-mysql-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-oracle-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-postgresql-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlite-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver-v4.sql create mode 100644 spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sybase-v4.sql create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DB2MigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DerbyMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/H2MigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/HSQLDBMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/MySQLMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/OracleMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/PostgreSQLMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLServerMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLiteMigrationScriptIntegrationTests.java create mode 100644 spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SybaseMigrationScriptIntegrationTests.java diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-db2-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-db2-v4.sql new file mode 100644 index 0000000000..705d48be87 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-db2-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for DB2 + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL TIMESTAMP DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + COMMIT_COUNT BIGINT, + READ_COUNT BIGINT, + FILTER_COUNT BIGINT, + WRITE_COUNT BIGINT, + READ_SKIP_COUNT BIGINT, + WRITE_SKIP_COUNT BIGINT, + PROCESS_SKIP_COUNT BIGINT, + ROLLBACK_COUNT BIGINT, + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT CLOB, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT CLOB, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ AS BIGINT MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ AS BIGINT MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ AS BIGINT MAXVALUE 9223372036854775807 NO CYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-derby-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-derby-v4.sql new file mode 100644 index 0000000000..b58e0e7287 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-derby-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for Derby + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL TIMESTAMP DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE PRECISION, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + COMMIT_COUNT BIGINT, + READ_COUNT BIGINT, + FILTER_COUNT BIGINT, + WRITE_COUNT BIGINT, + READ_SKIP_COUNT BIGINT, + WRITE_SKIP_COUNT BIGINT, + PROCESS_SKIP_COUNT BIGINT, + ROLLBACK_COUNT BIGINT, + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT CLOB, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT CLOB, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ AS BIGINT MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ AS BIGINT MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ AS BIGINT MAXVALUE 9223372036854775807 NO CYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-h2-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-h2-v4.sql new file mode 100644 index 0000000000..5232502e94 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-h2-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for H2 + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + VERSION BIGINT, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + VERSION BIGINT, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL TIMESTAMP DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + COMMIT_COUNT BIGINT, + READ_COUNT BIGINT, + FILTER_COUNT BIGINT, + WRITE_COUNT BIGINT, + READ_SKIP_COUNT BIGINT, + WRITE_SKIP_COUNT BIGINT, + PROCESS_SKIP_COUNT BIGINT, + ROLLBACK_COUNT BIGINT, + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_SEQ; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-hsqldb-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-hsqldb-v4.sql new file mode 100644 index 0000000000..a3b82e8d44 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-hsqldb-v4.sql @@ -0,0 +1,86 @@ +-- Spring Batch 4.x schema for HSQLDB + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT IDENTITY NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL TIMESTAMP DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT IDENTITY NOT NULL PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + COMMIT_COUNT BIGINT, + READ_COUNT BIGINT, + FILTER_COUNT BIGINT, + WRITE_COUNT BIGINT, + READ_SKIP_COUNT BIGINT, + WRITE_SKIP_COUNT BIGINT, + PROCESS_SKIP_COUNT BIGINT, + ROLLBACK_COUNT BIGINT, + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_SEQ ( + ID BIGINT IDENTITY +); +CREATE TABLE BATCH_JOB_EXECUTION_SEQ ( + ID BIGINT IDENTITY +); +CREATE TABLE BATCH_JOB_SEQ ( + ID BIGINT IDENTITY +); diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-mysql-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-mysql-v4.sql new file mode 100644 index 0000000000..cf87caef12 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-mysql-v4.sql @@ -0,0 +1,76 @@ +-- Spring Batch 4.x schema for MySQL + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME DATETIME(6) NOT NULL, + START_TIME DATETIME(6) DEFAULT NULL , + END_TIME DATETIME(6) DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME(6), + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + TYPE_CD VARCHAR(6) NOT NULL , + KEY_NAME VARCHAR(100) NOT NULL , + STRING_VAL VARCHAR(250) , + DATE_VAL DATETIME(6) DEFAULT NULL , + LONG_VAL BIGINT , + DOUBLE_VAL DOUBLE PRECISION , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME DATETIME(6) NOT NULL , + END_TIME DATETIME(6) DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME(6), + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ENGINE=InnoDB; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-oracle-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-oracle-v4.sql new file mode 100644 index 0000000000..c39dd195e8 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-oracle-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for Oracle + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + VERSION NUMBER(19,0), + JOB_NAME VARCHAR2(100 char) NOT NULL, + JOB_KEY VARCHAR2(32 char) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) SEGMENT CREATION IMMEDIATE; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + VERSION NUMBER(19,0), + JOB_INSTANCE_ID NUMBER(19,0) NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR2(10 char), + EXIT_CODE VARCHAR2(2500 char), + EXIT_MESSAGE VARCHAR2(2500 char), + LAST_UPDATED TIMESTAMP, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) SEGMENT CREATION IMMEDIATE; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL, + TYPE_CD VARCHAR2(6 char) NOT NULL, + KEY_NAME VARCHAR2(100 char) NOT NULL, + STRING_VAL VARCHAR2(250 char), + DATE_VAL TIMESTAMP DEFAULT NULL, + LONG_VAL NUMBER(19,0), + DOUBLE_VAL NUMBER, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) SEGMENT CREATION IMMEDIATE; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + VERSION NUMBER(19,0) NOT NULL, + STEP_NAME VARCHAR2(100 char) NOT NULL, + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL, + START_TIME TIMESTAMP NOT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR2(10 char), + COMMIT_COUNT NUMBER(19,0), + READ_COUNT NUMBER(19,0), + FILTER_COUNT NUMBER(19,0), + WRITE_COUNT NUMBER(19,0), + READ_SKIP_COUNT NUMBER(19,0), + WRITE_SKIP_COUNT NUMBER(19,0), + PROCESS_SKIP_COUNT NUMBER(19,0), + ROLLBACK_COUNT NUMBER(19,0), + EXIT_CODE VARCHAR2(2500 char), + EXIT_MESSAGE VARCHAR2(2500 char), + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) SEGMENT CREATION IMMEDIATE; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR2(2500 char) NOT NULL, + SERIALIZED_CONTEXT CLOB, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) SEGMENT CREATION IMMEDIATE; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR2(2500 char) NOT NULL, + SERIALIZED_CONTEXT CLOB, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) SEGMENT CREATION IMMEDIATE; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 ORDER NOCYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-postgresql-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-postgresql-v4.sql new file mode 100644 index 0000000000..59492e1611 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-postgresql-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for PostgreSQL + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL TIMESTAMP DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE PRECISION, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME TIMESTAMP NOT NULL, + END_TIME TIMESTAMP DEFAULT NULL, + STATUS VARCHAR(10), + COMMIT_COUNT BIGINT, + READ_COUNT BIGINT, + FILTER_COUNT BIGINT, + WRITE_COUNT BIGINT, + READ_SKIP_COUNT BIGINT, + WRITE_SKIP_COUNT BIGINT, + PROCESS_SKIP_COUNT BIGINT, + ROLLBACK_COUNT BIGINT, + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ MAXVALUE 9223372036854775807 NO CYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlite-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlite-v4.sql new file mode 100644 index 0000000000..095b82f310 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlite-v4.sql @@ -0,0 +1,83 @@ +-- Spring Batch 4.x schema for SQLite + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID INTEGER PRIMARY KEY, + VERSION INTEGER, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +); + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID INTEGER PRIMARY KEY, + VERSION INTEGER, + JOB_INSTANCE_ID INTEGER NOT NULL, + CREATE_TIME DATETIME NOT NULL, + START_TIME DATETIME DEFAULT NULL, + END_TIME DATETIME DEFAULT NULL, + STATUS VARCHAR(10), + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED DATETIME, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +); + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID INTEGER NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL DATETIME DEFAULT NULL, + LONG_VAL INTEGER, + DOUBLE_VAL REAL, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID INTEGER PRIMARY KEY, + VERSION INTEGER NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID INTEGER NOT NULL, + START_TIME DATETIME NOT NULL, + END_TIME DATETIME DEFAULT NULL, + STATUS VARCHAR(10), + COMMIT_COUNT INTEGER, + READ_COUNT INTEGER, + FILTER_COUNT INTEGER, + WRITE_COUNT INTEGER, + READ_SKIP_COUNT INTEGER, + WRITE_SKIP_COUNT INTEGER, + PROCESS_SKIP_COUNT INTEGER, + ROLLBACK_COUNT INTEGER, + EXIT_CODE VARCHAR(2500), + EXIT_MESSAGE VARCHAR(2500), + LAST_UPDATED DATETIME, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID INTEGER NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +); + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID INTEGER NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +); + +CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID INTEGER); +INSERT INTO BATCH_STEP_EXECUTION_SEQ VALUES(0); +CREATE TABLE BATCH_JOB_EXECUTION_SEQ (ID INTEGER); +INSERT INTO BATCH_JOB_EXECUTION_SEQ VALUES(0); +CREATE TABLE BATCH_JOB_SEQ (ID INTEGER); +INSERT INTO BATCH_JOB_SEQ VALUES(0); diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver-v4.sql new file mode 100644 index 0000000000..e9ae3694a3 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sqlserver-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for SQL Server + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NULL, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NULL, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME DATETIME NOT NULL, + START_TIME DATETIME DEFAULT NULL, + END_TIME DATETIME DEFAULT NULL, + STATUS VARCHAR(10) NULL, + EXIT_CODE VARCHAR(2500) NULL, + EXIT_MESSAGE VARCHAR(2500) NULL, + LAST_UPDATED DATETIME NULL, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL DATETIME DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE PRECISION, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME DATETIME NOT NULL, + END_TIME DATETIME DEFAULT NULL, + STATUS VARCHAR(10) NULL, + COMMIT_COUNT BIGINT NULL, + READ_COUNT BIGINT NULL, + FILTER_COUNT BIGINT NULL, + WRITE_COUNT BIGINT NULL, + READ_SKIP_COUNT BIGINT NULL, + WRITE_SKIP_COUNT BIGINT NULL, + PROCESS_SKIP_COUNT BIGINT NULL, + ROLLBACK_COUNT BIGINT NULL, + EXIT_CODE VARCHAR(2500) NULL, + EXIT_MESSAGE VARCHAR(2500) NULL, + LAST_UPDATED DATETIME NULL, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT VARCHAR(MAX) NULL, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT VARCHAR(MAX) NULL, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NO CACHE NO CYCLE; diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sybase-v4.sql b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sybase-v4.sql new file mode 100644 index 0000000000..a74a190c75 --- /dev/null +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-sybase-v4.sql @@ -0,0 +1,80 @@ +-- Spring Batch 4.x schema for Sybase + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NULL, + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NULL, + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME DATETIME NOT NULL, + START_TIME DATETIME DEFAULT NULL NULL, + END_TIME DATETIME DEFAULT NULL NULL, + STATUS VARCHAR(10) NULL, + EXIT_CODE VARCHAR(2500) NULL, + EXIT_MESSAGE VARCHAR(2500) NULL, + LAST_UPDATED DATETIME, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL, + TYPE_CD VARCHAR(6) NOT NULL, + KEY_NAME VARCHAR(100) NOT NULL, + STRING_VAL VARCHAR(250), + DATE_VAL DATETIME DEFAULT NULL, + LONG_VAL BIGINT, + DOUBLE_VAL DOUBLE PRECISION, + IDENTIFYING CHAR(1) NOT NULL, + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME DATETIME NOT NULL, + END_TIME DATETIME DEFAULT NULL NULL, + STATUS VARCHAR(10) NULL, + COMMIT_COUNT BIGINT NULL, + READ_COUNT BIGINT NULL, + FILTER_COUNT BIGINT NULL, + WRITE_COUNT BIGINT NULL, + READ_SKIP_COUNT BIGINT NULL, + WRITE_SKIP_COUNT BIGINT NULL, + PROCESS_SKIP_COUNT BIGINT NULL, + ROLLBACK_COUNT BIGINT NULL, + EXIT_CODE VARCHAR(2500) NULL, + EXIT_MESSAGE VARCHAR(2500) NULL, + LAST_UPDATED DATETIME, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT NULL, + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT NULL, + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT IDENTITY); +CREATE TABLE BATCH_JOB_EXECUTION_SEQ (ID BIGINT IDENTITY); +CREATE TABLE BATCH_JOB_SEQ (ID BIGINT IDENTITY); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DB2MigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DB2MigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..5ffe46d65f --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DB2MigrationScriptIntegrationTests.java @@ -0,0 +1,67 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import com.ibm.db2.jcc.DB2SimpleDataSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.Db2Container; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +/** + * Integration tests for DB2 migration script for v5.0 + * + * @author Jinwoo Bae + */ +@Testcontainers(disabledWithoutDocker = true) +@Disabled("DB2 migration script has MODIFY COLUMN syntax issues - enable when migration script is fixed") +class DB2MigrationScriptIntegrationTests { + + private static final DockerImageName DB2_IMAGE = DockerImageName.parse("icr.io/db2_community/db2:12.1.0.0"); + + @Container + public static Db2Container db2 = new Db2Container(DB2_IMAGE).acceptLicense(); + + @Test + void db2SchemaShouldBeValid() { + DB2SimpleDataSource datasource = createDataSource(); + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + + databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-db2-v4.sql")); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-db2.sql")); + + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + + private DB2SimpleDataSource createDataSource() { + DB2SimpleDataSource dataSource = new DB2SimpleDataSource(); + dataSource.setDatabaseName(db2.getDatabaseName()); + dataSource.setUser(db2.getUsername()); + dataSource.setPassword(db2.getPassword()); + dataSource.setDriverType(4); + dataSource.setServerName(db2.getHost()); + dataSource.setPortNumber(db2.getMappedPort(Db2Container.DB2_PORT)); + dataSource.setSslConnection(false); + return dataSource; + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DerbyMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DerbyMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..c54c41a574 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/DerbyMigrationScriptIntegrationTests.java @@ -0,0 +1,52 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +/** + * Integration tests for Derby migration script for v5.0 + * + * @author Jinwoo Bae + */ +class DerbyMigrationScriptIntegrationTests { + + // Note: This test currently FAILS due to Derby-specific syntax issues in + // migration-derby.sql: + // Derby does not support "MODIFY COLUMN" syntax + @Test + @Disabled + void migrationScriptShouldBeValid() { + EmbeddedDatabase datasource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.DERBY) + .addScript("/org/springframework/batch/core/schema-derby-v4.sql") + .build(); + + ResourceDatabasePopulator schemaPopulator = new ResourceDatabasePopulator(); + schemaPopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-derby.sql")); + + Assertions.assertDoesNotThrow(() -> schemaPopulator.execute(datasource)); + + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/H2MigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/H2MigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..d6f94cc394 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/H2MigrationScriptIntegrationTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +/** + * Integration tests for H2 migration script for v5.0 + * + * @author Jinwoo Bae + */ +class H2MigrationScriptIntegrationTests { + + @Test + void migrationScriptShouldBeValid() { + EmbeddedDatabase datasource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) + .addScript("/org/springframework/batch/core/schema-h2-v4.sql") + .build(); + + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-h2.sql")); + + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/HSQLDBMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/HSQLDBMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..6063aa6856 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/HSQLDBMigrationScriptIntegrationTests.java @@ -0,0 +1,51 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +/** + * Integration tests for HSQLDB migration script for v5.0 + * + * @author Jinwoo Bae + */ +class HSQLDBMigrationScriptIntegrationTests { + + // Note: This test currently FAILS due to HSQLDB-specific syntax issues in + // migration-hsqldb.sql: + // - HSQLDB does not support "MODIFY COLUMN" + @Test + @Disabled + void migrationScriptShouldBeValid() { + EmbeddedDatabase datasource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.HSQL) + .addScript("/org/springframework/batch/core/schema-hsqldb-v4.sql") + .build(); + + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-hsqldb.sql")); + + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/MySQLMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/MySQLMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..0ee6c20be3 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/MySQLMigrationScriptIntegrationTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import com.mysql.cj.jdbc.MysqlDataSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +/** + * Integration tests for Mysql migration script for v5.0 + * + * @author Jinwoo Bae + */ +@Testcontainers(disabledWithoutDocker = true) +class MySQLMigrationScriptIntegrationTests { + + @Container + public static MySQLContainer mysql = new MySQLContainer<>(DockerImageName.parse("mysql:8.0")); + + @Test + void migrationScriptShouldBeValid() { + MysqlDataSource datasource = createDataSource(); + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-mysql-v4.sql")); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-mysql.sql")); + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + + private MysqlDataSource createDataSource() { + MysqlDataSource datasource = new MysqlDataSource(); + datasource.setURL(mysql.getJdbcUrl()); + datasource.setUser(mysql.getUsername()); + datasource.setPassword(mysql.getPassword()); + return datasource; + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/OracleMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/OracleMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..b2b0b1217f --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/OracleMigrationScriptIntegrationTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import oracle.jdbc.pool.OracleDataSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.OracleContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +/** + * Integration tests for Oracle migration script for v5.0 + * + * @author Jinwoo Bae + */ +@Testcontainers(disabledWithoutDocker = true) +class OracleMigrationScriptIntegrationTests { + + @Container + public static OracleContainer oracle = new OracleContainer(DockerImageName.parse("gvenzl/oracle-xe:21-slim")); + + @Test + void migrationScriptShouldBeValid() throws Exception { + OracleDataSource datasource = createDataSource(); + + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-oracle-v4.sql")); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-oracle.sql")); + + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + + private OracleDataSource createDataSource() throws Exception { + OracleDataSource datasource = new OracleDataSource(); + datasource.setURL(oracle.getJdbcUrl()); + datasource.setUser(oracle.getUsername()); + datasource.setPassword(oracle.getPassword()); + return datasource; + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/PostgreSQLMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/PostgreSQLMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..6853cc8b71 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/PostgreSQLMigrationScriptIntegrationTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.postgresql.ds.PGSimpleDataSource; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +/** + * Integration tests for PostgreSQL migration script for v5.0 + * + * @author Jinwoo Bae + */ +@Testcontainers(disabledWithoutDocker = true) +class PostgreSQLMigrationScriptIntegrationTests { + + @Container + public static PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:13.3")); + + @Test + void migrationScriptShouldBeValid() { + PGSimpleDataSource datasource = createDataSource(); + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-postgresql-v4.sql")); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-postgresql.sql")); + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + + private PGSimpleDataSource createDataSource() { + PGSimpleDataSource datasource = new PGSimpleDataSource(); + datasource.setURL(postgres.getJdbcUrl()); + datasource.setUser(postgres.getUsername()); + datasource.setPassword(postgres.getPassword()); + return datasource; + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLServerMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLServerMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..4878ecbf08 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLServerMigrationScriptIntegrationTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import com.microsoft.sqlserver.jdbc.SQLServerDataSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.MSSQLServerContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +/** + * Integration tests for SQLServer migration script for v5.0 + * + * @author Jinwoo Bae + */ +@Testcontainers(disabledWithoutDocker = true) +class SQLServerMigrationScriptIntegrationTests { + + @Container + public static MSSQLServerContainer sqlserver = new MSSQLServerContainer<>( + DockerImageName.parse("mcr.microsoft.com/mssql/server:2019-latest")) + .acceptLicense(); + + @Test + void migrationScriptShouldBeValid() { + SQLServerDataSource datasource = createDataSource(); + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-sqlserver-v4.sql")); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-sqlserver.sql")); + + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + + private SQLServerDataSource createDataSource() { + SQLServerDataSource datasource = new SQLServerDataSource(); + datasource.setURL(sqlserver.getJdbcUrl()); + datasource.setUser(sqlserver.getUsername()); + datasource.setPassword(sqlserver.getPassword()); + return datasource; + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLiteMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLiteMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..c3e05f2449 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SQLiteMigrationScriptIntegrationTests.java @@ -0,0 +1,54 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.sqlite.SQLiteDataSource; + +/** + * Integration tests for PostgreSQL migration script for v5.0 + * + * @author Jinwoo Bae + */ +class SQLiteMigrationScriptIntegrationTests { + + // Note: This test currently FAILS due to SQLite-specific limitations in + // migration-sqlite.sql: + // - SQLite does not support "MODIFY COLUMN" syntax + @Test + @Disabled + void migrationScriptShouldBeValid() { + SQLiteDataSource datasource = createDataSource(); + + ResourceDatabasePopulator schemaPopulator = new ResourceDatabasePopulator(); + schemaPopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-sqlite-v4.sql")); + schemaPopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-sqlite.sql")); + + Assertions.assertDoesNotThrow(() -> schemaPopulator.execute(datasource)); + } + + private SQLiteDataSource createDataSource() { + SQLiteDataSource datasource = new SQLiteDataSource(); + datasource.setUrl("jdbc:sqlite::memory:"); + return datasource; + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SybaseMigrationScriptIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SybaseMigrationScriptIntegrationTests.java new file mode 100644 index 0000000000..cf05c227cd --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/test/repository/SybaseMigrationScriptIntegrationTests.java @@ -0,0 +1,73 @@ +/* + * Copyright 2020-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.test.repository; + +import net.sourceforge.jtds.jdbcx.JtdsDataSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; + +/** + * Integration tests for Sybase migration script for v5.0 + * + * @author Jinwoo Bae + */ +@Testcontainers(disabledWithoutDocker = true) +class SybaseMigrationScriptIntegrationTests { + + @Container + public static GenericContainer sybase = new GenericContainer<>(DockerImageName.parse("datagrip/sybase:16.0")) + .withExposedPorts(5000) + .withEnv("SYBASE_PASSWORD", "myPassword"); + + // Note: This test currently FAILS due to Sybase-specific database configuration + // issues: + // - Sybase requires 'select into' or 'full logging for alter table' options to be + // enabled + // - Error: "Neither the 'select into' nor the 'full logging for alter table' database + // options are enabled for database 'master'. ALTER TABLE with data copy cannot be + // done." + @Test + @Disabled + void migrationScriptShouldBeValid() { + JtdsDataSource datasource = createDataSource(); + ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); + + databasePopulator.addScript(new ClassPathResource("/org/springframework/batch/core/schema-sybase-4.sql")); + databasePopulator + .addScript(new ClassPathResource("/org/springframework/batch/core/migration/5.0/migration-sybase.sql")); + + Assertions.assertDoesNotThrow(() -> databasePopulator.execute(datasource)); + } + + private JtdsDataSource createDataSource() { + JtdsDataSource datasource = new JtdsDataSource(); + datasource.setServerType(2); + datasource.setServerName(sybase.getHost()); + datasource.setPortNumber(sybase.getMappedPort(5000)); + datasource.setDatabaseName("master"); + datasource.setUser("sa"); + datasource.setPassword("myPassword"); + return datasource; + } + +}