From c8fc9788c1141a5d7397bf56c6798a403ababc74 Mon Sep 17 00:00:00 2001 From: zql <2423913387@qq.com> Date: Fri, 14 Jun 2024 10:36:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0sqlserver=E5=88=B0openGauss?= =?UTF-8?q?=E4=B8=8E=E7=B4=A2=E5=BC=95=E7=9B=B8=E5=85=B3=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E7=9A=84=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++ .../mysql/MySqlToOpenGaussOutputVisitor.java | 13 +++--- .../SQLServerToOpenGaussOutputVisitor.java | 45 +++++++++++++++++++ .../sqltranslator/SqlTranslateTest.java | 10 +++-- .../mysql/input/createIndex_statement.sql | 2 +- .../expect/createIndex_statement.sql | 7 ++- .../sqlserver/expect/dropIndex_statement.sql | 12 ++--- .../sqlserver/input/createIndex_statement.sql | 8 ++-- .../sqlserver/input/dropIndex_statement.sql | 8 ++-- 9 files changed, 82 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index e69de29..b688951 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,10 @@ +### [CREATE INDEX Statement](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver16) + +> 1. openGauss不支持clustered | nonclustered索引,针对clustered字段直接报错,针对nonclustered用空字符串代替 +> 2. Druid不支持解析sqlserver的INCLUDE、WHERE、WITH、FILESTREAM_ON、ON字段 +> 3. sqlserver不支持using指定索引数据结构 + +### [DROP INDEX Statement](https://learn.microsoft.com/en-us/sql/t-sql/statements/drop-index-transact-sql?view=sql-server-ver16) + +> 1. openGauss不支持指定tbl_name +> 2. Druid不支持解析sqlserver的with字段 \ No newline at end of file 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 dc14623..61ebe9f 100644 --- a/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java +++ b/src/main/java/org/opengauss/sqltranslator/dialect/mysql/MySqlToOpenGaussOutputVisitor.java @@ -2593,12 +2593,13 @@ public class MySqlToOpenGaussOutputVisitor extends MySqlOutputVisitor { if (type != null) { if (type.toLowerCase().equals("unique")) { printUcase("unique"); - } else if (type.toLowerCase().equals("spatial")) { - printUcaseNotSupportWord("spatial"); - gaussFeatureNotSupportLog("spatial index" + getTypeAttribute(x)); - } else if (type.toLowerCase().equals("fulltext")) { - printUcaseNotSupportWord("fulltext"); - gaussFeatureNotSupportLog("fulltext index" + getTypeAttribute(x)); + } else if (type.toLowerCase().equals("nonclustered")) { + // openGauss不支持nonclustered关键字,但是不加任何修饰的创建的索引就是非聚集索引,所以这里用空串替换掉 + printUcase(""); + } else if (type.toLowerCase().equals("clustered")) { + // openGauss不支持指定clustered关键字 + printUcaseNotSupportWord("clustered"); + gaussFeatureNotSupportLog("clustered index" + getTypeAttribute(x)); } else { printUcaseNotSupportWord(type); logger.warn("unrecognized keyword " + type + getTypeAttribute(x)); diff --git a/src/main/java/org/opengauss/sqltranslator/dialect/sqlserver/SQLServerToOpenGaussOutputVisitor.java b/src/main/java/org/opengauss/sqltranslator/dialect/sqlserver/SQLServerToOpenGaussOutputVisitor.java index fb783e4..a062e86 100644 --- a/src/main/java/org/opengauss/sqltranslator/dialect/sqlserver/SQLServerToOpenGaussOutputVisitor.java +++ b/src/main/java/org/opengauss/sqltranslator/dialect/sqlserver/SQLServerToOpenGaussOutputVisitor.java @@ -320,4 +320,49 @@ public class SQLServerToOpenGaussOutputVisitor extends SQLServerOutputVisitor{ } return false; } + + @Override + public boolean visit(SQLCreateIndexStatement x) { + printUcase("create "); + String type = x.getType(); + if (type != null) { + if (type.toLowerCase().equals("unique")) { + printUcase("unique"); + } else if (type.toLowerCase().equals("nonclustered")) { + // openGauss不支持nonclustered关键字,但是不加任何修饰的创建的索引就是非聚集索引,所以这里用空串替换掉 + this.print0(""); + } else if (type.toLowerCase().equals("clustered")) { + // openGauss不支持指定clustered关键字创建聚集索引 + printUcaseNotSupportWord("clustered"); + gaussFeatureNotSupportLog("clustered index" + getTypeAttribute(x)); + } else { + printUcaseNotSupportWord(type); + logger.warn("unrecognized keyword " + type + getTypeAttribute(x)); + } + this.print(' '); + } + printUcase("index "); + x.getName().accept(this); + printUcase(" on "); + x.getTable().accept(this); + this.print0(" ("); + this.printAndAccept(x.getItems(), ", "); + this.print(')'); + return false; + } + + @Override + public boolean visit(SQLDropIndexStatement x) { + printUcase("drop index "); + gaussFeatureNotSupportLog("specifying table name" + " ," + getTypeAttribute(x)); + if (x.isIfExists()) { + printUcase("if exists "); + } + + x.getIndexName().accept(this); + + return false; + } + + } diff --git a/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java b/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java index 7b81bc9..0290e28 100644 --- a/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java +++ b/src/test/java/org/opengauss/sqltranslator/SqlTranslateTest.java @@ -7,6 +7,8 @@ import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; import com.alibaba.druid.sql.parser.ParserException; + +import java.util.Arrays; import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -122,7 +124,8 @@ public class SqlTranslateTest { @Test public void test_createDatabase() throws IOException { - String[] sqlContents = execFile("createDatabase_statement.sql"); + String[] sqlContents = execFile1("createDatabase_statement.sql"); + System.out.println(Arrays.toString(sqlContents)); assertEquals(sqlContents[1], sqlContents[2]); } @@ -250,13 +253,14 @@ public class SqlTranslateTest { @Test public void test_createIndex() throws IOException { - String[] sqlContents = execFile("createIndex_statement.sql"); + String[] sqlContents = execFile1("createIndex_statement.sql"); + System.out.println(Arrays.toString(sqlContents)); assertEquals(sqlContents[1], sqlContents[2]); } @Test public void test_dropIndex() throws IOException { - String[] sqlContents = execFile("dropIndex_statement.sql"); + String[] sqlContents = execFile1("dropIndex_statement.sql"); assertEquals(sqlContents[1], sqlContents[2]); } diff --git a/src/test/resources/dialect/mysql/input/createIndex_statement.sql b/src/test/resources/dialect/mysql/input/createIndex_statement.sql index 5be7723..62ea2b4 100644 --- a/src/test/resources/dialect/mysql/input/createIndex_statement.sql +++ b/src/test/resources/dialect/mysql/input/createIndex_statement.sql @@ -1,4 +1,4 @@ -create unique index i1 using btree on t9(col1,col2,col3) ; +create unique index i1 using btree on t9(col1,col2,col3); create index i2 on t10(col2(10)ASC) using hash comment 'i2' algorithm = inplace lock = default ; create index i3 on t10(col2(10)DESC)using btree algorithm = inplace; diff --git a/src/test/resources/dialect/sqlserver/expect/createIndex_statement.sql b/src/test/resources/dialect/sqlserver/expect/createIndex_statement.sql index 289ece1..a7d063b 100644 --- a/src/test/resources/dialect/sqlserver/expect/createIndex_statement.sql +++ b/src/test/resources/dialect/sqlserver/expect/createIndex_statement.sql @@ -1,4 +1,3 @@ -CREATE UNIQUE INDEX i1 ON t9 USING BTREE (col1, col2, col3); --- err -CREATE INDEX CONCURRENTLY i3 ON t10 USING BTREE (col2 DESC); -CREATE INDEX CONCURRENTLY i4 ON t10 (col2); \ No newline at end of file +CREATE INDEX index_name ON table_name (column_name DESC); +CREATE INDEX index_name ON table_name (column_name); +CREATE UNIQUE INDEX index_name ON table_name (column_name); \ No newline at end of file diff --git a/src/test/resources/dialect/sqlserver/expect/dropIndex_statement.sql b/src/test/resources/dialect/sqlserver/expect/dropIndex_statement.sql index 91a8713..7667b45 100644 --- a/src/test/resources/dialect/sqlserver/expect/dropIndex_statement.sql +++ b/src/test/resources/dialect/sqlserver/expect/dropIndex_statement.sql @@ -1,9 +1,3 @@ -DROP INDEX CONCURRENTLY i5; -DROP INDEX CONCURRENTLY i5; -DROP INDEX testDropIndex_pkey; -DROP INDEX --- ALGORITHM NULL -i5; -DROP INDEX --- ALGORITHM COPY -i5; \ No newline at end of file +DROP INDEX i5; +DROP INDEX IF EXISTS i5; +DROP INDEX dbo.Employees.IX_Employees; \ No newline at end of file diff --git a/src/test/resources/dialect/sqlserver/input/createIndex_statement.sql b/src/test/resources/dialect/sqlserver/input/createIndex_statement.sql index 5be7723..747872e 100644 --- a/src/test/resources/dialect/sqlserver/input/createIndex_statement.sql +++ b/src/test/resources/dialect/sqlserver/input/createIndex_statement.sql @@ -1,5 +1,3 @@ -create unique index i1 using btree on t9(col1,col2,col3) ; -create index i2 on t10(col2(10)ASC) using hash comment 'i2' algorithm = inplace lock = default ; - -create index i3 on t10(col2(10)DESC)using btree algorithm = inplace; -create index i4 on t10(col2) lock = none; \ No newline at end of file +CREATE NONCLUSTERED INDEX index_name ON table_name (column_name DESC); +CREATE INDEX index_name ON table_name (column_name); +CREATE UNIQUE INDEX index_name ON table_name (column_name); \ No newline at end of file diff --git a/src/test/resources/dialect/sqlserver/input/dropIndex_statement.sql b/src/test/resources/dialect/sqlserver/input/dropIndex_statement.sql index 642ca86..82ed2d8 100644 --- a/src/test/resources/dialect/sqlserver/input/dropIndex_statement.sql +++ b/src/test/resources/dialect/sqlserver/input/dropIndex_statement.sql @@ -1,5 +1,3 @@ -drop index i5 on testDropIndex algorithm = INPLACE lock = default; -drop index i5 on testDropIndex lock = none; -drop index `PRIMARY` on testDropIndex; -drop index i5 on testDropIndex algorithm = default lock = default; -drop index i5 on testDropIndex algorithm = COPY lock = shared; \ No newline at end of file +drop index i5 on testDropIndex; +drop index if exists i5 on testDropIndex; +drop index dbo.Employees.IX_Employees; \ No newline at end of file -- Gitee