diff --git a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java index 24643b551460f68b82846e11edcd118eb0b822ab..1c449925ffe1f83ffee10d2d632b3a210611b650 100644 --- a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java +++ b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java @@ -31,7 +31,7 @@ import org.antlr.v4.runtime.tree.ErrorNode; import org.apache.shardingsphere.rdl.parser.autogen.ShardingSphereStatementLexer; import org.apache.shardingsphere.rdl.parser.sql.parser.ShardingSphereParser; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; import org.apache.shardingsphere.sql.parser.exception.SQLParsingException; import java.nio.CharBuffer; diff --git a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java index 4b16ca17192eaf34ef578e7ffa4c62b2062d6a6b..2c3d3b73076c8490de222d31ac298d6d7a363975 100644 --- a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java +++ b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java @@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.rdl.parser.autogen.ShardingSphereStatementParser; import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; /** * SQL parser for RDL. diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java index b3b8f63bfbe14c9267341b0faddf28b362170e13..523e66e480d9ce8042dd6a6a7d0bc9a2bffa99ea 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java @@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; /** * SQL parser for MySQL. diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java index 990f88c6d2d3bbd43091212dac7eb3fbfb0e19e4..35b5ecb00356e736b86b23dfcc3848867d94b690 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java @@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; /** * SQL parser for Oracle. diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java index 10f9250a7d5c2c67280f60e1c5fec5aa5b651e2b..f471186f07d2f90ea7fa0d17f6a95489f98afca5 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java @@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; /** * SQL parser for PostgreSQL. diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java index dfa421d1b16be9b89e07f2b80f0ee0dfda53ed51..b8d3585c10f1faddc49195ddbbfbab3143a24434 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java @@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; /** * SQL parser for SQL92. diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java index 1b7eef1e8d884ac02d2e4c7adfbf7d4b770dd44c..ed80c18f00d57776f791cc6597aa6bcb513e6bf7 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java @@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream; import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; /** * SQL parser for SQLServer. diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngine.java similarity index 53% rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngine.java rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngine.java index 567a628daae9447c69f7c0be6555093d88205f87..9a159fc7f50a4f653e223b85cec8ba95927c1973 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngine.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngine.java @@ -15,12 +15,19 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.engine; +package org.apache.shardingsphere.sql.parser.api.parser; import lombok.RequiredArgsConstructor; +import org.antlr.v4.runtime.BailErrorStrategy; +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.atn.PredictionMode; +import org.antlr.v4.runtime.misc.ParseCancellationException; +import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.ParseTree; import org.apache.shardingsphere.sql.parser.cache.SQLParsedResultCache; -import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor; +import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode; +import org.apache.shardingsphere.sql.parser.core.parser.SQLParserFactory; +import org.apache.shardingsphere.sql.parser.exception.SQLParsingException; import java.util.Optional; @@ -30,13 +37,13 @@ import java.util.Optional; @RequiredArgsConstructor public final class SQLParserEngine { - private final String databaseTypeName; + private final String databaseType; private final SQLParsedResultCache cache = new SQLParsedResultCache<>(); /** - * Parse SQL. - * + * Parse. + * * @param sql SQL to be parsed * @param useCache whether use cache * @return parse tree @@ -49,12 +56,33 @@ public final class SQLParserEngine { if (parseTree.isPresent()) { return parseTree.get(); } - ParseTree result = new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode(); + ParseTree result = parse(sql); cache.put(sql, result); return result; } private ParseTree parse(final String sql) { - return new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode(); + ParseASTNode result = twoPhaseParse(sql); + if (result.getRootNode() instanceof ErrorNode) { + throw new SQLParsingException(String.format("Unsupported SQL of `%s`", sql)); + } + return result.getRootNode(); + } + + private ParseASTNode twoPhaseParse(final String sql) { + SQLParser sqlParser = SQLParserFactory.newInstance(databaseType, sql); + try { + setPredictionMode((Parser) sqlParser, PredictionMode.SLL); + return (ParseASTNode) sqlParser.parse(); + } catch (final ParseCancellationException ex) { + ((Parser) sqlParser).reset(); + setPredictionMode((Parser) sqlParser, PredictionMode.LL); + return (ParseASTNode) sqlParser.parse(); + } + } + + private void setPredictionMode(final Parser sqlParser, final PredictionMode mode) { + sqlParser.setErrorHandler(new BailErrorStrategy()); + sqlParser.getInterpreter().setPredictionMode(mode); } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngineFactory.java similarity index 78% rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactory.java rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngineFactory.java index 1571ba9a24f9518bab83e80ca9bb77e551377ab2..70e22030ebd1c1c47249b69cca8a253fcf86a8b7 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactory.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngineFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.engine; +package org.apache.shardingsphere.sql.parser.api.parser; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -33,20 +33,20 @@ public final class SQLParserEngineFactory { /** * Get SQL parser engine. - *x - * @param databaseTypeName name of database type + * + * @param databaseType database type * @return SQL parser engine */ - public static SQLParserEngine getSQLParserEngine(final String databaseTypeName) { - if (ENGINES.containsKey(databaseTypeName)) { - return ENGINES.get(databaseTypeName); + public static SQLParserEngine getSQLParserEngine(final String databaseType) { + if (ENGINES.containsKey(databaseType)) { + return ENGINES.get(databaseType); } synchronized (ENGINES) { - if (ENGINES.containsKey(databaseTypeName)) { - return ENGINES.get(databaseTypeName); + if (ENGINES.containsKey(databaseType)) { + return ENGINES.get(databaseType); } - SQLParserEngine result = new SQLParserEngine(databaseTypeName); - ENGINES.put(databaseTypeName, result); + SQLParserEngine result = new SQLParserEngine(databaseType); + ENGINES.put(databaseType, result); return result; } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngine.java new file mode 100644 index 0000000000000000000000000000000000000000..b488522d4f8d025694ad3c5398a877e66f705718 --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngine.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.api.visitor; + +import lombok.RequiredArgsConstructor; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; +import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorFactory; +import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorRule; + +/** + * SQL visitor engnie. + * + * @param type of return value + */ +@RequiredArgsConstructor +public final class SQLVisitorEngine { + + private final String databaseType; + + private final String visitorType; + + /** + * Visit parse tree. + * + * @param parseTree parse tree + * @return visit result + */ + public T visit(final ParseTree parseTree) { + ParseTreeVisitor visitor = SQLVisitorFactory.newInstance(databaseType, visitorType, SQLVisitorRule.valueOf(parseTree.getClass())); + return parseTree.accept(visitor); + } +} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngineFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngineFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c30f3dfa186b30c70fc721cc76b8abac7e81f4cd --- /dev/null +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngineFactory.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.api.visitor; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +/** + * SQL visitor engine factory. + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class SQLVisitorEngineFactory { + + /** + * Get SQL visitor engine. + * + * @param databaseType database type + * @param visitorType visitor type + * @param type of visitor result + * @return SQL visitor engine + */ + public static SQLVisitorEngine getSQLVisitorEngine(final String databaseType, final String visitorType) { + return new SQLVisitorEngine<>(databaseType, visitorType); + } +} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/ParseASTNode.java similarity index 95% rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/ParseASTNode.java index 6f2772e4d5146d02e3e39b306decf1631180af90..9da8f77e89c728fea1e1507b9fb19c70cfa5dfa1 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/ParseASTNode.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.core; +package org.apache.shardingsphere.sql.parser.core.parser; import lombok.RequiredArgsConstructor; import org.antlr.v4.runtime.tree.ParseTree; diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java deleted file mode 100644 index b64d92aefef8b269b13964c82fab295d44f0c7f9..0000000000000000000000000000000000000000 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.core.parser; - -import lombok.RequiredArgsConstructor; -import org.antlr.v4.runtime.BailErrorStrategy; -import org.antlr.v4.runtime.Parser; -import org.antlr.v4.runtime.atn.PredictionMode; -import org.antlr.v4.runtime.misc.ParseCancellationException; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; -import org.apache.shardingsphere.sql.parser.core.ParseASTNode; -import org.apache.shardingsphere.sql.parser.exception.SQLParsingException; - -/** - * SQL parser executor. - */ -@RequiredArgsConstructor -public final class SQLParserExecutor { - - private final String databaseTypeName; - - private final String sql; - - /** - * Execute to parse SQL. - * - * @return AST node - */ - public ParseASTNode execute() { - ParseASTNode result = twoPhaseParse(); - if (result.getRootNode() instanceof ErrorNode) { - throw new SQLParsingException(String.format("Unsupported SQL of `%s`", sql)); - } - return result; - } - - private ParseASTNode twoPhaseParse() { - SQLParser sqlParser = SQLParserFactory.newInstance(databaseTypeName, sql); - try { - ((Parser) sqlParser).setErrorHandler(new BailErrorStrategy()); - ((Parser) sqlParser).getInterpreter().setPredictionMode(PredictionMode.SLL); - return (ParseASTNode) sqlParser.parse(); - } catch (final ParseCancellationException ex) { - ((Parser) sqlParser).reset(); - ((Parser) sqlParser).setErrorHandler(new BailErrorStrategy()); - ((Parser) sqlParser).getInterpreter().setPredictionMode(PredictionMode.LL); - return (ParseASTNode) sqlParser.parse(); - } - } -} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/SQLParserFacadeRegistry.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java similarity index 97% rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/SQLParserFacadeRegistry.java rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java index 126c356ae0756d7b495d41d0c0188302591c6a80..ca957f5ae8746efd62fc3ab9e6b752e2a05e8f99 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/SQLParserFacadeRegistry.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.core; +package org.apache.shardingsphere.sql.parser.core.parser; import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade; diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java index 6a4b987c70feb8df7efecf0a6f342c4e3db5ba82..9b838e2100ba2ed05d5f8b3b59ac4e964ce26723 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java @@ -26,8 +26,8 @@ import org.antlr.v4.runtime.CodePointCharStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.TokenStream; +import org.apache.shardingsphere.sql.parser.api.lexer.SQLLexer; import org.apache.shardingsphere.sql.parser.api.parser.SQLParser; -import org.apache.shardingsphere.sql.parser.core.SQLParserFacadeRegistry; import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade; import java.nio.CharBuffer; @@ -38,22 +38,31 @@ import java.nio.CharBuffer; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class SQLParserFactory { - /** + /** * New instance of SQL parser. * - * @param databaseTypeName name of database type + * @param databaseType database type * @param sql SQL * @return SQL parser */ - public static SQLParser newInstance(final String databaseTypeName, final String sql) { - return createSQLParser(sql, SQLParserFacadeRegistry.getInstance().getSQLParserFacade(databaseTypeName)); + public static SQLParser newInstance(final String databaseType, final String sql) { + SQLParserFacade sqlParserFacade = SQLParserFacadeRegistry.getInstance().getSQLParserFacade(databaseType); + return createSQLParser(createTokenStream(sql, sqlParserFacade.getLexerClass()), sqlParserFacade.getParserClass()); } @SneakyThrows(ReflectiveOperationException.class) - private static SQLParser createSQLParser(final String sql, final SQLParserFacade config) { + private static SQLParser createSQLParser(final TokenStream tokenStream, final Class parserClass) { + return parserClass.getConstructor(TokenStream.class).newInstance(tokenStream); + } + + @SneakyThrows(ReflectiveOperationException.class) + private static TokenStream createTokenStream(final String sql, final Class lexerClass) { + Lexer lexer = (Lexer) lexerClass.getConstructor(CharStream.class).newInstance(getSQLCharStream(sql)); + return new CommonTokenStream(lexer); + } + + private static CharStream getSQLCharStream(final String sql) { CodePointBuffer buffer = CodePointBuffer.withChars(CharBuffer.wrap(sql.toCharArray())); - CodePointCharStream codePointCharStream = CodePointCharStream.fromBuffer(buffer); - Lexer lexer = (Lexer) config.getLexerClass().getConstructor(CharStream.class).newInstance(codePointCharStream); - return config.getParserClass().getConstructor(TokenStream.class).newInstance(new CommonTokenStream(lexer)); + return CodePointCharStream.fromBuffer(buffer); } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLFormatVisitorFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLFormatVisitorFactory.java deleted file mode 100644 index 5abcec8fcc8b751df19759c32013bedb3681eb71..0000000000000000000000000000000000000000 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLFormatVisitorFactory.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.shardingsphere.sql.parser.core.visitor; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.SneakyThrows; -import org.antlr.v4.runtime.tree.ParseTreeVisitor; -import org.apache.shardingsphere.sql.parser.exception.SQLParsingException; -import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade; -import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatementType; - -/** - * SQL format visitor factory. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class SQLFormatVisitorFactory { - - /** - * New instance of SQL format visitor. - * - * @param databaseTypeName name of database type - * @param sqlVisitorRule visitor rule - * @return parse tree visitor - */ - public static ParseTreeVisitor newInstance(final String databaseTypeName, final SQLVisitorRule sqlVisitorRule) { - SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseTypeName, "FORMAT"); - return createParseTreeVisitor(facade, sqlVisitorRule.getType()); - } - - @SneakyThrows(ReflectiveOperationException.class) - private static ParseTreeVisitor createParseTreeVisitor(final SQLVisitorFacade visitorFacade, final SQLStatementType type) { - switch (type) { - case DML: - return (ParseTreeVisitor) visitorFacade.getDMLVisitorClass().getConstructor().newInstance(); - case DDL: - return (ParseTreeVisitor) visitorFacade.getDDLVisitorClass().getConstructor().newInstance(); - case TCL: - return (ParseTreeVisitor) visitorFacade.getTCLVisitorClass().getConstructor().newInstance(); - case DCL: - return (ParseTreeVisitor) visitorFacade.getDCLVisitorClass().getConstructor().newInstance(); - case DAL: - return (ParseTreeVisitor) visitorFacade.getDALVisitorClass().getConstructor().newInstance(); - case RL: - return (ParseTreeVisitor) visitorFacade.getRLVisitorClass().getConstructor().newInstance(); - default: - throw new SQLParsingException("Can not support SQL statement type: `%s`", type); - } - } -} diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLStatementVisitorFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorFactory.java similarity index 77% rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLStatementVisitorFactory.java rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorFactory.java index 5e53c5889dd680361c0c160d7d677e03d0c33645..8e7701f83d20d8e52e92ac668c49ca59697f71f9 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLStatementVisitorFactory.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorFactory.java @@ -26,25 +26,28 @@ import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade; import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatementType; /** - * SQL statement visitor factory. + * SQL visitor factory. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class SQLStatementVisitorFactory { +public final class SQLVisitorFactory { - /** - * New instance of SQL statement visitor. + /** + * New instance of SQL visitor. * - * @param databaseTypeName name of database type - * @param sqlVisitorRule SQL visitor rule + * @param databaseType database type + * @param visitorType SQL visitor type + * @param visitorRule SQL visitor rule + * @param type of visitor result * @return parse tree visitor */ - public static ParseTreeVisitor newInstance(final String databaseTypeName, final SQLVisitorRule sqlVisitorRule) { - SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseTypeName, "STATEMENT"); - return createParseTreeVisitor(facade, sqlVisitorRule.getType()); + public static ParseTreeVisitor newInstance(final String databaseType, final String visitorType, final SQLVisitorRule visitorRule) { + SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseType, visitorType); + return createParseTreeVisitor(facade, visitorRule.getType()); } + @SuppressWarnings("unchecked") @SneakyThrows(ReflectiveOperationException.class) - private static ParseTreeVisitor createParseTreeVisitor(final SQLVisitorFacade visitorFacade, final SQLStatementType type) { + private static ParseTreeVisitor createParseTreeVisitor(final SQLVisitorFacade visitorFacade, final SQLStatementType type) { switch (type) { case DML: return (ParseTreeVisitor) visitorFacade.getDMLVisitorClass().getConstructor().newInstance(); diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java index 230903b775771ee2e3a996e921acc8b6fedd9bfc..d0dcfeb177aca10a45bc0146d34daf9e5a37ffea 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java @@ -51,47 +51,47 @@ public enum SQLVisitorRule { ALTER_INDEX("AlterIndex", SQLStatementType.DDL), DROP_INDEX("DropIndex", SQLStatementType.DDL), - + CREATE_PROCEDURE("CreateProcedure", SQLStatementType.DDL), - + ALTER_PROCEDURE("AlterProcedure", SQLStatementType.DDL), - + DROP_PROCEDURE("DropProcedure", SQLStatementType.DDL), - + CREATE_FUNCTION("CreateFunction", SQLStatementType.DDL), - + ALTER_FUNCTION("AlterFunction", SQLStatementType.DDL), - + DROP_FUNCTION("DropFunction", SQLStatementType.DDL), - + CREATE_DATABASE("CreateDatabase", SQLStatementType.DDL), ALTER_DATABASE("AlterDatabase", SQLStatementType.DDL), - + DROP_DATABASE("DropDatabase", SQLStatementType.DDL), - + CREATE_EVENT("CreateEvent", SQLStatementType.DDL), - + ALTER_EVENT("AlterEvent", SQLStatementType.DDL), DROP_EVENT("DropEvent", SQLStatementType.DDL), - + ALTER_INSTANCE("AlterInstance", SQLStatementType.DDL), - + CREATE_LOGFILE_GROUP("CreateLogfileGroup", SQLStatementType.DDL), - + ALTER_LOGFILE_GROUP("AlterLogfileGroup", SQLStatementType.DDL), - + DROP_LOGFILE_GROUP("DropLogfileGroup", SQLStatementType.DDL), - + CREATE_SERVER("CreateServer", SQLStatementType.DDL), ALTER_SERVER("AlterServer", SQLStatementType.DDL), - + DROP_SERVER("DropServer", SQLStatementType.DDL), - + CREATE_TRIGGER("CreateTrigger", SQLStatementType.DDL), - + DROP_TRIGGER("DropTrigger", SQLStatementType.DDL), CREATE_VIEW("CreateView", SQLStatementType.DDL), diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java index b3bda7d953552610e974035125fc78a4f00bc5ab..664ad424dbe2fdee93a6194c25e3396adc008b13 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java @@ -21,9 +21,9 @@ import lombok.RequiredArgsConstructor; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeVisitor; import org.apache.shardingsphere.sql.parser.cache.SQLParsedResultCache; -import org.apache.shardingsphere.sql.parser.core.visitor.SQLStatementVisitorFactory; +import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorFactory; import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorRule; -import org.apache.shardingsphere.sql.parser.engine.SQLParserEngineFactory; +import org.apache.shardingsphere.sql.parser.api.parser.SQLParserEngineFactory; import org.apache.shardingsphere.sql.parser.hook.ParsingHookRegistry; import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.statement.SQLStatementParserEngine; @@ -76,10 +76,9 @@ public final class StandardSQLStatementParserEngine implements SQLStatementParse return result; } - @SuppressWarnings("unchecked") private SQLStatement parseSQLStatement(final String sql) { ParseTree parseTree = SQLParserEngineFactory.getSQLParserEngine(databaseTypeName).parse(sql, false); - ParseTreeVisitor visitor = SQLStatementVisitorFactory.newInstance(databaseTypeName, SQLVisitorRule.valueOf(parseTree.getClass())); + ParseTreeVisitor visitor = SQLVisitorFactory.newInstance(databaseTypeName, "STATEMENT", SQLVisitorRule.valueOf(parseTree.getClass())); return parseTree.accept(visitor); } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java index 617800a9730c8db5046d1a1aca844212ac5fcafe..8c637a37dfb074deecb7eff3a7e69b0dafe3eb8f 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java @@ -34,19 +34,19 @@ public final class StandardSQLStatementParserEngineFactory { /** * Get standard SQL statement parser engine. *x - * @param databaseTypeName name of database type + * @param databaseType name of database type * @return standard SQL statement parser engine */ - public static StandardSQLStatementParserEngine getSQLStatementParserEngine(final String databaseTypeName) { - if (ENGINES.containsKey(databaseTypeName)) { - return ENGINES.get(databaseTypeName); + public static StandardSQLStatementParserEngine getSQLStatementParserEngine(final String databaseType) { + if (ENGINES.containsKey(databaseType)) { + return ENGINES.get(databaseType); } synchronized (ENGINES) { - if (ENGINES.containsKey(databaseTypeName)) { - return ENGINES.get(databaseTypeName); + if (ENGINES.containsKey(databaseType)) { + return ENGINES.get(databaseType); } - StandardSQLStatementParserEngine result = new StandardSQLStatementParserEngine(databaseTypeName); - ENGINES.put(databaseTypeName, result); + StandardSQLStatementParserEngine result = new StandardSQLStatementParserEngine(databaseType); + ENGINES.put(databaseType, result); return result; } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactoryTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngineFactoryTest.java similarity index 92% rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactoryTest.java rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngineFactoryTest.java index 73dd2878479cb492a1ad1198a848054cc474d5cf..1887e21216c02bd39b63d7d4a458e2622be9cef2 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactoryTest.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngineFactoryTest.java @@ -15,8 +15,9 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.engine; +package org.apache.shardingsphere.sql.parser.api; +import org.apache.shardingsphere.sql.parser.api.parser.SQLParserEngineFactory; import org.junit.After; import org.junit.Before; import org.junit.Test;