This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 1c8c79e4c5 fix(admin): support Oracle existence probes (#7246)
1c8c79e4c5 is described below
commit 1c8c79e4c53084036924e9d059af336f0226ba46
Author: Liming Deng <[email protected]>
AuthorDate: Mon Oct 12 09:12:40 2026 +0800
fix(admin): support Oracle existence probes (#7246)
---
.../resources/mappers/ai-proxy-api-key-sqlmap.xml | 17 ++-
.../resources/mappers/alert-receiver-sqlmap.xml | 6 +-
.../src/main/resources/mappers/api-sqlmap.xml | 8 +-
.../src/main/resources/mappers/app-auth-sqlmap.xml | 18 +++-
.../main/resources/mappers/auth-path-sqlmap.xml | 18 +++-
.../resources/mappers/dashboard-user-sqlmap.xml | 9 +-
.../resources/mappers/data-permission-sqlmap.xml | 13 ++-
.../src/main/resources/mappers/detail-sqlmap.xml | 9 +-
.../resources/mappers/discovery-handler-sqlmap.xml | 8 +-
.../main/resources/mappers/discovery-sqlmap.xml | 8 +-
.../mappers/discovery-upstream-sqlmap.xml | 8 +-
.../src/main/resources/mappers/field-sqlmap.xml | 9 +-
.../resources/mappers/instance-info-sqlmap.xml | 9 +-
.../main/resources/mappers/meta-data-sqlmap.xml | 39 ++++++-
.../mappers/mock-request-record-sqlmap.xml | 10 +-
.../mappers/namespace-plugin-rel-sqlmap.xml | 24 ++++-
.../main/resources/mappers/namespace-sqlmap.xml | 9 +-
.../resources/mappers/plugin-handle-sqlmap.xml | 9 +-
.../src/main/resources/mappers/plugin-sqlmap.xml | 30 +++++-
.../resources/mappers/proxy-selector-sqlmap.xml | 16 ++-
.../src/main/resources/mappers/registry-sqlmap.xml | 8 +-
.../src/main/resources/mappers/resouce-sqlmap.xml | 14 ++-
.../src/main/resources/mappers/role-sqlmap.xml | 9 +-
.../src/main/resources/mappers/rule-sqlmap.xml | 11 +-
.../resources/mappers/scale-history-sqlmap.xml | 9 +-
.../main/resources/mappers/scale-policy-sqlmap.xml | 9 +-
.../main/resources/mappers/scale-rule-sqlmap.xml | 9 +-
.../src/main/resources/mappers/selector-sqlmap.xml | 11 +-
.../main/resources/mappers/shenyu-dict-sqlmap.xml | 9 +-
.../main/resources/mappers/tag-relation-sqlmap.xml | 9 +-
.../src/main/resources/mappers/tag-sqlmap.xml | 9 +-
.../admin/mapper/ExistenceProbeDialectTest.java | 120 +++++++++++++++++++++
32 files changed, 456 insertions(+), 48 deletions(-)
diff --git
a/shenyu-admin/src/main/resources/mappers/ai-proxy-api-key-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/ai-proxy-api-key-sqlmap.xml
index 73900e59de..d0de8c4dee 100644
--- a/shenyu-admin/src/main/resources/mappers/ai-proxy-api-key-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/ai-proxy-api-key-sqlmap.xml
@@ -44,12 +44,21 @@
<!-- exists checks -->
<select id="existed" resultType="boolean">
- SELECT COUNT(1) > 0 FROM proxy_api_key_mapping WHERE id = #{id}
+ SELECT 1 FROM proxy_api_key_mapping WHERE id = #{id} LIMIT 1
</select>
<select id="proxyApiKeyExisted" resultType="boolean">
- SELECT COUNT(1) > 0 FROM proxy_api_key_mapping
- WHERE selector_id = #{selectorId} AND proxy_api_key = #{proxyApiKey}
+ SELECT 1 FROM proxy_api_key_mapping
+ WHERE selector_id = #{selectorId} AND proxy_api_key = #{proxyApiKey}
LIMIT 1
+ </select>
+
+ <select databaseId="oracle" id="existed" resultType="boolean">
+ SELECT 1 FROM proxy_api_key_mapping WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
+ <select databaseId="oracle" id="proxyApiKeyExisted"
resultType="boolean">
+ SELECT 1 FROM proxy_api_key_mapping
+ WHERE selector_id = #{selectorId} AND proxy_api_key = #{proxyApiKey}
AND ROWNUM = 1
</select>
<!-- basic selects -->
@@ -226,4 +235,4 @@
ORDER BY date_updated DESC
</select>
-</mapper>
\ No newline at end of file
+</mapper>
diff --git a/shenyu-admin/src/main/resources/mappers/alert-receiver-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/alert-receiver-sqlmap.xml
index 998615a6a4..784714ff72 100644
--- a/shenyu-admin/src/main/resources/mappers/alert-receiver-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/alert-receiver-sqlmap.xml
@@ -134,7 +134,11 @@
WHERE id = #{id, jdbcType=VARCHAR}
</select>
<select id="existed" resultType="java.lang.Boolean">
- select true from alert_receiver where id = #{id} limit 1
+ SELECT 1 from alert_receiver where id = #{id} limit 1
+ </select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1 from alert_receiver where id = #{id} AND ROWNUM = 1
</select>
<delete id="deleteByIds" parameterType="java.util.List">
DELETE FROM alert_receiver WHERE id IN
diff --git a/shenyu-admin/src/main/resources/mappers/api-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/api-sqlmap.xml
index f011b0c9b9..3c1f264603 100644
--- a/shenyu-admin/src/main/resources/mappers/api-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/api-sqlmap.xml
@@ -260,11 +260,17 @@
</update>
<select id="existed" resultType="java.lang.Boolean">
- select true
+ SELECT 1
from api
where id = #{id} limit 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ from api
+ where id = #{id} AND ROWNUM = 1
+ </select>
+
<select id="selectByQuery"
parameterType="org.apache.shenyu.admin.model.query.ApiQuery"
resultMap="BaseResultMap">
select api.id,
diff --git a/shenyu-admin/src/main/resources/mappers/app-auth-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/app-auth-sqlmap.xml
index d77a5b8e8f..f173df92b7 100644
--- a/shenyu-admin/src/main/resources/mappers/app-auth-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/app-auth-sqlmap.xml
@@ -141,19 +141,33 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM app_auth
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM app_auth
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="appKeyExisted" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM app_auth
WHERE app_key = #{appKey}
LIMIT 1
</select>
+ <select databaseId="oracle" id="appKeyExisted"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM app_auth
+ WHERE app_key = #{appKey}
+ AND ROWNUM = 1
+ </select>
+
<insert id="insert"
parameterType="org.apache.shenyu.admin.model.entity.AppAuthDO">
INSERT INTO app_auth
(id,
diff --git a/shenyu-admin/src/main/resources/mappers/auth-path-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/auth-path-sqlmap.xml
index ce7619e27b..e976e58614 100644
--- a/shenyu-admin/src/main/resources/mappers/auth-path-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/auth-path-sqlmap.xml
@@ -65,19 +65,33 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM auth_path
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM auth_path
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="existedByAuthId" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM auth_path
WHERE auth_id = #{authId}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existedByAuthId"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM auth_path
+ WHERE auth_id = #{authId}
+ AND ROWNUM = 1
+ </select>
+
<insert id="save"
parameterType="org.apache.shenyu.admin.model.entity.AuthParamDO">
INSERT INTO auth_path
(id,
diff --git a/shenyu-admin/src/main/resources/mappers/dashboard-user-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/dashboard-user-sqlmap.xml
index 17fd9c7c08..4ad63838ac 100644
--- a/shenyu-admin/src/main/resources/mappers/dashboard-user-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/dashboard-user-sqlmap.xml
@@ -83,12 +83,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM dashboard_user
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM dashboard_user
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByIds"
resultType="org.apache.shenyu.admin.model.entity.DashboardUserDO">
select
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
index a8ca52367e..c6453a8094 100644
--- a/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/data-permission-sqlmap.xml
@@ -110,12 +110,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
- FROM data_permission
- WHERE user_id = #{userId,jdbcType=VARCHAR}
+ SELECT 1
+ FROM data_permission
+ WHERE user_id = #{userId,jdbcType=VARCHAR}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM data_permission
+ WHERE user_id = #{userId,jdbcType=VARCHAR}
+ AND ROWNUM = 1
+ </select>
+
<insert id="insertSelective"
parameterType="org.apache.shenyu.admin.model.entity.DataPermissionDO">
INSERT INTO data_permission
<trim prefix="(" suffix=")" suffixOverrides=",">
diff --git a/shenyu-admin/src/main/resources/mappers/detail-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/detail-sqlmap.xml
index 530b96c6b0..32784a6d9e 100644
--- a/shenyu-admin/src/main/resources/mappers/detail-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/detail-sqlmap.xml
@@ -40,12 +40,19 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM detail
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM detail
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<insert id="insert"
parameterType="org.apache.shenyu.admin.model.entity.DetailDO">
insert into detail (
id,
diff --git
a/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
index 4a1c77f18f..0899f61d33 100644
--- a/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/discovery-handler-sqlmap.xml
@@ -39,11 +39,17 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM discovery_handler
WHERE id = #{id} limit 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM discovery_handler
+ WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
<select id="selectById" parameterType="java.lang.String"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/discovery-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/discovery-sqlmap.xml
index 05a803ca9f..ed2e23ad61 100644
--- a/shenyu-admin/src/main/resources/mappers/discovery-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/discovery-sqlmap.xml
@@ -45,11 +45,17 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM discovery
WHERE id = #{id} limit 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM discovery
+ WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
<select id="selectById" parameterType="java.lang.String"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git
a/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
index ce46ef1a3c..bc46074341 100644
--- a/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/discovery-upstream-sqlmap.xml
@@ -45,11 +45,17 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM discovery_upstream
WHERE id = #{id} LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM discovery_upstream
+ WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
<insert id="insert"
parameterType="org.apache.shenyu.admin.model.entity.DiscoveryUpstreamDO">
INSERT INTO discovery_upstream (
id,
diff --git a/shenyu-admin/src/main/resources/mappers/field-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/field-sqlmap.xml
index 891e3f2ea0..db7b471dfe 100644
--- a/shenyu-admin/src/main/resources/mappers/field-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/field-sqlmap.xml
@@ -44,12 +44,19 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM field
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM field
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<insert id="insert"
parameterType="org.apache.shenyu.admin.model.entity.FieldDO">
insert into field (
id,
diff --git a/shenyu-admin/src/main/resources/mappers/instance-info-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/instance-info-sqlmap.xml
index 0a70c79b27..e278d682cf 100644
--- a/shenyu-admin/src/main/resources/mappers/instance-info-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/instance-info-sqlmap.xml
@@ -72,11 +72,18 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SElECT true
+ SELECT 1
FROM instance_info
WHERE id = #{id}
LIMIT 1
</select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM instance_info
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
<select id="selectByQuery" resultMap="BaseResultMap">
SElECT
diff --git a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
index 16aa026d0c..09a3b5f8dc 100644
--- a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
@@ -144,15 +144,23 @@
</select>
<select id="pathExisted" resultType="java.lang.Boolean">
- SElECT true
+ SELECT 1
FROM meta_data
WHERE path = #{path}
AND namespace_id = #{namespaceId}
LIMIT 1
</select>
+ <select databaseId="oracle" id="pathExisted"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM meta_data
+ WHERE path = #{path}
+ AND namespace_id = #{namespaceId}
+ AND ROWNUM = 1
+ </select>
+
<select id="pathExistedExclude" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM meta_data candidate
WHERE candidate.path = #{path}
AND candidate.namespace_id = #{namespaceId}
@@ -169,13 +177,38 @@
LIMIT 1
</select>
+ <select databaseId="oracle" id="pathExistedExclude"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM meta_data candidate
+ WHERE candidate.path = #{path}
+ AND candidate.namespace_id = #{namespaceId}
+ <if test="exclude != null and exclude.size() > 0">
+ AND NOT EXISTS (
+ SELECT 1 FROM meta_data excluded
+ WHERE excluded.id = candidate.id
+ AND excluded.id IN
+ <foreach collection="exclude" item="id" open="(" separator=","
close=")">
+ #{id,jdbcType=VARCHAR}
+ </foreach>
+ )
+ </if>
+ AND ROWNUM = 1
+ </select>
+
<select id="existed" resultType="java.lang.Boolean">
- SElECT true
+ SELECT 1
FROM meta_data
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM meta_data
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<insert id="insert"
parameterType="org.apache.shenyu.admin.model.entity.MetaDataDO">
INSERT INTO meta_data
(id,
diff --git
a/shenyu-admin/src/main/resources/mappers/mock-request-record-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/mock-request-record-sqlmap.xml
index 3d574d5888..85883814a1 100644
--- a/shenyu-admin/src/main/resources/mappers/mock-request-record-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/mock-request-record-sqlmap.xml
@@ -148,12 +148,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM mock_request_record
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM mock_request_record
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into mock_request_record(
id,
@@ -295,4 +302,3 @@
</delete>
</mapper>
-
diff --git
a/shenyu-admin/src/main/resources/mappers/namespace-plugin-rel-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/namespace-plugin-rel-sqlmap.xml
index 868ab315df..a300ea1af8 100644
--- a/shenyu-admin/src/main/resources/mappers/namespace-plugin-rel-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/namespace-plugin-rel-sqlmap.xml
@@ -41,7 +41,13 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
+ FROM namespace_plugin_rel
+ WHERE id = #{id, jdbcType=VARCHAR}
+ </select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
FROM namespace_plugin_rel
WHERE id = #{id, jdbcType=VARCHAR}
</select>
@@ -185,7 +191,7 @@
</select>
<select id="nameExistedExclude" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM namespace_plugin_rel npr
INNER JOIN plugin p ON npr.plugin_id = p.id
WHERE p.name = #{name}
@@ -198,6 +204,20 @@
LIMIT 1
</select>
+ <select databaseId="oracle" id="nameExistedExclude"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM namespace_plugin_rel npr
+ INNER JOIN plugin p ON npr.plugin_id = p.id
+ WHERE p.name = #{name}
+ AND npr.plugin_id NOT IN
+ <foreach collection="exclude" item="id" index="index"
+ open="(" separator="," close=")">
+ #{id}
+ </foreach>
+ AND npr.namespace_id = #{namespaceId}
+ AND ROWNUM = 1
+ </select>
+
<update id="updateSelective"
parameterType="org.apache.shenyu.admin.model.entity.NamespacePluginRelDO">
UPDATE namespace_plugin_rel
<set>
diff --git a/shenyu-admin/src/main/resources/mappers/namespace-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/namespace-sqlmap.xml
index 28da6accd0..ae6543d4f1 100644
--- a/shenyu-admin/src/main/resources/mappers/namespace-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/namespace-sqlmap.xml
@@ -37,12 +37,19 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM namespace
WHERE namespace_id = #{namespaceId} limit 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM namespace
+
+ WHERE namespace_id = #{namespaceId} AND ROWNUM = 1
+ </select>
+
<select id="selectById" parameterType="java.lang.String"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/plugin-handle-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/plugin-handle-sqlmap.xml
index 125c313317..467bdfa409 100644
--- a/shenyu-admin/src/main/resources/mappers/plugin-handle-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/plugin-handle-sqlmap.xml
@@ -254,12 +254,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM plugin_handle
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM plugin_handle
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByPluginIdList"
resultType="org.apache.shenyu.admin.model.entity.PluginHandleDO">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
index 192a7eb84b..222c1e2082 100644
--- a/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/plugin-sqlmap.xml
@@ -138,19 +138,31 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM plugin
WHERE id = #{id} LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM plugin
+ WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
<select id="nameExisted" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM plugin
WHERE name = #{name} LIMIT 1
</select>
+ <select databaseId="oracle" id="nameExisted"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM plugin
+ WHERE name = #{name} AND ROWNUM = 1
+ </select>
+
<select id="nameExistedExclude" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM plugin
WHERE name = #{name}
AND id NOT IN
@@ -161,6 +173,18 @@
LIMIT 1
</select>
+ <select databaseId="oracle" id="nameExistedExclude"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM plugin
+ WHERE name = #{name}
+ AND id NOT IN
+ <foreach collection="exclude" item="id" index="index"
+ open="(" separator="," close=")">
+ #{id}
+ </foreach>
+ AND ROWNUM = 1
+ </select>
+
<select id="activePluginSnapshot"
resultType="org.apache.shenyu.admin.model.vo.PluginSnapshotVO">
select p.id,
p.name,
diff --git a/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
index 5619c40c90..9586b6099b 100644
--- a/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/proxy-selector-sqlmap.xml
@@ -43,11 +43,17 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM proxy_selector
WHERE id = #{id} LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM proxy_selector
+ WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
<select id="selectByQuery"
parameterType="org.apache.shenyu.admin.model.query.ProxySelectorQuery"
resultMap="BaseResultMap">
SELECT
@@ -64,11 +70,17 @@
</select>
<select id="nameExisted" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM proxy_selector
WHERE name = #{name} LIMIT 1
</select>
+ <select databaseId="oracle" id="nameExisted"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM proxy_selector
+ WHERE name = #{name} AND ROWNUM = 1
+ </select>
+
<insert id="insert"
parameterType="org.apache.shenyu.admin.model.entity.ProxySelectorDO">
INSERT INTO proxy_selector (
id,
diff --git a/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
index a52517e61e..fd4c72842c 100644
--- a/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
@@ -45,11 +45,17 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM registry_config
WHERE id = #{id} limit 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM registry_config
+ WHERE id = #{id} AND ROWNUM = 1
+ </select>
+
<select id="selectById" parameterType="java.lang.String"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/resouce-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/resouce-sqlmap.xml
index 0ead91a17e..005d1fb94c 100644
--- a/shenyu-admin/src/main/resources/mappers/resouce-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/resouce-sqlmap.xml
@@ -136,15 +136,25 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- select true from resource where id = #{id} limit 1
+ SELECT 1 from resource where id = #{id} limit 1
+ </select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1 from resource where id = #{id} AND ROWNUM = 1
</select>
<select id="nameExisted" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM resource
WHERE name = #{name} LIMIT 1
</select>
+ <select databaseId="oracle" id="nameExisted"
resultType="java.lang.Boolean">
+ SELECT 1
+ FROM resource
+ WHERE name = #{name} AND ROWNUM = 1
+ </select>
+
<select id="selectByUserName"
resultType="org.apache.shenyu.admin.model.entity.ResourceDO">
select
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/role-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/role-sqlmap.xml
index 15187f5475..db3b8f8f13 100644
--- a/shenyu-admin/src/main/resources/mappers/role-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/role-sqlmap.xml
@@ -77,11 +77,18 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM role
WHERE id = #{id}
LIMIT 1
</select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM role
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
<select id="selectByIds"
resultType="org.apache.shenyu.admin.model.entity.RoleDO">
select
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
index 737045797a..aaf912849b 100644
--- a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
@@ -155,12 +155,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT TRUE
+ SELECT 1
FROM rule
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM rule
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByCondition"
resultType="org.apache.shenyu.admin.model.entity.RuleDO"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
@@ -184,7 +191,7 @@
</foreach>
</if>
<if test="condition.userId != null and condition.userId != ''">
- AND exists(select true
+ AND exists(select 1
from data_permission
where data_id = rule.id
and user_id = #{condition.userId})
diff --git a/shenyu-admin/src/main/resources/mappers/scale-history-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/scale-history-sqlmap.xml
index b005ac7d05..297daab442 100644
--- a/shenyu-admin/src/main/resources/mappers/scale-history-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/scale-history-sqlmap.xml
@@ -36,11 +36,18 @@
msg
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM scale_history
WHERE id = #{id}
LIMIT 1
</select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM scale_history
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
<select id="selectByPrimaryKey" parameterType="java.lang.String"
resultMap="ResultMapWithBLOBs">
select
<include refid="Base_Column_List" />
diff --git a/shenyu-admin/src/main/resources/mappers/scale-policy-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/scale-policy-sqlmap.xml
index 78013f86eb..01e3e11086 100644
--- a/shenyu-admin/src/main/resources/mappers/scale-policy-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/scale-policy-sqlmap.xml
@@ -32,11 +32,18 @@
id, sort, `status`, num, begin_time, end_time, date_created, date_updated
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM scale_policy
WHERE id = #{id}
LIMIT 1
</select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM scale_policy
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
<select id="selectByPrimaryKey" parameterType="java.lang.String"
resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
diff --git a/shenyu-admin/src/main/resources/mappers/scale-rule-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/scale-rule-sqlmap.xml
index 4363a25f30..f6ba24375b 100644
--- a/shenyu-admin/src/main/resources/mappers/scale-rule-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/scale-rule-sqlmap.xml
@@ -204,11 +204,18 @@
where id = #{id,jdbcType=VARCHAR}
</update>
<select id="existed" resultType="java.lang.Boolean">
- select true
+ SELECT 1
from scale_rule
where id = #{id}
limit 1
</select>
+
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ from scale_rule
+ where id = #{id}
+ AND ROWNUM = 1
+ </select>
<select id="selectAll"
resultType="org.apache.shenyu.admin.model.entity.ScaleRuleDO"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
index 9aa01836e8..c4157a140a 100644
--- a/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
@@ -215,12 +215,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM selector
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM selector
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByCondition"
resultType="org.apache.shenyu.admin.model.entity.SelectorDO"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
@@ -245,7 +252,7 @@
</if>
<if test="condition.userId != null and condition.userId != ''">
- AND exists(select true
+ AND exists(select 1
from data_permission
where data_id = selector.id
and user_id = #{condition.userId})
diff --git a/shenyu-admin/src/main/resources/mappers/shenyu-dict-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/shenyu-dict-sqlmap.xml
index 0cac303f53..1a2cb062e2 100644
--- a/shenyu-admin/src/main/resources/mappers/shenyu-dict-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/shenyu-dict-sqlmap.xml
@@ -269,12 +269,19 @@
</select>
<select id="existed" resultType="java.lang.Boolean">
- SELECT true
+ SELECT 1
FROM shenyu_dict
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM shenyu_dict
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByIds"
resultType="org.apache.shenyu.admin.model.entity.ShenyuDictDO">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/tag-relation-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/tag-relation-sqlmap.xml
index 5e63b730ac..3b94f0b60f 100644
--- a/shenyu-admin/src/main/resources/mappers/tag-relation-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/tag-relation-sqlmap.xml
@@ -35,12 +35,19 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT TRUE
+ SELECT 1
FROM tag_relation
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM tag_relation
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByPrimaryKey" parameterType="java.lang.String"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git a/shenyu-admin/src/main/resources/mappers/tag-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/tag-sqlmap.xml
index 9fb421684e..294b47d670 100644
--- a/shenyu-admin/src/main/resources/mappers/tag-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/tag-sqlmap.xml
@@ -39,12 +39,19 @@
</sql>
<select id="existed" resultType="java.lang.Boolean">
- SELECT TRUE
+ SELECT 1
FROM tag
WHERE id = #{id}
LIMIT 1
</select>
+ <select databaseId="oracle" id="existed" resultType="java.lang.Boolean">
+ SELECT 1
+ FROM tag
+ WHERE id = #{id}
+ AND ROWNUM = 1
+ </select>
+
<select id="selectByPrimaryKey" parameterType="java.lang.String"
resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
diff --git
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/ExistenceProbeDialectTest.java
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/ExistenceProbeDialectTest.java
new file mode 100644
index 0000000000..5b17ef4f2e
--- /dev/null
+++
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/ExistenceProbeDialectTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.shenyu.admin.mapper;
+
+import org.apache.ibatis.builder.xml.XMLMapperBuilder;
+import org.apache.ibatis.mapping.Environment;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.session.Configuration;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactoryBuilder;
+import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Verify existence probes retain their nullable Boolean contract across
dialects.
+ */
+public class ExistenceProbeDialectTest {
+
+ @ParameterizedTest
+ @ValueSource(strings = {"oracle", "h2"})
+ public void testExistenceProbes(final String databaseId) throws Exception {
+ DriverManagerDataSource dataSource = new DriverManagerDataSource(
+ "jdbc:h2:mem:probes-" + UUID.randomUUID() +
";DB_CLOSE_DELAY=-1;MODE=MySQL", "sa", "");
+ JdbcTemplate jdbc = new JdbcTemplate(dataSource);
+ try {
+ new ResourceDatabasePopulator(new
ClassPathResource("sql-script/h2/schema.sql")).execute(dataSource);
+ if ("oracle".equals(databaseId)) {
+ jdbc.execute("SET MODE Oracle");
+ }
+ Configuration configuration = new Configuration(new
Environment("test", new JdbcTransactionFactory(), dataSource));
+ configuration.setDatabaseId(databaseId);
+ for (Resource resource : new
PathMatchingResourcePatternResolver().getResources("classpath*:mappers/*-sqlmap.xml"))
{
+
assertFalse(resource.getContentAsString(StandardCharsets.UTF_8).matches("(?is).*\\bexists\\s*\\(\\s*select\\s+true\\b.*"),
resource.toString());
+ try (InputStream input = resource.getInputStream()) {
+ new XMLMapperBuilder(input, configuration,
resource.toString(), configuration.getSqlFragments()).parse();
+ }
+ }
+ Map<String, Object> parameters = Map.of("id", "missing-probe",
"name", "missing-probe", "path", "missing-probe",
+ "userId", "missing-probe", "authId", "missing-probe",
"appKey", "missing-probe",
+ "namespaceId", "missing-probe", "exclude",
List.of("excluded-probe"),
+ "selectorId", "missing-probe", "proxyApiKey",
"missing-probe");
+ List<MappedStatement> probes =
configuration.getMappedStatementNames().stream()
+ .filter(name -> name.contains("."))
+ .map(configuration::getMappedStatement)
+ .filter(statement -> !statement.getResultMaps().isEmpty()
+ && (statement.getResultMaps().get(0).getType() ==
Boolean.class || statement.getResultMaps().get(0).getType() == boolean.class))
+ .collect(Collectors.toList());
+ assertEquals(41, probes.size());
+ try (SqlSession session = new
SqlSessionFactoryBuilder().build(configuration).openSession()) {
+ for (MappedStatement probe : probes) {
+ if ("oracle".equals(databaseId)) {
+ assertEquals("oracle", probe.getDatabaseId(),
probe.getId());
+
assertFalse(probe.getBoundSql(parameters).getSql().toUpperCase(Locale.ROOT).contains("LIMIT"),
probe.getId());
+ }
+ assertNull(session.selectOne(probe.getId(), parameters),
probe.getId());
+ }
+ jdbc.update("INSERT INTO plugin (id, name, role) VALUES
('probe-1', 'probe-name', 'test')");
+ jdbc.update("INSERT INTO plugin (id, name, role) VALUES
('probe-2', 'probe-name', 'test')");
+
assertTrue(session.getMapper(PluginMapper.class).existed("probe-1"));
+
assertTrue(session.getMapper(PluginMapper.class).nameExisted("probe-name"));
+
assertNull(session.getMapper(PluginMapper.class).nameExisted("missing-probe"));
+ jdbc.update("INSERT INTO meta_data (id, path, namespace_id,
app_name, rpc_type) VALUES ('meta-1', '/probe', 'ns-one', 'probe', 'http')");
+ jdbc.update("INSERT INTO meta_data (id, path, namespace_id,
app_name, rpc_type) VALUES ('meta-2', '/probe', 'ns-two', 'probe', 'http')");
+ MetaDataMapper metadata =
session.getMapper(MetaDataMapper.class);
+ assertTrue(metadata.pathExistedExclude("/probe", "ns-one",
List.of()));
+ assertTrue(metadata.pathExistedExclude("/probe", "ns-one",
null));
+ assertTrue(metadata.pathExistedExclude("/probe", "ns-two",
List.of("meta-1")));
+ assertNull(metadata.pathExistedExclude("/probe", "ns-one",
List.of("meta-1")));
+ assertNull(metadata.pathExistedExclude("/probe", "missing",
List.of()));
+ jdbc.update("INSERT INTO proxy_api_key_mapping (id,
selector_id, proxy_api_key, namespace_id) VALUES ('key-1', 'selector-1',
'shared-key', 'ns')");
+ jdbc.update("INSERT INTO proxy_api_key_mapping (id,
selector_id, proxy_api_key, namespace_id) VALUES ('key-2', 'selector-2',
'shared-key', 'ns')");
+
assertTrue(session.getMapper(AiProxyApiKeyMapper.class).existed("key-1"));
+
assertTrue(session.getMapper(AiProxyApiKeyMapper.class).proxyApiKeyExisted("selector-1",
"shared-key"));
+
assertNull(session.getMapper(AiProxyApiKeyMapper.class).proxyApiKeyExisted("missing",
"shared-key"));
+ for (String mapper : List.of("RuleMapper", "SelectorMapper")) {
+ Map<String, Object> condition = Map.of("condition",
Map.of("userId", "user-1"));
+
assertTrue(session.selectList("org.apache.shenyu.admin.mapper." + mapper +
".selectByCondition", condition).isEmpty());
+ }
+ }
+ } finally {
+ jdbc.execute("SHUTDOWN");
+ }
+ }
+}