From 6c2f29c847e2b3b528374500cc39c814f0e300f8 Mon Sep 17 00:00:00 2001 From: sjgllgh Date: Wed, 15 Nov 2023 15:13:10 +0800 Subject: [PATCH 1/3] sql field comment semicolon with escape --- .../interceptor/impl/CommentInterceptor.scala | 24 +++++++++++++++++++ .../entrance/interceptor/impl/Explain.scala | 3 ++- 2 files changed, 26 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 627ab82b8e..f1d7fb1e1a 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 @@ -70,8 +70,32 @@ 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) + 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 8436ccc711..d0ad33c53f 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 @@ -118,7 +118,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 => From 6b7f55c753aefa84492d4e26703572f2052ea605 Mon Sep 17 00:00:00 2001 From: sjgllgh Date: Tue, 28 Nov 2023 10:26:42 +0800 Subject: [PATCH 2/3] add junit test --- .../interceptor/impl/TestReplaceComment.scala | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 linkis-computation-governance/linkis-entrance/src/test/scala/org/apache/linkis/entrance/interceptor/impl/TestReplaceComment.scala 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 0000000000..5f26a228de --- /dev/null +++ b/linkis-computation-governance/linkis-entrance/src/test/scala/org/apache/linkis/entrance/interceptor/impl/TestReplaceComment.scala @@ -0,0 +1,43 @@ +/* + * 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) + } + +} From 4952fbfedb8b018f9a2fb30854292e087774e3ae Mon Sep 17 00:00:00 2001 From: sjgllgh Date: Wed, 29 Nov 2023 11:05:13 +0800 Subject: [PATCH 3/3] 1.format source code 2.add code comment --- .../entrance/interceptor/impl/CommentInterceptor.scala | 6 ++++++ .../entrance/interceptor/impl/TestReplaceComment.scala | 1 - 2 files changed, 6 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 f1d7fb1e1a..de0bcc376f 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 @@ -81,6 +81,12 @@ object SQLCommentHelper extends CommentHelper { 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 + "'") } 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 index 5f26a228de..3310f09581 100644 --- 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 @@ -21,7 +21,6 @@ import org.junit.jupiter.api.{Assertions, Test} class TestReplaceComment { - @Test def TestRepComm: Unit = { val realCode = "drop table if exists default.test;" +