Skip to content

Commit fca9868

Browse files
committed
Support TiDB (#3001)
# Conflicts: # core/src/integration-test/java/com/scalar/db/storage/jdbc/ConsensusCommitAdminIntegrationTestWithJdbcDatabase.java # core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminCaseSensitivityIntegrationTest.java # core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminIntegrationTest.java # core/src/integration-test/java/com/scalar/db/storage/jdbc/SingleCrudOperationTransactionAdminIntegrationTestWithJdbcDatabase.java # core/src/integration-test/java/com/scalar/db/transaction/jdbc/JdbcTransactionAdminIntegrationTest.java
1 parent 5e3f7e3 commit fca9868

12 files changed

+915
-8
lines changed

.github/workflows/ci.yaml

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,231 @@ jobs:
18971897
name: alloydb_16_integration_test_reports_${{ matrix.mode.label }}
18981898
path: core/build/reports/tests/integrationTestJdbc
18991899

1900+
integration-test-for-tidb-6-5:
1901+
name: TiDB 6.5 integration test (${{ matrix.mode.label }})
1902+
runs-on: ubuntu-latest
1903+
1904+
strategy:
1905+
fail-fast: false
1906+
matrix:
1907+
mode:
1908+
- label: default
1909+
group_commit_enabled: false
1910+
- label: with_group_commit
1911+
group_commit_enabled: true
1912+
1913+
steps:
1914+
- name: Install TiUP
1915+
run: |
1916+
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
1917+
echo "$HOME/.tiup/bin" >> $GITHUB_PATH
1918+
1919+
- name: Start TiDB with TiUP Playground
1920+
timeout-minutes: 3
1921+
run: |
1922+
tiup playground v6.5 --db 1 --pd 1 --kv 1 --tiflash 0 --without-monitor > tiup.log 2>&1 &
1923+
# Check if TiDB is running
1924+
while true; do
1925+
if mysql -h 127.0.0.1 -P 4000 -u root -e "SELECT 1" > /dev/null 2>&1; then
1926+
echo "TiDB is ready"
1927+
break
1928+
fi
1929+
echo "Waiting for TiDB to be ready..."
1930+
sleep 5
1931+
done
1932+
1933+
- uses: actions/checkout@v5
1934+
1935+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
1936+
uses: actions/setup-java@v5
1937+
with:
1938+
java-version: ${{ env.JAVA_VERSION }}
1939+
distribution: ${{ env.JAVA_VENDOR }}
1940+
1941+
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}) to run integration test
1942+
uses: actions/setup-java@v5
1943+
if: ${{ env.SET_UP_INT_TEST_RUNTIME_NON_ORACLE_JDK == 'true'}}
1944+
with:
1945+
java-version: ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}
1946+
distribution: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}
1947+
1948+
- name: Login to Oracle container registry
1949+
uses: docker/login-action@v3
1950+
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
1951+
with:
1952+
registry: container-registry.oracle.com
1953+
username: ${{ secrets.OCR_USERNAME }}
1954+
password: ${{ secrets.OCR_TOKEN }}
1955+
1956+
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (oracle) to run the integration test
1957+
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
1958+
run: |
1959+
container_id=$(docker create "container-registry.oracle.com/java/jdk:${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}")
1960+
docker cp -L "$container_id:/usr/java/default" /usr/lib/jvm/oracle-jdk && docker rm "$container_id"
1961+
1962+
- name: Setup Gradle
1963+
uses: gradle/actions/setup-gradle@v5
1964+
1965+
- name: Execute Gradle 'integrationTestJdbc' task
1966+
run: ./gradlew integrationTestJdbc -Dscalardb.jdbc.url=jdbc:mysql://localhost:4000 -Dscalardb.jdbc.username=root -Dscalardb.jdbc.password= ${{ matrix.mode.group_commit_enabled && env.INT_TEST_GRADLE_OPTIONS_FOR_GROUP_COMMIT || '' }}
1967+
1968+
- name: Upload Gradle test reports
1969+
if: always()
1970+
uses: actions/upload-artifact@v4
1971+
with:
1972+
name: tidb_6_5_integration_test_reports_${{ matrix.mode.label }}
1973+
path: core/build/reports/tests/integrationTestJdbc
1974+
1975+
integration-test-for-tidb-v7-5:
1976+
name: TiDB 7.5 integration test (${{ matrix.mode.label }})
1977+
runs-on: ubuntu-latest
1978+
1979+
strategy:
1980+
fail-fast: false
1981+
matrix:
1982+
mode:
1983+
- label: default
1984+
group_commit_enabled: false
1985+
- label: with_group_commit
1986+
group_commit_enabled: true
1987+
1988+
steps:
1989+
- name: Install TiUP
1990+
run: |
1991+
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
1992+
echo "$HOME/.tiup/bin" >> $GITHUB_PATH
1993+
1994+
- name: Start TiDB with TiUP Playground
1995+
timeout-minutes: 3
1996+
run: |
1997+
tiup playground v7.5 --db 1 --pd 1 --kv 1 --tiflash 0 --without-monitor > tiup.log 2>&1 &
1998+
# Check if TiDB is running
1999+
while true; do
2000+
if mysql -h 127.0.0.1 -P 4000 -u root -e "SELECT 1" > /dev/null 2>&1; then
2001+
echo "TiDB is ready"
2002+
break
2003+
fi
2004+
echo "Waiting for TiDB to be ready..."
2005+
sleep 5
2006+
done
2007+
2008+
- uses: actions/checkout@v5
2009+
2010+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
2011+
uses: actions/setup-java@v5
2012+
with:
2013+
java-version: ${{ env.JAVA_VERSION }}
2014+
distribution: ${{ env.JAVA_VENDOR }}
2015+
2016+
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}) to run integration test
2017+
uses: actions/setup-java@v5
2018+
if: ${{ env.SET_UP_INT_TEST_RUNTIME_NON_ORACLE_JDK == 'true'}}
2019+
with:
2020+
java-version: ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}
2021+
distribution: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}
2022+
2023+
- name: Login to Oracle container registry
2024+
uses: docker/login-action@v3
2025+
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
2026+
with:
2027+
registry: container-registry.oracle.com
2028+
username: ${{ secrets.OCR_USERNAME }}
2029+
password: ${{ secrets.OCR_TOKEN }}
2030+
2031+
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (oracle) to run the integration test
2032+
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
2033+
run: |
2034+
container_id=$(docker create "container-registry.oracle.com/java/jdk:${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}")
2035+
docker cp -L "$container_id:/usr/java/default" /usr/lib/jvm/oracle-jdk && docker rm "$container_id"
2036+
2037+
- name: Setup Gradle
2038+
uses: gradle/actions/setup-gradle@v5
2039+
2040+
- name: Execute Gradle 'integrationTestJdbc' task
2041+
run: ./gradlew integrationTestJdbc -Dscalardb.jdbc.url=jdbc:mysql://localhost:4000 -Dscalardb.jdbc.username=root -Dscalardb.jdbc.password= ${{ matrix.mode.group_commit_enabled && env.INT_TEST_GRADLE_OPTIONS_FOR_GROUP_COMMIT || '' }}
2042+
2043+
- name: Upload Gradle test reports
2044+
if: always()
2045+
uses: actions/upload-artifact@v4
2046+
with:
2047+
name: tidb_7_5_integration_test_reports_${{ matrix.mode.label }}
2048+
path: core/build/reports/tests/integrationTestJdbc
2049+
2050+
integration-test-for-tidb-v8-5:
2051+
name: TiDB 8.5 integration test (${{ matrix.mode.label }})
2052+
runs-on: ubuntu-latest
2053+
2054+
strategy:
2055+
fail-fast: false
2056+
matrix:
2057+
mode:
2058+
- label: default
2059+
group_commit_enabled: false
2060+
- label: with_group_commit
2061+
group_commit_enabled: true
2062+
2063+
steps:
2064+
- name: Install TiUP
2065+
run: |
2066+
curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
2067+
echo "$HOME/.tiup/bin" >> $GITHUB_PATH
2068+
2069+
- name: Start TiDB with TiUP Playground
2070+
timeout-minutes: 3
2071+
run: |
2072+
tiup playground v8.5 --db 1 --pd 1 --kv 1 --tiflash 0 --without-monitor > tiup.log 2>&1 &
2073+
# Check if TiDB is running
2074+
while true; do
2075+
if mysql -h 127.0.0.1 -P 4000 -u root -e "SELECT 1" > /dev/null 2>&1; then
2076+
echo "TiDB is ready"
2077+
break
2078+
fi
2079+
echo "Waiting for TiDB to be ready..."
2080+
sleep 5
2081+
done
2082+
2083+
- uses: actions/checkout@v5
2084+
2085+
- name: Set up JDK ${{ env.JAVA_VERSION }} (${{ env.JAVA_VENDOR }})
2086+
uses: actions/setup-java@v5
2087+
with:
2088+
java-version: ${{ env.JAVA_VERSION }}
2089+
distribution: ${{ env.JAVA_VENDOR }}
2090+
2091+
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}) to run integration test
2092+
uses: actions/setup-java@v5
2093+
if: ${{ env.SET_UP_INT_TEST_RUNTIME_NON_ORACLE_JDK == 'true'}}
2094+
with:
2095+
java-version: ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}
2096+
distribution: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR }}
2097+
2098+
- name: Login to Oracle container registry
2099+
uses: docker/login-action@v3
2100+
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
2101+
with:
2102+
registry: container-registry.oracle.com
2103+
username: ${{ secrets.OCR_USERNAME }}
2104+
password: ${{ secrets.OCR_TOKEN }}
2105+
2106+
- name: Set up JDK ${{ env.INT_TEST_JAVA_RUNTIME_VERSION }} (oracle) to run the integration test
2107+
if: ${{ env.INT_TEST_JAVA_RUNTIME_VENDOR == 'oracle' }}
2108+
run: |
2109+
container_id=$(docker create "container-registry.oracle.com/java/jdk:${{ env.INT_TEST_JAVA_RUNTIME_VERSION }}")
2110+
docker cp -L "$container_id:/usr/java/default" /usr/lib/jvm/oracle-jdk && docker rm "$container_id"
2111+
2112+
- name: Setup Gradle
2113+
uses: gradle/actions/setup-gradle@v5
2114+
2115+
- name: Execute Gradle 'integrationTestJdbc' task
2116+
run: ./gradlew integrationTestJdbc -Dscalardb.jdbc.url=jdbc:mysql://localhost:4000 -Dscalardb.jdbc.username=root -Dscalardb.jdbc.password= ${{ matrix.mode.group_commit_enabled && env.INT_TEST_GRADLE_OPTIONS_FOR_GROUP_COMMIT || '' }}
2117+
2118+
- name: Upload Gradle test reports
2119+
if: always()
2120+
uses: actions/upload-artifact@v4
2121+
with:
2122+
name: tidb_8_5_integration_test_reports_${{ matrix.mode.label }}
2123+
path: core/build/reports/tests/integrationTestJdbc
2124+
19002125
integration-test-for-multi-storage:
19012126
name: Multi-storage integration test (${{ matrix.mode.label }})
19022127
runs-on: ubuntu-latest

