diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml
index 3a414ead7610bc..391149379d6626 100644
--- a/.github/workflows/nightly-build.yml
+++ b/.github/workflows/nightly-build.yml
@@ -136,7 +136,6 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push Docker Image
run: |
- ./mvnw -PgenerateStandardMetadata -DskipNativeTests -B -T1C clean test
./mvnw -am -pl distribution/proxy-native -Prelease.native,docker.buildx.push.native -B -T1C -DskipTests -Dproxy.image.repository=${{ env.PROXY_NATIVE }} -Dproxy.image.tag=${{ github.sha }} clean package
build-cache:
diff --git a/distribution/proxy-native/access-filter.json b/distribution/proxy-native/access-filter.json
deleted file mode 100644
index a5c58ae341dcda..00000000000000
--- a/distribution/proxy-native/access-filter.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "rules": [
- {"includeClasses": "**"},
- {"excludeClasses": "com.atomikos.jdbc.**"},
- {"excludeClasses": "com.mchange.v2.c3p0.**"},
- {"excludeClasses": "com.mysql.jdbc.**"},
- {"excludeClasses": "com.zaxxer.hikari.**"},
- {"excludeClasses": "org.apache.commons.dbcp2.**"},
- {"excludeClasses": "org.junit.platform.launcher.**"},
- {"excludeClasses": "org.mariadb.jdbc.**"},
- {"excludeClasses": "org.apache.shardingsphere.sharding.UndefinedClass"}
- ],
- "regexRules": [
- {"excludeClasses": ".*Fixture*.*"},
- {"excludeClasses": ".*Mocked*.*"}
- ]
-}
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
index 4afb9ffa1c376b..f769afac492c7c 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.cn.md
@@ -25,10 +25,6 @@ services:
- "3307:3307"
```
-- 若你发现构建过程存在缺失的 GraalVM Reachability Metadata,
- 应当在 https://github.com/oracle/graalvm-reachability-metadata 打开新的 issue ,
- 并提交包含 ShardingSphere 自身或依赖的第三方库缺失的 GraalVM Reachability Metadata 的 PR。
-
- ShardingSphere 的 master 分支尚未准备好处理 Native Image 中的单元测试 , 你总是需要在构建 GraalVM Native Image 的过程中,
加上特定于 `GraalVM Native Build Tools` 的 `-DskipNativeTests` 或 `-DskipTests` 参数跳过 Native Image 中的单元测试。
@@ -54,19 +50,13 @@ services:
或 `GraalVM Community Edition` 的下游发行版。若使用 `SDKMAN!`,
```shell
-sdk install java 17.0.8-graalce
+sdk install java 17.0.9-graalce
```
2. 根据 https://www.graalvm.org/jdk17/reference-manual/native-image/#prerequisites 的要求安装本地工具链。
3. 如果需要构建 Docker Image, 确保 `docker-ce` 已安装。
-4. 首先需要在项目的根目录下,执行如下命令以为所有子模块采集 Standard 形态的 GraalVM 可达性元数据。
-
-```shell
-./mvnw -PgenerateStandardMetadata -DskipNativeTests -B -T1C clean test
-```
-
## 操作步骤
1. 获取 Apache ShardingSphere Git Source
@@ -148,7 +138,7 @@ services:
另请注意,某些第三方依赖将需要在 `Dockerfile` 安装更多系统库,例如 `libdl`。
因此请确保根据你的使用情况调整 `distribution/proxy-native` 下的 `pom.xml` 和 `Dockerfile` 的内容。
-# 可观察性
+## 可观察性
- 针对 GraalVM Native Image 形态的 ShardingSphere Proxy,其提供的可观察性的能力与
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/observability/ 并不一致。
@@ -160,7 +150,7 @@ services:
https://github.com/oracle/graal/issues/5648 。
- 对于使用 `ShardingSphere Agent` 等 APM Java Agent 的情形, GraalVM 的 `native-image` 组件尚未完全支持在构建 Native
- Image 时使用 javaagent,你需要关注尚未关闭的 https://github.com/oracle/graal/issues/1065。
+ Image 时使用 javaagent,你需要关注尚未关闭的 https://github.com/oracle/graal/issues/1065 。
- 以下部分采用 `Apache SkyWalking Java Agent` 作为示例,可用于跟踪 GraalVM 社区的对应 issue。
@@ -184,3 +174,58 @@ services:
```bash
./mvnw -am -pl distribution/proxy-native -B -T1C -Prelease.native -DskipTests clean package
```
+
+## 贡献 GraalVM Reachability Metadata
+
+ShardingSphere 对在 GraalVM Native Image 下的可用性的验证,是通过 GraalVM Native Build Tools 的 Maven Plugin 子项目来完成的。
+通过在 JVM 下运行单元测试,为单元测试打上 `junit-platform-unique-ids*` 标签,此后构建为 GraalVM Native Image 进行 nativeTest 来测试
+在 GraalVM Native Image 下的单元测试覆盖率。请不要使用 `io.kotest:kotest-runner-junit5-jvm:5.5.4` 等在 `test listener` mode 下
+failed to discover tests 的测试库。
+
+ShardingSphere 定义了 `shardingsphere-infra-nativetest` 的 Maven Module 用于为 native Test 提供小型的单元测试子集,
+此单元测试子集避免了使用 Mockito 等 native Test 下无法使用的第三方库。
+
+ShardingSphere 定义了 `nativeTestInShardingSphere` 的 Maven Profile 用于为 `shardingsphere-infra-nativetest` 模块执行 nativeTest 。
+
+假设贡献者处于新的 Ubuntu 22.04.3 LTS 实例下,其可通过如下 bash 命令通过 SDKMAN! 管理 JDK 和工具链,
+并为 `shardingsphere-infra-nativetest` 子模块执行 nativeTest。
+
+```bash
+sudo apt install unzip zip curl sed -y
+curl -s "https://get.sdkman.io" | bash
+source "$HOME/.sdkman/bin/sdkman-init.sh"
+sdk install java 17.0.9-graalce
+sdk use java 17.0.9-graalce
+sudo apt-get install build-essential libz-dev zlib1g-dev -y
+
+git clone git@github.com:apache/shardingsphere.git
+cd ./shardingsphere/
+./mvnw -PnativeTestInShardingSphere -T1C -e clean test
+```
+
+当贡献者发现缺少与 ShardingSphere 无关的第三方库的 GraalVM Reachability Metadata 时,应当在
+https://github.com/oracle/graalvm-reachability-metadata 打开新的 issue, 并提交包含依赖的第三方库缺失的 GraalVM Reachability
+Metadata 的 PR。ShardingSphere 在 `shardingsphere-infra-reachability-metadata` 子模块主动托管了部分第三方库的 GraalVM Reachability Metadata。
+
+如果 nativeTest 执行失败, 应为单元测试生成初步的 GraalVM Reachability Metadata,并手动调整以修复 nativeTest。
+如有需要,请使用 `org.junit.jupiter.api.condition.DisabledInNativeImage` 注解或 `org.graalvm.nativeimage.imagecode` 的
+System Property 屏蔽部分单元测试在 GraalVM Native Image 下运行。
+
+ShardingSphere 定义了 `generateMetadata` 的 Maven Profile 用于在普通 JVM 下携带 GraalVM Tracing Agent 执行单元测试,并在特定目录下生成或合并
+已有的 GraalVM Reachability Metadata 文件。可通过如下 bash 命令简单处理此流程。贡献者仍可能需要手动调整具体的 JSON 条目,并在适当的时候
+调整 Maven Profile 和 GraalVM Tracing Agent 的 Filter 链。
+
+以下命令仅为 `shardingsphere-infra-nativetest` 生成 Conditional 形态的 GraalVM Reachability Metadata 的一个举例。生成的 GraalVM
+Reachability Metadata 位于 `shardingsphere-infra-reachability-metadata` 子模块下。
+
+对于测试类和测试文件独立使用的 GraalVM Reachability Metadata,贡献者应该放置到
+`${user.dir}/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-metadata/`
+文件夹下。`${}` 内为相关子模块对应的 POM 4.0 的常规系统变量,自行替换。
+
+```bash
+git clone git@github.com:apache/shardingsphere.git
+cd ./shardingsphere/
+./mvnw -PgenerateMetadata -DskipNativeTests -e -T1C clean test native:metadata-copy
+```
+
+请手动删除无任何具体条目的 JSON 文件。
diff --git a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
index 638177fff99c94..91f4ca8c672175 100644
--- a/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
+++ b/docs/document/content/user-manual/shardingsphere-proxy/startup/graalvm-native-image.en.md
@@ -27,10 +27,6 @@ services:
- "3307:3307"
````
-- If you find that the build process has missing GraalVM Reachability Metadata, a new issue should be opened
- at https://github.com/oracle/graalvm-reachability-metadata, and submit a PR containing GraalVM Reachability Metadata
- missing from ShardingSphere itself or dependent third-party libraries.
-
- The master branch of ShardingSphere is not yet ready to handle unit tests in Native Image,
you always need to build GraalVM Native Image in the process,
Plus `-DskipNativeTests` or `-DskipTests` parameter specific to `GraalVM Native Build Tools` to skip unit tests in
@@ -62,20 +58,13 @@ services:
JDK 17 according to https://www.graalvm.org/downloads/. If `SDKMAN!` is used,
```shell
-sdk install java 17.0.8-graalce
+sdk install java 17.0.9-graalce
```
2. Install the local toolchain as required by https://www.graalvm.org/jdk17/reference-manual/native-image/#prerequisites.
3. If you need to build a Docker Image, make sure `docker-ce` is installed.
-4. First, you need to execute the following command in the root directory of the project to collect the GraalVM
- Reachability Metadata of the Standard form for all submodules.
-
-```shell
-./mvnw -PgenerateStandardMetadata -DskipNativeTests -B -T1C clean test
-```
-
## Steps
1. Get Apache ShardingSphere Git Source
@@ -163,7 +152,7 @@ services:
the `Dockerfile`. So make sure to tune `distribution/proxy-native` according to your usage `pom.xml` and `Dockerfile`
below.
-# Observability
+## Observability
- ShardingSphere for GraalVM Native Image form Proxy, which provides observability capabilities
with https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/observability/
diff --git a/infra/nativetest/native-image-filter/extra-filter.json b/infra/nativetest/native-image-filter/extra-filter.json
new file mode 100644
index 00000000000000..0781beee690316
--- /dev/null
+++ b/infra/nativetest/native-image-filter/extra-filter.json
@@ -0,0 +1,31 @@
+{
+ "rules": [
+ {"includeClasses": "**"},
+
+ {"excludeClasses": "com.sun.crypto.provider.**"},
+ {"excludeClasses": "com.sun.org.apache.xerces.internal.jaxp.**"},
+ {"excludeClasses": "java.**"},
+ {"includeClasses": "java.lang.Boolean"},
+ {"includeClasses": "java.lang.Thread"},
+ {"includeClasses": "java.util.Properties"},
+ {"excludeClasses": "javax.security.auth.x500.**"},
+ {"excludeClasses": "sun.misc.**"},
+ {"excludeClasses": "sun.security.**"},
+
+ {"excludeClasses": "com.github.benmanes.caffeine.cache.**"},
+ {"excludeClasses": "com.google.common.util.concurrent.**"},
+ {"excludeClasses": "com.sun.xml.bind.v2.**"},
+ {"excludeClasses": "com.zaxxer.hikari.**"},
+ {"excludeClasses": "javax.xml.bind.annotation.**"},
+ {"excludeClasses": "groovy.**"},
+ {"excludeClasses": "org.apache.calcite.**"},
+ {"excludeClasses": "org.codehaus.groovy.**"},
+ {"excludeClasses": "org.h2.**"},
+ {"excludeClasses": "org.locationtech.jts.geom.**"},
+ {"excludeClasses": "org.slf4j.event.**"},
+
+ {"excludeClasses": "org.apache.shardingsphere.infra.nativetest.**"}
+ ],
+ "regexRules": [
+ ]
+}
diff --git a/distribution/proxy-native/caller-filter.json b/infra/nativetest/native-image-filter/user-code-filter.json
similarity index 100%
rename from distribution/proxy-native/caller-filter.json
rename to infra/nativetest/native-image-filter/user-code-filter.json
diff --git a/infra/nativetest/pom.xml b/infra/nativetest/pom.xml
new file mode 100644
index 00000000000000..5fb8d91c8be180
--- /dev/null
+++ b/infra/nativetest/pom.xml
@@ -0,0 +1,67 @@
+
+
+
+
+ 4.0.0
+
+ org.apache.shardingsphere
+ shardingsphere-infra
+ 5.4.2-SNAPSHOT
+
+ shardingsphere-infra-nativetest
+ ${project.artifactId}
+
+
+ true
+
+
+
+
+ org.apache.shardingsphere
+ shardingsphere-jdbc-core
+ ${project.version}
+ test
+
+
+
+ org.hamcrest
+ hamcrest
+ test
+
+
+ com.zaxxer
+ HikariCP
+ test
+
+
+ com.h2database
+ h2
+ test
+
+
+
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${native-maven-plugin.version}
+
+
+
+
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/FileTestUtils.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/FileTestUtils.java
new file mode 100644
index 00000000000000..30768fb598a657
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/FileTestUtils.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * The background for this class comes from oracle/graal#7682
+ * and Accessing Resources in Native Image.
+ * GraalVM Native Image has special features in its handling of file systems.
+ * This means we are better off reading the file via `java.io.InputStream` instead of `java.net.URL` to avoid extra code
+ * processing.
+ *
+ * @see java.net.URL
+ * @see InputStream
+ */
+public class FileTestUtils {
+
+ /**
+ * read file From file URL string.
+ * @param fileUrl fileUrl
+ * @return byte array
+ */
+ public static byte[] readFromFileURLString(final String fileUrl) {
+ return readInputStream(ClassLoader.getSystemResourceAsStream(fileUrl)).getBytes(StandardCharsets.UTF_8);
+ }
+
+ private static String readInputStream(final InputStream is) {
+ StringBuilder out = new StringBuilder();
+ try (
+ InputStreamReader streamReader = new InputStreamReader(is, StandardCharsets.UTF_8);
+ BufferedReader reader = new BufferedReader(streamReader)) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ out.append(line);
+ // ShardingSphere does not actively handle line separators when parsing YAML and needs to be actively added.
+ out.append(System.lineSeparator());
+ }
+ } catch (IOException e) {
+ Logger.getLogger(FileTestUtils.class.getName()).log(Level.SEVERE, null, e);
+ }
+ return out.toString();
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/EncryptTest.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/EncryptTest.java
new file mode 100644
index 00000000000000..4fd0146d782453
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/EncryptTest.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features;
+
+import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
+import org.apache.shardingsphere.infra.nativetest.FileTestUtils;
+
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Address;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Order;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.OrderItem;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.AddressRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderItemRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderRepository;
+import org.junit.jupiter.api.Test;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public final class EncryptTest {
+
+ private OrderRepository orderRepository;
+
+ private OrderItemRepository orderItemRepository;
+
+ private AddressRepository addressRepository;
+
+ @Test
+ void testEncryptInLocalTransactions() throws SQLException, IOException {
+ DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("yaml/encrypt.yaml"));
+ orderRepository = new OrderRepository(dataSource);
+ orderItemRepository = new OrderItemRepository(dataSource);
+ addressRepository = new AddressRepository(dataSource);
+ this.initEnvironment();
+ this.processSuccess();
+ this.cleanEnvironment();
+ }
+
+ private void initEnvironment() throws SQLException {
+ orderRepository.createTableIfNotExists();
+ orderItemRepository.createTableIfNotExists();
+ addressRepository.createTableIfNotExists();
+ orderRepository.truncateTable();
+ orderItemRepository.truncateTable();
+ addressRepository.truncateTable();
+ }
+
+ private void processSuccess() throws SQLException {
+ final List orderIds = insertData();
+ assertThat(orderRepository.selectAll(),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> new Order(i, i % 2, i, i, "INSERT_TEST")).collect(Collectors.toList())));
+ assertThat(orderItemRepository.selectAll(),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> new OrderItem(i, i, i, "13800000001", "INSERT_TEST")).collect(Collectors.toList())));
+ assertThat(addressRepository.selectAll(),
+ equalTo(LongStream.range(1, 11).mapToObj(i -> new Address(i, "address_test_" + i)).collect(Collectors.toList())));
+ deleteData(orderIds);
+ assertThat(orderRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(orderItemRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(addressRepository.selectAll(), equalTo(new ArrayList<>()));
+ }
+
+ private List insertData() throws SQLException {
+ List result = new ArrayList<>(10);
+ for (int i = 1; i <= 10; i++) {
+ Order order = new Order();
+ order.setUserId(i);
+ order.setOrderType(i % 2);
+ order.setAddressId(i);
+ order.setStatus("INSERT_TEST");
+ orderRepository.insert(order);
+
+ OrderItem orderItem = new OrderItem();
+ orderItem.setOrderId(order.getOrderId());
+ orderItem.setUserId(i);
+ orderItem.setPhone("13800000001");
+ orderItem.setStatus("INSERT_TEST");
+ orderItemRepository.insert(orderItem);
+
+ Address address = new Address((long) i, "address_test_" + i);
+ addressRepository.insert(address);
+ result.add(order.getOrderId());
+ }
+ return result;
+ }
+
+ private void deleteData(final List orderIds) throws SQLException {
+ long count = 1;
+ for (Long each : orderIds) {
+ orderRepository.delete(each);
+ orderItemRepository.delete(each);
+ addressRepository.delete(count++);
+ }
+ }
+
+ private void cleanEnvironment() throws SQLException {
+ orderRepository.dropTable();
+ orderItemRepository.dropTable();
+ addressRepository.dropTable();
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/MaskTest.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/MaskTest.java
new file mode 100644
index 00000000000000..18b11bf6af87d4
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/MaskTest.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features;
+
+import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
+import org.apache.shardingsphere.infra.nativetest.FileTestUtils;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Address;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Order;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.OrderItem;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.AddressRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderItemRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderRepository;
+import org.junit.jupiter.api.Test;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public final class MaskTest {
+
+ private OrderRepository orderRepository;
+
+ private OrderItemRepository orderItemRepository;
+
+ private AddressRepository addressRepository;
+
+ @Test
+ void testMaskInLocalTransactions() throws SQLException, IOException {
+ DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("yaml/mask.yaml"));
+ orderRepository = new OrderRepository(dataSource);
+ orderItemRepository = new OrderItemRepository(dataSource);
+ addressRepository = new AddressRepository(dataSource);
+ this.initEnvironment();
+ this.processSuccess();
+ this.cleanEnvironment();
+ }
+
+ private void initEnvironment() throws SQLException {
+ orderRepository.createTableIfNotExists();
+ orderItemRepository.createTableIfNotExists();
+ addressRepository.createTableIfNotExists();
+ orderRepository.truncateTable();
+ orderItemRepository.truncateTable();
+ addressRepository.truncateTable();
+ }
+
+ private void processSuccess() throws SQLException {
+ final List orderIds = insertData();
+ assertThat(orderRepository.selectAll(),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> new Order(i, i % 2, i, i, "INSERT_TEST")).collect(Collectors.toList())));
+ assertThat(orderItemRepository.selectAll(),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> new OrderItem(i, i, i, "138****0001", "INSERT_TEST")).collect(Collectors.toList())));
+ assertThat(addressRepository.selectAll(),
+ equalTo(LongStream.range(1, 11).mapToObj(i -> new Address(i, "address_test_" + i)).collect(Collectors.toList())));
+ deleteData(orderIds);
+ assertThat(orderRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(orderItemRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(addressRepository.selectAll(), equalTo(new ArrayList<>()));
+ }
+
+ private List insertData() throws SQLException {
+ List result = new ArrayList<>(10);
+ for (int i = 1; i <= 10; i++) {
+ Order order = new Order();
+ order.setUserId(i);
+ order.setOrderType(i % 2);
+ order.setAddressId(i);
+ order.setStatus("INSERT_TEST");
+ orderRepository.insert(order);
+
+ OrderItem orderItem = new OrderItem();
+ orderItem.setOrderId(order.getOrderId());
+ orderItem.setUserId(i);
+ orderItem.setPhone("13800000001");
+ orderItem.setStatus("INSERT_TEST");
+ orderItemRepository.insert(orderItem);
+
+ Address address = new Address((long) i, "address_test_" + i);
+ addressRepository.insert(address);
+
+ result.add(order.getOrderId());
+ }
+ return result;
+ }
+
+ private void deleteData(final List orderIds) throws SQLException {
+ long count = 1;
+ for (Long each : orderIds) {
+ orderRepository.delete(each);
+ orderItemRepository.delete(each);
+ addressRepository.delete(count++);
+ }
+ }
+
+ private void cleanEnvironment() throws SQLException {
+ orderRepository.dropTable();
+ orderItemRepository.dropTable();
+ addressRepository.dropTable();
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ReadWriteSplittingTest.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ReadWriteSplittingTest.java
new file mode 100644
index 00000000000000..9d6e1311e4fe35
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ReadWriteSplittingTest.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features;
+
+import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
+import org.apache.shardingsphere.infra.nativetest.FileTestUtils;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Address;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Order;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.OrderItem;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.AddressRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderItemRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderRepository;
+import org.h2.jdbc.JdbcSQLSyntaxErrorException;
+import org.junit.jupiter.api.Test;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public final class ReadWriteSplittingTest {
+
+ private OrderRepository orderRepository;
+
+ private OrderItemRepository orderItemRepository;
+
+ private AddressRepository addressRepository;
+
+ @Test
+ void testReadWriteSplittingInLocalTransactions() throws SQLException, IOException {
+ DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("yaml/readwrite-splitting.yaml"));
+ orderRepository = new OrderRepository(dataSource);
+ orderItemRepository = new OrderItemRepository(dataSource);
+ addressRepository = new AddressRepository(dataSource);
+ this.initEnvironment();
+ this.processSuccess();
+ this.cleanEnvironment();
+ }
+
+ private void initEnvironment() throws SQLException {
+ orderRepository.createTableIfNotExists();
+ orderItemRepository.createTableIfNotExists();
+ addressRepository.createTableIfNotExists();
+ orderRepository.truncateTable();
+ orderItemRepository.truncateTable();
+ addressRepository.truncateTable();
+ }
+
+ private void processSuccess() throws SQLException {
+ List orderIds = insertData();
+ // This is intentional because the read operation is in the slave database and the corresponding table does not exist.
+ assertThrows(JdbcSQLSyntaxErrorException.class, this::printData);
+ deleteData(orderIds);
+ // This is intentional because the read operation is in the slave database and the corresponding table does not exist.
+ assertThrows(JdbcSQLSyntaxErrorException.class, this::printData);
+ }
+
+ private List insertData() throws SQLException {
+ List result = new ArrayList<>(10);
+ for (int i = 1; i <= 10; i++) {
+ Order order = new Order();
+ order.setUserId(i);
+ order.setOrderType(i % 2);
+ order.setAddressId(i);
+ order.setStatus("INSERT_TEST");
+ orderRepository.insert(order);
+
+ OrderItem orderItem = new OrderItem();
+ orderItem.setOrderId(order.getOrderId());
+ orderItem.setUserId(i);
+ orderItem.setPhone("13800000001");
+ orderItem.setStatus("INSERT_TEST");
+ orderItemRepository.insert(orderItem);
+
+ Address address = new Address((long) i, "address_test_" + i);
+ addressRepository.insert(address);
+
+ result.add(order.getOrderId());
+ }
+ return result;
+ }
+
+ private void deleteData(final List orderIds) throws SQLException {
+ long count = 1;
+ for (Long each : orderIds) {
+ orderRepository.delete(each);
+ orderItemRepository.delete(each);
+ addressRepository.delete(count++);
+ }
+ }
+
+ private void printData() throws SQLException {
+ orderRepository.selectAll();
+ orderItemRepository.selectAll();
+ addressRepository.selectAll();
+ }
+
+ private void cleanEnvironment() throws SQLException {
+ orderRepository.dropTable();
+ orderItemRepository.dropTable();
+ addressRepository.dropTable();
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ShadowTest.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ShadowTest.java
new file mode 100644
index 00000000000000..34eef534fee1df
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ShadowTest.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features;
+
+import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
+import org.apache.shardingsphere.infra.nativetest.FileTestUtils;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Address;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Order;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.OrderItem;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.AddressRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderItemRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderRepository;
+import org.junit.jupiter.api.Test;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.LongStream;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public final class ShadowTest {
+
+ private OrderRepository orderRepository;
+
+ private OrderItemRepository orderItemRepository;
+
+ private AddressRepository addressRepository;
+
+ @Test
+ void testShadowInLocalTransactions() throws SQLException, IOException {
+ DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("yaml/shadow.yaml"));
+ orderRepository = new OrderRepository(dataSource);
+ orderItemRepository = new OrderItemRepository(dataSource);
+ addressRepository = new AddressRepository(dataSource);
+ this.initEnvironment();
+ this.processSuccess();
+ this.cleanEnvironment();
+ }
+
+ private void initEnvironment() throws SQLException {
+ orderRepository.createTableIfNotExists();
+ orderItemRepository.createTableIfNotExists();
+ addressRepository.createTableIfNotExists();
+ orderRepository.truncateTable();
+ orderItemRepository.truncateTable();
+ addressRepository.truncateTable();
+ orderRepository.createTableIfNotExistsShadow();
+ orderRepository.truncateTableShadow();
+ }
+
+ private void processSuccess() throws SQLException {
+ final List orderIds = insertData();
+ assertThat(this.selectAll(), equalTo(Arrays.asList(
+ new Order(1, 0, 2, 2, "INSERT_TEST"),
+ new Order(2, 0, 4, 4, "INSERT_TEST"),
+ new Order(3, 0, 6, 6, "INSERT_TEST"),
+ new Order(4, 0, 8, 8, "INSERT_TEST"),
+ new Order(5, 0, 10, 10, "INSERT_TEST"),
+ new Order(1, 1, 1, 1, "INSERT_TEST"),
+ new Order(2, 1, 3, 3, "INSERT_TEST"),
+ new Order(3, 1, 5, 5, "INSERT_TEST"),
+ new Order(4, 1, 7, 7, "INSERT_TEST"),
+ new Order(5, 1, 9, 9, "INSERT_TEST"))));
+ assertThat(orderItemRepository.selectAll(), equalTo(Arrays.asList(
+ new OrderItem(1, 1, 1, "13800000001", "INSERT_TEST"),
+ new OrderItem(2, 1, 2, "13800000001", "INSERT_TEST"),
+ new OrderItem(3, 2, 3, "13800000001", "INSERT_TEST"),
+ new OrderItem(4, 2, 4, "13800000001", "INSERT_TEST"),
+ new OrderItem(5, 3, 5, "13800000001", "INSERT_TEST"),
+ new OrderItem(6, 3, 6, "13800000001", "INSERT_TEST"),
+ new OrderItem(7, 4, 7, "13800000001", "INSERT_TEST"),
+ new OrderItem(8, 4, 8, "13800000001", "INSERT_TEST"),
+ new OrderItem(9, 5, 9, "13800000001", "INSERT_TEST"),
+ new OrderItem(10, 5, 10, "13800000001", "INSERT_TEST"))));
+ assertThat(addressRepository.selectAll(),
+ equalTo(LongStream.range(1, 11).mapToObj(i -> new Address(i, "address_test_" + i)).collect(Collectors.toList())));
+ deleteData(orderIds);
+ assertThat(this.selectAll(), equalTo(Collections.singletonList(new Order(1, 0, 2, 2, "INSERT_TEST"))));
+ assertThat(orderItemRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(addressRepository.selectAll(), equalTo(new ArrayList<>()));
+ }
+
+ private List insertData() throws SQLException {
+ List result = new ArrayList<>(10);
+ for (int i = 1; i <= 10; i++) {
+ Order order = new Order();
+ order.setUserId(i);
+ order.setOrderType(i % 2);
+ order.setAddressId(i);
+ order.setStatus("INSERT_TEST");
+ orderRepository.insert(order);
+
+ OrderItem orderItem = new OrderItem();
+ orderItem.setOrderId(order.getOrderId());
+ orderItem.setUserId(i);
+ orderItem.setPhone("13800000001");
+ orderItem.setStatus("INSERT_TEST");
+ orderItemRepository.insert(orderItem);
+
+ Address address = new Address((long) i, "address_test_" + i);
+ addressRepository.insert(address);
+
+ result.add(order.getOrderId());
+ }
+ return result;
+ }
+
+ private void deleteData(final List orderIds) throws SQLException {
+ long count = 1;
+ for (Long each : orderIds) {
+ orderRepository.deleteShadow(each);
+ orderRepository.delete(each);
+ orderItemRepository.delete(each);
+ addressRepository.delete(count++);
+ }
+ }
+
+ private List selectAll() throws SQLException {
+ List result = orderRepository.selectAll();
+ result.addAll(orderRepository.selectShadowOrder());
+ return result;
+ }
+
+ private void cleanEnvironment() throws SQLException {
+ orderRepository.dropTableShadow();
+ orderRepository.dropTable();
+ orderItemRepository.dropTable();
+ addressRepository.dropTable();
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ShardingTest.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ShardingTest.java
new file mode 100644
index 00000000000000..9a7e96ff6cab53
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/ShardingTest.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features;
+
+import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
+import org.apache.shardingsphere.infra.nativetest.FileTestUtils;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Address;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Order;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.OrderItem;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.AddressRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderItemRepository;
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.repository.OrderRepository;
+import org.junit.jupiter.api.Test;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public final class ShardingTest {
+
+ private OrderRepository orderRepository;
+
+ private OrderItemRepository orderItemRepository;
+
+ private AddressRepository addressRepository;
+
+ @Test
+ void testShardingInLocalTransactions() throws SQLException, IOException {
+ DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("yaml/sharding.yaml"));
+ orderRepository = new OrderRepository(dataSource);
+ orderItemRepository = new OrderItemRepository(dataSource);
+ addressRepository = new AddressRepository(dataSource);
+ this.initEnvironment();
+ this.processSuccess();
+ }
+
+ private void initEnvironment() throws SQLException {
+ orderRepository.createTableIfNotExists();
+ orderItemRepository.createTableIfNotExists();
+ addressRepository.createTableIfNotExists();
+ orderRepository.truncateTable();
+ orderItemRepository.truncateTable();
+ addressRepository.truncateTable();
+ }
+
+ private void processSuccess() throws SQLException {
+ final List orderIds = insertData();
+
+ List orders = orderRepository.selectAll();
+ assertThat(orders.stream().map(Order::getOrderType).collect(Collectors.toList()),
+ equalTo(Arrays.asList(1, 1, 1, 1, 1, 0, 0, 0, 0, 0)));
+ assertThat(orders.stream().map(Order::getUserId).collect(Collectors.toList()),
+ equalTo(new ArrayList<>(Arrays.asList(1, 3, 5, 7, 9, 2, 4, 6, 8, 10))));
+ assertThat(orders.stream().map(Order::getAddressId).collect(Collectors.toList()),
+ equalTo(new ArrayList<>(Arrays.asList(1L, 3L, 5L, 7L, 9L, 2L, 4L, 6L, 8L, 10L))));
+ assertThat(orders.stream().map(Order::getStatus).collect(Collectors.toList()),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> "INSERT_TEST").collect(Collectors.toList())));
+
+ List orderItems = orderItemRepository.selectAll();
+ assertThat(orderItems.stream().map(OrderItem::getUserId).collect(Collectors.toList()),
+ equalTo(new ArrayList<>(Arrays.asList(1, 3, 5, 7, 9, 2, 4, 6, 8, 10))));
+ assertThat(orderItems.stream().map(OrderItem::getPhone).collect(Collectors.toList()),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> "13800000001").collect(Collectors.toList())));
+ assertThat(orderItems.stream().map(OrderItem::getStatus).collect(Collectors.toList()),
+ equalTo(IntStream.range(1, 11).mapToObj(i -> "INSERT_TEST").collect(Collectors.toList())));
+
+ assertThat(addressRepository.selectAll(),
+ equalTo(LongStream.range(1, 11).mapToObj(i -> new Address(i, "address_test_" + i)).collect(Collectors.toList())));
+ deleteData(orderIds);
+ assertThat(orderRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(orderItemRepository.selectAll(), equalTo(new ArrayList<>()));
+ assertThat(addressRepository.selectAll(), equalTo(new ArrayList<>()));
+ }
+
+ private List insertData() throws SQLException {
+ List result = new ArrayList<>(10);
+ for (int i = 1; i <= 10; i++) {
+ Order order = new Order();
+ order.setUserId(i);
+ order.setOrderType(i % 2);
+ order.setAddressId(i);
+ order.setStatus("INSERT_TEST");
+ orderRepository.insert(order);
+
+ OrderItem orderItem = new OrderItem();
+ orderItem.setOrderId(order.getOrderId());
+ orderItem.setUserId(i);
+ orderItem.setPhone("13800000001");
+ orderItem.setStatus("INSERT_TEST");
+ orderItemRepository.insert(orderItem);
+
+ Address address = new Address((long) i, "address_test_" + i);
+ addressRepository.insert(address);
+
+ result.add(order.getOrderId());
+ }
+ return result;
+ }
+
+ private void deleteData(final List orderIds) throws SQLException {
+ long count = 1;
+ for (Long each : orderIds) {
+ orderRepository.delete(each);
+ orderItemRepository.delete(each);
+ addressRepository.delete(count++);
+ }
+ }
+
+ private void cleanEnvironment() throws SQLException {
+ orderRepository.dropTable();
+ orderItemRepository.dropTable();
+ addressRepository.dropTable();
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/algorithm/ClassBasedInlineShardingAlgorithmFixture.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/algorithm/ClassBasedInlineShardingAlgorithmFixture.java
new file mode 100644
index 00000000000000..55652a13e6d499
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/algorithm/ClassBasedInlineShardingAlgorithmFixture.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.algorithm;
+
+import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
+import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
+import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
+
+import java.util.Collection;
+
+@SuppressWarnings("unused")
+public final class ClassBasedInlineShardingAlgorithmFixture implements StandardShardingAlgorithm {
+
+ @Override
+ public String doSharding(final Collection availableTargetNames, final PreciseShardingValue shardingValue) {
+ String resultDatabaseName = "ds_" + shardingValue.getValue() % 2;
+ for (String each : availableTargetNames) {
+ if (each.equals(resultDatabaseName)) {
+ return each;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Collection doSharding(final Collection availableTargetNames, final RangeShardingValue shardingValue) {
+ throw new RuntimeException("This algorithm class does not support range queries.");
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/algorithm/TestQueryAssistedShardingEncryptAlgorithm.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/algorithm/TestQueryAssistedShardingEncryptAlgorithm.java
new file mode 100644
index 00000000000000..d47fb24bf567a7
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/algorithm/TestQueryAssistedShardingEncryptAlgorithm.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.algorithm;
+
+import lombok.Getter;
+import org.apache.shardingsphere.encrypt.api.context.EncryptContext;
+import org.apache.shardingsphere.encrypt.api.encrypt.assisted.AssistedEncryptAlgorithm;
+
+import java.util.Properties;
+
+@SuppressWarnings("LombokGetterMayBeUsed")
+public final class TestQueryAssistedShardingEncryptAlgorithm implements AssistedEncryptAlgorithm {
+
+ @Getter
+ private Properties props;
+
+ @Override
+ public String encrypt(final Object plainValue, final EncryptContext encryptContext) {
+ return "assistedEncryptValue";
+ }
+
+ @Override
+ public String getType() {
+ return "assistedTest";
+ }
+
+ @Override
+ public void init(final Properties props) {
+ this.props = props;
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/Address.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/Address.java
new file mode 100644
index 00000000000000..530e1eb6d86c69
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/Address.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Address implements Serializable {
+
+ private static final long serialVersionUID = 4743102234543827855L;
+
+ private Long addressId;
+
+ private String addressName;
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/Order.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/Order.java
new file mode 100644
index 00000000000000..751889802f8bc7
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/Order.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Order implements Serializable {
+
+ private static final long serialVersionUID = 8306802022239174861L;
+
+ private long orderId;
+
+ private int orderType;
+
+ private int userId;
+
+ private long addressId;
+
+ private String status;
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/OrderItem.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/OrderItem.java
new file mode 100644
index 00000000000000..3c4a00c691f466
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/entity/OrderItem.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderItem implements Serializable {
+
+ private static final long serialVersionUID = 1332162822494069342L;
+
+ private long orderItemId;
+
+ private long orderId;
+
+ private int userId;
+
+ private String phone;
+
+ private String status;
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/AddressRepository.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/AddressRepository.java
new file mode 100644
index 00000000000000..65806f92e12cfe
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/AddressRepository.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.repository;
+
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Address;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.LinkedList;
+import java.util.List;
+
+@SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"})
+public final class AddressRepository {
+
+ private final DataSource dataSource;
+
+ public AddressRepository(final DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ /**
+ * create table t_address if not exists.
+ * @throws SQLException SQL exception
+ */
+ public void createTableIfNotExists() throws SQLException {
+ String sql = "CREATE TABLE IF NOT EXISTS t_address (address_id BIGINT NOT NULL, address_name VARCHAR(100) NOT NULL, PRIMARY KEY (address_id))";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * drop table t_address.
+ * @throws SQLException SQL exception
+ */
+ public void dropTable() throws SQLException {
+ String sql = "DROP TABLE IF EXISTS t_address";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * truncate table t_address.
+ * @throws SQLException SQL exception
+ */
+ public void truncateTable() throws SQLException {
+ String sql = "TRUNCATE TABLE t_address";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * insert something to table t_address.
+ * @param address address
+ * @return addressId of the insert statement
+ * @throws SQLException SQL exception
+ */
+ public Long insert(final Address address) throws SQLException {
+ String sql = "INSERT INTO t_address (address_id, address_name) VALUES (?, ?)";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ preparedStatement.setLong(1, address.getAddressId());
+ preparedStatement.setString(2, address.getAddressName());
+ preparedStatement.executeUpdate();
+ }
+ return address.getAddressId();
+ }
+
+ /**
+ * delete by id.
+ * @param id id
+ * @throws SQLException SQL exception
+ */
+ public void delete(final Long id) throws SQLException {
+ String sql = "DELETE FROM t_address WHERE address_id=?";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ preparedStatement.setLong(1, id);
+ preparedStatement.executeUpdate();
+ }
+ }
+
+ /**
+ * select all.
+ * @return list of address
+ * @throws SQLException SQL exception
+ */
+ public List selectAll() throws SQLException {
+ String sql = "SELECT * FROM t_address";
+ List result = new LinkedList<>();
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql);
+ ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ Address address = new Address();
+ address.setAddressId(resultSet.getLong(1));
+ address.setAddressName(resultSet.getString(2));
+ result.add(address);
+ }
+ }
+ return result;
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/OrderItemRepository.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/OrderItemRepository.java
new file mode 100644
index 00000000000000..320a0786935df8
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/OrderItemRepository.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.repository;
+
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.OrderItem;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.LinkedList;
+import java.util.List;
+
+@SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"})
+public final class OrderItemRepository {
+
+ private final DataSource dataSource;
+
+ public OrderItemRepository(final DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ /**
+ * create table if not exists.
+ * @throws SQLException SQL exception
+ */
+ public void createTableIfNotExists() throws SQLException {
+ String sql = "CREATE TABLE IF NOT EXISTS t_order_item "
+ + "(order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, phone VARCHAR(50), status VARCHAR(50), PRIMARY KEY (order_item_id))";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * drop table.
+ * @throws SQLException SQL exception
+ */
+ public void dropTable() throws SQLException {
+ String sql = "DROP TABLE IF EXISTS t_order_item";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * truncate table.
+ * @throws SQLException SQL exception
+ */
+ public void truncateTable() throws SQLException {
+ String sql = "TRUNCATE TABLE t_order_item";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * create shadow table if not exists.
+ * @throws SQLException SQL exception
+ */
+ public void createTableIfNotExistsShadow() throws SQLException {
+ String sql = "CREATE TABLE IF NOT EXISTS t_order_item "
+ + "(order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, phone "
+ + "VARCHAR(50), status VARCHAR(50), PRIMARY KEY (order_item_id)) /* SHARDINGSPHERE_HINT:shadow=true,foo=bar*/";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * drop shadow table.
+ * @throws SQLException SQL exception
+ */
+ public void dropTableShadow() throws SQLException {
+ String sql = "DROP TABLE t_order_item /* SHARDINGSPHERE_HINT:shadow=true,foo=bar*/";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * truncate shadow table.
+ * @throws SQLException SQL exception
+ */
+ public void truncateTableShadow() throws SQLException {
+ String sql = "TRUNCATE TABLE t_order_item /* SHARDINGSPHERE_HINT:shadow=true,foo=bar*/";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * insert something to table.
+ * @param orderItem orderItem
+ * @return orderItemId of the insert statement
+ * @throws SQLException SQL exception
+ */
+ public Long insert(final OrderItem orderItem) throws SQLException {
+ String sql = "INSERT INTO t_order_item (order_id, user_id, phone, status) VALUES (?, ?, ?, ?)";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+ preparedStatement.setLong(1, orderItem.getOrderId());
+ preparedStatement.setInt(2, orderItem.getUserId());
+ preparedStatement.setString(3, orderItem.getPhone());
+ preparedStatement.setString(4, orderItem.getStatus());
+ preparedStatement.executeUpdate();
+ try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) {
+ if (resultSet.next()) {
+ orderItem.setOrderItemId(resultSet.getLong(1));
+ }
+ }
+ }
+ return orderItem.getOrderItemId();
+ }
+
+ /**
+ * delete by orderItemId.
+ * @param orderItemId orderItemId
+ * @throws SQLException SQL exception
+ */
+ public void delete(final Long orderItemId) throws SQLException {
+ String sql = "DELETE FROM t_order_item WHERE order_id=?";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ preparedStatement.setLong(1, orderItemId);
+ preparedStatement.executeUpdate();
+ }
+ }
+
+ /**
+ * select all.
+ * @return list of OrderItem
+ * @throws SQLException SQL exception
+ */
+ public List selectAll() throws SQLException {
+ String sql = "SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id";
+ List result = new LinkedList<>();
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql);
+ ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ OrderItem orderItem = new OrderItem();
+ orderItem.setOrderItemId(resultSet.getLong(1));
+ orderItem.setOrderId(resultSet.getLong(2));
+ orderItem.setUserId(resultSet.getInt(3));
+ orderItem.setPhone(resultSet.getString(4));
+ orderItem.setStatus(resultSet.getString(5));
+ result.add(orderItem);
+ }
+ }
+ return result;
+ }
+}
diff --git a/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/OrderRepository.java b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/OrderRepository.java
new file mode 100644
index 00000000000000..fb5aad9c1bdf24
--- /dev/null
+++ b/infra/nativetest/src/test/java/org/apache/shardingsphere/infra/nativetest/jdbc/features/repository/OrderRepository.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.nativetest.jdbc.features.repository;
+
+import org.apache.shardingsphere.infra.nativetest.jdbc.features.entity.Order;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.LinkedList;
+import java.util.List;
+
+@SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"})
+public final class OrderRepository {
+
+ private final DataSource dataSource;
+
+ public OrderRepository(final DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ /**
+ * create table if not exists.
+ * @throws SQLException SQL exception
+ */
+ public void createTableIfNotExists() throws SQLException {
+ String sql = "CREATE TABLE IF NOT EXISTS t_order "
+ + "(order_id BIGINT NOT NULL AUTO_INCREMENT, order_type INT(11), user_id INT NOT NULL, address_id BIGINT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id))";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * drop table.
+ * TODO There is a bug in this function in shadow's unit test and requires additional fixes.
+ * @throws SQLException SQL exception
+ */
+ public void dropTable() throws SQLException {
+ String sql = "DROP TABLE IF EXISTS t_order";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * truncate table.
+ * @throws SQLException SQL exception
+ */
+ public void truncateTable() throws SQLException {
+ String sql = "TRUNCATE TABLE t_order";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * create shadow table if not exists.
+ * @throws SQLException SQL exception
+ */
+ public void createTableIfNotExistsShadow() throws SQLException {
+ String sql =
+ "CREATE TABLE IF NOT EXISTS t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, order_type INT(11), "
+ + "user_id INT NOT NULL, address_id BIGINT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id)) "
+ + "/* SHARDINGSPHERE_HINT:shadow=true,foo=bar*/";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * drop shadow table.
+ * @throws SQLException SQL exception
+ */
+ public void dropTableShadow() throws SQLException {
+ String sql = "DROP TABLE IF EXISTS t_order /* SHARDINGSPHERE_HINT:shadow=true,foo=bar*/";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * truncate shadow table.
+ * @throws SQLException SQL exception
+ */
+ public void truncateTableShadow() throws SQLException {
+ String sql = "TRUNCATE TABLE t_order /* SHARDINGSPHERE_HINT:shadow=true,foo=bar*/";
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.executeUpdate(sql);
+ }
+ }
+
+ /**
+ * select Order from shadow table.
+ * @return list of Order
+ * @throws SQLException SQL exception
+ */
+ public List selectShadowOrder() throws SQLException {
+ String sql = "SELECT * FROM t_order WHERE order_type=1";
+ return getOrders(sql);
+ }
+
+ /**
+ * delete Order from shadow table.
+ * @param orderId orderId
+ * @throws SQLException SQL Exception
+ */
+ public void deleteShadow(final Long orderId) throws SQLException {
+ String sql = "DELETE FROM t_order WHERE order_id=? AND order_type=1";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ preparedStatement.setLong(1, orderId);
+ preparedStatement.executeUpdate();
+ }
+ }
+
+ /**
+ * insert Order to table.
+ * @param order order
+ * @return orderId of the insert statement
+ * @throws SQLException SQL Exception
+ */
+ public Long insert(final Order order) throws SQLException {
+ String sql = "INSERT INTO t_order (user_id, order_type, address_id, status) VALUES (?, ?, ?, ?)";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
+ preparedStatement.setInt(1, order.getUserId());
+ preparedStatement.setInt(2, order.getOrderType());
+ preparedStatement.setLong(3, order.getAddressId());
+ preparedStatement.setString(4, order.getStatus());
+ preparedStatement.executeUpdate();
+ try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) {
+ if (resultSet.next()) {
+ order.setOrderId(resultSet.getLong(1));
+ }
+ }
+ }
+ return order.getOrderId();
+ }
+
+ /**
+ * delete by orderId.
+ * @param orderId orderId
+ * @throws SQLException SQL exception
+ */
+ public void delete(final Long orderId) throws SQLException {
+ String sql = "DELETE FROM t_order WHERE order_id=?";
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
+ preparedStatement.setLong(1, orderId);
+ preparedStatement.executeUpdate();
+ }
+ }
+
+ /**
+ * select all.
+ * @return list of Order
+ * @throws SQLException SQL exception
+ */
+ public List selectAll() throws SQLException {
+ return getOrders("SELECT * FROM t_order");
+ }
+
+ /**
+ * get Orders by SQL.
+ * @param sql SQL
+ * @return list of Order
+ * @throws SQLException SQL exception
+ */
+ private List getOrders(final String sql) throws SQLException {
+ List result = new LinkedList<>();
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(sql);
+ ResultSet resultSet = preparedStatement.executeQuery()) {
+ while (resultSet.next()) {
+ Order order = new Order();
+ order.setOrderId(resultSet.getLong(1));
+ order.setOrderType(resultSet.getInt(2));
+ order.setUserId(resultSet.getInt(3));
+ order.setAddressId(resultSet.getLong(4));
+ order.setStatus(resultSet.getString(5));
+ result.add(order);
+ }
+ }
+ return result;
+ }
+}
diff --git a/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-image/reflect-config.json b/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-image/reflect-config.json
new file mode 100644
index 00000000000000..4aed2e014fdd9d
--- /dev/null
+++ b/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-image/reflect-config.json
@@ -0,0 +1,7 @@
+[
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.algorithm.sharding.classbased.ClassBasedShardingAlgorithmFactory"},
+ "name":"org.apache.shardingsphere.infra.nativetest.jdbc.features.algorithm.ClassBasedInlineShardingAlgorithmFixture",
+ "methods":[{"name":"","parameterTypes":[] }]
+}
+]
diff --git a/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-image/resource-config.json b/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-image/resource-config.json
new file mode 100644
index 00000000000000..2773c5f2fde1bf
--- /dev/null
+++ b/infra/nativetest/src/test/resources/META-INF/native-image/shardingsphere-infra-nativetest-test-image/resource-config.json
@@ -0,0 +1,21 @@
+{
+ "resources":{
+ "includes":[{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.nativetest.jdbc.features.EncryptTest"},
+ "pattern":"\\Qyaml/encrypt.yaml\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.nativetest.jdbc.features.MaskTest"},
+ "pattern":"\\Qyaml/mask.yaml\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.nativetest.jdbc.features.ReadWriteSplittingTest"},
+ "pattern":"\\Qyaml/readwrite-splitting.yaml\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.nativetest.jdbc.features.ShadowTest"},
+ "pattern":"\\Qyaml/shadow.yaml\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.nativetest.jdbc.features.ShardingTest"},
+ "pattern":"\\Qyaml/sharding.yaml\\E"
+ }
+ ]},
+ "bundles":[]
+}
diff --git a/infra/nativetest/src/test/resources/META-INF/services/org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm b/infra/nativetest/src/test/resources/META-INF/services/org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm
new file mode 100644
index 00000000000000..be8532cc700cbc
--- /dev/null
+++ b/infra/nativetest/src/test/resources/META-INF/services/org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.shardingsphere.infra.nativetest.jdbc.features.algorithm.TestQueryAssistedShardingEncryptAlgorithm
diff --git a/infra/nativetest/src/test/resources/yaml/encrypt.yaml b/infra/nativetest/src/test/resources/yaml/encrypt.yaml
new file mode 100644
index 00000000000000..5eb2edb87cc195
--- /dev/null
+++ b/infra/nativetest/src/test/resources/yaml/encrypt.yaml
@@ -0,0 +1,60 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+mode:
+ type: Standalone
+ repository:
+ type: JDBC
+
+dataSources:
+ ds_0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_encrypt_ds_0;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+
+rules:
+- !ENCRYPT
+ tables:
+ t_order:
+ columns:
+ status:
+ cipher:
+ name: status
+ encryptorName: standard_encryptor
+ assistedQuery:
+ name: status_assisted
+ encryptorName: assisted_encryptor
+ t_order_item:
+ columns:
+ phone:
+ cipher:
+ name: phone
+ encryptorName: standard_encryptor
+ encryptors:
+ standard_encryptor:
+ type: AES
+ props:
+ aes-key-value: 123456
+ assisted_encryptor:
+ type: assistedTest
+ props:
+ aes-key-value: 123456
+
+props:
+ sql-show: true
diff --git a/infra/nativetest/src/test/resources/yaml/mask.yaml b/infra/nativetest/src/test/resources/yaml/mask.yaml
new file mode 100644
index 00000000000000..6cb5ebed162ecf
--- /dev/null
+++ b/infra/nativetest/src/test/resources/yaml/mask.yaml
@@ -0,0 +1,47 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+mode:
+ type: Standalone
+ repository:
+ type: JDBC
+
+dataSources:
+ ds_0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_mask_ds_0;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+
+rules:
+- !MASK
+ tables:
+ t_order_item:
+ columns:
+ phone:
+ maskAlgorithm: keep_first_n_last_m_mask
+ maskAlgorithms:
+ keep_first_n_last_m_mask:
+ type: KEEP_FIRST_N_LAST_M
+ props:
+ first-n: 3
+ last-m: 4
+ replace-char: '*'
+
+props:
+ sql-show: true
\ No newline at end of file
diff --git a/infra/nativetest/src/test/resources/yaml/readwrite-splitting.yaml b/infra/nativetest/src/test/resources/yaml/readwrite-splitting.yaml
new file mode 100644
index 00000000000000..ea6dde97013bf5
--- /dev/null
+++ b/infra/nativetest/src/test/resources/yaml/readwrite-splitting.yaml
@@ -0,0 +1,57 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+mode:
+ type: Standalone
+ repository:
+ type: JDBC
+
+dataSources:
+ ds_0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_readwrite_splitting_ds_0;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+ ds_1:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_readwrite_splitting_ds_1;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+ ds_2:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_readwrite_splitting_ds_2;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+
+rules:
+- !READWRITE_SPLITTING
+ # We need to prevent the logical database name, writeDataSourceName and readDataSourceNames from being parsed by
+ # GroovyShell under Native Image for the read-write separation function.
+ # That is, switch to another Row Value Expression SPI implementation.
+ dataSources:
+ readwrite_ds:
+ writeDataSourceName: ds_0
+ readDataSourceNames:
+ - ds_1
+ - ds_2
+
+props:
+ sql-show: true
+
diff --git a/infra/nativetest/src/test/resources/yaml/shadow.yaml b/infra/nativetest/src/test/resources/yaml/shadow.yaml
new file mode 100644
index 00000000000000..21a23e4204e4d6
--- /dev/null
+++ b/infra/nativetest/src/test/resources/yaml/shadow.yaml
@@ -0,0 +1,88 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+mode:
+ type: Standalone
+ repository:
+ type: JDBC
+
+dataSources:
+ ds_0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_shadow_ds_0;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+ ds_1:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_shadow_ds_1;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+
+rules:
+- !SHADOW
+ dataSources:
+ shadow-data-source:
+ productionDataSourceName: ds_0
+ shadowDataSourceName: ds_1
+ tables:
+ t_order:
+ dataSourceNames:
+ - shadow-data-source
+ shadowAlgorithmNames:
+ - order-type-insert-match-algorithm
+ - order-type-delete-match-algorithm
+ - order-type-select-match-algorithm
+ - sql-hint-algorithm
+ shadowAlgorithms:
+ order-type-insert-match-algorithm:
+ type: VALUE_MATCH
+ props:
+ operation: insert
+ column: order_type
+ value: "1"
+ order-type-delete-match-algorithm:
+ type: VALUE_MATCH
+ props:
+ operation: delete
+ column: order_type
+ value: "1"
+ order-type-select-match-algorithm:
+ type: VALUE_MATCH
+ props:
+ operation: select
+ column: order_type
+ value: "1"
+ sql-hint-algorithm:
+ type: SQL_HINT
+ props:
+ shadow: true
+ foo: bar
+ defaultShadowAlgorithmName: sql-hint-algorithm
+
+sqlParser:
+ sqlCommentParseEnabled: true
+ sqlStatementCache:
+ initialCapacity: 128
+ maximumSize: 1024
+ parseTreeCache:
+ initialCapacity: 2000
+ maximumSize: 65535
+
+props:
+ sql-show: true
diff --git a/infra/nativetest/src/test/resources/yaml/sharding.yaml b/infra/nativetest/src/test/resources/yaml/sharding.yaml
new file mode 100644
index 00000000000000..b8a4658bd5afc9
--- /dev/null
+++ b/infra/nativetest/src/test/resources/yaml/sharding.yaml
@@ -0,0 +1,82 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+mode:
+ type: Standalone
+ repository:
+ type: JDBC
+
+dataSources:
+ ds_0:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_sharding_ds_0;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+ ds_1:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_sharding_ds_1;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+ ds_2:
+ dataSourceClassName: com.zaxxer.hikari.HikariDataSource
+ driverClassName: org.h2.Driver
+ jdbcUrl: jdbc:h2:mem:local_sharding_ds_2;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
+ username: root
+ password: 123456
+
+rules:
+- !SHARDING
+ tables:
+ t_order:
+ actualDataNodes:
+ keyGenerateStrategy:
+ column: order_id
+ keyGeneratorName: snowflake
+ t_order_item:
+ actualDataNodes:
+ keyGenerateStrategy:
+ column: order_item_id
+ keyGeneratorName: snowflake
+ defaultDatabaseStrategy:
+ standard:
+ shardingColumn: user_id
+ shardingAlgorithmName: inline
+ shardingAlgorithms:
+ # GroovyShell related classes are not available on GraalVM CE 23.0.2 For JDK 17.0.9,
+ # This CLASS_BASE algorithm class is designed to emulate INLINE's `ds_${user_id % 2}`.
+ # See https://github.com/oracle/graal/issues/5522 .
+ inline:
+ type: CLASS_BASED
+ props:
+ strategy: STANDARD
+ algorithmClassName: org.apache.shardingsphere.infra.nativetest.jdbc.features.algorithm.ClassBasedInlineShardingAlgorithmFixture
+ keyGenerators:
+ snowflake:
+ type: SNOWFLAKE
+ auditors:
+ sharding_key_required_auditor:
+ type: DML_SHARDING_CONDITIONS
+
+- !BROADCAST
+ tables:
+ - t_address
+
+props:
+ sql-show: true
+
diff --git a/infra/pom.xml b/infra/pom.xml
index e5b2c38cc7987c..61cf88285b3607 100644
--- a/infra/pom.xml
+++ b/infra/pom.xml
@@ -44,5 +44,7 @@
session
expr
util
+ reachability-metadata
+ nativetest
diff --git a/infra/reachability-metadata/pom.xml b/infra/reachability-metadata/pom.xml
new file mode 100644
index 00000000000000..1d578449de5c1a
--- /dev/null
+++ b/infra/reachability-metadata/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+
+ 4.0.0
+
+ org.apache.shardingsphere
+ shardingsphere-infra
+ 5.4.2-SNAPSHOT
+
+ shardingsphere-infra-reachability-metadata
+ ${project.artifactId}
+
+
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/2.9.3/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/2.9.3/reflect-config.json
new file mode 100644
index 00000000000000..995222a3c6b519
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/2.9.3/reflect-config.json
@@ -0,0 +1,62 @@
+[
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.BBHeader$ReadAndWriteCounterRef"},
+ "name":"com.github.benmanes.caffeine.cache.BBHeader$ReadAndWriteCounterRef",
+ "fields":[{"name":"writeCounter"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.BBHeader$ReadCounterRef"},
+ "name":"com.github.benmanes.caffeine.cache.BBHeader$ReadCounterRef",
+ "fields":[{"name":"readCounter"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.BLCHeader$DrainStatusRef"},
+ "name":"com.github.benmanes.caffeine.cache.BLCHeader$DrainStatusRef",
+ "fields":[{"name":"drainStatus"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueue"},
+ "name":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueColdProducerFields",
+ "fields":[{"name":"producerLimit"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueue"},
+ "name":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueConsumerFields",
+ "fields":[{"name":"consumerIndex"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueue"},
+ "name":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueProducerFields",
+ "fields":[{"name":"producerIndex"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.LocalLoadingCache"},
+ "name":"com.github.benmanes.caffeine.cache.CacheLoader",
+ "methods":[{"name":"loadAll","parameterTypes":["java.lang.Iterable"] }]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.PD"},
+ "name":"com.github.benmanes.caffeine.cache.PD",
+ "fields":[{"name":"value"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.NodeFactory"},
+ "name":"com.github.benmanes.caffeine.cache.PDMS",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.LocalCacheFactory"},
+ "name":"com.github.benmanes.caffeine.cache.SIMS",
+ "methods":[{"name":"","parameterTypes":["com.github.benmanes.caffeine.cache.Caffeine","com.github.benmanes.caffeine.cache.CacheLoader","boolean"] }]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.StripedBuffer"},
+ "name":"com.github.benmanes.caffeine.cache.StripedBuffer",
+ "fields":[{"name":"tableBusy"}]
+},
+{
+ "condition":{"typeReachable":"com.github.benmanes.caffeine.cache.StripedBuffer"},
+ "name":"java.lang.Thread",
+ "fields":[{"name":"threadLocalRandomProbe"}]
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.zaxxer/HikariCP/4.0.3/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.zaxxer/HikariCP/4.0.3/reflect-config.json
new file mode 100644
index 00000000000000..9022218575148b
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/com.zaxxer/HikariCP/4.0.3/reflect-config.json
@@ -0,0 +1,20 @@
+[
+{
+ "condition":{"typeReachable":"com.zaxxer.hikari.HikariConfig"},
+ "name":"com.zaxxer.hikari.HikariConfig",
+ "queryAllPublicMethods":true,
+ "fields":[{"name":"dataSourceProperties"}, {"name":"jdbcUrl"}],
+ "methods":[{"name":"getCatalog","parameterTypes":[] }, {"name":"getConnectionInitSql","parameterTypes":[] }, {"name":"getConnectionTestQuery","parameterTypes":[] }, {"name":"getConnectionTimeout","parameterTypes":[] }, {"name":"getDataSource","parameterTypes":[] }, {"name":"getDataSourceClassName","parameterTypes":[] }, {"name":"getDataSourceJNDI","parameterTypes":[] }, {"name":"getDataSourceProperties","parameterTypes":[] }, {"name":"getDriverClassName","parameterTypes":[] }, {"name":"getExceptionOverrideClassName","parameterTypes":[] }, {"name":"getHealthCheckProperties","parameterTypes":[] }, {"name":"getHealthCheckRegistry","parameterTypes":[] }, {"name":"getIdleTimeout","parameterTypes":[] }, {"name":"getInitializationFailTimeout","parameterTypes":[] }, {"name":"getJdbcUrl","parameterTypes":[] }, {"name":"getKeepaliveTime","parameterTypes":[] }, {"name":"getLeakDetectionThreshold","parameterTypes":[] }, {"name":"getMaxLifetime","parameterTypes":[] }, {"name":"getMaximumPoolSize","parameterTypes":[] }, {"name":"getMetricRegistry","parameterTypes":[] }, {"name":"getMetricsTrackerFactory","parameterTypes":[] }, {"name":"getMinimumIdle","parameterTypes":[] }, {"name":"getPassword","parameterTypes":[] }, {"name":"getPoolName","parameterTypes":[] }, {"name":"getScheduledExecutor","parameterTypes":[] }, {"name":"getSchema","parameterTypes":[] }, {"name":"getThreadFactory","parameterTypes":[] }, {"name":"getTransactionIsolation","parameterTypes":[] }, {"name":"getUsername","parameterTypes":[] }, {"name":"getValidationTimeout","parameterTypes":[] }, {"name":"isAllowPoolSuspension","parameterTypes":[] }, {"name":"isAutoCommit","parameterTypes":[] }, {"name":"isIsolateInternalQueries","parameterTypes":[] }, {"name":"isReadOnly","parameterTypes":[] }, {"name":"isRegisterMbeans","parameterTypes":[] }, {"name":"setAllowPoolSuspension","parameterTypes":["boolean"] }, {"name":"setAutoCommit","parameterTypes":["boolean"] }, {"name":"setCatalog","parameterTypes":["java.lang.String"] }, {"name":"setClass","parameterTypes":["java.lang.Class"] }, {"name":"setConnectionInitSql","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTestQuery","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTimeout","parameterTypes":["long"] }, {"name":"setDataSource","parameterTypes":["javax.sql.DataSource"] }, {"name":"setDataSourceClassName","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceJNDI","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceProperties","parameterTypes":["java.util.Properties"] }, {"name":"setDriverClassName","parameterTypes":["java.lang.String"] }, {"name":"setExceptionOverrideClassName","parameterTypes":["java.lang.String"] }, {"name":"setHealthCheckProperties","parameterTypes":["java.util.Properties"] }, {"name":"setHealthCheckRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setIdleTimeout","parameterTypes":["long"] }, {"name":"setInitializationFailTimeout","parameterTypes":["long"] }, {"name":"setIsolateInternalQueries","parameterTypes":["boolean"] }, {"name":"setJdbcUrl","parameterTypes":["java.lang.String"] }, {"name":"setKeepaliveTime","parameterTypes":["long"] }, {"name":"setLeakDetectionThreshold","parameterTypes":["long"] }, {"name":"setMaxLifetime","parameterTypes":["long"] }, {"name":"setMaximumPoolSize","parameterTypes":["int"] }, {"name":"setMetricRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setMetricsTrackerFactory","parameterTypes":["com.zaxxer.hikari.metrics.MetricsTrackerFactory"] }, {"name":"setMinimumIdle","parameterTypes":["int"] }, {"name":"setPassword","parameterTypes":["java.lang.String"] }, {"name":"setPoolName","parameterTypes":["java.lang.String"] }, {"name":"setReadOnly","parameterTypes":["boolean"] }, {"name":"setRegisterMbeans","parameterTypes":["boolean"] }, {"name":"setScheduledExecutor","parameterTypes":["java.util.concurrent.ScheduledExecutorService"] }, {"name":"setSchema","parameterTypes":["java.lang.String"] }, {"name":"setThreadFactory","parameterTypes":["java.util.concurrent.ThreadFactory"] }, {"name":"setTransactionIsolation","parameterTypes":["java.lang.String"] }, {"name":"setUsername","parameterTypes":["java.lang.String"] }, {"name":"setValidationTimeout","parameterTypes":["long"] }]
+},
+{
+ "condition":{"typeReachable":"com.zaxxer.hikari.HikariDataSource"},
+ "name":"com.zaxxer.hikari.HikariDataSource",
+ "fields":[{"name":"dataSourceProperties"}, {"name":"jdbcUrl"}],
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getAllowPoolSuspension","parameterTypes":[] }, {"name":"getAutoCommit","parameterTypes":[] }, {"name":"getIsolateInternalQueries","parameterTypes":[] }, {"name":"getReadOnly","parameterTypes":[] }, {"name":"getRegisterMbeans","parameterTypes":[] }, {"name":"isClosed","parameterTypes":[] }, {"name":"isRunning","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"com.zaxxer.hikari.util.PropertyElf"},
+ "name":"com.zaxxer.hikari.HikariDataSource",
+ "methods":[{"name":"getAllowPoolSuspension","parameterTypes":[] }, {"name":"getAutoCommit","parameterTypes":[] }, {"name":"getIsolateInternalQueries","parameterTypes":[] }, {"name":"getReadOnly","parameterTypes":[] }, {"name":"getRegisterMbeans","parameterTypes":[] }]
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.calcite/calcite-core/1.35.0/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.calcite/calcite-core/1.35.0/reflect-config.json
new file mode 100644
index 00000000000000..5563fa603270ad
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.calcite/calcite-core/1.35.0/reflect-config.json
@@ -0,0 +1,797 @@
+[
+{
+ "condition":{"typeReachable":"org.apache.calcite.plan.RelOptCluster"},
+ "name":"[B"
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.plan.RelOptCluster"},
+ "name":"[Ljava.lang.String;"
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.plan.RelOptCluster"},
+ "name":"[Lsun.security.pkcs.SignerInfo;"
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"java.lang.Boolean",
+ "fields":[{"name":"FALSE"}, {"name":"TRUE"}]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.DataContext",
+ "methods":[{"name":"get","parameterTypes":["java.lang.String"] }, {"name":"getQueryProvider","parameterTypes":[] }, {"name":"getRootSchema","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.AggregateLambdaFactory",
+ "methods":[{"name":"accumulatorAdder","parameterTypes":[] }, {"name":"accumulatorInitializer","parameterTypes":[] }, {"name":"resultSelector","parameterTypes":["org.apache.calcite.linq4j.function.Function2"] }, {"name":"singleGroupResultSelector","parameterTypes":["org.apache.calcite.linq4j.function.Function1"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.BasicAggregateLambdaFactory",
+ "queryAllDeclaredConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.BasicLazyAccumulator",
+ "queryAllDeclaredConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.EnumUtils",
+ "methods":[{"name":"hopping","parameterTypes":["org.apache.calcite.linq4j.Enumerator","int","long","long","long"] }, {"name":"sessionize","parameterTypes":["org.apache.calcite.linq4j.Enumerator","int","int","long"] }, {"name":"tumbling","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.LazyAggregateLambdaFactory",
+ "queryAllDeclaredConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.MatchUtils",
+ "methods":[{"name":"lastWithSymbol","parameterTypes":["java.lang.String","java.util.List","java.util.List","int"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$ArgMinMaxImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$BitOpImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$CollectImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$CountImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$CountWinImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$DenseRankImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$FirstValueImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$FusionImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$GroupingImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$IntersectionImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$LagImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$LastValueImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$LeadImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$ListaggImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$LiteralAggImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$MinMaxImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$ModeImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$NthValueImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$NtileImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$RankImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$RowNumberImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$SingleValueImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.adapter.enumerable.RexImpTable$Builder"},
+ "name":"org.apache.calcite.adapter.enumerable.RexImpTable$SumImplementor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.enumerable.SourceSorter",
+ "queryAllDeclaredConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.java.ReflectiveSchema",
+ "methods":[{"name":"getTarget","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.adapter.jdbc.JdbcSchema",
+ "methods":[{"name":"getDataSource","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.avatica.remote.Driver"},
+ "name":"org.apache.calcite.avatica.AvaticaJdbc41Factory",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.avatica.util.DateTimeUtils",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"addMonths","parameterTypes":["int","int"] }, {"name":"addMonths","parameterTypes":["long","int"] }, {"name":"dateStringToUnixDate","parameterTypes":["java.lang.String"] }, {"name":"intervalDayTimeToString","parameterTypes":["long","org.apache.calcite.avatica.util.TimeUnitRange","int"] }, {"name":"intervalYearMonthToString","parameterTypes":["int","org.apache.calcite.avatica.util.TimeUnitRange"] }, {"name":"lastDay","parameterTypes":["int"] }, {"name":"subtractMonths","parameterTypes":["long","long"] }, {"name":"timeStringToUnixDate","parameterTypes":["java.lang.String"] }, {"name":"timestampStringToUnixDate","parameterTypes":["java.lang.String"] }, {"name":"unixDateCeil","parameterTypes":["org.apache.calcite.avatica.util.TimeUnitRange","int"] }, {"name":"unixDateExtract","parameterTypes":["org.apache.calcite.avatica.util.TimeUnitRange","long"] }, {"name":"unixDateFloor","parameterTypes":["org.apache.calcite.avatica.util.TimeUnitRange","int"] }, {"name":"unixDateToString","parameterTypes":["int"] }, {"name":"unixTimeToString","parameterTypes":["int"] }, {"name":"unixTimestampCeil","parameterTypes":["org.apache.calcite.avatica.util.TimeUnitRange","long"] }, {"name":"unixTimestampFloor","parameterTypes":["org.apache.calcite.avatica.util.TimeUnitRange","long"] }, {"name":"unixTimestampToString","parameterTypes":["long"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.interpreter.Context",
+ "fields":[{"name":"root"}, {"name":"values"}]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.interpreter.Row",
+ "methods":[{"name":"asCopy","parameterTypes":["java.lang.Object[]"] }, {"name":"getObject","parameterTypes":["int"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.interpreter.Scalar",
+ "methods":[{"name":"execute","parameterTypes":["org.apache.calcite.interpreter.Context"] }, {"name":"execute","parameterTypes":["org.apache.calcite.interpreter.Context","java.lang.Object[]"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.jdbc.Driver"},
+ "name":"org.apache.calcite.jdbc.CalciteJdbc41Factory",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.AbstractEnumerable",
+ "queryAllDeclaredConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.Enumerable",
+ "methods":[{"name":"asQueryable","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.EnumerableDefaults",
+ "methods":[{"name":"antiJoin","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.EqualityComparer","org.apache.calcite.linq4j.function.Predicate2"] }, {"name":"correlateBatchJoin","parameterTypes":["org.apache.calcite.linq4j.JoinType","org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.function.Predicate2","int"] }, {"name":"groupByMultiple","parameterTypes":["org.apache.calcite.linq4j.Enumerable","java.util.List","org.apache.calcite.linq4j.function.Function0","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.function.Function2"] }, {"name":"lazyCollectionSpool","parameterTypes":["java.util.Collection","org.apache.calcite.linq4j.Enumerable"] }, {"name":"mergeJoin","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Predicate2","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.JoinType","java.util.Comparator"] }, {"name":"mergeUnion","parameterTypes":["java.util.List","org.apache.calcite.linq4j.function.Function1","java.util.Comparator","boolean","org.apache.calcite.linq4j.function.EqualityComparer"] }, {"name":"nestedLoopJoin","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Predicate2","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.JoinType"] }, {"name":"orderBy","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","java.util.Comparator","int","int"] }, {"name":"repeatUnion","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.Enumerable","int","boolean","org.apache.calcite.linq4j.function.EqualityComparer","org.apache.calcite.linq4j.function.Function0"] }, {"name":"semiJoin","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.EqualityComparer","org.apache.calcite.linq4j.function.Predicate2"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.Enumerator",
+ "methods":[{"name":"close","parameterTypes":[] }, {"name":"current","parameterTypes":[] }, {"name":"moveNext","parameterTypes":[] }, {"name":"reset","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.ExtendedEnumerable",
+ "methods":[{"name":"aggregate","parameterTypes":["java.lang.Object","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.function.Function1"] }, {"name":"asEnumerable","parameterTypes":[] }, {"name":"concat","parameterTypes":["org.apache.calcite.linq4j.Enumerable"] }, {"name":"correlateJoin","parameterTypes":["org.apache.calcite.linq4j.JoinType","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function2"] }, {"name":"distinct","parameterTypes":[] }, {"name":"distinct","parameterTypes":["org.apache.calcite.linq4j.function.EqualityComparer"] }, {"name":"except","parameterTypes":["org.apache.calcite.linq4j.Enumerable","boolean"] }, {"name":"foreach","parameterTypes":["org.apache.calcite.linq4j.function.Function1"] }, {"name":"groupBy","parameterTypes":["org.apache.calcite.linq4j.function.Function1"] }, {"name":"groupBy","parameterTypes":["org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function0","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.function.Function2"] }, {"name":"hashJoin","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.function.EqualityComparer","boolean","boolean","org.apache.calcite.linq4j.function.Predicate2"] }, {"name":"intersect","parameterTypes":["org.apache.calcite.linq4j.Enumerable","boolean"] }, {"name":"into","parameterTypes":["java.util.Collection"] }, {"name":"orderBy","parameterTypes":["org.apache.calcite.linq4j.function.Function1","java.util.Comparator"] }, {"name":"removeAll","parameterTypes":["java.util.Collection"] }, {"name":"select","parameterTypes":["org.apache.calcite.linq4j.function.Function1"] }, {"name":"select","parameterTypes":["org.apache.calcite.linq4j.function.Function2"] }, {"name":"selectMany","parameterTypes":["org.apache.calcite.linq4j.function.Function1"] }, {"name":"skip","parameterTypes":["int"] }, {"name":"sortedGroupBy","parameterTypes":["org.apache.calcite.linq4j.function.Function1","org.apache.calcite.linq4j.function.Function0","org.apache.calcite.linq4j.function.Function2","org.apache.calcite.linq4j.function.Function2","java.util.Comparator"] }, {"name":"take","parameterTypes":["int"] }, {"name":"toList","parameterTypes":[] }, {"name":"union","parameterTypes":["org.apache.calcite.linq4j.Enumerable"] }, {"name":"where","parameterTypes":["org.apache.calcite.linq4j.function.Predicate1"] }, {"name":"where","parameterTypes":["org.apache.calcite.linq4j.function.Predicate2"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.ExtendedQueryable",
+ "methods":[{"name":"select","parameterTypes":["org.apache.calcite.linq4j.tree.FunctionExpression"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.Linq4j",
+ "methods":[{"name":"asEnumerable","parameterTypes":["java.lang.Iterable"] }, {"name":"asEnumerable","parameterTypes":["java.lang.Object[]"] }, {"name":"emptyEnumerable","parameterTypes":[] }, {"name":"singletonEnumerable","parameterTypes":["java.lang.Object"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.MemoryFactory$Memory",
+ "methods":[{"name":"get","parameterTypes":[] }, {"name":"get","parameterTypes":["int"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.Queryable"
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.RawEnumerable",
+ "methods":[{"name":"enumerator","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.function.Function0",
+ "methods":[{"name":"apply","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.function.Function1",
+ "methods":[{"name":"apply","parameterTypes":["java.lang.Object"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.function.Functions",
+ "methods":[{"name":"all","parameterTypes":["java.util.List","org.apache.calcite.linq4j.function.Predicate1"] }, {"name":"arrayComparer","parameterTypes":[] }, {"name":"exists","parameterTypes":["java.util.List","org.apache.calcite.linq4j.function.Predicate1"] }, {"name":"identityComparer","parameterTypes":[] }, {"name":"identitySelector","parameterTypes":[] }, {"name":"nullsComparator","parameterTypes":["boolean","boolean"] }, {"name":"nullsComparator","parameterTypes":["boolean","boolean","java.util.Comparator"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.linq4j.tree.Primitive",
+ "methods":[{"name":"asList","parameterTypes":["java.lang.Object"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$AllPredicates",
+ "methods":[{"name":"getAllPredicates","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$AllPredicates"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$AllPredicates$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Collation",
+ "methods":[{"name":"collations","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Collation"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Collation$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnOrigin",
+ "methods":[{"name":"getColumnOrigins","parameterTypes":["int"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnOrigin"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnOrigin$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness",
+ "methods":[{"name":"areColumnsUnique","parameterTypes":["org.apache.calcite.util.ImmutableBitSet","boolean"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ColumnUniqueness$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost",
+ "methods":[{"name":"getCumulativeCost","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$CumulativeCost$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$DistinctRowCount",
+ "methods":[{"name":"getDistinctRowCount","parameterTypes":["org.apache.calcite.util.ImmutableBitSet","org.apache.calcite.rex.RexNode"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$DistinctRowCount"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$DistinctRowCount$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Distribution",
+ "methods":[{"name":"distribution","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Distribution"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Distribution$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility",
+ "methods":[{"name":"isVisibleInExplain","parameterTypes":["org.apache.calcite.sql.SqlExplainLevel"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ExplainVisibility$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ExpressionLineage",
+ "methods":[{"name":"getExpressionLineage","parameterTypes":["org.apache.calcite.rex.RexNode"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$ExpressionLineage"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$ExpressionLineage$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$LowerBoundCost",
+ "methods":[{"name":"getLowerBoundCost","parameterTypes":["org.apache.calcite.plan.volcano.VolcanoPlanner"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$LowerBoundCost"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$LowerBoundCost$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$MaxRowCount",
+ "methods":[{"name":"getMaxRowCount","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$MaxRowCount"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$MaxRowCount$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Memory",
+ "methods":[{"name":"cumulativeMemoryWithinPhase","parameterTypes":[] }, {"name":"cumulativeMemoryWithinPhaseSplit","parameterTypes":[] }, {"name":"memory","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Memory"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Memory$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$MinRowCount",
+ "methods":[{"name":"getMinRowCount","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$MinRowCount"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$MinRowCount$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$NodeTypes",
+ "methods":[{"name":"getNodeTypes","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$NodeTypes"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$NodeTypes$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost",
+ "methods":[{"name":"getNonCumulativeCost","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$NonCumulativeCost$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Parallelism",
+ "methods":[{"name":"isPhaseTransition","parameterTypes":[] }, {"name":"splitCount","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Parallelism"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Parallelism$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$PercentageOriginalRows",
+ "methods":[{"name":"getPercentageOriginalRows","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$PercentageOriginalRows"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$PercentageOriginalRows$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$PopulationSize",
+ "methods":[{"name":"getPopulationSize","parameterTypes":["org.apache.calcite.util.ImmutableBitSet"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$PopulationSize"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$PopulationSize$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Predicates",
+ "methods":[{"name":"getPredicates","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Predicates"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Predicates$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount",
+ "methods":[{"name":"getRowCount","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$RowCount$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity",
+ "methods":[{"name":"getSelectivity","parameterTypes":["org.apache.calcite.rex.RexNode"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Selectivity$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Size",
+ "methods":[{"name":"averageColumnSizes","parameterTypes":[] }, {"name":"averageRowSize","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$Size"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$Size$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$TableReferences",
+ "methods":[{"name":"getTableReferences","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$TableReferences"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$TableReferences$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$UniqueKeys",
+ "methods":[{"name":"getUniqueKeys","parameterTypes":["boolean"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.BuiltInMetadata$UniqueKeys"},
+ "name":"org.apache.calcite.rel.metadata.BuiltInMetadata$UniqueKeys$Handler",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.rel.metadata.Metadata",
+ "methods":[{"name":"rel","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdAllPredicates"},
+ "name":"org.apache.calcite.rel.metadata.RelMdAllPredicates",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdCollation"},
+ "name":"org.apache.calcite.rel.metadata.RelMdCollation",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdColumnOrigins"},
+ "name":"org.apache.calcite.rel.metadata.RelMdColumnOrigins",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdColumnUniqueness"},
+ "name":"org.apache.calcite.rel.metadata.RelMdColumnUniqueness",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdDistinctRowCount"},
+ "name":"org.apache.calcite.rel.metadata.RelMdDistinctRowCount",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdDistribution"},
+ "name":"org.apache.calcite.rel.metadata.RelMdDistribution",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdExplainVisibility"},
+ "name":"org.apache.calcite.rel.metadata.RelMdExplainVisibility",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdExpressionLineage"},
+ "name":"org.apache.calcite.rel.metadata.RelMdExpressionLineage",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdLowerBoundCost"},
+ "name":"org.apache.calcite.rel.metadata.RelMdLowerBoundCost",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdMaxRowCount"},
+ "name":"org.apache.calcite.rel.metadata.RelMdMaxRowCount",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdMemory"},
+ "name":"org.apache.calcite.rel.metadata.RelMdMemory",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdMinRowCount"},
+ "name":"org.apache.calcite.rel.metadata.RelMdMinRowCount",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdNodeTypes"},
+ "name":"org.apache.calcite.rel.metadata.RelMdNodeTypes",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdParallelism"},
+ "name":"org.apache.calcite.rel.metadata.RelMdParallelism",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows"},
+ "name":"org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows$RelMdCumulativeCost",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows"},
+ "name":"org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows$RelMdNonCumulativeCost",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows"},
+ "name":"org.apache.calcite.rel.metadata.RelMdPercentageOriginalRows$RelMdPercentageOriginalRowsHandler",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdPopulationSize"},
+ "name":"org.apache.calcite.rel.metadata.RelMdPopulationSize",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdPredicates"},
+ "name":"org.apache.calcite.rel.metadata.RelMdPredicates",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdRowCount"},
+ "name":"org.apache.calcite.rel.metadata.RelMdRowCount",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdSelectivity"},
+ "name":"org.apache.calcite.rel.metadata.RelMdSelectivity",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdSize"},
+ "name":"org.apache.calcite.rel.metadata.RelMdSize",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdTableReferences"},
+ "name":"org.apache.calcite.rel.metadata.RelMdTableReferences",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.rel.metadata.RelMdUniqueKeys"},
+ "name":"org.apache.calcite.rel.metadata.RelMdUniqueKeys",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.ArrayBindable",
+ "methods":[{"name":"getElementType","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.BinarySearch",
+ "methods":[{"name":"lowerBound","parameterTypes":["java.lang.Object[]","java.lang.Object","int","int","java.util.Comparator"] }, {"name":"lowerBound","parameterTypes":["java.lang.Object[]","java.lang.Object","int","int","org.apache.calcite.linq4j.function.Function1","java.util.Comparator"] }, {"name":"upperBound","parameterTypes":["java.lang.Object[]","java.lang.Object","int","int","java.util.Comparator"] }, {"name":"upperBound","parameterTypes":["java.lang.Object[]","java.lang.Object","int","int","org.apache.calcite.linq4j.function.Function1","java.util.Comparator"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Bindable",
+ "methods":[{"name":"bind","parameterTypes":["org.apache.calcite.DataContext"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.CompressionFunctions",
+ "methods":[{"name":"compress","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Enumerables",
+ "methods":[{"name":"match","parameterTypes":["org.apache.calcite.linq4j.Enumerable","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.runtime.Matcher","org.apache.calcite.runtime.Enumerables$Emitter","int","int"] }, {"name":"slice0","parameterTypes":["org.apache.calcite.linq4j.Enumerable"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Enumerables$Emitter",
+ "methods":[{"name":"emit","parameterTypes":["java.util.List","java.util.List","java.util.List","int","java.util.function.Consumer"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.FlatLists",
+ "fields":[{"name":"COMPARABLE_EMPTY_LIST"}],
+ "methods":[{"name":"copyOf","parameterTypes":["java.lang.Comparable[]"] }, {"name":"of","parameterTypes":["java.lang.Object","java.lang.Object"] }, {"name":"of","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object"] }, {"name":"of","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object","java.lang.Object"] }, {"name":"of","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object","java.lang.Object","java.lang.Object"] }, {"name":"of","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object","java.lang.Object","java.lang.Object","java.lang.Object"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.FunctionContexts",
+ "methods":[{"name":"of","parameterTypes":["org.apache.calcite.DataContext","java.lang.Object[]"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.JsonFunctions",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"dejsonize","parameterTypes":["java.lang.String"] }, {"name":"isJsonArray","parameterTypes":["java.lang.String"] }, {"name":"isJsonObject","parameterTypes":["java.lang.String"] }, {"name":"isJsonScalar","parameterTypes":["java.lang.String"] }, {"name":"isJsonValue","parameterTypes":["java.lang.String"] }, {"name":"jsonApiCommonSyntax","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"jsonArray","parameterTypes":["org.apache.calcite.sql.SqlJsonConstructorNullClause"] }, {"name":"jsonArrayAggAdd","parameterTypes":["java.util.List","java.lang.Object","org.apache.calcite.sql.SqlJsonConstructorNullClause"] }, {"name":"jsonDepth","parameterTypes":["java.lang.String"] }, {"name":"jsonExists","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"jsonInsert","parameterTypes":["java.lang.String","java.lang.Object"] }, {"name":"jsonKeys","parameterTypes":["java.lang.String"] }, {"name":"jsonLength","parameterTypes":["java.lang.String"] }, {"name":"jsonObject","parameterTypes":["org.apache.calcite.sql.SqlJsonConstructorNullClause"] }, {"name":"jsonObjectAggAdd","parameterTypes":["java.util.Map","java.lang.String","java.lang.Object","org.apache.calcite.sql.SqlJsonConstructorNullClause"] }, {"name":"jsonPretty","parameterTypes":["java.lang.String"] }, {"name":"jsonQuery","parameterTypes":["java.lang.String","java.lang.String","org.apache.calcite.sql.SqlJsonQueryWrapperBehavior","org.apache.calcite.sql.SqlJsonQueryEmptyOrErrorBehavior","org.apache.calcite.sql.SqlJsonQueryEmptyOrErrorBehavior"] }, {"name":"jsonRemove","parameterTypes":["java.lang.String"] }, {"name":"jsonReplace","parameterTypes":["java.lang.String","java.lang.Object"] }, {"name":"jsonSet","parameterTypes":["java.lang.String","java.lang.Object"] }, {"name":"jsonStorageSize","parameterTypes":["java.lang.String"] }, {"name":"jsonType","parameterTypes":["java.lang.String"] }, {"name":"jsonValue","parameterTypes":["java.lang.String","java.lang.String","org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior","java.lang.Object","org.apache.calcite.sql.SqlJsonValueEmptyOrErrorBehavior","java.lang.Object"] }, {"name":"jsonValueExpression","parameterTypes":["java.lang.String"] }, {"name":"jsonize","parameterTypes":["java.lang.Object"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Matcher",
+ "methods":[{"name":"builder","parameterTypes":["org.apache.calcite.runtime.Automaton"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Matcher$Builder",
+ "methods":[{"name":"add","parameterTypes":["java.lang.String","java.util.function.Predicate"] }, {"name":"build","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.PairList",
+ "methods":[{"name":"copyOf","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object[]"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Pattern$PatternBuilder",
+ "methods":[{"name":"automaton","parameterTypes":[] }, {"name":"build","parameterTypes":[] }, {"name":"seq","parameterTypes":[] }, {"name":"symbol","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.RandomFunction",
+ "methods":[{"name":"rand","parameterTypes":[] }, {"name":"randInteger","parameterTypes":["int"] }, {"name":"randIntegerSeed","parameterTypes":["int","int"] }, {"name":"randSeed","parameterTypes":["int"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.ResultSetEnumerable",
+ "methods":[{"name":"createEnricher","parameterTypes":["java.lang.Integer[]","org.apache.calcite.DataContext"] }, {"name":"of","parameterTypes":["javax.sql.DataSource","java.lang.String","org.apache.calcite.linq4j.function.Function1"] }, {"name":"of","parameterTypes":["javax.sql.DataSource","java.lang.String","org.apache.calcite.linq4j.function.Function1","org.apache.calcite.runtime.ResultSetEnumerable$PreparedStatementEnricher"] }, {"name":"setTimeout","parameterTypes":["org.apache.calcite.DataContext"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.SortedMultiMap",
+ "methods":[{"name":"arrays","parameterTypes":["java.util.Comparator"] }, {"name":"putMulti","parameterTypes":["java.lang.Object","java.lang.Object"] }, {"name":"singletonArrayIterator","parameterTypes":["java.util.Comparator","java.util.List"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.SpatialTypeFunctions",
+ "methods":[{"name":"ST_GeomFromEWKT","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.SqlFunctions",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"array","parameterTypes":["java.lang.Object[]"] }, {"name":"arrayAppend","parameterTypes":["java.util.List","java.lang.Object"] }, {"name":"arrayExcept","parameterTypes":["java.util.List","java.util.List"] }, {"name":"arrayIntersect","parameterTypes":["java.util.List","java.util.List"] }, {"name":"arrayItemOptional","parameterTypes":["java.util.List","int","int","boolean"] }, {"name":"arrayMax","parameterTypes":["java.util.List"] }, {"name":"arrayMin","parameterTypes":["java.util.List"] }, {"name":"arrayPosition","parameterTypes":["java.util.List","java.lang.Object"] }, {"name":"arrayPrepend","parameterTypes":["java.util.List","java.lang.Object"] }, {"name":"arrayRemove","parameterTypes":["java.util.List","java.lang.Object"] }, {"name":"arrayToList","parameterTypes":["java.sql.Array"] }, {"name":"arrayUnion","parameterTypes":["java.util.List","java.util.List"] }, {"name":"arraysOverlap","parameterTypes":["java.util.List","java.util.List"] }, {"name":"arraysZip","parameterTypes":["java.util.List","java.util.List"] }, {"name":"ascii","parameterTypes":["java.lang.String"] }, {"name":"bitAnd","parameterTypes":["long","long"] }, {"name":"bitLength","parameterTypes":["java.lang.String"] }, {"name":"bitOr","parameterTypes":["long","long"] }, {"name":"bitXor","parameterTypes":["long","long"] }, {"name":"ceil","parameterTypes":["int","int"] }, {"name":"charFromAscii","parameterTypes":["int"] }, {"name":"charFromUtf8","parameterTypes":["int"] }, {"name":"charLength","parameterTypes":["java.lang.String"] }, {"name":"compact","parameterTypes":["java.util.List"] }, {"name":"concat","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"concatMulti","parameterTypes":["java.lang.String[]"] }, {"name":"concatMultiWithNull","parameterTypes":["java.lang.String[]"] }, {"name":"concatMultiWithSeparator","parameterTypes":["java.lang.String[]"] }, {"name":"concatWithNull","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"convertWithCharset","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"cosh","parameterTypes":["long"] }, {"name":"currentDate","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"currentTime","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"currentTimestamp","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"customDateAdd","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","int","int"] }, {"name":"customDateCeil","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","int"] }, {"name":"customDateDiff","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","int","int"] }, {"name":"customDateFloor","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","int"] }, {"name":"customTimestampAdd","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","long","long"] }, {"name":"customTimestampCeil","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","long"] }, {"name":"customTimestampDiff","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","long","long"] }, {"name":"customTimestampFloor","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","long"] }, {"name":"dayNameWithDate","parameterTypes":["int","java.util.Locale"] }, {"name":"dayNameWithTimestamp","parameterTypes":["long","java.util.Locale"] }, {"name":"difference","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"distinct","parameterTypes":["java.util.List"] }, {"name":"element","parameterTypes":["java.util.List"] }, {"name":"endsWith","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"flatList","parameterTypes":[] }, {"name":"flatProduct","parameterTypes":["int[]","boolean","org.apache.calcite.runtime.SqlFunctions$FlatProductInputType[]"] }, {"name":"floor","parameterTypes":["int","int"] }, {"name":"formatDate","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","int"] }, {"name":"formatTime","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","int"] }, {"name":"formatTimestamp","parameterTypes":["org.apache.calcite.DataContext","java.lang.String","long"] }, {"name":"fromBase32","parameterTypes":["java.lang.String"] }, {"name":"fromBase64","parameterTypes":["java.lang.String"] }, {"name":"fromHex","parameterTypes":["java.lang.String"] }, {"name":"greater","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"gt","parameterTypes":["boolean","boolean"] }, {"name":"gtNullable","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"ilike","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"initcap","parameterTypes":["java.lang.String"] }, {"name":"internalToDate","parameterTypes":["int"] }, {"name":"internalToTime","parameterTypes":["int"] }, {"name":"internalToTimestamp","parameterTypes":["long"] }, {"name":"isASet","parameterTypes":["java.util.Collection"] }, {"name":"isNotFalse","parameterTypes":["java.lang.Boolean"] }, {"name":"isTrue","parameterTypes":["java.lang.Boolean"] }, {"name":"itemOptional","parameterTypes":["java.lang.Object","java.lang.Object"] }, {"name":"left","parameterTypes":["java.lang.String","int"] }, {"name":"lesser","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"like","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"localTime","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"localTimestamp","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"locale","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"log","parameterTypes":["long","long"] }, {"name":"lower","parameterTypes":["java.lang.String"] }, {"name":"lpad","parameterTypes":["java.lang.String","int","java.lang.String"] }, {"name":"lt","parameterTypes":["boolean","boolean"] }, {"name":"ltNullable","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"ltrim","parameterTypes":["java.lang.String"] }, {"name":"mapConcat","parameterTypes":["java.util.Map[]"] }, {"name":"mapEntries","parameterTypes":["java.util.Map"] }, {"name":"mapFromArrays","parameterTypes":["java.util.List","java.util.List"] }, {"name":"mapFromEntries","parameterTypes":["java.util.List"] }, {"name":"mapItemOptional","parameterTypes":["java.util.Map","java.lang.Object"] }, {"name":"mapKeys","parameterTypes":["java.util.Map"] }, {"name":"mapValues","parameterTypes":["java.util.Map"] }, {"name":"md5","parameterTypes":["java.lang.String"] }, {"name":"memberOf","parameterTypes":["java.lang.Object","java.util.Collection"] }, {"name":"monthNameWithDate","parameterTypes":["int","java.util.Locale"] }, {"name":"monthNameWithTimestamp","parameterTypes":["long","java.util.Locale"] }, {"name":"multisetExceptAll","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"multisetExceptDistinct","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"multisetIntersectAll","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"multisetIntersectDistinct","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"multisetUnionAll","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"multisetUnionDistinct","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"not","parameterTypes":["java.lang.Boolean"] }, {"name":"nullableAll","parameterTypes":["java.util.List","org.apache.calcite.linq4j.function.Function1"] }, {"name":"nullableExists","parameterTypes":["java.util.List","org.apache.calcite.linq4j.function.Function1"] }, {"name":"octetLength","parameterTypes":["org.apache.calcite.avatica.util.ByteString"] }, {"name":"overlay","parameterTypes":["java.lang.String","java.lang.String","int"] }, {"name":"overlay","parameterTypes":["java.lang.String","java.lang.String","int","int"] }, {"name":"position","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"posixRegex","parameterTypes":["java.lang.String","java.lang.String","boolean"] }, {"name":"regexpReplace","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"regexpReplace","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","int"] }, {"name":"regexpReplace","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","int","int"] }, {"name":"regexpReplace","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","int","int","java.lang.String"] }, {"name":"repeat","parameterTypes":["java.lang.Object","java.lang.Integer"] }, {"name":"repeat","parameterTypes":["java.lang.String","int"] }, {"name":"replace","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"reverse","parameterTypes":["java.lang.String"] }, {"name":"reverse","parameterTypes":["java.util.List"] }, {"name":"right","parameterTypes":["java.lang.String","int"] }, {"name":"rlike","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"round","parameterTypes":["int","int"] }, {"name":"round","parameterTypes":["long","long"] }, {"name":"rpad","parameterTypes":["java.lang.String","int","java.lang.String"] }, {"name":"rtrim","parameterTypes":["java.lang.String"] }, {"name":"sequenceCurrentValue","parameterTypes":["java.lang.String"] }, {"name":"sequenceNextValue","parameterTypes":["java.lang.String"] }, {"name":"sha1","parameterTypes":["java.lang.String"] }, {"name":"sha256","parameterTypes":["java.lang.String"] }, {"name":"sha512","parameterTypes":["java.lang.String"] }, {"name":"similar","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"sinh","parameterTypes":["long"] }, {"name":"slice","parameterTypes":["java.util.List"] }, {"name":"sortArray","parameterTypes":["java.util.List","boolean"] }, {"name":"soundex","parameterTypes":["java.lang.String"] }, {"name":"space","parameterTypes":["int"] }, {"name":"startsWith","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"strToMap","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"strcmp","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"structAccess","parameterTypes":["java.lang.Object","int","java.lang.String"] }, {"name":"submultisetOf","parameterTypes":["java.util.Collection","java.util.Collection"] }, {"name":"substring","parameterTypes":["java.lang.String","int","int"] }, {"name":"systemUser","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"tanh","parameterTypes":["long"] }, {"name":"throwUnless","parameterTypes":["boolean","java.lang.String"] }, {"name":"timeWithLocalTimeZoneToString","parameterTypes":["int","java.util.TimeZone"] }, {"name":"timeWithLocalTimeZoneToTime","parameterTypes":["int","java.util.TimeZone"] }, {"name":"timeWithLocalTimeZoneToTimestamp","parameterTypes":["java.lang.String","int","java.util.TimeZone"] }, {"name":"timeWithLocalTimeZoneToTimestampWithLocalTimeZone","parameterTypes":["java.lang.String","int"] }, {"name":"timeZone","parameterTypes":["org.apache.calcite.DataContext"] }, {"name":"timestampToDate","parameterTypes":["long"] }, {"name":"timestampWithLocalTimeZoneToDate","parameterTypes":["long","java.util.TimeZone"] }, {"name":"timestampWithLocalTimeZoneToString","parameterTypes":["long","java.util.TimeZone"] }, {"name":"timestampWithLocalTimeZoneToTime","parameterTypes":["long","java.util.TimeZone"] }, {"name":"timestampWithLocalTimeZoneToTimeWithLocalTimeZone","parameterTypes":["long"] }, {"name":"timestampWithLocalTimeZoneToTimestamp","parameterTypes":["long","java.util.TimeZone"] }, {"name":"toBase32","parameterTypes":["java.lang.String"] }, {"name":"toBase64","parameterTypes":["java.lang.String"] }, {"name":"toBoolean","parameterTypes":["java.lang.String"] }, {"name":"toChar","parameterTypes":["long","java.lang.String"] }, {"name":"toHex","parameterTypes":["org.apache.calcite.avatica.util.ByteString"] }, {"name":"toInt","parameterTypes":["java.sql.Date"] }, {"name":"toInt","parameterTypes":["java.sql.Date","java.util.TimeZone"] }, {"name":"toInt","parameterTypes":["java.sql.Time"] }, {"name":"toIntOptional","parameterTypes":["java.sql.Date"] }, {"name":"toIntOptional","parameterTypes":["java.sql.Date","java.util.TimeZone"] }, {"name":"toIntOptional","parameterTypes":["java.sql.Time"] }, {"name":"toLong","parameterTypes":["java.sql.Timestamp"] }, {"name":"toLong","parameterTypes":["java.sql.Timestamp","java.util.TimeZone"] }, {"name":"toLongOptional","parameterTypes":["java.sql.Timestamp"] }, {"name":"toLongOptional","parameterTypes":["java.sql.Timestamp","java.util.TimeZone"] }, {"name":"toString","parameterTypes":["boolean"] }, {"name":"toTimeWithLocalTimeZone","parameterTypes":["java.lang.String"] }, {"name":"toTimeWithLocalTimeZone","parameterTypes":["java.lang.String","java.util.TimeZone"] }, {"name":"toTimestampWithLocalTimeZone","parameterTypes":["java.lang.String"] }, {"name":"toTimestampWithLocalTimeZone","parameterTypes":["java.lang.String","java.util.TimeZone"] }, {"name":"translate3","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"translateWithCharset","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"trim","parameterTypes":["boolean","boolean","java.lang.String","java.lang.String","boolean"] }, {"name":"truncate","parameterTypes":["java.lang.String","int"] }, {"name":"truncateOrPad","parameterTypes":["java.lang.String","int"] }, {"name":"upper","parameterTypes":["java.lang.String"] }, {"name":"user","parameterTypes":["org.apache.calcite.DataContext"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.Utilities",
+ "methods":[{"name":"compare","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"compare","parameterTypes":["java.lang.Comparable","java.lang.Comparable","java.util.Comparator"] }, {"name":"compareNullsFirst","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"compareNullsFirst","parameterTypes":["java.lang.Comparable","java.lang.Comparable","java.util.Comparator"] }, {"name":"compareNullsLast","parameterTypes":["java.lang.Comparable","java.lang.Comparable"] }, {"name":"compareNullsLast","parameterTypes":["java.lang.Comparable","java.lang.Comparable","java.util.Comparator"] }, {"name":"hash","parameterTypes":["int","java.lang.Object"] }, {"name":"patternBuilder","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.runtime.XmlFunctions",
+ "methods":[{"name":"existsNode","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"extractValue","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"extractXml","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"xmlTransform","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.schema.ModifiableTable",
+ "methods":[{"name":"getModifiableCollection","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.schema.QueryableTable",
+ "methods":[{"name":"asQueryable","parameterTypes":["org.apache.calcite.linq4j.QueryProvider","org.apache.calcite.schema.SchemaPlus","java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.schema.ScannableTable",
+ "methods":[{"name":"scan","parameterTypes":["org.apache.calcite.DataContext"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.schema.Schema",
+ "methods":[{"name":"getSubSchema","parameterTypes":["java.lang.String"] }, {"name":"getTable","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.schema.SchemaPlus",
+ "methods":[{"name":"add","parameterTypes":["java.lang.String","org.apache.calcite.schema.Table"] }, {"name":"removeTable","parameterTypes":["java.lang.String"] }, {"name":"unwrap","parameterTypes":["java.lang.Class"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.linq4j.tree.Types"},
+ "name":"org.apache.calcite.schema.Schemas",
+ "methods":[{"name":"enumerable","parameterTypes":["org.apache.calcite.schema.FilterableTable","org.apache.calcite.DataContext"] }, {"name":"enumerable","parameterTypes":["org.apache.calcite.schema.ProjectableFilterableTable","org.apache.calcite.DataContext"] }, {"name":"enumerable","parameterTypes":["org.apache.calcite.schema.ScannableTable","org.apache.calcite.DataContext"] }, {"name":"queryable","parameterTypes":["org.apache.calcite.DataContext","org.apache.calcite.schema.SchemaPlus","java.lang.Class","java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory"},
+ "name":"org.apache.calcite.sql.fun.SqlLibraryOperators",
+ "allPublicFields":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.sql.util.ReflectiveSqlOperatorTable"},
+ "name":"org.apache.calcite.sql.fun.SqlStdOperatorTable",
+ "allPublicFields":true
+},
+{
+ "condition":{"typeReachable":"org.apache.calcite.sql2rel.ReflectiveConvertletTable"},
+ "name":"org.apache.calcite.sql2rel.StandardConvertletTable",
+ "queryAllPublicMethods":true
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.groovy/groovy/4.0.10/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.groovy/groovy/4.0.10/reflect-config.json
new file mode 100644
index 00000000000000..5449d84e76d290
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.groovy/groovy/4.0.10/reflect-config.json
@@ -0,0 +1,250 @@
+[
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.io.FileType"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.lang.Buildable",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.Closure"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.EmptyRange"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.lang.ExpandoMetaClass",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.GString"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.stdclasses.CachedClosureClass"},
+ "name":"groovy.lang.GroovyCallable",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.GroovyObject"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.stdclasses.CachedClosureClass"},
+ "name":"groovy.lang.GroovyObject",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.IntRange"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.ListWithDefault"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.MetaClass"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.lang.MetaClass",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.lang.MetaObjectProtocol",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.MetaProperty"
+},
+{
+ "condition":{"typeReachable":"groovy.lang.MetaClassImpl"},
+ "name":"groovy.lang.MutableMetaClass",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.ObjectRange"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.Range"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.SpreadMap"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.Writable"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.lang.Writable",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.lang.groovydoc.Groovydoc"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.runtime.metaclass.CustomMetaClassCreationHandle"
+},
+{
+ "condition":{"typeReachable":"groovy.lang.Binding"},
+ "name":"groovy.runtime.metaclass.groovy.lang.BindingMetaClass"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"groovy.runtime.metaclass.groovy.lang.ExpandoMetaClassMetaClass"
+},
+{
+ "condition":{"typeReachable":"groovy.lang.GroovyShell"},
+ "name":"groovy.runtime.metaclass.groovy.lang.GroovyShellMetaClass"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"groovy.util.BufferedIterator"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"java.lang.Thread"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"org.codehaus.groovy.runtime.GStringImpl"
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.reflection.GeneratedMetaMethod$DgmMethodRecord"},
+ "name":"org.codehaus.groovy.runtime.NullObject"
+},
+{
+ "condition":{"typeReachable":"groovy.lang.MetaClassImpl"},
+ "name":"org.codehaus.groovy.runtime.callsite.CallSite",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.NumberNumberDiv",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.NumberNumberMinus",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.NumberNumberMultiply",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.NumberNumberPlus",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.BooleanArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.BooleanArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.ByteArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.ByteArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.CharacterArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.CharacterArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.DoubleArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.DoubleArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.FloatArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.FloatArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.LongArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.LongArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.ObjectArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.ObjectArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.ShortArrayGetAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl"},
+ "name":"org.codehaus.groovy.runtime.dgmimpl.arrays.ShortArrayPutAtMetaMethod",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.codehaus.groovy.vmplugin.VMPluginFactory"},
+ "name":"org.codehaus.groovy.vmplugin.v16.Java16",
+ "methods":[{"name":"","parameterTypes":[] }]
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere.elasticjob/elasticjob-lite-core/3.0.4/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere.elasticjob/elasticjob-lite-core/3.0.4/reflect-config.json
new file mode 100644
index 00000000000000..0f72d7a24a1073
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere.elasticjob/elasticjob-lite-core/3.0.4/reflect-config.json
@@ -0,0 +1,80 @@
+[
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor"},
+ "name":"java.util.Properties",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.failover.FailoverListenerManager"},
+ "name":"java.util.Properties",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.reconcile.ReconcileService"},
+ "name":"java.util.Properties",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingListenerManager$ListenServersChangedJobListener"},
+ "name":"java.util.Properties",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingListenerManager$ShardingTotalCountChangedJobListener"},
+ "name":"java.util.Properties",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.instance.InstanceNode"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.handler.sharding.JobInstance",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getJobInstanceId","parameterTypes":[] }, {"name":"getLabels","parameterTypes":[] }, {"name":"getServerIp","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "methods":[{"name":"setCron","parameterTypes":["java.lang.String"] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.infra.yaml.YamlEngine"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "allDeclaredFields":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setDescription","parameterTypes":["java.lang.String"] }, {"name":"setDisabled","parameterTypes":["boolean"] }, {"name":"setFailover","parameterTypes":["boolean"] }, {"name":"setJobName","parameterTypes":["java.lang.String"] }, {"name":"setJobParameter","parameterTypes":["java.lang.String"] }, {"name":"setMaxTimeDiffSeconds","parameterTypes":["int"] }, {"name":"setMisfire","parameterTypes":["boolean"] }, {"name":"setMonitorExecution","parameterTypes":["boolean"] }, {"name":"setOverwrite","parameterTypes":["boolean"] }, {"name":"setReconcileIntervalMinutes","parameterTypes":["int"] }, {"name":"setShardingItemParameters","parameterTypes":["java.lang.String"] }, {"name":"setShardingTotalCount","parameterTypes":["int"] }, {"name":"setStaticSharding","parameterTypes":["boolean"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "methods":[{"name":"setCron","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.config.ConfigurationService"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getCron","parameterTypes":[] }, {"name":"getDescription","parameterTypes":[] }, {"name":"getJobErrorHandlerType","parameterTypes":[] }, {"name":"getJobExecutorServiceHandlerType","parameterTypes":[] }, {"name":"getJobExtraConfigurations","parameterTypes":[] }, {"name":"getJobListenerTypes","parameterTypes":[] }, {"name":"getJobName","parameterTypes":[] }, {"name":"getJobParameter","parameterTypes":[] }, {"name":"getJobShardingStrategyType","parameterTypes":[] }, {"name":"getLabel","parameterTypes":[] }, {"name":"getMaxTimeDiffSeconds","parameterTypes":[] }, {"name":"getProps","parameterTypes":[] }, {"name":"getReconcileIntervalMinutes","parameterTypes":[] }, {"name":"getShardingItemParameters","parameterTypes":[] }, {"name":"getShardingTotalCount","parameterTypes":[] }, {"name":"getTimeZone","parameterTypes":[] }, {"name":"isDisabled","parameterTypes":[] }, {"name":"isFailover","parameterTypes":[] }, {"name":"isMisfire","parameterTypes":[] }, {"name":"isMonitorExecution","parameterTypes":[] }, {"name":"isOverwrite","parameterTypes":[] }, {"name":"isStaticSharding","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.failover.FailoverListenerManager"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "methods":[{"name":"setCron","parameterTypes":["java.lang.String"] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.reconcile.ReconcileService"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "methods":[{"name":"setCron","parameterTypes":["java.lang.String"] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingListenerManager$ListenServersChangedJobListener"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "methods":[{"name":"setCron","parameterTypes":["java.lang.String"] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingListenerManager$ShardingTotalCountChangedJobListener"},
+ "name":"org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO",
+ "methods":[{"name":"setCron","parameterTypes":["java.lang.String"] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduler"},
+ "name":"org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobShutdownHookPlugin",
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setCleanShutdown","parameterTypes":["boolean"] }]
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere.elasticjob/elasticjob-lite-core/3.0.4/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere.elasticjob/elasticjob-lite-core/3.0.4/resource-config.json
new file mode 100644
index 00000000000000..cba6a606abc03b
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere.elasticjob/elasticjob-lite-core/3.0.4/resource-config.json
@@ -0,0 +1,29 @@
+{
+ "resources":{
+ "includes":[{
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduler"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandlerPropertiesValidator\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandlerFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.error.handler.JobErrorHandler\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.executor.item.JobItemExecutorFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.executor.item.impl.ClassedJobItemExecutor\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.executor.item.JobItemExecutorFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.executor.item.impl.TypedJobItemExecutor\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.executor.context.ExecutorContext"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.infra.context.Reloadable\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.infra.handler.threadpool.JobExecutorServiceHandlerFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.infra.handler.threadpool.JobExecutorServiceHandler\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.lite.internal.setup.JobClassNameProviderFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.lite.internal.setup.JobClassNameProvider\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.elasticjob.reg.exception.RegExceptionHandler"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.elasticjob.reg.exception.IgnoredExceptionProvider\\E"
+ }]},
+ "bundles":[]
+}
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json
new file mode 100644
index 00000000000000..dcc0a39e137ac2
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json
@@ -0,0 +1,706 @@
+[
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationPlannerUtils"},
+ "name":"[B"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.datasource.pool.CatalogSwitchableDataSource"},
+ "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository"},
+ "name":"[Lcom.zaxxer.hikari.util.ConcurrentBag$IConcurrentBagEntry;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationPlannerUtils"},
+ "name":"[Ljava.lang.String;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.DatabaseTypeEngine"},
+ "name":"[Ljava.sql.Statement;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager"},
+ "name":"[Ljava.sql.Statement;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository"},
+ "name":"[Ljava.sql.Statement;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationPlannerUtils"},
+ "name":"[Lsun.security.pkcs.SignerInfo;"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"},
+ "name":"java.lang.Boolean"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.groovy.GroovyInlineExpressionParser"},
+ "name":"java.lang.Thread"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngineFactory"},
+ "name":"java.lang.Thread",
+ "fields":[{"name":"threadLocalRandomProbe"}]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"},
+ "name":"java.util.Properties",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.authority.rule.AuthorityRule"},
+ "name":"org.apache.shardingsphere.authority.provider.database.DatabasePermittedAuthorityRegistryProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.authority.rule.AuthorityRule"},
+ "name":"org.apache.shardingsphere.authority.provider.simple.AllPermittedAuthorityRegistryProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.authority.yaml.config.YamlAuthorityRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration"},
+ "name":"org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setTables","parameterTypes":["java.util.Collection"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.broadcast.yaml.swapper.NewYamlBroadcastRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getTables","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository"},
+ "name":"org.apache.shardingsphere.driver.ShardingSphereDriver"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.driver.api.yaml.YamlJDBCConfiguration"},
+ "name":"org.apache.shardingsphere.driver.api.yaml.YamlJDBCConfiguration",
+ "methods":[{"name":"setSqlParser","parameterTypes":["org.apache.shardingsphere.parser.yaml.config.YamlSQLParserRuleConfiguration"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"},
+ "name":"org.apache.shardingsphere.driver.api.yaml.YamlJDBCConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setDataSources","parameterTypes":["java.util.Map"] }, {"name":"setMode","parameterTypes":["org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlModeConfiguration"] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }, {"name":"setRules","parameterTypes":["java.util.Collection"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.rule.EncryptRule"},
+ "name":"org.apache.shardingsphere.encrypt.algorithm.assisted.MD5AssistedEncryptAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.rule.EncryptRule"},
+ "name":"org.apache.shardingsphere.encrypt.algorithm.standard.AESEncryptAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.YamlCompatibleEncryptRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.yaml.config.YamlEncryptRuleConfiguration"},
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.YamlEncryptRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setEncryptors","parameterTypes":["java.util.Map"] }, {"name":"setTables","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.YamlEncryptRuleConfiguration"
+},
+{
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptColumnItemRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getEncryptorName","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"setEncryptorName","parameterTypes":["java.lang.String"] }, {"name":"setName","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptColumnRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getAssistedQuery","parameterTypes":[] }, {"name":"getCipher","parameterTypes":[] }, {"name":"getLikeQuery","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"setAssistedQuery","parameterTypes":["org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptColumnItemRuleConfiguration"] }, {"name":"setCipher","parameterTypes":["org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptColumnItemRuleConfiguration"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptTableRuleConfiguration"},
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptTableRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setColumns","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.yaml.swapper.NewYamlEncryptRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.encrypt.yaml.config.rule.YamlEncryptTableRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getColumns","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.globalclock.core.yaml.config.YamlGlobalClockRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder"},
+ "name":"org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.yaml.swapper.NewYamlEncryptRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }, {"name":"setType","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.yaml.swapper.NewYamlMaskRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.yaml.swapper.NewYamlShadowRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.swapper.NewYamlShardingRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getProps","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlModeConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setRepository","parameterTypes":["org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration"] }, {"name":"setType","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setType","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.constructor.ShardingSphereYamlConstructor"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.representer.ShardingSphereYamlRepresenter"},
+ "name":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.service.schema.NewTableMetaDataPersistService"},
+ "name":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getColumns","parameterTypes":[] }, {"name":"getConstraints","parameterTypes":[] }, {"name":"getIndexes","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.logging.yaml.config.YamlLoggingRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.cover.KeepFirstNLastMMaskAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.cover.KeepFromXToYMaskAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.cover.MaskAfterSpecialCharsAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.cover.MaskBeforeSpecialCharsAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.cover.MaskFirstNLastMMaskAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.cover.MaskFromXToYMaskAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.hash.MD5MaskAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.rule.MaskRule"},
+ "name":"org.apache.shardingsphere.mask.algorithm.replace.GenericTableRandomReplaceAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.mask.yaml.config.YamlMaskRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.yaml.config.YamlMaskRuleConfiguration"},
+ "name":"org.apache.shardingsphere.mask.yaml.config.YamlMaskRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setMaskAlgorithms","parameterTypes":["java.util.Map"] }, {"name":"setTables","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskColumnRuleConfiguration"},
+ "name":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskColumnRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getLogicColumn","parameterTypes":[] }, {"name":"getMaskAlgorithm","parameterTypes":[] }, {"name":"setMaskAlgorithm","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfiguration"},
+ "name":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setColumns","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mask.yaml.swapper.NewYamlMaskRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getColumns","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"},
+ "name":"org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneProcessSubscriber",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"},
+ "name":"org.apache.shardingsphere.mode.process.ProcessSubscriber",
+ "queryAllDeclaredMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.NewStandaloneContextManagerBuilder"},
+ "name":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader$2"},
+ "name":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQL",
+ "allDeclaredFields":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.parser.yaml.config.YamlSQLParserCacheOptionRuleConfiguration"},
+ "name":"org.apache.shardingsphere.parser.yaml.config.YamlSQLParserCacheOptionRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getInitialCapacity","parameterTypes":[] }, {"name":"getMaximumSize","parameterTypes":[] }, {"name":"setInitialCapacity","parameterTypes":["int"] }, {"name":"setMaximumSize","parameterTypes":["long"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.parser.yaml.config.YamlSQLParserRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.parser.yaml.config.YamlSQLParserRuleConfiguration"},
+ "name":"org.apache.shardingsphere.parser.yaml.config.YamlSQLParserRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setParseTreeCache","parameterTypes":["org.apache.shardingsphere.parser.yaml.config.YamlSQLParserCacheOptionRuleConfiguration"] }, {"name":"setSqlCommentParseEnabled","parameterTypes":["boolean"] }, {"name":"setSqlStatementCache","parameterTypes":["org.apache.shardingsphere.parser.yaml.config.YamlSQLParserCacheOptionRuleConfiguration"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.parser.yaml.swapper.NewYamlSQLParserRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.parser.yaml.config.YamlSQLParserRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getParseTreeCache","parameterTypes":[] }, {"name":"getSqlStatementCache","parameterTypes":[] }, {"name":"isSqlCommentParseEnabled","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule"},
+ "name":"org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReadQueryLoadBalanceAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule"},
+ "name":"org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RoundRobinReadQueryLoadBalanceAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule"},
+ "name":"org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.WeightReadQueryLoadBalanceAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.readwritesplitting.yaml.config.YamlReadwriteSplittingRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.yaml.config.YamlReadwriteSplittingRuleConfiguration"},
+ "name":"org.apache.shardingsphere.readwritesplitting.yaml.config.YamlReadwriteSplittingRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setDataSources","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.yaml.config.rule.YamlReadwriteSplittingDataSourceRuleConfiguration"},
+ "name":"org.apache.shardingsphere.readwritesplitting.yaml.config.rule.YamlReadwriteSplittingDataSourceRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setReadDataSourceNames","parameterTypes":["java.util.List"] }, {"name":"setWriteDataSourceName","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.yaml.swapper.NewYamlReadwriteSplittingRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.readwritesplitting.yaml.config.rule.YamlReadwriteSplittingDataSourceRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getLoadBalancerName","parameterTypes":[] }, {"name":"getReadDataSourceNames","parameterTypes":[] }, {"name":"getTransactionalReadQueryStrategy","parameterTypes":[] }, {"name":"getWriteDataSourceName","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.rule.ShadowRule"},
+ "name":"org.apache.shardingsphere.shadow.algorithm.shadow.column.ColumnRegexMatchedShadowAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.rule.ShadowRule"},
+ "name":"org.apache.shardingsphere.shadow.algorithm.shadow.column.ColumnValueMatchedShadowAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.rule.ShadowRule"},
+ "name":"org.apache.shardingsphere.shadow.algorithm.shadow.hint.SQLHintShadowAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.shadow.yaml.config.YamlShadowRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.yaml.config.YamlShadowRuleConfiguration"},
+ "name":"org.apache.shardingsphere.shadow.yaml.config.YamlShadowRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setDataSources","parameterTypes":["java.util.Map"] }, {"name":"setDefaultShadowAlgorithmName","parameterTypes":["java.lang.String"] }, {"name":"setShadowAlgorithms","parameterTypes":["java.util.Map"] }, {"name":"setTables","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration"},
+ "name":"org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setProductionDataSourceName","parameterTypes":["java.lang.String"] }, {"name":"setShadowDataSourceName","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.yaml.swapper.NewYamlShadowRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.shadow.yaml.config.datasource.YamlShadowDataSourceConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getProductionDataSourceName","parameterTypes":[] }, {"name":"getShadowDataSourceName","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.yaml.config.table.YamlShadowTableConfiguration"},
+ "name":"org.apache.shardingsphere.shadow.yaml.config.table.YamlShadowTableConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setDataSourceNames","parameterTypes":["java.util.Collection"] }, {"name":"setShadowAlgorithmNames","parameterTypes":["java.util.Collection"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.shadow.yaml.swapper.NewYamlShadowRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.shadow.yaml.config.table.YamlShadowTableConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getDataSourceNames","parameterTypes":[] }, {"name":"getShadowAlgorithmNames","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.audit.DMLShardingConditionsShardingAuditAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.keygen.SnowflakeKeyGenerateAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.keygen.UUIDKeyGenerateAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.classbased.ClassBasedShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.datetime.AutoIntervalShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.datetime.IntervalShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.hint.HintInlineShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.inline.ComplexInlineShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.mod.HashModShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.mod.ModShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.range.BoundaryBasedRangeShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "name":"org.apache.shardingsphere.sharding.algorithm.sharding.range.VolumeBasedRangeShardingAlgorithm",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setAuditors","parameterTypes":["java.util.Map"] }, {"name":"setDefaultDatabaseStrategy","parameterTypes":["org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlShardingStrategyConfiguration"] }, {"name":"setKeyGenerators","parameterTypes":["java.util.Map"] }, {"name":"setShardingAlgorithms","parameterTypes":["java.util.Map"] }, {"name":"setTables","parameterTypes":["java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.config.rule.YamlTableRuleConfiguration"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.rule.YamlTableRuleConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setActualDataNodes","parameterTypes":["java.lang.String"] }, {"name":"setKeyGenerateStrategy","parameterTypes":["org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyConfiguration"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.swapper.NewYamlShardingRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.rule.YamlTableRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getActualDataNodes","parameterTypes":[] }, {"name":"getAuditStrategy","parameterTypes":[] }, {"name":"getDatabaseStrategy","parameterTypes":[] }, {"name":"getKeyGenerateStrategy","parameterTypes":[] }, {"name":"getLogicTable","parameterTypes":[] }, {"name":"getTableStrategy","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyConfiguration"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getColumn","parameterTypes":[] }, {"name":"getKeyGeneratorName","parameterTypes":[] }, {"name":"setColumn","parameterTypes":["java.lang.String"] }, {"name":"setKeyGeneratorName","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlShardingStrategyConfiguration"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlShardingStrategyConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setStandard","parameterTypes":["org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlStandardShardingStrategyConfiguration"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.swapper.NewYamlShardingRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlShardingStrategyConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getComplex","parameterTypes":[] }, {"name":"getHint","parameterTypes":[] }, {"name":"getNone","parameterTypes":[] }, {"name":"getStandard","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlStandardShardingStrategyConfiguration"},
+ "name":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlStandardShardingStrategyConfiguration",
+ "allDeclaredFields":true,
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"getShardingAlgorithmName","parameterTypes":[] }, {"name":"getShardingColumn","parameterTypes":[] }, {"name":"setShardingAlgorithmName","parameterTypes":["java.lang.String"] }, {"name":"setShardingColumn","parameterTypes":["java.lang.String"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.single.yaml.config.swapper.NewYamlSingleRuleConfigurationSwapper"},
+ "name":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration",
+ "allDeclaredFields":true,
+ "methods":[{"name":"getDefaultDataSource","parameterTypes":[] }, {"name":"getTables","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.cache.ParseTreeCacheBuilder"},
+ "name":"org.apache.shardingsphere.sql.parser.core.database.cache.ParseTreeCacheLoader"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.SQLParserFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.mysql.parser.MySQLLexer",
+ "methods":[{"name":"","parameterTypes":["org.antlr.v4.runtime.CharStream"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.SQLParserFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.mysql.parser.MySQLParser",
+ "methods":[{"name":"","parameterTypes":["org.antlr.v4.runtime.TokenStream"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.mysql.visitor.statement.MySQLStatementVisitorFacade",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement"},
+ "name":"org.apache.shardingsphere.sql.parser.mysql.visitor.statement.type.MySQLDDLStatementVisitor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader"},
+ "name":"org.apache.shardingsphere.sql.parser.mysql.visitor.statement.type.MySQLDMLStatementVisitor",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.opengauss.visitor.statement.OpenGaussStatementVisitorFacade",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.oracle.visitor.statement.OracleStatementVisitorFacade",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.postgresql.visitor.statement.PostgreSQLStatementVisitorFacade",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder"},
+ "name":"org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLDeleteStatement",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementBinder"},
+ "name":"org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder"},
+ "name":"org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.sql92.visitor.statement.SQL92StatementVisitorFacade",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.core.database.visitor.SQLStatementVisitorFactory"},
+ "name":"org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.SQLServerStatementVisitorFacade",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.connection.refresher.type.table.DropTableStatementSchemaRefresher"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.context.ConfigurationContextManager"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.NewStandaloneContextManagerBuilder"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.NewStandaloneModeContextManager"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.NewStandaloneModeContextManager$$Lambda$1023/0x00007efe285b91f8"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.metadata.NewMetaDataContextsFactory"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContextFactory"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContextFactory"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationPlannerUtils"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.rule.builder.SQLFederationRuleBuilder"},
+ "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.sqlfederation.yaml.config.YamlSQLFederationRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.sqltranslator.yaml.config.YamlSQLTranslatorRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.timeservice.core.rule.TimestampServiceRule"},
+ "name":"org.apache.shardingsphere.timeservice.type.system.SystemTimestampService",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.traffic.yaml.config.YamlTrafficRuleConfiguration"
+},
+{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"},
+ "name":"org.apache.shardingsphere.transaction.yaml.config.YamlTransactionRuleConfiguration"
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json
new file mode 100644
index 00000000000000..c2dc772615781b
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json
@@ -0,0 +1,107 @@
+{
+ "resources":{
+ "includes":[{
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.config.rule.decorator.RuleConfigurationDecorator\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.metadata.data.loader.MetaDataLoader"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.database.core.metadata.data.loader.DialectMetaDataLoader\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.metadata.database.system.SystemDatabase"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.database.core.metadata.database.system.DialectSystemDatabase\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.core.type.DatabaseTypeFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.database.core.type.DatabaseType\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.datanode.DataNodes"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.datanode.DataNodeBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.datasource.pool.metadata.DataSourcePoolMetaData\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.executor.audit.SQLAuditEngine"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.executor.audit.SQLAuditor\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.executor.sql.prepare.driver.SQLExecutionUnitBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.expr.spi.InlineExpressionParser\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.merge.MergeEngine"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.metadata.MetaDataContexts"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.rewrite.context.SQLRewriteContextDecorator\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.route.engine.impl.PartialSQLRouteExecutor"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.route.SQLRouter\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.rule.builder.database.DefaultDatabaseRuleConfigurationBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.rule.builder.global.DefaultGlobalRuleConfigurationBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.rule.builder.global.GlobalRuleBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlModeConfigurationSwapper"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlGlobalRuleConfigurationSwapperEngine"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlGlobalRuleConfigurationSwapper\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapperEngine"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapper\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.route.standard.StandardReadwriteSplittingDataSourceRouter"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.readwritesplitting.route.standard.filter.ReadDataSourcesFilter\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sharding.rule.ShardingRule"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAuditAlgorithm\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.context.parser.dialect.OptimizerSQLPropertiesBuilder"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sqlfederation.optimizer.context.parser.dialect.OptimizerSQLDialectBuilder\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.engine.SQLFederationEngine"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sqlfederation.spi.SQLFederationDecider\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule"},
+ "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sqltranslator.spi.SQLTranslator\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.optimizer.context.parser.dialect.impl.H2OptimizerBuilder"},
+ "pattern":"\\Qsaffron.properties\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader"},
+ "pattern":"\\Qsql\\E"
+ },{
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader"},
+ "pattern":"\\Qsql/H2.xml\\E"
+ }, {
+ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader"},
+ "pattern":"\\Qsql/MySQL.xml\\E"
+ }]},
+ "bundles":[]
+}
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.zookeeper/zookeeper/3.9.0/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.zookeeper/zookeeper/3.9.0/reflect-config.json
new file mode 100644
index 00000000000000..a6e52201ca7581
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.zookeeper/zookeeper/3.9.0/reflect-config.json
@@ -0,0 +1,56 @@
+[
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.ZooKeeper"},
+ "name":"org.apache.zookeeper.ClientCnxnSocketNIO",
+ "methods":[{"name":"","parameterTypes":["org.apache.zookeeper.client.ZKClientConfig"] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.metrics.impl.MetricsProviderBootstrap"},
+ "name":"org.apache.zookeeper.metrics.impl.DefaultMetricsProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.quorum.QuorumPeerConfig"},
+ "name":"org.apache.zookeeper.metrics.impl.DefaultMetricsProvider"
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ServerCnxnFactory"},
+ "name":"org.apache.zookeeper.server.ConnectionBean",
+ "queryAllPublicConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ServerCnxnFactory"},
+ "name":"org.apache.zookeeper.server.ConnectionMXBean",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ZooKeeperServer"},
+ "name":"org.apache.zookeeper.server.DataTreeBean",
+ "queryAllPublicConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ZooKeeperServer"},
+ "name":"org.apache.zookeeper.server.DataTreeMXBean",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ServerCnxnFactory"},
+ "name":"org.apache.zookeeper.server.NIOServerCnxnFactory",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ZooKeeperServer"},
+ "name":"org.apache.zookeeper.server.ZooKeeperServerBean",
+ "queryAllPublicConstructors":true
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.ZooKeeperServer"},
+ "name":"org.apache.zookeeper.server.ZooKeeperServerMXBean",
+ "queryAllPublicMethods":true
+},
+{
+ "condition":{"typeReachable":"org.apache.zookeeper.server.watch.WatchManagerFactory"},
+ "name":"org.apache.zookeeper.server.watch.WatchManager",
+ "methods":[{"name":"","parameterTypes":[] }]
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.glassfish.jaxb/jaxb-runtime/2.3.1/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.glassfish.jaxb/jaxb-runtime/2.3.1/reflect-config.json
new file mode 100644
index 00000000000000..bf4ceb54aca297
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.glassfish.jaxb/jaxb-runtime/2.3.1/reflect-config.json
@@ -0,0 +1,12 @@
+[
+{
+ "condition":{"typeReachable":"com.sun.xml.bind.v2.ContextFactory"},
+ "name":"com.sun.xml.bind.v2.ContextFactory",
+ "methods":[{"name":"createContext","parameterTypes":["java.lang.Class[]","java.util.Map"] }]
+},
+{
+ "condition":{"typeReachable":"com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty"},
+ "name":"com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty",
+ "methods":[{"name":"","parameterTypes":["com.sun.xml.bind.v2.runtime.JAXBContextImpl","com.sun.xml.bind.v2.model.runtime.RuntimeElementPropertyInfo"] }]
+}
+]
diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.slf4j/slf4j-api/1.7.36/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.slf4j/slf4j-api/1.7.36/reflect-config.json
new file mode 100644
index 00000000000000..6cc9abf091869c
--- /dev/null
+++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.slf4j/slf4j-api/1.7.36/reflect-config.json
@@ -0,0 +1,7 @@
+[
+{
+ "condition":{"typeReachable":"org.slf4j.event.Level"},
+ "name":"org.slf4j.event.Level",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+}
+]
diff --git a/jdbc/core/pom.xml b/jdbc/core/pom.xml
index 561f26fce4c6a9..f5b2f769f98e40 100644
--- a/jdbc/core/pom.xml
+++ b/jdbc/core/pom.xml
@@ -164,6 +164,11 @@
shardingsphere-logging-core
${project.version}
+
+ org.apache.shardingsphere
+ shardingsphere-infra-reachability-metadata
+ ${project.version}
+
org.apache.shardingsphere
diff --git a/pom.xml b/pom.xml
index 737a886fe56e25..20a863812bfe33 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,7 +155,7 @@
1.4.13
4.0.0
1.6.2
- 0.9.27
+ 0.9.28
1.0.0
@@ -1002,8 +1002,9 @@
- generateStandardMetadata
+ generateMetadata
+ 17
true
true
true
@@ -1011,64 +1012,106 @@
true
-
-
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
-
- 17
-
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- org.apache.shardingsphere.agent.core.**
-
-
-
-
- org.graalvm.buildtools
- native-maven-plugin
- ${native-maven-plugin.version}
- true
-
-
- true
- Direct
-
- config-output-dir=${project.basedir}/src/main/resources/META-INF/native-image/${project.groupId}/${project.artifactId}
-
-
-
- ${user.dir}/distribution/proxy-native/caller-filter.json
-
-
- ${user.dir}/distribution/proxy-native/access-filter.json
-
-
-
-
-
-
- test-native
-
- test
-
- test
-
-
- build-native
-
- compile-no-fork
-
- package
-
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ org.apache.shardingsphere.infra.nativetest.**
+
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${native-maven-plugin.version}
+ true
+
+
+ true
+ Conditional
+
+
+ ${user.dir}/infra/nativetest/native-image-filter/user-code-filter.json
+ ${user.dir}/infra/nativetest/native-image-filter/extra-filter.json
+ true
+
+
+
+
+ main
+
+ false
+ ${user.dir}/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/
+
+
+
+
+
+ build-native
+
+ compile-no-fork
+
+ package
+
+
+ test-native
+
+ test
+
+ test
+
+
+
+
+
+
+
+
+ nativeTestInShardingSphere
+
+ 17
+
+
+
+
+
+ maven-surefire-plugin
+
+
+ org.apache.shardingsphere.infra.nativetest.**
+
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${native-maven-plugin.version}
+ true
+
+
+ --report-unsupported-elements-at-runtime
+
+ ${project.build.outputDirectory}
+
+ true
+
+
+
+
+ test-native
+
+ test
+
+ test
+
+
+
+
+