From 6528f441068155eb42c18ea3374187a278eb6858 Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 17 Jun 2022 13:16:54 +0800 Subject: [PATCH 1/2] fix: index for global index options #4833 --- .../druid/sql/ast/SQLIndexOptions.java | 21 +++++++ .../druid/sql/parser/SQLExprParser.java | 11 ++++ .../sql/visitor/SQLASTOutputVisitor.java | 5 ++ ...OceanbaseCreateTableTest_Index_Global.java | 63 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseCreateTableTest_Index_Global.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java b/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java index b0afbeaed8..c57e26bd1c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLIndexOptions.java @@ -21,6 +21,8 @@ public class SQLIndexOptions extends SQLObjectImpl { private String lock; private boolean invisible; private boolean visible; + private boolean global; + private boolean local; private List otherOptions = new ArrayList(); public SQLIndexOptions() { @@ -38,6 +40,22 @@ public class SQLIndexOptions extends SQLObjectImpl { return keyBlockSize; } + public boolean isGlobal() { + return global; + } + + public void setGlobal(boolean global) { + this.global = global; + } + + public boolean isLocal() { + return local; + } + + public void setLocal(boolean local) { + this.local = local; + } + public void setKeyBlockSize(SQLExpr keyBlockSize) { if (keyBlockSize != null) { if (getParent() != null && getParent().getParent() != null) { @@ -176,5 +194,8 @@ public class SQLIndexOptions extends SQLObjectImpl { } options.invisible = invisible; + + options.global = global; + options.local = local; } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index ddbb5224ce..4e06cf04b1 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -5429,6 +5429,14 @@ public class SQLExprParser extends SQLParser { lexer.identifierEquals("VISIBLE")) { lexer.nextToken(); indexDefinition.getOptions().setVisible(true); + } else if ((DbType.mysql == dbType) && + lexer.identifierEquals("GLOBAL")) { + lexer.nextToken(); + indexDefinition.getOptions().setGlobal(true); + } else if ((DbType.mysql == dbType) && + lexer.identifierEquals("LOCAL")) { + lexer.nextToken(); + indexDefinition.getOptions().setLocal(true); } else if ((DbType.mysql == dbType) && lexer.token == Token.HINT && lexer.stringVal().trim().equals("!80000 INVISIBLE")) { lexer.nextToken(); @@ -5536,6 +5544,9 @@ public class SQLExprParser extends SQLParser { } else if (lexer.identifierEquals(FnvHash.Constants.TBPARTITIONS)) { lexer.nextToken(); indexDefinition.setTbPartitions(primary()); + //} else if (lexer.identifierEquals(FnvHash.Constants.GLOBAL)) { + // lexer.nextToken(); + // indexDefinition.setGlobal(true); } else { break _opts; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 663adb37fe..79d1c8f970 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -6109,6 +6109,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print0(using); } */ + if (x.isGlobal()) { + print0(ucase ? " GLOBAL" : " global"); + } else if (x.isVisible()) { + print0(ucase ? " LOCAL" : " local"); + } if (x.isInvisible()) { print0(ucase ? " INVISIBLE" : " invisible"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseCreateTableTest_Index_Global.java b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseCreateTableTest_Index_Global.java new file mode 100644 index 0000000000..7d128e4bf6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oceanbase/OceanbaseCreateTableTest_Index_Global.java @@ -0,0 +1,63 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oceanbase; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OceanbaseCreateTableTest_Index_Global extends MysqlTest { + public void test_0() throws Exception { + String sql = "CREATE TABLE `test_01` (\n" + + " `id` varchar(16) NOT NULL,\n" + + " `name` varchar(128) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `idx_name` (`name`) BLOCK_SIZE 16384 GLOBAL\n" + + ") DEFAULT CHARSET = utf8mb4;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); + SQLStatement stmt = stmtList.get(0); + + { + String result = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("CREATE TABLE `test_01` (\n" + + "\t`id` varchar(16) NOT NULL,\n" + + "\t`name` varchar(128) DEFAULT NULL,\n" + + "\tPRIMARY KEY (`id`),\n" + + "\tKEY `idx_name` (`name`) GLOBAL KEY_BLOCK_SIZE = 16384\n" + + ") CHARSET = utf8mb4;", + result); + } + { + String result = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + Assert.assertEquals("create table `test_01` (\n" + + "\t`id` varchar(16) not null,\n" + + "\t`name` varchar(128) default null,\n" + + "\tprimary key (`id`),\n" + + "\tkey `idx_name` (`name`) global key_block_size = 16384\n" + + ") charset = utf8mb4;", + result); + } + + Assert.assertEquals(1, stmtList.size()); + } +} From 665586dcd2c9a9f5cc54108d2a56a86fd38052b6 Mon Sep 17 00:00:00 2001 From: steven Date: Sun, 19 Jun 2022 13:28:24 +0800 Subject: [PATCH 2/2] fix: keyword error --- .../java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 79d1c8f970..d70abbac6b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -6111,7 +6111,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet */ if (x.isGlobal()) { print0(ucase ? " GLOBAL" : " global"); - } else if (x.isVisible()) { + } else if (x.isLocal()) { print0(ucase ? " LOCAL" : " local"); }