From 4ca3b35e77462dfd823d2caca8c35e39ae948fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Wed, 17 Feb 2021 08:58:14 +0800 Subject: [PATCH] imporved pg parser --- pom.xml | 2 +- .../druid/sql/parser/SQLExprParser.java | 4 ++- .../druid/sql/parser/SQLStatementParser.java | 21 +++++++++++++- .../sql/visitor/SQLASTOutputVisitor.java | 4 ++- .../postgresql/PostgresqlResourceTest.java | 12 ++++++++ .../resources/bvt/parser/postgresql-10.txt | 20 +++++++++++++ .../resources/bvt/parser/postgresql-9.txt | 28 +++++++++++++++++++ 7 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/bvt/parser/postgresql-10.txt create mode 100644 src/test/resources/bvt/parser/postgresql-9.txt diff --git a/pom.xml b/pom.xml index a401328344..ea33441301 100644 --- a/pom.xml +++ b/pom.xml @@ -446,7 +446,7 @@ org.postgresql postgresql - 42.2.12 + 42.2.18 provided diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 588625778a..2b42fa5b77 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -4066,7 +4066,9 @@ public class SQLExprParser extends SQLParser { if (token != Token.SET // && token != Token.DROP && token != Token.PRIMARY - && token != Token.RPAREN) { + && token != Token.RPAREN + && token != Token.COMMA + ) { column.setDataType( parseDataType()); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 0e5d4a026d..fc25a35ac7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -1895,6 +1895,13 @@ public class SQLStatementParser extends SQLParser { if (lexer.token == Token.COLUMN) { SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); stmt.addItem(alterColumn); + + if (dbType == DbType.postgresql) { + if (lexer.token == Token.COMMA) { + lexer.nextToken(); + continue; + } + } } else if (lexer.token == Token.LITERAL_ALIAS) { SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); stmt.addItem(alterColumn); @@ -2381,7 +2388,13 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.token == Token.COLUMN) { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); - this.exprParser.names(item.getColumns()); + + if (dbType == DbType.postgresql) { + item.getColumns().add( + this.exprParser.name()); + } else { + this.exprParser.names(item.getColumns()); + } if (lexer.token == Token.CASCADE) { item.setCascade(true); @@ -2389,6 +2402,12 @@ public class SQLStatementParser extends SQLParser { } stmt.addItem(item); + + if (dbType == DbType.postgresql) { + if (lexer.token == Token.COMMA) { + lexer.nextToken(); + } + } } else if (lexer.token == Token.LITERAL_ALIAS) { SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 325f7e9b34..c45ac354f7 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -5424,7 +5424,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet SQLAlterTableItem item = x.getItems().get(i); if (i != 0) { SQLAlterTableItem former = x.getItems().get(i - 1); - if (this.dbType == DbType.hive && former instanceof SQLAlterTableAddPartition && item instanceof SQLAlterTableAddPartition) { + if (this.dbType == DbType.hive + && former instanceof SQLAlterTableAddPartition + && item instanceof SQLAlterTableAddPartition) { // ignore comma } else { print(','); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PostgresqlResourceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PostgresqlResourceTest.java index 996f6cef1d..3a6b3ff052 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PostgresqlResourceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PostgresqlResourceTest.java @@ -68,6 +68,18 @@ public class PostgresqlResourceTest extends PGTest { exec_test("bvt/parser/postgresql-7.txt"); } + public void test_8() throws Exception { + exec_test("bvt/parser/postgresql-8.txt"); + } + + public void test_9() throws Exception { + exec_test("bvt/parser/postgresql-9.txt"); + } + + public void test_10() throws Exception { + exec_test("bvt/parser/postgresql-10.txt"); + } + public void exec_test(String resource) throws Exception { System.out.println(resource); InputStream is = null; diff --git a/src/test/resources/bvt/parser/postgresql-10.txt b/src/test/resources/bvt/parser/postgresql-10.txt new file mode 100644 index 0000000000..b732f6de69 --- /dev/null +++ b/src/test/resources/bvt/parser/postgresql-10.txt @@ -0,0 +1,20 @@ +CREATE TABLE live_measures_copy (uuid, project_uuid, component_uuid, metric_uuid, value, text_value, variation, measure_data, update_marker, created_at, updated_at) AS (SELECT uuid, project_uuid, component_uuid, CAST (metric_id AS VARCHAR (40)) AS metric_uuid, value, text_value, variation, measure_data, update_marker, created_at, updated_at FROM live_measures) +--------------------------- +CREATE TABLE live_measures_copy ( + uuid, + project_uuid, + component_uuid, + metric_uuid, + value, + text_value, + variation, + measure_data, + update_marker, + created_at, + updated_at +) +AS +SELECT uuid, project_uuid, component_uuid, CAST(metric_id AS VARCHAR(40)) AS metric_uuid, value + , text_value, variation, measure_data, update_marker, created_at + , updated_at +FROM live_measures \ No newline at end of file diff --git a/src/test/resources/bvt/parser/postgresql-9.txt b/src/test/resources/bvt/parser/postgresql-9.txt new file mode 100644 index 0000000000..b59e107f97 --- /dev/null +++ b/src/test/resources/bvt/parser/postgresql-9.txt @@ -0,0 +1,28 @@ +CREATE TABLE issue_changes_copy ( + uuid, kee, + issue_key, + user_login, + change_type, + change_data, + created_at, + updated_at, + issue_change_creation_date +) +AS ( + SELECT CAST (id AS VARCHAR (40)) AS uuid, kee, issue_key, user_login, change_type, change_data, created_at, updated_at, issue_change_creation_date FROM issue_changes) +--------------------------- +CREATE TABLE issue_changes_copy ( + uuid, + kee, + issue_key, + user_login, + change_type, + change_data, + created_at, + updated_at, + issue_change_creation_date +) +AS +SELECT CAST(id AS VARCHAR(40)) AS uuid, kee, issue_key, user_login, change_type + , change_data, created_at, updated_at, issue_change_creation_date +FROM issue_changes \ No newline at end of file