core/src/integration-test/java/com/scalar/db/storage/jdbc/ConsensusCommitAdminIntegrationTestWithJdbcDatabase.java

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ public void createTable_ForNonExistingNamespace_ShouldThrowIllegalArgumentExcept
140140
super.createTable_ForNonExistingNamespace_ShouldThrowIllegalArgumentException();
141141
}
142142

143+
@SuppressWarnings("unused")
144+
private boolean isTidb() {
145+
return JdbcTestUtils.isTidb(rdbEngine);
146+
}
147+
143148
@Override
144149
protected boolean isCreateIndexOnTextColumnEnabled() {
145150
// "admin.createIndex()" for TEXT column fails (the "create index" query runs
@@ -163,7 +168,8 @@ private boolean isDb2() {
163168
private boolean isColumnTypeConversionToTextNotFullySupported() {
164169
return JdbcTestUtils.isDb2(rdbEngine)
165170
|| JdbcTestUtils.isOracle(rdbEngine)
166-
|| JdbcTestUtils.isSqlite(rdbEngine);
171+
|| JdbcTestUtils.isSqlite(rdbEngine)
172+
|| isTidb();
167173
}
168174

169175
@SuppressWarnings("unused")
@@ -387,6 +393,95 @@ public void renameColumn_Db2_ForPrimaryOrIndexKeyColumn_ShouldThrowUnsupportedOp
387393
}
388394
}
389395

