From 7a044ce1b03de8a0b178520028fcc38f977a2d37 Mon Sep 17 00:00:00 2001 From: hexinyu <1213652135@qq.com> Date: Wed, 15 Jun 2022 10:42:34 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=B0=86create=20table=E4=B8=AD?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81=E5=88=9B=E5=BB=BA=E7=B4=A2=E5=BC=95?= =?UTF-8?q?INDEX/KEY=EF=BC=8C=E4=BD=BF=E7=94=A8create=20index=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E4=BB=A3=E6=9B=BF;=E4=BF=AE=E5=A4=8D=E5=90=AB?= =?UTF-8?q?=E5=A4=A7=E5=86=99=E5=AD=97=E6=AF=8D=E7=9A=84=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BF=9D=E7=95=99=E5=A4=A7=E5=86=99=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +- .../sqltranslator/ExecuteTranslate.java | 13 +- .../mysql/MySqlToOpenGaussOutputVisitor.java | 431 ++++++++++-------- .../mysql/expect/alterTable_statement.sql | 46 +- .../expect/columnDefinition_statement.sql | 40 +- .../mysql/expect/createDatabase_statement.sql | 2 +- .../mysql/expect/createFunction_statement.sql | 4 +- .../expect/createProcedure_statement.sql | 10 +- .../mysql/expect/createTable_statement.sql | 19 +- .../mysql/expect/createView_statement.sql | 10 +- .../mysql/expect/dataType_statement.sql | 4 +- .../dialect/mysql/expect/delete_statement.sql | 2 +- .../mysql/expect/dropTable_statement.sql | 2 +- .../dialect/mysql/expect/grant_statement.sql | 8 +- .../dialect/mysql/expect/revoke_statement.sql | 8 +- .../expect/select_query_statement_01.sql | 18 +- .../expect/select_query_statement_02.sql | 32 +- .../dialect/mysql/expect/select_statement.sql | 56 +-- .../dialect/mysql/expect/update_statement.sql | 2 +- .../mysql/input/alterTable_statement.sql | 14 +- .../input/columnDefinition_statement.sql | 4 +- .../mysql/input/createProcedure_statement.sql | 2 +- .../mysql/input/createTable_statement.sql | 2 + .../mysql/input/createTrigger_statement.sql | 2 +- .../dialect/mysql/input/grant_statement.sql | 2 +- .../dialect/mysql/input/select_statement.sql | 6 +- 26 files changed, 403 insertions(+), 365 deletions(-) diff --git a/README.md b/README.md index e09f6cb..74d0882 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## 介绍 -openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGauss语法转换的翻译器。其基于1.2.8版本Druid实现,利用Druid对AST的访问规则,继承MySQLOutPutVisitor并重载其visit方法,修改其对MySQL语句 AST的访问结果,最终输出openGauss语法的语句。应用于从MySQL到openGauss。 +openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGauss语法转换的翻译器。其基于1.2.8版本Druid实现,利用Druid对AST的访问规则,继承MySQLOutPutVisitor并重载其visit方法,修改其对MySQL语句 AST的访问结果,最终输出openGauss语法的语句。 ## 编译步骤 @@ -60,7 +60,7 @@ openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGaus ### [13.1.11 CREATE DATABASE Statement](https://dev.mysql.com/doc/refman/5.7/en/create-database.html) -> 1. 对应openGauss的SCHEMA,MySQL的create_option有 CHARACTER SET或 COLLATE字段,openGauss不支持 +> 1. 翻译成openGauss的CREATE DATABASE,MySQL的create_option有 CHARACTER SET或 COLLATE字段,openGauss不支持 ### [13.1.12 CREATE EVENT Statement](https://dev.mysql.com/doc/refman/5.7/en/create-event.html) @@ -81,8 +81,9 @@ openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGaus > * algorithm=inplace ,lock=default > > 3. 其他情况的lock和algorithm字段,openGauss不支持 -> 4. 当using hash和asc|desc同时存在时会报错,因为openGauss的hash只能处理简单等值比较,using btree才能用asc|desc -> 5. openGauss不支持index_option(index_type除外) +> 4. openGauss的key_part部分不支持(length),即为col_name指定长度 +> 5. 当using hash和asc|desc同时存在时会报错,因为openGauss的hash只能处理简单等值比较,using btree才能用asc|desc +> 6. openGauss不支持index_option(index_type除外) ### [13.1.15 CREATE LOGFILE GROUP Statement](https://dev.mysql.com/doc/refman/5.7/en/create-logfile-group.html) @@ -101,12 +102,13 @@ openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGaus ### [13.1.18 CREATE TABLE Statement](https://dev.mysql.com/doc/refman/5.7/en/create-table.html) > 1. 数据类型: openGauss 不支持YEAR类型,ENUM和SET类型 -> 2. MySQL的createde_finition中,openGauss不支持在表约束中创建INDEX | KEY、 {FULLTEXT | SPATIAL} [INDEX | KEY],也不支持index_type、index_option、index_name。此外,Druid无法识别unique约束的约束名symbol -> 3. MySQL的column_definition中,openGauss不支持列约束中的COMMENT 、COLUMNFORMAT、STORAGE、GENERATED ALWAYS、VIRTUAL | STORED字段。AUTO_INCREMENT在openGauss中用bigserial达到整数自增的效果。COLLATE字段两者不兼容 -> 4. MySQL的table_option中,openGauss只支持TABLESPACE(不支持[STORAGE {DISK | MEMORY}]字段) -> 5. openGauss 的create table as query expression 和 mysql有本质不同。MySQL在旧表上新加字段,openGauss是完全复制一样的表,无法转换 -> 6. MySQL的like 默认源表保留新表的默认值表达式,存储引擎属性,check 约束,注释。所以在openGauss添加额外的表属性信息,like语句的like_option默认为INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE -> 7. partition: +> 2. MySQL的createde_finition中,openGauss不支持在表约束中创建INDEX | KEY、 {FULLTEXT | SPATIAL} [INDEX | KEY],将其翻译为CREATE TABLE和CREATE INDEX ON TABLE两个语句。{FULLTEXT | SPATIAL}省略。 +> 3. MySQL的createde_finition中,openGauss不支持index_type、index_option、index_name。此外,Druid无法识别unique约束的约束名symbol +> 4. MySQL的column_definition中,openGauss不支持列约束中的COMMENT 、COLUMNFORMAT、STORAGE、GENERATED ALWAYS、VIRTUAL | STORED字段。AUTO_INCREMENT在openGauss中用bigserial达到整数自增的效果。COLLATE字段两者不兼容 +> 5. MySQL的table_option中,openGauss只支持TABLESPACE(不支持[STORAGE {DISK | MEMORY}]字段) +> 6. openGauss 的create table as query expression 和 mysql有本质不同。MySQL在旧表上新加字段,openGauss是完全复制一样的表,无法转换 +> 7. MySQL的like 默认源表保留新表的默认值表达式,存储引擎属性,check 约束,注释。所以在openGauss添加额外的表属性信息,like语句的like_option默认为INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE +> 8. partition: > > * openGauss不支持LINEAR字段 > * openGauss的PARTITION BY HASH的expr只翻译单个字段,openGauss 无法确保expr能够被正确解析;MySQL的PARTITION BY KEY需要翻译成 PARTITION BY HASH(column),column_list只支持单列;PARTITION BY RANGE的expr仅支持单列,多列则解析失败,column_list支持多列;PARTITION BY LIST的expr只翻译单个字段,无法确保expr能够被正确解析,column_list也仅支持单列 @@ -236,6 +238,7 @@ openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGaus > 4. MySQL的SELECT... INTO var_list,openGauss仅支持变量是存储过程或函数参数,或存储过程或函数局部变量,不支持用户定义的变量(@开头的)。MySQL的SELECT ... INTO OUTFILE、SELECT ... INTO DUMPFILE,openGauss也不支持 > 5. druid不解析PARTITION partition_list字段、SELECT ... INTO DUMPFILE > 6. 在字段table_references中,MySQL 支持 INNER、CROSS、LEFT [OUTER]、RIGHT [OUTER]、NATURAL、STRAIGHT_JOIN六种join类型,openGauss 不支持 STRAIGHT_JOIN 这种类型,STRAIGHT_JOIN 功能同 JOIN 类似,使用 JOIN 替代 +> 7. openGauss的存储过程不能用select返回数据 ### [13.2.10 Subqueries](https://dev.mysql.com/doc/refman/5.7/en/subqueries.html) @@ -268,7 +271,7 @@ openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGaus ### [13.6.2 Statement Labels](https://dev.mysql.com/doc/refman/5.7/en/statement-labels.html) -> 1. 完全支持 +> 1. Druid解析label时,需要使用"label: ",即冒号后需要有空格才能解析 ### [13.6.3 DECLARE Statement](https://dev.mysql.com/doc/refman/5.7/en/declare.html) @@ -356,3 +359,7 @@ openGauss-tools-sql-translator是一个使用java编写的实现MySQL向openGaus > 1. openGauss不存在[13.8.1 DESCRIBE Statement](https://dev.mysql.com/doc/refman/5.7/en/describe.html)[、](https://dev.mysql.com/doc/refman/5.7/en/cache-index.html)[13.8.3 HELP Statement](https://dev.mysql.com/doc/refman/5.7/en/help.html) > 2. [13.8.2 EXPLAIN Statement](https://dev.mysql.com/doc/refman/5.7/en/explain.html)目前不翻译EXPLAIN语句,因为MySQL与openGauss的EXPLAIN输出不一样 + +### 注意事项 + +1. 对象迁移时所有包含大小写的字段名(包括表名、数据库名、列名、别名、用户名、变量名、索引名、分区名等)保持大小写迁移。当在openGauss访问这些字段时,需要使用双引号才能识别该字段。 diff --git a/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java b/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java index e124d17..85fdf7c 100644 --- a/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java +++ b/src/main/java/org/opengauss/sqltranslator/ExecuteTranslate.java @@ -17,9 +17,10 @@ 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 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 + // decode sql byte[] decode = Base64.getDecoder().decode(args[1]); try { raw_sql = new String(decode, "utf-8"); @@ -36,7 +37,7 @@ public class ExecuteTranslate { } } - public static String translateMysql2openGauss(String Sql_in,boolean debug) { + public static String translateMysql2openGauss(String Sql_in, boolean debug) { final StringBuilder appender = new StringBuilder(); final MySqlToOpenGaussOutputVisitor visitor = new MySqlToOpenGaussOutputVisitor(appender); @@ -47,12 +48,12 @@ public class ExecuteTranslate { for (SQLStatement statement : sqlStatements) { statement.accept(visitor); visitor.println(); - if(debug){ + if (debug) { System.out.println(appender.toString()); - }else{ + } else { res.append(appender.toString()); } - appender.delete(0,appender.length()); + appender.delete(0, appender.length()); } return res.toString(); 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 a3cf413..f762fbd 100644 --- a/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java +++ b/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java @@ -175,7 +175,7 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { @Override public boolean visit(SQLAlterDatabaseStatement x) { - logger.error("openGauss does not support alter database statement" + getTypeAttribute(x)); + logger.error("alter database statement is incompatible with openGauss" + getTypeAttribute(x)); errHandle(x); return false; } @@ -470,6 +470,32 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { return false; } + @Override + public boolean visit(SQLVariantRefExpr x) { + int index = x.getIndex(); + if (this.inputParameters != null && index < this.inputParameters.size()) + return super.visit(x); + if (x.isGlobal()) { + logger.error("openGauss does not support @@global." + getTypeAttribute(x)); + errHandle(x); + } else if (x.isSession()) { + logger.error("openGauss does not support @@session." + getTypeAttribute(x)); + errHandle(x); + } + String varName = x.getName(); + if (varName.startsWith("@")) { + logger.error("openGauss does not support variable started with @" + getTypeAttribute(x)); + errHandle(x); + } + printName0(varName); + String collate = (String) x.getAttribute("COLLATE"); + if (collate != null) { + logger.error("the COLLATE is incompatible with openGauss" + getTypeAttribute(x)); + errHandle(x); + } + return false; + } + @Override public boolean visit(SQLSetStatement x) { SQLSetStatement.Option option = x.getOption(); @@ -590,7 +616,7 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { if (columns != null && columns.size() > 0) { this.print0(this.ucase ? " AS " : " as "); } - this.print0(alias); + printnamewithquote(alias.toString()); } if (columns != null && columns.size() > 0) { this.print(" ("); @@ -779,7 +805,7 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { if (authid != null) { this.println(); printUcase("SECURITY "); - authid.accept(this); + printUcase(authid.toString()); } println(); print0("AS "); @@ -994,6 +1020,89 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { return false; } + @Override + public boolean visit(SQLSelectItem x) { + if (x.isConnectByRoot()) { + gaussFeatureNotSupportLog("CONNECT_BY_ROOT in select item" + getTypeAttribute(x)); + } + SQLExpr expr = x.getExpr(); + if (expr instanceof SQLIdentifierExpr) { + printName0(((SQLIdentifierExpr) expr).getName()); + } else if (expr instanceof SQLPropertyExpr) { + visit((SQLPropertyExpr) expr); + } else if (expr != null) { + printExpr(expr, parameterized); + } + String alias = x.getAlias(); + if (alias != null && alias.length() > 0) { + print0(ucase ? " AS " : " as "); + char c0 = alias.charAt(0); + boolean special = false; + if (c0 != '"' && c0 != '\'' && c0 != '`' && c0 != '[') { + for (int i = 1; i < alias.length(); ++i) { + char ch = alias.charAt(i); + if (ch < 256) { + if (ch >= '0' && ch <= '9') { + } else if (ch >= 'a' && ch <= 'z') { + } else if (ch >= 'A' && ch <= 'Z') { + } else if (ch == '_' || ch == '$') { + + } else { + special = true; + } + } + } + } + if ((!printNameQuote) && (!special)) { + printnamewithquote(alias); + } else { + print(quote); + String unquoteAlias = null; + if (c0 == '`' && alias.charAt(alias.length() - 1) == '`') { + unquoteAlias = alias.substring(1, alias.length() - 1); + } else if (c0 == '\'' && alias.charAt(alias.length() - 1) == '\'') { + unquoteAlias = alias.substring(1, alias.length() - 1); + } else if (c0 == '"' && alias.charAt(alias.length() - 1) == '"') { + unquoteAlias = alias.substring(1, alias.length() - 1); + } else { + printnamewithquote(alias); + } + if (unquoteAlias != null) { + print0(unquoteAlias); + } + print(quote); + } + return false; + } + List aliasList = x.getAliasList(); + if (aliasList == null) { + return false; + } + println(); + print0(ucase ? "AS (" : "as ("); + int aliasSize = aliasList.size(); + if (aliasSize > 5) { + this.indentCount++; + println(); + } + for (int i = 0; i < aliasSize; ++i) { + if (i != 0) { + if (aliasSize > 5) { + println(","); + } else { + print0(", "); + } + } + printnamewithquote(aliasList.get(i)); + } + if (aliasSize > 5) { + this.indentCount--; + println(); + } + print(')'); + return false; + } + @Override public boolean visit(MySqlOutFileExpr x) { logger.error("openGauss does not support OUTFILE" + getTypeAttribute(x)); @@ -1146,17 +1255,82 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { List columncomment = x.getColumnDefinitions(); for (SQLColumnDefinition definition : columncomment) { - String columnName = definition.getColumnName(); + // String columnName = definition.getColumnName(); if (definition.getComment() != null) { println(";"); - print("COMMENT ON COLUMN " + x.getTableName() + "." + columnName + " IS " - + definition.getComment().toString()); + print("COMMENT ON COLUMN " + x.getTableName() + "."); + printName0(definition.getName().toString()); + print(" IS " + definition.getComment().toString()); } + } + List tableElementList = x.getTableElementList(); + for (SQLTableElement element : tableElementList) { + if (element instanceof MySqlTableIndex + && !(element instanceof MySqlUnique || element instanceof MySqlPrimaryKey)) { + println(";"); + SQLIndexDefinition indexdefinition = ((MySqlTableIndex) element).getIndexDefinition(); + printUcase("CREATE INDEX "); + if (((MySqlTableIndex) element).getName() != null) { + String text = ((MySqlTableIndex) element).getName().toString(); + printnamewithquote(text); + print(" "); + } + print("ON "); + printnamewithquote(x.getName().toString()); + String using = indexdefinition.hasOptions() ? indexdefinition.getOptions().getIndexType() + : null; + if (using != null) { + print0(this.ucase ? " USING " : " using "); + print0(using.toLowerCase()); + } + List indexColumns = ((MySqlTableIndex) element).getColumns(); + print0("("); + this.printAndAccept(indexColumns, ", "); + print(')'); + } + if (element instanceof MySqlKey + && !(element instanceof MySqlUnique || element instanceof MySqlPrimaryKey)) { + println(";"); + SQLIndexDefinition indexdefinition = ((MySqlKey) element).getIndexDefinition(); + printUcase("CREATE INDEX "); + if (((MySqlKey) element).getName() != null) { + String text = ((MySqlKey) element).getName().toString(); + printnamewithquote(text); + print(" "); + } + print("ON "); + printnamewithquote(x.getName().toString()); + String using = indexdefinition.hasOptions() ? indexdefinition.getOptions().getIndexType() + : null; + if (using != null) { + print0(this.ucase ? " USING " : " using "); + print0(using.toLowerCase()); + } + List indexColumns = ((MySqlKey) element).getColumns(); + print0("("); + this.printAndAccept(indexColumns, ", "); + print(')'); + } } return false; } + public void printnamewithquote(String text) { + char c0 = text.charAt(0); + if (c0 == '"' && text.charAt(text.length() - 1) == '"') { + print(text); + } else if (c0 == '`' && text.charAt(text.length() - 1) == '`') { + text = text.substring(1, text.length() - 1); + print("\"" + text + "\""); + } else { + if (hasUpper(text)) + print("\"" + text + "\""); + else + print(text); + } + } + @Override public boolean visit(SQLPartitionByHash x) { if (x.getColumns().size() > 1 || x.getColumns().size() == 0) { @@ -1547,7 +1721,6 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { } if (x.getComment() != null) { printNotSupportWord((this.ucase ? "COMMENT " : "comment ") + x.getComment()); - chameFeatureNotSupportLog("COMMENT in column definition" + getTypeAttribute(x)); } SQLExpr format = x.getFormat(); if (format != null) { @@ -1621,163 +1794,12 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { @Override /* index fulltext spatial */ public boolean visit(MySqlTableIndex x) { - print("\n-- "); - String indexType = x.getIndexType(); - boolean indexTypePrinted = false; - if ("FULLTEXT".equalsIgnoreCase(indexType)) { - this.print0(this.ucase ? "FULLTEXT " : "fulltext "); - indexTypePrinted = true; - } else if ("SPATIAL".equalsIgnoreCase(indexType)) { - this.print0(this.ucase ? "SPATIAL " : "spatial "); - indexTypePrinted = true; - } else if ("CLUSTERED".equalsIgnoreCase(indexType)) { - this.print0(this.ucase ? "CLUSTERED " : "clustered "); - indexTypePrinted = true; - } else if ("CLUSTERING".equalsIgnoreCase(indexType)) { - this.print0(this.ucase ? "CLUSTERING " : "clustering "); - indexTypePrinted = true; - } - if (x.getIndexDefinition().isGlobal()) { - this.print0(this.ucase ? "GLOBAL " : "global "); - } else if (x.getIndexDefinition().isLocal()) { - this.print0(this.ucase ? "LOCAL " : "local "); - } - this.print0(this.ucase ? "INDEX" : "index"); - if (x.getName() != null) { - this.print(' '); - x.getName().accept(this); - } - if (indexType != null && !indexTypePrinted && "ANN".equals(indexType)) { - this.print0(" "); - this.print0(indexType); - } - if (Boolean.TRUE.equals(x.getAttribute("ads.index"))) { - if (x.getIndexDefinition().isHashMapType()) { - this.print0(this.ucase ? " HASHMAP" : " hashmap"); - } else if (x.getIndexDefinition().isHashType()) { - this.print0(this.ucase ? " HASH" : " hash"); - } - } - String using = x.getIndexDefinition().hasOptions() ? x.getIndexDefinition().getOptions().getIndexType() : null; - if (using != null) { - this.print0(this.ucase ? " USING " : " using "); - this.print0(using); - } - this.print('('); - int i; - for (i = x.getColumns().size(); i < i; ++i) { - if (i != 0) { - this.print0(", "); - } - ((SQLSelectOrderByItem) x.getColumns().get(i)).accept(this); - } - this.print(')'); - if (x.getAnalyzerName() != null) { - this.print0(this.ucase ? " WITH ANALYZER " : " with analyzer "); - x.getAnalyzerName().accept(this); - } else { - if (x.getIndexAnalyzerName() != null) { - this.print0(this.ucase ? " WITH INDEX ANALYZER " : " with index analyzer "); - x.getIndexAnalyzerName().accept(this); - } - if (x.getQueryAnalyzerName() != null) { - this.print0(this.ucase ? " WITH QUERY ANALYZER " : " with query analyzer "); - x.getQueryAnalyzerName().accept(this); - } - if (x.getWithDicName() != null) { - this.printUcase(" WITH DICT "); - x.getWithDicName().accept(this); - } - } - List covering = x.getCovering(); - if (null != covering && covering.size() > 0) { - this.print0(this.ucase ? " COVERING " : " covering "); - this.print('('); - i = 0; - for (int size = covering.size(); i < size; ++i) { - if (i != 0) { - this.print0(", "); - } - ((SQLName) covering.get(i)).accept(this); - } - this.print(')'); - } - SQLExpr dbPartitionBy = x.getDbPartitionBy(); - if (dbPartitionBy != null) { - this.print0(this.ucase ? " DBPARTITION BY " : " dbpartition by "); - dbPartitionBy.accept(this); - } - SQLExpr tablePartitionBy = x.getTablePartitionBy(); - if (tablePartitionBy != null) { - this.print0(this.ucase ? " TBPARTITION BY " : " tbpartition by "); - tablePartitionBy.accept(this); - } - SQLExpr tablePartitions = x.getTablePartitions(); - if (tablePartitions != null) { - this.print0(this.ucase ? " TBPARTITIONS " : " tbpartitions "); - tablePartitions.accept(this); - } - if (x.getIndexDefinition().hasOptions()) { - x.getIndexDefinition().getOptions().accept(this); - } - print("\n"); - gaussFeatureNotSupportLog("specifying index" + getTypeAttribute(x)); + gaussFeatureNotSupportLog("specifying index when it creates table" + getTypeAttribute(x)); return false; } @Override public boolean visit(MySqlKey x) { - print("\n-- "); - if (x.isHasConstraint()) { - this.print0(this.ucase ? "CONSTRAINT " : "constraint "); - if (x.getName() != null) { - x.getName().accept(this); - this.print(' '); - } - } - String indexType = x.getIndexType(); - boolean fullText = "FULLTEXT".equalsIgnoreCase(indexType); - boolean clustering = "CLUSTERING".equalsIgnoreCase(indexType); - boolean clustered = "CLUSTERED".equalsIgnoreCase(indexType); - if (fullText) { - this.print0(this.ucase ? "FULLTEXT " : "fulltext "); - } else if (clustering) { - this.print0(this.ucase ? "CLUSTERING " : "clustering "); - } else if (clustered) { - this.print0(this.ucase ? "CLUSTERED " : "CLUSTERED "); - } - this.print0(this.ucase ? "KEY" : "key"); - SQLName name = x.getName(); - if (name != null) { - this.print(' '); - name.accept(this); - } - if (indexType != null && !fullText && !clustering && !clustered) { - this.print0(this.ucase ? " USING " : " using "); - this.print0(indexType); - } - this.print0(" ("); - int i = 0; - for (int size = x.getColumns().size(); i < size; ++i) { - if (i != 0) { - this.print0(", "); - } - ((SQLSelectOrderByItem) x.getColumns().get(i)).accept(this); - } - this.print(')'); - SQLIndexDefinition indexDefinition = x.getIndexDefinition(); - if (indexDefinition.hasOptions()) { - indexDefinition.getOptions().accept(this); - } - SQLExpr comment = x.getComment(); - if (indexDefinition.hasOptions() && indexDefinition.getOptions().getComment() == comment) { - comment = null; - } - if (comment != null) { - this.print0(this.ucase ? " COMMENT " : " comment "); - this.printExpr(comment); - } - print("\n"); gaussFeatureNotSupportLog("specifying key when it creates table" + getTypeAttribute(x)); return false; } @@ -2046,7 +2068,9 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { printUcase(" OR"); printUcase(" UPDATE "); } - println("ON " + x.getOn()); + print("ON "); + printnamewithquote(x.getOn().toString()); + println(); println("FOR EACH ROW"); println("EXECUTE PROCEDURE " + function_name + "();"); return false; @@ -2224,9 +2248,7 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { } SQLExpr column = columns.get(i); if (column instanceof SQLIdentifierExpr) { - // opengauss is incompatible with ` and ' - // printName0(((SQLIdentifierExpr) column).getName()); - visit((SQLIdentifierExpr) column); + printName0(((SQLIdentifierExpr) column).getName()); } else { printExpr(column, parameterized); } @@ -2261,36 +2283,53 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { } @Override - public boolean visit(SQLIdentifierExpr x) { - SQLObject root = x; - while (root.getParent() != null) { - root = root.getParent(); - } - if (root instanceof MySqlInsertStatement || root instanceof MySqlCreateTableStatement) { - // opengauss is incompatible with ` and ' - // printName0(((SQLIdentifierExpr) column).getName()); - try { - String text = x.getName(); - char c0 = text.charAt(0); - if (c0 == '`' && text.charAt(text.length() - 1) == '`' || - c0 == "'".charAt(0) && text.charAt(text.length() - 1) == "'".charAt(0)) { - this.appender.append(text.substring(1, text.length() - 1)); + protected void printName0(String text) { + if (this.appender == null || text.length() == 0) + return; + this.quote = '"'; + try { + if ((text.charAt(0) != '"' || text.charAt(0) != '`') + && (text.toUpperCase().equals("NEW") || text.toUpperCase().equals("OLD") + || text.toUpperCase().equals("MAXVALUE"))) { + this.appender.append(text); + return; + } + 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); + } 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)) { + 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); } - return false; - } else { - return super.visit(x); + } catch (IOException e) { + throw new RuntimeException("println error", e); + } + } + + public static boolean hasUpper(String str) { + for (int i = 0; i < str.length(); i++) { + char c0 = str.charAt(i); + if (Character.isUpperCase(c0)) + return true; } + return false; } // 13.2.8 REPLACE Statement @Override public boolean visit(SQLReplaceStatement x) { - logger.error("replace statement is incompatible with OpenGauss" + getTypeAttribute(x)); + logger.error("replace statement is incompatible with openGauss" + getTypeAttribute(x)); errHandle(x); return false; } @@ -2599,9 +2638,11 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { SQLExpr expr = x.getExpr(); SQLObject parent = x.getParent(); boolean isParentCreateIndex = (parent != null && parent instanceof SQLCreateIndexStatement); - if (isParentCreateIndex && expr instanceof SQLMethodInvokeExpr) { + boolean isParentTableIndex = (parent != null && parent instanceof MySqlTableIndex); + boolean isParentTableKey = (parent != null && parent instanceof MySqlKey); + if ((isParentCreateIndex || isParentTableIndex || isParentTableKey) && expr instanceof SQLMethodInvokeExpr) { gaussFeatureNotSupportLog("prefix length of columnName on index" + getTypeAttribute(x)); - print0(((SQLMethodInvokeExpr) expr).getMethodName()); + printnamewithquote(((SQLMethodInvokeExpr) expr).getMethodName()); } else if (expr instanceof SQLIntegerExpr) { this.print(((SQLIntegerExpr) expr).getNumber().longValue()); } else { @@ -2609,10 +2650,18 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { } SQLOrderingSpecification type = x.getType(); if (type != null) { - if (isParentCreateIndex) { - SQLIndexOptions options = ((SQLCreateIndexStatement) parent).getIndexDefinition().getOptions(); - String using = options.getIndexType(); - if (using != null && using.toLowerCase().equals("hash")) { + if (isParentCreateIndex || isParentTableIndex || isParentTableKey) { + String using = ""; + if (isParentCreateIndex) { + SQLIndexOptions options = ((SQLCreateIndexStatement) parent).getIndexDefinition().getOptions(); + using = options.getIndexType(); + } else if (isParentTableIndex) { + SQLIndexOptions options = ((MySqlTableIndex) parent).getIndexDefinition().getOptions(); + using = options.getIndexType(); + } else if (isParentTableKey) { + using = ((MySqlKey) parent).getIndexType(); + } + if (using != "" && using.toLowerCase().equals("hash")) { logger.error( "method hash does not support ASC/DESC options in openGauss" + getTypeAttribute(x)); errHandle(x); @@ -3126,7 +3175,7 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { @Override public boolean visit(MySqlUserName x) { String userName = x.getUserName(); - print0(userName); + printnamewithquote(userName); if (x.getHost() != null) { println(); print("-- "); @@ -3674,7 +3723,7 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { String.format("Privilege %s is incompatible with OpenGauss", name) + getTypeAttribute(x)); errHandle(x, "incompatible privilege"); } - printExpr(action); + print(action.toString()); if (!x.getColumns().isEmpty()) { print0("("); printAndAccept(x.getColumns(), ", "); diff --git a/src/test/resources/dialect/mysql/expect/alterTable_statement.sql b/src/test/resources/dialect/mysql/expect/alterTable_statement.sql index 96d520d..1574bf4 100644 --- a/src/test/resources/dialect/mysql/expect/alterTable_statement.sql +++ b/src/test/resources/dialect/mysql/expect/alterTable_statement.sql @@ -1,31 +1,31 @@ -ALTER TABLE testAlterTable1 +ALTER TABLE "testAlterTable1" ADD col0 DECIMAL(4, 2) -- FIRST ; -ALTER TABLE testAlterTable2 +ALTER TABLE "testAlterTable2" ADD (col4 DECIMAL(4, 2), col5 FLOAT); -- lack of index name -- too much Column -ALTER TABLE testAlterTable5 +ALTER TABLE "testAlterTable5" ADD INDEX -- FULLTEXT -i4(col4); -ALTER TABLE testAlterTable6 - ADD CONSTRAINT pk_index PRIMARY KEY (col1) +"I4"(col4); +ALTER TABLE "testAlterTable6" + ADD CONSTRAINT "pk_Index" PRIMARY KEY (col1) -- USING BTREE ; -ALTER TABLE testAlterTable7 +ALTER TABLE "testAlterTable7" ADD UNIQUE (col2); -ALTER TABLE testAlterTable8 - ADD CONSTRAINT fk_pid2 FOREIGN KEY (col5) REFERENCES parent (id) MATCH SIMPLE ON DELETE CASCADE; +ALTER TABLE "testAlterTable8" + ADD CONSTRAINT "Fk_pid2" FOREIGN KEY (col5) REFERENCES parent (id) MATCH SIMPLE ON DELETE CASCADE; -- err -ALTER TABLE testAlterTable10 - ALTER COLUMN col5 SET DEFAULT 4; -ALTER TABLE testAlterTable11 +ALTER TABLE "testAlterTable10" + ALTER COLUMN "COL5" SET DEFAULT 4; +ALTER TABLE "testAlterTable11" DROP col5 , ADD col6 INTEGER NOT NULL -- FIRST ; -ALTER TABLE testAlterTable12 +ALTER TABLE "testAlterTable12" DROP col6 ,ADD col6 INTEGER NULL DEFAULT 0; -- CHARACTER SET -- convert to character set @@ -37,19 +37,19 @@ ALTER TABLE testAlterTable12 -- drop primary key -- drop foreign key -- force -ALTER TABLE testAlterTable RENAME TO testAlterTable2; -ALTER TABLE testAlterTable23 +ALTER TABLE "testAlterTable" RENAME TO "testAlterTable2"; +ALTER TABLE "testAlterTable23" DROP col5 ,ADD col5 INTEGER NULL, DROP col3 ,ADD col3 INTEGER NULL; -ALTER TABLE testAlterTable23 RENAME TO testAlterTable2; -ALTER TABLE testAlterTable2 +ALTER TABLE "testAlterTable23" RENAME TO "testAlterTable2"; +ALTER TABLE "testAlterTable2" DROP col2 ,ADD col2 DOUBLE PRECISION; -ALTER TABLE testAlterTable24 RENAME TO testAlterTable; -ALTER TABLE testAlterTable +ALTER TABLE "testAlterTable24" RENAME TO "testAlterTable"; +ALTER TABLE "testAlterTable" DROP col2 ,ADD col2 INTEGER; -- AUTO_INCREMENT -ALTER TABLE testAlterTable26 - SET TABLESPACE ts1 +ALTER TABLE "testAlterTable26" + SET TABLESPACE "TS1" -- STORAGE DISK ; ALTER TABLE t27 @@ -60,13 +60,13 @@ ALTER TABLE t29 DROP PARTITION p2,DROP PARTITION p3; -- unknown partition keyword -- unknown partition keyword -ALTER TABLE testAlterTableHash32 +ALTER TABLE "testAlterTableHash32" TRUNCATE PARTITION p1,TRUNCATE PARTITION p2; -- unsupported keyword all -- unknown partition keyword -- unknown partition keyword ALTER TABLE e - EXCHANGE PARTITION (p0) WITH TABLE e2; + EXCHANGE PARTITION ("P0") WITH TABLE e2; -- unsupported removing partition -- unsupported upgrading partition -- partition by \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/columnDefinition_statement.sql b/src/test/resources/dialect/mysql/expect/columnDefinition_statement.sql index f64f931..bd06d86 100644 --- a/src/test/resources/dialect/mysql/expect/columnDefinition_statement.sql +++ b/src/test/resources/dialect/mysql/expect/columnDefinition_statement.sql @@ -1,28 +1,24 @@ CREATE TABLE test1 ( - id BIGSERIAL PRIMARY KEY, + "id" BIGSERIAL PRIMARY KEY, name CHAR(2) NOT NULL UNIQUE DEFAULT 'GA' -- COMMENT 'char' -- COLUMN_FORMAT fixed -- STORAGE DISK - ); -CREATE TABLE testIndexKey ( +COMMENT ON COLUMN test1.name IS 'char'; +CREATE TABLE "testIndexKey" ( id INTEGER, name CHAR(2) --- INDEX idIndex USING BTREE() - --- KEY nameIndex USING HASH (name) - ); -CREATE TABLE testIndexKey ( +CREATE INDEX "idIndex" ON "testIndexKey" USING btree(id); +CREATE INDEX "nameIndex" ON "testIndexKey" USING hash(name); +CREATE TABLE "testIndexKey" ( id INTEGER, - --- INDEX idIndex USING BTREE() -name CHAR(2) --- KEY nameIndex USING HASH (name) - + name CHAR(2) ); -CREATE TABLE testPrimaryUniqueKey ( +CREATE INDEX "idIndex" ON "testIndexKey" USING btree(id); +CREATE INDEX "nameIndex" ON "testIndexKey" USING hash(name); +CREATE TABLE "testPrimaryUniqueKey" ( id INTEGER, name CHAR(2), parent_id INTEGER, @@ -38,17 +34,13 @@ CREATE TABLE testPrimaryUniqueKey ( col5 INTEGER, CONSTRAINT ck_con CHECK (id > 0) -- NOT ENFORCED - ); -CREATE TABLE testIndexKey ( +CREATE TABLE "testIndexKey" ( id INTEGER, name CHAR(2), t TEXT, - --- INDEX id_index USING btree() - --- KEY name_key USING hash (name) -col4 INTEGER --- FULLTEXT INDEX test_index() - -); \ No newline at end of file + col4 INTEGER +); +CREATE INDEX id_index ON "testIndexKey" USING btree(id); +CREATE INDEX name_key ON "testIndexKey" USING hash(name); +CREATE INDEX test_index ON "testIndexKey"(t); \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/createDatabase_statement.sql b/src/test/resources/dialect/mysql/expect/createDatabase_statement.sql index c75a07c..3d78833 100644 --- a/src/test/resources/dialect/mysql/expect/createDatabase_statement.sql +++ b/src/test/resources/dialect/mysql/expect/createDatabase_statement.sql @@ -1,4 +1,4 @@ -CREATE SCHEMA test_db_char +CREATE DATABASE test_db_char -- utf8 -- utf8_chinese_ci ; \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/createFunction_statement.sql b/src/test/resources/dialect/mysql/expect/createFunction_statement.sql index a9e551c..33a8546 100644 --- a/src/test/resources/dialect/mysql/expect/createFunction_statement.sql +++ b/src/test/resources/dialect/mysql/expect/createFunction_statement.sql @@ -1,6 +1,6 @@ CREATE -- DEFINER 'root'@'%' -FUNCTION doIterate( +FUNCTION "doIterate"( p INTEGER, q INTEGER ) @@ -11,7 +11,7 @@ FUNCTION doIterate( <>LOOP p := p - 1; INSERT - INTO testFunction + INTO "testFunction" VALUES (DEFAULT, concat('a', p)); IF p < 10 THEN EXIT label1; diff --git a/src/test/resources/dialect/mysql/expect/createProcedure_statement.sql b/src/test/resources/dialect/mysql/expect/createProcedure_statement.sql index 0f79bde..e317235 100644 --- a/src/test/resources/dialect/mysql/expect/createProcedure_statement.sql +++ b/src/test/resources/dialect/mysql/expect/createProcedure_statement.sql @@ -6,10 +6,8 @@ p1 ( INOUT a INTEGER ) -- LANGUAGE SQL - IMMUTABLE -- CONTAINS SQL - SECURITY INVOKER AS BEGIN @@ -24,7 +22,6 @@ CREATE PROCEDURE p2 () -- LANGUAGE SQL -- CONTAINS SQL - SECURITY DEFINER AS BEGIN @@ -35,10 +32,8 @@ END; / CREATE PROCEDURE p3 () -- LANGUAGE SQL - VOLATILE -- CONTAINS SQL - AS BEGIN DROP TABLE IF EXISTS data1 RESTRICT; @@ -46,19 +41,16 @@ END; / CREATE PROCEDURE p4 () -- LANGUAGE SQL - VOLATILE -- CONTAINS SQL - AS BEGIN - ALTER TABLE testAlterTable1 + ALTER TABLE "testAlterTable1" ADD col0 DECIMAL(4, 2); END; / CREATE PROCEDURE p5 () -- COMMENT 'good' - VOLATILE AS BEGIN diff --git a/src/test/resources/dialect/mysql/expect/createTable_statement.sql b/src/test/resources/dialect/mysql/expect/createTable_statement.sql index c45b40f..8c7c842 100644 --- a/src/test/resources/dialect/mysql/expect/createTable_statement.sql +++ b/src/test/resources/dialect/mysql/expect/createTable_statement.sql @@ -63,9 +63,8 @@ PARTITION BY HASH PARTITION p2 TABLESPACE ts1 -- COMMENT 'p2' - ); -CREATE TABLE testTableOptions ( +CREATE TABLE "testTableOptions" ( id INTEGER, name CHAR(2) ) TABLESPACE ts1 @@ -100,14 +99,15 @@ CREATE TABLE t10 ( (col1) -- USING BTREE , - --- FULLTEXT INDEX() -CONSTRAINT W_CONSTR_KEY2 CHECK (col1 > 0 + CONSTRAINT "W_CONSTR_KEY2" CHECK (col1 > 0 AND col2 IS NOT NULL), col3 CHAR(1) ) TABLESPACE h1 -- COMPRESSION = 'NONE' ; +CREATE INDEX "idIndex" ON t10 USING btree(col1); +CREATE INDEX "nameIndex" ON t10 USING hash(name); +CREATE INDEX ON t10(col1); CREATE TABLE t11 ( col1 INTEGER PRIMARY KEY NOT NULL DEFAULT 1, col2 BIGSERIAL @@ -120,8 +120,8 @@ CREATE TABLE t11 ( col3 INTEGER -- GENERATED ALWAYS AS (CONCAT(FIRST_NAME, ' ', LAST_NAME)) -- VIRTUAL - ); +COMMENT ON COLUMN t11.col2 IS 'string'; -- hash(methodInvoke) -- subPartition name -- improper number of columns @@ -130,45 +130,38 @@ CREATE TABLE t15 ( purchased INTEGER ) -- ENGINE = MYISAM - PARTITION BY RANGE (purchased) SUBPARTITION BY HASH (purchased) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0 -- DATA DIRECTORY '/disk0/data' -- INDEX DIRECTORY '/disk0/idx' - TABLESPACE ts1 -- COMMENT 'ts1' TABLESPACE ts1, SUBPARTITION s1 -- DATA DIRECTORY '/disk1/data' -- INDEX DIRECTORY '/disk1/idx' - TABLESPACE ts1 TABLESPACE ts1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2 -- DATA DIRECTORY '/disk2/data' -- INDEX DIRECTORY '/disk2/idx' - TABLESPACE ts1 TABLESPACE ts1, SUBPARTITION s3 -- DATA DIRECTORY '/disk3/data' -- INDEX DIRECTORY '/disk3/idx' - TABLESPACE ts1 TABLESPACE ts1 ), PARTITION p2 VALUES LESS THAN MAXVALUE ( SUBPARTITION s4 -- DATA DIRECTORY '/disk4/data' -- INDEX DIRECTORY '/disk4/idx' - TABLESPACE ts1 TABLESPACE ts1, SUBPARTITION s5 -- DATA DIRECTORY '/disk5/data' -- INDEX DIRECTORY '/disk5/idx' - TABLESPACE ts1 TABLESPACE ts1 ) ); diff --git a/src/test/resources/dialect/mysql/expect/createView_statement.sql b/src/test/resources/dialect/mysql/expect/createView_statement.sql index b681d11..0ce5f28 100644 --- a/src/test/resources/dialect/mysql/expect/createView_statement.sql +++ b/src/test/resources/dialect/mysql/expect/createView_statement.sql @@ -2,12 +2,12 @@ CREATE OR REPLACE -- ALGORITHM = merge -- DEFINER = current_user -- SQL SECURITY = definer - VIEW vwEmployeesByDepartment + VIEW "vwEmployeesByDepartment" AS -SELECT emp.ID, emp.Name, emp.Salary, CAST(emp.DOB AS DATE) AS DOB, emp.Gender - , dept.Name AS DepartmentName -FROM Employee emp - INNER JOIN Department dept ON emp.DeptID = dept.ID +SELECT emp."ID", emp."Name", emp."Salary", CAST(emp."DOB" AS DATE) AS "DOB", emp."Gender" + , dept."Name" AS "DepartmentName" +FROM "Employee" emp + INNER JOIN "Department" dept ON emp."DeptID" = dept."ID" -- WITH CHECK OPTION -- CASCADED ; \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/dataType_statement.sql b/src/test/resources/dialect/mysql/expect/dataType_statement.sql index 95fb74c..e439f9f 100644 --- a/src/test/resources/dialect/mysql/expect/dataType_statement.sql +++ b/src/test/resources/dialect/mysql/expect/dataType_statement.sql @@ -1,4 +1,4 @@ -CREATE TABLE testDataType ( +CREATE TABLE "testDataType" ( id1 BIGSERIAL PRIMARY KEY, id2 SMALLINT, id3 INTEGER, @@ -45,6 +45,6 @@ CREATE TABLE testDataType ( id41 BYTEA, id42 JSON ); -CREATE TABLE testDataType2 ( +CREATE TABLE "testDataType2" ( id1 FLOAT(4) PRIMARY KEY ); \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/delete_statement.sql b/src/test/resources/dialect/mysql/expect/delete_statement.sql index 4230ac5..415c094 100644 --- a/src/test/resources/dialect/mysql/expect/delete_statement.sql +++ b/src/test/resources/dialect/mysql/expect/delete_statement.sql @@ -1,6 +1,6 @@ DELETE -- LOW_PRIORITY IGNORE QUICK -FROM testFunction PARTITION (p1) +FROM "testFunction" PARTITION (p1) WHERE id > 1 -- ORDER BY id -- LIMIT 1 diff --git a/src/test/resources/dialect/mysql/expect/dropTable_statement.sql b/src/test/resources/dialect/mysql/expect/dropTable_statement.sql index ece62cd..99b3aa4 100644 --- a/src/test/resources/dialect/mysql/expect/dropTable_statement.sql +++ b/src/test/resources/dialect/mysql/expect/dropTable_statement.sql @@ -1,3 +1,3 @@ DROP TABLE -- TEMPORARY -IF EXISTS testTableOptions RESTRICT; \ No newline at end of file +IF EXISTS "testTableOptions" RESTRICT; diff --git a/src/test/resources/dialect/mysql/expect/grant_statement.sql b/src/test/resources/dialect/mysql/expect/grant_statement.sql index eb4bb60..578d590 100644 --- a/src/test/resources/dialect/mysql/expect/grant_statement.sql +++ b/src/test/resources/dialect/mysql/expect/grant_statement.sql @@ -25,17 +25,17 @@ GRANT ALTER, DROP, EXECUTE ON ALL PROCEDURE IN SCHEMA delphis TO usr_replica -- @'%' WITH GRANT OPTION; -- incompatible privilege -GRANT ALL ON waitCopy TO usr_replica +GRANT ALL ON "waitCopy" TO usr_replica -- @'%' ; -GRANT ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON waitCopy TO usr_replica +GRANT ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON "waitCopy" TO usr_replica -- @'%' WITH GRANT OPTION; -- incompatible privilege -GRANT INSERT(id), REFERENCES(id), SELECT(id), UPDATE(id) ON waitCopy TO usr_replica +GRANT INSERT("ID"), REFERENCES(id), SELECT(id), UPDATE(id) ON "waitCopy" TO usr_replica -- @'%' ; -GRANT ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON waitCopy TO usr_replica +GRANT ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON "waitCopy" TO usr_replica -- @'%' WITH GRANT OPTION; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA delphis TO usr_replica diff --git a/src/test/resources/dialect/mysql/expect/revoke_statement.sql b/src/test/resources/dialect/mysql/expect/revoke_statement.sql index 9dac102..86529b5 100644 --- a/src/test/resources/dialect/mysql/expect/revoke_statement.sql +++ b/src/test/resources/dialect/mysql/expect/revoke_statement.sql @@ -25,16 +25,16 @@ REVOKE ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON ALL TAB ; -- incompatible privilege -- incompatible privilege -REVOKE ALL ON testRevoke FROM mysql_test +REVOKE ALL ON "testRevoke" FROM mysql_test -- @'%' ; -REVOKE ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON testRevoke FROM mysql_test +REVOKE ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON "testRevoke" FROM mysql_test -- @'%' ; -REVOKE INSERT(id), REFERENCES(id), SELECT(id), UPDATE(id) ON testRevoke FROM mysql_test +REVOKE INSERT(id), REFERENCES(id), SELECT(id), UPDATE(id) ON "testRevoke" FROM mysql_test -- @'%' ; -REVOKE ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON testRevoke FROM mysql_test +REVOKE ALTER, DELETE, DROP, INDEX, INSERT, REFERENCES, SELECT, UPDATE ON "testRevoke" FROM mysql_test -- @'%' ; REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA mysql_database FROM mysql_test diff --git a/src/test/resources/dialect/mysql/expect/select_query_statement_01.sql b/src/test/resources/dialect/mysql/expect/select_query_statement_01.sql index 91e8793..e194abb 100644 --- a/src/test/resources/dialect/mysql/expect/select_query_statement_01.sql +++ b/src/test/resources/dialect/mysql/expect/select_query_statement_01.sql @@ -1,9 +1,9 @@ -SELECT `c`.`name` AS `category`, sum(`p`.`amount`) AS `total_sales` -FROM `sakila`.`payment` `p` - JOIN `sakila`.`rental` `r` ON `p`.`rental_id` = `r`.`rental_id` - JOIN `sakila`.`inventory` `i` ON `r`.`inventory_id` = `i`.`inventory_id` - JOIN `sakila`.`film` `f` ON `i`.`film_id` = `f`.`film_id` - JOIN `sakila`.`film_category` `fc` ON `f`.`film_id` = `fc`.`film_id` - JOIN `sakila`.`category` `c` ON `fc`.`category_id` = `c`.`category_id` -GROUP BY `c`.`name` -ORDER BY `total_sales` DESC \ No newline at end of file +SELECT "c"."name" AS "category", sum("p"."amount") AS "total_sales" +FROM "sakila"."payment" "p" + JOIN "sakila"."rental" "r" ON "p"."rental_id" = "r"."rental_id" + JOIN "sakila"."inventory" "i" ON "r"."inventory_id" = "i"."inventory_id" + JOIN "sakila"."film" "f" ON "i"."film_id" = "f"."film_id" + JOIN "sakila"."film_category" "fc" ON "f"."film_id" = "fc"."film_id" + JOIN "sakila"."category" "c" ON "fc"."category_id" = "c"."category_id" +GROUP BY "c"."name" +ORDER BY "total_sales" DESC diff --git a/src/test/resources/dialect/mysql/expect/select_query_statement_02.sql b/src/test/resources/dialect/mysql/expect/select_query_statement_02.sql index d783664..868b09a 100644 --- a/src/test/resources/dialect/mysql/expect/select_query_statement_02.sql +++ b/src/test/resources/dialect/mysql/expect/select_query_statement_02.sql @@ -4,21 +4,21 @@ SELECT DISTINCT -- SQL_BIG_RESULT -- SQL_CACHE -- SQL_CALC_FOUND_ROWS -concat(`c`.`city`, '', '', `cy`.`country`) AS `store` - , concat(`m`.`first_name`, '', `m`.`last_name`) AS `manager` - , sum(`p`.`amount`) AS `total_sales` -FROM `sakila`.`payment` `p` - JOIN `sakila`.`rental` `r` ON `p`.`rental_id` = `r`.`rental_id` - JOIN `sakila`.`inventory` `i` ON `r`.`inventory_id` = `i`.`inventory_id` - JOIN `sakila`.`store` `s` ON `i`.`store_id` = `s`.`store_id` - JOIN `sakila`.`address` `a` ON `s`.`address_id` = `a`.`address_id` - JOIN `sakila`.`city` `c` ON `a`.`city_id` = `c`.`city_id` - JOIN `sakila`.`country` `cy` ON `c`.`country_id` = `cy`.`country_id` - JOIN `sakila`.`staff` `m` ON `s`.`manager_staff_id` = `m`.`staff_id` -WHERE `sakila`.`staff`.`staff_id` = 1 - OR `sakila`.`staff`.`staff_id` = 2 -GROUP BY `sakila`.`store`.`store_id`, `sakila`.`country`.`country`, `sakila`.`city`.`city` -HAVING `sakila`.`store`.`store_id` = 1 -ORDER BY `sakila`.`country`.`country`, `sakila`.`city`.`city` +concat("c"."city", '', '', "cy"."country") AS "store" + , concat("m"."first_name", '', "m"."last_name") AS "manager" + , sum("p"."amount") AS "total_sales" +FROM "sakila"."payment" "p" + JOIN "sakila"."rental" "r" ON "p"."rental_id" = "r"."rental_id" + JOIN "sakila"."inventory" "i" ON "r"."inventory_id" = "i"."inventory_id" + JOIN "sakila"."store" "s" ON "i"."store_id" = "s"."store_id" + JOIN "sakila"."address" "a" ON "s"."address_id" = "a"."address_id" + JOIN "sakila"."city" "c" ON "a"."city_id" = "c"."city_id" + JOIN "sakila"."country" "cy" ON "c"."country_id" = "cy"."country_id" + JOIN "sakila"."staff" "m" ON "s"."manager_staff_id" = "m"."staff_id" +WHERE "sakila"."staff"."staff_id" = 1 + OR "sakila"."staff"."staff_id" = 2 +GROUP BY "sakila"."store"."store_id", "sakila"."country"."country", "sakila"."city"."city" +HAVING "sakila"."store"."store_id" = 1 +ORDER BY "sakila"."country"."country", "sakila"."city"."city" LIMIT 4 OFFSET 3 FOR SHARE; \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/select_statement.sql b/src/test/resources/dialect/mysql/expect/select_statement.sql index e528fa1..f6bbb5e 100644 --- a/src/test/resources/dialect/mysql/expect/select_statement.sql +++ b/src/test/resources/dialect/mysql/expect/select_statement.sql @@ -1,40 +1,40 @@ -SELECT `c`.`name` AS `category`, sum(`p`.`amount`) AS `total_sales` -FROM `sakila`.`payment` `p` - JOIN `sakila`.`rental` `r` ON `p`.`rental_id` = `r`.`rental_id` - JOIN `sakila`.`inventory` `i` ON `r`.`inventory_id` = `i`.`inventory_id` - JOIN `sakila`.`film` `f` ON `i`.`film_id` = `f`.`film_id` - JOIN `sakila`.`film_category` `fc` ON `f`.`film_id` = `fc`.`film_id` - JOIN `sakila`.`category` `c` ON `fc`.`category_id` = `c`.`category_id` -GROUP BY `c`.`name` -ORDER BY `total_sales` DESC; +SELECT "c"."name" AS "category", sum("p"."amount") AS "total_sales" +FROM "sakila"."payment" "p" + JOIN "sakila"."rental" "r" ON "p"."rental_id" = "r"."rental_id" + JOIN "sakila"."inventory" "i" ON "r"."inventory_id" = "i"."inventory_id" + JOIN "sakila"."film" "f" ON "i"."film_id" = "f"."film_id" + JOIN "sakila"."film_category" "fc" ON "f"."film_id" = "fc"."film_id" + JOIN "sakila"."category" "c" ON "fc"."category_id" = "c"."category_id" +GROUP BY "c"."name" +ORDER BY "total_sales" DESC; SELECT DISTINCT -- HIGH_PRIORITY -- STRAIGHT_JOIN -- SQL_BIG_RESULT -- SQL_CACHE -- SQL_CALC_FOUND_ROWS -concat(`c`.`city`, '', '', `cy`.`country`) AS `store` - , concat(`m`.`first_name`, '', `m`.`last_name`) AS `manager` - , sum(`p`.`amount`) AS `total_sales` -FROM `sakila`.`payment` `p` - JOIN `sakila`.`rental` `r` ON `p`.`rental_id` = `r`.`rental_id` - JOIN `sakila`.`inventory` `i` ON `r`.`inventory_id` = `i`.`inventory_id` - JOIN `sakila`.`store` `s` ON `i`.`store_id` = `s`.`store_id` - JOIN `sakila`.`address` `a` ON `s`.`address_id` = `a`.`address_id` - JOIN `sakila`.`city` `c` ON `a`.`city_id` = `c`.`city_id` - JOIN `sakila`.`country` `cy` ON `c`.`country_id` = `cy`.`country_id` - JOIN `sakila`.`staff` `m` ON `s`.`manager_staff_id` = `m`.`staff_id` -WHERE `sakila`.`staff`.`staff_id` = 1 - OR `sakila`.`staff`.`staff_id` = 2 -GROUP BY `sakila`.`store`.`store_id`, `sakila`.`country`.`country`, `sakila`.`city`.`city` -HAVING `sakila`.`store`.`store_id` = 1 -ORDER BY `sakila`.`country`.`country`, `sakila`.`city`.`city` +concat("c"."city", '', '', "cy"."country") AS "store" + , concat("m"."first_name", '', "m"."last_name") AS "manager" + , sum("p"."amount") AS "total_sales" +FROM "sakila"."payment" "p" + JOIN "sakila"."rental" "r" ON "p"."rental_id" = "r"."rental_id" + JOIN "sakila"."inventory" "i" ON "r"."inventory_id" = "i"."inventory_id" + JOIN "sakila"."store" "s" ON "i"."store_id" = "s"."store_id" + JOIN "sakila"."address" "a" ON "s"."address_id" = "a"."address_id" + JOIN "sakila"."city" "c" ON "a"."city_id" = "c"."city_id" + JOIN "sakila"."country" "cy" ON "c"."country_id" = "cy"."country_id" + JOIN "sakila"."staff" "m" ON "s"."manager_staff_id" = "m"."staff_id" +WHERE "sakila"."staff"."staff_id" = 1 + OR "sakila"."staff"."staff_id" = 2 +GROUP BY "sakila"."store"."store_id", "sakila"."country"."country", "sakila"."city"."city" +HAVING "sakila"."store"."store_id" = 1 +ORDER BY "sakila"."country"."country", "sakila"."city"."city" LIMIT 4 OFFSET 3 FOR SHARE; -SELECT a.id, b.id +SELECT a."Id", "B"."Id" FROM hello.tb1 a - JOIN hello.tb1_1 b + JOIN hello.tb1_1 "B" FOR UPDATE NOWAIT; SELECT * -FROM sakila.actor +FROM "Sakila".actor FOR SHARE; \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/expect/update_statement.sql b/src/test/resources/dialect/mysql/expect/update_statement.sql index 0bc7ccd..ae4b7ef 100644 --- a/src/test/resources/dialect/mysql/expect/update_statement.sql +++ b/src/test/resources/dialect/mysql/expect/update_statement.sql @@ -4,5 +4,5 @@ SET items.retail = items.retail * 0.9 WHERE items.id > 10 AND EXISTS ( SELECT 1 - FROM waitCopy + FROM "waitCopy" ); \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/input/alterTable_statement.sql b/src/test/resources/dialect/mysql/input/alterTable_statement.sql index 4694b77..de0c7ed 100644 --- a/src/test/resources/dialect/mysql/input/alterTable_statement.sql +++ b/src/test/resources/dialect/mysql/input/alterTable_statement.sql @@ -4,19 +4,19 @@ alter table testAlterTable2 ADD COLUMN (col4 decimal(4,2),col5 float); alter table testAlterTable3 add index (col1) using btree comment 'col1' key_block_size = 128 with parser p; -alter table testAlterTable4 add key index_name (col1,col2); +alter table testAlterTable4 add key Index_name (col1,col2); -alter table testAlterTable5 add fulltext index i4 (col4); +alter table testAlterTable5 add fulltext index I4 (col4); -alter table testAlterTable6 add constraint pk_id primary key pk_index using btree (col1); +alter table testAlterTable6 add constraint pk_Id primary key pk_Index using btree (col1); alter table testAlterTable7 add constraint unique_constraint unique index (col2); -alter table testAlterTable8 add constraint fk_pid2 foreign key (col5) references parent(id) match simple on delete cascade; +alter table testAlterTable8 add constraint Fk_pid2 foreign key (col5) references parent(id) match simple on delete cascade; alter table testAlterTable9 add check(col5 > 0),algorithm = inplace; -alter table testAlterTable10 alter col5 set default 4; +alter table testAlterTable10 alter COL5 set default 4; alter table testAlterTable11 change col5 col6 int not null first; @@ -50,7 +50,7 @@ alter table testAlterTable24 rename to testAlterTable, modify col2 int; alter table testAlterTable25 auto_increment = 1; -alter table testAlterTable26 TABLESPACE ts1 storage disk; +alter table testAlterTable26 TABLESPACE TS1 storage disk; ALTER TABLE t27 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002)); @@ -74,7 +74,7 @@ alter table db.table partition p20150301 values less than ('2015-04-01'), partition pMax values less than (maxvalue)); -ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2; +ALTER TABLE e EXCHANGE PARTITION P0 WITH TABLE e2; ALTER TABLE e remove partitioning ; diff --git a/src/test/resources/dialect/mysql/input/columnDefinition_statement.sql b/src/test/resources/dialect/mysql/input/columnDefinition_statement.sql index 621151c..05b437d 100644 --- a/src/test/resources/dialect/mysql/input/columnDefinition_statement.sql +++ b/src/test/resources/dialect/mysql/input/columnDefinition_statement.sql @@ -34,4 +34,6 @@ create table testIndexKey( key name_key using hash(name), col4 int, fulltext test_index (t) -); \ No newline at end of file +); + + diff --git a/src/test/resources/dialect/mysql/input/createProcedure_statement.sql b/src/test/resources/dialect/mysql/input/createProcedure_statement.sql index 52f7f11..d43f868 100644 --- a/src/test/resources/dialect/mysql/input/createProcedure_statement.sql +++ b/src/test/resources/dialect/mysql/input/createProcedure_statement.sql @@ -29,4 +29,4 @@ create procedure p5 () deterministic begin update data set data.id = data.id*1.2; -end; +end; \ No newline at end of file diff --git a/src/test/resources/dialect/mysql/input/createTable_statement.sql b/src/test/resources/dialect/mysql/input/createTable_statement.sql index 0e2cc6e..176cdf6 100644 --- a/src/test/resources/dialect/mysql/input/createTable_statement.sql +++ b/src/test/resources/dialect/mysql/input/createTable_statement.sql @@ -103,6 +103,8 @@ create table t10 ( constraint constraint_name foreign key (col1) references table2 (col1) match partial on update set null, constraint constraint_name1 primary key indexname1 (col1) COMMENT 'string', constraint constraint_name2 unique indexname2 using btree(col1), + INDEX idIndex USING BTREE (col1), + KEY nameIndex USING HASH (name), fulltext index(col1), CONSTRAINT W_CONSTR_KEY2 CHECK(col1 > 0 AND col2 IS NOT NULL), col3 char(1)) diff --git a/src/test/resources/dialect/mysql/input/createTrigger_statement.sql b/src/test/resources/dialect/mysql/input/createTrigger_statement.sql index 366d8c6..00b3a2f 100644 --- a/src/test/resources/dialect/mysql/input/createTrigger_statement.sql +++ b/src/test/resources/dialect/mysql/input/createTrigger_statement.sql @@ -12,4 +12,4 @@ CREATE Definer='root' TRIGGER tr_before_insert_employee repeat set new.work_year=new.work_year+1; until new.work_year>10 end repeat; - END \ No newline at end of file + END; diff --git a/src/test/resources/dialect/mysql/input/grant_statement.sql b/src/test/resources/dialect/mysql/input/grant_statement.sql index 98abcc6..b516eff 100644 --- a/src/test/resources/dialect/mysql/input/grant_statement.sql +++ b/src/test/resources/dialect/mysql/input/grant_statement.sql @@ -19,7 +19,7 @@ grant alter ,delete,drop,index,insert,references ,select,update on delphis.waitC grant create,create view,show view,trigger,usage on delphis.waitCopy to 'usr_replica'@'%'; -- db.table列权限,均适配 -grant insert (id),references (id),select (id),update (id) on delphis.waitCopy to 'usr_replica'@'%'; +grant insert (ID),references (id),select (id),update (id) on delphis.waitCopy to 'usr_replica'@'%'; -- table grant alter ,delete,drop,index,insert,references ,select,update on waitCopy to 'usr_replica'@'%' with grant option; diff --git a/src/test/resources/dialect/mysql/input/select_statement.sql b/src/test/resources/dialect/mysql/input/select_statement.sql index 677b887..86f487a 100644 --- a/src/test/resources/dialect/mysql/input/select_statement.sql +++ b/src/test/resources/dialect/mysql/input/select_statement.sql @@ -28,12 +28,12 @@ limit 4 offset 3 LOCK IN SHARE MODE; -- hello -select a.id, b.id +select a.Id, B.Id from hello.tb1 as a - straight_join hello.tb1_1 as b + straight_join hello.tb1_1 as B for update nowait; select * -from sakila.actor lock in share mode; \ No newline at end of file +from Sakila.actor lock in share mode; -- Gitee