Skip to content

Commit 367eb2e

Browse files
authored
Support TiDB (#3001)
1 parent 03a1c76 commit 367eb2e

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
@@ -73,11 +73,17 @@ private boolean isSqlite() {
7373
return JdbcEnv.isSqlite();
7474
}
7575

76+
@SuppressWarnings("unused")
77+
private boolean isTidb() {
78+
return JdbcTestUtils.isTidb(rdbEngine);
79+
}
80+
7681
@SuppressWarnings("unused")
7782
private boolean isColumnTypeConversionToTextNotFullySupported() {
7883
return JdbcTestUtils.isDb2(rdbEngine)
7984
|| JdbcTestUtils.isOracle(rdbEngine)
80-
|| JdbcTestUtils.isSqlite(rdbEngine);
85+
|| JdbcTestUtils.isSqlite(rdbEngine)
86+
|| isTidb();
8187
}
8288

8389
@SuppressWarnings("unused")
@@ -301,6 +307,95 @@ public void renameColumn_Db2_ForPrimaryOrIndexKeyColumn_ShouldThrowUnsupportedOp
301307
}
302308
}
303309

310+
@Test
311+
@EnabledIf("isTidb")
312+
public void
313+
alterColumnType_Tidb_AlterColumnTypeFromEachExistingDataTypeToText_ShouldAlterColumnTypesCorrectlyIfSupported()
314+
throws ExecutionException, TransactionException {
315+
try {
316+
// Arrange
317+
Map<String, String> options = getCreationOptions();
318+
TableMetadata.Builder currentTableMetadataBuilder =
319+
TableMetadata.newBuilder()
320+
.addColumn("c1", DataType.INT)
321+
.addColumn("c2", DataType.INT)
322+
.addColumn("c3", DataType.INT)
323+
.addColumn("c4", DataType.BIGINT)
324+
.addColumn("c5", DataType.FLOAT)
325+
.addColumn("c6", DataType.DOUBLE)
326+
.addColumn("c7", DataType.TEXT)
327+
.addColumn("c8", DataType.BLOB)
328+
.addColumn("c9", DataType.DATE)
329+
.addColumn("c10", DataType.TIME)
330+
.addColumn("c11", DataType.TIMESTAMPTZ)
331+
.addColumn("c12", DataType.TIMESTAMP)
332+
.addPartitionKey("c1")
333+
.addClusteringKey("c2", Scan.Ordering.Order.ASC);
334+
TableMetadata currentTableMetadata = currentTableMetadataBuilder.build();
335+
admin.createTable(namespace1, TABLE4, currentTableMetadata, options);
336+
InsertBuilder.Buildable insert =
337+
Insert.newBuilder()
338+
.namespace(namespace1)
339+
.table(TABLE4)
340+
.partitionKey(Key.ofInt("c1", 1))
341+
.clusteringKey(Key.ofInt("c2", 2))
342+
.intValue("c3", 1)
343+
.bigIntValue("c4", 2L)
344+
.floatValue("c5", 3.0f)
345+
.doubleValue("c6", 4.0d)
346+
.textValue("c7", "5")
347+
.blobValue("c8", "6".getBytes(StandardCharsets.UTF_8))
348+
.dateValue("c9", LocalDate.now(ZoneId.of("UTC")))
349+
.timeValue("c10", LocalTime.now(ZoneId.of("UTC")))
350+
.timestampTZValue("c11", Instant.now())
351+
.timestampValue("c12", LocalDateTime.now(ZoneOffset.UTC));
352+
transactionalInsert(insert.build());
353+
354+
// Act Assert
355+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c3", DataType.TEXT))
356+
.doesNotThrowAnyException();
357+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c4", DataType.TEXT))
358+
.doesNotThrowAnyException();
359+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c5", DataType.TEXT))
360+
.doesNotThrowAnyException();
361+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c6", DataType.TEXT))
362+
.doesNotThrowAnyException();
363+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c7", DataType.TEXT))
364+
.doesNotThrowAnyException();
365+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c8", DataType.TEXT))
366+
.isInstanceOf(UnsupportedOperationException.class);
367+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c9", DataType.TEXT))
368+
.doesNotThrowAnyException();
369+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c10", DataType.TEXT))
370+
.doesNotThrowAnyException();
371+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c11", DataType.TEXT))
372+
.doesNotThrowAnyException();
373+
assertThatCode(() -> admin.alterColumnType(namespace1, TABLE4, "c12", DataType.TEXT))
374+
.doesNotThrowAnyException();
375+
376+
TableMetadata expectedTableMetadata =
377+
TableMetadata.newBuilder()
378+
.addColumn("c1", DataType.INT)
379+
.addColumn("c2", DataType.INT)
380+
.addColumn("c3", DataType.TEXT)
381+
.addColumn("c4", DataType.TEXT)
382+
.addColumn("c5", DataType.TEXT)
383+
.addColumn("c6", DataType.TEXT)
384+
.addColumn("c7", DataType.TEXT)
385+
.addColumn("c8", DataType.BLOB)
386+
.addColumn("c9", DataType.TEXT)
387+
.addColumn("c10", DataType.TEXT)
388+
.addColumn("c11", DataType.TEXT)
389+
.addColumn("c12", DataType.TEXT)
390+
.addPartitionKey("c1")
391+
.addClusteringKey("c2", Scan.Ordering.Order.ASC)
392+
.build();
393+
assertThat(admin.getTableMetadata(namespace1, TABLE4)).isEqualTo(expectedTableMetadata);
394+
} finally {
395+
admin.dropTable(namespace1, TABLE4, true);
396+
}
397+
}
398+
304399
@Test
305400
@Override
306401
@DisabledIf("isWideningColumnTypeConversionNotFullySupported")

0 commit comments

Comments
 (0)