From cc8af7fcffefa842a271b18098b275b2ae2b1008 Mon Sep 17 00:00:00 2001 From: yh263208 Date: Mon, 3 Jun 2024 21:34:10 +0800 Subject: [PATCH] load table detail is too slow --- libs/db-browser/pom.xml | 10 +++ .../tools/dbbrowser/parser/CacheElement.java | 46 ++++++++++++ .../tools/dbbrowser/parser/PLParser.java | 53 ++++++++++++++ .../tools/dbbrowser/parser/SqlParser.java | 73 +++++++++++++++++++ .../schema/doris/DorisSchemaAccessor.java | 32 ++++---- .../MySQLNoLessThan5700SchemaAccessor.java | 31 ++++---- .../schema/mysql/OBMySQLSchemaAccessor.java | 17 +++-- .../schema/oracle/OBOracleSchemaAccessor.java | 17 +++-- .../parser/OBMySQLGetDBTableByParser.java | 11 +-- .../oboracle/OBOracleTableExtension.java | 1 + .../parser/OBOracleGetDBTableByParser.java | 24 +++--- 11 files changed, 253 insertions(+), 62 deletions(-) create mode 100644 libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/CacheElement.java diff --git a/libs/db-browser/pom.xml b/libs/db-browser/pom.xml index 1cb33a75d5..f87790ad24 100644 --- a/libs/db-browser/pom.xml +++ b/libs/db-browser/pom.xml @@ -98,6 +98,7 @@ 2.2.1 3.0 21.1.0.0 + 2.8.0 @@ -201,6 +202,11 @@ ojdbc8 ${oracle.jdbc.version} + + com.github.ben-manes.caffeine + caffeine + ${caffeine.version} + mysql mysql-connector-java @@ -307,6 +313,10 @@ com.oracle.database.jdbc ojdbc8 + + com.github.ben-manes.caffeine + caffeine + diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/CacheElement.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/CacheElement.java new file mode 100644 index 0000000000..a99efcd38b --- /dev/null +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/CacheElement.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 OceanBase. + * + * 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.oceanbase.tools.dbbrowser.parser; + +import lombok.NonNull; + +class CacheElement { + + private final T value; + private final Exception exception; + + public CacheElement(@NonNull T value) { + this.exception = null; + this.value = value; + } + + public CacheElement(@NonNull Exception exception) { + this.value = null; + this.exception = exception; + } + + public T get() { + if (this.exception != null) { + if (this.exception instanceof RuntimeException) { + throw (RuntimeException) this.exception; + } else { + throw new RuntimeException(this.exception); + } + } + return this.value; + } + +} diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/PLParser.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/PLParser.java index 3d26ea5dde..bc1f9f10fe 100644 --- a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/PLParser.java +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/PLParser.java @@ -15,12 +15,16 @@ */ package com.oceanbase.tools.dbbrowser.parser; +import java.util.concurrent.TimeUnit; + import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeWalker; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import com.oceanbase.tools.dbbrowser.parser.listener.LogErrorListener; import com.oceanbase.tools.dbbrowser.parser.listener.MysqlModePLParserListener; import com.oceanbase.tools.dbbrowser.parser.listener.OracleModePLParserListener; @@ -46,11 +50,38 @@ @Slf4j public class PLParser { + private final static Cache> OB_MYSQL_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + private final static Cache> OB_ORACLE_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + private final static Cache> ORACLE_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + public static ParseMysqlPLResult parseObMysql(final String pl) { return parseObMysql(pl, 0); } public static ParseMysqlPLResult parseObMysql(final String pl, long timeoutMillis) { + CacheElement value = OB_MYSQL_PARSE_CACHE.get(pl, s -> { + try { + return new CacheElement<>(doParseObMysql(pl, timeoutMillis)); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + + private static ParseMysqlPLResult doParseObMysql(final String pl, long timeoutMillis) { long startTime = System.currentTimeMillis(); CharStream input = CharStreams.fromString(pl); // Lexer-Lexical analysis @@ -89,6 +120,17 @@ public static ParseOraclePLResult parseObOracle(final String pl) { } public static ParseOraclePLResult parseObOracle(final String pl, long timeoutMillis) { + CacheElement value = OB_ORACLE_PARSE_CACHE.get(pl, s -> { + try { + return new CacheElement<>(doParseObOracle(pl, timeoutMillis)); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + + private static ParseOraclePLResult doParseObOracle(final String pl, long timeoutMillis) { long startTime = System.currentTimeMillis(); ParseOraclePLResult result = parseByRule(pl, com.oceanbase.tools.sqlparser.oboracle.PLParser.RULE_pl_entry_stmt_list, timeoutMillis); @@ -137,6 +179,17 @@ public static ParseOraclePLResult parseOracle(final String pl) { } public static ParseOraclePLResult parseOracle(final String pl, long timeoutMillis) { + CacheElement value = ORACLE_PARSE_CACHE.get(pl, s -> { + try { + return new CacheElement<>(doParseOracle(pl, timeoutMillis)); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + + private static ParseOraclePLResult doParseOracle(final String pl, long timeoutMillis) { CharStream input = CharStreams.fromString(pl); CaseChangingCharStream caseChangingCharStream = new CaseChangingCharStream(input, true); PlSqlLexer lexer = new PlSqlLexer(caseChangingCharStream); diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/SqlParser.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/SqlParser.java index 1ce5e31fc0..57ddb96114 100644 --- a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/SqlParser.java +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/parser/SqlParser.java @@ -15,18 +15,26 @@ */ package com.oceanbase.tools.dbbrowser.parser; +import java.io.StringReader; +import java.util.concurrent.TimeUnit; + import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeWalker; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import com.oceanbase.tools.dbbrowser.parser.listener.CustomErrorListener; import com.oceanbase.tools.dbbrowser.parser.listener.MysqlModeSqlParserListener; import com.oceanbase.tools.dbbrowser.parser.listener.OracleModeSqlParserListener; import com.oceanbase.tools.dbbrowser.parser.result.ParseSqlResult; +import com.oceanbase.tools.sqlparser.OBMySQLParser; +import com.oceanbase.tools.sqlparser.OBOracleSQLParser; import com.oceanbase.tools.sqlparser.obmysql.OBLexer; import com.oceanbase.tools.sqlparser.obmysql.OBParser; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.util.TimeoutTokenStream; import lombok.NonNull; @@ -40,11 +48,65 @@ @Slf4j public class SqlParser { + private final static Cache> OB_MYSQL_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + private final static Cache> OB_ORACLE_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + private final static Cache> OB_MYSQL_STMT_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + private final static Cache> OB_ORACLE_STMT_PARSE_CACHE = + Caffeine.newBuilder() + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES) + .build(); + + public static Statement parseMysqlStatement(@NonNull String sql) { + CacheElement value = OB_MYSQL_STMT_PARSE_CACHE.get(sql, s -> { + try { + return new CacheElement<>(new OBMySQLParser().parse(new StringReader(sql))); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + + public static Statement parseOracleStatement(@NonNull String sql) { + CacheElement value = OB_ORACLE_STMT_PARSE_CACHE.get(sql, s -> { + try { + return new CacheElement<>(new OBOracleSQLParser().parse(new StringReader(sql))); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + public static ParseSqlResult parseMysql(final String sql) { return parseMysql(sql, 0); } public static ParseSqlResult parseMysql(final String sql, long timeoutMillis) { + CacheElement value = OB_MYSQL_PARSE_CACHE.get(sql, s -> { + try { + return new CacheElement<>(doParseMysql(sql, timeoutMillis)); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + + private static ParseSqlResult doParseMysql(final String sql, long timeoutMillis) { long startTime = System.currentTimeMillis(); CharStream input = CharStreams.fromString(sql); // Lexer-Lexical analysis @@ -79,6 +141,17 @@ public static ParseSqlResult parseOracle(final String sql) { } public static ParseSqlResult parseOracle(final String sql, long timeoutMillis) { + CacheElement value = OB_ORACLE_PARSE_CACHE.get(sql, s -> { + try { + return new CacheElement<>(doParseOracle(sql, timeoutMillis)); + } catch (Exception e) { + return new CacheElement<>(e); + } + }); + return value == null ? null : value.get(); + } + + private static ParseSqlResult doParseOracle(final String sql, long timeoutMillis) { long startTime = System.currentTimeMillis(); CharStream input = CharStreams.fromString(sql); // Lexer-Lexical analysis diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/doris/DorisSchemaAccessor.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/doris/DorisSchemaAccessor.java index d0eb9bd7f5..1063063496 100644 --- a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/doris/DorisSchemaAccessor.java +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/doris/DorisSchemaAccessor.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; -import java.io.StringReader; import java.io.StringWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -81,6 +80,7 @@ import com.oceanbase.tools.dbbrowser.model.DBView; import com.oceanbase.tools.dbbrowser.model.MySQLConstants; import com.oceanbase.tools.dbbrowser.parser.PLParser; +import com.oceanbase.tools.dbbrowser.parser.SqlParser; import com.oceanbase.tools.dbbrowser.parser.result.ParseMysqlPLResult; import com.oceanbase.tools.dbbrowser.schema.DBSchemaAccessor; import com.oceanbase.tools.dbbrowser.schema.DBSchemaAccessorSqlMapper; @@ -91,8 +91,7 @@ import com.oceanbase.tools.dbbrowser.util.MySQLSqlBuilder; import com.oceanbase.tools.dbbrowser.util.SqlBuilder; import com.oceanbase.tools.dbbrowser.util.StringUtils; -import com.oceanbase.tools.sqlparser.OBMySQLParser; -import com.oceanbase.tools.sqlparser.SQLParser; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.statement.createtable.CreateTable; import com.oceanbase.tools.sqlparser.statement.createtable.TableOptions; @@ -1040,19 +1039,20 @@ private void obtainOptionsByQuery(String schemaName, String tableName, DBTable.D } private void obtainOptionsByParser(DBTable.DBTableOptions dbTableOptions, String ddl) { - SQLParser sqlParser = new OBMySQLParser(); - CreateTable stmt = (CreateTable) sqlParser.parse(new StringReader(ddl)); - TableOptions options = stmt.getTableOptions(); - if (Objects.nonNull(options)) { - dbTableOptions.setCharsetName(options.getCharset()); - dbTableOptions.setRowFormat(options.getRowFormat()); - dbTableOptions.setCompressionOption(options.getCompression()); - dbTableOptions.setReplicaNum(options.getReplicaNum()); - dbTableOptions.setBlockSize(options.getBlockSize()); - dbTableOptions.setUseBloomFilter(options.getUseBloomFilter()); - dbTableOptions - .setTabletSize( - Objects.nonNull(options.getTabletSize()) ? options.getTabletSize().longValue() : null); + Statement statement = SqlParser.parseMysqlStatement(ddl); + if (statement instanceof CreateTable) { + CreateTable stmt = (CreateTable) statement; + TableOptions options = stmt.getTableOptions(); + if (Objects.nonNull(options)) { + dbTableOptions.setCharsetName(options.getCharset()); + dbTableOptions.setRowFormat(options.getRowFormat()); + dbTableOptions.setCompressionOption(options.getCompression()); + dbTableOptions.setReplicaNum(options.getReplicaNum()); + dbTableOptions.setBlockSize(options.getBlockSize()); + dbTableOptions.setUseBloomFilter(options.getUseBloomFilter()); + dbTableOptions.setTabletSize( + Objects.nonNull(options.getTabletSize()) ? options.getTabletSize().longValue() : null); + } } } diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/MySQLNoLessThan5700SchemaAccessor.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/MySQLNoLessThan5700SchemaAccessor.java index 80baf8c4d0..7c0792e6e8 100644 --- a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/MySQLNoLessThan5700SchemaAccessor.java +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/MySQLNoLessThan5700SchemaAccessor.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; -import java.io.StringReader; import java.io.StringWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -84,6 +83,7 @@ import com.oceanbase.tools.dbbrowser.model.DBView; import com.oceanbase.tools.dbbrowser.model.MySQLConstants; import com.oceanbase.tools.dbbrowser.parser.PLParser; +import com.oceanbase.tools.dbbrowser.parser.SqlParser; import com.oceanbase.tools.dbbrowser.parser.result.ParseMysqlPLResult; import com.oceanbase.tools.dbbrowser.schema.DBSchemaAccessor; import com.oceanbase.tools.dbbrowser.schema.DBSchemaAccessorSqlMapper; @@ -94,8 +94,7 @@ import com.oceanbase.tools.dbbrowser.util.MySQLSqlBuilder; import com.oceanbase.tools.dbbrowser.util.SqlBuilder; import com.oceanbase.tools.dbbrowser.util.StringUtils; -import com.oceanbase.tools.sqlparser.OBMySQLParser; -import com.oceanbase.tools.sqlparser.SQLParser; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.statement.createtable.CreateTable; import com.oceanbase.tools.sqlparser.statement.createtable.TableOptions; @@ -1097,18 +1096,20 @@ private void obtainOptionsByQuery(String schemaName, String tableName, DBTableOp } private void obtainOptionsByParser(DBTableOptions dbTableOptions, String ddl) { - SQLParser sqlParser = new OBMySQLParser(); - CreateTable stmt = (CreateTable) sqlParser.parse(new StringReader(ddl)); - TableOptions options = stmt.getTableOptions(); - if (Objects.nonNull(options)) { - dbTableOptions.setCharsetName(options.getCharset()); - dbTableOptions.setRowFormat(options.getRowFormat()); - dbTableOptions.setCompressionOption(options.getCompression()); - dbTableOptions.setReplicaNum(options.getReplicaNum()); - dbTableOptions.setBlockSize(options.getBlockSize()); - dbTableOptions.setUseBloomFilter(options.getUseBloomFilter()); - dbTableOptions.setTabletSize( - Objects.nonNull(options.getTabletSize()) ? options.getTabletSize().longValue() : null); + Statement statement = SqlParser.parseMysqlStatement(ddl); + if (statement instanceof CreateTable) { + CreateTable stmt = (CreateTable) statement; + TableOptions options = stmt.getTableOptions(); + if (Objects.nonNull(options)) { + dbTableOptions.setCharsetName(options.getCharset()); + dbTableOptions.setRowFormat(options.getRowFormat()); + dbTableOptions.setCompressionOption(options.getCompression()); + dbTableOptions.setReplicaNum(options.getReplicaNum()); + dbTableOptions.setBlockSize(options.getBlockSize()); + dbTableOptions.setUseBloomFilter(options.getUseBloomFilter()); + dbTableOptions.setTabletSize( + Objects.nonNull(options.getTabletSize()) ? options.getTabletSize().longValue() : null); + } } } diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/OBMySQLSchemaAccessor.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/OBMySQLSchemaAccessor.java index 9ce8db3ee0..cf7c41bef9 100644 --- a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/OBMySQLSchemaAccessor.java +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/mysql/OBMySQLSchemaAccessor.java @@ -15,7 +15,6 @@ */ package com.oceanbase.tools.dbbrowser.schema.mysql; -import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -46,8 +45,7 @@ import com.oceanbase.tools.dbbrowser.util.DBSchemaAccessorUtil; import com.oceanbase.tools.dbbrowser.util.MySQLSqlBuilder; import com.oceanbase.tools.dbbrowser.util.StringUtils; -import com.oceanbase.tools.sqlparser.OBMySQLParser; -import com.oceanbase.tools.sqlparser.SQLParser; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.statement.createtable.CreateTable; import lombok.NonNull; @@ -245,11 +243,14 @@ public List listTableColumnGroups(String schemaName, Strin } private List listTableColumnGroups(String ddl) { - SQLParser sqlParser = new OBMySQLParser(); - CreateTable stmt = (CreateTable) sqlParser.parse(new StringReader(ddl)); - return stmt.getColumnGroupElements() == null ? Collections.emptyList() - : stmt.getColumnGroupElements().stream() - .map(DBColumnGroupElement::ofColumnGroupElement).collect(Collectors.toList()); + Statement statement = SqlParser.parseMysqlStatement(ddl); + if (statement instanceof CreateTable) { + CreateTable stmt = (CreateTable) statement; + return stmt.getColumnGroupElements() == null ? Collections.emptyList() + : stmt.getColumnGroupElements().stream() + .map(DBColumnGroupElement::ofColumnGroupElement).collect(Collectors.toList()); + } + return Collections.emptyList(); } @Override diff --git a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/oracle/OBOracleSchemaAccessor.java b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/oracle/OBOracleSchemaAccessor.java index a048155a07..8d57ebd5f0 100644 --- a/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/oracle/OBOracleSchemaAccessor.java +++ b/libs/db-browser/src/main/java/com/oceanbase/tools/dbbrowser/schema/oracle/OBOracleSchemaAccessor.java @@ -15,7 +15,6 @@ */ package com.oceanbase.tools.dbbrowser.schema.oracle; -import java.io.StringReader; import java.sql.ResultSetMetaData; import java.sql.Timestamp; import java.util.ArrayList; @@ -79,8 +78,7 @@ import com.oceanbase.tools.dbbrowser.util.PLObjectErrMsgUtils; import com.oceanbase.tools.dbbrowser.util.SqlBuilder; import com.oceanbase.tools.dbbrowser.util.StringUtils; -import com.oceanbase.tools.sqlparser.OBOracleSQLParser; -import com.oceanbase.tools.sqlparser.SQLParser; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.statement.createtable.CreateTable; import lombok.NonNull; @@ -446,11 +444,14 @@ public List listTableColumnGroups(String schemaName, Strin } private List listTableColumnGroups(String ddl) { - SQLParser sqlParser = new OBOracleSQLParser(); - CreateTable stmt = (CreateTable) sqlParser.parse(new StringReader(ddl)); - return stmt.getColumnGroupElements() == null ? Collections.emptyList() - : stmt.getColumnGroupElements().stream() - .map(DBColumnGroupElement::ofColumnGroupElement).collect(Collectors.toList()); + Statement statement = SqlParser.parseOracleStatement(ddl); + if (statement instanceof CreateTable) { + CreateTable stmt = (CreateTable) statement; + return stmt.getColumnGroupElements() == null ? Collections.emptyList() + : stmt.getColumnGroupElements().stream() + .map(DBColumnGroupElement::ofColumnGroupElement).collect(Collectors.toList()); + } + return Collections.emptyList(); } @Override diff --git a/server/plugins/schema-plugin-ob-mysql/src/main/java/com/oceanbase/odc/plugin/schema/obmysql/parser/OBMySQLGetDBTableByParser.java b/server/plugins/schema-plugin-ob-mysql/src/main/java/com/oceanbase/odc/plugin/schema/obmysql/parser/OBMySQLGetDBTableByParser.java index c0d1ac8260..d5fe07f718 100644 --- a/server/plugins/schema-plugin-ob-mysql/src/main/java/com/oceanbase/odc/plugin/schema/obmysql/parser/OBMySQLGetDBTableByParser.java +++ b/server/plugins/schema-plugin-ob-mysql/src/main/java/com/oceanbase/odc/plugin/schema/obmysql/parser/OBMySQLGetDBTableByParser.java @@ -15,7 +15,6 @@ */ package com.oceanbase.odc.plugin.schema.obmysql.parser; -import java.io.StringReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -33,9 +32,9 @@ import com.oceanbase.tools.dbbrowser.model.DBTablePartitionDefinition; import com.oceanbase.tools.dbbrowser.model.DBTablePartitionOption; import com.oceanbase.tools.dbbrowser.model.DBTablePartitionType; -import com.oceanbase.tools.sqlparser.OBMySQLParser; -import com.oceanbase.tools.sqlparser.SQLParser; +import com.oceanbase.tools.dbbrowser.parser.SqlParser; import com.oceanbase.tools.sqlparser.statement.Expression; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.statement.createtable.ColumnDefinition; import com.oceanbase.tools.sqlparser.statement.createtable.CreateTable; import com.oceanbase.tools.sqlparser.statement.createtable.HashPartition; @@ -77,8 +76,10 @@ public OBMySQLGetDBTableByParser(@NonNull String tableDDL) { private CreateTable parseTableDDL(String ddl) { CreateTable statement = null; try { - SQLParser sqlParser = new OBMySQLParser(); - statement = (CreateTable) sqlParser.parse(new StringReader(ddl)); + Statement value = SqlParser.parseMysqlStatement(ddl); + if (value instanceof CreateTable) { + statement = (CreateTable) value; + } } catch (Exception e) { log.warn("Failed to parse table ddl, error message={}", e.getMessage()); } diff --git a/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/OBOracleTableExtension.java b/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/OBOracleTableExtension.java index b873dc0abf..d95ad35fc5 100644 --- a/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/OBOracleTableExtension.java +++ b/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/OBOracleTableExtension.java @@ -50,6 +50,7 @@ */ @Extension public class OBOracleTableExtension extends OBMySQLTableExtension { + private static final String ORACLE_TABLE_COMMENT_DDL_TEMPLATE = "COMMENT ON TABLE ${schemaName}.${tableName} IS ${comment}"; private static final String ORACLE_COLUMN_COMMENT_DDL_TEMPLATE = diff --git a/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/parser/OBOracleGetDBTableByParser.java b/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/parser/OBOracleGetDBTableByParser.java index 48584898c3..0d071d25ba 100644 --- a/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/parser/OBOracleGetDBTableByParser.java +++ b/server/plugins/schema-plugin-ob-oracle/src/main/java/com/oceanbase/odc/plugin/schema/oboracle/parser/OBOracleGetDBTableByParser.java @@ -41,10 +41,12 @@ import com.oceanbase.tools.dbbrowser.model.DBTablePartitionDefinition; import com.oceanbase.tools.dbbrowser.model.DBTablePartitionOption; import com.oceanbase.tools.dbbrowser.model.DBTablePartitionType; +import com.oceanbase.tools.dbbrowser.parser.SqlParser; import com.oceanbase.tools.dbbrowser.util.OracleSqlBuilder; import com.oceanbase.tools.sqlparser.OBOracleSQLParser; import com.oceanbase.tools.sqlparser.SQLParser; import com.oceanbase.tools.sqlparser.statement.Expression; +import com.oceanbase.tools.sqlparser.statement.Statement; import com.oceanbase.tools.sqlparser.statement.createindex.CreateIndex; import com.oceanbase.tools.sqlparser.statement.createtable.ColumnDefinition; import com.oceanbase.tools.sqlparser.statement.createtable.CreateTable; @@ -95,17 +97,19 @@ public OBOracleGetDBTableByParser(@NonNull Connection connection, @NonNull Strin private CreateTable parseTableDDL(@NonNull String schemaName, @NonNull String tableName) { CreateTable statement = null; - OracleSqlBuilder getTableDDLSql = new OracleSqlBuilder(); - getTableDDLSql.append("SELECT dbms_metadata.get_ddl('TABLE', "); - getTableDDLSql.value(tableName); - getTableDDLSql.append(", "); - getTableDDLSql.value(schemaName); - getTableDDLSql.append(") as DDL from dual"); - String ddl = JdbcOperationsUtil.getJdbcOperations(connection).queryForObject(getTableDDLSql.toString(), - String.class); + OracleSqlBuilder builder = new OracleSqlBuilder(); + builder.append("SELECT dbms_metadata.get_ddl('TABLE', "); + builder.value(tableName); + builder.append(", "); + builder.value(schemaName); + builder.append(") as DDL from dual"); + String ddl = JdbcOperationsUtil.getJdbcOperations(connection) + .queryForObject(builder.toString(), String.class); try { - SQLParser sqlParser = new OBOracleSQLParser(); - statement = (CreateTable) sqlParser.parse(new StringReader(ddl)); + Statement value = SqlParser.parseOracleStatement(ddl); + if (value instanceof CreateTable) { + statement = (CreateTable) value; + } } catch (Exception e) { log.warn("Failed to parse table ddl, error message={}", e.getMessage()); }