This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new b5d8c1ab0c5 Remove SQL formatting feature (#35402) b5d8c1ab0c5 is described below commit b5d8c1ab0c59d7adb2b699d62752a189765ef10c Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Wed May 14 17:50:49 2025 +0800 Remove SQL formatting feature (#35402) * Remove SQL formatting feature * Remove SQL formatting feature --- RELEASE-NOTES.md | 2 + .../core/advice/SQLParseCountAdviceTest.java | 8 +- .../content/reference/sharding/parse.cn.md | 21 - .../content/reference/sharding/parse.en.md | 21 - .../mysql/format/MySQLParserFormatExample.java | 62 -- .../engine/src/main/antlr4/imports/RULKeyword.g4 | 4 - .../engine/src/main/antlr4/imports/RULStatement.g4 | 4 - .../parser/autogen/UtilityDistSQLStatement.g4 | 1 - .../utility/UtilityDistSQLStatementVisitor.java | 7 - .../distsql/statement/rul/sql/FormatStatement.java | 32 - .../mysql/visitor/format/MySQLFormatVisitor.java | 847 --------------------- ....sql.parser.api.visitor.format.SQLFormatVisitor | 18 - .../mysql/visitor/format/MySQLFormatVisitorIT.java | 146 ---- .../sql/parser/api/SQLFormatEngine.java | 55 -- .../api/visitor/format/SQLFormatVisitor.java | 27 - .../handler/distsql/rul/FormatSQLExecutor.java | 63 -- ...stsql.handler.engine.query.DistSQLQueryExecutor | 1 - .../handler/distsql/rul/FormatSQLExecutorTest.java | 64 -- .../asserts/statement/rul/RULStatementAssert.java | 5 - .../rul/type/FormatSQLStatementAssert.java | 48 -- .../cases/parser/jaxb/RootSQLParserTestCases.java | 4 - .../statement/rul/FormatSQLStatementTestCase.java | 35 - test/it/parser/src/main/resources/case/rul/sql.xml | 1 - .../src/main/resources/sql/supported/rul/sql.xml | 1 - 24 files changed, 6 insertions(+), 1471 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 7a5096cadf1..15fc269f3da 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -11,6 +11,8 @@ ### API Changes +1. Remove SQL formatting feature [#35390](https://github.com/apache/shardingsphere/pull/35390) + ### New Features ### Enhancements diff --git a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java index dfd4fcca4ff..d7bad0a2cc7 100644 --- a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java +++ b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java @@ -21,12 +21,12 @@ import org.apache.shardingsphere.agent.api.advice.TargetAdviceMethod; import org.apache.shardingsphere.agent.plugin.metrics.core.collector.MetricsCollectorRegistry; import org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricCollectorType; import org.apache.shardingsphere.agent.plugin.metrics.core.config.MetricConfiguration; -import org.apache.shardingsphere.agent.plugin.metrics.core.fixture.collector.MetricsCollectorFixture; import org.apache.shardingsphere.agent.plugin.metrics.core.fixture.TargetAdviceObjectFixture; +import org.apache.shardingsphere.agent.plugin.metrics.core.fixture.collector.MetricsCollectorFixture; +import org.apache.shardingsphere.data.pipeline.migration.distsql.statement.queryable.ShowMigrationListStatement; import org.apache.shardingsphere.distsql.statement.rdl.resource.unit.type.RegisterStorageUnitStatement; import org.apache.shardingsphere.distsql.statement.rql.resource.ShowStorageUnitsStatement; -import org.apache.shardingsphere.distsql.statement.rul.sql.FormatStatement; -import org.apache.shardingsphere.data.pipeline.migration.distsql.statement.queryable.ShowMigrationListStatement; +import org.apache.shardingsphere.distsql.statement.rul.sql.ParseStatement; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DatabaseSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLShowDatabasesStatement; @@ -112,7 +112,7 @@ class SQLParseCountAdviceTest { @Test void assertParseRUL() { - assertParse(new FormatStatement("SELECT * FROM tbl"), "RUL=1"); + assertParse(new ParseStatement("SELECT * FROM tbl"), "RUL=1"); } private void assertParse(final SQLStatement sqlStatement, final String expected) { diff --git a/docs/document/content/reference/sharding/parse.cn.md b/docs/document/content/reference/sharding/parse.cn.md index 9adbe71f60e..d27a4f9bd05 100644 --- a/docs/document/content/reference/sharding/parse.cn.md +++ b/docs/document/content/reference/sharding/parse.cn.md @@ -99,24 +99,3 @@ ParseASTNode parseASTNode = parserEngine.parse(sql, useCache); SQLVisitorEngine sqlVisitorEngine = new SQLVisitorEngine(sql, "STATEMENT", useCache, new Properties()); SQLStatement sqlStatement = sqlVisitorEngine.visit(parseASTNode); ``` - -- SQL 格式化 - -```java -new SQLFormatEngine(TypedSPILoader.getService(DatabaseType.class, "Mysql"), cacheOption) - .format(sql, false, null); -``` - -例子: - -| 原 SQL | 格式化 SQL [...] -|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...] -| select a+1 as b, name n from table1 join table2 where id=1 and name='lu'; | SELECT a + 1 AS b, name n<br>FROM table1 JOIN table2<br>WHERE<br>    id = 1<br>    and name = 'lu'; [...] -| select id, name, age, sex, ss, yy from table1 where id=1; | SELECT id , name , age , <br>    sex , ss , yy <br>FROM table1<br>WHERE <br>    id = 1; [...] -| select id, name, age, count(*) as n, (select id, name, age, sex from table2 where id=2) as sid, yyyy from table1 where id=1; | SELECT id , name , age , <br>    COUNT(*) AS n, <br>    (<br>        SELECT id , name , age , <br>    &em [...] -| select id, name, age, sex, ss, yy from table1 where id=1 and name=1 and a=1 and b=2 and c=4 and d=3; | SELECT id , name , age , <br>    sex , ss , yy <br>FROM table1<br>WHERE <br>    id = 1<br>    and name = 1<br>    and a = 1<b [...] -| ALTER TABLE t_order ADD column4 DATE, ADD column5 DATETIME, engine ss max_rows 10,min_rows 2, <br>ADD column6 TIMESTAMP, ADD column7 TIME; | ALTER TABLE t_order<br>    ADD column4 DATE,<br>    ADD column5 DATETIME,<br>    ENGINE ss<br>    MAX_ROWS 10,<br> &emsp [...] -| CREATE TABLE IF NOT EXISTS <br>`runoob_tbl`(`runoob_id` INT UNSIGNED AUTO_INCREMENT,`runoob_title` VARCHAR(100) NOT NULL,<br>`runoob_author` VARCHAR(40) NOT NULL,`runoob_test` NATIONAL CHAR(40),<br>`submission_date` DATE,PRIMARY KEY (`runoob_id`))ENGINE=InnoDB DEFAULT CHARSET=utf8; | CREATE TABLE IF NOT EXISTS `runoob_tbl` (<br>    `runoob_id` INT UNSIGNED AUTO_INCREMENT,<br>    `runoob_title` VARCHAR(100) NOT NULL,<br>    `ru [...] -| INSERT INTO t_order_item(order_id, user_id, status, creation_date) <br>values (1, 1, 'insert', '2017-08-08'), (2, 2, 'insert', '2017-08-08') ON DUPLICATE KEY UPDATE status = 'init'; | INSERT INTO t_order_item (order_id , user_id , status , creation_date)<br>VALUES<br>    (1, 1, 'insert', '2017-08-08'),<br>    (2, 2, 'insert', '2017-08-08')<br>ON [...] -| INSERT INTO t_order SET order_id = 1, user_id = 1, status = convert(to_base64(aes_encrypt(1, 'key')) USING utf8)<br> ON DUPLICATE KEY UPDATE status = VALUES(status); | INSERT INTO t_order SET order_id = 1,<br>    user_id = 1,<br>    status = CONVERT(to_base64(aes_encrypt(1 , 'key')) USING utf8)<br>ON DUPLICATE KEY UPDATE status = [...] -| INSERT INTO t_order (order_id, user_id, status) SELECT order_id, user_id, status FROM t_order WHERE order_id = 1; | INSERT INTO t_order (order_id , user_id , status) <br>SELECT order_id , user_id , status <br>FROM t_order<br>WHERE <br>    order_id = 1; [...] diff --git a/docs/document/content/reference/sharding/parse.en.md b/docs/document/content/reference/sharding/parse.en.md index 27e55c568e5..4a5ff163f0d 100644 --- a/docs/document/content/reference/sharding/parse.en.md +++ b/docs/document/content/reference/sharding/parse.en.md @@ -96,24 +96,3 @@ ParseASTNode parseASTNode = parserEngine.parse(sql, useCache); SQLVisitorEngine sqlVisitorEngine = new SQLVisitorEngine(sql, "STATEMENT", useCache, new Properties()); SQLStatement sqlStatement = sqlVisitorEngine.visit(parseASTNode); ``` - -- SQL Formatting - -```java -new SQLFormatEngine(TypedSPILoader.getService(DatabaseType.class, "Mysql"), cacheOption) - .format(sql, false, null); -``` - -Example: - -| Original SQL | Formatted SQL [...] -|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...] -| select a+1 as b, name n from table1 join table2 where id=1 and name='lu'; | SELECT a + 1 AS b, name n<br>FROM table1 JOIN table2<br>WHERE<br>    id = 1<br>    and name = 'lu'; [...] -| select id, name, age, sex, ss, yy from table1 where id=1; | SELECT id , name , age , <br>    sex , ss , yy <br>FROM table1<br>WHERE <br>    id = 1; [...] -| select id, name, age, count(*) as n, (select id, name, age, sex from table2 where id=2) as sid, yyyy from table1 where id=1; | SELECT id , name , age , <br>    COUNT(*) AS n, <br>    (<br>        SELECT id , name , age , <br>    &em [...] -| select id, name, age, sex, ss, yy from table1 where id=1 and name=1 and a=1 and b=2 and c=4 and d=3; | SELECT id , name , age , <br>    sex , ss , yy <br>FROM table1<br>WHERE <br>    id = 1<br>    and name = 1<br>    and a = 1<b [...] -| ALTER TABLE t_order ADD column4 DATE, ADD column5 DATETIME, engine ss max_rows 10,min_rows 2, <br>ADD column6 TIMESTAMP, ADD column7 TIME; | ALTER TABLE t_order<br>    ADD column4 DATE,<br>    ADD column5 DATETIME,<br>    ENGINE ss<br>    MAX_ROWS 10,<br> &emsp [...] -| CREATE TABLE IF NOT EXISTS <br>`runoob_tbl`(`runoob_id` INT UNSIGNED AUTO_INCREMENT,`runoob_title` VARCHAR(100) NOT NULL,<br>`runoob_author` VARCHAR(40) NOT NULL,`runoob_test` NATIONAL CHAR(40),<br>`submission_date` DATE,PRIMARY KEY (`runoob_id`))ENGINE=InnoDB DEFAULT CHARSET=utf8; | CREATE TABLE IF NOT EXISTS `runoob_tbl` (<br>    `runoob_id` INT UNSIGNED AUTO_INCREMENT,<br>    `runoob_title` VARCHAR(100) NOT NULL,<br>    `ru [...] -| INSERT INTO t_order_item(order_id, user_id, status, creation_date) <br>values (1, 1, 'insert', '2017-08-08'), (2, 2, 'insert', '2017-08-08') ON DUPLICATE KEY UPDATE status = 'init'; | INSERT INTO t_order_item (order_id , user_id , status , creation_date)<br>VALUES<br>    (1, 1, 'insert', '2017-08-08'),<br>    (2, 2, 'insert', '2017-08-08')<br>ON [...] -| INSERT INTO t_order SET order_id = 1, user_id = 1, status = convert(to_base64(aes_encrypt(1, 'key')) USING utf8)<br> ON DUPLICATE KEY UPDATE status = VALUES(status); | INSERT INTO t_order SET order_id = 1,<br>    user_id = 1,<br>    status = CONVERT(to_base64(aes_encrypt(1 , 'key')) USING utf8)<br>ON DUPLICATE KEY UPDATE status = [...] -| INSERT INTO t_order (order_id, user_id, status) SELECT order_id, user_id, status FROM t_order WHERE order_id = 1; | INSERT INTO t_order (order_id , user_id , status) <br>SELECT order_id , user_id , status <br>FROM t_order<br>WHERE <br>    order_id = 1; [...] diff --git a/examples/shardingsphere-parser-example/src/main/java/org/apache/shardingsphere/example/parser/mysql/format/MySQLParserFormatExample.java b/examples/shardingsphere-parser-example/src/main/java/org/apache/shardingsphere/example/parser/mysql/format/MySQLParserFormatExample.java deleted file mode 100644 index 594ee03c11d..00000000000 --- a/examples/shardingsphere-parser-example/src/main/java/org/apache/shardingsphere/example/parser/mysql/format/MySQLParserFormatExample.java +++ /dev/null @@ -1,62 +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.example.parser.mysql.format; - -import org.apache.shardingsphere.sql.parser.api.CacheOption; -import org.apache.shardingsphere.sql.parser.api.SQLFormatEngine; - -import java.util.Arrays; -import java.util.List; -import java.util.Properties; - -public final class MySQLParserFormatExample { - - private static final String DML_SELECT_SQL = "SELECT age AS b, name AS n FROM table1 JOIN table2 WHERE id = 1 AND name = 'lu';"; - - private static final String DML_INSERT_SQL = "INSERT INTO user (name, age, status) VALUES ('z', 18, 1);"; - - private static final String DML_DELETE_SQL = "DELETE FROM user WHERE id = 1;"; - - private static final String DML_UPDATE_SQL = "UPDATE user SET name = 'j' WHERE id = 1;"; - - private static final String DDL_CREATE_SQL = "CREATE TABLE user (id BIGINT(20) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT(2), status INT(1));"; - - private static final String DDL_DROP_SQL = "DROP TABLE user;"; - - private static final String DDL_ALTER_SQL = "ALTER TABLE user CHANGE name name_new VARCHAR(20);"; - - private static final String DDL_SHOW_SQL = "SHOW COLUMNS FROM user;"; - - private static final List<String> MYSQL_FORMAT_SQL_LIST; - - static { - MYSQL_FORMAT_SQL_LIST = Arrays.asList(DML_SELECT_SQL, DML_INSERT_SQL, DML_DELETE_SQL, DML_UPDATE_SQL, DDL_CREATE_SQL, DDL_DROP_SQL, DDL_ALTER_SQL, DDL_SHOW_SQL); - } - - // CHECKSTYLE:OFF - public static void main(final String[] args) { - // CHECKSTYLE:ON - MYSQL_FORMAT_SQL_LIST.forEach(each -> { - CacheOption cacheOption = new CacheOption(128, 1024L); - SQLFormatEngine sqlFormatEngine = new SQLFormatEngine("MySQL", cacheOption); - Properties props = new Properties(); - props.setProperty("parameterized", Boolean.FALSE.toString()); - System.out.println(sqlFormatEngine.format(each, false, props)); - }); - } -} diff --git a/parser/distsql/engine/src/main/antlr4/imports/RULKeyword.g4 b/parser/distsql/engine/src/main/antlr4/imports/RULKeyword.g4 index 54c18e81d7a..c6fc5aaa306 100644 --- a/parser/distsql/engine/src/main/antlr4/imports/RULKeyword.g4 +++ b/parser/distsql/engine/src/main/antlr4/imports/RULKeyword.g4 @@ -31,10 +31,6 @@ PARSE : P A R S E ; -FORMAT - : F O R M A T - ; - SQLString : WS.* ; diff --git a/parser/distsql/engine/src/main/antlr4/imports/RULStatement.g4 b/parser/distsql/engine/src/main/antlr4/imports/RULStatement.g4 index 6b1f418b2a8..d47af39cfc0 100644 --- a/parser/distsql/engine/src/main/antlr4/imports/RULStatement.g4 +++ b/parser/distsql/engine/src/main/antlr4/imports/RULStatement.g4 @@ -27,10 +27,6 @@ parseSQL : PARSE sql ; -formatSQL - : FORMAT sql - ; - sql : SQLString ; diff --git a/parser/distsql/engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/UtilityDistSQLStatement.g4 b/parser/distsql/engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/UtilityDistSQLStatement.g4 index 8c4d5bd25b8..449f46129c9 100644 --- a/parser/distsql/engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/UtilityDistSQLStatement.g4 +++ b/parser/distsql/engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/UtilityDistSQLStatement.g4 @@ -22,6 +22,5 @@ import Symbol, RULStatement; execute : (previewSQL | parseSQL - | formatSQL ) SEMI_? EOF ; diff --git a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/utility/UtilityDistSQLStatementVisitor.java b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/utility/UtilityDistSQLStatementVisitor.java index 63328889fa1..0e9b472332a 100644 --- a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/utility/UtilityDistSQLStatementVisitor.java +++ b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/utility/UtilityDistSQLStatementVisitor.java @@ -18,10 +18,8 @@ package org.apache.shardingsphere.distsql.parser.core.utility; import org.apache.shardingsphere.distsql.parser.autogen.UtilityDistSQLStatementBaseVisitor; -import org.apache.shardingsphere.distsql.parser.autogen.UtilityDistSQLStatementParser.FormatSQLContext; import org.apache.shardingsphere.distsql.parser.autogen.UtilityDistSQLStatementParser.ParseSQLContext; import org.apache.shardingsphere.distsql.parser.autogen.UtilityDistSQLStatementParser.PreviewSQLContext; -import org.apache.shardingsphere.distsql.statement.rul.sql.FormatStatement; import org.apache.shardingsphere.distsql.statement.rul.sql.ParseStatement; import org.apache.shardingsphere.distsql.statement.rul.sql.PreviewStatement; import org.apache.shardingsphere.sql.parser.api.ASTNode; @@ -41,9 +39,4 @@ public final class UtilityDistSQLStatementVisitor extends UtilityDistSQLStatemen public ASTNode visitParseSQL(final ParseSQLContext ctx) { return new ParseStatement(ctx.sql().getText().trim()); } - - @Override - public ASTNode visitFormatSQL(final FormatSQLContext ctx) { - return new FormatStatement(ctx.sql().getText().trim()); - } } diff --git a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rul/sql/FormatStatement.java b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rul/sql/FormatStatement.java deleted file mode 100644 index 7e4ca855c2f..00000000000 --- a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rul/sql/FormatStatement.java +++ /dev/null @@ -1,32 +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.distsql.statement.rul.sql; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.distsql.statement.rul.RULStatement; - -/** - * Format statement. - */ -@RequiredArgsConstructor -@Getter -public final class FormatStatement extends RULStatement { - - private final String sql; -} diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java deleted file mode 100644 index 5fb4481503c..00000000000 --- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitor.java +++ /dev/null @@ -1,847 +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.mysql.visitor.format; - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.RuleNode; -import org.antlr.v4.runtime.tree.TerminalNode; -import org.apache.shardingsphere.sql.parser.api.visitor.format.SQLFormatVisitor; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementBaseVisitor; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AliasContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterCommandListContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterListContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableActionsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AssignmentValuesContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnNamesContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateDefinitionClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableOptionsSpaceSeparatedContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CteClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DataTypeContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DerivedColumnsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ExprContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldLengthContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IdentifierContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertSelectClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertValuesClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LiteralsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.NumberLiteralsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.OnDuplicateKeyClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PartitionNamesContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PrecisionContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ProjectionContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ProjectionsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QueryExpressionBodyContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QueryExpressionContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QueryExpressionParensContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.QuerySpecificationContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RowConstructorListContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SelectContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetAssignmentsClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StandaloneAlterTableActionContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StringListContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StringLiteralsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.String_Context; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SystemVariableContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableElementListContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableNameContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableStatementContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableValueConstructorContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TemporalLiteralsContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TypeDatetimePrecisionContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UserVariableContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.WhereClauseContext; -import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.WithClauseContext; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Properties; - -/** - * SQL format visitor for MySQL. - */ -public final class MySQLFormatVisitor extends MySQLStatementBaseVisitor<String> implements SQLFormatVisitor { - - private static final Collection<Class<? extends ParserRuleContext>> DATA_TYPE_EXTRA_DESCRIPTION_CONTEXT_CLASSES = new HashSet<>( - Arrays.asList(FieldLengthContext.class, PrecisionContext.class, StringListContext.class, TypeDatetimePrecisionContext.class)); - - private final StringBuilder formattedSQL = new StringBuilder(256); - - private boolean upperCase = true; - - private boolean parameterized = true; - - private int projectionsCountOfLine = 3; - - private int indentCount; - - @Override - public void init(final Properties props) { - if (null != props) { - upperCase = Boolean.parseBoolean(props.getProperty("upperCase", Boolean.TRUE.toString())); - parameterized = Boolean.parseBoolean(props.getProperty("parameterized", Boolean.TRUE.toString())); - projectionsCountOfLine = Integer.parseInt(props.getProperty("projectionsCountOfLine", "3")); - } - } - - @Override - public String visitSelect(final SelectContext ctx) { - if (null == ctx.queryExpression()) { - visit(null == ctx.queryExpressionParens() ? ctx.selectWithInto() : ctx.queryExpressionParens()); - } else { - visit(ctx.queryExpression()); - if (null != ctx.lockClauseList()) { - formattedSQL.append(' '); - visit(ctx.lockClauseList()); - } - } - formatPrint(';'); - return formattedSQL.toString(); - } - - @Override - public String visitQueryExpression(final QueryExpressionContext ctx) { - if (null != ctx.withClause()) { - visit(ctx.withClause()); - formatPrint(' '); - } - visit(null == ctx.queryExpressionBody() ? ctx.queryExpressionParens() : ctx.queryExpressionBody()); - if (null != ctx.orderByClause()) { - formatPrint(' '); - visit(ctx.orderByClause()); - } - if (null != ctx.limitClause()) { - formatPrint(' '); - visit(ctx.limitClause()); - } - return formattedSQL.toString(); - } - - @Override - public String visitQueryExpressionParens(final QueryExpressionParensContext ctx) { - formatPrintln(); - indentCount++; - formatPrint('('); - formatPrintln(); - if (null == ctx.queryExpressionParens()) { - visit(ctx.queryExpression()); - if (null != ctx.lockClauseList()) { - formattedSQL.append(' '); - visit(ctx.lockClauseList()); - } - } else { - visit(ctx.queryExpressionParens()); - } - indentCount--; - formatPrintln(); - formatPrint(')'); - return formattedSQL.toString(); - } - - @Override - public String visitQueryExpressionBody(final QueryExpressionBodyContext ctx) { - if (1 == ctx.getChildCount()) { - visit(ctx.queryPrimary()); - } else if (null == ctx.queryExpressionParens()) { - visit(ctx.queryExpressionBody(0)); - visitCombineClause(ctx); - } else { - visit(ctx.queryExpressionParens()); - } - return formattedSQL.toString(); - } - - private void visitCombineClause(final QueryExpressionBodyContext ctx) { - formattedSQL.append("\nUNION\n"); - if (null != ctx.combineOption()) { - visit(ctx.combineOption()); - formattedSQL.append(' '); - } - visit(ctx.queryExpressionBody(1)); - } - - @Override - public String visitQuerySpecification(final QuerySpecificationContext ctx) { - formatPrint("SELECT "); - int selectSpecCount = ctx.selectSpecification().size(); - for (int i = 0; i < selectSpecCount; i++) { - visit(ctx.selectSpecification(i)); - formatPrint(' '); - } - visit(ctx.projections()); - if (null != ctx.fromClause()) { - formatPrintln(); - visit(ctx.fromClause()); - } - if (null != ctx.whereClause()) { - formatPrintln(); - visit(ctx.whereClause()); - } - if (null != ctx.groupByClause()) { - formatPrintln(); - visit(ctx.groupByClause()); - } - if (null != ctx.havingClause()) { - formatPrintln(); - visit(ctx.havingClause()); - } - if (null != ctx.windowClause()) { - formatPrintln(); - visit(ctx.windowClause()); - } - return formattedSQL.toString(); - } - - @Override - public String visitTableStatement(final TableStatementContext ctx) { - formatPrint("TABLE "); - visit(ctx.tableName()); - return formattedSQL.toString(); - } - - @Override - public String visitInsert(final InsertContext ctx) { - visit(ctx.INSERT()); - formatPrint(' '); - visit(ctx.insertSpecification()); - formatPrint(' '); - if (null != ctx.INTO()) { - visit(ctx.INTO()); - formatPrint(' '); - } - visit(ctx.tableName()); - formatPrint(' '); - if (null != ctx.partitionNames()) { - formatPrintln(); - visit(ctx.partitionNames()); - } - if (null != ctx.insertValuesClause()) { - visit(ctx.insertValuesClause()); - } else if (null != ctx.insertSelectClause()) { - visit(ctx.insertSelectClause()); - } else { - visit(ctx.setAssignmentsClause()); - } - if (null != ctx.onDuplicateKeyClause()) { - formatPrintln(); - visit(ctx.onDuplicateKeyClause()); - } - return formattedSQL.toString(); - } - - @Override - public String visitPartitionNames(final PartitionNamesContext ctx) { - visit(ctx.PARTITION()); - formatPrintln(" ("); - int identifierCount = ctx.identifier().size(); - for (int i = 0; i < identifierCount; i++) { - if (0 != i) { - formatPrint(" ,"); - } - visit(ctx.identifier(i)); - } - formatPrint(')'); - return formattedSQL.toString(); - } - - @Override - public String visitInsertValuesClause(final InsertValuesClauseContext ctx) { - if (null != ctx.LP_()) { - formatPrint('('); - if (null != ctx.fields()) { - visit(ctx.fields()); - } - formatPrint(')'); - } - formatPrintln(); - visit(null == ctx.VALUE() ? ctx.VALUES() : ctx.VALUE()); - indentCount++; - formatPrintln(); - if (!ctx.assignmentValues().isEmpty()) { - int valueCount = ctx.assignmentValues().size(); - for (int i = 0; i < valueCount; i++) { - if (0 != i) { - formatPrint(','); - formatPrintln(); - } - visit(ctx.assignmentValues(i)); - } - } - if (null != ctx.rowConstructorList()) { - indentCount++; - visit(ctx.rowConstructorList()); - indentCount--; - } - indentCount--; - if (null != ctx.valueReference()) { - formatPrintln(); - visit(ctx.valueReference()); - } - return formattedSQL.toString(); - } - - @Override - public String visitInsertSelectClause(final InsertSelectClauseContext ctx) { - if (null != ctx.valueReference()) { - visit(ctx.valueReference()); - formatPrint(' '); - } - if (null != ctx.LP_()) { - formatPrint('('); - if (null != ctx.fields()) { - visit(ctx.fields()); - } - formatPrint(") "); - } - formatPrintln(); - visit(ctx.select()); - return formattedSQL.toString(); - } - - @Override - public String visitSetAssignmentsClause(final SetAssignmentsClauseContext ctx) { - indentCount++; - visit(ctx.SET()); - formatPrint(' '); - int assignmentCount = ctx.assignment().size(); - for (int i = 0; i < assignmentCount; i++) { - if (0 != i) { - formatPrintln(","); - } - visit(ctx.assignment(i)); - } - indentCount--; - return formattedSQL.toString(); - } - - @Override - public String visitDerivedColumns(final DerivedColumnsContext ctx) { - formatPrint("("); - int aliasCount = ctx.alias().size(); - for (int i = 0; i < aliasCount; i++) { - if (0 != i) { - formatPrint(", "); - } - visit(ctx.alias(i)); - } - formatPrint(")"); - return formattedSQL.toString(); - } - - @Override - public String visitOnDuplicateKeyClause(final OnDuplicateKeyClauseContext ctx) { - visit(ctx.ON()); - formatPrint(" "); - visit(ctx.DUPLICATE()); - formatPrint(" "); - visit(ctx.KEY()); - formatPrint(" "); - visit(ctx.UPDATE()); - formatPrint(" "); - indentCount++; - int assignmentCount = ctx.assignment().size(); - for (int i = 0; i < assignmentCount; i++) { - if (0 != i) { - formatPrintln(); - } - visit(ctx.assignment(i)); - } - indentCount--; - return formattedSQL.toString(); - } - - @Override - public String visitTableName(final TableNameContext ctx) { - if (null != ctx.owner()) { - formatPrint(ctx.owner().getText()); - formatPrint("."); - } - formatPrint(ctx.name().getText()); - return formattedSQL.toString(); - } - - @Override - public String visitTableValueConstructor(final TableValueConstructorContext ctx) { - formatPrint("VALUES "); - visit(ctx.rowConstructorList()); - return formattedSQL.toString(); - } - - @Override - public String visitAlterTable(final AlterTableContext ctx) { - visit(ctx.ALTER()); - formatPrint(" "); - visit(ctx.TABLE()); - formatPrint(" "); - visit(ctx.tableName()); - if (null != ctx.alterTableActions()) { - indentCount++; - formatPrintln(); - visit(ctx.alterTableActions()); - indentCount--; - } else if (null != ctx.standaloneAlterTableAction()) { - indentCount++; - formatPrintln(); - visit(ctx.standaloneAlterTableAction()); - indentCount--; - } - return formattedSQL.toString(); - } - - @Override - public String visitAlterTableActions(final AlterTableActionsContext ctx) { - if (null != ctx.alterCommandList()) { - visit(ctx.alterCommandList()); - if (null != ctx.alterTablePartitionOptions()) { - formatPrintln(); - visit(ctx.alterTablePartitionOptions()); - } - } else { - visit(ctx.alterTablePartitionOptions()); - } - return formattedSQL.toString(); - } - - @Override - public String visitAlterCommandList(final AlterCommandListContext ctx) { - if (null != ctx.alterCommandsModifierList()) { - visit(ctx.alterCommandsModifierList()); - if (null != ctx.alterList()) { - formatPrintln(","); - visit(ctx.alterList()); - } - } else if (null != ctx.alterList()) { - visit(ctx.alterList()); - } - return formattedSQL.toString(); - } - - @Override - public String visitAlterList(final AlterListContext ctx) { - int childCount = ctx.getChildCount(); - for (int i = 0; i < childCount; i++) { - ParseTree child = ctx.getChild(i); - if (i == 0) { - child.accept(this); - } else { - if (child instanceof TerminalNode) { - formatPrintln(","); - } else { - child.accept(this); - } - } - } - return formattedSQL.toString(); - } - - @Override - public String visitCreateTableOptionsSpaceSeparated(final CreateTableOptionsSpaceSeparatedContext ctx) { - int childCount = ctx.getChildCount(); - for (int i = 0; i < childCount; i++) { - if (0 != i) { - formatPrintln(); - } - visit(ctx.getChild(i)); - } - return formattedSQL.toString(); - } - - @Override - public String visitStandaloneAlterTableAction(final StandaloneAlterTableActionContext ctx) { - if (null != ctx.alterCommandsModifierList()) { - visit(ctx.alterCommandsModifierList()); - formatPrintln(","); - } - visit(ctx.standaloneAlterCommands()); - return formattedSQL.toString(); - } - - @Override - public String visitRowConstructorList(final RowConstructorListContext ctx) { - int rowCount = ctx.assignmentValues().size(); - for (int i = 0; i < rowCount; i++) { - if (0 != i) { - formatPrintln(","); - } - visit(ctx.ROW(i)); - formatPrint(" "); - visit(ctx.assignmentValues(i)); - } - return formattedSQL.toString(); - } - - @Override - public String visitAssignmentValues(final AssignmentValuesContext ctx) { - formatPrint("("); - int assignCount = ctx.assignmentValue().size(); - for (int i = 0; i < assignCount; i++) { - if (i != 0) { - formatPrint(", "); - } - visit(ctx.assignmentValue(i)); - } - formatPrint(")"); - return formattedSQL.toString(); - } - - @Override - public String visitWhereClause(final WhereClauseContext ctx) { - visit(ctx.WHERE()); - formatPrint(" "); - indentCount++; - formatPrintln(); - visit(ctx.expr()); - indentCount--; - return formattedSQL.toString(); - } - - @Override - public String visitExpr(final ExprContext ctx) { - if (null != ctx.andOperator()) { - visitLogicalOperator(ctx, ctx.andOperator().getText()); - } else if (null != ctx.orOperator()) { - visitLogicalOperator(ctx, ctx.orOperator().getText()); - } else if (null != ctx.notOperator()) { - formatPrint(ctx.notOperator().getText()); - visit(ctx.expr(0)); - } else { - visitChildren(ctx); - } - return formattedSQL.toString(); - } - - private void visitLogicalOperator(final ExprContext ctx, final String operator) { - ExprContext left = ctx.expr(0); - visit(left); - formatPrintln(); - ExprContext right = ctx.expr(1); - formatPrint(operator); - formatPrint(" "); - visit(right); - } - - @Override - public String visitAlias(final AliasContext ctx) { - formatPrint(ctx.getText()); - return formattedSQL.toString(); - } - - @Override - public String visitProjections(final ProjectionsContext ctx) { - indentCount++; - if (null != ctx.unqualifiedShorthand()) { - visit(ctx.unqualifiedShorthand()); - formattedSQL.append(' '); - } - int projectionCount = ctx.projection().size(); - int lineItemCount = 0; - for (int i = 0; i < projectionCount; i++) { - if (0 != i) { - formattedSQL.append(", "); - if (lineItemCount >= projectionsCountOfLine) { - lineItemCount = 0; - formatPrintln(); - } - } - visit(ctx.projection(i)); - lineItemCount++; - } - indentCount--; - return formattedSQL.toString(); - } - - @Override - public String visitProjection(final ProjectionContext ctx) { - if (null != ctx.expr()) { - visit(ctx.expr()); - formatPrint(" "); - } - if (null != ctx.AS()) { - formatPrint("AS "); - } - if (null != ctx.alias()) { - visit(ctx.alias()); - } - if (null != ctx.qualifiedShorthand()) { - visit(ctx.qualifiedShorthand()); - } - return formattedSQL.toString(); - } - - @Override - public String visitCreateDefinitionClause(final CreateDefinitionClauseContext ctx) { - indentCount++; - formatPrint("("); - formatPrintln(); - visit(ctx.tableElementList()); - formatPrint("\n"); - formatPrint(")"); - indentCount--; - return formattedSQL.toString(); - } - - @Override - public String visitTableElementList(final TableElementListContext ctx) { - int tableElementCount = ctx.tableElement().size(); - for (int i = 0; i < tableElementCount; i++) { - if (0 != i) { - formatPrintln(","); - } - visit(ctx.tableElement(i)); - } - return formattedSQL.toString(); - } - - @Override - public String visitFieldLength(final FieldLengthContext ctx) { - formatPrint("("); - formatPrint(ctx.NUMBER_().getText()); - formatPrint(")"); - return formattedSQL.toString(); - } - - @Override - public String visitPrecision(final PrecisionContext ctx) { - formatPrint("("); - formatPrint(ctx.NUMBER_(0).getText()); - formatPrint(", "); - formatPrint(ctx.NUMBER_(1).getText()); - formatPrint(")"); - return super.visitPrecision(ctx); - } - - @Override - public String visitTypeDatetimePrecision(final TypeDatetimePrecisionContext ctx) { - formatPrint("("); - formatPrint(ctx.NUMBER_().getText()); - formatPrint(")"); - return formattedSQL.toString(); - } - - @Override - public String visitDataType(final DataTypeContext ctx) { - int childCount = ctx.getChildCount(); - for (int i = 0; i < childCount; i++) { - ParseTree child = ctx.getChild(i); - if (0 != i && !DATA_TYPE_EXTRA_DESCRIPTION_CONTEXT_CLASSES.contains(child.getClass())) { - formatPrint(" "); - } - child.accept(this); - } - return formattedSQL.toString(); - } - - @Override - public String visitStringList(final StringListContext ctx) { - int stringCount = ctx.textString().size(); - formatPrint("("); - for (int i = 0; i < stringCount; i++) { - if (0 == i) { - formatPrint(ctx.textString(i).getText()); - } else { - formatPrintln(","); - visit(ctx.textString(i)); - } - } - formatPrint(")"); - return formattedSQL.toString(); - } - - @Override - public String visitUserVariable(final UserVariableContext ctx) { - formatPrint("@"); - visit(ctx.textOrIdentifier()); - return formattedSQL.toString(); - } - - @Override - public String visitSystemVariable(final SystemVariableContext ctx) { - formatPrint("@@"); - if (null != ctx.systemVariableScope) { - formatPrint(upperCase ? ctx.systemVariableScope.getText().toUpperCase() : ctx.systemVariableScope.getText().toLowerCase()); - formatPrint("."); - } - visit(ctx.rvalueSystemVariable().textOrIdentifier()); - if (null != ctx.rvalueSystemVariable().DOT_()) { - formatPrint("."); - visit(ctx.rvalueSystemVariable().identifier()); - } - return formattedSQL.toString(); - } - - @Override - public String visitTerminal(final TerminalNode node) { - if ("<EOF>".equals(node.getText())) { - return formattedSQL.toString(); - } - formatPrint(upperCase ? node.getText().toUpperCase() : node.getText().toLowerCase()); - return formattedSQL.toString(); - } - - @Override - public String visitIdentifier(final IdentifierContext ctx) { - formatPrint(ctx.getText()); - return formattedSQL.toString(); - } - - @Override - public String visitLiterals(final LiteralsContext ctx) { - if (parameterized) { - formatPrint("?"); - } else { - super.visitLiterals(ctx); - } - return formattedSQL.toString(); - } - - @Override - public String visitTemporalLiterals(final TemporalLiteralsContext ctx) { - visit(ctx.getChild(0)); - formatPrint(ctx.textString().getText()); - return formattedSQL.toString(); - } - - @Override - public String visitStringLiterals(final StringLiteralsContext ctx) { - if (parameterized) { - formatPrint("?"); - return formattedSQL.toString(); - } - if (null == ctx.string_()) { - visit(ctx.NCHAR_TEXT()); - } else { - if (null != ctx.UNDERSCORE_CHARSET()) { - formatPrint(ctx.UNDERSCORE_CHARSET().getText()); - } - ctx.string_().forEach(this::visit); - } - return formattedSQL.toString(); - } - - @Override - public String visitString_(final String_Context ctx) { - formatPrint(ctx.getText()); - return formattedSQL.toString(); - } - - @Override - public String visitNumberLiterals(final NumberLiteralsContext ctx) { - formatPrint(parameterized ? "?" : ctx.getText()); - return formattedSQL.toString(); - } - - @Override - public String visitWithClause(final WithClauseContext ctx) { - formatPrint("WITH "); - if (null != ctx.RECURSIVE()) { - visit(ctx.RECURSIVE()); - formattedSQL.append(' '); - } - for (int i = 0; i < ctx.cteClause().size(); i++) { - if (i != 0 && i < ctx.cteClause().size() - 1) { - formattedSQL.append(", "); - } - visit(ctx.cteClause(i)); - } - if (null != ctx.parent) { - formattedSQL.append('\n'); - } - return formattedSQL.toString(); - } - - @Override - public String visitCteClause(final CteClauseContext ctx) { - visit(ctx.alias()); - formattedSQL.append(' '); - if (null != ctx.columnNames()) { - visit(ctx.columnNames()); - formattedSQL.append(' '); - } - formattedSQL.append("AS "); - visit(ctx.subquery()); - return formattedSQL.toString(); - } - - @Override - public String visitColumnNames(final ColumnNamesContext ctx) { - int columnCount = ctx.columnName().size(); - for (int i = 0; i < columnCount; i++) { - if (i != 0 && i < columnCount - 1) { - formattedSQL.append(", "); - } else { - visit(ctx.columnName(i)); - } - } - return formattedSQL.toString(); - } - - @Override - public String visitChildren(final RuleNode node) { - String result = defaultResult(); - int childCount = node.getChildCount(); - for (int i = 0; i < childCount; i++) { - if (0 != i) { - String previousText = node.getChild(i - 1).getText(); - String text = node.getChild(i).getText(); - if (!"(".equals(previousText) && !".".equals(previousText) && !")".equals(text) && !"(".equals(text) && !".".equals(text)) { - formatPrint(" "); - } - } - if (!shouldVisitNextChild(node, result)) { - break; - } - ParseTree child = node.getChild(i); - String childResult = child.accept(this); - result = aggregateResult(result, childResult); - } - return result; - } - - private void formatPrint(final char value) { - formattedSQL.append(value); - } - - private void formatPrint(final String text) { - formattedSQL.append(text); - } - - private void formatPrintIndent() { - for (int i = 0; i < indentCount; ++i) { - formattedSQL.append('\t'); - } - } - - private void formatPrintln() { - formatPrint('\n'); - formatPrintIndent(); - } - - private void formatPrintln(final String text) { - formatPrint(text); - formatPrint('\n'); - formatPrintIndent(); - } - - @Override - public String getDatabaseType() { - return "MySQL"; - } -} diff --git a/parser/sql/dialect/mysql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.api.visitor.format.SQLFormatVisitor b/parser/sql/dialect/mysql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.api.visitor.format.SQLFormatVisitor deleted file mode 100644 index 67f7326865c..00000000000 --- a/parser/sql/dialect/mysql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.api.visitor.format.SQLFormatVisitor +++ /dev/null @@ -1,18 +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. -# - -org.apache.shardingsphere.sql.parser.mysql.visitor.format.MySQLFormatVisitor diff --git a/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitorIT.java b/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitorIT.java deleted file mode 100644 index 1265a6a90bf..00000000000 --- a/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/MySQLFormatVisitorIT.java +++ /dev/null @@ -1,146 +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.mysql.visitor.format; - -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.sql.parser.api.CacheOption; -import org.apache.shardingsphere.sql.parser.api.SQLFormatEngine; -import org.apache.shardingsphere.test.util.PropertiesBuilder; -import org.apache.shardingsphere.test.util.PropertiesBuilder.Property; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; -import org.junit.jupiter.params.provider.ArgumentsSource; - -import java.util.stream.Stream; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -class MySQLFormatVisitorIT { - - @ParameterizedTest(name = "{0}") - @ArgumentsSource(TestCaseArgumentsProvider.class) - void assertSQLFormat(final String caseId, final String inputSQL, final String expectFormattedSQL, final String expectFormattedParameterizedSQL) { - SQLFormatEngine sqlFormatEngine = new SQLFormatEngine(TypedSPILoader.getService(DatabaseType.class, "MySQL"), new CacheOption(1, 1L)); - assertThat(sqlFormatEngine.format(inputSQL, false, PropertiesBuilder.build(new Property("parameterized", Boolean.FALSE.toString()))), is(expectFormattedSQL)); - assertThat(sqlFormatEngine.format(inputSQL, false, PropertiesBuilder.build(new Property("parameterized", Boolean.TRUE.toString()))), is(expectFormattedParameterizedSQL)); - } - - private static class TestCaseArgumentsProvider implements ArgumentsProvider { - - @Override - public Stream<? extends Arguments> provideArguments(final ExtensionContext extensionContext) { - return Stream.of(Arguments.of("select_with_union", - "select a+1 as b, name n from table1 join table2 where id=1 and name='lu';", - "SELECT a + 1 AS b, name n\nFROM table1 JOIN table2\nWHERE \n\tid = 1\n\tand name = 'lu';", - "SELECT a + ? AS b, name n\nFROM table1 JOIN table2\nWHERE \n\tid = ?\n\tand name = ?;"), - Arguments.of("select_item_nums", - "select id, name, age, sex, ss, yy from table1 where id=1", - "SELECT id , name , age , \n\tsex , ss , yy \nFROM table1\nWHERE \n\tid = 1;", - "SELECT id , name , age , \n\tsex , ss , yy \nFROM table1\nWHERE \n\tid = ?;"), - Arguments.of("select_with_subquery", - "select id, name, age, count(*) as n, (select id, name, age, sex from table2 where id=2) as sid, yyyy from table1 where id=1", - "SELECT id , name , age , \n\tCOUNT(*) AS n, \n\t(\n\t\tSELECT id , name , age , \n\t\t\tsex \n\t\t" - + "FROM table2\n\t\tWHERE \n\t\t\tid = 2\n\t) AS sid, yyyy \nFROM table1\nWHERE \n\tid = 1;", - "SELECT id , name , age , \n\tCOUNT(*) AS n, \n\t(\n\t\tSELECT id , name , age , \n\t\t\tsex \n\t\t" - + "FROM table2\n\t\tWHERE \n\t\t\tid = ?\n\t) AS sid, yyyy \nFROM table1\nWHERE \n\tid = ?;"), - Arguments.of("select_where_num", - "select id, name, age, sex, ss, yy from table1 where id=1 and name=1 and a=1 and b=2 and c=4 and d=3", - "SELECT id , name , age , \n\tsex , ss , yy \nFROM table1\nWHERE \n\tid = 1\n\tand name = 1\n\tand a = 1\n\tand b = 2\n\tand c = 4\n\tand d = 3;", - "SELECT id , name , age , \n\tsex , ss , yy \nFROM table1\nWHERE \n\tid = ?\n\tand name = ?\n\tand a = ?\n\tand b = ?\n\tand c = ?\n\tand d = ?;"), - Arguments.of("alter_table", - "ALTER TABLE t_order ADD column4 DATE, ADD column5 DATETIME, engine ss max_rows 10,min_rows 2, ADD column6 TIMESTAMP, ADD column7 TIME;", - "ALTER TABLE t_order\n\tADD column4 DATE,\n\tADD column5 DATETIME,\n\tENGINE ss\n\tMAX_ROWS 10,\n\tMIN_ROWS 2,\n\tADD column6 TIMESTAMP,\n\tADD column7 TIME", - "ALTER TABLE t_order\n\tADD column4 DATE,\n\tADD column5 DATETIME,\n\tENGINE ss\n\tMAX_ROWS 10,\n\tMIN_ROWS 2,\n\tADD column6 TIMESTAMP,\n\tADD column7 TIME"), - Arguments.of("create_table", - "CREATE TABLE IF NOT EXISTS `runoob_tbl`(\n" - + "`runoob_id` INT UNSIGNED AUTO_INCREMENT,\n" - + "`runoob_title` VARCHAR(100) NOT NULL,\n" - + "`runoob_author` VARCHAR(40) NOT NULL,\n" - + "`runoob_test` NATIONAL CHAR(40),\n" - + "`submission_date` DATE,\n" - + "PRIMARY KEY (`runoob_id`)\n" - + ")ENGINE=InnoDB DEFAULT CHARSET=utf8;", - "CREATE TABLE IF NOT EXISTS `runoob_tbl` (\n" - + "\t`runoob_id` INT UNSIGNED AUTO_INCREMENT,\n" - + "\t`runoob_title` VARCHAR(100) NOT NULL,\n" - + "\t`runoob_author` VARCHAR(40) NOT NULL,\n" - + "\t`runoob_test` NATIONAL CHAR(40),\n" - + "\t`submission_date` DATE,\n" - + "\tPRIMARY KEY (`runoob_id`)\n" - + ") ENGINE = InnoDB DEFAULT CHARSET = utf8", - "CREATE TABLE IF NOT EXISTS `runoob_tbl` (\n" - + "\t`runoob_id` INT UNSIGNED AUTO_INCREMENT,\n" - + "\t`runoob_title` VARCHAR(100) NOT NULL,\n" - + "\t`runoob_author` VARCHAR(40) NOT NULL,\n" - + "\t`runoob_test` NATIONAL CHAR(40),\n" - + "\t`submission_date` DATE,\n" - + "\tPRIMARY KEY (`runoob_id`)\n" - + ") ENGINE = InnoDB DEFAULT CHARSET = utf8"), - Arguments.of("insert_with_muti_value", - "INSERT INTO t_order_item(order_id, user_id, status, creation_date) values (1, 1, 'insert', '2017-08-08'), " - + "(2, 2, 'insert', '2017-08-08') ON DUPLICATE KEY UPDATE status = 'init'", - "INSERT INTO t_order_item (order_id , user_id , status , creation_date)\nVALUES\n\t(1, 1, 'insert', '2017-08-08'),\n" - + "\t(2, 2, 'insert', '2017-08-08')\nON DUPLICATE KEY UPDATE status = 'init'", - "INSERT INTO t_order_item (order_id , user_id , status , creation_date)\nVALUES\n\t(?, ?, ?, ?),\n" - + "\t(?, ?, ?, ?)\nON DUPLICATE KEY UPDATE status = ?"), - Arguments.of("insert_with_muti_set", - "INSERT INTO t_order SET order_id = 1, user_id = 1, status = convert(to_base64(aes_encrypt(1, 'key')) USING utf8) ON DUPLICATE KEY UPDATE status = VALUES(status)", - "INSERT INTO t_order SET order_id = 1,\n\tuser_id = 1,\n\tstatus = CONVERT(to_base64(aes_encrypt(1 , 'key')) USING utf8)\n" - + "ON DUPLICATE KEY UPDATE status = VALUES(status)", - "INSERT INTO t_order SET order_id = ?,\n\tuser_id = ?,\n\tstatus = CONVERT(to_base64(aes_encrypt(? , ?)) USING utf8)\n" - + "ON DUPLICATE KEY UPDATE status = VALUES(status)"), - Arguments.of("insert_with_select", - "INSERT INTO t_order (order_id, user_id, status) SELECT order_id, user_id, status FROM t_order WHERE order_id = 1", - "INSERT INTO t_order (order_id , user_id , status) \nSELECT order_id , user_id , status \nFROM t_order\nWHERE \n\torder_id = 1;", - "INSERT INTO t_order (order_id , user_id , status) \nSELECT order_id , user_id , status \nFROM t_order\nWHERE \n\torder_id = ?;"), - // TODO fix only comment parse - // Arguments.of("only_comment", "/* c_zz_xdba_test_4 login */", "", ""), - Arguments.of("select_with_Variable", - "SELECT @@SESSION.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, " - + "@@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, " - + "@@collation_server AS collation_server, @@collation_connection AS collation_connection, " - + "@@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, " - + "@@license AS license, @@lower_case_table_names AS lower_case_table_names, " - + "@@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, " - + "@@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, " - + "@@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout", - "SELECT " - + "@@SESSION.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, " - + "@@character_set_connection AS character_set_connection, \n" - + "\t@@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, \n" - + "\t@@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, \n" - + "\t@@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, \n" - + "\t@@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, \n" - + "\t@@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, \n" - + "\t@@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout;", - "SELECT " - + "@@SESSION.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, " - + "@@character_set_connection AS character_set_connection, \n" - + "\t@@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, \n" - + "\t@@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, \n" - + "\t@@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, \n" - + "\t@@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, \n" - + "\t@@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, \n" - + "\t@@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout;")); - } - } -} diff --git a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLFormatEngine.java b/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLFormatEngine.java deleted file mode 100644 index 284e2f8c19a..00000000000 --- a/parser/sql/engine/src/main/java/org/apache/shardingsphere/sql/parser/api/SQLFormatEngine.java +++ /dev/null @@ -1,55 +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.api; - -import lombok.RequiredArgsConstructor; -import org.antlr.v4.runtime.tree.ParseTree; -import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.sql.parser.api.visitor.format.SQLFormatVisitor; - -import java.util.Properties; - -/** - * SQL format engine. - */ -@RequiredArgsConstructor -public final class SQLFormatEngine { - - private final DatabaseType databaseType; - - private final CacheOption cacheOption; - - public SQLFormatEngine(final String databaseType, final CacheOption cacheOption) { - this(TypedSPILoader.getService(DatabaseType.class, databaseType), cacheOption); - } - - /** - * Format SQL. - * - * @param sql SQL to be formatted - * @param useCache whether to use cache - * @param props properties - * @return formatted SQL - */ - public String format(final String sql, final boolean useCache, final Properties props) { - ParseTree parseTree = new SQLParserEngine(databaseType, cacheOption).parse(sql, useCache).getRootNode(); - return DatabaseTypedSPILoader.getService(SQLFormatVisitor.class, databaseType, props).visit(parseTree); - } -} diff --git a/parser/sql/spi/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/format/SQLFormatVisitor.java b/parser/sql/spi/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/format/SQLFormatVisitor.java deleted file mode 100644 index 677ef08735c..00000000000 --- a/parser/sql/spi/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/format/SQLFormatVisitor.java +++ /dev/null @@ -1,27 +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.api.visitor.format; - -import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI; -import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitor; - -/** - * SQL format visitor. - */ -public interface SQLFormatVisitor extends SQLVisitor<String>, DatabaseTypedSPI { -} diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/FormatSQLExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/FormatSQLExecutor.java deleted file mode 100644 index ca21dbf9030..00000000000 --- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/FormatSQLExecutor.java +++ /dev/null @@ -1,63 +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.proxy.backend.handler.distsql.rul; - -import lombok.Setter; -import org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorConnectionContextAware; -import org.apache.shardingsphere.distsql.handler.engine.DistSQLConnectionContext; -import org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor; -import org.apache.shardingsphere.distsql.statement.rul.sql.FormatStatement; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow; -import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.sql.parser.api.CacheOption; -import org.apache.shardingsphere.sql.parser.api.SQLFormatEngine; - -import java.util.Collection; -import java.util.Collections; -import java.util.Properties; - -/** - * Format SQL executor. - */ -@Setter -public final class FormatSQLExecutor implements DistSQLQueryExecutor<FormatStatement>, DistSQLExecutorConnectionContextAware { - - private DistSQLConnectionContext connectionContext; - - @Override - public Collection<String> getColumnNames(final FormatStatement sqlStatement) { - return Collections.singleton("formatted_result"); - } - - @Override - public Collection<LocalDataQueryResultRow> getRows(final FormatStatement sqlStatement, final ContextManager contextManager) { - return Collections.singleton(new LocalDataQueryResultRow(formatSQL(sqlStatement.getSql(), connectionContext.getProtocolType()))); - } - - private Object formatSQL(final String sql, final DatabaseType databaseType) { - Properties props = new Properties(); - props.setProperty("parameterized", Boolean.FALSE.toString()); - return new SQLFormatEngine(databaseType, new CacheOption(1, 1L)).format(sql, false, props); - } - - @Override - public Class<FormatStatement> getType() { - return FormatStatement.class; - } -} diff --git a/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor b/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor index 342bc5f31f8..adb3a065fd1 100644 --- a/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor +++ b/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor @@ -25,6 +25,5 @@ org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.yaml.Conve org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.variable.ShowDistVariableExecutor org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.variable.ShowDistVariablesExecutor org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.export.ShowTableMetaDataExecutor -org.apache.shardingsphere.proxy.backend.handler.distsql.rul.FormatSQLExecutor org.apache.shardingsphere.proxy.backend.handler.distsql.rul.ParseDistSQLExecutor org.apache.shardingsphere.proxy.backend.handler.distsql.rul.PreviewExecutor diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/FormatSQLExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/FormatSQLExecutorTest.java deleted file mode 100644 index cbb527eee78..00000000000 --- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/FormatSQLExecutorTest.java +++ /dev/null @@ -1,64 +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.proxy.backend.handler.distsql.rul; - -import org.apache.shardingsphere.distsql.statement.rul.sql.FormatStatement; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; -import org.apache.shardingsphere.mode.manager.ContextManager; -import org.apache.shardingsphere.proxy.backend.context.ProxyContext; -import org.apache.shardingsphere.proxy.backend.handler.distsql.DistSQLQueryBackendHandler; -import org.apache.shardingsphere.proxy.backend.session.ConnectionSession; -import org.apache.shardingsphere.test.mock.AutoMockExtension; -import org.apache.shardingsphere.test.mock.StaticMockSettings; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.mockito.Mock; - -import java.sql.SQLException; -import java.util.LinkedList; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.when; - -@ExtendWith(AutoMockExtension.class) -@StaticMockSettings(ProxyContext.class) -class FormatSQLExecutorTest { - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private ContextManager contextManager; - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private ConnectionSession connectionSession; - - @Test - void assertExecute() throws SQLException { - String sql = "SELECT * FROM t_order WHERE order_id=1"; - when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager); - when(connectionSession.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "MySQL")); - DistSQLQueryBackendHandler handler = new DistSQLQueryBackendHandler(new FormatStatement(sql), connectionSession); - handler.execute(); - handler.next(); - assertThat(new LinkedList<>(handler.getRowData().getData()).getFirst(), is("SELECT * \n" - + "FROM t_order\n" - + "WHERE \n" - + "\torder_id = 1;")); - } -} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/RULStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/RULStatementAssert.java index ea7a3a99eaa..cf57614c33a 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/RULStatementAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/RULStatementAssert.java @@ -20,15 +20,12 @@ package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement. import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.shardingsphere.distsql.statement.rul.RULStatement; -import org.apache.shardingsphere.distsql.statement.rul.sql.FormatStatement; import org.apache.shardingsphere.distsql.statement.rul.sql.ParseStatement; import org.apache.shardingsphere.distsql.statement.rul.sql.PreviewStatement; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; -import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.rul.type.FormatSQLStatementAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.rul.type.ParseStatementAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.rul.type.PreviewStatementAssert; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase; -import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.FormatSQLStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.ParseStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.PreviewStatementTestCase; @@ -50,8 +47,6 @@ public final class RULStatementAssert { PreviewStatementAssert.assertIs(assertContext, (PreviewStatement) actual, (PreviewStatementTestCase) expected); } else if (actual instanceof ParseStatement) { ParseStatementAssert.assertIs(assertContext, (ParseStatement) actual, (ParseStatementTestCase) expected); - } else if (actual instanceof FormatStatement) { - FormatSQLStatementAssert.assertIs(assertContext, (FormatStatement) actual, (FormatSQLStatementTestCase) expected); } } } diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/type/FormatSQLStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/type/FormatSQLStatementAssert.java deleted file mode 100644 index 1038fe9a781..00000000000 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/rul/type/FormatSQLStatementAssert.java +++ /dev/null @@ -1,48 +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.test.it.sql.parser.internal.asserts.statement.rul.type; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.shardingsphere.distsql.statement.rul.sql.FormatStatement; -import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext; -import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ExistingAssert; -import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.FormatSQLStatementTestCase; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -/** - * Format SQL statement assert. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class FormatSQLStatementAssert { - - /** - * Assert format SQL statement is correct with expected parser result. - * - * @param assertContext assert context - * @param actual actual format SQL statement - * @param expected expected format SQL statement test case - */ - public static void assertIs(final SQLCaseAssertContext assertContext, final FormatStatement actual, final FormatSQLStatementTestCase expected) { - if (ExistingAssert.assertIs(assertContext, actual, expected)) { - assertThat(assertContext.getText("SQL assertion error"), actual.getSql(), is(expected.getSql())); - } - } -} diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java index 0d6471aa7e9..fc49d4b3959 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java @@ -431,7 +431,6 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rql.storage.unit.ShowRulesUsedStorageUnitStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rql.storage.unit.ShowStorageUnitsStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rql.table.ShowTableStatementTestCase; -import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.FormatSQLStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.ParseStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul.PreviewStatementTestCase; import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.tcl.BeginTransactionStatementTestCase; @@ -1071,9 +1070,6 @@ public final class RootSQLParserTestCases { @XmlElement(name = "parse-sql") private final List<ParseStatementTestCase> parseStatementAsserts = new LinkedList<>(); - @XmlElement(name = "format-sql") - private final List<FormatSQLStatementTestCase> formatSQLStatementAsserts = new LinkedList<>(); - @XmlElement(name = "show-dist-variable") private final List<ShowDistVariableStatementTestCase> showVariableTestCases = new LinkedList<>(); diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/rul/FormatSQLStatementTestCase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/rul/FormatSQLStatementTestCase.java deleted file mode 100644 index 7b3734385e0..00000000000 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/rul/FormatSQLStatementTestCase.java +++ /dev/null @@ -1,35 +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.test.it.sql.parser.internal.cases.parser.jaxb.statement.rul; - -import lombok.Getter; -import lombok.Setter; -import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase; - -import javax.xml.bind.annotation.XmlAttribute; - -/** - * Format SQL statement test case. - */ -@Getter -@Setter -public final class FormatSQLStatementTestCase extends SQLParserTestCase { - - @XmlAttribute - private String sql; -} diff --git a/test/it/parser/src/main/resources/case/rul/sql.xml b/test/it/parser/src/main/resources/case/rul/sql.xml index 636ef59142b..8f5a0e91d61 100644 --- a/test/it/parser/src/main/resources/case/rul/sql.xml +++ b/test/it/parser/src/main/resources/case/rul/sql.xml @@ -19,5 +19,4 @@ <sql-parser-test-cases> <preview-sql sql-case-id="preview-sql" sql="SELECT * FROM t_order;" /> <parse-sql sql-case-id="parse-sql" sql="SELECT * FROM t_order;" /> - <format-sql sql-case-id="format-sql" sql="SELECT * FROM t_order WHERE order_id=1;" /> </sql-parser-test-cases> diff --git a/test/it/parser/src/main/resources/sql/supported/rul/sql.xml b/test/it/parser/src/main/resources/sql/supported/rul/sql.xml index 192ca7f8495..6cc9406dae7 100644 --- a/test/it/parser/src/main/resources/sql/supported/rul/sql.xml +++ b/test/it/parser/src/main/resources/sql/supported/rul/sql.xml @@ -19,5 +19,4 @@ <sql-cases> <sql-case id="preview-sql" value="PREVIEW SELECT * FROM t_order;" db-types="ShardingSphere" /> <sql-case id="parse-sql" value="PARSE SELECT * FROM t_order;" db-types="ShardingSphere" /> - <sql-case id="format-sql" value="FORMAT SELECT * FROM t_order WHERE order_id=1;" db-types="ShardingSphere" /> </sql-cases>