Skip to content

Commit

Permalink
sql field comment semicolon with escape (#4967)
Browse files Browse the repository at this point in the history
* sql field comment semicolon with escape

* add junit test

* 1.format source code
 2.add code comment
  • Loading branch information
sjgllgh committed Dec 11, 2023
1 parent f26cf2a commit 87c40ec
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 1 deletion.
Expand Up @@ -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)
Expand Down
Expand Up @@ -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 =>
Expand Down
@@ -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)
}

}

0 comments on commit 87c40ec

Please sign in to comment.