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]