This is an automated email from the ASF dual-hosted git repository.

peacewong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/linkis.git


The following commit(s) were added to refs/heads/master by this push:
     new 87c40ecbf sql field comment semicolon with escape (#4967)
87c40ecbf is described below

commit 87c40ecbf61f7be875bdaf9f2033c95a4309c117
Author: LiuGuoHua <[email protected]>
AuthorDate: Mon Dec 11 17:12:49 2023 +0800

    sql field comment semicolon with escape (#4967)
    
    * sql field comment semicolon with escape
    
    * add junit test
    
    * 1.format source code
     2.add code comment
---
 .../interceptor/impl/CommentInterceptor.scala      | 30 ++++++++++++++++
 .../linkis/entrance/interceptor/impl/Explain.scala |  3 +-
 .../interceptor/impl/TestReplaceComment.scala      | 42 ++++++++++++++++++++++
 3 files changed, 74 insertions(+), 1 deletion(-)

diff --git 
a/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/CommentInterceptor.scala
 
b/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/CommentInterceptor.scala
index 34bd6ead0..bceb0f4f5 100644
--- 
a/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/CommentInterceptor.scala
+++ 
b/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/CommentInterceptor.scala
@@ -69,8 +69,38 @@ trait CommentHelper {
 object SQLCommentHelper extends CommentHelper {
   override val commentPattern: Regex = """\s*--.+\s*""".r.unanchored
   private val comment = "(?ms)('(?:''|[^'])*')|--.*?$|/\\*.*?\\*/|#.*?$|"
+  private val comment_sem = "(?i)(comment)\\s+'([^']*)'"
   private val logger: Logger = LoggerFactory.getLogger(getClass)
 
+  def replaceComment(code: String): String = {
+    try {
+      val pattern = Pattern.compile(comment_sem)
+      val matcher = pattern.matcher(code)
+      val sb = new StringBuffer
+      while (matcher.find()) {
+        val commentKeyword = matcher.group(1)
+        val comment = matcher.group(2)
+
+        /**
+         * Since we are in a Scala string, and each backslash needs to be 
escaped in the string
+         * itself, we need two additional backslashes. Therefore, we end up 
with a total of four
+         * backslashes to represent a single literal backslash in the 
replacement string.
+         */
+        val escapedComment = comment.replaceAll(";", "\\\\\\\\;")
+        matcher.appendReplacement(sb, commentKeyword + " '" + escapedComment + 
"'")
+      }
+      matcher.appendTail(sb)
+      sb.toString
+    } catch {
+      case e: Exception =>
+        logger.warn("sql comment semicolon replace failed")
+        code
+      case t: Throwable =>
+        logger.warn("sql comment semicolon replace failed")
+        code
+    }
+  }
+
   override def dealComment(code: String): String = {
     try {
       val p = Pattern.compile(comment)
diff --git 
a/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/Explain.scala
 
b/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/Explain.scala
index 35b40db33..045cb51f8 100644
--- 
a/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/Explain.scala
+++ 
b/linkis-computation-governance/linkis-entrance/src/main/scala/org/apache/linkis/entrance/interceptor/impl/Explain.scala
@@ -121,7 +121,8 @@ object SQLExplain extends Explain {
       logAppender: java.lang.StringBuilder
   ): Unit = {
     val fixedCode: ArrayBuffer[String] = new ArrayBuffer[String]()
-    val tempCode = SQLCommentHelper.dealComment(executionCode)
+    val tempCode1 = SQLCommentHelper.dealComment(executionCode)
+    val tempCode = SQLCommentHelper.replaceComment(tempCode1)
     val isNoLimitAllowed = Utils.tryCatch {
       IDE_ALLOW_NO_LIMIT_REGEX.findFirstIn(executionCode).isDefined
     } { case e: Exception =>
diff --git 
a/linkis-computation-governance/linkis-entrance/src/test/scala/org/apache/linkis/entrance/interceptor/impl/TestReplaceComment.scala
 
b/linkis-computation-governance/linkis-entrance/src/test/scala/org/apache/linkis/entrance/interceptor/impl/TestReplaceComment.scala
new file mode 100644
index 000000000..3310f0958
--- /dev/null
+++ 
b/linkis-computation-governance/linkis-entrance/src/test/scala/org/apache/linkis/entrance/interceptor/impl/TestReplaceComment.scala
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.linkis.entrance.interceptor.impl
+
+import org.junit.jupiter.api.{Assertions, Test}
+
+class TestReplaceComment {
+
+  @Test
+  def TestRepComm: Unit = {
+    val realCode = "drop table if exists default.test;" +
+      "create table default.test(" +
+      "id varchar(11) comment '这是注释测试分号;这是注释测试分号;'," +
+      "id1 string comment '测试'," +
+      "id2 string COMMENT '码值说明:2-高;3-中;4-低;'" +
+      ");"
+    val expectCode = "drop table if exists default.test;" +
+      "create table default.test(" +
+      "id varchar(11) comment '这是注释测试分号\\;这是注释测试分号\\;'," +
+      "id1 string comment '测试'," +
+      "id2 string COMMENT '码值说明:2-高\\;3-中\\;4-低\\;'" +
+      ");"
+
+    Assertions.assertEquals(SQLCommentHelper.replaceComment(realCode), 
expectCode)
+  }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to