msgQueue = computeIfAbsentMsgQueue(ctx.channel());
offerMsg(msgQueue, rpcMessage, resultMessage, msgId, ctx.channel());
notifyBatchRespondingThread();
+ if (LOGGER.isInfoEnabled()) {
+ String resultMsgLog = String.format("result msg[merged]: %s, clientIp: %s, vgroup: %s", resultMessage,
+ NetUtil.toIpAddress(ctx.channel().remoteAddress()), rpcContext.getTransactionServiceGroup());
+ BatchLogHandler.INSTANCE.writeLog(resultMsgLog);
+ }
}
/**
diff --git a/core/src/main/java/io/seata/core/rpc/processor/server/ServerOnResponseProcessor.java b/core/src/main/java/io/seata/core/rpc/processor/server/ServerOnResponseProcessor.java
index 705b83a73a0..8f6f4e1cb61 100644
--- a/core/src/main/java/io/seata/core/rpc/processor/server/ServerOnResponseProcessor.java
+++ b/core/src/main/java/io/seata/core/rpc/processor/server/ServerOnResponseProcessor.java
@@ -15,6 +15,9 @@
*/
package io.seata.core.rpc.processor.server;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
import io.netty.channel.ChannelHandlerContext;
import io.seata.common.util.NetUtil;
import io.seata.core.protocol.AbstractResultMessage;
@@ -29,9 +32,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
/**
* handle RM/TM response message.
*
@@ -66,6 +66,11 @@ public ServerOnResponseProcessor(TransactionMessageHandler transactionMessageHan
@Override
public void process(ChannelHandlerContext ctx, RpcMessage rpcMessage) throws Exception {
MessageFuture messageFuture = futures.remove(rpcMessage.getId());
+ String receiveMsgLog = String.format("receive msg[single]: %s, clientIp: %s, vgroup: %s", rpcMessage.getBody(), NetUtil.toIpAddress(ctx.channel().remoteAddress()),
+ ChannelManager.getContextFromIdentified(ctx.channel()).getTransactionServiceGroup());
+ if (LOGGER.isInfoEnabled()) {
+ BatchLogHandler.INSTANCE.writeLog(receiveMsgLog);
+ }
if (messageFuture != null) {
messageFuture.setResultMessage(rpcMessage.getBody());
} else {
@@ -73,9 +78,6 @@ public void process(ChannelHandlerContext ctx, RpcMessage rpcMessage) throws Exc
onResponseMessage(ctx, rpcMessage);
} else {
try {
- if (LOGGER.isInfoEnabled()) {
- LOGGER.info("closeChannelHandlerContext channel:" + ctx.channel());
- }
ctx.disconnect();
ctx.close();
} catch (Exception exx) {
@@ -89,19 +91,6 @@ public void process(ChannelHandlerContext ctx, RpcMessage rpcMessage) throws Exc
}
private void onResponseMessage(ChannelHandlerContext ctx, RpcMessage rpcMessage) {
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("server received:{},clientIp:{},vgroup:{}", rpcMessage.getBody(),
- NetUtil.toIpAddress(ctx.channel().remoteAddress()),
- ChannelManager.getContextFromIdentified(ctx.channel()).getTransactionServiceGroup());
- } else {
- try {
- BatchLogHandler.INSTANCE.getLogQueue()
- .put(rpcMessage.getBody() + ",clientIp:" + NetUtil.toIpAddress(ctx.channel().remoteAddress()) + ",vgroup:"
- + ChannelManager.getContextFromIdentified(ctx.channel()).getTransactionServiceGroup());
- } catch (InterruptedException e) {
- LOGGER.error("put message to logQueue error: {}", e.getMessage(), e);
- }
- }
if (rpcMessage.getBody() instanceof AbstractResultMessage) {
RpcContext rpcContext = ChannelManager.getContextFromIdentified(ctx.channel());
transactionMessageHandler.onResponse((AbstractResultMessage) rpcMessage.getBody(), rpcContext);
diff --git a/core/src/test/java/io/seata/core/message/BranchCommitRequestTest.java b/core/src/test/java/io/seata/core/message/BranchCommitRequestTest.java
index f30d68bc075..620d6beb72a 100644
--- a/core/src/test/java/io/seata/core/message/BranchCommitRequestTest.java
+++ b/core/src/test/java/io/seata/core/message/BranchCommitRequestTest.java
@@ -44,8 +44,7 @@ public void toStringTest() {
branchCommitRequest.setResourceId("resource1");
branchCommitRequest.setApplicationData("app1");
- Assertions.assertEquals("xid=127.0.0.1:9999:39875642,branchId=1,branchType=AT,"
- + "resourceId=resource1,applicationData=app1", branchCommitRequest.toString());
+ Assertions.assertEquals("BranchCommitRequest{xid='127.0.0.1:9999:39875642', branchId=1, branchType=AT, resourceId='resource1', applicationData='app1'}", branchCommitRequest.toString());
}
}
\ No newline at end of file
diff --git a/core/src/test/java/io/seata/core/message/BranchCommitResponseTest.java b/core/src/test/java/io/seata/core/message/BranchCommitResponseTest.java
index 261ee33139d..8cb897ddefa 100644
--- a/core/src/test/java/io/seata/core/message/BranchCommitResponseTest.java
+++ b/core/src/test/java/io/seata/core/message/BranchCommitResponseTest.java
@@ -41,7 +41,7 @@ public void toStringTest() {
branchCommitResponse.setResultCode(ResultCode.Success);
branchCommitResponse.setMsg("");
Assertions.assertEquals(
- "xid=127.0.0.1:8091:123456,branchId=2345678,branchStatus=PhaseOne_Done,result code =Success,getMsg =",
+ "BranchCommitResponse{xid='127.0.0.1:8091:123456', branchId=2345678, branchStatus=PhaseOne_Done, resultCode=Success, msg=''}",
branchCommitResponse.toString());
}
diff --git a/core/src/test/java/io/seata/core/message/BranchRegisterRequestTest.java b/core/src/test/java/io/seata/core/message/BranchRegisterRequestTest.java
index 9b86d099511..0f3ec1ad589 100644
--- a/core/src/test/java/io/seata/core/message/BranchRegisterRequestTest.java
+++ b/core/src/test/java/io/seata/core/message/BranchRegisterRequestTest.java
@@ -35,7 +35,7 @@ public void toStringTest() {
branchRegisterRequest.setBranchType(BranchType.AT);
branchRegisterRequest.setResourceId("resource1");
branchRegisterRequest.setLockKey("lock_key_1");
- Assertions.assertEquals("xid=127.0.0.1:8091:1249853,branchType=AT,resourceId=resource1,lockKey=lock_key_1",
+ Assertions.assertEquals("BranchRegisterRequest{xid='127.0.0.1:8091:1249853', branchType=AT, resourceId='resource1', lockKey='lock_key_1', applicationData='null'}",
branchRegisterRequest.toString());
}
diff --git a/core/src/test/java/io/seata/core/message/BranchRegisterResponseTest.java b/core/src/test/java/io/seata/core/message/BranchRegisterResponseTest.java
index ef431c229ef..88502f223a5 100644
--- a/core/src/test/java/io/seata/core/message/BranchRegisterResponseTest.java
+++ b/core/src/test/java/io/seata/core/message/BranchRegisterResponseTest.java
@@ -38,7 +38,7 @@ public void toStringTest() {
branchRegisterResponse.setResultCode(ResultCode.Success);
branchRegisterResponse.setMsg("");
Assertions.assertEquals(
- "BranchRegisterResponse: branchId=123457,result code =Success,getMsg =",
+ "BranchRegisterResponse{branchId=123457, resultCode=Success, msg=''}",
branchRegisterResponse.toString());
}
diff --git a/core/src/test/java/io/seata/core/message/BranchReportRequestTest.java b/core/src/test/java/io/seata/core/message/BranchReportRequestTest.java
index 86988637c14..c4b0bfbb2a9 100644
--- a/core/src/test/java/io/seata/core/message/BranchReportRequestTest.java
+++ b/core/src/test/java/io/seata/core/message/BranchReportRequestTest.java
@@ -38,9 +38,7 @@ public void testToString() {
branchReportRequest.setStatus(BranchStatus.PhaseOne_Timeout);
branchReportRequest.setApplicationData("test app data");
Assertions.assertEquals(
- "xid=127.0.0.1:8091:1249853,branchId=3,resourceId=resource003,status=PhaseOne_Timeout,"
- + "applicationData=test app"
- + " data",
+ "BranchReportRequest{xid='127.0.0.1:8091:1249853', branchId=3, resourceId='resource003', status=PhaseOne_Timeout, applicationData='test app data', branchType=AT}",
branchReportRequest.toString());
}
diff --git a/core/src/test/java/io/seata/core/message/GlobalBeginRequestTest.java b/core/src/test/java/io/seata/core/message/GlobalBeginRequestTest.java
index 3cc7d57e890..fcd1f9ed8d1 100644
--- a/core/src/test/java/io/seata/core/message/GlobalBeginRequestTest.java
+++ b/core/src/test/java/io/seata/core/message/GlobalBeginRequestTest.java
@@ -37,9 +37,8 @@ public class GlobalBeginRequestTest {
public void testToString() throws Exception {
GlobalBeginRequest globalBeginRequest = new GlobalBeginRequest();
globalBeginRequest.setTransactionName("tran 1");
- System.out.println(globalBeginRequest.toString());
- Assertions.assertEquals("timeout=60000,transactionName=tran 1", globalBeginRequest.toString());
+ Assertions.assertEquals("GlobalBeginRequest{transactionName='tran 1', timeout=60000}", globalBeginRequest.toString());
}
}
\ No newline at end of file
diff --git a/core/src/test/java/io/seata/core/message/GlobalCommitResponseTest.java b/core/src/test/java/io/seata/core/message/GlobalCommitResponseTest.java
index ad1a88afb50..bf4df81783b 100644
--- a/core/src/test/java/io/seata/core/message/GlobalCommitResponseTest.java
+++ b/core/src/test/java/io/seata/core/message/GlobalCommitResponseTest.java
@@ -45,7 +45,7 @@ public void testToString() throws Exception {
System.out.println(globalCommitResponse.toString());
- Assertions.assertEquals("globalStatus=Committed,ResultCode=Success,Msg=OK", globalCommitResponse.toString());
+ Assertions.assertEquals("GlobalCommitResponse{globalStatus=Committed, resultCode=Success, msg='OK'}", globalCommitResponse.toString());
}
}
\ No newline at end of file
diff --git a/core/src/test/java/io/seata/core/message/GlobalRollbackRequestTest.java b/core/src/test/java/io/seata/core/message/GlobalRollbackRequestTest.java
index 70819352b28..22ad1d6d7d3 100644
--- a/core/src/test/java/io/seata/core/message/GlobalRollbackRequestTest.java
+++ b/core/src/test/java/io/seata/core/message/GlobalRollbackRequestTest.java
@@ -33,7 +33,7 @@ public void testToString() {
GlobalRollbackRequest globalRollbackRequest = new GlobalRollbackRequest();
globalRollbackRequest.setXid("127.0.0.1:8091:1249853");
globalRollbackRequest.setExtraData("test_extra_data");
- Assertions.assertEquals("xid=127.0.0.1:8091:1249853,extraData=test_extra_data", globalRollbackRequest.toString());
+ Assertions.assertEquals("GlobalRollbackRequest{xid='127.0.0.1:8091:1249853', extraData='test_extra_data'}", globalRollbackRequest.toString());
}
}
\ No newline at end of file
diff --git a/core/src/test/java/io/seata/core/message/RegisterTMRequestTest.java b/core/src/test/java/io/seata/core/message/RegisterTMRequestTest.java
index eae57ff4c79..3c1b49e8903 100644
--- a/core/src/test/java/io/seata/core/message/RegisterTMRequestTest.java
+++ b/core/src/test/java/io/seata/core/message/RegisterTMRequestTest.java
@@ -37,7 +37,7 @@ public void testToString() throws Exception {
registerTMRequest.setApplicationId("seata");
registerTMRequest.setTransactionServiceGroup("daliy_2019");
registerTMRequest.setVersion("2019-snapshot");
- Assertions.assertEquals("RegisterTMRequest{applicationId='seata', transactionServiceGroup='daliy_2019'}",
+ Assertions.assertEquals("RegisterTMRequest{version='2019-snapshot', applicationId='seata', transactionServiceGroup='daliy_2019', extraData=''}",
registerTMRequest.toString());
}
}
diff --git a/core/src/test/java/io/seata/core/message/RegisterTMResponseTest.java b/core/src/test/java/io/seata/core/message/RegisterTMResponseTest.java
index e546d10bab2..15ce708845f 100644
--- a/core/src/test/java/io/seata/core/message/RegisterTMResponseTest.java
+++ b/core/src/test/java/io/seata/core/message/RegisterTMResponseTest.java
@@ -37,7 +37,7 @@ public void testToString() throws Exception {
registerTMResponse.setVersion("1");
registerTMResponse.setIdentified(true);
registerTMResponse.setResultCode(ResultCode.Success);
- Assertions.assertEquals("version=1,extraData=null,identified=true,resultCode=Success,msg=null",
+ Assertions.assertEquals("RegisterTMResponse{version='1', extraData='null', identified=true, resultCode=Success, msg='null'}",
registerTMResponse.toString());
}
}
diff --git a/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackRequestTest.java b/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackRequestTest.java
index eda94ba4fca..3c7c786e768 100644
--- a/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackRequestTest.java
+++ b/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackRequestTest.java
@@ -34,8 +34,7 @@ public void toStringTest() {
branchRollbackRequest.setResourceId("resource1");
branchRollbackRequest.setApplicationData("app1");
- Assertions.assertEquals("xid=127.0.0.1:9999:39875642,branchId=1,branchType=AT,"
- + "resourceId=resource1,applicationData=app1", branchRollbackRequest.toString());
+ Assertions.assertEquals("BranchRollbackRequest{xid='127.0.0.1:9999:39875642', branchId=1, branchType=AT, resourceId='resource1', applicationData='app1'}", branchRollbackRequest.toString());
}
diff --git a/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackResponseTest.java b/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackResponseTest.java
index 5de4e35ec0c..ee6b480c575 100644
--- a/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackResponseTest.java
+++ b/core/src/test/java/io/seata/core/protocol/transaction/BranchRollbackResponseTest.java
@@ -33,7 +33,7 @@ public void toStringTest() {
branchRollbackResponse.setResultCode(ResultCode.Success);
branchRollbackResponse.setMsg("");
Assertions.assertEquals(
- "xid=127.0.0.1:8091:123456,branchId=2345678,branchStatus=PhaseOne_Done,result code =Success,getMsg =",
+ "BranchRollbackResponse{xid='127.0.0.1:8091:123456', branchId=2345678, branchStatus=PhaseOne_Done, resultCode=Success, msg=''}",
branchRollbackResponse.toString());
}
diff --git a/serializer/seata-serializer-seata/src/test/java/io/seata/serializer/seata/protocol/RegisterTMRequestSerializerTest.java b/serializer/seata-serializer-seata/src/test/java/io/seata/serializer/seata/protocol/RegisterTMRequestSerializerTest.java
index 07281f7b718..99ed2a61374 100644
--- a/serializer/seata-serializer-seata/src/test/java/io/seata/serializer/seata/protocol/RegisterTMRequestSerializerTest.java
+++ b/serializer/seata-serializer-seata/src/test/java/io/seata/serializer/seata/protocol/RegisterTMRequestSerializerTest.java
@@ -98,14 +98,6 @@ public void testGetTypeCode() {
Assertions.assertEquals(TYPE_CODE, registerTMRequest.getTypeCode());
}
- /**
- * Test toString having all the parameters initialized to null
- */
- @Test
- public void testToStringNullValues() {
- Assertions.assertEquals("RegisterTMRequest{" + "applicationId='" + null + '\'' + ", transactionServiceGroup='"
- + null + '\'' + '}', registerTMRequest.toString());
- }
/**
* Test decode method with empty parameter
diff --git a/server/src/main/resources/logback/console-appender.xml b/server/src/main/resources/logback/console-appender.xml
index e18e06823ad..542b1b46afa 100644
--- a/server/src/main/resources/logback/console-appender.xml
+++ b/server/src/main/resources/logback/console-appender.xml
@@ -18,7 +18,7 @@
+ defaultValue="%clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%25.25t]){faint} %clr([%-30.30logger]){cyan} %clr([%20.20M]){faint} %clr([%X{X-TX-XID:-}]){faint} %clr(:){faint} %m%n%wEx2"/>
diff --git a/server/src/main/resources/logback/file-appender.xml b/server/src/main/resources/logback/file-appender.xml
index bfd2d03267b..9225d75efc7 100644
--- a/server/src/main/resources/logback/file-appender.xml
+++ b/server/src/main/resources/logback/file-appender.xml
@@ -20,7 +20,7 @@
+ defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] [%logger] [%M] [%X{X-TX-XID:-}]: %m%n%wEx2"/>
From 8b0a3cbb76f43d44a0165349518ddd89410d481c Mon Sep 17 00:00:00 2001
From: jimin
Date: Thu, 4 May 2023 11:17:31 +0800
Subject: [PATCH 52/76] optimize: update expire gpg key and publish workflow
(#5548)
---
.../{publishes.yml => publish-docker.yml} | 35 +----------------
.github/workflows/publish-ossrh.yml | 39 +++++++++++++++++++
build/pom.xml | 2 +-
changes/en-us/develop.md | 1 +
changes/zh-cn/develop.md | 2 +-
5 files changed, 43 insertions(+), 36 deletions(-)
rename .github/workflows/{publishes.yml => publish-docker.yml} (64%)
create mode 100644 .github/workflows/publish-ossrh.yml
diff --git a/.github/workflows/publishes.yml b/.github/workflows/publish-docker.yml
similarity index 64%
rename from .github/workflows/publishes.yml
rename to .github/workflows/publish-docker.yml
index 9e179e7f9b4..c2a1a60268c 100644
--- a/.github/workflows/publishes.yml
+++ b/.github/workflows/publish-docker.yml
@@ -1,4 +1,4 @@
-name: "Publishes"
+name: "Publish Docker Image"
on:
push:
@@ -11,39 +11,6 @@ on:
jobs:
# job 1
- publish-to-OSSRH:
- name: "Publish to OSSRH"
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- steps:
- # step 1
- - name: "Checkout"
- uses: actions/checkout@v2.4.0
- # step 2
- - name: "Setup Java JDK"
- uses: actions/setup-java@v3.9.0
- with:
- distribution: 'zulu'
- java-version: 8
- server-id: oss_seata
- server-username: OSSRH_USERNAME # Environment variable name for the username for authentication to the Apache Maven repository. Default is $GITHUB_ACTOR
- server-password: OSSRH_PASSWORD # Environment variable name for password or token for authentication to the Apache Maven repository. Default is $GITHUB_TOKEN
- gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
- gpg-passphrase: GPG_PASSPHRASE # Environment variable name for the GPG private key passphrase. Default is $GPG_PASSPHRASE
- # step 3
- - name: "Print maven version"
- run: ./mvnw -version
- # step 4
- - name: "Publish to OSSRH"
- env:
- OSSRH_USERNAME: ${{ secrets.OSSRH_USER }}
- OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
- GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
- run: |
- ./mvnw -T 4C clean deploy -Prelease,release-by-github-actions -DskipTests -e -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
-
- # job 2
publish-images-to-dockerhub:
name: "Publish images to DockerHub"
runs-on: ubuntu-latest
diff --git a/.github/workflows/publish-ossrh.yml b/.github/workflows/publish-ossrh.yml
new file mode 100644
index 00000000000..6cf10be8e20
--- /dev/null
+++ b/.github/workflows/publish-ossrh.yml
@@ -0,0 +1,39 @@
+name: "Publish OSSRH"
+
+on:
+ push:
+ branches: [ develop, 2.x, snapshot, "*.*.*" ]
+
+jobs:
+ # job 1
+ publish-to-OSSRH:
+ name: "Publish to OSSRH"
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ steps:
+ # step 1
+ - name: "Checkout"
+ uses: actions/checkout@v2.4.0
+ # step 2
+ - name: "Setup Java JDK"
+ uses: actions/setup-java@v3.9.0
+ with:
+ distribution: 'zulu'
+ java-version: 8
+ server-id: oss_seata
+ server-username: OSSRH_USERNAME # Environment variable name for the username for authentication to the Apache Maven repository. Default is $GITHUB_ACTOR
+ server-password: OSSRH_PASSWORD # Environment variable name for password or token for authentication to the Apache Maven repository. Default is $GITHUB_TOKEN
+ gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
+ gpg-passphrase: GPG_PASSPHRASE # Environment variable name for the GPG private key passphrase. Default is $GPG_PASSPHRASE
+ # step 3
+ - name: "Print maven version"
+ run: ./mvnw -version
+ # step 4
+ - name: "Publish to OSSRH"
+ env:
+ OSSRH_USERNAME: ${{ secrets.OSSRH_USER }}
+ OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
+ GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
+ run: |
+ ./mvnw -T 4C clean deploy -Prelease,release-by-github-actions -DskipTests -e -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
\ No newline at end of file
diff --git a/build/pom.xml b/build/pom.xml
index 97202e90359..53aca9c1e3d 100644
--- a/build/pom.xml
+++ b/build/pom.xml
@@ -120,7 +120,7 @@
true
false
- A1C4DAB9B220DBA0C277E945D6A1420D747D1EE0
+ 37F181C60AACE24BD5C1D3925583F79497E8E293
diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md
index 4153ab3870b..b97d7ede2a4 100644
--- a/changes/en-us/develop.md
+++ b/changes/en-us/develop.md
@@ -50,6 +50,7 @@ Add changes here for all PR submitted to the develop branch.
- [[#5414](https://github.com/seata/seata/pull/5414)] optimize transaction fail handler
- [[#5537](https://github.com/seata/seata/pull/5537)] optimize transaction log on client side
- [[#5541](https://github.com/seata/seata/pull/5541)] optimize server log output
+- [[#5548](https://github.com/seata/seata/pull/5548)] update expire gpg key and publish workflow
### security:
- [[#5172](https://github.com/seata/seata/pull/5172)] fix some security vulnerabilities
diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md
index 77f3ec3995e..659839fa21c 100644
--- a/changes/zh-cn/develop.md
+++ b/changes/zh-cn/develop.md
@@ -50,7 +50,7 @@
- [[#5414](https://github.com/seata/seata/pull/5414)] 优化事务失败处理 handler
- [[#5537](https://github.com/seata/seata/pull/5537)] 优化客户侧事务日志
- [[#5541](https://github.com/seata/seata/pull/5541)] 优化Server日志输出
-
+- [[#5548](https://github.com/seata/seata/pull/5548)] 优化 gpg key 和 发布流水线
### security:
- [[#5172](https://github.com/seata/seata/pull/5172)] 修复一些安全漏洞的版本
From 35f9fe771da35e0d8ce143627b97cb46397748a9 Mon Sep 17 00:00:00 2001
From: FUNKYE <364176773@qq.com>
Date: Sun, 7 May 2023 17:52:51 +0800
Subject: [PATCH 53/76] bugfix: fix mariadb rollback failed (#5552)
---
changes/en-us/develop.md | 1 +
changes/zh-cn/develop.md | 1 +
.../datasource/undo/AbstractUndoExecutor.java | 33 +++++++------------
.../undo/AbstractUndoLogManager.java | 8 +++--
.../seata/rm/datasource/undo/BaseH2Test.java | 10 ++++--
.../rm/datasource/undo/UndoExecutorTest.java | 32 +++++++++++-------
6 files changed, 46 insertions(+), 39 deletions(-)
diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md
index b97d7ede2a4..d649d3b0de7 100644
--- a/changes/en-us/develop.md
+++ b/changes/en-us/develop.md
@@ -33,6 +33,7 @@ Add changes here for all PR submitted to the develop branch.
- [[#5538](https://github.com/seata/seata/pull/5538)] fix finished transaction swallows exception when committing
- [[#5539](https://github.com/seata/seata/pull/5539)] fix the full table scan issue with 'setDate' condition in Oracle 10g
- [[#5540](https://github.com/seata/seata/pull/5540)] fix GlobalStatus=9 can't be cleared in DB storage mode
+- [[#5552](https://github.com/seata/seata/pull/5552)] fix mariadb rollback failed
### optimize:
- [[#5208](https://github.com/seata/seata/pull/5208)] optimize throwable getCause once more
diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md
index 659839fa21c..45063ebae52 100644
--- a/changes/zh-cn/develop.md
+++ b/changes/zh-cn/develop.md
@@ -33,6 +33,7 @@
- [[#5538](https://github.com/seata/seata/pull/5538)] 修复提交事务时事务已完成不抛出异常问题
- [[#5539](https://github.com/seata/seata/pull/5539)] 修复Oracle 10g where条件包含setDate全表扫描问题
- [[#5540](https://github.com/seata/seata/pull/5540)] 修复 GlobalStatus=9 在DB存储模式无法清除的问题
+- [[#5552](https://github.com/seata/seata/pull/5552)] 修复mariadb回滚失败的问题
### optimize:
- [[#5208](https://github.com/seata/seata/pull/5208)] 优化多次重复获取Throwable#getCause问题
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoExecutor.java
index ac8026eeb6e..a2e70dfa96f 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoExecutor.java
@@ -34,6 +34,7 @@
import io.seata.config.ConfigurationFactory;
import io.seata.core.constants.ConfigurationKeys;
import io.seata.core.model.Result;
+import io.seata.rm.datasource.ConnectionProxy;
import io.seata.sqlparser.util.ColumnUtils;
import io.seata.rm.datasource.DataCompareUtils;
import io.seata.rm.datasource.SqlGenerateUtils;
@@ -43,7 +44,6 @@
import io.seata.rm.datasource.sql.struct.Row;
import io.seata.rm.datasource.sql.struct.TableMeta;
import io.seata.rm.datasource.sql.struct.TableRecords;
-import io.seata.rm.datasource.util.JdbcUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -110,11 +110,12 @@ public SQLUndoLog getSqlUndoLog() {
/**
* Execute on.
*
- * @param conn the conn
+ * @param connectionProxy the connection proxy
* @throws SQLException the sql exception
*/
- public void executeOn(Connection conn) throws SQLException {
- if (IS_UNDO_DATA_VALIDATION_ENABLE && !dataValidationAndGoOn(conn)) {
+ public void executeOn(ConnectionProxy connectionProxy) throws SQLException {
+ Connection conn = connectionProxy.getTargetConnection();
+ if (IS_UNDO_DATA_VALIDATION_ENABLE && !dataValidationAndGoOn(connectionProxy)) {
return;
}
PreparedStatement undoPST = null;
@@ -124,7 +125,7 @@ public void executeOn(Connection conn) throws SQLException {
TableRecords undoRows = getUndoRows();
for (Row undoRow : undoRows.getRows()) {
ArrayList undoValues = new ArrayList<>();
- List pkValueList = getOrderedPkList(undoRows, undoRow, getDbType(conn));
+ List pkValueList = getOrderedPkList(undoRows, undoRow, connectionProxy.getDbType());
for (Field field : undoRow.getFields()) {
if (field.getKeyType() != KeyType.PRIMARY_KEY) {
undoValues.add(field);
@@ -228,7 +229,7 @@ protected void undoPrepare(PreparedStatement undoPST, ArrayList undoValue
* @return return true if data validation is ok and need continue undo, and return false if no need continue undo.
* @throws SQLException the sql exception such as has dirty data
*/
- protected boolean dataValidationAndGoOn(Connection conn) throws SQLException {
+ protected boolean dataValidationAndGoOn(ConnectionProxy conn) throws SQLException {
TableRecords beforeRecords = sqlUndoLog.getBeforeImage();
TableRecords afterRecords = sqlUndoLog.getAfterImage();
@@ -251,7 +252,7 @@ protected boolean dataValidationAndGoOn(Connection conn) throws SQLException {
Result afterEqualsCurrentResult = DataCompareUtils.isRecordsEquals(afterRecords, currentRecords);
if (!afterEqualsCurrentResult.getResult()) {
- // If current data is not equivalent to the after data, then compare the current data with the before
+ // If current data is not equivalent to the after data, then compare the current data with the before
// data, too. No need continue to undo if current data is equivalent to the before data snapshot
Result beforeEqualsCurrentResult = DataCompareUtils.isRecordsEquals(beforeRecords, currentRecords);
if (beforeEqualsCurrentResult.getResult()) {
@@ -282,11 +283,12 @@ protected boolean dataValidationAndGoOn(Connection conn) throws SQLException {
/**
* Query current records.
*
- * @param conn the conn
+ * @param connectionProxy the connection proxy
* @return the table records
* @throws SQLException the sql exception
*/
- protected TableRecords queryCurrentRecords(Connection conn) throws SQLException {
+ protected TableRecords queryCurrentRecords(ConnectionProxy connectionProxy) throws SQLException {
+ Connection conn = connectionProxy.getTargetConnection();
TableRecords undoRecords = getUndoRows();
TableMeta tableMeta = undoRecords.getTableMeta();
//the order of element matters
@@ -301,7 +303,7 @@ protected TableRecords queryCurrentRecords(Connection conn) throws SQLException
String firstKey = pkRowValues.keySet().stream().findFirst().get();
int pkRowSize = pkRowValues.get(firstKey).size();
String checkSQL = String.format(CHECK_SQL_TEMPLATE, sqlUndoLog.getTableName(),
- SqlGenerateUtils.buildWhereConditionByPKs(pkNameList, pkRowSize, getDbType(conn)));
+ SqlGenerateUtils.buildWhereConditionByPKs(pkNameList, pkRowSize, connectionProxy.getDbType()));
PreparedStatement statement = null;
ResultSet checkSet = null;
@@ -380,15 +382,4 @@ protected Map> parsePkValues(List rows, List pk
return pkValueMap;
}
- /**
- * Get db type
- *
- * @param conn the connection
- * @return the db type
- * @throws SQLException SQLException
- */
- protected String getDbType(Connection conn) throws SQLException {
- return JdbcUtils.getDbType(conn.getMetaData().getURL());
- }
-
}
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoLogManager.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoLogManager.java
index 95543d3c094..e6ae3232075 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoLogManager.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/AbstractUndoLogManager.java
@@ -255,6 +255,7 @@ public void flushUndoLogs(ConnectionProxy cp) throws SQLException {
*/
@Override
public void undo(DataSourceProxy dataSourceProxy, String xid, long branchId) throws TransactionException {
+ ConnectionProxy connectionProxy = null;
Connection conn = null;
ResultSet rs = null;
PreparedStatement selectPST = null;
@@ -262,7 +263,8 @@ public void undo(DataSourceProxy dataSourceProxy, String xid, long branchId) thr
for (; ; ) {
try {
- conn = dataSourceProxy.getPlainConnection();
+ connectionProxy = dataSourceProxy.getConnection();
+ conn = connectionProxy.getTargetConnection();
// The entire undo process should run in a local transaction.
if (originalAutoCommit = conn.getAutoCommit()) {
@@ -312,7 +314,7 @@ public void undo(DataSourceProxy dataSourceProxy, String xid, long branchId) thr
sqlUndoLog.setTableMeta(tableMeta);
AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(
dataSourceProxy.getDbType(), sqlUndoLog);
- undoExecutor.executeOn(conn);
+ undoExecutor.executeOn(connectionProxy);
}
} finally {
// remove serializer name
@@ -381,7 +383,7 @@ public void undo(DataSourceProxy dataSourceProxy, String xid, long branchId) thr
if (originalAutoCommit) {
conn.setAutoCommit(true);
}
- conn.close();
+ connectionProxy.close();
}
} catch (SQLException closeEx) {
LOGGER.warn("Failed to close JDBC resource while undo ... ", closeEx);
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java
index 9da87a72e07..ed3bab07f02 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/BaseH2Test.java
@@ -16,6 +16,8 @@
package io.seata.rm.datasource.undo;
import io.seata.common.util.IOUtil;
+import io.seata.rm.datasource.ConnectionProxy;
+import io.seata.rm.datasource.DataSourceProxy;
import io.seata.rm.datasource.sql.struct.ColumnMeta;
import io.seata.rm.datasource.sql.struct.Field;
import io.seata.rm.datasource.sql.struct.KeyType;
@@ -44,7 +46,9 @@ public abstract class BaseH2Test {
static BasicDataSource dataSource = null;
- static Connection connection = null;
+ static ConnectionProxy connection = null;
+
+ static DataSourceProxy dataSourceProxy = null;
static TableMeta tableMeta = null;
@@ -55,8 +59,8 @@ public static void start() throws SQLException {
dataSource.setUrl("jdbc:h2:./db_store/test_undo");
dataSource.setUsername("sa");
dataSource.setPassword("");
-
- connection = dataSource.getConnection();
+ dataSourceProxy = new DataSourceProxy(dataSource);
+ connection = dataSourceProxy.getConnection();
tableMeta = mockTableMeta();
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/UndoExecutorTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/UndoExecutorTest.java
index 2946e9204e8..43ccb10c595 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/UndoExecutorTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/UndoExecutorTest.java
@@ -49,6 +49,9 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
+import io.seata.rm.datasource.ConnectionProxy;
+import io.seata.rm.datasource.DataSourceProxy;
+import io.seata.rm.datasource.mock.MockDataSource;
import io.seata.sqlparser.SQLType;
import io.seata.rm.datasource.sql.struct.Field;
import io.seata.rm.datasource.sql.struct.KeyType;
@@ -56,6 +59,7 @@
import io.seata.rm.datasource.sql.struct.TableMeta;
import io.seata.rm.datasource.sql.struct.TableRecords;
import io.seata.sqlparser.util.JdbcConstants;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -64,6 +68,12 @@
*/
public class UndoExecutorTest {
+ MockConnection connection = new MockConnection();
+ MockDataSource dataSource = new MockDataSource();
+ DataSourceProxy dataSourceProxy = new DataSourceProxy(dataSource);
+ ConnectionProxy connectionProxy = new ConnectionProxy(dataSourceProxy, connection);
+
+
/**
* Test field.
*/
@@ -146,12 +156,11 @@ public void testUpdate() throws SQLException {
SQLUndoLog.setAfterImage(afterImage);
AbstractUndoExecutor executor = UndoExecutorFactory.getUndoExecutor(JdbcConstants.MYSQL, SQLUndoLog);
- MockConnection connection = new MockConnection();
AbstractUndoExecutor spy = Mockito.spy(executor);
// skip data validation
- Mockito.doReturn(true).when(spy).dataValidationAndGoOn(connection);
- Mockito.doReturn(JdbcConstants.MYSQL).when(spy).getDbType(connection);
- spy.executeOn(connection);
+ Mockito.doReturn(true).when(spy).dataValidationAndGoOn(connectionProxy);
+ Assertions.assertEquals(JdbcConstants.MYSQL,connectionProxy.getDbType());
+ spy.executeOn(connectionProxy);
}
/**
@@ -216,12 +225,11 @@ public void testInsert() throws SQLException {
SQLUndoLog.setAfterImage(afterImage);
AbstractUndoExecutor executor = UndoExecutorFactory.getUndoExecutor(JdbcConstants.MYSQL, SQLUndoLog);
- MockConnection connection = new MockConnection();
AbstractUndoExecutor spy = Mockito.spy(executor);
// skip data validation
- Mockito.doReturn(true).when(spy).dataValidationAndGoOn(connection);
- Mockito.doReturn(JdbcConstants.MYSQL).when(spy).getDbType(connection);
- spy.executeOn(connection);
+ Mockito.doReturn(true).when(spy).dataValidationAndGoOn(connectionProxy);
+ Assertions.assertEquals(JdbcConstants.MYSQL,connectionProxy.getDbType());
+ spy.executeOn(connectionProxy);
}
/**
@@ -286,12 +294,12 @@ public void testDelete() throws SQLException {
SQLUndoLog.setBeforeImage(beforeImage);
AbstractUndoExecutor executor = UndoExecutorFactory.getUndoExecutor(JdbcConstants.MYSQL, SQLUndoLog);
- MockConnection connection = new MockConnection();
+
AbstractUndoExecutor spy = Mockito.spy(executor);
// skip data validation
- Mockito.doReturn(true).when(spy).dataValidationAndGoOn(connection);
- Mockito.doReturn(JdbcConstants.MYSQL).when(spy).getDbType(connection);
- spy.executeOn(connection);
+ Mockito.doReturn(true).when(spy).dataValidationAndGoOn(connectionProxy);
+ Assertions.assertEquals(JdbcConstants.MYSQL,connectionProxy.getDbType());
+ spy.executeOn(connectionProxy);
}
/**
From 6b1a84f4ecb705fdf0e0e4fd96dc76698da3ecd7 Mon Sep 17 00:00:00 2001
From: justabug
Date: Thu, 1 Jun 2023 09:24:40 +0800
Subject: [PATCH 54/76] bugfix: fix log in participant transaction role (#5602)
---
changes/en-us/develop.md | 1 +
changes/zh-cn/develop.md | 1 +
.../tm/api/DefaultGlobalTransaction.java | 7 +++++-
.../seata/tm/api/TransactionalTemplate.java | 22 ++++++-------------
4 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md
index d649d3b0de7..52cd58da048 100644
--- a/changes/en-us/develop.md
+++ b/changes/en-us/develop.md
@@ -34,6 +34,7 @@ Add changes here for all PR submitted to the develop branch.
- [[#5539](https://github.com/seata/seata/pull/5539)] fix the full table scan issue with 'setDate' condition in Oracle 10g
- [[#5540](https://github.com/seata/seata/pull/5540)] fix GlobalStatus=9 can't be cleared in DB storage mode
- [[#5552](https://github.com/seata/seata/pull/5552)] fix mariadb rollback failed
+- [[#5602](https://github.com/seata/seata/pull/5602)] fix log in participant transaction role
### optimize:
- [[#5208](https://github.com/seata/seata/pull/5208)] optimize throwable getCause once more
diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md
index 45063ebae52..cf7ff480905 100644
--- a/changes/zh-cn/develop.md
+++ b/changes/zh-cn/develop.md
@@ -34,6 +34,7 @@
- [[#5539](https://github.com/seata/seata/pull/5539)] 修复Oracle 10g where条件包含setDate全表扫描问题
- [[#5540](https://github.com/seata/seata/pull/5540)] 修复 GlobalStatus=9 在DB存储模式无法清除的问题
- [[#5552](https://github.com/seata/seata/pull/5552)] 修复mariadb回滚失败的问题
+- [[#5602](https://github.com/seata/seata/pull/5602)] 修复participant情况下的重复日志
### optimize:
- [[#5208](https://github.com/seata/seata/pull/5208)] 优化多次重复获取Throwable#getCause问题
diff --git a/tm/src/main/java/io/seata/tm/api/DefaultGlobalTransaction.java b/tm/src/main/java/io/seata/tm/api/DefaultGlobalTransaction.java
index 79fb26eb289..478dae261af 100644
--- a/tm/src/main/java/io/seata/tm/api/DefaultGlobalTransaction.java
+++ b/tm/src/main/java/io/seata/tm/api/DefaultGlobalTransaction.java
@@ -129,6 +129,9 @@ public void commit() throws TransactionException {
return;
}
assertXIDNotNull();
+ if (LOGGER.isInfoEnabled()) {
+ LOGGER.info("transaction {} will be commit", xid);
+ }
int retry = COMMIT_RETRY_COUNT <= 0 ? DEFAULT_TM_COMMIT_RETRY_COUNT : COMMIT_RETRY_COUNT;
try {
while (retry > 0) {
@@ -164,7 +167,9 @@ public void rollback() throws TransactionException {
return;
}
assertXIDNotNull();
-
+ if (LOGGER.isInfoEnabled()) {
+ LOGGER.info("transaction {} will be rollback", xid);
+ }
int retry = ROLLBACK_RETRY_COUNT <= 0 ? DEFAULT_TM_ROLLBACK_RETRY_COUNT : ROLLBACK_RETRY_COUNT;
try {
while (retry > 0) {
diff --git a/tm/src/main/java/io/seata/tm/api/TransactionalTemplate.java b/tm/src/main/java/io/seata/tm/api/TransactionalTemplate.java
index 83932934759..01998a4400b 100644
--- a/tm/src/main/java/io/seata/tm/api/TransactionalTemplate.java
+++ b/tm/src/main/java/io/seata/tm/api/TransactionalTemplate.java
@@ -74,8 +74,8 @@ public Object execute(TransactionalExecutor business) throws Throwable {
// If transaction is existing, suspend it, and then begin new transaction.
if (existingTransaction(tx)) {
suspendedResourcesHolder = tx.suspend(false);
- tx = GlobalTransactionContext.createNew();
}
+ tx = GlobalTransactionContext.createNew();
// Continue and execute with new transaction
break;
case SUPPORTS:
@@ -86,8 +86,8 @@ public Object execute(TransactionalExecutor business) throws Throwable {
// Continue and execute with new transaction
break;
case REQUIRED:
- // If current transaction is existing, execute with current transaction,
- // else continue and execute with new transaction.
+ // If current transaction is existing, execute with current transaction,else create
+ tx = GlobalTransactionContext.getCurrentOrCreate();
break;
case NEVER:
// If transaction is existing, throw exception.
@@ -110,14 +110,13 @@ public Object execute(TransactionalExecutor business) throws Throwable {
throw new TransactionException("Not Supported Propagation:" + propagation);
}
- // 1.3 If null, create new transaction with role 'GlobalTransactionRole.Launcher'.
- if (tx == null) {
- tx = GlobalTransactionContext.createNew();
- }
-
// set current tx config to holder
GlobalLockConfig previousConfig = replaceGlobalLockConfig(txInfo);
+ if (tx.getGlobalTransactionRole() == GlobalTransactionRole.Participant) {
+ LOGGER.info("join into a existing global transaction,xid={}", tx.getXid());
+ }
+
try {
// 2. If the tx role is 'GlobalTransactionRole.Launcher', send the request of beginTransaction to TC,
// else do nothing. Of course, the hooks will still be triggered.
@@ -211,9 +210,6 @@ private void commitTransaction(GlobalTransaction tx, TransactionInfo txInfo)
try {
triggerBeforeCommit();
- if (LOGGER.isInfoEnabled()) {
- LOGGER.info("transaction {} will be commit", tx.getXid());
- }
tx.commit();
GlobalStatus afterCommitStatus = tx.getLocalStatus();
TransactionalExecutor.Code code = TransactionalExecutor.Code.Unknown;
@@ -252,10 +248,6 @@ private void rollbackTransaction(GlobalTransaction tx, Throwable originalExcepti
try {
triggerBeforeRollback();
- if (LOGGER.isInfoEnabled()) {
- LOGGER.info("transaction {} will be rollback, cause by:{}", tx.getXid(),
- originalException.getMessage());
- }
tx.rollback();
triggerAfterRollback();
} catch (TransactionException txe) {
From bd18f087ea4a7f93431de0cddb315ff79ce5a879 Mon Sep 17 00:00:00 2001
From: StephenFaust <76416760+StephenFaust@users.noreply.github.com>
Date: Thu, 8 Jun 2023 12:01:15 +0800
Subject: [PATCH 55/76] bugfix: grpc interceptor xid unbinding problem (#5583)
---
changes/en-us/develop.md | 1 +
changes/zh-cn/develop.md | 1 +
.../grpc/interceptor/server/ServerListenerProxy.java | 10 ++++------
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md
index 52cd58da048..bd35c58c196 100644
--- a/changes/en-us/develop.md
+++ b/changes/en-us/develop.md
@@ -34,6 +34,7 @@ Add changes here for all PR submitted to the develop branch.
- [[#5539](https://github.com/seata/seata/pull/5539)] fix the full table scan issue with 'setDate' condition in Oracle 10g
- [[#5540](https://github.com/seata/seata/pull/5540)] fix GlobalStatus=9 can't be cleared in DB storage mode
- [[#5552](https://github.com/seata/seata/pull/5552)] fix mariadb rollback failed
+- [[#5583](https://github.com/seata/seata/pull/5583)] fix grpc interceptor xid unbinding problem
- [[#5602](https://github.com/seata/seata/pull/5602)] fix log in participant transaction role
### optimize:
diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md
index cf7ff480905..ae7f5e8fee5 100644
--- a/changes/zh-cn/develop.md
+++ b/changes/zh-cn/develop.md
@@ -34,6 +34,7 @@
- [[#5539](https://github.com/seata/seata/pull/5539)] 修复Oracle 10g where条件包含setDate全表扫描问题
- [[#5540](https://github.com/seata/seata/pull/5540)] 修复 GlobalStatus=9 在DB存储模式无法清除的问题
- [[#5552](https://github.com/seata/seata/pull/5552)] 修复mariadb回滚失败的问题
+- [[#5583](https://github.com/seata/seata/pull/5583)] 修复grpc xid 解绑问题
- [[#5602](https://github.com/seata/seata/pull/5602)] 修复participant情况下的重复日志
### optimize:
diff --git a/integration/grpc/src/main/java/io/seata/integration/grpc/interceptor/server/ServerListenerProxy.java b/integration/grpc/src/main/java/io/seata/integration/grpc/interceptor/server/ServerListenerProxy.java
index 03d838487f6..66eb7b944b5 100644
--- a/integration/grpc/src/main/java/io/seata/integration/grpc/interceptor/server/ServerListenerProxy.java
+++ b/integration/grpc/src/main/java/io/seata/integration/grpc/interceptor/server/ServerListenerProxy.java
@@ -18,6 +18,7 @@
import io.grpc.ServerCall;
import io.seata.common.util.StringUtils;
import io.seata.core.context.RootContext;
+import io.seata.core.model.BranchType;
import java.util.Objects;
@@ -43,6 +44,7 @@ public void onMessage(ReqT message) {
@Override
public void onHalfClose() {
+ RootContext.unbind();
if (StringUtils.isNotBlank(xid)) {
RootContext.bind(xid);
}
@@ -51,17 +53,11 @@ public void onHalfClose() {
@Override
public void onCancel() {
- if (StringUtils.isNotBlank(xid) && RootContext.inGlobalTransaction()) {
- RootContext.unbind();
- }
target.onCancel();
}
@Override
public void onComplete() {
- if (StringUtils.isNotBlank(xid) && RootContext.inGlobalTransaction()) {
- RootContext.unbind();
- }
target.onComplete();
}
@@ -69,4 +65,6 @@ public void onComplete() {
public void onReady() {
target.onReady();
}
+
+
}
From 6851eb42c01ad01033a84be1abc89a4b7e654891 Mon Sep 17 00:00:00 2001
From: jimin
Date: Wed, 14 Jun 2023 21:42:13 +0800
Subject: [PATCH 56/76] bugfix: fix oracle insert undolog failed (#5645)
Signed-off-by: slievrly
---
changes/en-us/develop.md | 1 +
changes/zh-cn/develop.md | 1 +
script/client/at/db/oracle.sql | 7 ++++++-
script/client/at/db/postgresql.sql | 6 +++++-
4 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md
index bd35c58c196..8930e4c88d8 100644
--- a/changes/en-us/develop.md
+++ b/changes/en-us/develop.md
@@ -36,6 +36,7 @@ Add changes here for all PR submitted to the develop branch.
- [[#5552](https://github.com/seata/seata/pull/5552)] fix mariadb rollback failed
- [[#5583](https://github.com/seata/seata/pull/5583)] fix grpc interceptor xid unbinding problem
- [[#5602](https://github.com/seata/seata/pull/5602)] fix log in participant transaction role
+- [[#5645](https://github.com/seata/seata/pull/5645)] fix oracle insert undolog failed
### optimize:
- [[#5208](https://github.com/seata/seata/pull/5208)] optimize throwable getCause once more
diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md
index ae7f5e8fee5..62a471193d2 100644
--- a/changes/zh-cn/develop.md
+++ b/changes/zh-cn/develop.md
@@ -36,6 +36,7 @@
- [[#5552](https://github.com/seata/seata/pull/5552)] 修复mariadb回滚失败的问题
- [[#5583](https://github.com/seata/seata/pull/5583)] 修复grpc xid 解绑问题
- [[#5602](https://github.com/seata/seata/pull/5602)] 修复participant情况下的重复日志
+- [[#5645](https://github.com/seata/seata/pull/5645)] 修复 oracle 插入 undolog 失败问题
### optimize:
- [[#5208](https://github.com/seata/seata/pull/5208)] 优化多次重复获取Throwable#getCause问题
diff --git a/script/client/at/db/oracle.sql b/script/client/at/db/oracle.sql
index e1db1e95d44..364dc68b74a 100644
--- a/script/client/at/db/oracle.sql
+++ b/script/client/at/db/oracle.sql
@@ -1,6 +1,7 @@
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE undo_log
(
+ id NUMBER(19) NOT NULL,
branch_id NUMBER(19) NOT NULL,
xid VARCHAR2(128) NOT NULL,
context VARCHAR2(128) NOT NULL,
@@ -8,6 +9,7 @@ CREATE TABLE undo_log
log_status NUMBER(10) NOT NULL,
log_created TIMESTAMP(0) NOT NULL,
log_modified TIMESTAMP(0) NOT NULL,
+ PRIMARY KEY (id),
CONSTRAINT ux_undo_log UNIQUE (xid, branch_id)
);
CREATE INDEX ix_log_created ON undo_log(log_created);
@@ -18,4 +20,7 @@ COMMENT ON COLUMN undo_log.context is 'undo_log context,such as serialization';
COMMENT ON COLUMN undo_log.rollback_info is 'rollback info';
COMMENT ON COLUMN undo_log.log_status is '0:normal status,1:defense status';
COMMENT ON COLUMN undo_log.log_created is 'create datetime';
-COMMENT ON COLUMN undo_log.log_modified is 'modify datetime';
\ No newline at end of file
+COMMENT ON COLUMN undo_log.log_modified is 'modify datetime';
+
+-- Generate ID using sequence and trigger
+CREATE SEQUENCE UNDO_LOG_SEQ START WITH 1 INCREMENT BY 1;
\ No newline at end of file
diff --git a/script/client/at/db/postgresql.sql b/script/client/at/db/postgresql.sql
index 6b9feddd406..bf562bcbdc3 100644
--- a/script/client/at/db/postgresql.sql
+++ b/script/client/at/db/postgresql.sql
@@ -1,6 +1,7 @@
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS public.undo_log
(
+ id SERIAL NOT NULL,
branch_id BIGINT NOT NULL,
xid VARCHAR(128) NOT NULL,
context VARCHAR(128) NOT NULL,
@@ -8,6 +9,7 @@ CREATE TABLE IF NOT EXISTS public.undo_log
log_status INT NOT NULL,
log_created TIMESTAMP(0) NOT NULL,
log_modified TIMESTAMP(0) NOT NULL,
+ CONSTRAINT pk_undo_log PRIMARY KEY (id),
CONSTRAINT ux_undo_log UNIQUE (xid, branch_id)
);
CREATE INDEX ix_log_created ON undo_log(log_created);
@@ -19,4 +21,6 @@ COMMENT ON COLUMN public.undo_log.context IS 'undo_log context,such as serializa
COMMENT ON COLUMN public.undo_log.rollback_info IS 'rollback info';
COMMENT ON COLUMN public.undo_log.log_status IS '0:normal status,1:defense status';
COMMENT ON COLUMN public.undo_log.log_created IS 'create datetime';
-COMMENT ON COLUMN public.undo_log.log_modified IS 'modify datetime';
\ No newline at end of file
+COMMENT ON COLUMN public.undo_log.log_modified IS 'modify datetime';
+
+CREATE SEQUENCE IF NOT EXISTS undo_log_id_seq INCREMENT BY 1 MINVALUE 1 ;
\ No newline at end of file
From 85330dc7930791c540dbda257e3dfdd466bd0f5f Mon Sep 17 00:00:00 2001
From: jimin
Date: Wed, 14 Jun 2023 22:40:09 +0800
Subject: [PATCH 57/76] optimize: refactor ColumnUtils and EscapeHandler
(#5646)
Signed-off-by: slievrly
---
changes/en-us/develop.md | 1 +
changes/zh-cn/develop.md | 1 +
.../exec/BaseTransactionalExecutor.java | 2 +-
.../datasource/exec/MultiUpdateExecutor.java | 4 +-
.../rm/datasource/exec/UpdateExecutor.java | 4 +-
.../handler/mariadb/MariadbEscapeHandler.java | 29 +--
.../handler/mysql/MySQLEscapeHandler.java} | 24 ++-
.../handler/oracle/OracleEscapeHandler.java} | 37 +++-
.../postgresql/PostgresqlEscapeHandler.java} | 24 ++-
.../services/io.seata.sqlparser.EscapeHandler | 4 +
.../io.seata.sqlparser.KeywordChecker | 3 -
.../seata/rm/datasource/ColumnUtilsTest.java | 22 +--
.../sql/handler/EscapeHandlerTest.java | 129 ++++++++++++
...est.java => EscapeHandlerFactoryTest.java} | 12 +-
...ywordChecker.java => H2EscapeHandler.java} | 4 +-
...rTest.java => MySQLEscapeHandlerTest.java} | 10 +-
...Test.java => OracleEscapeHandlerTest.java} | 10 +-
....java => PostgresqlEscapeHandlerTest.java} | 10 +-
.../services/io.seata.sqlparser.EscapeHandler | 1 +
.../io.seata.sqlparser.KeywordChecker | 1 -
.../mysql/AntlrMySQLInsertRecognizer.java | 2 +-
.../mysql/AntlrMySQLUpdateRecognizer.java | 2 +-
.../io/seata/sqlparser/EscapeHandler.java | 148 ++++++++++++++
...Factory.java => EscapeHandlerFactory.java} | 10 +-
.../seata/sqlparser/SQLInsertRecognizer.java | 2 +-
.../seata/sqlparser/SQLUpdateRecognizer.java | 2 +-
.../io/seata/sqlparser/util/ColumnUtils.java | 185 ++----------------
.../druid/mysql/MySQLInsertRecognizer.java | 2 +-
.../druid/mysql/MySQLUpdateRecognizer.java | 2 +-
.../druid/oracle/OracleInsertRecognizer.java | 2 +-
.../druid/oracle/OracleUpdateRecognizer.java | 2 +-
.../PostgresqlInsertRecognizer.java | 2 +-
.../PostgresqlUpdateRecognizer.java | 2 +-
.../druid/MySQLInsertRecognizerTest.java | 11 --
.../druid/MySQLUpdateRecognizerTest.java | 11 --
35 files changed, 425 insertions(+), 292 deletions(-)
rename sqlparser/seata-sqlparser-core/src/main/java/io/seata/sqlparser/KeywordChecker.java => rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mariadb/MariadbEscapeHandler.java (50%)
rename rm-datasource/src/main/java/io/seata/rm/datasource/{undo/mysql/keyword/MySQLKeywordChecker.java => sql/handler/mysql/MySQLEscapeHandler.java} (97%)
rename rm-datasource/src/main/java/io/seata/rm/datasource/{undo/oracle/keyword/OracleKeywordChecker.java => sql/handler/oracle/OracleEscapeHandler.java} (91%)
rename rm-datasource/src/main/java/io/seata/rm/datasource/{undo/postgresql/keyword/PostgresqlKeywordChecker.java => sql/handler/postgresql/PostgresqlEscapeHandler.java} (91%)
create mode 100644 rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.EscapeHandler
delete mode 100644 rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.KeywordChecker
create mode 100644 rm-datasource/src/test/java/io/seata/rm/datasource/sql/handler/EscapeHandlerTest.java
rename rm-datasource/src/test/java/io/seata/rm/datasource/undo/{KeywordCheckerFactoryTest.java => EscapeHandlerFactoryTest.java} (72%)
rename rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/{H2KeywordChecker.java => H2EscapeHandler.java} (86%)
rename rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/{MySQLKeywordCheckerTest.java => MySQLEscapeHandlerTest.java} (96%)
rename rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/{OracleKeywordCheckerTest.java => OracleEscapeHandlerTest.java} (75%)
rename rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/{PostgresqlKeywordCheckerTest.java => PostgresqlEscapeHandlerTest.java} (75%)
create mode 100644 rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.EscapeHandler
delete mode 100644 rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.KeywordChecker
create mode 100644 sqlparser/seata-sqlparser-core/src/main/java/io/seata/sqlparser/EscapeHandler.java
rename sqlparser/seata-sqlparser-core/src/main/java/io/seata/sqlparser/{KeywordCheckerFactory.java => EscapeHandlerFactory.java} (73%)
diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md
index 8930e4c88d8..2b7e932cbba 100644
--- a/changes/en-us/develop.md
+++ b/changes/en-us/develop.md
@@ -55,6 +55,7 @@ Add changes here for all PR submitted to the develop branch.
- [[#5537](https://github.com/seata/seata/pull/5537)] optimize transaction log on client side
- [[#5541](https://github.com/seata/seata/pull/5541)] optimize server log output
- [[#5548](https://github.com/seata/seata/pull/5548)] update expire gpg key and publish workflow
+- [[#5646](https://github.com/seata/seata/pull/5646)] refactor ColumnUtils and EscapeHandler
### security:
- [[#5172](https://github.com/seata/seata/pull/5172)] fix some security vulnerabilities
diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md
index 62a471193d2..1405462d5d1 100644
--- a/changes/zh-cn/develop.md
+++ b/changes/zh-cn/develop.md
@@ -55,6 +55,7 @@
- [[#5537](https://github.com/seata/seata/pull/5537)] 优化客户侧事务日志
- [[#5541](https://github.com/seata/seata/pull/5541)] 优化Server日志输出
- [[#5548](https://github.com/seata/seata/pull/5548)] 优化 gpg key 和 发布流水线
+- [[#5646](https://github.com/seata/seata/pull/5646)] 重构 ColumnUtils 和 EscapeHandler
### security:
- [[#5172](https://github.com/seata/seata/pull/5172)] 修复一些安全漏洞的版本
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java
index fce287d97db..a1cc2e1c175 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java
@@ -496,7 +496,7 @@ protected TableRecords buildTableRecords(Map> pkValuesMap)
List insertColumns = recognizer.getInsertColumns();
if (ONLY_CARE_UPDATE_COLUMNS && CollectionUtils.isNotEmpty(insertColumns)) {
Set columns = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
- columns.addAll(recognizer.getInsertColumnsIsSimplified());
+ columns.addAll(recognizer.getInsertColumnsUnEscape());
columns.addAll(pkColumnNameList);
for (String columnName : columns) {
selectSQLJoin.add(columnName);
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java
index 0f0c59c63af..6103a669ef6 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/MultiUpdateExecutor.java
@@ -88,7 +88,7 @@ protected TableRecords beforeImage() throws SQLException {
throw new NotSupportYetException("Multi update SQL with orderBy condition is not support yet !");
}
- List updateColumns = sqlUpdateRecognizer.getUpdateColumnsIsSimplified();
+ List updateColumns = sqlUpdateRecognizer.getUpdateColumnsUnEscape();
updateColumnsSet.addAll(updateColumns);
if (noWhereCondition) {
continue;
@@ -155,7 +155,7 @@ private String buildAfterImageSQL(TableMeta tableMeta, TableRecords beforeImage)
for (SQLRecognizer recognizer : sqlRecognizers) {
sqlRecognizer = recognizer;
SQLUpdateRecognizer sqlUpdateRecognizer = (SQLUpdateRecognizer) sqlRecognizer;
- updateColumnsSet.addAll(sqlUpdateRecognizer.getUpdateColumnsIsSimplified());
+ updateColumnsSet.addAll(sqlUpdateRecognizer.getUpdateColumnsUnEscape());
}
StringBuilder prefix = new StringBuilder("SELECT ");
String suffix = " FROM " + getFromTableInSQL() + " WHERE " + SqlGenerateUtils.buildWhereConditionByPKs(tableMeta.getPrimaryKeyOnlyName(), beforeImage.pkRows().size(), getDbType());
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java
index 2200c771206..8607b99a1d7 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/UpdateExecutor.java
@@ -91,7 +91,7 @@ private String buildBeforeImageSQL(TableMeta tableMeta, ArrayList>
}
suffix.append(" FOR UPDATE");
StringJoiner selectSQLJoin = new StringJoiner(", ", prefix.toString(), suffix.toString());
- List needUpdateColumns = getNeedUpdateColumns(tableMeta.getTableName(), sqlRecognizer.getTableAlias(), recognizer.getUpdateColumnsIsSimplified());
+ List needUpdateColumns = getNeedUpdateColumns(tableMeta.getTableName(), sqlRecognizer.getTableAlias(), recognizer.getUpdateColumnsUnEscape());
needUpdateColumns.forEach(selectSQLJoin::add);
return selectSQLJoin.toString();
}
@@ -119,7 +119,7 @@ private String buildAfterImageSQL(TableMeta tableMeta, TableRecords beforeImage)
String suffix = " FROM " + getFromTableInSQL() + " WHERE " + whereSql;
StringJoiner selectSQLJoiner = new StringJoiner(", ", prefix.toString(), suffix);
SQLUpdateRecognizer recognizer = (SQLUpdateRecognizer) sqlRecognizer;
- List needUpdateColumns = getNeedUpdateColumns(tableMeta.getTableName(), sqlRecognizer.getTableAlias(), recognizer.getUpdateColumnsIsSimplified());
+ List needUpdateColumns = getNeedUpdateColumns(tableMeta.getTableName(), sqlRecognizer.getTableAlias(), recognizer.getUpdateColumnsUnEscape());
needUpdateColumns.forEach(selectSQLJoiner::add);
return selectSQLJoiner.toString();
}
diff --git a/sqlparser/seata-sqlparser-core/src/main/java/io/seata/sqlparser/KeywordChecker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mariadb/MariadbEscapeHandler.java
similarity index 50%
rename from sqlparser/seata-sqlparser-core/src/main/java/io/seata/sqlparser/KeywordChecker.java
rename to rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mariadb/MariadbEscapeHandler.java
index 2972319e90e..a9f3ada884c 100644
--- a/sqlparser/seata-sqlparser-core/src/main/java/io/seata/sqlparser/KeywordChecker.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mariadb/MariadbEscapeHandler.java
@@ -13,28 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.seata.sqlparser;
+package io.seata.rm.datasource.sql.handler.mariadb;
+
+import io.seata.common.loader.LoadLevel;
+import io.seata.rm.datasource.sql.handler.mysql.MySQLEscapeHandler;
+import io.seata.sqlparser.util.JdbcConstants;
/**
- * The interface Keyword checker.
+ * The type Mariadb escape handler.
*
- * @author Wu
+ * @author slievrly
*/
-public interface KeywordChecker {
- /**
- * check whether given field name and table name use keywords
- *
- * @param fieldOrTableName the field or table name
- * @return boolean
- */
- boolean check(String fieldOrTableName);
-
-
- /**
- * check whether given field or table name use keywords. the method has database special logic.
- * @param fieldOrTableName the field or table name
- * @return true: need to escape. false: no need to escape.
- */
- boolean checkEscape(String fieldOrTableName);
-
+@LoadLevel(name = JdbcConstants.MARIADB)
+public class MariadbEscapeHandler extends MySQLEscapeHandler {
}
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLKeywordChecker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mysql/MySQLEscapeHandler.java
similarity index 97%
rename from rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLKeywordChecker.java
rename to rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mysql/MySQLEscapeHandler.java
index f060dce5c1e..02ea2ff7291 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLKeywordChecker.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/mysql/MySQLEscapeHandler.java
@@ -13,14 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.seata.rm.datasource.undo.mysql.keyword;
+package io.seata.rm.datasource.sql.handler.mysql;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import io.seata.common.loader.LoadLevel;
-import io.seata.sqlparser.KeywordChecker;
+import io.seata.common.util.StringUtils;
+import io.seata.sqlparser.EscapeHandler;
import io.seata.sqlparser.util.JdbcConstants;
/**
@@ -29,7 +30,7 @@
* @author xingfudeshi@gmail.com
*/
@LoadLevel(name = JdbcConstants.MYSQL)
-public class MySQLKeywordChecker implements KeywordChecker {
+public class MySQLEscapeHandler implements EscapeHandler {
private Set keywordSet = Arrays.stream(MySQLKeyword.values()).map(MySQLKeyword::name).collect(Collectors.toSet());
@@ -1101,7 +1102,7 @@ private enum MySQLKeyword {
@Override
- public boolean check(String fieldOrTableName) {
+ public boolean checkIfKeyWords(String fieldOrTableName) {
if (keywordSet.contains(fieldOrTableName)) {
return true;
}
@@ -1113,8 +1114,19 @@ public boolean check(String fieldOrTableName) {
}
@Override
- public boolean checkEscape(String fieldOrTableName) {
- return check(fieldOrTableName);
+ public boolean checkIfNeedEscape(String fieldOrTableName) {
+ if (StringUtils.isBlank(fieldOrTableName)) {
+ return false;
+ }
+ fieldOrTableName = fieldOrTableName.trim();
+ if (containsEscape(fieldOrTableName)) {
+ return false;
+ }
+ return checkIfKeyWords(fieldOrTableName);
}
+ @Override
+ public char getEscapeSymbol() {
+ return '`';
+ }
}
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/oracle/OracleEscapeHandler.java
similarity index 91%
rename from rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java
rename to rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/oracle/OracleEscapeHandler.java
index 22b4dc6febb..0fb5358e206 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/oracle/OracleEscapeHandler.java
@@ -13,14 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.seata.rm.datasource.undo.oracle.keyword;
+package io.seata.rm.datasource.sql.handler.oracle;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import io.seata.common.loader.LoadLevel;
-import io.seata.sqlparser.KeywordChecker;
+import io.seata.common.util.StringUtils;
+import io.seata.sqlparser.EscapeHandler;
import io.seata.sqlparser.util.JdbcConstants;
/**
@@ -29,7 +30,7 @@
* @author ccg
*/
@LoadLevel(name = JdbcConstants.ORACLE)
-public class OracleKeywordChecker implements KeywordChecker {
+public class OracleEscapeHandler implements EscapeHandler {
private Set keywordSet = Arrays.stream(OracleKeyword.values()).map(OracleKeyword::name).collect(Collectors.toSet());
@@ -488,7 +489,7 @@ private enum OracleKeyword {
}
@Override
- public boolean check(String fieldOrTableName) {
+ public boolean checkIfKeyWords(String fieldOrTableName) {
if (keywordSet.contains(fieldOrTableName)) {
return true;
}
@@ -499,13 +500,33 @@ public boolean check(String fieldOrTableName) {
}
+
@Override
- public boolean checkEscape(String fieldOrTableName) {
- boolean check = check(fieldOrTableName);
+ public boolean checkIfNeedEscape(String fieldOrTableName) {
+ if (StringUtils.isBlank(fieldOrTableName)) {
+ return false;
+ }
+ fieldOrTableName = fieldOrTableName.trim();
+ if (containsEscape(fieldOrTableName)) {
+ return false;
+ }
+ boolean isKeyWord = checkIfKeyWords(fieldOrTableName);
+ if (isKeyWord) {
+ return true;
+ }
// oracle
// we are recommend table name and column name must uppercase.
- // if exists full uppercase, the table name or column name does't bundle escape symbol.
- if (!check && isUppercase(fieldOrTableName)) {
+ // if exists full uppercase, the table name or column name doesn't bundle escape symbol.
+ //create\read table TABLE "table" "TABLE"
+ //
+ //table √ √ × √
+ //
+ //TABLE √ √ × √
+ //
+ //"table" × × √ ×
+ //
+ //"TABLE" √ √ × √
+ if (isUppercase(fieldOrTableName)) {
return false;
}
return true;
diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlKeywordChecker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/postgresql/PostgresqlEscapeHandler.java
similarity index 91%
rename from rm-datasource/src/main/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlKeywordChecker.java
rename to rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/postgresql/PostgresqlEscapeHandler.java
index f35f4ffa114..3cd06a3f875 100644
--- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlKeywordChecker.java
+++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/handler/postgresql/PostgresqlEscapeHandler.java
@@ -13,14 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package io.seata.rm.datasource.undo.postgresql.keyword;
+package io.seata.rm.datasource.sql.handler.postgresql;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import io.seata.common.loader.LoadLevel;
-import io.seata.sqlparser.KeywordChecker;
+import io.seata.common.util.StringUtils;
+import io.seata.sqlparser.EscapeHandler;
import io.seata.sqlparser.util.JdbcConstants;
/**
@@ -29,10 +30,10 @@
* @author japsercloud
*/
@LoadLevel(name = JdbcConstants.POSTGRESQL)
-public class PostgresqlKeywordChecker implements KeywordChecker {
+public class PostgresqlEscapeHandler implements EscapeHandler {
- private Set keywordSet = Arrays.stream(PostgresqlKeywordChecker.PostgresqlKeyword.values())
- .map(PostgresqlKeywordChecker.PostgresqlKeyword::name).collect(Collectors.toSet());
+ private Set keywordSet = Arrays.stream(PostgresqlEscapeHandler.PostgresqlKeyword.values())
+ .map(PostgresqlEscapeHandler.PostgresqlKeyword::name).collect(Collectors.toSet());
/**
* postgresql keyword
@@ -357,7 +358,7 @@ private enum PostgresqlKeyword {
}
@Override
- public boolean check(String fieldOrTableName) {
+ public boolean checkIfKeyWords(String fieldOrTableName) {
if (keywordSet.contains(fieldOrTableName)) {
return true;
}
@@ -369,8 +370,15 @@ public boolean check(String fieldOrTableName) {
}
@Override
- public boolean checkEscape(String fieldOrTableName) {
- boolean check = check(fieldOrTableName);
+ public boolean checkIfNeedEscape(String fieldOrTableName) {
+ if (StringUtils.isBlank(fieldOrTableName)) {
+ return false;
+ }
+ fieldOrTableName = fieldOrTableName.trim();
+ if (containsEscape(fieldOrTableName)) {
+ return false;
+ }
+ boolean check = checkIfKeyWords(fieldOrTableName);
if (!check && !containsUppercase(fieldOrTableName)) {
// postgresql
// we are recommend table name and column name must lowercase.
diff --git a/rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.EscapeHandler b/rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.EscapeHandler
new file mode 100644
index 00000000000..137aeea649e
--- /dev/null
+++ b/rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.EscapeHandler
@@ -0,0 +1,4 @@
+io.seata.rm.datasource.sql.handler.oracle.OracleEscapeHandler
+io.seata.rm.datasource.sql.handler.mysql.MySQLEscapeHandler
+io.seata.rm.datasource.sql.handler.postgresql.PostgresqlEscapeHandler
+io.seata.rm.datasource.sql.handler.mariadb.MariadbEscapeHandler
\ No newline at end of file
diff --git a/rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.KeywordChecker b/rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.KeywordChecker
deleted file mode 100644
index 6d674d92bc4..00000000000
--- a/rm-datasource/src/main/resources/META-INF/services/io.seata.sqlparser.KeywordChecker
+++ /dev/null
@@ -1,3 +0,0 @@
-io.seata.rm.datasource.undo.oracle.keyword.OracleKeywordChecker
-io.seata.rm.datasource.undo.mysql.keyword.MySQLKeywordChecker
-io.seata.rm.datasource.undo.postgresql.keyword.PostgresqlKeywordChecker
\ No newline at end of file
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/ColumnUtilsTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/ColumnUtilsTest.java
index 617a63dc15d..d5949840699 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/ColumnUtilsTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/ColumnUtilsTest.java
@@ -33,51 +33,51 @@ public void test_delEscape_byEscape() throws Exception {
List cols = new ArrayList<>();
cols.add("`id`");
cols.add("name");
- cols = ColumnUtils.delEscape(cols, ColumnUtils.Escape.MYSQL);
+ cols = ColumnUtils.delEscape(cols, JdbcConstants.MYSQL);
Assertions.assertEquals("id", cols.get(0));
Assertions.assertEquals("name", cols.get(1));
List cols2 = new ArrayList<>();
cols2.add("\"id\"");
- cols2 = ColumnUtils.delEscape(cols2, ColumnUtils.Escape.STANDARD);
+ cols2 = ColumnUtils.delEscape(cols2, JdbcConstants.ORACLE);
Assertions.assertEquals("id", cols2.get(0));
List cols3 = new ArrayList<>();
cols3.add("\"scheme\".\"id\"");
- cols3 = ColumnUtils.delEscape(cols3, ColumnUtils.Escape.STANDARD);
+ cols3 = ColumnUtils.delEscape(cols3, JdbcConstants.ORACLE);
Assertions.assertEquals("scheme.id", cols3.get(0));
List cols4 = new ArrayList<>();
cols4.add("`scheme`.`id`");
- cols4 = ColumnUtils.delEscape(cols4, ColumnUtils.Escape.MYSQL);
+ cols4 = ColumnUtils.delEscape(cols4, JdbcConstants.MYSQL);
Assertions.assertEquals("scheme.id", cols4.get(0));
List cols5 = new ArrayList<>();
cols5.add("\"scheme\".id");
- cols5 = ColumnUtils.delEscape(cols5, ColumnUtils.Escape.STANDARD);
+ cols5 = ColumnUtils.delEscape(cols5, JdbcConstants.ORACLE);
Assertions.assertEquals("scheme.id", cols5.get(0));
List cols6 = new ArrayList<>();
cols6.add("\"tab\"\"le\"");
- cols6 = ColumnUtils.delEscape(cols6, ColumnUtils.Escape.STANDARD);
+ cols6 = ColumnUtils.delEscape(cols6, JdbcConstants.ORACLE);
Assertions.assertEquals("tab\"\"le", cols6.get(0));
List cols7 = new ArrayList<>();
cols7.add("scheme.\"id\"");
- cols7 = ColumnUtils.delEscape(cols7, ColumnUtils.Escape.STANDARD);
+ cols7 = ColumnUtils.delEscape(cols7, JdbcConstants.ORACLE);
Assertions.assertEquals("scheme.id", cols7.get(0));
List cols8 = new ArrayList<>();
cols8.add("`scheme`.id");
- cols8 = ColumnUtils.delEscape(cols8, ColumnUtils.Escape.MYSQL);
- Assertions.assertEquals("scheme.id", cols8.get(0));
+ cols8 = ColumnUtils.delEscape(cols8, JdbcConstants.ORACLE);
+ Assertions.assertEquals("`scheme`.id", cols8.get(0));
List cols9 = new ArrayList<>();
cols9.add("scheme.`id`");
- cols9 = ColumnUtils.delEscape(cols9, ColumnUtils.Escape.MYSQL);
+ cols9 = ColumnUtils.delEscape(cols9, JdbcConstants.MYSQL);
Assertions.assertEquals("scheme.id", cols9.get(0));
- Assertions.assertNull(ColumnUtils.delEscape((String) null, ColumnUtils.Escape.MYSQL));
+ Assertions.assertNull(ColumnUtils.delEscape((String) null, JdbcConstants.MYSQL));
}
@Test
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/sql/handler/EscapeHandlerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/handler/EscapeHandlerTest.java
new file mode 100644
index 00000000000..90ee33a355c
--- /dev/null
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/sql/handler/EscapeHandlerTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1999-2019 Seata.io Group.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * 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 io.seata.rm.datasource.sql.handler;
+
+import java.util.List;
+
+import com.alibaba.druid.sql.SQLUtils;
+import com.alibaba.druid.sql.ast.SQLStatement;
+
+import io.seata.sqlparser.druid.mysql.MySQLInsertRecognizer;
+import io.seata.sqlparser.druid.mysql.MySQLUpdateRecognizer;
+import io.seata.sqlparser.druid.oracle.OracleInsertRecognizer;
+import io.seata.sqlparser.druid.oracle.OracleUpdateRecognizer;
+import io.seata.sqlparser.druid.postgresql.PostgresqlInsertRecognizer;
+import io.seata.sqlparser.druid.postgresql.PostgresqlUpdateRecognizer;
+import io.seata.sqlparser.util.JdbcConstants;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * The type Escape handler test.
+ *
+ * @author slievrly
+ */
+public class EscapeHandlerTest {
+ /**
+ * Test update columns escape.
+ */
+ @Test
+ public void testUpdateColumnsEscape() {
+ //mysql
+ String sql1 = "update t set `a` = 1, `b` = 2, `c` = 3";
+ List astsMysql = SQLUtils.parseStatements(sql1, JdbcConstants.MYSQL);
+ MySQLUpdateRecognizer regMysql = new MySQLUpdateRecognizer(sql1, astsMysql.get(0));
+ List updateColMysql = regMysql.getUpdateColumnsUnEscape();
+ for (String updateColumn : updateColMysql) {
+ Assertions.assertFalse(updateColumn.contains("`"));
+ }
+ updateColMysql = regMysql.getUpdateColumns();
+ for (String updateColumn : updateColMysql) {
+ Assertions.assertTrue(updateColumn.contains("`"));
+ }
+
+ //oracle
+ String sql2 = "update t set \"a\" = 1, \"b\" = 2, \"c\" = 3";
+ List astsOracle = SQLUtils.parseStatements(sql2, JdbcConstants.ORACLE);
+ OracleUpdateRecognizer regOracle = new OracleUpdateRecognizer(sql2, astsOracle.get(0));
+ List updateColOracle = regOracle.getUpdateColumnsUnEscape();
+ for (String updateColumn : updateColOracle) {
+ Assertions.assertFalse(updateColumn.contains("\""));
+ }
+ updateColOracle = regOracle.getUpdateColumns();
+ for (String updateColumn : updateColOracle) {
+ Assertions.assertTrue(updateColumn.contains("\""));
+ }
+
+ //postgresql
+ String sql3 = "update t set \"a\" = 1, \"b\" = 2, \"c\" = 3";
+ List astsPgsql = SQLUtils.parseStatements(sql2, JdbcConstants.POSTGRESQL);
+ PostgresqlUpdateRecognizer regPgsql = new PostgresqlUpdateRecognizer(sql3, astsPgsql.get(0));
+ List updateColPgsql = regPgsql.getUpdateColumnsUnEscape();
+ for (String updateColumn : updateColPgsql) {
+ Assertions.assertFalse(updateColumn.contains("\""));
+ }
+ updateColPgsql = regPgsql.getUpdateColumns();
+ for (String updateColumn : updateColPgsql) {
+ Assertions.assertTrue(updateColumn.contains("\""));
+ }
+
+ }
+
+ /**
+ * Test insert columns escape.
+ */
+ @Test
+ public void testInsertColumnsEscape() {
+ String sql = "insert into t(`id`, `no`, `name`, `age`) values (1, 'no001', 'aaa', '20')";
+ List asts = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
+ MySQLInsertRecognizer recognizer = new MySQLInsertRecognizer(sql, asts.get(0));
+ List insertColumns = recognizer.getInsertColumnsUnEscape();
+ for (String insertColumn : insertColumns) {
+ Assertions.assertFalse(insertColumn.contains("`"));
+ }
+ insertColumns = recognizer.getInsertColumns();
+ for (String insertColumn : insertColumns) {
+ Assertions.assertTrue(insertColumn.contains("`"));
+ }
+
+ //oracle
+ String sql2 = "insert into t(\"id\", \"no\", \"name\", \"age\") values (1, 'no001', 'aaa', '20')";
+ List astsOracle = SQLUtils.parseStatements(sql2, JdbcConstants.ORACLE);
+ OracleInsertRecognizer regOracle = new OracleInsertRecognizer(sql2, astsOracle.get(0));
+ List insertColOracle = regOracle.getInsertColumnsUnEscape();
+ for (String insertCol : insertColOracle) {
+ Assertions.assertFalse(insertCol.contains("\""));
+ }
+ insertColOracle = regOracle.getInsertColumns();
+ for (String insertCol : insertColOracle) {
+ Assertions.assertTrue(insertCol.contains("\""));
+ }
+
+ //postgresql
+ String sql3 = "insert into t(\"id\", \"no\", \"name\", \"age\") values (1, 'no001', 'aaa', '20')";
+ List astsPgsql = SQLUtils.parseStatements(sql2, JdbcConstants.POSTGRESQL);
+ PostgresqlInsertRecognizer regPgsql = new PostgresqlInsertRecognizer(sql3, astsPgsql.get(0));
+ List insertColPgsql = regPgsql.getInsertColumnsUnEscape();
+ for (String insertCol : insertColPgsql) {
+ Assertions.assertFalse(insertCol.contains("\""));
+ }
+ insertColPgsql = regPgsql.getInsertColumns();
+ for (String insertCol : insertColPgsql) {
+ Assertions.assertTrue(insertCol.contains("\""));
+ }
+ }
+}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/KeywordCheckerFactoryTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/EscapeHandlerFactoryTest.java
similarity index 72%
rename from rm-datasource/src/test/java/io/seata/rm/datasource/undo/KeywordCheckerFactoryTest.java
rename to rm-datasource/src/test/java/io/seata/rm/datasource/undo/EscapeHandlerFactoryTest.java
index 8747af451fd..96ca13c4063 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/KeywordCheckerFactoryTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/EscapeHandlerFactoryTest.java
@@ -16,20 +16,20 @@
package io.seata.rm.datasource.undo;
import io.seata.common.loader.EnhancedServiceNotFoundException;
-import io.seata.sqlparser.KeywordCheckerFactory;
+import io.seata.sqlparser.EscapeHandlerFactory;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
* @author will
*/
-public class KeywordCheckerFactoryTest {
+public class EscapeHandlerFactoryTest {
@Test
- public void testKeywordCheckerFacotry() {
- KeywordCheckerFactory keywordCheckerFactory = new KeywordCheckerFactory();
- Assertions.assertNotNull(keywordCheckerFactory);
+ public void testEscapeHandlerFactoryTest() {
+ EscapeHandlerFactory escapeHandlerFactory = new EscapeHandlerFactory();
+ Assertions.assertNotNull(escapeHandlerFactory);
- Assertions.assertThrows(EnhancedServiceNotFoundException.class, () -> KeywordCheckerFactory.getKeywordChecker("unknow"));
+ Assertions.assertThrows(EnhancedServiceNotFoundException.class, () -> EscapeHandlerFactory.getEscapeHandler("unknow"));
}
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/H2KeywordChecker.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/H2EscapeHandler.java
similarity index 86%
rename from rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/H2KeywordChecker.java
rename to rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/H2EscapeHandler.java
index 46f19169652..aae2da3fcff 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/H2KeywordChecker.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/h2/keyword/H2EscapeHandler.java
@@ -16,12 +16,12 @@
package io.seata.rm.datasource.undo.h2.keyword;
import io.seata.common.loader.LoadLevel;
-import io.seata.rm.datasource.undo.mysql.keyword.MySQLKeywordChecker;
+import io.seata.rm.datasource.sql.handler.mysql.MySQLEscapeHandler;
import io.seata.sqlparser.util.JdbcConstants;
/**
* @author JerryYin
*/
@LoadLevel(name = JdbcConstants.H2)
-public class H2KeywordChecker extends MySQLKeywordChecker {
+public class H2EscapeHandler extends MySQLEscapeHandler {
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLKeywordCheckerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLEscapeHandlerTest.java
similarity index 96%
rename from rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLKeywordCheckerTest.java
rename to rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLEscapeHandlerTest.java
index 093520d7f72..3d48a0582e1 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLKeywordCheckerTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/mysql/keyword/MySQLEscapeHandlerTest.java
@@ -17,8 +17,8 @@
import java.sql.Types;
-import io.seata.sqlparser.KeywordChecker;
-import io.seata.sqlparser.KeywordCheckerFactory;
+import io.seata.sqlparser.EscapeHandler;
+import io.seata.sqlparser.EscapeHandlerFactory;
import io.seata.rm.datasource.undo.SQLUndoLog;
import io.seata.rm.datasource.undo.mysql.MySQLUndoDeleteExecutor;
import io.seata.rm.datasource.undo.mysql.MySQLUndoInsertExecutor;
@@ -39,15 +39,15 @@
*
* @author Wu
*/
-public class MySQLKeywordCheckerTest {
+public class MySQLEscapeHandlerTest {
/**
* Test check
*/
@Test
public void testCheck() {
- KeywordChecker keywordChecker = KeywordCheckerFactory.getKeywordChecker(JdbcConstants.MYSQL);
- Assertions.assertTrue(keywordChecker.check("desc"));
+ EscapeHandler escapeHandler = EscapeHandlerFactory.getEscapeHandler(JdbcConstants.MYSQL);
+ Assertions.assertTrue(escapeHandler.checkIfKeyWords("desc"));
}
/**
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordCheckerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/OracleEscapeHandlerTest.java
similarity index 75%
rename from rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordCheckerTest.java
rename to rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/OracleEscapeHandlerTest.java
index 2d00d1df907..a11c20cc8f9 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordCheckerTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/oracle/keyword/OracleEscapeHandlerTest.java
@@ -18,19 +18,19 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
-import io.seata.sqlparser.KeywordChecker;
-import io.seata.sqlparser.KeywordCheckerFactory;
+import io.seata.sqlparser.EscapeHandler;
+import io.seata.sqlparser.EscapeHandlerFactory;
import io.seata.sqlparser.util.JdbcConstants;
/**
* @author will
*/
-public class OracleKeywordCheckerTest {
+public class OracleEscapeHandlerTest {
@Test
public void testOracleKeywordChecker() {
- KeywordChecker keywordChecker = KeywordCheckerFactory.getKeywordChecker(JdbcConstants.ORACLE);
- Assertions.assertNotNull(keywordChecker);
+ EscapeHandler escapeHandler = EscapeHandlerFactory.getEscapeHandler(JdbcConstants.ORACLE);
+ Assertions.assertNotNull(escapeHandler);
}
}
diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlKeywordCheckerTest.java b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlEscapeHandlerTest.java
similarity index 75%
rename from rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlKeywordCheckerTest.java
rename to rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlEscapeHandlerTest.java
index 41b2959027c..c4626255e72 100644
--- a/rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlKeywordCheckerTest.java
+++ b/rm-datasource/src/test/java/io/seata/rm/datasource/undo/postgresql/keyword/PostgresqlEscapeHandlerTest.java
@@ -18,19 +18,19 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
-import io.seata.sqlparser.KeywordChecker;
-import io.seata.sqlparser.KeywordCheckerFactory;
+import io.seata.sqlparser.EscapeHandler;
+import io.seata.sqlparser.EscapeHandlerFactory;
import io.seata.sqlparser.util.JdbcConstants;
/**
* @author will
*/
-public class PostgresqlKeywordCheckerTest {
+public class PostgresqlEscapeHandlerTest {
@Test
public void testOracleKeywordChecker() {
- KeywordChecker keywordChecker = KeywordCheckerFactory.getKeywordChecker(JdbcConstants.POSTGRESQL);
- Assertions.assertNotNull(keywordChecker);
+ EscapeHandler escapeHandler = EscapeHandlerFactory.getEscapeHandler(JdbcConstants.POSTGRESQL);
+ Assertions.assertNotNull(escapeHandler);
}
}
diff --git a/rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.EscapeHandler b/rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.EscapeHandler
new file mode 100644
index 00000000000..1daa6248dfd
--- /dev/null
+++ b/rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.EscapeHandler
@@ -0,0 +1 @@
+io.seata.rm.datasource.undo.h2.keyword.H2EscapeHandler
\ No newline at end of file
diff --git a/rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.KeywordChecker b/rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.KeywordChecker
deleted file mode 100644
index de389691db1..00000000000
--- a/rm-datasource/src/test/resources/META-INF/services/io.seata.sqlparser.KeywordChecker
+++ /dev/null
@@ -1 +0,0 @@
-io.seata.rm.datasource.undo.h2.keyword.H2KeywordChecker
\ No newline at end of file
diff --git a/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLInsertRecognizer.java b/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLInsertRecognizer.java
index 894e67368a7..14933644880 100644
--- a/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLInsertRecognizer.java
+++ b/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLInsertRecognizer.java
@@ -109,7 +109,7 @@ public List getDuplicateKeyUpdate() {
}
@Override
- public List getInsertColumnsIsSimplified() {
+ public List getInsertColumnsUnEscape() {
List insertColumns = getInsertColumns();
return ColumnUtils.delEscape(insertColumns, JdbcConstants.MYSQL);
}
diff --git a/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLUpdateRecognizer.java b/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLUpdateRecognizer.java
index 55d61a5671b..0f974f9245a 100644
--- a/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLUpdateRecognizer.java
+++ b/sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/AntlrMySQLUpdateRecognizer.java
@@ -75,7 +75,7 @@ public List