From aad886f314a3c6f920bc2fe7dcea4db8fe3b6c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Wed, 27 Jan 2021 13:57:33 +0800 Subject: [PATCH] improved oracle parser, fix #4138 --- .../dialect/oracle/parser/OracleSelectParser.java | 3 ++- .../dialect/oracle/visitor/OracleOutputVisitor.java | 4 ++++ src/test/resources/bvt/parser/oracle-61.txt | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/bvt/parser/oracle-61.txt diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 633a59789e..3e14c570e5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -620,7 +620,8 @@ public class OracleSelectParser extends SQLSelectParser { tableSource = new OracleSelectSubqueryTableSource(select()); } else if (lexer.token() == Token.LPAREN) { tableSource = (OracleSelectTableSource) parseTableSource(); - } else if (lexer.token() == Token.IDENTIFIER) { + } else if (lexer.token() == Token.IDENTIFIER + || lexer.token() == Token.LITERAL_ALIAS) { SQLTableSource identTable = parseTableSource(); accept(Token.RPAREN); parsePivot((OracleSelectTableSource) identTable); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index eeb09b179f..3e2a6ed815 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -271,7 +271,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (right instanceof SQLJoinTableSource) { print('('); + incrementIndent(); + println(); right.accept(this); + decrementIndent(); + println(); print(')'); } else { right.accept(this); diff --git a/src/test/resources/bvt/parser/oracle-61.txt b/src/test/resources/bvt/parser/oracle-61.txt new file mode 100644 index 0000000000..7230ae9c66 --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-61.txt @@ -0,0 +1,12 @@ +SELECT * +FROM "CUSTOM_LABEL" "cl" +LEFT JOIN ( "CUSTOM_LABEL_BAK" "clb" +LEFT JOIN "DATA_SOURCE_INFO" "dsi" ON "clb"."CUSTOM_LABEL_VALUE" = "dsi"."REMARK" +) ON "cl"."ACCURACY_TYPE" = "clb"."CUSTOM_LABEL_NAME" +--------------------------- +SELECT * +FROM "CUSTOM_LABEL" "cl" + LEFT JOIN ( + "CUSTOM_LABEL_BAK" "clb" + LEFT JOIN "DATA_SOURCE_INFO" "dsi" ON "clb"."CUSTOM_LABEL_VALUE" = "dsi"."REMARK" + ) ON "cl"."ACCURACY_TYPE" = "clb"."CUSTOM_LABEL_NAME" \ No newline at end of file