From 438014de848a9b785569a3c224c7e28feec01bfc Mon Sep 17 00:00:00 2001 From: hexinyu <1213652135@qq.com> Date: Thu, 2 Feb 2023 18:54:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=82=E6=95=B0=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=A0=87=E8=AF=86=E7=AC=A6=E6=98=AF=E5=90=A6=E5=8C=BA?= =?UTF-8?q?=E5=88=86=E5=A4=A7=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sqltranslator/ExecuteTranslate.java | 28 +++++---- .../mysql/MySqlToOpenGaussOutputVisitor.java | 57 ++++++++++++++----- .../sqltranslator/SqlTranslateTest.java | 4 +- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java b/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java index 85fdf7c..964b517 100644 --- a/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java +++ b/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java @@ -17,29 +17,27 @@ public class ExecuteTranslate { public static void main(String[] args) { String raw_sql = ""; - // if the encoded sql is passed in through the --base64 parameter, the sql needs - // to be decoded - if (args.length == 2 && args[0].equals("--base64")) { - // decode sql - byte[] decode = Base64.getDecoder().decode(args[1]); - try { - raw_sql = new String(decode, "utf-8"); - } catch (UnsupportedEncodingException e) { - logger.error(e.getLocalizedMessage()); - } - } else { - raw_sql = args[0]; + boolean column_case_sensitive = true; + if (args.length == 3) { + column_case_sensitive = false; + } + byte[] decode = Base64.getDecoder().decode(args[1]); + try { + raw_sql = new String(decode, "utf-8"); + } catch (UnsupportedEncodingException e) { + logger.error(e.getLocalizedMessage()); } try { - System.out.println(translateMysql2openGauss(raw_sql, false)); + System.out.println(translateMysql2openGauss(raw_sql, false, column_case_sensitive)); } catch (Exception e) { logger.error(e.getLocalizedMessage()); } } - public static String translateMysql2openGauss(String Sql_in, boolean debug) { + public static String translateMysql2openGauss(String Sql_in, boolean debug,boolean column_case_sensitive) { final StringBuilder appender = new StringBuilder(); - final MySqlToOpenGaussOutputVisitor visitor = new MySqlToOpenGaussOutputVisitor(appender); + final MySqlToOpenGaussOutputVisitor visitor = new MySqlToOpenGaussOutputVisitor(appender, + column_case_sensitive); final List sqlStatements = SQLUtils.parseStatements(Sql_in, DbType.mysql); diff --git a/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java b/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java index a5d0d54..88d9818 100644 --- a/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java +++ b/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { private static final Logger logger = LoggerFactory.getLogger(MySqlToOpenGaussOutputVisitor.class); private static final String err = "err"; + private boolean column_case_sensitive; private final Map SQLSetQuantifierMap = new HashMap() { { put(0, ""); @@ -72,6 +73,10 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { routinePrivilegeSet.add("ALL"); routinePrivilegeSet.add("ALL PRIVILEGES"); reservedwordSet.add("number"); + reservedwordSet.add("user"); + reservedwordSet.add("for"); + reservedwordSet.add("check"); + reservedwordSet.add("all"); } private final StringBuilder sb = (StringBuilder) appender; @@ -79,6 +84,11 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { super(appender); } + public MySqlToOpenGaussOutputVisitor(Appendable appender, boolean column_case_sensitive) { + super(appender); + this.column_case_sensitive = column_case_sensitive; + } + private void printNotSupportWord(String word) { if (sb.charAt(sb.length() - 1) != '\n') { print('\n'); @@ -1334,16 +1344,24 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { public void printnamewithquote(String text) { char c0 = text.charAt(0); if (c0 == '"' && text.charAt(text.length() - 1) == '"') { - print(text); + text = text.substring(1, text.length() - 1); + if (hasReservedword(text) || column_case_sensitive || text.trim().contains(" ")) { + print("\"" + text + "\""); + } else { + print(text); + } } else if (c0 == '`' && text.charAt(text.length() - 1) == '`') { text = text.substring(1, text.length() - 1); - print("\"" + text + "\""); - } else { - if (hasUpper(text)) + if (hasReservedword(text) || column_case_sensitive) { print("\"" + text + "\""); - else + } else { print(text); - } + } + } else if ((hasUpper(text) && column_case_sensitive) || hasReservedword(text)) + print("\"" + text + "\""); + else + print(text); + } @Override @@ -2310,21 +2328,29 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { } char c0 = text.charAt(0); if (c0 == '"' && text.charAt(text.length() - 1) == '"') { - this.appender.append(this.quote); - this.appender.append(text.substring(1, text.length() - 1)); - this.appender.append(this.quote); + text = text.substring(1, text.length() - 1); + if (hasReservedword(text) || column_case_sensitive || text.trim().contains(" ")) { + this.appender.append(this.quote); + this.appender.append(text); + this.appender.append(this.quote); + } else { + this.appender.append(text); + } } else if (c0 == '`' && text.charAt(text.length() - 1) == '`') { - this.appender.append(this.quote); - this.appender.append(text.substring(1, text.length() - 1)); - this.appender.append(this.quote); - } else { - if (hasUpper(text) || hasReservedword(text)) { + text = text.substring(1, text.length() - 1); + if (hasReservedword(text) || column_case_sensitive) { this.appender.append(this.quote); this.appender.append(text); this.appender.append(this.quote); } else { this.appender.append(text); } + } else if ((hasUpper(text) && column_case_sensitive) || hasReservedword(text)) { + this.appender.append(this.quote); + this.appender.append(text); + this.appender.append(this.quote); + } else { + this.appender.append(text); } } catch (IOException e) { throw new RuntimeException("println error", e); @@ -2332,11 +2358,12 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { } public static boolean hasReservedword(String str) { - if (reservedwordSet.contains(str)) + if (reservedwordSet.contains(str.toLowerCase())) return true; else return false; } + public static boolean hasUpper(String str) { for (int i = 0; i < str.length(); i++) { char c0 = str.charAt(i); diff --git a/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java b/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java index c5d7928..f2fa1e8 100644 --- a/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java +++ b/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java @@ -36,7 +36,7 @@ public class SqlTranslateTest { // expect SQL content. null if expect file does not exist. String expectSQLContent = expectFileURL == null ? "" : IOUtils.toString(expectFileURL, StandardCharsets.UTF_8); // translated SQL content - String tranSQLContent = ExecuteTranslate.translateMysql2openGauss(inputSQLContent, false); + String tranSQLContent = ExecuteTranslate.translateMysql2openGauss(inputSQLContent, false, true); // String tranSQLContent = exectranslate(inputSQLContent); expectSQLContent = expectSQLContent.trim().replaceAll("[ \t\r]+\n", "\n"); @@ -56,7 +56,7 @@ public class SqlTranslateTest { inputSQLContent = inputSQLContent.replaceAll("--.*", ""); inputSQLContent = inputSQLContent.replaceAll("#.*", ""); // translated SQL content - ExecuteTranslate.translateMysql2openGauss(inputSQLContent, true); + ExecuteTranslate.translateMysql2openGauss(inputSQLContent, true, true); } @Test -- Gitee