diff --git a/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java b/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java index 85fdf7cc59e0aa9a6c83eacfb095dbdca07e290c..964b517b7f399dec6a6d1f20223d590f5d456fa2 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 a5d0d54fee6f6e173c38dd8a5b46a2e71cacdd55..88d98188b4a4b3ecfebd69e9fe33ef2c7d4ac330 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 c5d7928bf1d6b8f20cc8a380514d936072ded376..f2fa1e87b70077c07efdfdea496c3b3d8f6ef6ec 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