396+
@Test
397+
@EnabledIf("isTidb")
398+
public void
399+
alterColumnType_Tidb_AlterColumnTypeFromEachExistingDataTypeToText_ShouldAlterColumnTypesCorrectlyIfSupported()
400+
throws ExecutionException, TransactionException {
401+
try {
402+
// Arrange
403+
Map<String, String> options = getCreationOptions();
404+
TableMetadata.Builder currentTableMetadataBuilder =
405+
TableMetadata.newBuilder()
406+
.addColumn("c1", DataType.INT)
407+
.addColumn("c2", DataType.INT)
408+
.addColumn("c3", DataType.INT)
409+
.addColumn("c4", DataType.BIGINT)
410+
.addColumn("c5", DataType.FLOAT)
411+
.addColumn("c6", DataType.DOUBLE)
412+
.addColumn("c7", DataType.TEXT)
413+
.addColumn("c8", DataType.BLOB)
414+
.addColumn("c9", DataType.DATE)
415+
.addColumn("c10", DataType.TIME)
416+
.addColumn("c11", DataType.TIMESTAMPTZ)
417+
.addColumn("c12", DataType.TIMESTAMP)
418+
.addPartitionKey("c1")
419+
.addClusteringKey("c2", Scan.Ordering.Order.ASC);
420+
TableMetadata currentTableMetadata = currentTableMetadataBuilder.build();
421+
admin.createTable(namespace1, TABLE4, currentTableMetadata, options);
422+
InsertBuilder.Buildable insert =
423+
Insert.newBuilder()
424+
.namespace(namespace1)
425+
.table(TABLE4)
426+
.partitionKey(Key.ofInt("c1", 1))
427+
.clusteringKey(Key.ofInt("c2", 2))
428+
.intValue("c3", 1)
429+
.bigIntValue("c4", 2L)
430+
.floatValue("c5", 3.0f)
431+
.doubleValue("c6", 4.0d)
432+
.textValue("c7", "5")
433+
.blobValue("c8", "6".getBytes(StandardCharsets.UTF_8))
434+
.dateValue("c9", LocalDate.now(ZoneId.of("UTC")))
435+
.timeValue("c10", LocalTime.now(ZoneId.of("UTC")))
436+
.timestampTZValue("c11", Instant.now())
437+
.timestampValue("c12", LocalDateTime.now(ZoneOffset.UTC));
438+
transactionalInsert(insert.build());
439+
440+
// Act Assert
441+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c3", DataType.TEXT))
442+
.doesNotThrowAnyException();
443+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c4", DataType.TEXT))
444+
.doesNotThrowAnyException();
445+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c5", DataType.TEXT))
446+
.doesNotThrowAnyException();
447+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c6", DataType.TEXT))
448+
.doesNotThrowAnyException();
449+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c7", DataType.TEXT))
450+
.doesNotThrowAnyException();
451+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c8", DataType.TEXT))
452+
.isInstanceOf(UnsupportedOperationException.class);
453+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c9", DataType.TEXT))
454+
.doesNotThrowAnyException();
455+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c10", DataType.TEXT))
456+
.doesNotThrowAnyException();
457+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c11", DataType.TEXT))
458+
.doesNotThrowAnyException();
459+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c12", DataType.TEXT))
460+
.doesNotThrowAnyException();
461+
462+
TableMetadata expectedTableMetadata =
463+
TableMetadata.newBuilder()
464+
.addColumn("c1", DataType.INT)
465+
.addColumn("c2", DataType.INT)
466+
.addColumn("c3", DataType.TEXT)
467+
.addColumn("c4", DataType.TEXT)
468+
.addColumn("c5", DataType.TEXT)
469+
.addColumn("c6", DataType.TEXT)
470+
.addColumn("c7", DataType.TEXT)
471+
.addColumn("c8", DataType.BLOB)
472+
.addColumn("c9", DataType.TEXT)
473+
.addColumn("c10", DataType.TEXT)
474+
.addColumn("c11", DataType.TEXT)
475+
.addColumn("c12", DataType.TEXT)
476+
.addPartitionKey("c1")
477+
.addClusteringKey("c2", Scan.Ordering.Order.ASC)
478+
.build();
479+
assertThat(admin.getTableMetadata(namespace1, TABLE4)).isEqualTo(expectedTableMetadata);
480+
} finally {
481+
admin.dropTable(namespace1, TABLE4, true);
482+
}
483+
}
484+
390485
@Test
391486
@Override
392487
@DisabledIf("isWideningColumnTypeConversionNotFullySupported")

0 commit comments

Comments
 (0)