diff --git a/README.md b/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b688951cbe2db235c1b99ed3e0a4de45f4a3e166 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 dc1462363590ff0ebfd6194ddea6c5422d225137..61ebe9f06eb34802846de8303cc602f1518e4c79 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 fb783e46b65c53587bebcc49cfe6b8da5dff58b9..a062e863a9286939f49bd99ec5ac1c20e9c9b22a 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 7b81bc971aded046c63b96652424c87f62224521..0290e2856e89d5678bbccab222fbf9f237a096b0 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 5be77236f2550390a36ea07a2c36e6a785f2569f..62ea2b40fd1d4c3e8fa7d919df4d335fe0bdd397 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 289ece1e5b3dc0703c833ac93ea08c6237583e06..a7d063b2d555ba8542f66c6866f52ea8d9cbc466 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 91a871348df77277a3b0bd076f40da127636ff63..7667b45ad4553b12595ed22f2b16c16526e76850 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 5be77236f2550390a36ea07a2c36e6a785f2569f..747872ece8d84a01174297d7440299e388854f7c 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 642ca8696d045807f8efd6dba82a77851b29aca4..82ed2d815f372c609bc4eb6d9a37edae02d2e146 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