From a312dcdc2d618f175fc56b59129edbe56aa97012 Mon Sep 17 00:00:00 2001 From: manticore-projects Date: Fri, 28 Apr 2023 02:38:24 +0700 Subject: [PATCH] Refactor Parenthesed SelectBody and FromItem (#1754) * Fixes #1684: Support CREATE MATERIALIZED VIEW with AUTO REFRESH Support parsing create view statements in Redshift with AUTO REFRESH option. * Reduce cyclomatic complexity in CreateView.toString Extract adding the force option into a dedicated method resulting in the cyclomatic complexity reduction of the CreateView.toString method. * Enhanced Keywords Add Keywords and document, which keywords are allowed for what purpose * Fix incorrect tests * Define Reserved Keywords explicitly Derive All Keywords from Grammar directly Generate production for Object Names (semi-) automatically Add parametrized Keyword Tests * Fix test resources * Adjust Gradle to JUnit 5 Parallel Test execution Gradle Caching Explicitly request for latest JavaCC 7.0.10 * Do not mark SpeedTest for concurrent execution * Remove unused imports * Adjust Gradle to JUnit 5 Parallel Test execution Gradle Caching Explicitly request for latest JavaCC 7.0.10 * Do not mark SpeedTest for concurrent execution * Remove unused imports * Sphinx Documentation Update the MANTICORE Sphinx Theme, but ignore it in GIT Add the content to the Sphinx sites Add a Gradle function to derive Stable and Snapshot version from GIT Tags Add a Gradle GIT change task Add a Gradle sphinx task Add a special Test case for illustrating the use of JSQLParser * doc: request for `Conventional Commit` messages * feat: make important Classes Serializable Implement Serializable for persisting via ObjectOutputStream * chore: Make Serializable * doc: Better integration of the RR diagrams - apply neutral Sphinx theme - insert the RR diagrams into the sphinx sources - better documentation on Gradle dependencies - link GitHub repository * Merge * feat: Oracle Alternative Quoting - add support for Oracle Alternative Quoting e.g. `q'(...)'` - fixes #1718 - add a Logo and FavIcon to the Website - document recent changes on Quoting/Escaping - add an example on building SQL from Java - rework the README.md, promote the Website - add Spotless Formatter, using Google Java Style (with Tab=4 Spaces) * style: Appease PMD/Codacy * doc: fix the issue template - fix the issue template - fix the -SNAPSHOT version number * Update issue templates * Update issue templates * feat: Support more Statement Separators - `GO` - Slash `/` - Two empty lines * feat: FETCH uses EXPRESSION - `FETCH` uses `EXPRESSION` instead of SimpleJDBCParameter only - Visit/Accept `FETCH` `EXPRESSION` instead of `append` to String - Visit/Accept `OFFSET` `EXPRESSION` instead of `append` to String - Gradle: remove obsolete/incompatible `jvmArgs` from Test() * style: apply Spotless * test: commit missing test * fix: JSon Operator can use Simple Function Supports `Function() ->> Literal` (although `Function()` would not allow Nested Expression Parameters) fixes #1571 * style: Reformat changed files and headers * style: Remove unused variable * feat: Add support for Hangul "\uAC00"-"\uD7A3" fixes #1747 * style: expose `SetStatement` key-value list fixes #1746 * style: Appease PMD/Codacy * feat: `ConflictTarget` allows multiple `IndexColumnNames` fixes #1749 fixes #1633 fixes #955 * doc: fix reference in the Java Doc * build: better Upload Groovy Task * feat: ParenthesedSelectBody and ParenthesedFromItem - First properly working version - Work in progress, 13 tests failing * feat: ParenthesedSelectBody and ParenthesedFromItem - delete unneeded ParenthesedJoin - rename ParenthesisFromItem into ParenthesedFromItem * feat: ParenthesedSelectBody and ParenthesedFromItem - fix `NULLS FIRST` and `NULLS LAST` * feat: ParenthesedSelectBody and ParenthesedFromItem - fix Oracle Hints * feat: ParenthesedSelectBody and ParenthesedFromItem - parse `SetOperation` only after a (first plain) SelectBody has found, this fixes the performance issue - one more special Oracle Test succeeds - 5 remaining test failures * feat: ParenthesedSelectBody and ParenthesedFromItem - extract `OrderByElements` into `SelectBody` - one more special Oracle Test succeeds - all tests succeed * style: Appease PMD/Codacy * style: Appease PMD/Codacy * feat: Refactor SelectBody implementations - `SelectBody` implements `FromItem` - get rid of `SubSelect` and `SpecialSubSelect` - `Merge` can use `FromItem` instead of `SubSelect` or `Table` - `LateralSubSelect` extends `ParenthesedSelectBody` directly - Simplify the `Select` statement, although it is still redundant since `SelectBody` also could implement `Statement` directly - `WithItem` can use `SelectBody` directly, which allows for nested `WithItems` BREAKING-CHANGE: Lots of redundant methods and intermediate removed * feat: Refactor SelectBody implementations - `SelectBody` implements `Statement` and so makes `Select` redundant - get rid of `ValuesList` - refactor `ValuesStatement` into `Values` which just implements `SelectBody` (and becomes a `Statement` and a `FromItem`), move to `select` package BREAKING-CHANGE: Lots of redundant methods and intermediate removed * style: Code cleanup - remove 3 unused/obsolete productions - appease PMD/Codacy * feat: Merge `SelectBody` into `Select` Statement - former `SelectBody` implements `Statement` and so becomes `Select` - this reduces the AST by 1 hierarchy level * style: Remove unused import * test: @Disabled invalid Test * style: Appease PMD/Codacy * test: Add a SubSelect Parsing Test --------- Co-authored-by: zaza --- README.md | 22 +- .../formatter/eclipse-java-google-style.xml | 2 +- .../expression/AnyComparisonExpression.java | 21 +- .../expression/ExpressionVisitor.java | 45 +- .../expression/ExpressionVisitorAdapter.java | 99 +- .../sf/jsqlparser/expression/OracleHint.java | 24 +- .../relational/ItemsListVisitor.java | 4 +- .../relational/ItemsListVisitorAdapter.java | 4 +- .../jsqlparser/parser/CCJSqlParserUtil.java | 124 +- .../sf/jsqlparser/parser/feature/Feature.java | 63 +- .../statement/StatementVisitor.java | 10 +- .../statement/StatementVisitorAdapter.java | 78 +- .../statement/create/view/AlterView.java | 31 +- .../jsqlparser/statement/insert/Insert.java | 110 +- .../sf/jsqlparser/statement/merge/Merge.java | 84 +- .../statement/select/FromItemVisitor.java | 8 +- .../select/FromItemVisitorAdapter.java | 16 +- .../sf/jsqlparser/statement/select/Join.java | 20 +- .../statement/select/LateralSubSelect.java | 51 +- .../statement/select/ParenthesedFromItem.java | 142 ++ .../statement/select/ParenthesedSelect.java | 81 + .../statement/select/ParenthesisFromItem.java | 89 -- .../jsqlparser/statement/select/PivotXml.java | 19 +- .../statement/select/PlainSelect.java | 326 +--- .../jsqlparser/statement/select/Select.java | 290 +++- .../statement/select/SelectBody.java | 17 - .../statement/select/SelectVisitor.java | 8 +- .../select/SelectVisitorAdapter.java | 14 +- .../statement/select/SetOperationList.java | 158 +- .../statement/select/SpecialSubSelect.java | 96 -- .../jsqlparser/statement/select/SubJoin.java | 143 -- .../statement/select/SubSelect.java | 186 --- .../Values.java} | 37 +- .../statement/select/ValuesList.java | 165 -- .../jsqlparser/statement/select/WithItem.java | 109 +- .../jsqlparser/statement/update/Update.java | 80 +- .../sf/jsqlparser/util/AddAliasesVisitor.java | 47 +- .../util/ConnectExpressionsVisitor.java | 42 +- .../net/sf/jsqlparser/util/SelectUtils.java | 25 +- .../sf/jsqlparser/util/TablesNamesFinder.java | 243 +-- .../util/deparser/AlterViewDeParser.java | 2 +- .../util/deparser/CreateViewDeParser.java | 19 +- .../util/deparser/ExpressionDeParser.java | 95 +- .../util/deparser/InsertDeParser.java | 63 +- .../util/deparser/ReplaceDeParser.java | 19 +- .../util/deparser/SelectDeParser.java | 285 ++-- .../util/deparser/StatementDeParser.java | 113 +- .../util/deparser/UpsertDeParser.java | 40 +- .../deparser/ValuesStatementDeParser.java | 6 +- .../validator/AbstractValidator.java | 211 +-- .../validator/AlterViewValidator.java | 2 +- .../validator/CreateViewValidator.java | 12 +- .../validator/ExpressionValidator.java | 12 +- .../validator/ItemsListValidator.java | 12 +- .../validation/validator/MergeValidator.java | 5 +- .../validation/validator/SelectValidator.java | 89 +- .../validator/StatementValidator.java | 36 +- .../validation/validator/UpdateValidator.java | 6 +- .../validation/validator/UpsertValidator.java | 5 +- .../validator/ValuesStatementValidator.java | 6 +- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 750 ++++----- src/site/sphinx/changelog.rst | 42 + src/site/sphinx/syntax.rst | 1416 ++++++++--------- src/site/sphinx/usage.rst | 2 +- .../ExpressionVisitorAdapterTest.java | 72 +- .../expression/LimitExpressionTest.java | 10 +- .../mysql/MySqlSqlCalcFoundRowsTest.java | 13 +- .../net/sf/jsqlparser/schema/TableTest.java | 14 +- .../sf/jsqlparser/statement/AdaptersTest.java | 30 +- .../builder/JSQLParserFluentModelTests.java | 54 +- .../builder/ReflectionModelTest.java | 122 +- .../statement/create/AlterViewTest.java | 11 +- .../statement/create/CreateViewTest.java | 23 +- .../statement/insert/InsertTest.java | 24 +- .../jsqlparser/statement/merge/MergeTest.java | 168 +- .../statement/select/FetchTest.java | 15 +- .../jsqlparser/statement/select/HiveTest.java | 34 +- .../jsqlparser/statement/select/KSQLTest.java | 102 +- .../select/NestedBracketsPerformanceTest.java | 158 +- .../statement/select/PostgresTest.java | 6 +- .../statement/select/SelectASTTest.java | 116 +- .../statement/select/SelectTest.java | 716 +++++---- .../statement/select/SpecialOracleTest.java | 344 ++-- .../statement/select/SpeedTest.java | 50 +- .../statement/upsert/UpsertTest.java | 61 +- .../statement/values/ValuesTest.java | 39 +- .../sf/jsqlparser/test/HowToUseSample.java | 41 +- .../net/sf/jsqlparser/test/TestUtils.java | 19 +- .../util/AddAliasesVisitorTest.java | 18 +- .../util/ConnectExpressionsVisitorTest.java | 10 +- .../sf/jsqlparser/util/SelectUtilsTest.java | 30 +- .../util/TablesNamesFinderTest.java | 196 ++- .../util/deparser/StatementDeParserTest.java | 163 +- .../validator/InsertValidatorTest.java | 32 +- .../select/oracle-tests/bindvar03.sql | 3 +- .../select/oracle-tests/cast_multiset07.sql | 3 +- .../select/oracle-tests/cast_multiset13.sql | 3 +- .../select/oracle-tests/cast_multiset14.sql | 3 +- .../select/oracle-tests/cast_multiset15.sql | 3 +- .../select/oracle-tests/cast_multiset39.sql | 3 +- .../select/oracle-tests/condition15.sql | 3 +- .../select/oracle-tests/insert04.sql | 3 +- .../select/oracle-tests/insert05.sql | 3 +- .../select/oracle-tests/insert06.sql | 3 +- .../select/oracle-tests/insert07.sql | 3 +- .../select/oracle-tests/insert08.sql | 3 +- .../select/oracle-tests/insert09.sql | 3 +- .../select/oracle-tests/insert10.sql | 3 +- 108 files changed, 4105 insertions(+), 5009 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java delete mode 100644 src/main/java/net/sf/jsqlparser/statement/select/ParenthesisFromItem.java delete mode 100644 src/main/java/net/sf/jsqlparser/statement/select/SelectBody.java delete mode 100644 src/main/java/net/sf/jsqlparser/statement/select/SpecialSubSelect.java delete mode 100644 src/main/java/net/sf/jsqlparser/statement/select/SubJoin.java delete mode 100644 src/main/java/net/sf/jsqlparser/statement/select/SubSelect.java rename src/main/java/net/sf/jsqlparser/statement/{values/ValuesStatement.java => select/Values.java} (61%) delete mode 100644 src/main/java/net/sf/jsqlparser/statement/select/ValuesList.java diff --git a/README.md b/README.md index 6e540e58c..aeef82101 100644 --- a/README.md +++ b/README.md @@ -19,22 +19,20 @@ SELECT 1 FROM dual WHERE a = b ```text SQL Text - └─Statements: net.sf.jsqlparser.statement.select.Select - └─selectBody: net.sf.jsqlparser.statement.select.PlainSelect - ├─selectItems -> Collection - │ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem - │ └─LongValue: 1 - ├─Table: dual - └─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo - ├─Column: a - └─Column: b + └─Statements: net.sf.jsqlparser.statement.select.PlainSelect + ├─selectItems -> Collection + │ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem + │ └─LongValue: 1 + ├─Table: dual + └─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo + ├─Column: a + └─Column: b ``` ```java Statement statement = CCJSqlParserUtil.parse(sqlStr); -if (statement instanceof Select) { - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); +if (statement instanceof PlainSelect) { + PlainSelect plainSelect = (PlainSelect) statement; SelectExpressionItem selectExpressionItem = (SelectExpressionItem) plainSelect.getSelectItems().get(0); diff --git a/config/formatter/eclipse-java-google-style.xml b/config/formatter/eclipse-java-google-style.xml index bb335f000..5f9965da0 100644 --- a/config/formatter/eclipse-java-google-style.xml +++ b/config/formatter/eclipse-java-google-style.xml @@ -65,7 +65,7 @@ - + diff --git a/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java b/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java index 01a770950..665bc8833 100644 --- a/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java +++ b/src/main/java/net/sf/jsqlparser/expression/AnyComparisonExpression.java @@ -11,7 +11,7 @@ import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; -import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; /** * Combines ANY and SOME expressions. @@ -22,10 +22,10 @@ public class AnyComparisonExpression extends ASTNodeAccessImpl implements Expres private final ItemsList itemsList; private boolean useBracketsForValues = false; - private final SubSelect subSelect; + private final ParenthesedSelect subSelect; private final AnyType anyType; - public AnyComparisonExpression(AnyType anyType, SubSelect subSelect) { + public AnyComparisonExpression(AnyType anyType, ParenthesedSelect subSelect) { this.anyType = anyType; this.subSelect = subSelect; this.itemsList = null; @@ -37,7 +37,7 @@ public AnyComparisonExpression(AnyType anyType, ItemsList itemsList) { this.subSelect = null; } - public SubSelect getSubSelect() { + public ParenthesedSelect getSubSelect() { return subSelect; } @@ -46,13 +46,13 @@ public ItemsList getItemsList() { } public boolean isUsingItemsList() { - return itemsList!=null; + return itemsList != null; } public boolean isUsingSubSelect() { - return subSelect!=null; + return subSelect != null; } - + public boolean isUsingBracketsForValues() { return useBracketsForValues; } @@ -77,11 +77,8 @@ public AnyType getAnyType() { @Override public String toString() { - String s = anyType.name() - + " (" - + ( subSelect!=null - ? subSelect.toString() - : "VALUES " + itemsList.toString()) + String s = anyType.name() + " (" + + (subSelect != null ? subSelect.toString() : "VALUES " + itemsList.toString()) + " )"; return s; } diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java index 36b7a44bb..ce4db3521 100644 --- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java +++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java @@ -9,15 +9,46 @@ */ package net.sf.jsqlparser.expression; -import net.sf.jsqlparser.expression.operators.arithmetic.*; +import net.sf.jsqlparser.expression.operators.arithmetic.Addition; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseRightShift; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor; +import net.sf.jsqlparser.expression.operators.arithmetic.Concat; +import net.sf.jsqlparser.expression.operators.arithmetic.Division; +import net.sf.jsqlparser.expression.operators.arithmetic.IntegerDivision; +import net.sf.jsqlparser.expression.operators.arithmetic.Modulo; +import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; +import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.conditional.XorExpression; -import net.sf.jsqlparser.expression.operators.relational.*; +import net.sf.jsqlparser.expression.operators.relational.Between; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; +import net.sf.jsqlparser.expression.operators.relational.FullTextSearch; +import net.sf.jsqlparser.expression.operators.relational.GeometryDistance; +import net.sf.jsqlparser.expression.operators.relational.GreaterThan; +import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression; +import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression; +import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; +import net.sf.jsqlparser.expression.operators.relational.JsonOperator; +import net.sf.jsqlparser.expression.operators.relational.LikeExpression; +import net.sf.jsqlparser.expression.operators.relational.Matches; +import net.sf.jsqlparser.expression.operators.relational.MinorThan; +import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; +import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; +import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator; +import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator; +import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.statement.select.AllColumns; import net.sf.jsqlparser.statement.select.AllTableColumns; -import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; +import net.sf.jsqlparser.statement.select.Select; public interface ExpressionVisitor { @@ -69,7 +100,7 @@ public interface ExpressionVisitor { void visit(Between between); - void visit (OverlapsCondition overlapsCondition); + void visit(OverlapsCondition overlapsCondition); void visit(EqualsTo equalsTo); @@ -93,9 +124,9 @@ public interface ExpressionVisitor { void visit(NotEqualsTo notEqualsTo); - void visit(Column tableColumn); + void visit(ParenthesedSelect selectBody); - void visit(SubSelect subSelect); + void visit(Column tableColumn); void visit(CaseExpression caseExpression); @@ -194,4 +225,6 @@ public interface ExpressionVisitor { void visit(IsDistinctExpression isDistinctExpression); void visit(GeometryDistance geometryDistance); + + void visit(Select selectBody); } diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java index 154adfa80..c410c57d2 100644 --- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java @@ -9,11 +9,45 @@ */ package net.sf.jsqlparser.expression; -import net.sf.jsqlparser.expression.operators.arithmetic.*; +import net.sf.jsqlparser.expression.operators.arithmetic.Addition; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseLeftShift; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseRightShift; +import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor; +import net.sf.jsqlparser.expression.operators.arithmetic.Concat; +import net.sf.jsqlparser.expression.operators.arithmetic.Division; +import net.sf.jsqlparser.expression.operators.arithmetic.IntegerDivision; +import net.sf.jsqlparser.expression.operators.arithmetic.Modulo; +import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; +import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; import net.sf.jsqlparser.expression.operators.conditional.XorExpression; -import net.sf.jsqlparser.expression.operators.relational.*; +import net.sf.jsqlparser.expression.operators.relational.Between; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.FullTextSearch; +import net.sf.jsqlparser.expression.operators.relational.GeometryDistance; +import net.sf.jsqlparser.expression.operators.relational.GreaterThan; +import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.IsBooleanExpression; +import net.sf.jsqlparser.expression.operators.relational.IsDistinctExpression; +import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; +import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor; +import net.sf.jsqlparser.expression.operators.relational.JsonOperator; +import net.sf.jsqlparser.expression.operators.relational.LikeExpression; +import net.sf.jsqlparser.expression.operators.relational.Matches; +import net.sf.jsqlparser.expression.operators.relational.MinorThan; +import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; +import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; +import net.sf.jsqlparser.expression.operators.relational.NamedExpressionList; +import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; +import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator; +import net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator; +import net.sf.jsqlparser.expression.operators.relational.SimilarToExpression; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.statement.create.table.ColumnDefinition; import net.sf.jsqlparser.statement.select.AllColumns; @@ -21,18 +55,20 @@ import net.sf.jsqlparser.statement.select.ExpressionListItem; import net.sf.jsqlparser.statement.select.FunctionItem; import net.sf.jsqlparser.statement.select.OrderByElement; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; import net.sf.jsqlparser.statement.select.Pivot; import net.sf.jsqlparser.statement.select.PivotVisitor; import net.sf.jsqlparser.statement.select.PivotXml; +import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectExpressionItem; import net.sf.jsqlparser.statement.select.SelectItemVisitor; import net.sf.jsqlparser.statement.select.SelectVisitor; -import net.sf.jsqlparser.statement.select.SubSelect; import net.sf.jsqlparser.statement.select.UnPivot; import net.sf.jsqlparser.statement.select.WithItem; @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.UncommentedEmptyMethodBody"}) -public class ExpressionVisitorAdapter implements ExpressionVisitor, ItemsListVisitor, PivotVisitor, SelectItemVisitor { +public class ExpressionVisitorAdapter + implements ExpressionVisitor, ItemsListVisitor, PivotVisitor, SelectItemVisitor { private SelectVisitor selectVisitor; @@ -237,17 +273,17 @@ public void visit(Column column) { } @Override - public void visit(SubSelect subSelect) { + public void visit(ParenthesedSelect selectBody) { if (selectVisitor != null) { - if (subSelect.getWithItemsList() != null) { - for (WithItem item : subSelect.getWithItemsList()) { + if (selectBody.getWithItemsList() != null) { + for (WithItem item : selectBody.getWithItemsList()) { item.accept(selectVisitor); } } - subSelect.getSelectBody().accept(selectVisitor); + selectBody.accept(selectVisitor); } - if (subSelect.getPivot() != null) { - subSelect.getPivot().accept(this); + if (selectBody.getPivot() != null) { + selectBody.getPivot().accept(this); } } @@ -274,7 +310,7 @@ public void visit(WhenClause expr) { public void visit(ExistsExpression expr) { expr.getRightExpression().accept(this); } - + @Override public void visit(AnyComparisonExpression expr) { @@ -356,8 +392,7 @@ public void visit(ExtractExpression expr) { } @Override - public void visit(IntervalExpression expr) { - } + public void visit(IntervalExpression expr) {} @Override public void visit(OracleHierarchicalExpression expr) { @@ -502,16 +537,13 @@ public void visit(UnPivot unpivot) { } @Override - public void visit(AllColumns allColumns) { - } + public void visit(AllColumns allColumns) {} @Override - public void visit(AllTableColumns allTableColumns) { - } + public void visit(AllTableColumns allTableColumns) {} @Override - public void visit(AllValue allValue) { - } + public void visit(AllValue allValue) {} @Override public void visit(IsDistinctExpression isDistinctExpression) { @@ -526,9 +558,9 @@ public void visit(SelectExpressionItem selectExpressionItem) { @Override public void visit(RowConstructor rowConstructor) { if (rowConstructor.getColumnDefinitions().isEmpty()) { - for (Expression expression: rowConstructor.getExprList().getExpressions()) { + for (Expression expression : rowConstructor.getExprList().getExpressions()) { expression.accept(this); - } + } } else { for (ColumnDefinition columnDefinition : rowConstructor.getColumnDefinitions()) { columnDefinition.accept(this); @@ -557,12 +589,10 @@ public void visit(TimeKeyExpression timeKeyExpression) { } @Override - public void visit(DateTimeLiteralExpression literal) { - } + public void visit(DateTimeLiteralExpression literal) {} @Override - public void visit(NextValExpression nextVal) { - } + public void visit(NextValExpression nextVal) {} @Override public void visit(CollateExpression col) { @@ -617,19 +647,19 @@ public void visit(TimezoneExpression expr) { @Override public void visit(JsonAggregateFunction expression) { Expression expr = expression.getExpression(); - if (expr!=null) { + if (expr != null) { expr.accept(this); } - + expr = expression.getFilterExpression(); - if (expr!=null) { + if (expr != null) { expr.accept(this); } } @Override public void visit(JsonFunction expression) { - for (JsonFunctionExpression expr: expression.getExpressions()) { + for (JsonFunctionExpression expr : expression.getExpressions()) { expr.getExpression().accept(this); } } @@ -638,7 +668,7 @@ public void visit(JsonFunction expression) { public void visit(ConnectByRootOperator connectByRootOperator) { connectByRootOperator.getColumn().accept(this); } - + @Override public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) { oracleNamedFunctionParameter.getExpression().accept(this); @@ -649,7 +679,12 @@ public void visit(GeometryDistance geometryDistance) { visitBinaryExpression(geometryDistance); } + @Override + public void visit(Select selectBody) { + + } + public void visit(ColumnDefinition columnDefinition) { - columnDefinition.accept(this); - } + columnDefinition.accept(this); + } } diff --git a/src/main/java/net/sf/jsqlparser/expression/OracleHint.java b/src/main/java/net/sf/jsqlparser/expression/OracleHint.java index cbfe0632d..c229e880e 100644 --- a/src/main/java/net/sf/jsqlparser/expression/OracleHint.java +++ b/src/main/java/net/sf/jsqlparser/expression/OracleHint.java @@ -9,9 +9,13 @@ */ package net.sf.jsqlparser.expression; +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; + import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.sf.jsqlparser.parser.ASTNodeAccessImpl; /** * Oracle Hint Expression @@ -19,15 +23,14 @@ public class OracleHint extends ASTNodeAccessImpl implements Expression { private static final Pattern SINGLE_LINE = Pattern.compile("--\\+ *([^ ].*[^ ])"); - private static final Pattern MULTI_LINE = Pattern. - compile("\\/\\*\\+ *([^ ].*[^ ]) *\\*+\\/", Pattern.MULTILINE | Pattern.DOTALL); + private static final Pattern MULTI_LINE = + Pattern.compile("\\/\\*\\+ *([^ ].*[^ ]) *\\*+\\/", Pattern.MULTILINE | Pattern.DOTALL); private String value; private boolean singleLine = false; public static boolean isHintMatch(String comment) { - return SINGLE_LINE.matcher(comment).find() - || MULTI_LINE.matcher(comment).find(); + return SINGLE_LINE.matcher(comment).find() || MULTI_LINE.matcher(comment).find(); } public final void setComment(String comment) { @@ -84,4 +87,15 @@ public OracleHint withSingleLine(boolean singleLine) { this.setSingleLine(singleLine); return this; } + + public static OracleHint getHintFromSelectBody(Select selectBody) { + + if (selectBody instanceof PlainSelect) { + return ((PlainSelect) selectBody).getOracleHint(); + } else if (selectBody instanceof ParenthesedSelect) { + return getHintFromSelectBody(((ParenthesedSelect) selectBody).getSelect()); + } else { + return null; + } + } } diff --git a/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitor.java b/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitor.java index ced59be3a..02de5577c 100644 --- a/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitor.java +++ b/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitor.java @@ -9,11 +9,11 @@ */ package net.sf.jsqlparser.expression.operators.relational; -import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; public interface ItemsListVisitor { - void visit(SubSelect subSelect); + void visit(ParenthesedSelect selectBody); void visit(ExpressionList expressionList); diff --git a/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitorAdapter.java index ea711fe9b..27fbf1666 100644 --- a/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/expression/operators/relational/ItemsListVisitorAdapter.java @@ -9,13 +9,13 @@ */ package net.sf.jsqlparser.expression.operators.relational; -import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"}) public class ItemsListVisitorAdapter implements ItemsListVisitor { @Override - public void visit(SubSelect subSelect) { + public void visit(ParenthesedSelect subSelect) { } diff --git a/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java b/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java index e771d614f..865dcbc3f 100644 --- a/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java +++ b/src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java @@ -35,8 +35,7 @@ public final class CCJSqlParserUtil { public final static int ALLOWED_NESTING_DEPTH = 10; - private CCJSqlParserUtil() { - } + private CCJSqlParserUtil() {} public static Statement parse(Reader statementReader) throws JSQLParserException { CCJSqlParser parser = new CCJSqlParser(new StreamProvider(statementReader)); @@ -48,8 +47,7 @@ public static Statement parse(String sql) throws JSQLParserException { } /** - * Parses an sql statement while allowing via consumer to configure the used - * parser before. + * Parses an sql statement while allowing via consumer to configure the used parser before. * * For instance to activate SQLServer bracket quotation on could use: * @@ -62,7 +60,8 @@ public static Statement parse(String sql) throws JSQLParserException { * @return * @throws JSQLParserException */ - public static Statement parse(String sql, Consumer consumer) throws JSQLParserException { + public static Statement parse(String sql, Consumer consumer) + throws JSQLParserException { Statement statement = null; // first, try to parse fast and simple @@ -73,12 +72,14 @@ public static Statement parse(String sql, Consumer consumer) throw } statement = parseStatement(parser); } catch (JSQLParserException ex) { - if (getNestingDepth(sql)<=ALLOWED_NESTING_DEPTH) { + if (getNestingDepth(sql) <= ALLOWED_NESTING_DEPTH) { CCJSqlParser parser = newParser(sql).withAllowComplexParsing(true); if (consumer != null) { consumer.accept(parser); } statement = parseStatement(parser); + } else { + throw ex; } } return statement; @@ -128,13 +129,15 @@ public static Expression parseExpression(String expression) throws JSQLParserExc return parseExpression(expression, true); } - public static Expression parseExpression(String expression, boolean allowPartialParse) throws JSQLParserException { + public static Expression parseExpression(String expression, boolean allowPartialParse) + throws JSQLParserException { return parseExpression(expression, allowPartialParse, p -> { }); } @SuppressWarnings("PMD.CyclomaticComplexity") - public static Expression parseExpression(String expressionStr, boolean allowPartialParse, Consumer consumer) throws JSQLParserException { + public static Expression parseExpression(String expressionStr, boolean allowPartialParse, + Consumer consumer) throws JSQLParserException { Expression expression = null; // first, try to parse fast and simple @@ -146,22 +149,26 @@ public static Expression parseExpression(String expressionStr, boolean allowPart try { expression = parser.Expression(); if (parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) { - throw new JSQLParserException("could only parse partial expression " + expression.toString()); + throw new JSQLParserException( + "could only parse partial expression " + expression.toString()); } } catch (ParseException ex) { throw new JSQLParserException(ex); } } catch (JSQLParserException ex1) { - // when fast simple parsing fails, try complex parsing but only if it has a chance to succeed - if (getNestingDepth(expressionStr)<=ALLOWED_NESTING_DEPTH) { + // when fast simple parsing fails, try complex parsing but only if it has a chance to + // succeed + if (getNestingDepth(expressionStr) <= ALLOWED_NESTING_DEPTH) { CCJSqlParser parser = newParser(expressionStr).withAllowComplexParsing(true); if (consumer != null) { consumer.accept(parser); } try { expression = parser.Expression(); - if (!allowPartialParse && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) { - throw new JSQLParserException("could only parse partial expression " + expression.toString()); + if (!allowPartialParse + && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) { + throw new JSQLParserException( + "could only parse partial expression " + expression.toString()); } } catch (JSQLParserException ex) { throw ex; @@ -174,8 +181,8 @@ public static Expression parseExpression(String expressionStr, boolean allowPart } /** - * Parse an conditional expression. This is the expression after a where - * clause. Partial parsing is enabled. + * Parse an conditional expression. This is the expression after a where clause. Partial parsing + * is enabled. * * @param condExpr * @return the expression parsed @@ -186,47 +193,53 @@ public static Expression parseCondExpression(String condExpr) throws JSQLParserE } /** - * Parse an conditional expression. This is the expression after a where - * clause. + * Parse an conditional expression. This is the expression after a where clause. * * @param condExpr * @param allowPartialParse false: needs the whole string to be processed. * @return the expression parsed * @see #parseCondExpression(String) */ - public static Expression parseCondExpression(String condExpr, boolean allowPartialParse) throws JSQLParserException { + public static Expression parseCondExpression(String condExpr, boolean allowPartialParse) + throws JSQLParserException { return parseCondExpression(condExpr, allowPartialParse, p -> { }); } @SuppressWarnings("PMD.CyclomaticComplexity") - public static Expression parseCondExpression(String conditionalExpressionStr, boolean allowPartialParse, Consumer consumer) throws JSQLParserException { + public static Expression parseCondExpression(String conditionalExpressionStr, + boolean allowPartialParse, Consumer consumer) throws JSQLParserException { Expression expression = null; // first, try to parse fast and simple try { - CCJSqlParser parser = newParser(conditionalExpressionStr).withAllowComplexParsing(false); + CCJSqlParser parser = + newParser(conditionalExpressionStr).withAllowComplexParsing(false); if (consumer != null) { consumer.accept(parser); } try { expression = parser.Expression(); if (parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) { - throw new JSQLParserException("could only parse partial expression " + expression.toString()); + throw new JSQLParserException( + "could only parse partial expression " + expression.toString()); } } catch (ParseException ex) { throw new JSQLParserException(ex); } - } catch (JSQLParserException ex1) { - if (getNestingDepth(conditionalExpressionStr)<=ALLOWED_NESTING_DEPTH) { - CCJSqlParser parser = newParser(conditionalExpressionStr).withAllowComplexParsing(true); + } catch (JSQLParserException ex1) { + if (getNestingDepth(conditionalExpressionStr) <= ALLOWED_NESTING_DEPTH) { + CCJSqlParser parser = + newParser(conditionalExpressionStr).withAllowComplexParsing(true); if (consumer != null) { consumer.accept(parser); } try { expression = parser.Expression(); - if (!allowPartialParse && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) { - throw new JSQLParserException("could only parse partial expression " + expression.toString()); + if (!allowPartialParse + && parser.getNextToken().kind != CCJSqlParserTokenManager.EOF) { + throw new JSQLParserException( + "could only parse partial expression " + expression.toString()); } } catch (JSQLParserException ex) { throw ex; @@ -255,7 +268,8 @@ public Statement call() throws Exception { }); executorService.shutdown(); - statement = future.get( parser.getConfiguration().getAsInteger(Feature.timeOut), TimeUnit.MILLISECONDS); + statement = future.get(parser.getConfiguration().getAsInteger(Feature.timeOut), + TimeUnit.MILLISECONDS); } catch (TimeoutException ex) { parser.interrupted = true; throw new JSQLParserException("Time out occurred.", ex); @@ -279,7 +293,8 @@ public static Statements parseStatements(String sqls) throws JSQLParserException * * @return the statements parsed */ - public static Statements parseStatements(String sqls, Consumer consumer) throws JSQLParserException { + public static Statements parseStatements(String sqls, Consumer consumer) + throws JSQLParserException { Statements statements = null; // first, try to parse fast and simple @@ -290,8 +305,9 @@ public static Statements parseStatements(String sqls, Consumer con } statements = parseStatements(parser); } catch (JSQLParserException ex) { - // when fast simple parsing fails, try complex parsing but only if it has a chance to succeed - if (getNestingDepth(sqls)<=ALLOWED_NESTING_DEPTH) { + // when fast simple parsing fails, try complex parsing but only if it has a chance to + // succeed + if (getNestingDepth(sqls) <= ALLOWED_NESTING_DEPTH) { CCJSqlParser parser = newParser(sqls).withAllowComplexParsing(true); if (consumer != null) { consumer.accept(parser); @@ -319,7 +335,8 @@ public Statements call() throws Exception { }); executorService.shutdown(); - statements = future.get( parser.getConfiguration().getAsInteger(Feature.timeOut) , TimeUnit.MILLISECONDS); + statements = future.get(parser.getConfiguration().getAsInteger(Feature.timeOut), + TimeUnit.MILLISECONDS); } catch (TimeoutException ex) { parser.interrupted = true; throw new JSQLParserException("Time out occurred.", ex); @@ -329,7 +346,8 @@ public Statements call() throws Exception { return statements; } - public static void streamStatements(StatementListener listener, InputStream is, String encoding) throws JSQLParserException { + public static void streamStatements(StatementListener listener, InputStream is, String encoding) + throws JSQLParserException { try { CCJSqlParser parser = newParser(is, encoding); while (true) { @@ -347,27 +365,27 @@ public static void streamStatements(StatementListener listener, InputStream is, throw new JSQLParserException(ex); } } - + public static int getNestingDepth(String sql) { - int maxlevel=0; - int level=0; - - char[] chars = sql.toCharArray(); - for (char c:chars) { - switch(c) { - case '(': - level++; - break; - case ')': - if (maxlevel columnNames = null; @@ -40,12 +41,12 @@ public void setView(Table view) { this.view = view; } - public SelectBody getSelectBody() { - return selectBody; + public Select getSelect() { + return select; } - public void setSelectBody(SelectBody selectBody) { - this.selectBody = selectBody; + public void setSelect(Select select) { + this.select = select; } public List getColumnNames() { @@ -77,7 +78,7 @@ public String toString() { if (columnNames != null) { sql.append(PlainSelect.getStringList(columnNames, true, true)); } - sql.append(" AS ").append(selectBody); + sql.append(" AS ").append(select); return sql.toString(); } @@ -86,8 +87,8 @@ public AlterView withView(Table view) { return this; } - public AlterView withSelectBody(SelectBody selectBody) { - this.setSelectBody(selectBody); + public AlterView withSelect(Select select) { + this.setSelect(select); return this; } @@ -113,7 +114,7 @@ public AlterView addColumnNames(Collection columnNames) { return this.withColumnNames(collection); } - public E getSelectBody(Class type) { - return type.cast(getSelectBody()); + public E getSelectBody(Class type) { + return type.cast(getSelect()); } } diff --git a/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java b/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java index 2b96bc390..b045f5bf9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java +++ b/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java @@ -9,13 +9,6 @@ */ package net.sf.jsqlparser.statement.insert; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; - import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.OracleHint; import net.sf.jsqlparser.expression.RowConstructor; @@ -28,11 +21,16 @@ import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SelectBody; import net.sf.jsqlparser.statement.select.SelectItem; -import net.sf.jsqlparser.statement.select.SetOperationList; import net.sf.jsqlparser.statement.select.WithItem; -import net.sf.jsqlparser.statement.values.ValuesStatement; +import net.sf.jsqlparser.statement.select.Values; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; @SuppressWarnings({"PMD.CyclomaticComplexity"}) public class Insert implements Statement { @@ -48,7 +46,7 @@ public class Insert implements Statement { private boolean modifierIgnore = false; private List returningExpressionList = null; - + private boolean useSet = false; private List setColumns; private List setExpressionList; @@ -61,6 +59,7 @@ public class Insert implements Statement { public OutputClause getOutputClause() { return outputClause; } + public void setOutputClause(OutputClause outputClause) { this.outputClause = outputClause; } @@ -77,7 +76,7 @@ public Table getTable() { public void setTable(Table name) { table = name; } - + public OracleHint getOracleHint() { return oracleHint; } @@ -101,30 +100,22 @@ public void setColumns(List list) { */ @Deprecated public ItemsList getItemsList() { - if (select!=null) { - SelectBody selectBody = select.getSelectBody(); - if (selectBody instanceof SetOperationList) { - SetOperationList setOperationList = (SetOperationList) selectBody; - List selects = setOperationList.getSelects(); - - if (selects.size() == 1) { - SelectBody selectBody1 = selects.get(0); - if (selectBody1 instanceof ValuesStatement) { - ValuesStatement valuesStatement = (ValuesStatement) selectBody1; - if (valuesStatement.getExpressions() instanceof ExpressionList) { - ExpressionList expressionList = (ExpressionList) valuesStatement.getExpressions(); - - if (expressionList.getExpressions().size() == 1 && expressionList.getExpressions().get(0) instanceof RowConstructor) { - RowConstructor rowConstructor = (RowConstructor) expressionList.getExpressions().get(0); - return rowConstructor.getExprList(); - } else { - return expressionList; - } - } else { - return valuesStatement.getExpressions(); - } - } + if (select instanceof Values) { + Values valuesStatement = (Values) select; + if (valuesStatement.getExpressions() instanceof ExpressionList) { + ExpressionList expressionList = + (ExpressionList) valuesStatement.getExpressions(); + + if (expressionList.getExpressions().size() == 1 + && expressionList.getExpressions().get(0) instanceof RowConstructor) { + RowConstructor rowConstructor = + (RowConstructor) expressionList.getExpressions().get(0); + return rowConstructor.getExprList(); + } else { + return expressionList; } + } else { + return valuesStatement.getExpressions(); } } return null; @@ -133,7 +124,7 @@ public ItemsList getItemsList() { @Deprecated public boolean isUseValues() { - return select!=null && select.getSelectBody() instanceof ValuesStatement; + return select != null && select instanceof Values; } public List getReturningExpressionList() { @@ -282,8 +273,8 @@ public String toString() { if (columns != null) { sql.append(PlainSelect.getStringList(columns, true, true)).append(" "); } - - if (outputClause !=null) { + + if (outputClause != null) { sql.append(outputClause.toString()); } @@ -313,23 +304,23 @@ public String toString() { } } - if (conflictAction!=null) { + if (conflictAction != null) { sql.append(" ON CONFLICT"); - if (conflictTarget!=null) { + if (conflictTarget != null) { conflictTarget.appendTo(sql); } conflictAction.appendTo(sql); } if (getReturningExpressionList() != null) { - sql.append(" RETURNING ").append(PlainSelect. - getStringList(getReturningExpressionList(), true, false)); + sql.append(" RETURNING ") + .append(PlainSelect.getStringList(getReturningExpressionList(), true, false)); } return sql.toString(); } - + public Insert withWithItemsList(List withList) { this.withItemsList = withList; return this; @@ -350,7 +341,8 @@ public Insert withDuplicateUpdateColumns(List duplicateUpdateColumns) { return this; } - public Insert withDuplicateUpdateExpressionList(List duplicateUpdateExpressionList) { + public Insert withDuplicateUpdateExpressionList( + List duplicateUpdateExpressionList) { this.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); return this; } @@ -413,37 +405,45 @@ public Insert addColumns(Collection columns) { } public Insert addDuplicateUpdateColumns(Column... duplicateUpdateColumns) { - List collection = Optional.ofNullable(getDuplicateUpdateColumns()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getDuplicateUpdateColumns()).orElseGet(ArrayList::new); Collections.addAll(collection, duplicateUpdateColumns); return this.withDuplicateUpdateColumns(collection); } public Insert addDuplicateUpdateColumns(Collection duplicateUpdateColumns) { - List collection = Optional.ofNullable(getDuplicateUpdateColumns()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getDuplicateUpdateColumns()).orElseGet(ArrayList::new); collection.addAll(duplicateUpdateColumns); return this.withDuplicateUpdateColumns(collection); } public Insert addDuplicateUpdateExpressionList(Expression... duplicateUpdateExpressionList) { - List collection = Optional.ofNullable(getDuplicateUpdateExpressionList()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getDuplicateUpdateExpressionList()).orElseGet(ArrayList::new); Collections.addAll(collection, duplicateUpdateExpressionList); return this.withDuplicateUpdateExpressionList(collection); } - public Insert addDuplicateUpdateExpressionList(Collection duplicateUpdateExpressionList) { - List collection = Optional.ofNullable(getDuplicateUpdateExpressionList()).orElseGet(ArrayList::new); + public Insert addDuplicateUpdateExpressionList( + Collection duplicateUpdateExpressionList) { + List collection = + Optional.ofNullable(getDuplicateUpdateExpressionList()).orElseGet(ArrayList::new); collection.addAll(duplicateUpdateExpressionList); return this.withDuplicateUpdateExpressionList(collection); } public Insert addReturningExpressionList(SelectItem... returningExpressionList) { - List collection = Optional.ofNullable(getReturningExpressionList()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getReturningExpressionList()).orElseGet(ArrayList::new); Collections.addAll(collection, returningExpressionList); return this.withReturningExpressionList(collection); } - public Insert addReturningExpressionList(Collection returningExpressionList) { - List collection = Optional.ofNullable(getReturningExpressionList()).orElseGet(ArrayList::new); + public Insert addReturningExpressionList( + Collection returningExpressionList) { + List collection = + Optional.ofNullable(getReturningExpressionList()).orElseGet(ArrayList::new); collection.addAll(returningExpressionList); return this.withReturningExpressionList(collection); } @@ -461,13 +461,15 @@ public Insert addSetColumns(Collection setColumns) { } public Insert addSetExpressionList(Expression... setExpressionList) { - List collection = Optional.ofNullable(getSetExpressionList()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getSetExpressionList()).orElseGet(ArrayList::new); Collections.addAll(collection, setExpressionList); return this.withSetExpressionList(collection); } public Insert addSetExpressionList(Collection setExpressionList) { - List collection = Optional.ofNullable(getSetExpressionList()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getSetExpressionList()).orElseGet(ArrayList::new); collection.addAll(setExpressionList); return this.withSetExpressionList(collection); } diff --git a/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java b/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java index 868c4680e..32dc3d3bd 100644 --- a/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java +++ b/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java @@ -9,29 +9,29 @@ */ package net.sf.jsqlparser.statement.merge; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.OracleHint; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.StatementVisitor; -import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.FromItem; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; import net.sf.jsqlparser.statement.select.WithItem; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; + public class Merge implements Statement { private List withItemsList; private Table table; private OracleHint oracleHint = null; - private Table usingTable; - private SubSelect usingSelect; - private Alias usingAlias; + private FromItem fromItem; private Expression onCondition; private MergeInsert mergeInsert; private MergeUpdate mergeUpdate; @@ -51,13 +51,15 @@ public Merge withWithItemsList(List withItemsList) { } public Merge addWithItemsList(WithItem... withItemsList) { - List collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); Collections.addAll(collection, withItemsList); return this.withWithItemsList(collection); } public Merge addWithItemsList(Collection withItemsList) { - List collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); collection.addAll(withItemsList); return this.withWithItemsList(collection); } @@ -78,31 +80,42 @@ public void setOracleHint(OracleHint oracleHint) { this.oracleHint = oracleHint; } + @Deprecated public Table getUsingTable() { - return usingTable; + return fromItem instanceof Table ? (Table) fromItem : null; } + @Deprecated public void setUsingTable(Table usingTable) { - this.usingTable = usingTable; + this.fromItem = usingTable; } - public SubSelect getUsingSelect() { - return usingSelect; - } - - public void setUsingSelect(SubSelect usingSelect) { - this.usingSelect = usingSelect; - if (this.usingSelect != null) { - this.usingSelect.setUseBrackets(false); - } + @Deprecated + public void setUsingSelect(ParenthesedSelect usingSelect) { + this.fromItem = usingSelect; } + @Deprecated public Alias getUsingAlias() { - return usingAlias; + return fromItem.getAlias(); } + @Deprecated public void setUsingAlias(Alias usingAlias) { - this.usingAlias = usingAlias; + this.fromItem.setAlias(usingAlias); + } + + public FromItem getFromItem() { + return fromItem; + } + + public void setFromItem(FromItem fromItem) { + this.fromItem = fromItem; + } + + public Merge withFromItem(FromItem fromItem) { + this.setFromItem(fromItem); + return this; } public Expression getOnCondition() { @@ -160,44 +173,39 @@ public String toString() { b.append("MERGE INTO "); b.append(table); b.append(" USING "); - if (usingTable != null) { - b.append(usingTable.toString()); - } else if (usingSelect != null) { - b.append("(").append(usingSelect.toString()).append(")"); - } - - if (usingAlias != null) { - b.append(usingAlias.toString()); - } + b.append(fromItem); b.append(" ON ("); b.append(onCondition); b.append(")"); if (insertFirst && mergeInsert != null) { - b.append(mergeInsert.toString()); + b.append(mergeInsert); } if (mergeUpdate != null) { - b.append(mergeUpdate.toString()); + b.append(mergeUpdate); } if (!insertFirst && mergeInsert != null) { - b.append(mergeInsert.toString()); + b.append(mergeInsert); } return b.toString(); } + @Deprecated public Merge withUsingTable(Table usingTable) { this.setUsingTable(usingTable); return this; } - public Merge withUsingSelect(SubSelect usingSelect) { + @Deprecated + public Merge withUsingSelect(ParenthesedSelect usingSelect) { this.setUsingSelect(usingSelect); return this; } + @Deprecated public Merge withUsingAlias(Alias usingAlias) { this.setUsingAlias(usingAlias); return this; diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java index 64f578819..a25f5d03e 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitor.java @@ -15,15 +15,11 @@ public interface FromItemVisitor { void visit(Table tableName); - void visit(SubSelect subSelect); - - void visit(SubJoin subjoin); + void visit(ParenthesedSelect selectBody); void visit(LateralSubSelect lateralSubSelect); - void visit(ValuesList valuesList); - void visit(TableFunction tableFunction); - void visit(ParenthesisFromItem aThis); + void visit(ParenthesedFromItem aThis); } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java index d99aac177..8c25b6327 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/FromItemVisitorAdapter.java @@ -20,12 +20,7 @@ public void visit(Table table) { } @Override - public void visit(SubSelect subSelect) { - - } - - @Override - public void visit(SubJoin subjoin) { + public void visit(ParenthesedSelect selectBody) { } @@ -34,18 +29,13 @@ public void visit(LateralSubSelect lateralSubSelect) { } - @Override - public void visit(ValuesList valuesList) { - - } - @Override public void visit(TableFunction valuesList) { } @Override - public void visit(ParenthesisFromItem aThis) { - + public void visit(ParenthesedFromItem aThis) { + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Join.java b/src/main/java/net/sf/jsqlparser/statement/select/Join.java index e56b37cee..7aea9c8a3 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/Join.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/Join.java @@ -9,12 +9,17 @@ */ package net.sf.jsqlparser.statement.select; -import java.util.*; - import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; import net.sf.jsqlparser.schema.Column; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + public class Join extends ASTNodeAccessImpl { private boolean outer = false; @@ -288,7 +293,8 @@ public boolean isWindowJoin() { /** * Return the "WITHIN" join window (if any) - * @return + * + * @return */ public KSQLJoinWindow getJoinWindow() { return joinWindow; @@ -308,7 +314,7 @@ public void setJoinWindow(KSQLJoinWindow joinWindow) { public String toString() { StringBuilder builder = new StringBuilder(); - if ( isGlobal() ) { + if (isGlobal()) { builder.append("GLOBAL "); } @@ -350,11 +356,11 @@ public String toString() { builder.append(rightItem).append((joinWindow != null) ? " WITHIN " + joinWindow : ""); } - for (Expression onExpression: onExpressions) { + for (Expression onExpression : onExpressions) { builder.append(" ON ").append(onExpression); } - if (usingColumns.size()>0) { - builder.append(PlainSelect.getFormatedList(usingColumns, "USING", true, true)); + if (usingColumns.size() > 0) { + builder.append(PlainSelect.getFormattedList(usingColumns, "USING", true, true)); } return builder.toString(); diff --git a/src/main/java/net/sf/jsqlparser/statement/select/LateralSubSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/LateralSubSelect.java index 8c2feb093..23592d6db 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/LateralSubSelect.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/LateralSubSelect.java @@ -9,41 +9,50 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.expression.Alias; - /** * lateral sub select + * * @author tobens */ -public class LateralSubSelect extends SpecialSubSelect { - +public class LateralSubSelect extends ParenthesedSelect { + private String prefix; + public LateralSubSelect() { - super("LATERAL"); + this("LATERAL"); } - - @Override - public void accept(FromItemVisitor fromItemVisitor) { - fromItemVisitor.visit(this); + + public LateralSubSelect(String prefix) { + this.prefix = prefix; } - @Override - public LateralSubSelect withPivot(Pivot pivot) { - return (LateralSubSelect) super.withPivot(pivot); + public String getPrefix() { + return prefix; } - @Override - public LateralSubSelect withAlias(Alias alias) { - return (LateralSubSelect) super.withAlias(alias); + public void setPrefix(String prefix) { + this.prefix = prefix; } - @Override - public LateralSubSelect withSubSelect(SubSelect subSelect) { - return (LateralSubSelect) super.withSubSelect(subSelect); + public LateralSubSelect withPrefix(String prefix) { + this.setPrefix(prefix); + return this; } - @Override - public LateralSubSelect withUnPivot(UnPivot unpivot) { - return (LateralSubSelect) super.withUnPivot(unpivot); + public LateralSubSelect withSelect(Select select) { + setSelect(select); + return this; + } + + public String toString() { + return prefix + super.toString(); + } + + public void accept(SelectVisitor selectVisitor) { + selectVisitor.visit(this); } + @Override + public void accept(FromItemVisitor fromItemVisitor) { + fromItemVisitor.visit(this); + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java new file mode 100644 index 000000000..a96abee15 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedFromItem.java @@ -0,0 +1,142 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.select; + +import net.sf.jsqlparser.expression.Alias; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class ParenthesedFromItem implements FromItem { + private FromItem fromItem; + private List joins; + private Alias alias; + private Pivot pivot; + private UnPivot unPivot; + + public ParenthesedFromItem() {} + + public ParenthesedFromItem(FromItem fromItem) { + setFromItem(fromItem); + } + + public FromItem getFromItem() { + return fromItem; + } + + public final void setFromItem(FromItem fromItem) { + this.fromItem = fromItem; + } + + public List getJoins() { + return joins; + } + + public FromItem addJoins(Join... joins) { + List list = Optional.ofNullable(getJoins()).orElseGet(ArrayList::new); + Collections.addAll(list, joins); + return withJoins(list); + } + + public FromItem withJoins(List joins) { + this.setJoins(joins); + return this; + } + + public void setJoins(List list) { + joins = list; + } + + @Override + public void accept(FromItemVisitor fromItemVisitor) { + fromItemVisitor.visit(this); + } + + public StringBuilder appendTo(StringBuilder builder) { + builder.append("("); + builder.append(fromItem); + if (joins != null) { + for (Join join : joins) { + if (join.isSimple()) { + builder.append(", ").append(join); + } else { + builder.append(" ").append(join); + } + } + } + builder.append(")"); + + if (alias != null) { + builder.append(alias); + } + + if (pivot != null) { + builder.append(pivot); + } + + if (unPivot != null) { + builder.append(unPivot); + } + + return builder; + } + + @Override + public String toString() { + return appendTo(new StringBuilder()).toString(); + } + + @Override + public Alias getAlias() { + return alias; + } + + @Override + public void setAlias(Alias alias) { + this.alias = alias; + } + + @Override + public Pivot getPivot() { + return pivot; + } + + @Override + public void setPivot(Pivot pivot) { + this.pivot = pivot; + } + + @Override + public UnPivot getUnPivot() { + return unPivot; + } + + @Override + public void setUnPivot(UnPivot unpivot) { + this.unPivot = unpivot; + } + + public ParenthesedFromItem withFromItem(FromItem fromItem) { + this.setFromItem(fromItem); + return this; + } + + @Override + public ParenthesedFromItem withAlias(Alias alias) { + this.setAlias(alias); + return this; + } + + public E getFromItem(Class type) { + return type.cast(getFromItem()); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java new file mode 100644 index 000000000..516b9ca8b --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesedSelect.java @@ -0,0 +1,81 @@ +package net.sf.jsqlparser.statement.select; + +import net.sf.jsqlparser.expression.Alias; + +public class ParenthesedSelect extends Select implements FromItem { + Alias alias; + Pivot pivot; + UnPivot unPivot; + Select select; + + @Override + public Alias getAlias() { + return alias; + } + + @Override + public void setAlias(Alias alias) { + this.alias = alias; + } + + public ParenthesedSelect withAlias(Alias alias) { + this.setAlias(alias); + return this; + } + + @Override + public Pivot getPivot() { + return pivot; + } + + @Override + public void setPivot(Pivot pivot) { + this.pivot = pivot; + } + + public UnPivot getUnPivot() { + return unPivot; + } + + public void setUnPivot(UnPivot unPivot) { + this.unPivot = unPivot; + } + + public Select getSelect() { + return select; + } + + public void setSelect(Select select) { + this.select = select; + } + + public ParenthesedSelect withSelect(Select selectBody) { + setSelect(selectBody); + return this; + } + + @Override + public void accept(SelectVisitor selectVisitor) { + selectVisitor.visit(this); + } + + @Override + public void accept(FromItemVisitor fromItemVisitor) { + fromItemVisitor.visit(this); + } + + public StringBuilder appendSelectBodyTo(StringBuilder builder) { + builder.append("(").append(select).append(")"); + if (alias != null) { + builder.append(alias); + } + + if (pivot != null) { + builder.append(" ").append(pivot); + } + if (unPivot != null) { + builder.append(" ").append(unPivot); + } + return builder; + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesisFromItem.java b/src/main/java/net/sf/jsqlparser/statement/select/ParenthesisFromItem.java deleted file mode 100644 index 5168b6505..000000000 --- a/src/main/java/net/sf/jsqlparser/statement/select/ParenthesisFromItem.java +++ /dev/null @@ -1,89 +0,0 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.select; - -import net.sf.jsqlparser.expression.Alias; - -public class ParenthesisFromItem implements FromItem { - - private FromItem fromItem; - - private Alias alias; - - public ParenthesisFromItem() { - } - - public ParenthesisFromItem(FromItem fromItem) { - setFromItem(fromItem); - } - - public FromItem getFromItem() { - return fromItem; - } - - public final void setFromItem(FromItem fromItem) { - this.fromItem = fromItem; - } - - @Override - public void accept(FromItemVisitor fromItemVisitor) { - fromItemVisitor.visit(this); - } - - @Override - public String toString() { - return "(" + fromItem + ")" + (alias != null ? alias.toString() : ""); - } - - @Override - public Alias getAlias() { - return alias; - } - - @Override - public void setAlias(Alias alias) { - this.alias = alias; - } - - @Override - public Pivot getPivot() { - return null; - } - - @Override - public void setPivot(Pivot pivot) { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public UnPivot getUnPivot() { - return null; - } - - @Override - public void setUnPivot(UnPivot unpivot) { - throw new UnsupportedOperationException("Not supported yet."); - } - - public ParenthesisFromItem withFromItem(FromItem fromItem) { - this.setFromItem(fromItem); - return this; - } - - @Override - public ParenthesisFromItem withAlias(Alias alias) { - this.setAlias(alias); - return this; - } - - public E getFromItem(Class type) { - return type.cast(getFromItem()); - } -} diff --git a/src/main/java/net/sf/jsqlparser/statement/select/PivotXml.java b/src/main/java/net/sf/jsqlparser/statement/select/PivotXml.java index fb9ad7ca4..e4c524550 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/PivotXml.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/PivotXml.java @@ -17,7 +17,7 @@ public class PivotXml extends Pivot { - private SelectBody inSelect; + private Select inSelect; private boolean inAny = false; @Override @@ -25,11 +25,11 @@ public void accept(PivotVisitor pivotVisitor) { pivotVisitor.visit(this); } - public SelectBody getInSelect() { + public Select getInSelect() { return inSelect; } - public void setInSelect(SelectBody inSelect) { + public void setInSelect(Select inSelect) { this.inSelect = inSelect; } @@ -44,16 +44,17 @@ public void setInAny(boolean inAny) { @Override public String toString() { List forColumns = getForColumns(); - String in = inAny ? "ANY" : inSelect == null ? PlainSelect.getStringList(getInItems()) : inSelect. - toString(); + String in = inAny ? "ANY" + : inSelect == null ? PlainSelect.getStringList(getInItems()) : inSelect.toString(); return "PIVOT XML (" + PlainSelect.getStringList(getFunctionItems()) - + " FOR " + PlainSelect. - getStringList(forColumns, true, forColumns != null && forColumns.size() > 1) + + " FOR " + + PlainSelect.getStringList(forColumns, true, + forColumns != null && forColumns.size() > 1) + " IN (" + in + "))"; } - public PivotXml withInSelect(SelectBody inSelect) { + public PivotXml withInSelect(Select inSelect) { this.setInSelect(inSelect); return this; } @@ -63,7 +64,7 @@ public PivotXml withInAny(boolean inAny) { return this; } - public E getInSelect(Class type) { + public E getInSelect(Class type) { return type.cast(getInSelect()); } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java index af61ef60b..fe11e5f0c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java @@ -9,22 +9,23 @@ */ package net.sf.jsqlparser.statement.select; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.OracleHierarchicalExpression; +import net.sf.jsqlparser.expression.OracleHint; +import net.sf.jsqlparser.expression.WindowDefinition; +import net.sf.jsqlparser.schema.Table; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Optional; + import static java.util.stream.Collectors.joining; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.OracleHierarchicalExpression; -import net.sf.jsqlparser.expression.OracleHint; -import net.sf.jsqlparser.expression.WindowDefinition; -import net.sf.jsqlparser.parser.ASTNodeAccessImpl; -import net.sf.jsqlparser.schema.Table; @SuppressWarnings({"PMD.CyclomaticComplexity"}) -public class PlainSelect extends ASTNodeAccessImpl implements SelectBody { +public class PlainSelect extends Select { private Distinct distinct = null; private List selectItems; @@ -33,11 +34,7 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody { private List joins; private Expression where; private GroupByElement groupBy; - private List orderByElements; private Expression having; - private Limit limit; - private Offset offset; - private Fetch fetch; private OptimizeFor optimizeFor; private Skip skip; private boolean mySqlHintStraightJoin; @@ -45,11 +42,9 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody { private Top top; private OracleHierarchicalExpression oracleHierarchical = null; private OracleHint oracleHint = null; - private boolean oracleSiblings = false; private boolean forUpdate = false; private Table forUpdateTable = null; private boolean skipLocked; - private boolean useBrackets = false; private Wait wait; private boolean mySqlSqlCalcFoundRows = false; private MySqlSqlCacheFlags mySqlCacheFlag = null; @@ -57,15 +52,12 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody { private KSQLWindow ksqlWindow = null; private boolean noWait = false; private boolean emitChanges = false; - private WithIsolation withIsolation; + private List windowDefinitions; + @Deprecated public boolean isUseBrackets() { - return useBrackets; - } - - public void setUseBrackets(boolean useBrackets) { - this.useBrackets = useBrackets; + return false; } public FromItem getFromItem() { @@ -145,38 +137,6 @@ public void accept(SelectVisitor selectVisitor) { selectVisitor.visit(this); } - public List getOrderByElements() { - return orderByElements; - } - - public void setOrderByElements(List orderByElements) { - this.orderByElements = orderByElements; - } - - public Limit getLimit() { - return limit; - } - - public void setLimit(Limit limit) { - this.limit = limit; - } - - public Offset getOffset() { - return offset; - } - - public void setOffset(Offset offset) { - this.offset = offset; - } - - public Fetch getFetch() { - return fetch; - } - - public void setFetch(Fetch fetch) { - this.fetch = fetch; - } - public OptimizeFor getOptimizeFor() { return optimizeFor; } @@ -234,7 +194,8 @@ public void setHaving(Expression expression) { } /** - * A list of {@link Expression}s of the GROUP BY clause. It is null in case there is no GROUP BY clause + * A list of {@link Expression}s of the GROUP BY clause. It is null in case there is no GROUP BY + * clause * * @return a list of {@link Expression}s */ @@ -260,14 +221,6 @@ public void setOracleHierarchical(OracleHierarchicalExpression oracleHierarchica this.oracleHierarchical = oracleHierarchical; } - public boolean isOracleSiblings() { - return oracleSiblings; - } - - public void setOracleSiblings(boolean oracleSiblings) { - this.oracleSiblings = oracleSiblings; - } - public boolean isForUpdate() { return forUpdate; } @@ -334,14 +287,6 @@ public boolean isEmitChanges() { return emitChanges; } - public WithIsolation getWithIsolation() { - return withIsolation; - } - - public void setWithIsolation(WithIsolation withIsolation) { - this.withIsolation = withIsolation; - } - public List getWindowDefinitions() { return windowDefinitions; } @@ -358,238 +303,129 @@ public void setSkipLocked(boolean skipLocked) { this.skipLocked = skipLocked; } - @Override - @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder sql = new StringBuilder(); - if (useBrackets) { - sql.append("("); - } - sql.append("SELECT "); + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", + "PMD.NPathComplexity"}) + public StringBuilder appendSelectBodyTo(StringBuilder builder) { + builder.append("SELECT "); if (this.mySqlHintStraightJoin) { - sql.append("STRAIGHT_JOIN "); + builder.append("STRAIGHT_JOIN "); } if (oracleHint != null) { - sql.append(oracleHint).append(" "); + builder.append(oracleHint).append(" "); } if (skip != null) { - sql.append(skip).append(" "); + builder.append(skip).append(" "); } if (first != null) { - sql.append(first).append(" "); + builder.append(first).append(" "); } if (distinct != null) { - sql.append(distinct).append(" "); + builder.append(distinct).append(" "); } if (top != null) { - sql.append(top).append(" "); + builder.append(top).append(" "); } if (mySqlCacheFlag != null) { - sql.append(mySqlCacheFlag.name()).append(" "); + builder.append(mySqlCacheFlag.name()).append(" "); } if (mySqlSqlCalcFoundRows) { - sql.append("SQL_CALC_FOUND_ROWS").append(" "); + builder.append("SQL_CALC_FOUND_ROWS").append(" "); } - sql.append(getStringList(selectItems)); + builder.append(getStringList(selectItems)); if (intoTables != null) { - sql.append(" INTO "); + builder.append(" INTO "); for (Iterator iter = intoTables.iterator(); iter.hasNext();) { - sql.append(iter.next().toString()); + builder.append(iter.next().toString()); if (iter.hasNext()) { - sql.append(", "); + builder.append(", "); } } } if (fromItem != null) { - sql.append(" FROM ").append(fromItem); + builder.append(" FROM ").append(fromItem); if (joins != null) { - Iterator it = joins.iterator(); - while (it.hasNext()) { - Join join = it.next(); + for (Join join : joins) { if (join.isSimple()) { - sql.append(", ").append(join); + builder.append(", ").append(join); } else { - sql.append(" ").append(join); + builder.append(" ").append(join); } } } if (ksqlWindow != null) { - sql.append(" WINDOW ").append(ksqlWindow.toString()); + builder.append(" WINDOW ").append(ksqlWindow); } if (where != null) { - sql.append(" WHERE ").append(where); + builder.append(" WHERE ").append(where); } if (oracleHierarchical != null) { - sql.append(oracleHierarchical.toString()); + builder.append(oracleHierarchical); } if (groupBy != null) { - sql.append(" ").append(groupBy.toString()); + builder.append(" ").append(groupBy); } if (having != null) { - sql.append(" HAVING ").append(having); + builder.append(" HAVING ").append(having); } - if (windowDefinitions != null) { - sql.append(" WINDOW "); - sql.append(windowDefinitions.stream().map(WindowDefinition::toString).collect(joining(", "))); + builder.append(" WINDOW "); + builder.append(windowDefinitions.stream().map(WindowDefinition::toString) + .collect(joining(", "))); } - - sql.append(orderByToString(oracleSiblings, orderByElements)); if (emitChanges) { - sql.append(" EMIT CHANGES"); - } - if (limit != null) { - sql.append(limit); - } - if (offset != null) { - sql.append(offset); - } - if (fetch != null) { - sql.append(fetch); - } - - if (withIsolation != null) { - sql.append(withIsolation); + builder.append(" EMIT CHANGES"); } if (isForUpdate()) { - sql.append(" FOR UPDATE"); + builder.append(" FOR UPDATE"); if (forUpdateTable != null) { - sql.append(" OF ").append(forUpdateTable); + builder.append(" OF ").append(forUpdateTable); } if (wait != null) { // Wait's toString will do the formatting for us - sql.append(wait); + builder.append(wait); } if (isNoWait()) { - sql.append(" NOWAIT"); + builder.append(" NOWAIT"); } else if (isSkipLocked()) { - sql.append(" SKIP LOCKED"); + builder.append(" SKIP LOCKED"); } } - if (optimizeFor != null) { - sql.append(optimizeFor); - } } else { // without from if (where != null) { - sql.append(" WHERE ").append(where); - } - - if (limit != null) { - sql.append(limit); - } - if (offset != null) { - sql.append(offset); + builder.append(" WHERE ").append(where); } - if (fetch != null) { - sql.append(fetch); - } - if (withIsolation != null) { - sql.append(withIsolation); - } - } - if (forXmlPath != null) { - sql.append(" FOR XML PATH(").append(forXmlPath).append(")"); - } - if (useBrackets) { - sql.append(")"); } - return sql.toString(); - } - - public static String orderByToString(List orderByElements) { - return orderByToString(false, orderByElements); - } - - public static String orderByToString(boolean oracleSiblings, List orderByElements) { - return getFormatedList(orderByElements, oracleSiblings ? "ORDER SIBLINGS BY" : "ORDER BY"); - } - - public static String getFormatedList(List list, String expression) { - return getFormatedList(list, expression, true, false); + return builder; } - public static String getFormatedList(List list, String expression, boolean useComma, boolean useBrackets) { - String sql = getStringList(list, useComma, useBrackets); + @Override + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", + "PMD.NPathComplexity"}) + public String toString() { + StringBuilder builder = new StringBuilder(); + super.appendTo(builder); - if (sql.length() > 0) { - if (expression.length() > 0) { - sql = " " + expression + " " + sql; - } else { - sql = " " + sql; - } + if (optimizeFor != null) { + builder.append(optimizeFor); } - return sql; - } - - /** - * List the toString out put of the objects in the List comma separated. If the List is null or empty an empty - * string is returned. - * - * The same as getStringList(list, true, false) - * - * @see #getStringList(List, boolean, boolean) - * @param list list of objects with toString methods - * @return comma separated list of the elements in the list - */ - public static String getStringList(List list) { - return getStringList(list, true, false); - } - - /** - * List the toString out put of the objects in the List that can be comma separated. If the List is null or empty an - * empty string is returned. - * - * @param list list of objects with toString methods - * @param useComma true if the list has to be comma separated - * @param useBrackets true if the list has to be enclosed in brackets - * @return comma separated list of the elements in the list - */ - public static String getStringList(List list, boolean useComma, boolean useBrackets) { - return appendStringListTo(new StringBuilder(), list, useComma, useBrackets).toString(); - } - - /** - * Append the toString out put of the objects in the List (that can be comma separated). If the List is null or - * empty an empty string is returned. - * - * @param list list of objects with toString methods - * @param useComma true if the list has to be comma separated - * @param useBrackets true if the list has to be enclosed in brackets - * @return comma separated list of the elements in the list - */ - public static StringBuilder appendStringListTo(StringBuilder builder, List list, boolean useComma, boolean useBrackets) { - if (list != null) { - String comma = useComma ? ", " : " "; - - if (useBrackets) { - builder.append("("); - } - - int size = list.size(); - for (int i = 0; i < size; i++) { - builder.append(list.get(i)).append(i < size - 1 - ? comma - : ""); - } - - if (useBrackets) { - builder.append(")"); - } + if (forXmlPath != null) { + builder.append(" FOR XML PATH(").append(forXmlPath).append(")"); } - return builder; + + return builder.toString(); } public PlainSelect withMySqlSqlCalcFoundRows(boolean mySqlCalcFoundRows) { @@ -641,26 +477,6 @@ public PlainSelect withWhere(Expression where) { return this; } - public PlainSelect withOrderByElements(List orderByElements) { - this.setOrderByElements(orderByElements); - return this; - } - - public PlainSelect withLimit(Limit limit) { - this.setLimit(limit); - return this; - } - - public PlainSelect withOffset(Offset offset) { - this.setOffset(offset); - return this; - } - - public PlainSelect withFetch(Fetch fetch) { - this.setFetch(fetch); - return this; - } - public PlainSelect withOptimizeFor(OptimizeFor optimizeFor) { this.setOptimizeFor(optimizeFor); return this; @@ -711,11 +527,6 @@ public PlainSelect withForUpdateTable(Table forUpdateTable) { return this; } - public PlainSelect withUseBrackets(boolean useBrackets) { - this.setUseBrackets(useBrackets); - return this; - } - public PlainSelect withForXmlPath(String forXmlPath) { this.setForXmlPath(forXmlPath); return this; @@ -747,7 +558,8 @@ public PlainSelect withWait(Wait wait) { } public PlainSelect addSelectItems(Collection selectItems) { - List collection = Optional.ofNullable(getSelectItems()).orElseGet(ArrayList::new); + List collection = + Optional.ofNullable(getSelectItems()).orElseGet(ArrayList::new); collection.addAll(selectItems); return this.withSelectItems(collection); } @@ -770,18 +582,6 @@ public PlainSelect addJoins(Collection joins) { return this.withJoins(collection); } - public PlainSelect addOrderByElements(OrderByElement... orderByElements) { - List collection = Optional.ofNullable(getOrderByElements()).orElseGet(ArrayList::new); - Collections.addAll(collection, orderByElements); - return this.withOrderByElements(collection); - } - - public PlainSelect addOrderByElements(Collection orderByElements) { - List collection = Optional.ofNullable(getOrderByElements()).orElseGet(ArrayList::new); - collection.addAll(orderByElements); - return this.withOrderByElements(collection); - } - public E getFromItem(Class type) { return type.cast(getFromItem()); } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Select.java b/src/main/java/net/sf/jsqlparser/statement/select/Select.java index 67a002777..8cdd567f0 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/Select.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/Select.java @@ -9,104 +9,284 @@ */ package net.sf.jsqlparser.statement.select; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.ExpressionVisitor; +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; + import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Optional; -import net.sf.jsqlparser.statement.Statement; -import net.sf.jsqlparser.statement.StatementVisitor; -public class Select implements Statement { +public abstract class Select extends ASTNodeAccessImpl implements Statement, Expression { + List withItemsList; + Limit limit; + Offset offset; + Fetch fetch; + WithIsolation isolation; + boolean oracleSiblings = false; + List orderByElements; + + public static String orderByToString(List orderByElements) { + return orderByToString(false, orderByElements); + } + + public static String orderByToString(boolean oracleSiblings, + List orderByElements) { + return getFormattedList(orderByElements, oracleSiblings ? "ORDER SIBLINGS BY" : "ORDER BY"); + } - private SelectBody selectBody; - private List withItemsList; + public static String getFormattedList(List list, String expression) { + return getFormattedList(list, expression, true, false); + } - private boolean useWithBrackets = false; + public static String getFormattedList(List list, String expression, boolean useComma, + boolean useBrackets) { + String sql = getStringList(list, useComma, useBrackets); - @Override - public void accept(StatementVisitor statementVisitor) { - statementVisitor.visit(this); + if (sql.length() > 0) { + if (expression.length() > 0) { + sql = " " + expression + " " + sql; + } else { + sql = " " + sql; + } + } + + return sql; + } + + /** + * List the toString out put of the objects in the List comma separated. If the List is null or + * empty an empty string is returned. + *

+ * The same as getStringList(list, true, false) + * + * @see #getStringList(List, boolean, boolean) + * @param list list of objects with toString methods + * @return comma separated list of the elements in the list + */ + public static String getStringList(List list) { + return getStringList(list, true, false); + } + + /** + * List the toString out put of the objects in the List that can be comma separated. If the List + * is null or empty an empty string is returned. + * + * @param list list of objects with toString methods + * @param useComma true if the list has to be comma separated + * @param useBrackets true if the list has to be enclosed in brackets + * @return comma separated list of the elements in the list + */ + public static String getStringList(List list, boolean useComma, boolean useBrackets) { + return appendStringListTo(new StringBuilder(), list, useComma, useBrackets).toString(); + } + + /** + * Append the toString out put of the objects in the List (that can be comma separated). If the + * List is null or empty an empty string is returned. + * + * @param list list of objects with toString methods + * @param useComma true if the list has to be comma separated + * @param useBrackets true if the list has to be enclosed in brackets + * @return comma separated list of the elements in the list + */ + public static StringBuilder appendStringListTo(StringBuilder builder, List list, + boolean useComma, boolean useBrackets) { + if (list != null) { + String comma = useComma ? ", " : " "; + + if (useBrackets) { + builder.append("("); + } + + int size = list.size(); + for (int i = 0; i < size; i++) { + builder.append(list.get(i)).append(i < size - 1 ? comma : ""); + } + + if (useBrackets) { + builder.append(")"); + } + } + return builder; + } + + public List getWithItemsList() { + return withItemsList; + } + + public void setWithItemsList(List withItemsList) { + this.withItemsList = withItemsList; + } + + public Select withWithItemsList(List withItemsList) { + this.setWithItemsList(withItemsList); + return this; } - public SelectBody getSelectBody() { - return selectBody; + public Select addWithItemsList(Collection withItemsList) { + List collection = + Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); + collection.addAll(withItemsList); + return this.withWithItemsList(collection); + } + + public Select addWithItemsList(WithItem... withItemsList) { + return addWithItemsList(Arrays.asList(withItemsList)); + } + + public boolean isOracleSiblings() { + return oracleSiblings; + } + + public void setOracleSiblings(boolean oracleSiblings) { + this.oracleSiblings = oracleSiblings; } - public Select withSelectBody(SelectBody body) { - setSelectBody(body); + public Select withOracleSiblings(boolean oracleSiblings) { + this.setOracleSiblings(oracleSiblings); return this; } - public void setSelectBody(SelectBody body) { - selectBody = body; + public List getOrderByElements() { + return orderByElements; } - public void setUsingWithBrackets(boolean useWithBrackets) { - this.useWithBrackets = useWithBrackets; + public void setOrderByElements(List orderByElements) { + this.orderByElements = orderByElements; } - public Select withUsingWithBrackets(boolean useWithBrackets) { - this.useWithBrackets = useWithBrackets; + public Select withOrderByElements(List orderByElements) { + this.setOrderByElements(orderByElements); return this; } - public boolean isUsingWithBrackets() { - return this.useWithBrackets; + public Select addOrderByElements(Collection orderByElements) { + List collection = + Optional.ofNullable(getOrderByElements()).orElseGet(ArrayList::new); + collection.addAll(orderByElements); + return this.withOrderByElements(collection); } - @Override - @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder retval = new StringBuilder(); + public Select addOrderByElements(OrderByElement... orderByElements) { + return addOrderByElements(Arrays.asList(orderByElements)); + } + + public Limit getLimit() { + return limit; + } + + public void setLimit(Limit limit) { + this.limit = limit; + } + + public Select withLimit(Limit limit) { + this.setLimit(limit); + return this; + } + + public Offset getOffset() { + return offset; + } + + public void setOffset(Offset offset) { + this.offset = offset; + } + + public Select withOffset(Offset offset) { + this.setOffset(offset); + return this; + } + + public Fetch getFetch() { + return fetch; + } + + public void setFetch(Fetch fetch) { + this.fetch = fetch; + } + + public Select withFetch(Fetch fetch) { + this.setFetch(fetch); + return this; + } + + public WithIsolation getIsolation() { + return isolation; + } + + public void setIsolation(WithIsolation isolation) { + this.isolation = isolation; + } + + public Select withIsolation(WithIsolation isolation) { + this.setIsolation(isolation); + return this; + } + + public abstract StringBuilder appendSelectBodyTo(StringBuilder builder); + + public StringBuilder appendTo(StringBuilder builder) { if (withItemsList != null && !withItemsList.isEmpty()) { - if (useWithBrackets) { - retval.append("( "); - } - retval.append("WITH "); + builder.append("WITH "); for (Iterator iter = withItemsList.iterator(); iter.hasNext();) { WithItem withItem = iter.next(); - retval.append(withItem); + builder.append(withItem); if (iter.hasNext()) { - retval.append(","); + builder.append(","); } - retval.append(" "); + builder.append(" "); } } - retval.append(selectBody); - if (withItemsList != null && !withItemsList.isEmpty() && useWithBrackets) { - retval.append(" )"); + + appendSelectBodyTo(builder); + + builder.append(orderByToString(oracleSiblings, orderByElements)); + + if (limit != null) { + builder.append(limit); + } + if (offset != null) { + builder.append(offset); + } + if (fetch != null) { + builder.append(fetch); + } + if (isolation != null) { + builder.append(isolation); } - return retval.toString(); - } - public List getWithItemsList() { - return withItemsList; + return builder; } - public void setWithItemsList(List withItemsList) { - this.withItemsList = withItemsList; + @Override + public String toString() { + return appendTo(new StringBuilder()).toString(); } - public Select withWithItemsList(List withItemsList) { - this.setWithItemsList(withItemsList); - return this; + public abstract void accept(SelectVisitor selectVisitor); + + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); } - public E getSelectBody(Class type) { - return type.cast(getSelectBody()); + @Override + public void accept(ExpressionVisitor expressionVisitor) { + expressionVisitor.visit(this); } - public Select addWithItemsList(WithItem... withItemsList) { - List collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); - Collections.addAll(collection, withItemsList); - return this.withWithItemsList(collection); + @Deprecated + public Select getSelectBody() { + return this; } - public Select addWithItemsList(Collection withItemsList) { - List collection = Optional.ofNullable(getWithItemsList()).orElseGet(ArrayList::new); - collection.addAll(withItemsList); - return this.withWithItemsList(collection); + @Deprecated + public E getSelectBody(Class type) { + return type.cast(this); } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectBody.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectBody.java deleted file mode 100644 index 8c9815d01..000000000 --- a/src/main/java/net/sf/jsqlparser/statement/select/SelectBody.java +++ /dev/null @@ -1,17 +0,0 @@ -/*- - * #%L - * JSQLParser library - * %% - * Copyright (C) 2004 - 2019 JSQLParser - * %% - * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 - * #L% - */ -package net.sf.jsqlparser.statement.select; - -import net.sf.jsqlparser.Model; - -public interface SelectBody extends Model { - - void accept(SelectVisitor selectVisitor); -} diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java index 0fff1527c..1d3643f50 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitor.java @@ -9,15 +9,17 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.statement.values.ValuesStatement; - public interface SelectVisitor { + void visit(ParenthesedSelect parenthesedSelect); + void visit(PlainSelect plainSelect); void visit(SetOperationList setOpList); void visit(WithItem withItem); - void visit(ValuesStatement aThis); + void visit(Values aThis); + + void visit(LateralSubSelect lateralSubSelect); } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java index 82d791813..91c6f32c2 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/SelectVisitorAdapter.java @@ -9,11 +9,14 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.statement.values.ValuesStatement; - @SuppressWarnings({"PMD.UncommentedEmptyMethodBody"}) public class SelectVisitorAdapter implements SelectVisitor { + @Override + public void visit(ParenthesedSelect parenthesedSelect) { + parenthesedSelect.getSelect().accept(this); + } + @Override public void visit(PlainSelect plainSelect) { @@ -30,7 +33,12 @@ public void visit(WithItem withItem) { } @Override - public void visit(ValuesStatement aThis) { + public void visit(Values aThis) { + + } + + @Override + public void visit(LateralSubSelect lateralSubSelect) { } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java b/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java index 98d11df25..1dbc5d96f 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/SetOperationList.java @@ -15,16 +15,11 @@ import java.util.List; import java.util.Optional; -public class SetOperationList implements SelectBody { +public class SetOperationList extends Select { - private List selects; - private List brackets; + private List getSelects() { return selects; } - public void setSelects(List selects) { + public void setSelects(List select, List ops) { selects = select; operations = ops; - this.brackets = brackets; - - if (select.size() - 1 != ops.size() || select.size() != brackets.size()) { - throw new IllegalArgumentException("list sizes are not valid"); - } - } - - public Limit getLimit() { - return limit; - } - - public void setLimit(Limit limit) { - this.limit = limit; - } - - public Offset getOffset() { - return offset; - } - - public void setOffset(Offset offset) { - this.offset = offset; - } - - public Fetch getFetch() { - return fetch; - } - - public void setFetch(Fetch fetch) { - this.fetch = fetch; - } - - public WithIsolation getWithIsolation() { - return this.withIsolation; - } - - public void setWithIsolation(WithIsolation withIsolation) { - this.withIsolation = withIsolation; } @Override - @SuppressWarnings({"PMD.CyclomaticComplexity"}) - public String toString() { - StringBuilder buffer = new StringBuilder(); - + public StringBuilder appendSelectBodyTo(StringBuilder builder) { for (int i = 0; i < selects.size(); i++) { if (i != 0) { - buffer.append(" ").append(operations.get(i - 1).toString()).append(" "); - } - if (brackets == null || brackets.get(i)) { - buffer.append("(").append(selects.get(i).toString()).append(")"); - } else { - buffer.append(selects.get(i).toString()); + builder.append(" ").append(operations.get(i - 1).toString()).append(" "); } + builder.append(selects.get(i).toString()); } if (orderByElements != null) { - buffer.append(PlainSelect.orderByToString(orderByElements)); - } - if (limit != null) { - buffer.append(limit.toString()); - } - if (offset != null) { - buffer.append(offset.toString()); - } - if (fetch != null) { - buffer.append(fetch.toString()); + builder.append(PlainSelect.orderByToString(orderByElements)); } - if (withIsolation != null) { - buffer.append(withIsolation.toString()); - } - return buffer.toString(); + return builder; } public SetOperationList withOperations(List operationList) { @@ -144,89 +77,38 @@ public SetOperationList withOperations(List operationList) { return this; } - public SetOperationList withSelects(List selects) { + public SetOperationList withSelects(List collection = Optional.ofNullable(getSelects()).orElseGet(ArrayList::new); Collections.addAll(collection, selects); return this.withSelects(collection); } - public SetOperationList addSelects(Collection selects) { - List collection = Optional.ofNullable(getSelects()).orElseGet(ArrayList::new); + public SetOperationList addSelects(Collection selects) { + List

intoTables = null; Table updateTable = null; @@ -2020,34 +2018,30 @@ PlainSelect PlainSelect() #PlainSelect: { - [ LOOKAHEAD(2) { plainSelect.setMySqlHintStraightJoin(true); } ] + [ { plainSelect.setMySqlHintStraightJoin(true); } ] { plainSelect.setOracleHint(getOracleHint()); } - [ LOOKAHEAD(2) skip = Skip() { plainSelect.setSkip(skip); } ] + [ LOOKAHEAD(2) skip = Skip() { plainSelect.setSkip(skip); } ] [ LOOKAHEAD(2) first = First() { plainSelect.setFirst(first); } ] [ LOOKAHEAD(2) - ( + ( + | - ( - { Distinct distinct = new Distinct(); plainSelect.setDistinct(distinct); } - [ LOOKAHEAD(2) "ON" "(" distinctOn=SelectItemsList() { plainSelect.getDistinct().setOnSelectItems(distinctOn); } ")" ] - ) + ( + { Distinct distinct = new Distinct(); plainSelect.setDistinct(distinct); } + [ LOOKAHEAD(2) "ON" "(" distinctOn=SelectItemsList() { plainSelect.getDistinct().setOnSelectItems(distinctOn); } ")" ] + ) | - ( - { Distinct distinct = new Distinct(true); plainSelect.setDistinct(distinct); } - ) + { Distinct distinct = new Distinct(true); plainSelect.setDistinct(distinct); } | - ( - { plainSelect.setMySqlSqlCalcFoundRows(true); } - ) + { plainSelect.setMySqlSqlCalcFoundRows(true); } | - ( - { plainSelect.setMySqlSqlCacheFlag(MySqlSqlCacheFlags.SQL_NO_CACHE); } - | { plainSelect.setMySqlSqlCacheFlag(MySqlSqlCacheFlags.SQL_CACHE); } - ) + { plainSelect.setMySqlSqlCacheFlag(MySqlSqlCacheFlags.SQL_NO_CACHE); } + | + { plainSelect.setMySqlSqlCacheFlag(MySqlSqlCacheFlags.SQL_CACHE); } ) ] @@ -2056,37 +2050,38 @@ PlainSelect PlainSelect() #PlainSelect: selectItems=SelectItemsList() [intoTables = IntoClause() { plainSelect.setIntoTables(intoTables); } ] - [ LOOKAHEAD(2) - fromItem=FromItem() - joins=JoinsList() ] + [ LOOKAHEAD(2) fromItem=FromItem() + [ LOOKAHEAD(2) joins=JoinsList() ] + ] [ LOOKAHEAD(2) ksqlWindow=KSQLWindowClause() { plainSelect.setKsqlWindow(ksqlWindow); } ] [ LOOKAHEAD(2) where=WhereClause() { plainSelect.setWhere(where); }] - [ oracleHierarchicalQueryClause=OracleHierarchicalQueryClause() { plainSelect.setOracleHierarchical(oracleHierarchicalQueryClause); } ] - [ groupBy=GroupByColumnReferences() { plainSelect.setGroupByElement(groupBy); }] - [ having=Having() { plainSelect.setHaving(having); }] - [LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOracleSiblings(true); plainSelect.setOrderByElements(orderByElements); } ] - [ + [ LOOKAHEAD(2) oracleHierarchicalQueryClause=OracleHierarchicalQueryClause() { plainSelect.setOracleHierarchical(oracleHierarchicalQueryClause); } ] + [ LOOKAHEAD(2) groupBy=GroupByColumnReferences() { plainSelect.setGroupByElement(groupBy); }] + [ LOOKAHEAD(2) having=Having() { plainSelect.setHaving(having); }] + [ LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOracleSiblings(true); plainSelect.setOrderByElements(orderByElements); } ] + [ LOOKAHEAD(2) windowName = RelObjectName() winDef = windowDefinition() { List winDefs = new ArrayList(); winDefs.add(winDef.withWindowName(windowName)); } ( LOOKAHEAD(2) "," windowName = RelObjectName() winDef = windowDefinition() { winDefs.add(winDef.withWindowName(windowName)); } )* { plainSelect.setWindowDefinitions(winDefs); } ] - [LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ] - [ { plainSelect.setEmitChanges(true); } ] - [LOOKAHEAD() limit = LimitWithOffset() { plainSelect.setLimit(limit); } ] - [LOOKAHEAD() offset = Offset() { plainSelect.setOffset(offset); } ] - [LOOKAHEAD(, { limit==null }) limit = LimitWithOffset() { plainSelect.setLimit(limit); } ] - [LOOKAHEAD() fetch = Fetch() { plainSelect.setFetch(fetch); } ] - [LOOKAHEAD( ) withIsolation = WithIsolation() { plainSelect.setWithIsolation(withIsolation); } ] - [LOOKAHEAD(2) { plainSelect.setForUpdate(true); } - [ updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ] + [ LOOKAHEAD( ) orderByElements = OrderByElements() { plainSelect.setOrderByElements(orderByElements); } ] + [ LOOKAHEAD(2) { plainSelect.setEmitChanges(true); } ] + [ LOOKAHEAD() limit = LimitWithOffset() { plainSelect.setLimit(limit); } ] + [ LOOKAHEAD() offset = Offset() { plainSelect.setOffset(offset); } ] + [ LOOKAHEAD(, { limit==null }) limit = LimitWithOffset() { plainSelect.setLimit(limit); } ] + [ LOOKAHEAD() fetch = Fetch() { plainSelect.setFetch(fetch); } ] + [ LOOKAHEAD( ) withIsolation = WithIsolation() { plainSelect.setIsolation(withIsolation); } ] + [ LOOKAHEAD(2) { plainSelect.setForUpdate(true); } + [ LOOKAHEAD(2) updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ] [ LOOKAHEAD() wait = Wait() { plainSelect.setWait(wait); } ] - [ { plainSelect.setNoWait(true); } - | { plainSelect.setSkipLocked(true); } ] ] + [ LOOKAHEAD(2) { plainSelect.setNoWait(true); } + | { plainSelect.setSkipLocked(true); } ] + ] - [LOOKAHEAD() optimize = OptimizeFor() { plainSelect.setOptimizeFor(optimize); } ] + [ LOOKAHEAD() optimize = OptimizeFor() { plainSelect.setOptimizeFor(optimize); } ] - [LOOKAHEAD(3) "(" token = ")" { plainSelect.setForXmlPath(token.image); } ] + [ LOOKAHEAD(3) "(" token = ")" { plainSelect.setForXmlPath(token.image); } ] { plainSelect.setSelectItems(selectItems); @@ -2098,117 +2093,76 @@ PlainSelect PlainSelect() #PlainSelect: } } -SelectBody SetOperationList() #SetOperationList: { +Select SetOperationList(Select select) #SetOperationList: { SetOperationList list = new SetOperationList(); List orderByElements = null; Limit limit = null; Offset offset = null; Fetch fetch = null; WithIsolation withIsolation = null; - SelectBody select = null; - List selects = new ArrayList(); + //Select select = null; + List(); List operations = new ArrayList(); - List brackets = new ArrayList(); - boolean bracket = false; } { - (("(" select=SelectBody() ")" { bracket=true;} ) - | ( select=PlainSelect() | select=Values() ) { bracket=false;} ) {selects.add(select);brackets.add(bracket); } - ( LOOKAHEAD(2) - (( { UnionOp union = new UnionOp();linkAST(union,jjtThis);operations.add(union); } [ { union.setAll(true); } | { union.setDistinct(true); } ]) - | { operations.add(new IntersectOp()); } - | { operations.add(new MinusOp()); } - | { operations.add(new ExceptOp()); } - ) - - (("(" select=SelectBody() ")" { bracket=true;} ) | ( select=PlainSelect() | select=Values() ) { bracket=false;} ) {selects.add(select);brackets.add(bracket);} - )* - - - [ LOOKAHEAD(2) orderByElements=OrderByElements() {list.setOrderByElements(orderByElements);} ] - [LOOKAHEAD() limit=LimitWithOffset() {list.setLimit(limit);} ] - [LOOKAHEAD() offset = Offset() { list.setOffset(offset);} ] - [LOOKAHEAD() fetch = Fetch() { list.setFetch(fetch);} ] - [LOOKAHEAD( ) withIsolation = WithIsolation() { list.setWithIsolation(withIsolation);} ] - - { - if (selects.size()==1 && selects.get(0) instanceof PlainSelect && orderByElements==null) { - if (brackets.get(0)) { - if (limit==null && offset==null && fetch==null && withIsolation==null) - ((PlainSelect)selects.get(0)).setUseBrackets(true); - else { - list.setBracketsOpsAndSelects(brackets,selects,operations); - return list; //brackets with outside limit, offset - } - } - return selects.get(0); - } else { - if (selects.size()>1 && selects.get(selects.size()-1) instanceof PlainSelect && !brackets.get(brackets.size() - 1)) { - PlainSelect ps = (PlainSelect)selects.get(selects.size()-1); - if (ps.getOrderByElements() != null) { - list.setOrderByElements(ps.getOrderByElements()); - list.setLimit(ps.getLimit()); - list.setOffset(ps.getOffset()); - ps.setOrderByElements(null); - ps.setLimit(null); - ps.setOffset(null); - } - if (ps.getFetch() != null) { - list.setFetch(ps.getFetch()); - ps.setFetch(null); - } - if (ps.getWithIsolation() != null) { - list.setWithIsolation(ps.getWithIsolation()); - ps.setWithIsolation(null); - } - } - list.setBracketsOpsAndSelects(brackets,selects,operations); - return list; - } - } -} -SelectBody SetOperationListWithoutIntialSelect(FromItem fromItem) #SetOperationList: -{ - SetOperationList list = new SetOperationList(); - List orderByElements = null; - Limit limit = null; - Offset offset = null; - Fetch fetch = null; - WithIsolation withIsolation = null; - SelectBody select; - List selects = new ArrayList(); - List operations = new ArrayList(); - List brackets = new ArrayList(); - boolean bracket = false; -} -{ { - while (fromItem instanceof ParenthesisFromItem) { - fromItem = ((ParenthesisFromItem)fromItem).getFromItem(); - } - - if (fromItem instanceof SubSelect) { - select = ((SubSelect)fromItem).getSelectBody(); - } else { - throw new IllegalArgumentException("this type of set operation is not allowed"); - } - selects.add(select); - brackets.add(true); - } - ( LOOKAHEAD(2) - (( { UnionOp union = new UnionOp();linkAST(union,jjtThis);operations.add(union); } [ { union.setAll(true); } | { union.setDistinct(true); } ]) - | { operations.add(new IntersectOp()); } - | { operations.add(new MinusOp()); } - | { operations.add(new ExceptOp()); } + } + + ( LOOKAHEAD(2) ( + ( + { UnionOp union = new UnionOp(); linkAST(union,jjtThis); operations.add(union); } + [ { union.setAll(true); } | { union.setDistinct(true); } ] + ) + | + { operations.add(new IntersectOp()); } + | + { operations.add(new MinusOp()); } + | + { operations.add(new ExceptOp()); } ) - "(" select=SelectBody() ")" { bracket=true;} {selects.add(select);brackets.add(bracket);} + ( + select = PlainSelect() + | + select = Values() + | + select = ParenthesedSelect() + ) + { + selects.add(select); + } )+ - { - list.setBracketsOpsAndSelects(brackets,selects,operations); + [ LOOKAHEAD(2) orderByElements=OrderByElements() {list.setOrderByElements(orderByElements);} ] + [ LOOKAHEAD() limit = LimitWithOffset() { list.setLimit(limit); } ] + [ LOOKAHEAD() offset = Offset() { list.setOffset(offset); } ] + [ LOOKAHEAD(, { limit==null }) limit = LimitWithOffset() { list.setLimit(limit); } ] + [ LOOKAHEAD() fetch = Fetch() { list.setFetch(fetch); } ] + [ LOOKAHEAD( ) withIsolation = WithIsolation() { list.setIsolation(withIsolation); } ] + + { + if ( selects.get(selects.size()-1) instanceof PlainSelect ) { + PlainSelect ps = (PlainSelect)selects.get(selects.size()-1); + if (ps.getOrderByElements() != null) { + list.setOrderByElements(ps.getOrderByElements()); + list.setLimit(ps.getLimit()); + list.setOffset(ps.getOffset()); + ps.setOrderByElements(null); + ps.setLimit(null); + ps.setOffset(null); + } + if (ps.getFetch() != null) { + list.setFetch(ps.getFetch()); + ps.setFetch(null); + } + if (ps.getIsolation() != null) { + list.setIsolation(ps.getIsolation()); + ps.setIsolation(null); + } + } + list.setBracketsOpsAndSelects(selects,operations); return list; } } @@ -2226,28 +2180,19 @@ List WithList(): WithItem WithItem() #WithItem: { - WithItem with = new WithItem(); - String name = null; - List selectItems = null; - SubSelect select = null; - - ExpressionList simpleExpressionList; + WithItem withItem = new WithItem(); + String name; + List selectItems; + Select select; } { - [ { with.setRecursive(true); } ] name=RelObjectName() { with.setName(name); } - [ "(" selectItems=SelectItemsList() ")" { with.setWithItemList(selectItems); } ] - - // if the next block looks alike an ExpressionList without Brackets, then parse as List - ( LOOKAHEAD( "(" SimpleExpressionList(true) ")" ) - "(" - simpleExpressionList = SimpleExpressionList(true) { with.withUseBracketsForValues(false).setItemsList(simpleExpressionList); } - ")" - - // Otherwise parse it as a SubSelect - | "(" select = SubSelect() { with.setSubSelect(select.withUseBrackets(false)); with.setUseValues(false); } ")" - - ) - { return with; } + [ { withItem.setRecursive(true); } ] + name=RelObjectName() { withItem.setAlias( new Alias( name, false)); } + [ "(" selectItems=SelectItemsList() ")" { withItem.setWithItemList(selectItems); } ] + select = ParenthesedSelect() { withItem.setSelect(select); } + { + return withItem; + } } List SelectItemsList(): @@ -2496,7 +2441,7 @@ PivotXml PivotXml(): List forColumns; List singleInItems = null; List multiInItems = null; - SelectBody inSelect = null; + Select inSelect = null; } { "(" functionItems = PivotFunctionItems() @@ -2504,7 +2449,7 @@ PivotXml PivotXml(): "(" ( LOOKAHEAD(2) { retval.setInAny(true); } | - LOOKAHEAD(1) inSelect = SelectBody() | + LOOKAHEAD(1) inSelect = Select() | LOOKAHEAD(2) singleInItems = PivotSingleInItems() | multiInItems = PivotMultiInItems() ) @@ -2560,6 +2505,23 @@ List
IntoClause(): } } +FromItem ParenthesedFromItem(): +{ + ParenthesedFromItem ParenthesedFromItem = new ParenthesedFromItem(); + FromItem fromItem; + List joins = null; +} +{ + "(" + fromItem = FromItem() + [ joins=JoinsList() ] + ")" + + { + return ParenthesedFromItem.withFromItem(fromItem).withJoins(joins); + } +} + FromItem FromItem(): { FromItem fromItem = null; @@ -2569,156 +2531,60 @@ FromItem FromItem(): Alias alias = null; MySQLIndexHint indexHint = null; SQLServerHints sqlServerHints = null; - SelectBody selectBody; + Select select; } { ( - LOOKAHEAD(ValuesList()) fromItem=ValuesList() - | + ( + LOOKAHEAD( TableFunction() ) fromItem=TableFunction() + | + LOOKAHEAD(3) fromItem=Table() + | + LOOKAHEAD( ParenthesedFromItem() ) fromItem = ParenthesedFromItem() + | + LOOKAHEAD(3) ( + fromItem=ParenthesedSelect() + [ LOOKAHEAD(2) pivot=Pivot() { fromItem.setPivot(pivot); } ] + [ LOOKAHEAD(2) unpivot=UnPivot() { fromItem.setUnPivot(unpivot); } ] + ) + | + fromItem=LateralSubSelect() + ) + + [ LOOKAHEAD(2) alias=Alias() { fromItem.setAlias(alias); } ] + [ LOOKAHEAD(2) unpivot=UnPivot() { fromItem.setUnPivot(unpivot); } ] + [ LOOKAHEAD(2) ( LOOKAHEAD(2) pivot=PivotXml() | pivot=Pivot() ) { fromItem.setPivot(pivot); } ] + [ + LOOKAHEAD(2) ( - ( - "(" - ( - LOOKAHEAD(3) fromItem2=FromItem() - { fromItem = new ParenthesisFromItem(fromItem2); } - [ fromItem = SubJoin(fromItem2) ] - /* LOOKAHEAD(SubJoin()) - fromItem=SubJoin() */ - | - fromItem=SubSelect() - ) - [ selectBody = SetOperationListWithoutIntialSelect(fromItem) - { - if (!(selectBody instanceof PlainSelect)) { - fromItem = new SubSelect().withSelectBody(selectBody); - } - } - ] - ")" - [ LOOKAHEAD(2) unpivot=UnPivot() { fromItem.setUnPivot(unpivot); } ] - ) - | - LOOKAHEAD(TableFunction()) - fromItem=TableFunction() - | - fromItem=Table() + indexHint = MySQLIndexHint() { + if (fromItem instanceof Table) + ((Table) fromItem).setHint(indexHint); + } | - fromItem=LateralSubSelect() + sqlServerHints = SQLServerHints() { + if (fromItem instanceof Table) + ((Table) fromItem).setSqlServerHints(sqlServerHints); + } ) - [ LOOKAHEAD(2) alias=Alias() { fromItem.setAlias(alias); } ] - [ LOOKAHEAD(2) unpivot=UnPivot() { fromItem.setUnPivot(unpivot); } ] - [(LOOKAHEAD(2) pivot=PivotXml()|pivot=Pivot()) { fromItem.setPivot(pivot); } ] - [ - LOOKAHEAD(2) - ( - indexHint = MySQLIndexHint() { - if (fromItem instanceof Table) - ((Table) fromItem).setHint(indexHint); - } - | - sqlServerHints = SQLServerHints() { - if (fromItem instanceof Table) - ((Table) fromItem).setSqlServerHints(sqlServerHints); - } - ) - ] - ) + ] ) { return fromItem; } } -FromItem ValuesList(): -{ - MultiExpressionList exprList = new MultiExpressionList(); - List primaryExpList = new ArrayList(); - ValuesList valuesList = new ValuesList(); - Expression exp = null; - List colNames = null; - String colName; - Alias alias; -} -{ - "(" - - (LOOKAHEAD(3) ("(" exp=SimpleExpression() { primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { exprList.addExpressionList(primaryExpList); } - - ("," "(" exp=SimpleExpression() { - primaryExpList = new ArrayList(); - primaryExpList.add(exp); } - ("," exp=SimpleExpression() { primaryExpList.add(exp); } )* ")" { exprList.addExpressionList(primaryExpList); } )*) - | - ( exp=SimpleExpression() { exprList.addExpressionList(exp); valuesList.setNoBrackets(true); } - ("," exp=SimpleExpression() { exprList.addExpressionList(exp);} )* - )) - ")" - - [ LOOKAHEAD(2) alias=Alias() { valuesList.setAlias(alias); } - - [ "(" - colName = RelObjectName() { colNames = new ArrayList(); colNames.add(colName); } - ( "," colName = RelObjectName() { colNames.add(colName); } )* - ")" { valuesList.setColumnNames(colNames); } ] - - ] - - { - valuesList.setMultiExpressionList(exprList); - return valuesList; - } -} - -LateralSubSelect LateralSubSelect(): -{ - LateralSubSelect specialSubSelect; - SubSelect subSelect = null; -} -{ - { specialSubSelect = new LateralSubSelect(); } - "(" subSelect=SubSelect() ")" - { - specialSubSelect.setSubSelect(subSelect); - return specialSubSelect; - } -} - -FromItem SubJoin(FromItem fromItem): -{ - Join join = null; - List joinList = null; -} -{ - joinList=SubJoinsList() - { - SubJoin subJoin = new SubJoin(); - subJoin.setLeft(fromItem); - subJoin.setJoinList(joinList); - return subJoin; - } -} - List JoinsList(): { List joinsList = new ArrayList(); Join join = null; } { - ( LOOKAHEAD(2) join=JoinerExpression() { joinsList.add(join); })* - { return joinsList; } -} - -List SubJoinsList(): -{ - List joinsList = new ArrayList(); - Join join = null; -} -{ - - (join=JoinerExpression() { joinsList.add(join); })+ - { return joinsList; } + ( LOOKAHEAD(2) join=JoinerExpression() { joinsList.add(join); } )+ + { + return joinsList; + } } @@ -2875,16 +2741,22 @@ OracleHierarchicalExpression OracleHierarchicalQueryClause(): } { ( - expr=AndExpression() {result.setStartExpression(expr);} - [ { result.setNoCycle(true); } ] expr=AndExpression() - { result.setConnectExpression(expr); } - | - [ { result.setNoCycle(true); } ] expr=AndExpression() - { - result.setConnectExpression(expr); - result.setConnectFirst(true); - } - [ expr=AndExpression() {result.setStartExpression(expr);} ] + ( + expr=AndExpression() {result.setStartExpression(expr);} + [ { result.setNoCycle(true); } ] expr=AndExpression() + { + result.setConnectExpression(expr); + } + ) + | + ( + [ { result.setNoCycle(true); } ] expr=AndExpression() + { + result.setConnectExpression(expr); + result.setConnectFirst(true); + } + [ expr=AndExpression() {result.setStartExpression(expr);} ] + ) ) { return result; @@ -2917,7 +2789,7 @@ GroupByElement GroupByColumnReferences(): )? ) | - LOOKAHEAD(2) ( + LOOKAHEAD(2) ( "(" ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); } | LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); } @@ -2929,7 +2801,7 @@ GroupByElement GroupByColumnReferences(): ")" ) | - LOOKAHEAD(2) ( + LOOKAHEAD(2) ( list = ComplexExpressionList() { groupBy.setGroupByExpressionList(list.withUsingBrackets(false)); } ( LOOKAHEAD(2) ( @@ -2982,11 +2854,13 @@ OrderByElement OrderByElement(): } { columnReference = Expression() - [ ( | ( { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ] - [ ( - { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } | - { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); } - )? + [ LOOKAHEAD(2) ( | ( { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ] + [ LOOKAHEAD(2) + [ + { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } + | + { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); } + ] ] { orderByElement.setExpression(columnReference); @@ -3049,7 +2923,7 @@ Limit PlainLimit() #PlainLimit: ( ( - LOOKAHEAD(3) "(" rowCountExpression = SubSelect() ")" + LOOKAHEAD(3) "(" rowCountExpression = ParenthesedSelect() ")" | rowCountExpression = Expression() ) { limit.setRowCount(rowCountExpression); } @@ -3072,7 +2946,7 @@ Offset Offset(): offsetExpression=Expression() { offset.setOffset( offsetExpression ); } - [( { offset.setOffsetParam("ROWS"); } | { offset.setOffsetParam("ROW"); })] + [ LOOKAHEAD(2) ( { offset.setOffsetParam("ROWS"); } | { offset.setOffsetParam("ROW"); })] ) { @@ -3201,14 +3075,17 @@ First First(): JdbcParameter jdbc; } { - ( { first.setKeyword(First.Keyword.FIRST); } - | { first.setKeyword(First.Keyword.LIMIT); } - ) ( - token= { first.setRowCount(Long.parseLong(token.image)); } - | token= { first.setVariable(token.image); } - | jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); } - /* "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ + { first.setKeyword(First.Keyword.FIRST); } + | + { first.setKeyword(First.Keyword.LIMIT); } + ) + ( + token= { first.setRowCount(Long.parseLong(token.image)); } + | + token= { first.setVariable(token.image); } + | + jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); } ) { return first; @@ -3442,7 +3319,7 @@ Expression InExpression() #InExpression : LOOKAHEAD(2) token= { result.setRightExpression(new StringValue(token.image)); } | LOOKAHEAD(3) rightExpression = Function() { result.setRightExpression(rightExpression); } | LOOKAHEAD( "(" ComplexExpressionList() ")" ) "(" rightItemsList=ComplexExpressionList() { result.setRightItemsList(rightItemsList.withBrackets(true) ); } ")" - | LOOKAHEAD(3) "(" rightExpression = SubSelect() { result.setRightExpression( ((SubSelect) rightExpression).withUseBrackets(true) ); } ")" + | LOOKAHEAD(3) rightExpression = ParenthesedSelect() { result.setRightExpression( rightExpression ); } | LOOKAHEAD(2) rightExpression = SimpleExpression() { result.setRightExpression(rightExpression); } ) { @@ -3451,35 +3328,6 @@ Expression InExpression() #InExpression : } } -MultiExpressionList MultiInExpressions(): -{ - MultiExpressionList multiExpressionList = null; - ExpressionList expressionList = null; -} -{ - "(" "(" - expressionList=SimpleExpressionList(true) { - if(multiExpressionList == null) { - multiExpressionList = new MultiExpressionList(); - } - multiExpressionList.addExpressionList(expressionList); - } - // potentially additional expression lists - ( LOOKAHEAD(3) - ")" "," "(" expressionList=SimpleExpressionList(true) - { - if(multiExpressionList == null) { - multiExpressionList = new MultiExpressionList(); - } - multiExpressionList.addExpressionList(expressionList); - } - )* - ")" ")" - { - return multiExpressionList; - } -} - Expression Between(Expression leftExpression) : { Between result = new Between(); @@ -3597,20 +3445,6 @@ Expression ExistsExpression(): } } -ExpressionList SQLExpressionList(): -{ - ExpressionList retval = new ExpressionList(); - List expressions = new ArrayList(); - Expression expr = null; -} -{ - expr=Expression() { expressions.add(expr); } ("," expr=Expression() { expressions.add(expr); })* - { - retval.setExpressions(expressions); - return retval; - } -} - ExpressionList SimpleExpressionList(boolean outerBrackets) #ExpressionList: { ExpressionList retval = new ExpressionList().withBrackets(outerBrackets); @@ -3765,7 +3599,7 @@ Expression AnyComparisonExpression() : { AnyComparisonExpression anyComparisonExpr = null; AnyType anyType; - SubSelect subSelect; + ParenthesedSelect subSelect; ItemsList simpleExpressionList; } { @@ -3779,8 +3613,8 @@ Expression AnyComparisonExpression() : simpleExpressionList = SimpleExpressionList(false) { anyComparisonExpr=new AnyComparisonExpression(anyType, simpleExpressionList).withUseBracketsForValues(false); } ) - // Otherwise parse it as a SubSelect - | subSelect = SubSelect() { anyComparisonExpr=new AnyComparisonExpression(anyType, subSelect.withUseBrackets(false)).withUseBracketsForValues(false); } + // Otherwise parse it as a ParenthesedSelect + | subSelect = ParenthesedSelect() { anyComparisonExpr=new AnyComparisonExpression(anyType, subSelect).withUseBracketsForValues(false); } ) ")" @@ -4060,7 +3894,7 @@ Expression PrimaryExpression() #PrimaryExpression: | "{ts" token= "}" { retval = new TimestampValue(token.image); } - | LOOKAHEAD("(" retval=SubSelect() ")", {!interrupted} ) "(" retval=SubSelect() ")" + | LOOKAHEAD( ParenthesedSelect() , {!interrupted} ) retval=ParenthesedSelect() | ( "(" ( LOOKAHEAD( { getAsBoolean(Feature.allowComplexParsing) && !interrupted } ) list = ComplexExpressionList() | list = SimpleExpressionList(true) ) ")" @@ -4243,7 +4077,7 @@ JsonExpression JsonExpression() : { | token= { expr = new StringValue(token.image); } | - LOOKAHEAD( {!interrupted} ) "(" expr=SubSelect() ")" + LOOKAHEAD( {!interrupted} ) "(" expr=ParenthesedSelect() ")" ) ( "::" type=ColDataType() { @@ -4933,7 +4767,7 @@ Function InternalFunction(Function retval) : ExpressionList expressionList = null; NamedExpressionList namedExpressionList = null; KeepExpression keep = null; - SubSelect expr = null; + Select expr = null; Token tk1 = null; Token tk2 = null; Expression attributeExpression = null; @@ -4954,7 +4788,7 @@ Function InternalFunction(Function retval) : | LOOKAHEAD(3) (expressionList=SimpleExpressionList(false) [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ]) | - expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr).withUsingBrackets(false); } + expr = Select() { expressionList = new ExpressionList(expr).withUsingBrackets(false); } )] [ {retval.setIgnoreNulls(true); }] @@ -5091,22 +4925,6 @@ TableFunction TableFunction(): { return functionItem; } } -SubSelect SubSelect() #SubSelect: -{ - SelectBody selectBody = null; - SubSelect subSelect = new SubSelect(); - List with = null; -} -{ - [ with=WithList() { subSelect.setWithItemsList(with); } ] - selectBody=SelectBody() - { - subSelect.setSelectBody(selectBody); - linkAST(subSelect,jjtThis); - return subSelect; - } -} - List ColumnNamesWithParamsList() : { List colNames = new ArrayList(); String columnName; @@ -5450,7 +5268,7 @@ CreateTable CreateTable(): // see https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm#i2126725 // table properties , all these are optional [ rowMovement = RowMovement() { createTable.setRowMovement(rowMovement); }] - [ select = SelectWithWithItems( ) { createTable.setSelect(select, false); }] + [ select = Select() { createTable.setSelect(select, false); }] [ ( LOOKAHEAD("(" Table() ")") "(" likeTable=Table() { createTable.setLikeTable(likeTable, true); } ")" | likeTable=Table() { createTable.setLikeTable(likeTable, false); } ) @@ -5578,7 +5396,7 @@ CreateView CreateView(): [LOOKAHEAD(3) {createView.setIfNotExists(true);}] [ columnNames = ColumnsNamesList() { createView.setColumnNames(columnNames); } ] - select=SelectWithWithItems( ) { createView.setSelect(select); } + select=Select( ) { createView.setSelect(select); } [ { createView.setWithReadOnly(true); } ] { return createView; } } @@ -5607,7 +5425,7 @@ AlterView AlterView(): { AlterView alterView = new AlterView(); Table view = null; - SelectBody select = null; + Select select = null; List columnNames = null; } { @@ -5615,7 +5433,7 @@ AlterView AlterView(): view=Table() { alterView.setView(view); } [ columnNames = ColumnsNamesList() { alterView.setColumnNames(columnNames); } ] - select=SelectBody() { alterView.setSelectBody(select); } + select=Select() { alterView.setSelect(select); } { return alterView; } } diff --git a/src/site/sphinx/changelog.rst b/src/site/sphinx/changelog.rst index f82169468..bfbe03195 100644 --- a/src/site/sphinx/changelog.rst +++ b/src/site/sphinx/changelog.rst @@ -8,6 +8,48 @@ Latest Changes since |JSQLPARSER_VERSION| ============================================================= + * **feat: Refactor SelectBody implementations** + + Andreas Reichel, 2023-03-27 + * **feat: Refactor SelectBody implementations** + + Andreas Reichel, 2023-03-26 + * **style: Appease PMD/Codacy** + + Andreas Reichel, 2023-03-25 + * **style: Appease PMD/Codacy** + + Andreas Reichel, 2023-03-25 + * **feat: ParenthesedSelectBody and ParenthesedFromItem** + + Andreas Reichel, 2023-03-25 + * **feat: ParenthesedSelectBody and ParenthesedFromItem** + + Andreas Reichel, 2023-03-24 + * **feat: ParenthesedSelectBody and ParenthesedFromItem** + + Andreas Reichel, 2023-03-23 + * **feat: ParenthesedSelectBody and ParenthesedFromItem** + + Andreas Reichel, 2023-03-23 + * **feat: ParenthesedSelectBody and ParenthesedFromItem** + + Andreas Reichel, 2023-03-23 + * **feat: ParenthesedSelectBody and ParenthesedFromItem** + + Andreas Reichel, 2023-03-23 + * **Assorted Fixes #7 (#1745)** + + manticore-projects, 2023-03-21 + * **disable xml report (#1748)** + + optimizing-ci-builds, 2023-03-21 + * **build: better Upload Groovy Task** + + Andreas Reichel, 2023-03-18 + * **doc: fix reference in the Java Doc** + + Andreas Reichel, 2023-03-18 * **feat: `ConflictTarget` allows multiple `IndexColumnNames`** Andreas Reichel, 2023-03-18 diff --git a/src/site/sphinx/syntax.rst b/src/site/sphinx/syntax.rst index 37aa83331..15c299280 100644 --- a/src/site/sphinx/syntax.rst +++ b/src/site/sphinx/syntax.rst @@ -55,28 +55,23 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - - - ( - - WithList - - Select - ) - - WithList + + + WithList + + SelectWithWithItems - Select - - Insert - - Update - - Delete - - Merge + Insert + + Update + + Delete + + Merge + + Select Upsert @@ -143,13 +138,13 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. PurgeStatement - AlterSystemStatement - -
+ AlterSystemStatement + +
-
         ::= '(' WithList Select ')'
-
           | WithList? ( Select | Insert | Update | Delete | Merge )
+
         ::= WithList? ( SelectWithWithItems | Insert | Update | Delete | Merge )
+
           | Select
           | Upsert
           | AlterTable
           | AlterSession
@@ -517,19 +512,19 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + EXPLAIN - ExplainStatementOptions - - SelectWithWithItems - -
+ ExplainStatementOptions + + Select + +
- +
Referenced by:
@@ -790,7 +785,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
Values   ::= ( 'VALUES' | 'VALUE' ) SimpleExpressionList
Referenced by: -
+
====================================================================================================================== @@ -800,64 +795,64 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - UPDATE - - LOW_PRIORITY - - IGNORE - - TableWithAlias - - JoinsList - SET - - Column - = - - SimpleExpression - , - - ( - - Column - , - - ) - - = - - SubSelect - ( - - ComplexExpressionList - ) - - Expression - , - - OutputClause - FROM - - FromItem - - JoinsList - - WhereClause - - OrderByElements - - PlainLimit - RETURNING - - SelectItemsList - -
- -
Update   ::= 'UPDATE' 'LOW_PRIORITY'? 'IGNORE'? TableWithAlias JoinsList 'SET' ( Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | '('? Column ( ',' Column )* ')'? '=' ( SubSelect | '(' ComplexExpressionList ')' | Expression ) ( ',' '('? Column ( ',' Column )* ')'? '=' ( SubSelect | '(' ComplexExpressionList ')' | Expression ) )* ) OutputClause? ( 'FROM' FromItem JoinsList )? WhereClause? OrderByElements? PlainLimit? ( 'RETURNING' SelectItemsList )?
+ + + + + UPDATE + + LOW_PRIORITY + + IGNORE + + TableWithAlias + + JoinsList + SET + + Column + = + + SimpleExpression + , + + ( + + Column + , + + ) + + = + + ParenthesedSelectBody + ( + + ComplexExpressionList + ) + + Expression + , + + OutputClause + FROM + + FromItem + + JoinsList + + WhereClause + + OrderByElements + + PlainLimit + RETURNING + + SelectItemsList + +
+ +
Update   ::= 'UPDATE' 'LOW_PRIORITY'? 'IGNORE'? TableWithAlias JoinsList? 'SET' ( Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | '('? Column ( ',' Column )* ')'? '=' ( ParenthesedSelectBody | '(' ComplexExpressionList ')' | Expression ) ( ',' '('? Column ( ',' Column )* ')'? '=' ( ParenthesedSelectBody | '(' ComplexExpressionList ')' | Expression ) )* ) OutputClause? ( 'FROM' FromItem JoinsList? )? WhereClause? OrderByElements? PlainLimit? ( 'RETURNING' SelectItemsList )?
Referenced by:
@@ -928,9 +923,9 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. = SimpleExpression - , - - SelectWithWithItems + , + + Select ON DUPLICATE @@ -954,12 +949,12 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. InsertConflictAction RETURNING - SelectItemsList + SelectItemsList
Insert   ::= 'INSERT' ( 'LOW_PRIORITY' | 'DELAYED' | 'HIGH_PRIORITY' )? 'IGNORE'? 'INTO'? - Table ( 'AS'? RelObjectNameWithoutValue )? ( '(' Column ( ',' Column )* ')' )? OutputClause? ( 'SET' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | SelectWithWithItems ) ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* )? ( 'ON' 'CONFLICT' InsertConflictTarget? InsertConflictAction )? ( 'RETURNING' SelectItemsList )?
+ Table ( 'AS'? RelObjectNameWithoutValue )? ( '(' Column ( ',' Column )* ')' )? OutputClause? ( 'SET' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | Select ) ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* )? ( 'ON' 'CONFLICT' InsertConflictTarget? InsertConflictAction )? ( 'RETURNING' SelectItemsList )?
Referenced by:
@@ -972,26 +967,28 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - ( - - RelObjectNameExt2 - ) - - WhereClause - ON - - CONSTRAINT - - RelObjectNameExt2 - -
+ + + + + ( + + RelObjectNameExt2 + , + + ) + + WhereClause + ON + + CONSTRAINT + + RelObjectNameExt2 + +
-
         ::= '(' RelObjectNameExt2 ')' WhereClause?
+
         ::= '(' RelObjectNameExt2 ( ',' RelObjectNameExt2 )* ')' WhereClause?
           | 'ON' 'CONSTRAINT' RelObjectNameExt2
Referenced by: @@ -1030,9 +1027,9 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. ) - = - - SubSelect + = + + ParenthesedSelectBody ( ComplexExpressionList @@ -1041,12 +1038,12 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. Expression , - WhereClause + WhereClause
-
         ::= 'DO' ( 'NOTHING' | 'UPDATE' 'SET' ( Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | '('? Column ( ',' Column )* ')'? '=' ( SubSelect | '(' ComplexExpressionList ')' | Expression ) ( ',' '('? Column ( ',' Column )* ')'? '=' ( SubSelect | '(' ComplexExpressionList ')' | Expression ) )* ) WhereClause? )
+
         ::= 'DO' ( 'NOTHING' | 'UPDATE' 'SET' ( Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | '('? Column ( ',' Column )* ')'? '=' ( ParenthesedSelectBody | '(' ComplexExpressionList ')' | Expression ) ( ',' '('? Column ( ',' Column )* ')'? '=' ( ParenthesedSelectBody | '(' ComplexExpressionList ')' | Expression ) )* ) WhereClause? )
Referenced by:
@@ -1090,7 +1087,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -1111,14 +1108,14 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. , ) - - SET - - Column - = - - SimpleExpression - , + + SET + + Column + = + + SimpleExpression + , VALUES @@ -1128,35 +1125,30 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. SimpleExpression , + + ) - , - - ) - - ( - - SelectWithWithItems - ) - - SelectWithWithItems - ON - - DUPLICATE - - KEY - - UPDATE - - Column - = - - SimpleExpression - , - - -
- -
Upsert   ::= ( 'UPSERT' | ( 'INSERT' 'OR' )? 'REPLACE' ) 'INTO'? Table ( '(' Column ( ',' Column )* ')' )? ( 'SET' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | ( ( 'VALUES' | 'VALUE' )? '(' SimpleExpression ( ',' SimpleExpression )* ( ')' ',' '(' SimpleExpression ( ',' SimpleExpression )* )* | '(' SelectWithWithItems ) ')' | SelectWithWithItems ) ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* )?
+ , + + Select + ON + + DUPLICATE + + KEY + + UPDATE + + Column + = + + SimpleExpression + , + + +
+ +
Upsert   ::= ( 'UPSERT' | ( 'INSERT' 'OR' )? 'REPLACE' ) 'INTO'? Table ( '(' Column ( ',' Column )* ')' )? ( 'SET' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* | ( 'VALUES' | 'VALUE' )? '(' SimpleExpression ( ',' SimpleExpression )* ')' ( ',' '(' SimpleExpression ( ',' SimpleExpression )* ')' )* | Select ) ( 'ON' 'DUPLICATE' 'KEY' 'UPDATE' Column '=' SimpleExpression ( ',' Column '=' SimpleExpression )* )?
Referenced by:
@@ -1169,7 +1161,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -1186,27 +1178,27 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. OutputClause FROM - - TableWithAlias - - JoinsList - USING - - TableWithAlias - , - - WhereClause - - OrderByElements - - PlainLimit - RETURNING - - SelectItemsList - -
- -
Delete   ::= 'DELETE' 'LOW_PRIORITY'? 'QUICK'? 'IGNORE'? ( ( TableWithAlias ( ',' TableWithAlias )* OutputClause? )? 'FROM' )? ( TableWithAlias JoinsList )? ( 'USING' TableWithAlias ( ',' TableWithAlias )* )? WhereClause? OrderByElements? PlainLimit? ( 'RETURNING' SelectItemsList )?
+ + TableWithAlias + + JoinsList + USING + + TableWithAlias + , + + WhereClause + + OrderByElements + + PlainLimit + RETURNING + + SelectItemsList + +
+ +
Delete   ::= 'DELETE' 'LOW_PRIORITY'? 'QUICK'? 'IGNORE'? ( ( TableWithAlias ( ',' TableWithAlias )* OutputClause? )? 'FROM' )? ( TableWithAlias JoinsList? )? ( 'USING' TableWithAlias ( ',' TableWithAlias )* )? WhereClause? OrderByElements? PlainLimit? ( 'RETURNING' SelectItemsList )?
Referenced by:
@@ -1219,7 +1211,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -1228,33 +1220,27 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. INTO TableWithAlias - USING - - Table - ( - - SubSelect - ) - - Alias - ON - - ( - - Expression - ) - - MergeUpdateClause - - MergeInsertClause - - MergeInsertClause - - MergeUpdateClause - -
- -
Merge    ::= 'MERGE' 'INTO' TableWithAlias 'USING' ( Table | '(' SubSelect ')' ) Alias? 'ON' '(' Expression ')' ( MergeUpdateClause MergeInsertClause? | MergeInsertClause MergeUpdateClause? )?
+ USING + + FromItem + ON + + ( + + Expression + ) + + MergeUpdateClause + + MergeInsertClause + + MergeInsertClause + + MergeUpdateClause + +
+ +
Referenced by:
@@ -1381,7 +1367,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= RelObjectNameExt ( ( '.' | ':' ) '.'* RelObjectNameExt2 )*
+
====================================================================================================================== @@ -2127,7 +2113,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
           | 'IGNORE'
+
====================================================================================================================== @@ -2288,7 +2274,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
+
====================================================================================================================== @@ -2322,29 +2308,19 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - - - ( - - WithList - - Select - ) - - WithList - - Select - -
+ + + SelectBody + +
-
         ::= '(' WithList Select ')'
-
           | WithList? Select
+
         ::= SelectBody
+
====================================================================================================================== @@ -2365,7 +2341,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
+ ====================================================================================================================== @@ -2375,19 +2351,91 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - - - SetOperationList - -
+ + + WithList + + PlainSelect + + Values + + ParenthesedSelectBody + + SetOperationList + + OrderByElements + + LimitWithOffset + + Offset + + Fetch + + WithIsolation + +
-
         ::= SetOperationList
+ +
+ + +====================================================================================================================== + ParenthesedSelectBody +====================================================================================================================== + + +.. raw:: html + + + + + + ( + + SelectBody + ) + + +
+ + +
         ::= '(' SelectBody ')'
+
+ + +====================================================================================================================== + LateralSubSelect +====================================================================================================================== + + +.. raw:: html + + + + + + LATERAL + + ( + + SelectBody + ) + + +
+ + +
         ::= 'LATERAL' '(' SelectBody ')'
+
====================================================================================================================== @@ -2397,7 +2445,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -2427,84 +2475,84 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. SQL_CACHE Top - - SelectItemsList - - IntoClause - FROM - - FromItem - - JoinsList - - KSQLWindowClause - - WhereClause - - OracleHierarchicalQueryClause - - GroupByColumnReferences - - Having - - OrderByElements - WINDOW - - RelObjectName - AS - - windowDefinition - , - - OrderByElements - EMIT - - CHANGES - - LimitWithOffset - - Offset - - LimitWithOffset - - Fetch - - WithIsolation - FOR - - UPDATE - - OF - - Table - - Wait - NOWAIT - - SKIP - - LOCKED - - OptimizeFor - FOR - - XML - - PATH - - ( - - S_CHAR_LITERAL - ) - - -
+ + SelectItemsList + + IntoClause + FROM + + FromItem + + JoinsList + + KSQLWindowClause + + WhereClause + + OracleHierarchicalQueryClause + + GroupByColumnReferences + + Having + + OrderByElements + WINDOW + + RelObjectName + AS + + windowDefinition + , + + OrderByElements + EMIT + + CHANGES + + LimitWithOffset + + Offset + + LimitWithOffset + + Fetch + + WithIsolation + FOR + + UPDATE + + OF + + Table + + Wait + NOWAIT + + SKIP + + LOCKED + + OptimizeFor + FOR + + XML + + PATH + + ( + + S_CHAR_LITERAL + ) + + +
-
         ::= K_SELECT 'STRAIGHT_JOIN'? Skip? First? ( 'ALL' | 'DISTINCT' ( 'ON' '(' SelectItemsList ')' )? | 'UNIQUE' | 'SQL_CALC_FOUND_ROWS' | 'SQL_NO_CACHE' | 'SQL_CACHE' )? Top? SelectItemsList IntoClause? ( 'FROM' FromItem JoinsList )? KSQLWindowClause? WhereClause? OracleHierarchicalQueryClause? GroupByColumnReferences? Having? OrderByElements? ( 'WINDOW' RelObjectName 'AS' windowDefinition ( ',' RelObjectName 'AS' windowDefinition )* )? OrderByElements? ( 'EMIT' 'CHANGES' )? LimitWithOffset? Offset? LimitWithOffset? Fetch? WithIsolation? ( 'FOR' 'UPDATE' ( 'OF' Table )? Wait? ( 'NOWAIT' | 'SKIP' 'LOCKED' )? )? OptimizeFor? ( 'FOR' 'XML' 'PATH' '(' S_CHAR_LITERAL ')' )?
+
         ::= K_SELECT 'STRAIGHT_JOIN'? Skip? First? ( 'ALL' | 'DISTINCT' ( 'ON' '(' SelectItemsList ')' )? | 'UNIQUE' | 'SQL_CALC_FOUND_ROWS' | 'SQL_NO_CACHE' | 'SQL_CACHE' )? Top? SelectItemsList IntoClause? ( 'FROM' FromItem JoinsList? )? KSQLWindowClause? WhereClause? OracleHierarchicalQueryClause? GroupByColumnReferences? Having? OrderByElements? ( 'WINDOW' RelObjectName 'AS' windowDefinition ( ',' RelObjectName 'AS' windowDefinition )* )? OrderByElements? ( 'EMIT' 'CHANGES' )? LimitWithOffset? Offset? LimitWithOffset? Fetch? WithIsolation? ( 'FOR' 'UPDATE' ( 'OF' Table )? Wait? ( 'NOWAIT' | 'SKIP' 'LOCKED' )? )? OptimizeFor? ( 'FOR' 'XML' 'PATH' '(' S_CHAR_LITERAL ')' )?
Referenced by: -
+
====================================================================================================================== @@ -2514,58 +2562,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - ( - - SelectBody - ) - - PlainSelect - - Values - ALL - - DISTINCT - - UNION - - INTERSECT - - MINUS - - EXCEPT - - OrderByElements - - LimitWithOffset - - Offset - - Fetch - - WithIsolation - -
- - -
         ::= ( '(' SelectBody ')' | PlainSelect | Values ) ( ( 'UNION' ( 'ALL' | 'DISTINCT' )? | 'INTERSECT' | 'MINUS' | 'EXCEPT' ) ( '(' - SelectBody ')' | PlainSelect | Values ) )* OrderByElements? LimitWithOffset? Offset? Fetch? WithIsolation?
-
- Referenced by: -
- - -====================================================================================================================== - SetOperationListWithoutIntialSelect -====================================================================================================================== - - -.. raw:: html - - + @@ -2579,22 +2576,34 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. MINUS - EXCEPT - - ( - - SelectBody - ) - - -
+ EXCEPT + + PlainSelect + + Values + + ParenthesedSelectBody + + OrderByElements + + LimitWithOffset + + Offset + + LimitWithOffset + + Fetch + + WithIsolation + +
- +
         ::= ( ( 'UNION' ( 'ALL' | 'DISTINCT' )? | 'INTERSECT' | 'MINUS' | 'EXCEPT' - ) '(' SelectBody ')' )+
+ ) ( PlainSelect | Values | ParenthesedSelectBody ) )+ OrderByElements? LimitWithOffset? Offset? LimitWithOffset? Fetch? WithIsolation?
Referenced by: -
+
====================================================================================================================== @@ -2619,7 +2628,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
WithList ::= 'WITH' WithItem ( ',' WithItem )*
+ ====================================================================================================================== @@ -2629,7 +2638,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -2641,21 +2650,13 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. SelectItemsList ) - AS - - ( - - VALUES - - SimpleExpressionList - - SubSelect - ) - - -
- -
WithItem ::= 'RECURSIVE'? RelObjectName ( '(' SelectItemsList ')' )? 'AS' '(' ( 'VALUES' SimpleExpressionList | SubSelect ) ')'
+ AS + + ParenthesedSelectBody + +
+ +
WithItem ::= 'RECURSIVE'? RelObjectName ( '(' SelectItemsList ')' )? 'AS' ParenthesedSelectBody
Referenced by:
@@ -2764,7 +2765,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= Table '.' '*'
Referenced by: -
+ ====================================================================================================================== @@ -2798,7 +2799,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. + ====================================================================================================================== @@ -3235,151 +3236,76 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. ====================================================================================================================== - FromItem -====================================================================================================================== - - -.. raw:: html - - - - - - ValuesList - ( - - FromItem - - SubJoin - - SubSelect - - SetOperationListWithoutIntialSelect - ) - - UnPivot - - TableFunction - - Table - - LateralSubSelect - - Alias - - UnPivot - - PivotXml - - Pivot - - MySQLIndexHint - - SQLServerHints - -
- - - -
- - -====================================================================================================================== - ValuesList -====================================================================================================================== - - -.. raw:: html - - - - - - ( - - VALUES - - ( - - SimpleExpression - , - - ) - - , - - SimpleExpression - , - - ) - - Alias - ( - - RelObjectName - , - - ) - - -
- - -
         ::= '(' 'VALUES' ( '(' SimpleExpression ( ',' SimpleExpression )* ')' ( ',' '(' SimpleExpression ( ',' SimpleExpression )* ')' )* | SimpleExpression ( ',' SimpleExpression )* ) ')' ( Alias ( '(' RelObjectName ( ',' RelObjectName )* ')' )? )?
-
- Referenced by: -
- - -====================================================================================================================== - LateralSubSelect + ParenthesedFromItem ====================================================================================================================== .. raw:: html - + - - LATERAL - - ( - - SubSelect - ) - - -
+ + ( + + FromItem + + JoinsList + ) + + +
- -
         ::= 'LATERAL' '(' SubSelect ')'
+ +
         ::= '(' FromItem JoinsList? ')'
Referenced by:
====================================================================================================================== - SubJoin + FromItem ====================================================================================================================== .. raw:: html - + - - - SubJoinsList - -
+ + + TableFunction + + Table + + ParenthesedFromItem + + ParenthesedSelectBody + + Pivot + + UnPivot + + LateralSubSelect + + Alias + + UnPivot + + PivotXml + + Pivot + + MySQLIndexHint + + SQLServerHints + +
- +
Referenced by: -
+
====================================================================================================================== @@ -3387,28 +3313,6 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. ====================================================================================================================== -.. raw:: html - - - - - - JoinerExpression - -
- - -
         ::= JoinerExpression*
-
- Referenced by: -
- - -====================================================================================================================== - SubJoinsList -====================================================================================================================== - - .. raw:: html @@ -3419,11 +3323,11 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
- +
         ::= JoinerExpression+
Referenced by: -
+
====================================================================================================================== @@ -3496,7 +3400,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. ) FromItem ( ( 'WITHIN' '(' JoinWindow ')' )? ( 'ON' Expression )+ | 'USING' '(' Column ( ',' Column )* ')' )?
Referenced by: -
+ ====================================================================================================================== @@ -3765,7 +3669,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= 'ORDER' 'SIBLINGS'? 'BY' OrderByElement ( ',' OrderByElement )*
+ ====================================================================================================================== @@ -3875,7 +3779,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
           | PlainLimit
Referenced by: -
+ ====================================================================================================================== @@ -3885,23 +3789,23 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + LIMIT - ( - - SubSelect - ) + ( + + ParenthesedSelectBody + ) - Expression - -
+ Expression + +
-
         ::= 'LIMIT' ( '(' SubSelect ')' | Expression )
+
         ::= 'LIMIT' ( '(' ParenthesedSelectBody ')' | Expression )
@@ -3931,7 +3835,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
Offset   ::= 'OFFSET' Expression ( 'ROWS' | 'ROW' )?
Referenced by: -
+ ====================================================================================================================== @@ -3964,7 +3868,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
Fetch    ::= 'FETCH' ( 'FIRST' | 'NEXT' ) Expression ( 'ROWS' | 'ROW' ) 'ONLY'
Referenced by: -
+ ====================================================================================================================== @@ -3988,7 +3892,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= 'WITH' K_ISOLATION
Referenced by: -
+ ====================================================================================================================== @@ -4418,7 +4322,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -4437,18 +4341,18 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. Function ( - - ComplexExpressionList - - SubSelect - ) + + ComplexExpressionList + ) + + ParenthesedSelectBody - SimpleExpression - -
+ SimpleExpression + +
-
         ::= SimpleExpression ( '(' '+' ')' )? 'NOT'? 'IN' ( S_CHAR_LITERAL | Function | '(' ( ComplexExpressionList | SubSelect ) ')' | SimpleExpression )
+
         ::= SimpleExpression ( '(' '+' ')' )? 'NOT'? 'IN' ( S_CHAR_LITERAL | Function | '(' ComplexExpressionList ')' | ParenthesedSelectBody | SimpleExpression )
Referenced by:
@@ -4736,7 +4640,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= SimpleExpression ( ',' SimpleExpression )*
+ ====================================================================================================================== @@ -4917,16 +4821,16 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. VALUES - SimpleExpressionList - - SubSelect + SimpleExpressionList + + ParenthesedSelectBody ) - +
-
         ::= ( 'ANY' | 'SOME' | 'ALL' ) '(' ( 'VALUES' SimpleExpressionList | SubSelect ) ')'
+
         ::= ( 'ANY' | 'SOME' | 'ALL' ) '(' ( 'VALUES' SimpleExpressionList | ParenthesedSelectBody ) ')'
Referenced by:
@@ -4956,7 +4860,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= ( UserVariable ( '=' | ':=' ) )? ConcatExpression
+ ====================================================================================================================== @@ -5129,7 +5033,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -5210,42 +5114,40 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. {ts S_CHAR_LITERAL - } - - ( - - SubSelect - ) - - ComplexExpressionList - - SimpleExpressionList - ) - - . - - RelObjectNameExt - COLLATE - - S_IDENTIFIER - - IntervalExpressionWithoutInterval - - ArrayExpression - :: - - ColDataType - AT - - K_DATETIMELITERAL - ZONE - - PrimaryExpression - -
+ } + + ParenthesedSelectBody + ( + + ComplexExpressionList + + SimpleExpressionList + ) + + . + + RelObjectNameExt + COLLATE + + S_IDENTIFIER + + IntervalExpressionWithoutInterval + + ArrayExpression + :: + + ColDataType + AT + + K_DATETIMELITERAL + ZONE + + PrimaryExpression + +
-
         ::= ( 'NOT' | '!' )? ( '+' | '-' | '~' )? ( 'NULL' | CaseWhenExpression | SimpleJdbcParameter | JdbcNamedParameter | UserVariable | NumericBind | ExtractExpression | MySQLGroupConcat | XMLSerializeExpr | JsonExpression | JsonFunction | JsonAggregateFunction | FullTextSearch | Function AnalyticExpression? | IntervalExpression | S_DOUBLE | S_LONG | S_HEX | CastExpression | TryCastExpression | SafeCastExpression | K_TIME_KEY_EXPR | 'CURRENT' | DateTimeLiteralExpression | 'ARRAY' ArrayConstructor | NextValExpression | ConnectByRootOperator | 'ALL' | Column | S_CHAR_LITERAL | ( '{d' | '{t' | '{ts' ) S_CHAR_LITERAL '}' | '(' ( SubSelect ')' | ( ComplexExpressionList | SimpleExpressionList ) ')' ( '.' RelObjectNameExt )? ) ) ( 'COLLATE' S_IDENTIFIER )? IntervalExpressionWithoutInterval? ArrayExpression? ( '::' ColDataType )* ( 'AT' K_DATETIMELITERAL 'ZONE' PrimaryExpression )*
+
         ::= ( 'NOT' | '!' )? ( '+' | '-' | '~' )? ( 'NULL' | CaseWhenExpression | SimpleJdbcParameter | JdbcNamedParameter | UserVariable | NumericBind | ExtractExpression | MySQLGroupConcat | XMLSerializeExpr | JsonExpression | JsonFunction | JsonAggregateFunction | FullTextSearch | Function AnalyticExpression? | IntervalExpression | S_DOUBLE | S_LONG | S_HEX | CastExpression | TryCastExpression | SafeCastExpression | K_TIME_KEY_EXPR | 'CURRENT' | DateTimeLiteralExpression | 'ARRAY' ArrayConstructor | NextValExpression | ConnectByRootOperator | 'ALL' | Column | S_CHAR_LITERAL | ( '{d' | '{t' | '{ts' ) S_CHAR_LITERAL '}' | ParenthesedSelectBody | '(' ( ComplexExpressionList | SimpleExpressionList ) ')' ( '.' RelObjectNameExt )? ) ( 'COLLATE' S_IDENTIFIER )? IntervalExpressionWithoutInterval? ArrayExpression? ( '::' ColDataType )* ( 'AT' K_DATETIMELITERAL 'ZONE' PrimaryExpression )*
@@ -5461,7 +5363,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -5477,36 +5379,38 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. JsonAggregateFunction - FullTextSearch - - Column - - S_CHAR_LITERAL - ( - - SubSelect - ) - - :: - - ColDataType - -> - - ->> - - S_CHAR_LITERAL - - S_LONG - #> - - #>> - - S_CHAR_LITERAL - -
+ FullTextSearch + + SimpleFunction + + Column + + S_CHAR_LITERAL + ( + + ParenthesedSelectBody + ) + + :: + + ColDataType + -> + + ->> + + S_CHAR_LITERAL + + S_LONG + #> + + #>> + + S_CHAR_LITERAL + +
- +
Referenced by:
@@ -5819,7 +5723,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
         ::= 'KEEP' '(' S_IDENTIFIER ( 'FIRST' | 'LAST' ) OrderByElements ')'
Referenced by: -
+
====================================================================================================================== @@ -6443,9 +6347,9 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. SimpleExpressionList - OrderByElements - - SubSelect + OrderByElements + + SelectBody IGNORE NULLS @@ -6458,17 +6362,61 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. Column - KeepExpression + KeepExpression
-
         ::= RelObjectNameList '(' ( ( 'DISTINCT' | 'ALL' | 'UNIQUE' )? ( '*' | AllTableColumns | ( ComplexExpressionList | SimpleExpressionList ) OrderByElements? | SubSelect ) )? ( 'IGNORE' 'NULLS' )? ')' ( '.' ( Function | Column ) )? KeepExpression?
+
         ::= RelObjectNameList '(' ( ( 'DISTINCT' | 'ALL' | 'UNIQUE' )? ( '*' | AllTableColumns | ( ComplexExpressionList | SimpleExpressionList ) OrderByElements? | SelectBody ) )? ( 'IGNORE' 'NULLS' )? ')' ( '.' ( Function | Column ) )? KeepExpression?
Referenced by:
+====================================================================================================================== + SimpleFunction +====================================================================================================================== + + +.. raw:: html + + + + + + RelObjectNameList + ( + + DISTINCT + + ALL + + UNIQUE + + * + + AllTableColumns + + SimpleExpressionList + + OrderByElements + IGNORE + + NULLS + + ) + + KeepExpression + +
+ + +
         ::= RelObjectNameList '(' ( ( 'DISTINCT' | 'ALL' | 'UNIQUE' )? ( '*' | AllTableColumns | SimpleExpressionList OrderByElements? ) )? ( 'IGNORE' 'NULLS' )? ')' KeepExpression?
+
+ Referenced by: +
+ + ====================================================================================================================== XMLSerializeExpr ====================================================================================================================== @@ -6598,30 +6546,6 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. -====================================================================================================================== - SubSelect -====================================================================================================================== - - -.. raw:: html - - - - - - WithList - - SelectBody - -
- - -
         ::= WithList? SelectBody
-
- - ====================================================================================================================== ColumnNamesWithParamsList ====================================================================================================================== @@ -6810,7 +6734,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -6912,29 +6836,29 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. , ) - - CreateParameter - - RowMovement - AS - - SelectWithWithItems - LIKE - - ( - - Table - ) - - Table - , - - SpannerInterleaveIn - -
+ + CreateParameter + + RowMovement + AS + + Select + LIKE + + ( + + Table + ) + + Table + , + + SpannerInterleaveIn + +
-
         ::= 'CREATE' ( 'OR' 'REPLACE' )? 'UNLOGGED'? 'GLOBAL'? CreateParameter* 'TABLE' ( 'IF' 'NOT' 'EXISTS' )? Table ( '(' ( RelObjectName ( ',' RelObjectName )* | ColumnDefinition ( ',' ( ( 'INDEX' | 'UNIQUE'? 'FULLTEXT'? 'KEY' ) RelObjectName ColumnNamesWithParamsList CreateParameter* | ( 'CONSTRAINT' RelObjectName )? ( ( 'PRIMARY' 'KEY' | 'UNIQUE' 'KEY'? ) ColumnNamesWithParamsList CreateParameter* | 'FOREIGN' 'KEY' ColumnNamesWithParamsList 'REFERENCES' Table ColumnsNamesList ( 'ON' ( 'DELETE' | 'UPDATE' ) Action )? ( 'ON' ( 'DELETE' | 'UPDATE' ) Action )? | 'CHECK' ( '(' Expression ')' )* ) | 'EXCLUDE' 'WHERE' ( '(' Expression ')' )* | ColumnDefinition ) )* ) ')' )? CreateParameter* RowMovement? ( 'AS' SelectWithWithItems )? ( 'LIKE' ( '(' Table ')' | Table ) )? ( ',' SpannerInterleaveIn )?
+
         ::= 'CREATE' ( 'OR' 'REPLACE' )? 'UNLOGGED'? 'GLOBAL'? CreateParameter* 'TABLE' ( 'IF' 'NOT' 'EXISTS' )? Table ( '(' ( RelObjectName ( ',' RelObjectName )* | ColumnDefinition ( ',' ( ( 'INDEX' | 'UNIQUE'? 'FULLTEXT'? 'KEY' ) RelObjectName ColumnNamesWithParamsList CreateParameter* | ( 'CONSTRAINT' RelObjectName )? ( ( 'PRIMARY' 'KEY' | 'UNIQUE' 'KEY'? ) ColumnNamesWithParamsList CreateParameter* | 'FOREIGN' 'KEY' ColumnNamesWithParamsList 'REFERENCES' Table ColumnsNamesList ( 'ON' ( 'DELETE' | 'UPDATE' ) Action )? ( 'ON' ( 'DELETE' | 'UPDATE' ) Action )? | 'CHECK' ( '(' Expression ')' )* ) | 'EXCLUDE' 'WHERE' ( '(' Expression ')' )* | ColumnDefinition ) )* ) ')' )? CreateParameter* RowMovement? ( 'AS' Select )? ( 'LIKE' ( '(' Table ')' | Table ) )? ( ',' SpannerInterleaveIn )?
@@ -7119,59 +7043,59 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - CREATE - - OR - - REPLACE - - NO - - FORCE - - TEMP - - TEMPORARY - - MATERIALIZED - - VIEW - - Table - AUTO - - REFRESH - - YES - - NO - - IF - - NOT - - EXISTS - - ColumnsNamesList - AS - - SelectWithWithItems - WITH - - READ - - ONLY - - -
+ + + + + CREATE + + OR + + REPLACE + + NO + + FORCE + + TEMP + + TEMPORARY + + MATERIALIZED + + VIEW + + Table + AUTO + + REFRESH + + YES + + NO + + IF + + NOT + + EXISTS + + ColumnsNamesList + AS + + Select + WITH + + READ + + ONLY + + +
         ::= 'CREATE' ( 'OR' 'REPLACE' )? ( 'NO'? 'FORCE' )? ( 'TEMP' | 'TEMPORARY' - )? 'MATERIALIZED'? 'VIEW' Table ( 'AUTO' 'REFRESH' ( 'YES' | 'NO' ) )? ( 'IF' 'NOT' 'EXISTS' )? ColumnsNamesList? 'AS' SelectWithWithItems ( 'WITH' 'READ' 'ONLY' )?
+ )? 'MATERIALIZED'? 'VIEW' Table ( 'AUTO' 'REFRESH' ( 'YES' | 'NO' ) )? ( 'IF' 'NOT' 'EXISTS' )? ColumnsNamesList? 'AS' Select ( 'WITH' 'READ' 'ONLY' )?
@@ -13729,16 +13653,18 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - - [#x4E00-#x9FFF] - - -
+ + [#xAC00-#xD7A3] + + [#x4E00-#x9FFF] + + +
-
CJK      ::= [#x4E00-#x9FFF]
+
CJK      ::= [#xAC00-#xD7A3#x4E00-#x9FFF]
diff --git a/src/site/sphinx/usage.rst b/src/site/sphinx/usage.rst index f454bf68f..a4d7cbee7 100644 --- a/src/site/sphinx/usage.rst +++ b/src/site/sphinx/usage.rst @@ -142,7 +142,7 @@ For guidance with the API, use `JSQLFormatter SQL Text └─Statements: net.sf.jsqlparser.statement.select.Select - └─selectBody: net.sf.jsqlparser.statement.select.PlainSelect + └─select: net.sf.jsqlparser.statement.select.PlainSelect ├─selectItems -> Collection<SelectExpressionItem> │ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem │ └─LongValue: 1 diff --git a/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java b/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java index 89857100a..4f0fd5d6a 100644 --- a/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapterTest.java @@ -9,8 +9,6 @@ */ package net.sf.jsqlparser.expression; -import java.util.ArrayList; -import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.operators.conditional.XorExpression; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; @@ -20,12 +18,15 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; -import net.sf.jsqlparser.statement.select.SubSelect; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import org.junit.jupiter.api.Test; /** * @author tw @@ -35,8 +36,8 @@ public class ExpressionVisitorAdapterTest { @Test public void testInExpressionProblem() throws JSQLParserException { final List exprList = new ArrayList<>(); - Select select = (Select) CCJSqlParserUtil.parse("select * from foo where x in (?,?,?)"); - PlainSelect plainSelect = select.getSelectBody(PlainSelect.class); + PlainSelect plainSelect = + (PlainSelect) CCJSqlParserUtil.parse("select * from foo where x in (?,?,?)"); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @@ -55,9 +56,8 @@ public void visit(InExpression expr) { @Test public void testInExpression() throws JSQLParserException { final List exprList = new ArrayList<>(); - Select select = (Select) CCJSqlParserUtil. - parse("select * from foo where (a,b) in (select a,b from foo2)"); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) CCJSqlParserUtil + .parse("select * from foo where (a,b) in (select a,b from foo2)"); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @@ -70,15 +70,14 @@ public void visit(InExpression expr) { }); assertTrue(exprList.get(0) instanceof RowConstructor); - assertTrue(exprList.get(1) instanceof SubSelect); + assertTrue(exprList.get(1) instanceof Select); } @Test public void testXorExpression() throws JSQLParserException { final List exprList = new ArrayList<>(); - Select select = (Select) CCJSqlParserUtil. - parse("SELECT * FROM table WHERE foo XOR bar"); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = + (PlainSelect) CCJSqlParserUtil.parse("SELECT * FROM table WHERE foo XOR bar"); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @@ -103,9 +102,9 @@ public void testOracleHintExpressions() throws JSQLParserException { testOracleHintExpression("select /*+ MYHINT */ * from foo", "MYHINT", false); } - public static void testOracleHintExpression(String sql, String hint, boolean singleLine) throws JSQLParserException { - Select select = (Select) CCJSqlParserUtil.parse(sql); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + public static void testOracleHintExpression(String sql, String hint, boolean singleLine) + throws JSQLParserException { + PlainSelect plainSelect = (PlainSelect) CCJSqlParserUtil.parse(sql); final OracleHint[] holder = new OracleHint[1]; assertNotNull(plainSelect.getOracleHint()); plainSelect.getOracleHint().accept(new ExpressionVisitorAdapter() { @@ -125,9 +124,8 @@ public void visit(OracleHint hint) { @Test public void testCurrentTimestampExpression() throws JSQLParserException { final List columnList = new ArrayList(); - Select select = (Select) CCJSqlParserUtil. - parse("select * from foo where bar < CURRENT_TIMESTAMP"); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) CCJSqlParserUtil + .parse("select * from foo where bar < CURRENT_TIMESTAMP"); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @@ -145,9 +143,8 @@ public void visit(Column column) { @Test public void testCurrentDateExpression() throws JSQLParserException { final List columnList = new ArrayList(); - Select select = (Select) CCJSqlParserUtil. - parse("select * from foo where bar < CURRENT_DATE"); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = + (PlainSelect) CCJSqlParserUtil.parse("select * from foo where bar < CURRENT_DATE"); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @@ -164,9 +161,8 @@ public void visit(Column column) { @Test public void testSubSelectExpressionProblem() throws JSQLParserException { - Select select = (Select) CCJSqlParserUtil. - parse("SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.col2 = t1.col1)"); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) CCJSqlParserUtil + .parse("SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.col2 = t1.col1)"); Expression where = plainSelect.getWhere(); ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); adapter.setSelectVisitor(new SelectVisitorAdapter()); @@ -207,7 +203,8 @@ public void testAnalyticFunctionWithoutExpression502() throws JSQLParserExceptio @Test public void testAtTimeZoneExpression() throws JSQLParserException { - Expression expr = CCJSqlParserUtil.parseExpression("DATE(date1 AT TIME ZONE 'UTC' AT TIME ZONE 'australia/sydney')"); + Expression expr = CCJSqlParserUtil + .parseExpression("DATE(date1 AT TIME ZONE 'UTC' AT TIME ZONE 'australia/sydney')"); ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); expr.accept(adapter); } @@ -215,38 +212,33 @@ public void testAtTimeZoneExpression() throws JSQLParserException { @Test public void testJsonFunction() throws JSQLParserException { ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); - CCJSqlParserUtil - .parseExpression("JSON_OBJECT( KEY 'foo' VALUE bar, KEY 'foo' VALUE bar)") - .accept(adapter); - CCJSqlParserUtil - .parseExpression("JSON_ARRAY( (SELECT * from dual) )") + CCJSqlParserUtil.parseExpression("JSON_OBJECT( KEY 'foo' VALUE bar, KEY 'foo' VALUE bar)") .accept(adapter); + CCJSqlParserUtil.parseExpression("JSON_ARRAY( (SELECT * from dual) )").accept(adapter); } @Test public void testJsonAggregateFunction() throws JSQLParserException { ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); - CCJSqlParserUtil - .parseExpression("JSON_OBJECTAGG( KEY foo VALUE bar NULL ON NULL WITH UNIQUE KEYS ) FILTER( WHERE name = 'Raj' ) OVER( PARTITION BY name )") + CCJSqlParserUtil.parseExpression( + "JSON_OBJECTAGG( KEY foo VALUE bar NULL ON NULL WITH UNIQUE KEYS ) FILTER( WHERE name = 'Raj' ) OVER( PARTITION BY name )") .accept(adapter); - CCJSqlParserUtil - .parseExpression("JSON_ARRAYAGG( a FORMAT JSON ABSENT ON NULL ) FILTER( WHERE name = 'Raj' ) OVER( PARTITION BY name )") + CCJSqlParserUtil.parseExpression( + "JSON_ARRAYAGG( a FORMAT JSON ABSENT ON NULL ) FILTER( WHERE name = 'Raj' ) OVER( PARTITION BY name )") .accept(adapter); } @Test public void testConnectedByRootExpression() throws JSQLParserException { ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); - CCJSqlParserUtil - .parseExpression("CONNECT_BY_ROOT last_name as name") - .accept(adapter); + CCJSqlParserUtil.parseExpression("CONNECT_BY_ROOT last_name as name").accept(adapter); } @Test public void testRowConstructor() throws JSQLParserException { ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); - CCJSqlParserUtil - .parseExpression("CAST(ROW(dataid, value, calcMark) AS ROW(datapointid CHAR, value CHAR, calcMark CHAR))") + CCJSqlParserUtil.parseExpression( + "CAST(ROW(dataid, value, calcMark) AS ROW(datapointid CHAR, value CHAR, calcMark CHAR))") .accept(adapter); } } diff --git a/src/test/java/net/sf/jsqlparser/expression/LimitExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/LimitExpressionTest.java index acbc630e7..59151487f 100644 --- a/src/test/java/net/sf/jsqlparser/expression/LimitExpressionTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/LimitExpressionTest.java @@ -12,7 +12,6 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -49,22 +48,17 @@ public void testIssue1376() throws JSQLParserException { @Test public void testMethods() throws JSQLParserException { String sqlStr = "SELECT * FROM tmp3 LIMIT 5 OFFSET 3"; - Select select = (Select) CCJSqlParserUtil.parse(sqlStr); - - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) CCJSqlParserUtil.parse(sqlStr); LongValue longValue = plainSelect.getLimit().getRowCount(LongValue.class); Assertions.assertNotNull(longValue); Assertions.assertEquals(longValue, longValue); - Assertions.assertNotEquals(new AllValue(), longValue); - Assertions.assertNotEquals(new NullValue(), longValue); Assertions.assertNull(plainSelect.getLimit().getOffset(LongValue.class)); Assertions.assertNotNull(plainSelect.getOffset().getOffset(LongValue.class)); sqlStr = "SELECT * FROM tmp3 LIMIT ALL"; - select = (Select) CCJSqlParserUtil.parse(sqlStr); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) CCJSqlParserUtil.parse(sqlStr); AllValue allValue = plainSelect.getLimit().getRowCount(AllValue.class); allValue.accept(new ExpressionVisitorAdapter()); diff --git a/src/test/java/net/sf/jsqlparser/expression/mysql/MySqlSqlCalcFoundRowsTest.java b/src/test/java/net/sf/jsqlparser/expression/mysql/MySqlSqlCalcFoundRowsTest.java index d45e26910..e363a9bac 100644 --- a/src/test/java/net/sf/jsqlparser/expression/mysql/MySqlSqlCalcFoundRowsTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/mysql/MySqlSqlCalcFoundRowsTest.java @@ -9,7 +9,6 @@ */ package net.sf.jsqlparser.expression.mysql; -import java.util.Arrays; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Table; @@ -19,12 +18,15 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + import static net.sf.jsqlparser.test.TestUtils.assertDeparse; import static net.sf.jsqlparser.test.TestUtils.assertEqualsObjectTree; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; /** * @author sam @@ -45,8 +47,8 @@ public void testPossibleParsingWithSqlCalcFoundRowsHint() throws JSQLParserExcep Statement parsed = assertSqlCanBeParsedAndDeparsed(sqlCalcFoundRowsContainingSql); assertSqlCanBeParsedAndDeparsed(generalSql); - Select created = new Select().withSelectBody(new PlainSelect().addSelectItems(Arrays.asList(new AllColumns())) - .withMySqlSqlCalcFoundRows(true).withFromItem(new Table("TABLE"))); + Select created = new PlainSelect().addSelectItems(Arrays.asList(new AllColumns())) + .withMySqlSqlCalcFoundRows(true).withFromItem(new Table("TABLE")); assertDeparse(created, sqlCalcFoundRowsContainingSql); assertEqualsObjectTree(parsed, created); } @@ -55,7 +57,7 @@ private void accept(Statement statement, final MySqlSqlCalcFoundRowRef ref) { statement.accept(new StatementVisitorAdapter() { @Override public void visit(Select select) { - select.getSelectBody().accept(new SelectVisitorAdapter() { + select.accept(new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { ref.sqlCalcFoundRows = plainSelect.getMySqlSqlCalcFoundRows(); @@ -67,6 +69,7 @@ public void visit(PlainSelect plainSelect) { } } + class MySqlSqlCalcFoundRowRef { public boolean sqlCalcFoundRows = false; diff --git a/src/test/java/net/sf/jsqlparser/schema/TableTest.java b/src/test/java/net/sf/jsqlparser/schema/TableTest.java index 720fb0b74..29569f6e0 100644 --- a/src/test/java/net/sf/jsqlparser/schema/TableTest.java +++ b/src/test/java/net/sf/jsqlparser/schema/TableTest.java @@ -15,9 +15,10 @@ import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.util.deparser.ExpressionDeParser; import net.sf.jsqlparser.util.deparser.SelectDeParser; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.jupiter.api.Test; /** * @@ -27,7 +28,9 @@ public class TableTest { @Test public void tableIndexException() { - Table table = new Table().withName("bla").withDatabase(new Database(new Server("server", "instance"), "db")); + Table table = new Table().withName("bla") + .withDatabase(new Database(new Server("server", "instance"), "db")); + assertEquals("[server\\instance].db..bla", table.toString()); } @Test @@ -41,8 +44,9 @@ public void tableSetDatabase() { @Test public void tableSetDatabaseIssue812() throws JSQLParserException { - String sql = "SELECT * FROM MY_TABLE1 as T1, MY_TABLE2, (SELECT * FROM MY_DB.TABLE3) LEFT OUTER JOIN MY_TABLE4 " - + " WHERE ID = (SELECT MAX(ID) FROM MY_TABLE5) AND ID2 IN (SELECT * FROM MY_TABLE6)"; + String sql = + "SELECT * FROM MY_TABLE1 as T1, MY_TABLE2, (SELECT * FROM MY_DB.TABLE3) LEFT OUTER JOIN MY_TABLE4 " + + " WHERE ID = (SELECT MAX(ID) FROM MY_TABLE5) AND ID2 IN (SELECT * FROM MY_TABLE6)"; Select select = (Select) CCJSqlParserUtil.parse(sql); StringBuilder buffer = new StringBuilder(); @@ -58,7 +62,7 @@ public void visit(Table tableName) { } }; - deparser.visit((PlainSelect) select.getSelectBody()); + deparser.visit((PlainSelect) select); } diff --git a/src/test/java/net/sf/jsqlparser/statement/AdaptersTest.java b/src/test/java/net/sf/jsqlparser/statement/AdaptersTest.java index 0625d24a0..78d559a83 100644 --- a/src/test/java/net/sf/jsqlparser/statement/AdaptersTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/AdaptersTest.java @@ -9,7 +9,6 @@ */ package net.sf.jsqlparser.statement; -import java.util.Stack; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.BinaryExpression; import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; @@ -20,9 +19,12 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; -import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import java.util.Stack; + +import static org.junit.jupiter.api.Assertions.assertEquals; + public class AdaptersTest { /** @@ -33,33 +35,32 @@ public void testAdapters() throws JSQLParserException { String sql = "SELECT * FROM MYTABLE WHERE COLUMN_A = :paramA AND COLUMN_B <> :paramB"; Statement stmnt = CCJSqlParserUtil.parse(sql); - final Stack> params = new Stack>(); + final Stack> params = new Stack<>(); stmnt.accept(new StatementVisitorAdapter() { @Override public void visit(Select select) { - select.getSelectBody().accept(new SelectVisitorAdapter() { + select.accept(new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { plainSelect.getWhere().accept(new ExpressionVisitorAdapter() { @Override protected void visitBinaryExpression(BinaryExpression expr) { if (!(expr instanceof AndExpression)) { - params.push(new Pair(null, null)); + params.push(new Pair<>(null, null)); } super.visitBinaryExpression(expr); } @Override public void visit(Column column) { - params.push(new Pair(column.getColumnName(), params. - pop().getRight())); + params.push(new Pair<>(column.getColumnName(), + params.pop().getRight())); } @Override public void visit(JdbcNamedParameter parameter) { - params. - push(new Pair(params.pop().getLeft(), parameter. - getName())); + params.push(new Pair<>(params.pop().getLeft(), + parameter.getName())); } }); } @@ -104,11 +105,10 @@ public boolean isFull() { @Override public String toString() { - final StringBuilder sb = new StringBuilder("Pair{"); - sb.append("left=").append(left); - sb.append(", right=").append(right); - sb.append('}'); - return sb.toString(); + String sb = "Pair{" + "left=" + left + + ", right=" + right + + '}'; + return sb; } } } diff --git a/src/test/java/net/sf/jsqlparser/statement/builder/JSQLParserFluentModelTests.java b/src/test/java/net/sf/jsqlparser/statement/builder/JSQLParserFluentModelTests.java index 0c4287cb7..8b4a05bda 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/JSQLParserFluentModelTests.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/JSQLParserFluentModelTests.java @@ -9,7 +9,6 @@ */ package net.sf.jsqlparser.statement.builder; -import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; @@ -28,11 +27,15 @@ import net.sf.jsqlparser.statement.select.AllColumns; import net.sf.jsqlparser.statement.select.Join; import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.test.TestUtils; -import static net.sf.jsqlparser.test.TestUtils.*; import org.junit.jupiter.api.Test; +import java.util.List; + +import static net.sf.jsqlparser.test.TestUtils.asList; +import static net.sf.jsqlparser.test.TestUtils.assertDeparse; +import static net.sf.jsqlparser.test.TestUtils.assertEqualsObjectTree; + public class JSQLParserFluentModelTests { @Test @@ -53,19 +56,20 @@ public void testParseAndBuild() throws JSQLParserException { .withRightExpression(new EqualsTo( new Column(asList("t1", "col2")), new JdbcParameter().withIndex( - 2))) - )).withRightExpression( + 2))))) + .withRightExpression( new InExpression() .withLeftExpression(new Column(asList("t1", "col3"))) .withRightItemsList(new ExpressionList(new StringValue("A")))); - Select select = new Select().withSelectBody(new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) + PlainSelect select = new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) .addJoins(new Join().withRightItem(t2) .withOnExpression( - new EqualsTo(new Column(asList("t1", "ref")), new Column(asList("t2", "id"))))) - .withWhere(where)); + new EqualsTo(new Column(asList("t1", "ref")), + new Column(asList("t2", "id"))))) + .withWhere(where); - ExpressionList list = select.getSelectBody(PlainSelect.class).getWhere(AndExpression.class) + ExpressionList list = select.getWhere(AndExpression.class) .getRightExpression(InExpression.class).getRightItemsList(ExpressionList.class); List elist = list.getExpressions(); list.setExpressions(elist); @@ -89,21 +93,25 @@ public void testParseAndBuildForXOR() throws JSQLParserException { .withLeftExpression( new Parenthesis( new XorExpression() - .withLeftExpression(new Column(asList("t1", "col1"))) - .withRightExpression(new Column(asList("t2", "col2"))))) + .withLeftExpression( + new Column(asList("t1", "col1"))) + .withRightExpression( + new Column(asList("t2", "col2"))))) .withRightExpression( new InExpression() .withLeftExpression(new Column(asList("t1", "col3"))) - .withRightItemsList(new ExpressionList(new StringValue("B"), new StringValue("C"))))) + .withRightItemsList(new ExpressionList(new StringValue("B"), + new StringValue("C"))))) .withRightExpression(new Column(asList("t2", "col4"))); - Select select = new Select().withSelectBody(new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) + PlainSelect select = new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) .addJoins(new Join().withRightItem(t2) .withOnExpression( - new EqualsTo(new Column(asList("t1", "ref")), new Column(asList("t2", "id"))))) - .withWhere(where)); + new EqualsTo(new Column(asList("t1", "ref")), + new Column(asList("t2", "id"))))) + .withWhere(where); - ExpressionList list = select.getSelectBody(PlainSelect.class).getWhere(XorExpression.class) + ExpressionList list = select.getWhere(XorExpression.class) .getLeftExpression(AndExpression.class) .getRightExpression(InExpression.class) .getRightItemsList(ExpressionList.class); @@ -129,14 +137,12 @@ public void testParseAndBuildForXORComplexCondition() throws JSQLParserException .withLeftExpression( new AndExpression() .withLeftExpression(new Column("a")) - .withRightExpression(new Column("b")) - ) + .withRightExpression(new Column("b"))) .withRightExpression(new Column("c"))) - .withRightExpression(new Column("d") - ); + .withRightExpression(new Column("d")); - Select select = new Select().withSelectBody(new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) - .withWhere(where)); + PlainSelect select = new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) + .withWhere(where); assertDeparse(select, statement); assertEqualsObjectTree(select, parsed); @@ -158,8 +164,8 @@ public void testParseAndBuildForXORs() throws JSQLParserException { .withRightExpression(new Column("b"))) .withRightExpression(new Column("c")); - Select select = new Select().withSelectBody(new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) - .withWhere(where)); + PlainSelect select = new PlainSelect().addSelectItems(new AllColumns()).withFromItem(t1) + .withWhere(where); assertDeparse(select, statement); assertEqualsObjectTree(select, parsed); diff --git a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java index 3aa030e13..265528767 100644 --- a/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/builder/ReflectionModelTest.java @@ -14,7 +14,7 @@ import net.sf.jsqlparser.schema.Sequence.ParameterType; import net.sf.jsqlparser.statement.ExplainStatement.OptionType; import net.sf.jsqlparser.statement.create.table.ColDataType; -import net.sf.jsqlparser.statement.select.SubSelect; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; import net.sf.jsqlparser.util.ReflectionTestUtils; import org.junit.jupiter.api.Test; @@ -33,36 +33,54 @@ */ public class ReflectionModelTest { - private static final List MODEL_OBJECTS = asList(new net.sf.jsqlparser.expression.Alias("a"), + private static final List MODEL_OBJECTS = asList( + new net.sf.jsqlparser.expression.Alias("a"), new net.sf.jsqlparser.expression.Alias.AliasColumn("a", new ColDataType("varchar")), new net.sf.jsqlparser.expression.AnalyticExpression(), - new net.sf.jsqlparser.expression.AnyComparisonExpression(AnyType.ANY, new SubSelect()), - new net.sf.jsqlparser.expression.AnyComparisonExpression(AnyType.ALL, new SubSelect()), - new net.sf.jsqlparser.expression.AnyComparisonExpression(AnyType.SOME, new SubSelect()), + new net.sf.jsqlparser.expression.AnyComparisonExpression(AnyType.ANY, + new ParenthesedSelect()), + new net.sf.jsqlparser.expression.AnyComparisonExpression(AnyType.ALL, + new ParenthesedSelect()), + new net.sf.jsqlparser.expression.AnyComparisonExpression(AnyType.SOME, + new ParenthesedSelect()), new net.sf.jsqlparser.expression.ArrayExpression(), - new net.sf.jsqlparser.expression.CaseExpression(), new net.sf.jsqlparser.expression.CastExpression(), + new net.sf.jsqlparser.expression.CaseExpression(), + new net.sf.jsqlparser.expression.CastExpression(), new net.sf.jsqlparser.expression.CollateExpression(), new net.sf.jsqlparser.expression.DateTimeLiteralExpression(), - new net.sf.jsqlparser.expression.DateValue(), new net.sf.jsqlparser.expression.DoubleValue(), - new net.sf.jsqlparser.expression.ExtractExpression(), new net.sf.jsqlparser.expression.Function(), - new net.sf.jsqlparser.expression.HexValue(), new net.sf.jsqlparser.expression.IntervalExpression(), - new net.sf.jsqlparser.expression.JdbcNamedParameter(), new net.sf.jsqlparser.expression.JdbcParameter(), - new net.sf.jsqlparser.expression.JsonExpression(), new net.sf.jsqlparser.expression.KeepExpression(), + new net.sf.jsqlparser.expression.DateValue(), + new net.sf.jsqlparser.expression.DoubleValue(), + new net.sf.jsqlparser.expression.ExtractExpression(), + new net.sf.jsqlparser.expression.Function(), + new net.sf.jsqlparser.expression.HexValue(), + new net.sf.jsqlparser.expression.IntervalExpression(), + new net.sf.jsqlparser.expression.JdbcNamedParameter(), + new net.sf.jsqlparser.expression.JdbcParameter(), + new net.sf.jsqlparser.expression.JsonExpression(), + new net.sf.jsqlparser.expression.KeepExpression(), new net.sf.jsqlparser.expression.LongValue(), new net.sf.jsqlparser.expression.MySQLGroupConcat(), new net.sf.jsqlparser.expression.MySQLIndexHint("action", "indexQualifier", asList("idx_name", "idx_name_col")), new net.sf.jsqlparser.expression.NextValExpression(asList("sequence"), "NEXT VALUE"), new net.sf.jsqlparser.expression.NotExpression(), - new net.sf.jsqlparser.expression.NullValue(), new net.sf.jsqlparser.expression.NumericBind(), + new net.sf.jsqlparser.expression.NullValue(), + new net.sf.jsqlparser.expression.NumericBind(), new net.sf.jsqlparser.expression.OracleHierarchicalExpression(), - new net.sf.jsqlparser.expression.OracleHint(), new net.sf.jsqlparser.expression.OrderByClause(), - new net.sf.jsqlparser.expression.Parenthesis(), new net.sf.jsqlparser.expression.PartitionByClause(), - new net.sf.jsqlparser.expression.RowConstructor(), new net.sf.jsqlparser.expression.SQLServerHints(), - new net.sf.jsqlparser.expression.SignedExpression(), new net.sf.jsqlparser.expression.StringValue(), - new net.sf.jsqlparser.expression.TimeKeyExpression(), new net.sf.jsqlparser.expression.TimeValue(), - new net.sf.jsqlparser.expression.TimestampValue(), new net.sf.jsqlparser.expression.UserVariable(), - new net.sf.jsqlparser.expression.ValueListExpression(), new net.sf.jsqlparser.expression.WhenClause(), + new net.sf.jsqlparser.expression.OracleHint(), + new net.sf.jsqlparser.expression.OrderByClause(), + new net.sf.jsqlparser.expression.Parenthesis(), + new net.sf.jsqlparser.expression.PartitionByClause(), + new net.sf.jsqlparser.expression.RowConstructor(), + new net.sf.jsqlparser.expression.SQLServerHints(), + new net.sf.jsqlparser.expression.SignedExpression(), + new net.sf.jsqlparser.expression.StringValue(), + new net.sf.jsqlparser.expression.TimeKeyExpression(), + new net.sf.jsqlparser.expression.TimeValue(), + new net.sf.jsqlparser.expression.TimestampValue(), + new net.sf.jsqlparser.expression.UserVariable(), + new net.sf.jsqlparser.expression.ValueListExpression(), + new net.sf.jsqlparser.expression.WhenClause(), new net.sf.jsqlparser.expression.WindowElement(), new net.sf.jsqlparser.expression.WindowOffset(), new net.sf.jsqlparser.expression.WindowRange(), @@ -104,13 +122,11 @@ public class ReflectionModelTest { new net.sf.jsqlparser.expression.operators.relational.RegExpMySQLOperator( RegExpMatchOperatorType.NOT_MATCH_CASESENSITIVE), new net.sf.jsqlparser.expression.operators.relational.SimilarToExpression(), - new net.sf.jsqlparser.schema.Column(), - new net.sf.jsqlparser.schema.Database("db"), + new net.sf.jsqlparser.schema.Column(), new net.sf.jsqlparser.schema.Database("db"), new net.sf.jsqlparser.schema.Sequence(), new net.sf.jsqlparser.schema.Sequence.Parameter(ParameterType.KEEP), - new net.sf.jsqlparser.schema.Server("srv"), - new net.sf.jsqlparser.schema.Table(), new net.sf.jsqlparser.statement.Block(), - new net.sf.jsqlparser.statement.Commit(), + new net.sf.jsqlparser.schema.Server("srv"), new net.sf.jsqlparser.schema.Table(), + new net.sf.jsqlparser.statement.Block(), new net.sf.jsqlparser.statement.Commit(), new net.sf.jsqlparser.statement.DeclareStatement(), new net.sf.jsqlparser.statement.DescribeStatement(), new net.sf.jsqlparser.statement.ExplainStatement(), @@ -118,7 +134,8 @@ public class ReflectionModelTest { new net.sf.jsqlparser.statement.SetStatement("name", null), new net.sf.jsqlparser.statement.ShowColumnsStatement(), new net.sf.jsqlparser.statement.show.ShowIndexStatement(), - new net.sf.jsqlparser.statement.ShowStatement(), new net.sf.jsqlparser.statement.Statements(), + new net.sf.jsqlparser.statement.ShowStatement(), + new net.sf.jsqlparser.statement.Statements(), new net.sf.jsqlparser.statement.UseStatement(), new net.sf.jsqlparser.statement.alter.Alter(), new net.sf.jsqlparser.statement.alter.AlterExpression(), @@ -149,45 +166,56 @@ public class ReflectionModelTest { new net.sf.jsqlparser.statement.create.view.CreateView(), new net.sf.jsqlparser.statement.delete.Delete(), new net.sf.jsqlparser.statement.drop.Drop(), - new net.sf.jsqlparser.statement.execute.Execute(), new net.sf.jsqlparser.statement.grant.Grant(), - new net.sf.jsqlparser.statement.insert.Insert(), new net.sf.jsqlparser.statement.merge.Merge(), + new net.sf.jsqlparser.statement.execute.Execute(), + new net.sf.jsqlparser.statement.grant.Grant(), + new net.sf.jsqlparser.statement.insert.Insert(), + new net.sf.jsqlparser.statement.merge.Merge(), new net.sf.jsqlparser.statement.merge.MergeUpdate(), new net.sf.jsqlparser.statement.select.AllColumns(), new net.sf.jsqlparser.statement.select.AllTableColumns(), - new net.sf.jsqlparser.statement.select.Distinct(), new net.sf.jsqlparser.statement.select.ExceptOp(), + new net.sf.jsqlparser.statement.select.Distinct(), + new net.sf.jsqlparser.statement.select.ExceptOp(), new net.sf.jsqlparser.statement.select.ExpressionListItem(), - new net.sf.jsqlparser.statement.select.Fetch(), new net.sf.jsqlparser.statement.select.First(), + new net.sf.jsqlparser.statement.select.Fetch(), + new net.sf.jsqlparser.statement.select.First(), new net.sf.jsqlparser.statement.select.FunctionItem(), new net.sf.jsqlparser.statement.select.GroupByElement(), new net.sf.jsqlparser.statement.select.IntersectOp(), - new net.sf.jsqlparser.statement.select.Join(), new net.sf.jsqlparser.statement.select.KSQLJoinWindow(), + new net.sf.jsqlparser.statement.select.Join(), + new net.sf.jsqlparser.statement.select.KSQLJoinWindow(), new net.sf.jsqlparser.statement.select.KSQLWindow(), - new net.sf.jsqlparser.statement.select.LateralSubSelect(), - new net.sf.jsqlparser.statement.select.Limit(), + // new net.sf.jsqlparser.statement.select.LateralSubSelect("LATERAL"), + // new net.sf.jsqlparser.statement.select.Limit(), new net.sf.jsqlparser.statement.select.MinusOp(), - new net.sf.jsqlparser.statement.select.Offset(), new net.sf.jsqlparser.statement.select.OptimizeFor(2L), + new net.sf.jsqlparser.statement.select.Offset(), + new net.sf.jsqlparser.statement.select.OptimizeFor(2L), new net.sf.jsqlparser.statement.select.OrderByElement(), - new net.sf.jsqlparser.statement.select.ParenthesisFromItem(), + // new net.sf.jsqlparser.statement.select.ParenthesisFromItem().getFromItem(), new net.sf.jsqlparser.statement.select.Pivot(), - new net.sf.jsqlparser.statement.select.PivotXml(), new net.sf.jsqlparser.statement.select.PlainSelect(), - new net.sf.jsqlparser.statement.select.Select(), + new net.sf.jsqlparser.statement.select.PivotXml(), + // new net.sf.jsqlparser.statement.select.PlainSelect(), + // new net.sf.jsqlparser.statement.select.Select(), new net.sf.jsqlparser.statement.select.SelectExpressionItem(), - new net.sf.jsqlparser.statement.select.SetOperationList(), + // new net.sf.jsqlparser.statement.select.SetOperationList(), new net.sf.jsqlparser.statement.select.Skip(), - new net.sf.jsqlparser.statement.select.SubJoin(), - new net.sf.jsqlparser.statement.select.SubSelect(), - new net.sf.jsqlparser.statement.select.TableFunction(), new net.sf.jsqlparser.statement.select.Top(), - new net.sf.jsqlparser.statement.select.UnPivot(), new net.sf.jsqlparser.statement.select.UnionOp(), - new net.sf.jsqlparser.statement.select.ValuesList(), new net.sf.jsqlparser.statement.select.Wait(), - new net.sf.jsqlparser.statement.select.WithItem(), + // new net.sf.jsqlparser.statement.select.ParenthesedSelect(), + new net.sf.jsqlparser.statement.select.TableFunction(), + new net.sf.jsqlparser.statement.select.Top(), + new net.sf.jsqlparser.statement.select.UnPivot(), + new net.sf.jsqlparser.statement.select.UnionOp(), + new net.sf.jsqlparser.statement.select.Wait(), + // new net.sf.jsqlparser.statement.select.WithItem(), new net.sf.jsqlparser.statement.truncate.Truncate(), - new net.sf.jsqlparser.statement.update.Update(), new net.sf.jsqlparser.statement.upsert.Upsert(), - new net.sf.jsqlparser.statement.values.ValuesStatement(), - new net.sf.jsqlparser.statement.DeclareStatement.TypeDefExpr(new ColDataType("varchar"), null)); + new net.sf.jsqlparser.statement.update.Update(), + new net.sf.jsqlparser.statement.upsert.Upsert(), + // new net.sf.jsqlparser.statement.select.ValuesStatement(), + new net.sf.jsqlparser.statement.DeclareStatement.TypeDefExpr(new ColDataType("varchar"), + null)); @Test public void testModels() { - ReflectionTestUtils.testGetterSetterChaining(MODEL_OBJECTS, m -> !"setASTNode".equals(m.getName())); + ReflectionTestUtils.testGetterSetterChaining(MODEL_OBJECTS, + m -> !"setASTNode".equals(m.getName())); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/AlterViewTest.java b/src/test/java/net/sf/jsqlparser/statement/create/AlterViewTest.java index 423927f94..f2c21b83a 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/AlterViewTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/AlterViewTest.java @@ -30,8 +30,10 @@ public class AlterViewTest { public void testAlterView() throws JSQLParserException { String statement = "ALTER VIEW myview AS SELECT * FROM mytab"; Statement parsed = assertSqlCanBeParsedAndDeparsed(statement); - AlterView created = new AlterView().withView(new Table("myview")).withSelectBody(new PlainSelect() - .addSelectItems(Collections.singleton(new AllColumns())).withFromItem(new Table("mytab"))); + AlterView created = new AlterView().withView(new Table("myview")) + .withSelect(new PlainSelect() + .addSelectItems(Collections.singleton(new AllColumns())) + .withFromItem(new Table("mytab"))); assertDeparse(created, statement); assertEqualsObjectTree(parsed, created); } @@ -40,9 +42,10 @@ public void testAlterView() throws JSQLParserException { public void testReplaceView() throws JSQLParserException { String statement = "REPLACE VIEW myview(a, b) AS SELECT a, b FROM mytab"; Statement parsed = assertSqlCanBeParsedAndDeparsed(statement); - AlterView alterView = new AlterView().withUseReplace(true).addColumnNames("a").addColumnNames(Collections.singleton("b")) + AlterView alterView = new AlterView().withUseReplace(true).addColumnNames("a") + .addColumnNames(Collections.singleton("b")) .withView(new Table("myview")) - .withSelectBody(new PlainSelect() + .withSelect(new PlainSelect() .addSelectItems(new SelectExpressionItem(new Column("a")), new SelectExpressionItem(new Column("b"))) .withFromItem(new Table("mytab"))); diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java index ace507091..3499a83be 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateViewTest.java @@ -18,6 +18,7 @@ import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.create.view.AutoRefreshOption; import net.sf.jsqlparser.statement.create.view.CreateView; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; import net.sf.jsqlparser.statement.select.PlainSelect; import static net.sf.jsqlparser.test.TestUtils.*; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -31,7 +32,7 @@ public class CreateViewTest { - private CCJSqlParserManager parserManager = new CCJSqlParserManager(); + private final CCJSqlParserManager parserManager = new CCJSqlParserManager(); @Test public void testCreateView() throws JSQLParserException { @@ -40,7 +41,7 @@ public void testCreateView() throws JSQLParserException { assertFalse(createView.isOrReplace()); assertEquals("myview", createView.getView().getName()); assertEquals("mytab", - ((Table) ((PlainSelect) createView.getSelect().getSelectBody()).getFromItem()) + ((Table) ((PlainSelect) createView.getSelect()).getFromItem()) .getName()); assertEquals(statement, createView.toString()); } @@ -73,14 +74,16 @@ public void testCreateViewWithColumnNames1() throws JSQLParserException { @Test public void testCreateView5() throws JSQLParserException { String statement = "CREATE VIEW myview AS (SELECT * FROM mytab)"; - String statement2 = "CREATE VIEW myview AS (SELECT * FROM mytab)"; CreateView createView = (CreateView) parserManager.parse(new StringReader(statement)); assertFalse(createView.isOrReplace()); assertEquals("myview", createView.getView().getName()); - assertEquals("mytab", - ((Table) ((PlainSelect) createView.getSelect().getSelectBody()).getFromItem()) - .getName()); - assertEquals(statement2, createView.toString()); + + ParenthesedSelect parenthesedSelect = + (ParenthesedSelect) createView.getSelect(); + PlainSelect plainSelect = (PlainSelect) parenthesedSelect.getSelect(); + Table table = (Table) plainSelect.getFromItem(); + assertEquals("mytab", table.getName()); + assertEquals(statement, createView.toString()); } @Test @@ -162,7 +165,7 @@ public void testCreateViewAutoRefreshNo() throws JSQLParserException { } @Test - public void testCreateViewAutoFails() throws JSQLParserException { + public void testCreateViewAutoFails() { String stmt = "CREATE VIEW myview AUTO AS SELECT * FROM mytab"; ThrowingCallable throwingCallable = () -> CCJSqlParserUtil.parse(stmt); @@ -173,7 +176,7 @@ public void testCreateViewAutoFails() throws JSQLParserException { } @Test - public void testCreateViewRefreshFails() throws JSQLParserException { + public void testCreateViewRefreshFails() { String stmt = "CREATE VIEW myview REFRESH AS SELECT * FROM mytab"; ThrowingCallable throwingCallable = () -> CCJSqlParserUtil.parse(stmt); @@ -184,7 +187,7 @@ public void testCreateViewRefreshFails() throws JSQLParserException { } @Test - public void testCreateViewAutoRefreshFails() throws JSQLParserException { + public void testCreateViewAutoRefreshFails() { String stmt = "CREATE VIEW myview AUTO REFRESH AS SELECT * FROM mytab"; ThrowingCallable throwingCallable = () -> CCJSqlParserUtil.parse(stmt); diff --git a/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java b/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java index 6af678f3b..ba41d8605 100644 --- a/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java @@ -25,7 +25,10 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.update.UpdateSet; -import net.sf.jsqlparser.statement.values.ValuesStatement; +import net.sf.jsqlparser.statement.select.Values; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; import java.io.StringReader; import java.util.Arrays; @@ -41,10 +44,6 @@ import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.function.Executable; - public class InsertTest { private final CCJSqlParserManager parserManager = new CCJSqlParserManager(); @@ -52,7 +51,8 @@ public class InsertTest { @Test public void testRegularInsert() throws JSQLParserException { String statement = "INSERT INTO mytable (col1, col2, col3) VALUES (?, 'sadfsd', 234)"; - Insert insert = (Insert) parserManager.parse(new StringReader(statement)); + Insert insert = (Insert) assertSqlCanBeParsedAndDeparsed(statement, true); + assertEquals("mytable", insert.getTable().getName()); assertEquals(3, insert.getColumns().size()); assertEquals("col1", insert.getColumns().get(0).getColumnName()); @@ -72,8 +72,7 @@ public void testRegularInsert() throws JSQLParserException { ExpressionList expressionList = new ExpressionList(new JdbcParameter(), new StringValue("sadfsd"), new LongValue().withValue(234)); - Select select = - new Select().withSelectBody(new ValuesStatement().withExpressions(expressionList)); + Select select = new Values().withExpressions(expressionList); Insert insert2 = new Insert().withTable(new Table("mytable")) .withColumns( @@ -121,7 +120,7 @@ public void testInsertFromSelect() throws JSQLParserException { assertNull(insert.getItemsList()); assertNotNull(insert.getSelect()); assertEquals("mytable2", - ((Table) ((PlainSelect) insert.getSelect().getSelectBody()).getFromItem()) + ((Table) ((PlainSelect) insert.getSelect()).getFromItem()) .getName()); // toString uses brackets @@ -130,8 +129,8 @@ public void testInsertFromSelect() throws JSQLParserException { assertDeparse(new Insert().withTable(new Table("mytable")) .addColumns(new Column("col1"), new Column("col2"), new Column("col3")) - .withSelect(new Select().withSelectBody(new PlainSelect() - .addSelectItems(new AllColumns()).withFromItem(new Table("mytable2")))), + .withSelect(new PlainSelect() + .addSelectItems(new AllColumns()).withFromItem(new Table("mytable2"))), statement); } @@ -204,8 +203,7 @@ public void testInsertMultiRowValue() throws JSQLParserException { .addExpressionLists(new ExpressionList().addExpressions(new Column("d")) .addExpressions(new Column("e"))); - Select select = new Select() - .withSelectBody(new ValuesStatement().withExpressions(multiExpressionList)); + Select select = new Values().withExpressions(multiExpressionList); Insert insert = new Insert().withTable(new Table("mytable")) .withColumns(Arrays.asList(new Column("col1"), new Column("col2"))) diff --git a/src/test/java/net/sf/jsqlparser/statement/merge/MergeTest.java b/src/test/java/net/sf/jsqlparser/statement/merge/MergeTest.java index 474981554..9a59f8aa1 100644 --- a/src/test/java/net/sf/jsqlparser/statement/merge/MergeTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/merge/MergeTest.java @@ -12,11 +12,13 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; -import static net.sf.jsqlparser.test.TestUtils.*; import org.assertj.core.api.Assertions; -import static org.junit.jupiter.api.Assertions.fail; import org.junit.jupiter.api.Test; +import static net.sf.jsqlparser.test.TestUtils.assertOracleHintExists; +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; +import static org.junit.jupiter.api.Assertions.fail; + /** * * @author toben @@ -25,15 +27,10 @@ public class MergeTest { @Test public void testOracleMergeIntoStatement() throws JSQLParserException { - String sql = "MERGE INTO bonuses B\n" - + "USING (\n" - + " SELECT employee_id, salary\n" - + " FROM employee\n" - + " WHERE dept_no =20) E\n" - + "ON (B.employee_id = E.employee_id)\n" - + "WHEN MATCHED THEN\n" - + " UPDATE SET B.bonus = E.salary * 0.1\n" - + "WHEN NOT MATCHED THEN\n" + String sql = "MERGE INTO bonuses B\n" + "USING (\n" + " SELECT employee_id, salary\n" + + " FROM employee\n" + " WHERE dept_no =20) E\n" + + "ON (B.employee_id = E.employee_id)\n" + "WHEN MATCHED THEN\n" + + " UPDATE SET B.bonus = E.salary * 0.1\n" + "WHEN NOT MATCHED THEN\n" + " INSERT (B.employee_id, B.bonus)\n" + " VALUES (E.employee_id, E.salary * 0.05) "; @@ -46,11 +43,8 @@ public void testOracleMergeIntoStatement() throws JSQLParserException { @Test public void testMergeIssue232() throws JSQLParserException { - String sql = "MERGE INTO xyz using dual " - + "ON ( custom_id = ? ) " - + "WHEN matched THEN " - + "UPDATE SET abc = sysdate " - + "WHEN NOT matched THEN " + String sql = "MERGE INTO xyz using dual " + "ON ( custom_id = ? ) " + "WHEN matched THEN " + + "UPDATE SET abc = sysdate " + "WHEN NOT matched THEN " + "INSERT (custom_id) VALUES (?)"; assertSqlCanBeParsedAndDeparsed(sql, true); @@ -60,95 +54,60 @@ public void testMergeIssue232() throws JSQLParserException { public void testMergeIssue676() throws JSQLParserException { String sql = "merge INTO M_KC21 USING\n" + "(SELECT AAA, BBB FROM I_KC21 WHERE I_KC21.aaa = 'li_kun'\n" - + ") TEMP ON (TEMP.AAA = M_KC21.AAA)\n" - + "WHEN MATCHED THEN\n" + + ") TEMP ON (TEMP.AAA = M_KC21.AAA)\n" + "WHEN MATCHED THEN\n" + "UPDATE SET M_KC21.BBB = 6 WHERE enterprise_id IN (0, 1)\n" - + "WHEN NOT MATCHED THEN\n" - + "INSERT VALUES\n" - + "(TEMP.AAA,TEMP.BBB\n" - + ")"; + + "WHEN NOT MATCHED THEN\n" + "INSERT VALUES\n" + "(TEMP.AAA,TEMP.BBB\n" + ")"; assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testComplexOracleMergeIntoStatement() throws JSQLParserException { - String sql = "MERGE INTO DestinationValue Dest USING\n" - + "(SELECT TheMonth ,\n" - + " IdentifyingKey ,\n" - + " SUM(NetPrice) NetPrice ,\n" + String sql = "MERGE INTO DestinationValue Dest USING\n" + "(SELECT TheMonth ,\n" + + " IdentifyingKey ,\n" + " SUM(NetPrice) NetPrice ,\n" + " SUM(NetDeductionPrice) NetDeductionPrice ,\n" + " MAX(CASE RowNumberMain WHEN 1 THEN QualityIndicator ELSE NULL END) QualityIndicatorMain ,\n" + " MAX(CASE RowNumberDeduction WHEN 1 THEN QualityIndicator ELSE NULL END) QualityIndicatorDeduction \n" - + "FROM\n" - + " (SELECT pd.TheMonth ,\n" + + "FROM\n" + " (SELECT pd.TheMonth ,\n" + " COALESCE(pd.IdentifyingKey, 0) IdentifyingKey ,\n" + " COALESCE(CASE pd.IsDeduction WHEN 1 THEN NULL ELSE ConvertedCalculatedValue END, 0) NetPrice ,\n" + " COALESCE(CASE pd.IsDeduction WHEN 1 THEN ConvertedCalculatedValue ELSE NULL END, 0) NetDeductionPrice ,\n" + " pd.QualityIndicator ,\n" + " row_number() OVER (PARTITION BY pd.TheMonth , pd.IdentifyingKey ORDER BY COALESCE(pd.QualityMonth, to_date('18991230', 'yyyymmdd')) DESC ) RowNumberMain ,\n" - + " NULL RowNumberDeduction\n" - + " FROM PricingData pd\n" + + " NULL RowNumberDeduction\n" + " FROM PricingData pd\n" + " WHERE pd.ThingsKey IN (:ThingsKeys)\n" + " AND pd.TheMonth >= :startdate\n" - + " AND pd.TheMonth <= :enddate\n" - + " AND pd.IsDeduction = 0\n" - + " UNION ALL\n" - + " SELECT pd.TheMonth ,\n" + + " AND pd.TheMonth <= :enddate\n" + " AND pd.IsDeduction = 0\n" + + " UNION ALL\n" + " SELECT pd.TheMonth ,\n" + " COALESCE(pd.IdentifyingKey, 0) IdentifyingKey ,\n" + " COALESCE(CASE pd.IsDeduction WHEN 1 THEN NULL ELSE ConvertedCalculatedValue END, 0) NetPrice ,\n" + " COALESCE(CASE pd.IsDeduction WHEN 1 THEN ConvertedCalculatedValue ELSE NULL END, 0) NetDeductionPrice ,\n" - + " pd.QualityIndicator ,\n" - + " NULL RowNumberMain ,\n" + + " pd.QualityIndicator ,\n" + " NULL RowNumberMain ,\n" + " row_number() OVER (PARTITION BY pd.TheMonth , pd.IdentifyingKey ORDER BY COALESCE(pd.QualityMonth, to_date('18991230', 'yyyymmdd')) DESC ) RowNumberDeduction \n" - + " FROM PricingData pd\n" - + " WHERE pd.ThingsKey IN (:ThingsKeys)\n" + + " FROM PricingData pd\n" + " WHERE pd.ThingsKey IN (:ThingsKeys)\n" + " AND pd.TheMonth >= :startdate\n" - + " AND pd.TheMonth <= :enddate\n" - + " AND pd.IsDeduction <> 0\n" - + " )\n" - + "GROUP BY TheMonth ,\n" - + " IdentifyingKey\n" + + " AND pd.TheMonth <= :enddate\n" + " AND pd.IsDeduction <> 0\n" + " )\n" + + "GROUP BY TheMonth ,\n" + " IdentifyingKey\n" + ") Data ON ( Dest.TheMonth = Data.TheMonth \n" + " AND COALESCE(Dest.IdentifyingKey,0) = Data.IdentifyingKey )\n" - + "WHEN MATCHED THEN\n" - + " UPDATE\n" + + "WHEN MATCHED THEN\n" + " UPDATE\n" + " SET NetPrice = ROUND(Data.NetPrice, PriceDecimalScale) ,\n" + " DeductionPrice = ROUND(Data.NetDeductionPrice, PriceDecimalScale) ,\n" + " SubTotalPrice = ROUND(Data.NetPrice + (Data.NetDeductionPrice * Dest.HasDeductions), PriceDecimalScale) ,\n" - + " QualityIndicator =\n" - + " CASE Dest.HasDeductions\n" - + " WHEN 0\n" - + " THEN Data.QualityIndicatorMain\n" - + " ELSE\n" - + " CASE\n" + + " QualityIndicator =\n" + " CASE Dest.HasDeductions\n" + " WHEN 0\n" + + " THEN Data.QualityIndicatorMain\n" + " ELSE\n" + " CASE\n" + " WHEN COALESCE(Data.CheckMonth1, to_date('18991230', 'yyyymmdd'))> COALESCE(Data.CheckMonth2,to_date('18991230', 'yyyymmdd'))\n" + " THEN Data.QualityIndicatorMain\n" - + " ELSE Data.QualityIndicatorDeduction\n" - + " END\n" - + " END ,\n" - + " RecUser = :recuser ,\n" - + " RecDate = :recdate\n" - + " WHERE 1 =1\n" - + " AND IsImportant = 1\n" + + " ELSE Data.QualityIndicatorDeduction\n" + " END\n" + + " END ,\n" + " RecUser = :recuser ,\n" + " RecDate = :recdate\n" + + " WHERE 1 =1\n" + " AND IsImportant = 1\n" + " AND COALESCE(Data.SomeFlag,-1) <> COALESCE(ROUND(Something, 1),-1)\n" - + " DELETE WHERE\n" - + " IsImportant = 0\n" + + " DELETE WHERE\n" + " IsImportant = 0\n" + " OR COALESCE(Data.SomeFlag,-1) = COALESCE(ROUND(Something, 1),-1)\n" - + " WHEN NOT MATCHED THEN \n" - + " INSERT\n" - + " (\n" - + " TheMonth ,\n" - + " ThingsKey ,\n" - + " IsDeduction ,\n" - + " CreatedAt \n" - + " )\n" - + " VALUES\n" - + " (\n" - + " Data.TheMonth ,\n" - + " Data.ThingsKey ,\n" - + " Data.IsDeduction ,\n" - + " SYSDATE\n" + + " WHEN NOT MATCHED THEN \n" + " INSERT\n" + " (\n" + " TheMonth ,\n" + + " ThingsKey ,\n" + " IsDeduction ,\n" + " CreatedAt \n" + " )\n" + + " VALUES\n" + " (\n" + " Data.TheMonth ,\n" + + " Data.ThingsKey ,\n" + " Data.IsDeduction ,\n" + " SYSDATE\n" + " )\n"; Statement statement = CCJSqlParserUtil.parse(sql); @@ -157,57 +116,48 @@ public void testComplexOracleMergeIntoStatement() throws JSQLParserException { @Test public void testMergeUpdateInsertOrderIssue401() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("MERGE INTO a USING dual ON (col3 = ? AND col1 = ? AND col2 = ?) WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4) VALUES (?, ?, ?, ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ?"); + assertSqlCanBeParsedAndDeparsed( + "MERGE INTO a USING dual ON (col3 = ? AND col1 = ? AND col2 = ?) WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4) VALUES (?, ?, ?, ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ?"); } @Test public void testMergeUpdateInsertOrderIssue401_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("MERGE INTO a USING dual ON (col3 = ? AND col1 = ? AND col2 = ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ? WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4) VALUES (?, ?, ?, ?)"); + assertSqlCanBeParsedAndDeparsed( + "MERGE INTO a USING dual ON (col3 = ? AND col1 = ? AND col2 = ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ? WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4) VALUES (?, ?, ?, ?)"); } @Test public void testMergeUpdateInsertOrderIssue401_3() throws JSQLParserException { try { - assertSqlCanBeParsedAndDeparsed("MERGE INTO a USING dual ON (col3 = ? AND col1 = ? AND col2 = ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ? WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4) VALUES (?, ?, ?, ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ?"); + assertSqlCanBeParsedAndDeparsed( + "MERGE INTO a USING dual ON (col3 = ? AND col1 = ? AND col2 = ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ? WHEN NOT MATCHED THEN INSERT (col1, col2, col3, col4) VALUES (?, ?, ?, ?) WHEN MATCHED THEN UPDATE SET col4 = col4 + ?"); fail("syntaxerror parsed"); } catch (JSQLParserException ex) { - //expected to fail + // expected to fail } } @Test public void testOracleHint() throws JSQLParserException { - String sql = "MERGE /*+ SOMEHINT */ INTO bonuses B\n" - + "USING (\n" - + " SELECT employee_id, salary\n" - + " FROM employee\n" - + " WHERE dept_no =20) E\n" - + "ON (B.employee_id = E.employee_id)\n" - + "WHEN MATCHED THEN\n" - + " UPDATE SET B.bonus = E.salary * 0.1\n" - + "WHEN NOT MATCHED THEN\n" - + " INSERT (B.employee_id, B.bonus)\n" + String sql = "MERGE /*+ SOMEHINT */ INTO bonuses B\n" + "USING (\n" + + " SELECT employee_id, salary\n" + " FROM employee\n" + + " WHERE dept_no =20) E\n" + "ON (B.employee_id = E.employee_id)\n" + + "WHEN MATCHED THEN\n" + " UPDATE SET B.bonus = E.salary * 0.1\n" + + "WHEN NOT MATCHED THEN\n" + " INSERT (B.employee_id, B.bonus)\n" + " VALUES (E.employee_id, E.salary * 0.05) "; assertOracleHintExists(sql, true, "SOMEHINT"); - //@todo: add a testcase supposed to not finding a misplaced hint + // @todo: add a testcase supposed to not finding a misplaced hint } @Test public void testInsertMergeWhere() throws JSQLParserException { - String sql - = "-- Both clauses present.\n" - + "MERGE INTO test1 a\n" - + " USING all_objects b\n" - + " ON (a.object_id = b.object_id)\n" - + " WHEN MATCHED THEN\n" - + " UPDATE SET a.status = b.status\n" - + " WHERE b.status != 'VALID'\n" - + " WHEN NOT MATCHED THEN\n" - + " INSERT (object_id, status)\n" - + " VALUES (b.object_id, b.status)\n" - + "\n" + String sql = "-- Both clauses present.\n" + "MERGE INTO test1 a\n" + + " USING all_objects b\n" + " ON (a.object_id = b.object_id)\n" + + " WHEN MATCHED THEN\n" + " UPDATE SET a.status = b.status\n" + + " WHERE b.status != 'VALID'\n" + " WHEN NOT MATCHED THEN\n" + + " INSERT (object_id, status)\n" + " VALUES (b.object_id, b.status)\n" + "\n" + " WHERE b.status != 'VALID'\n"; Statement statement = CCJSqlParserUtil.parse(sql); @@ -223,17 +173,11 @@ public void testInsertMergeWhere() throws JSQLParserException { @Test public void testWith() throws JSQLParserException { - String statement - = "" - + "WITH a\n" - + " AS (SELECT 1 id_instrument_ref)\n" - + " , b\n" - + " AS (SELECT 1 id_instrument_ref)\n" - + "MERGE INTO cfe.instrument_ref b\n" - + "using a\n" - + "ON ( b.id_instrument_ref = a.id_instrument_ref )\n" - + "WHEN matched THEN\n" - + " UPDATE SET b.id_instrument = 'a' "; + String statement = "" + "WITH a\n" + " AS (SELECT 1 id_instrument_ref)\n" + " , b\n" + + " AS (SELECT 1 id_instrument_ref)\n" + "MERGE INTO cfe.instrument_ref b\n" + + "using a\n" + "ON ( b.id_instrument_ref = a.id_instrument_ref )\n" + + "WHEN matched THEN\n" + " UPDATE SET b.id_instrument = 'a' "; + statement = "" + "WITH a\n" + " AS (SELECT 1 id_instrument_ref)\n" + "select * from a "; assertSqlCanBeParsedAndDeparsed(statement, true); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/FetchTest.java b/src/test/java/net/sf/jsqlparser/statement/select/FetchTest.java index c0e94f42b..8ccbd2bb8 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/FetchTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/FetchTest.java @@ -9,10 +9,12 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.*; -import net.sf.jsqlparser.statement.*; -import net.sf.jsqlparser.test.*; -import org.junit.jupiter.api.*; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.test.TestUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; class FetchTest { @Test @@ -26,9 +28,8 @@ void testParser() throws JSQLParserException { void getExpression() throws JSQLParserException { String sqlStr = "SELECT table_schema \n" + "FROM information_schema.tables \n" + "fetch next (SELECT 1 FROM DUAL) rows only"; - Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sqlStr, true); Fetch fetch = plainSelect.getFetch(); - Assertions.assertInstanceOf(SubSelect.class, fetch.getExpression()); + Assertions.assertInstanceOf(ParenthesedSelect.class, fetch.getExpression()); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/HiveTest.java b/src/test/java/net/sf/jsqlparser/statement/select/HiveTest.java index 8abc10494..d05753b4a 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/HiveTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/HiveTest.java @@ -9,51 +9,39 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; -import static net.sf.jsqlparser.test.TestUtils.*; +import org.junit.jupiter.api.Test; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; public class HiveTest { @Test public void testLeftSemiJoin() throws Exception { - String sql; - Statement statement; - - sql = "SELECT\n" + String sql = "SELECT\n" + " Something\n" + "FROM\n" + " Sometable\n" + "LEFT SEMI JOIN\n" + " Othertable\n"; - statement = CCJSqlParserUtil.parse(sql); - - System.out.println(statement.toString()); - - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); assertEquals(1, plainSelect.getJoins().size()); - assertEquals("Othertable", ((Table) plainSelect.getJoins().get(0).getRightItem()). - getFullyQualifiedName()); + assertEquals("Othertable", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); assertTrue(plainSelect.getJoins().get(0).isLeft()); assertTrue(plainSelect.getJoins().get(0).isSemi()); - assertStatementCanBeDeparsedAs(select, sql, true); - - assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testGroupByGroupingSets() throws Exception { String sql = "SELECT\n" - + " C1, C2, C3, MAX(Value)\n" - + "FROM\n" - + " Sometable\n" - + "GROUP BY C1, C2, C3 GROUPING SETS ((C1, C2), (C1, C2, C3), ())"; + + " C1, C2, C3, MAX(Value)\n" + + "FROM\n" + + " Sometable\n" + + "GROUP BY C1, C2, C3 GROUPING SETS ((C1, C2), (C1, C2, C3), ())"; assertSqlCanBeParsedAndDeparsed(sql, true); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/KSQLTest.java b/src/test/java/net/sf/jsqlparser/statement/select/KSQLTest.java index 0ef738206..2faf334a6 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/KSQLTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/KSQLTest.java @@ -9,91 +9,67 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import org.junit.jupiter.api.Test; + import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; -import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; public class KSQLTest { @Test public void testKSQLWindowedJoin() throws Exception { - String sql; - Statement statement; - - sql = "SELECT *\n" + String sql = "SELECT *\n" + "FROM table1 t1\n" + "INNER JOIN table2 t2\n" + "WITHIN (5 HOURS)\n" + "ON t1.id = t2.id\n"; - statement = CCJSqlParserUtil.parse(sql); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); - System.out.println(statement.toString()); - - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(1, plainSelect.getJoins().size()); - assertEquals("table2", ((Table) plainSelect.getJoins().get(0).getRightItem()). - getFullyQualifiedName()); + assertEquals("table2", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); assertTrue(plainSelect.getJoins().get(0).isWindowJoin()); assertEquals(5L, plainSelect.getJoins().get(0).getJoinWindow().getDuration()); - assertEquals("HOURS", plainSelect.getJoins().get(0).getJoinWindow().getTimeUnit().toString()); + assertEquals("HOURS", + plainSelect.getJoins().get(0).getJoinWindow().getTimeUnit().toString()); assertFalse(plainSelect.getJoins().get(0).getJoinWindow().isBeforeAfterWindow()); - assertStatementCanBeDeparsedAs(select, sql, true); - - assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testKSQLBeforeAfterWindowedJoin() throws Exception { - String sql; - Statement statement; - sql = "SELECT *\n" + String sql = "SELECT *\n" + "FROM table1 t1\n" + "INNER JOIN table2 t2\n" + "WITHIN (1 MINUTE, 5 MINUTES)\n" + "ON t1.id = t2.id\n"; - statement = CCJSqlParserUtil.parse(sql); - - System.out.println(statement.toString()); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(1, plainSelect.getJoins().size()); - assertEquals("table2", ((Table) plainSelect.getJoins().get(0).getRightItem()). - getFullyQualifiedName()); + assertEquals("table2", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); assertTrue(plainSelect.getJoins().get(0).isWindowJoin()); assertEquals(1L, plainSelect.getJoins().get(0).getJoinWindow().getBeforeDuration()); - assertEquals("MINUTE", plainSelect.getJoins().get(0).getJoinWindow().getBeforeTimeUnit().toString()); + assertEquals("MINUTE", + plainSelect.getJoins().get(0).getJoinWindow().getBeforeTimeUnit().toString()); assertEquals(5L, plainSelect.getJoins().get(0).getJoinWindow().getAfterDuration()); - assertEquals("MINUTES", plainSelect.getJoins().get(0).getJoinWindow().getAfterTimeUnit().toString()); + assertEquals("MINUTES", + plainSelect.getJoins().get(0).getJoinWindow().getAfterTimeUnit().toString()); assertTrue(plainSelect.getJoins().get(0).getJoinWindow().isBeforeAfterWindow()); - assertStatementCanBeDeparsedAs(select, sql, true); - - assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testKSQLHoppingWindows() throws Exception { - String sql; - Statement statement; - sql = "SELECT *\n" + String sql = "SELECT *\n" + "FROM table1 t1\n" + "WINDOW HOPPING (SIZE 30 SECONDS, ADVANCE BY 10 MINUTES)\n" + "GROUP BY region.id\n"; - statement = CCJSqlParserUtil.parse(sql); - System.out.println(statement.toString()); - - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); assertTrue(plainSelect.getKsqlWindow().isHoppingWindow()); assertFalse(plainSelect.getKsqlWindow().isSessionWindow()); assertFalse(plainSelect.getKsqlWindow().isTumblingWindow()); @@ -101,75 +77,49 @@ public void testKSQLHoppingWindows() throws Exception { assertEquals("SECONDS", plainSelect.getKsqlWindow().getSizeTimeUnit().toString()); assertEquals(10L, plainSelect.getKsqlWindow().getAdvanceDuration()); assertEquals("MINUTES", plainSelect.getKsqlWindow().getAdvanceTimeUnit().toString()); - assertStatementCanBeDeparsedAs(select, sql, true); - - assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testKSQLSessionWindows() throws Exception { - String sql; - Statement statement; - sql = "SELECT *\n" + String sql = "SELECT *\n" + "FROM table1 t1\n" + "WINDOW SESSION (5 MINUTES)\n" + "GROUP BY region.id\n"; - statement = CCJSqlParserUtil.parse(sql); - System.out.println(statement.toString()); - - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); assertTrue(plainSelect.getKsqlWindow().isSessionWindow()); assertFalse(plainSelect.getKsqlWindow().isHoppingWindow()); assertFalse(plainSelect.getKsqlWindow().isTumblingWindow()); assertEquals(5L, plainSelect.getKsqlWindow().getSizeDuration()); assertEquals("MINUTES", plainSelect.getKsqlWindow().getSizeTimeUnit().toString()); - - assertStatementCanBeDeparsedAs(select, sql, true); - assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testKSQLTumblingWindows() throws Exception { - String sql; - Statement statement; - sql = "SELECT *\n" + String sql = "SELECT *\n" + "FROM table1 t1\n" + "WINDOW TUMBLING (SIZE 30 SECONDS)\n" + "GROUP BY region.id\n"; - statement = CCJSqlParserUtil.parse(sql); - System.out.println(statement.toString()); - Select select = (Select) statement; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); assertTrue(plainSelect.getKsqlWindow().isTumblingWindow()); assertFalse(plainSelect.getKsqlWindow().isSessionWindow()); assertFalse(plainSelect.getKsqlWindow().isHoppingWindow()); assertEquals(30L, plainSelect.getKsqlWindow().getSizeDuration()); assertEquals("SECONDS", plainSelect.getKsqlWindow().getSizeTimeUnit().toString()); - - assertStatementCanBeDeparsedAs(select, sql, true); - assertSqlCanBeParsedAndDeparsed(sql, true); } @Test public void testKSQLEmitChanges() throws Exception { String sql = "SELECT * FROM table1 t1 GROUP BY region.id EMIT CHANGES"; - Statement statement = CCJSqlParserUtil.parse(sql); - Select select = (Select) statement; - PlainSelect selectBody = (PlainSelect) select.getSelectBody(); - assertTrue(selectBody.isEmitChanges()); - assertSqlCanBeParsedAndDeparsed(sql); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); + assertTrue(plainSelect.isEmitChanges()); } @Test public void testKSQLEmitChangesWithLimit() throws Exception { String sql = "SELECT * FROM table1 t1 GROUP BY region.id EMIT CHANGES LIMIT 2"; - Statement statement = CCJSqlParserUtil.parse(sql); - Select select = (Select) statement; - PlainSelect selectBody = (PlainSelect) select.getSelectBody(); - assertTrue(selectBody.isEmitChanges()); - assertSqlCanBeParsedAndDeparsed(sql); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); + assertTrue(plainSelect.isEmitChanges()); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java b/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java index ee6fc7bc2..d2582545b 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/NestedBracketsPerformanceTest.java @@ -9,68 +9,65 @@ */ package net.sf.jsqlparser.statement.select; -import java.util.logging.Logger; import net.sf.jsqlparser.JSQLParserException; -import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; +import java.util.logging.Logger; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + /** * * @author tw */ public class NestedBracketsPerformanceTest { + private static final Logger LOG = + Logger.getLogger(NestedBracketsPerformanceTest.class.getName()); + @Test @Timeout(2000) public void testIssue766() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('1','2'),'3'),'4'),'5'),'6'),'7'),'8'),'9'),'10'),'11'),'12'),'13'),'14'),'15'),'16'),'17'),'18'),'19'),'20'),'21'),col1 FROM tbl t1", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat(concat('1','2'),'3'),'4'),'5'),'6'),'7'),'8'),'9'),'10'),'11'),'12'),'13'),'14'),'15'),'16'),'17'),'18'),'19'),'20'),'21'),col1 FROM tbl t1", + true); } @Test @Timeout(2000) public void testIssue766_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT concat(concat(concat('1', '2'), '3'), '4'), col1 FROM tbl t1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT concat(concat(concat('1', '2'), '3'), '4'), col1 FROM tbl t1"); } @Test @Timeout(2000) public void testIssue235() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN ( CASE WHEN ( CASE WHEN ( CASE WHEN ( 1 ) THEN 0 END ) THEN 0 END ) THEN 0 END ) THEN 0 END FROM a", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN ( CASE WHEN ( CASE WHEN ( CASE WHEN ( 1 ) THEN 0 END ) THEN 0 END ) THEN 0 END ) THEN 0 END FROM a", + true); } @Test @Timeout(2000) public void testNestedCaseWhenWithoutBracketsIssue1162() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE VIEW VIEW_NAME1 AS\n" - + "SELECT CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE CASE\n" + assertSqlCanBeParsedAndDeparsed("CREATE VIEW VIEW_NAME1 AS\n" + "SELECT CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE\n" + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE CASE WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT' ELSE '0' END END END END END END END END END END END END END END COLUMNALIAS\n" + "FROM TABLE1", true); @@ -79,32 +76,19 @@ public void testNestedCaseWhenWithoutBracketsIssue1162() throws JSQLParserExcept @Test @Timeout(2000) public void testNestedCaseWhenWithBracketsIssue1162() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("CREATE VIEW VIEW_NAME1 AS\n" - + "SELECT CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" - + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" - + "ELSE (CASE\n" + assertSqlCanBeParsedAndDeparsed("CREATE VIEW VIEW_NAME1 AS\n" + "SELECT CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE\n" + "WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT'\n" + "ELSE (CASE WHEN WDGFLD.PORTTYPE = 1 THEN 'INPUT PORT' ELSE '0' END) END) END) END) END) END) END) END) END) END) END) END) END) END COLUMNALIAS\n" + "FROM TABLE1", true); @@ -114,12 +98,17 @@ public void testNestedCaseWhenWithBracketsIssue1162() throws JSQLParserException @Timeout(2000) @Disabled public void testIssue496() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select isNull(charLen(TEST_ID,0)+ isNull(charLen(TEST_DVC,0)+ isNull(charLen(TEST_NO,0)+ isNull(charLen(ATEST_ID,0)+ isNull(charLen(TESTNO,0)+ isNull(charLen(TEST_CTNT,0)+ isNull(charLen(TEST_MESG_CTNT,0)+ isNull(charLen(TEST_DTM,0)+ isNull(charLen(TEST_DTT,0)+ isNull(charLen(TEST_ADTT,0)+ isNull(charLen(TEST_TCD,0)+ isNull(charLen(TEST_PD,0)+ isNull(charLen(TEST_VAL,0)+ isNull(charLen(TEST_YN,0)+ isNull(charLen(TEST_DTACM,0)+ isNull(charLen(TEST_MST,0) from test_info_m"); + assertSqlCanBeParsedAndDeparsed( + "select isNull(charLen(TEST_ID,0)+ isNull(charLen(TEST_DVC,0)+ isNull(charLen(TEST_NO,0)+ isNull(charLen(ATEST_ID,0)+ isNull(charLen(TESTNO,0)+ isNull(charLen(TEST_CTNT,0)+ isNull(charLen(TEST_MESG_CTNT,0)+ isNull(charLen(TEST_DTM,0)+ isNull(charLen(TEST_DTT,0)+ isNull(charLen(TEST_ADTT,0)+ isNull(charLen(TEST_TCD,0)+ isNull(charLen(TEST_PD,0)+ isNull(charLen(TEST_VAL,0)+ isNull(charLen(TEST_YN,0)+ isNull(charLen(TEST_DTACM,0)+ isNull(charLen(TEST_MST,0) from test_info_m", + true); } @Test public void testIssue856() throws JSQLParserException { - String sql = "SELECT " + buildRecursiveBracketExpression("if(month(today()) = 3, sum(\"Table5\".\"Month 002\"), $1)", "0", 5) + " FROM mytbl"; + String sql = "SELECT " + + buildRecursiveBracketExpression( + "if(month(today()) = 3, sum(\"Table5\".\"Month 002\"), $1)", "0", 5) + + " FROM mytbl"; assertSqlCanBeParsedAndDeparsed(sql); } @@ -127,12 +116,14 @@ public void testIssue856() throws JSQLParserException { @Timeout(2000) public void testRecursiveBracketExpressionIssue1019() { assertEquals("IF(1=1, 1, 2)", buildRecursiveBracketExpression("IF(1=1, $1, 2)", "1", 0)); - assertEquals("IF(1=1, IF(1=1, 1, 2), 2)", buildRecursiveBracketExpression("IF(1=1, $1, 2)", "1", 1)); - assertEquals("IF(1=1, IF(1=1, IF(1=1, 1, 2), 2), 2)", buildRecursiveBracketExpression("IF(1=1, $1, 2)", "1", 2)); + assertEquals("IF(1=1, IF(1=1, 1, 2), 2)", + buildRecursiveBracketExpression("IF(1=1, $1, 2)", "1", 1)); + assertEquals("IF(1=1, IF(1=1, IF(1=1, 1, 2), 2), 2)", + buildRecursiveBracketExpression("IF(1=1, $1, 2)", "1", 2)); } // maxDepth = 10 collides with the Parser Timeout = 6 seconds - // temporarily restrict it to maxDepth = 6 for the moment + // temporarily restrict it to maxDepth = 8 for the moment // @todo: implement methods to set the Parser Timeout explicitly and on demand @Test public void testRecursiveBracketExpressionIssue1019_2() throws JSQLParserException { @@ -167,29 +158,31 @@ public void testIssue1013_4() throws JSQLParserException { LOG.info("testing " + sql); assertSqlCanBeParsedAndDeparsed(sql); } - private static final Logger LOG = Logger.getLogger(NestedBracketsPerformanceTest.class.getName()); /** - * Try to avoid or border exceptionally big parsing time increments by adding more bracket constructs. + * Try to avoid or border huge parsing time increments by adding more bracket constructs. * * @throws JSQLParserException */ - //@Test(timeout = 6000) + // @Test(timeout = 6000) public void testIncreaseOfParseTime() throws JSQLParserException { doIncreaseOfParseTimeTesting("concat($1,'B')", "'A'", 50); } - private void doIncreaseOfParseTimeTesting(String template, String finalExpression, int maxDepth) throws JSQLParserException { + private void doIncreaseOfParseTimeTesting(String template, String finalExpression, int maxDepth) + throws JSQLParserException { long oldDurationTime = 2000; int countProblematic = 0; for (int i = 0; i < maxDepth; i++) { - String sql = "SELECT " + buildRecursiveBracketExpression(template, finalExpression, i) + " FROM mytbl"; + String sql = "SELECT " + buildRecursiveBracketExpression(template, finalExpression, i) + + " FROM mytbl"; long startTime = System.currentTimeMillis(); assertSqlCanBeParsedAndDeparsed(sql, true); long durationTime = System.currentTimeMillis() - startTime; if (i > 0) { - System.out.println("old duration " + oldDurationTime + " new duration time " + durationTime + " for " + sql); + System.out.println("old duration " + oldDurationTime + " new duration time " + + durationTime + " for " + sql); } if (oldDurationTime * 10 < durationTime) { countProblematic++; @@ -204,16 +197,21 @@ private void doIncreaseOfParseTimeTesting(String template, String finalExpressio @Test public void testRecursiveBracketExpression() { - assertEquals("concat('A','B')", buildRecursiveBracketExpression("concat($1,'B')", "'A'", 0)); - assertEquals("concat(concat('A','B'),'B')", buildRecursiveBracketExpression("concat($1,'B')", "'A'", 1)); - assertEquals("concat(concat(concat('A','B'),'B'),'B')", buildRecursiveBracketExpression("concat($1,'B')", "'A'", 2)); + assertEquals("concat('A','B')", + buildRecursiveBracketExpression("concat($1,'B')", "'A'", 0)); + assertEquals("concat(concat('A','B'),'B')", + buildRecursiveBracketExpression("concat($1,'B')", "'A'", 1)); + assertEquals("concat(concat(concat('A','B'),'B'),'B')", + buildRecursiveBracketExpression("concat($1,'B')", "'A'", 2)); } - private String buildRecursiveBracketExpression(String template, String finalExpression, int depth) { + private String buildRecursiveBracketExpression(String template, String finalExpression, + int depth) { if (depth == 0) { return template.replace("$1", finalExpression); } - return template.replace("$1", buildRecursiveBracketExpression(template, finalExpression, depth - 1)); + return template.replace("$1", + buildRecursiveBracketExpression(template, finalExpression, depth - 1)); } @Test @@ -221,11 +219,11 @@ private String buildRecursiveBracketExpression(String template, String finalExpr public void testIssue1103() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "SELECT\n" + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(\n" - + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(\n" - + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(\n" - + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(0\n" + ",0),0),0),0),0),0),0),0)\n" - + ",0),0),0),0),0),0),0),0)\n" + ",0),0),0),0),0),0),0),0)\n" - + ",0),0),0),0),0),0),0),0)", + + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(\n" + + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(\n" + + "ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(ROUND(0\n" + + ",0),0),0),0),0),0),0),0)\n" + ",0),0),0),0),0),0),0),0)\n" + + ",0),0),0),0),0),0),0),0)\n" + ",0),0),0),0),0),0),0),0)", true); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java b/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java index 86acdaffc..965332623 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java @@ -15,6 +15,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + public class PostgresTest { @Test public void testExtractFunction() throws JSQLParserException { @@ -44,9 +46,7 @@ public void testExtractFunctionIssue1582() throws JSQLParserException { @Test public void testJSonExpressionIssue1696() throws JSQLParserException { String sqlStr = "SELECT '{\"key\": \"value\"}'::json -> 'key' AS X"; - Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); - - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sqlStr, true); SelectExpressionItem selectExpressionItem = (SelectExpressionItem) plainSelect.getSelectItems().get(0); Assertions.assertEquals("'key'", diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java index de5dbf2c7..9b26e8555 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectASTTest.java @@ -18,7 +18,8 @@ import net.sf.jsqlparser.parser.SimpleNode; import net.sf.jsqlparser.parser.Token; import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.statement.Statement; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -34,17 +35,15 @@ public class SelectASTTest { public void testSelectASTColumn() throws JSQLParserException { String sql = "SELECT a, b FROM mytable order by b, c"; StringBuilder b = new StringBuilder(sql); - Statement stmt = CCJSqlParserUtil.parse(sql); - Select select = (Select) stmt; - PlainSelect ps = (PlainSelect) select.getSelectBody(); - for (SelectItem item : ps.getSelectItems()) { + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); + for (SelectItem item : plainSelect.getSelectItems()) { SelectExpressionItem sei = (SelectExpressionItem) item; Column c = sei.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); b.setCharAt(astNode.jjtGetFirstToken().beginColumn - 1, '*'); } - for (OrderByElement item : ps.getOrderByElements()) { + for (OrderByElement item : plainSelect.getOrderByElements()) { Column c = item.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); @@ -64,46 +63,44 @@ public void testSelectASTNode() throws JSQLParserException { private Token subSelectStart; private Token subSelectEnd; - @Test - public void testSelectASTNodeSubSelect() throws JSQLParserException { - String sql = "SELECT * FROM mytable where 0<(select count(*) from mytable2)"; - SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql); - node.dump("*"); - assertEquals(CCJSqlParserTreeConstants.JJTSTATEMENT, node.getId()); - node.jjtAccept(new CCJSqlParserDefaultVisitor() { - @Override - public Object visit(SimpleNode node, Object data) { - if (node.getId() == CCJSqlParserTreeConstants.JJTSUBSELECT) { - subSelectStart = node.jjtGetFirstToken(); - subSelectEnd = node.jjtGetLastToken(); - return super.visit(node, data); - } else { - return super.visit(node, data); - } - } - }, null); - - assertNotNull(subSelectStart); - assertNotNull(subSelectEnd); - assertEquals(34, subSelectStart.beginColumn); - assertEquals(62, subSelectEnd.endColumn); - } + // @Test + // public void testSelectASTNodeSubSelect() throws JSQLParserException { + // String sql = "SELECT * FROM mytable where 0<(select count(*) from mytable2)"; + // SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql); + // node.dump("*"); + // assertEquals(CCJSqlParserTreeConstants.JJTSTATEMENT, node.getId()); + // node.jjtAccept(new CCJSqlParserDefaultVisitor() { + // @Override + // public Object visit(SimpleNode node, Object data) { + // if (node.getId() == CCJSqlParserTreeConstants.JJTSUBSELECT) { + // subSelectStart = node.jjtGetFirstToken(); + // subSelectEnd = node.jjtGetLastToken(); + // return super.visit(node, data); + // } else { + // return super.visit(node, data); + // } + // } + // }, null); + // + // assertNotNull(subSelectStart); + // assertNotNull(subSelectEnd); + // assertEquals(34, subSelectStart.beginColumn); + // assertEquals(62, subSelectEnd.endColumn); + // } @Test public void testSelectASTColumnLF() throws JSQLParserException { String sql = "SELECT a, b FROM mytable \n order by b, c"; StringBuilder b = new StringBuilder(sql); - Statement stmt = CCJSqlParserUtil.parse(sql); - Select select = (Select) stmt; - PlainSelect ps = (PlainSelect) select.getSelectBody(); - for (SelectItem item : ps.getSelectItems()) { + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); + for (SelectItem item : plainSelect.getSelectItems()) { SelectExpressionItem sei = (SelectExpressionItem) item; Column c = sei.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '*'); } - for (OrderByElement item : ps.getOrderByElements()) { + for (OrderByElement item : plainSelect.getOrderByElements()) { Column c = item.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); @@ -114,48 +111,50 @@ public void testSelectASTColumnLF() throws JSQLParserException { @Test public void testSelectASTCommentLF() throws JSQLParserException { - String sql = "SELECT /* testcomment */ \n a, b FROM -- testcomment2 \n mytable \n order by b, c"; + String sql = + "SELECT /* testcomment */ \n a, b FROM -- testcomment2 \n mytable \n order by b, c"; StringBuilder b = new StringBuilder(sql); - Statement stmt = CCJSqlParserUtil.parse(sql); - Select select = (Select) stmt; - PlainSelect ps = (PlainSelect) select.getSelectBody(); - for (SelectItem item : ps.getSelectItems()) { + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); + for (SelectItem item : plainSelect.getSelectItems()) { SelectExpressionItem sei = (SelectExpressionItem) item; Column c = sei.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '*'); } - for (OrderByElement item : ps.getOrderByElements()) { + for (OrderByElement item : plainSelect.getOrderByElements()) { Column c = item.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '#'); } - assertEquals("SELECT /* testcomment */ \n *, * FROM -- testcomment2 \n mytable \n order by #, #", b.toString()); + assertEquals( + "SELECT /* testcomment */ \n *, * FROM -- testcomment2 \n mytable \n order by #, #", + b.toString()); } @Test public void testSelectASTCommentCRLF() throws JSQLParserException { - String sql = "SELECT /* testcomment */ \r\n a, b FROM -- testcomment2 \r\n mytable \r\n order by b, c"; + String sql = + "SELECT /* testcomment */ \r\n a, b FROM -- testcomment2 \r\n mytable \r\n order by b, c"; StringBuilder b = new StringBuilder(sql); - Statement stmt = CCJSqlParserUtil.parse(sql); - Select select = (Select) stmt; - PlainSelect ps = (PlainSelect) select.getSelectBody(); - for (SelectItem item : ps.getSelectItems()) { + PlainSelect plainSelect = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true); + for (SelectItem item : plainSelect.getSelectItems()) { SelectExpressionItem sei = (SelectExpressionItem) item; Column c = sei.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '*'); } - for (OrderByElement item : ps.getOrderByElements()) { + for (OrderByElement item : plainSelect.getOrderByElements()) { Column c = item.getExpression(Column.class); SimpleNode astNode = c.getASTNode(); assertNotNull(astNode); b.setCharAt(astNode.jjtGetFirstToken().absoluteBegin - 1, '#'); } - assertEquals("SELECT /* testcomment */ \r\n *, * FROM -- testcomment2 \r\n mytable \r\n order by #, #", b.toString()); + assertEquals( + "SELECT /* testcomment */ \r\n *, * FROM -- testcomment2 \r\n mytable \r\n order by #, #", + b.toString()); } @Test @@ -185,7 +184,8 @@ public Object visit(SimpleNode node, Object data) { @Test public void testSelectASTExtractWithCommentsIssue1580() throws JSQLParserException { - String sql = "SELECT /* testcomment */ \r\n a, b FROM -- testcomment2 \r\n mytable \r\n order by b, c"; + String sql = + "SELECT /* testcomment */ \r\n a, b FROM -- testcomment2 \r\n mytable \r\n order by b, c"; SimpleNode root = (SimpleNode) CCJSqlParserUtil.parseAST(sql); List comments = new ArrayList<>(); @@ -193,7 +193,7 @@ public void testSelectASTExtractWithCommentsIssue1580() throws JSQLParserExcepti @Override public Object visit(SimpleNode node, Object data) { if (node.jjtGetFirstToken().specialToken != null) { - //needed since for different nodes we got the same first token + // needed since for different nodes we got the same first token if (!comments.contains(node.jjtGetFirstToken().specialToken)) { comments.add(node.jjtGetFirstToken().specialToken); } @@ -202,19 +202,17 @@ public Object visit(SimpleNode node, Object data) { } }, null); - assertThat(comments) - .extracting(token -> token.image) - .containsExactly("/* testcomment */", "-- testcomment2 "); + assertThat(comments).extracting(token -> token.image).containsExactly("/* testcomment */", + "-- testcomment2 "); } @Test public void testSelectASTExtractWithCommentsIssue1580_2() throws JSQLParserException { - String sql = "/* I want this comment */\n" - + "SELECT order_detail_id, quantity\n" - + "/* But ignore this one safely */\n" - + "FROM order_details;"; + String sql = "/* I want this comment */\n" + "SELECT order_detail_id, quantity\n" + + "/* But ignore this one safely */\n" + "FROM order_details;"; SimpleNode root = (SimpleNode) CCJSqlParserUtil.parseAST(sql); - assertThat(root.jjtGetFirstToken().specialToken.image).isEqualTo("/* I want this comment */"); + assertThat(root.jjtGetFirstToken().specialToken.image) + .isEqualTo("/* I want this comment */"); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index c17168fd3..e1767244c 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.io.StringReader; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -47,6 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -76,13 +78,13 @@ public void testMultiPartTableNameWithServerNameAndDatabaseNameAndSchemaName() assertSqlCanBeParsedAndDeparsed(statement, false, parser -> parser.withSquareBracketQuotation(true)); assertDeparse( - new Select().withSelectBody(new PlainSelect() + new PlainSelect() .addSelectItems( new SelectExpressionItem(new Column().withColumnName("columnName"))) .withFromItem(new Table() .withDatabase(new Database("databaseName") .withServer(new Server("[server-name\\server-instance]"))) - .withSchemaName("schemaName").withName("tableName"))), + .withSchemaName("schemaName").withName("tableName")), statement); } @@ -93,12 +95,12 @@ public void testMultiPartTableNameWithServerNameAndDatabaseName() throws Excepti assertSqlCanBeParsedAndDeparsed(statement, false, parser -> parser.withSquareBracketQuotation(true)); - assertDeparse(new Select().withSelectBody(new PlainSelect() + assertDeparse(new PlainSelect() .addSelectItems(new SelectExpressionItem(new Column().withColumnName("columnName"))) .withFromItem(new Table() .withDatabase(new Database("databaseName") .withServer(new Server("[server-name\\server-instance]"))) - .withName("tableName"))), + .withName("tableName")), statement); } @@ -179,20 +181,19 @@ public void testMultiPartColumnNameWithDatabaseNameAndTableName() throws Excepti Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - checkMultipartIdentifier(select, "columnName", "databaseName..tableName.columnName"); + checkMultipartIdentifier(select, "databaseName..tableName.columnName"); } @Test @Disabled public void testMultiPartColumnNameWithDatabaseName() { final String statement = "SELECT databaseName...columnName FROM tableName"; - Select select; - try { - select = (Select) parserManager.parse(new StringReader(statement)); - fail("must not work"); - } catch (JSQLParserException ex) { - // Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex); - } + Assertions.assertThrows(JSQLParserException.class, new Executable() { + @Override + public void execute() throws Throwable { + parserManager.parse(new StringReader(statement)); + } + }); } @Test @@ -201,20 +202,19 @@ public void testMultiPartColumnNameWithSchemaNameAndTableName() throws Exception Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - checkMultipartIdentifier(select, "columnName", "schemaName.tableName.columnName"); + checkMultipartIdentifier(select, "schemaName.tableName.columnName"); } @Test @Disabled public void testMultiPartColumnNameWithSchemaName() { final String statement = "SELECT schemaName..columnName FROM tableName"; - Select select; - try { - select = (Select) parserManager.parse(new StringReader(statement)); - fail("must not work"); - } catch (JSQLParserException ex) { - // Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex); - } + Assertions.assertThrows(JSQLParserException.class, new Executable() { + @Override + public void execute() throws Throwable { + parserManager.parse(new StringReader(statement)); + } + }); } @Test @@ -223,7 +223,7 @@ public void testMultiPartColumnNameWithTableName() throws Exception { Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - checkMultipartIdentifier(select, "columnName", "tableName.columnName"); + checkMultipartIdentifier(select, "tableName.columnName"); } @Test @@ -232,31 +232,31 @@ public void testMultiPartColumnName() throws Exception { Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - checkMultipartIdentifier(select, "columnName", "columnName"); + checkMultipartIdentifier(select, "columnName"); } - void checkMultipartIdentifier(Select select, String columnName, String fullColumnName) { - final Expression expr = ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + void checkMultipartIdentifier(Select select, String fullColumnName) { + final Expression expr = ((SelectExpressionItem) ((PlainSelect) select) .getSelectItems().get(0)).getExpression(); assertTrue(expr instanceof Column); Column col = (Column) expr; - assertEquals(columnName, col.getColumnName()); + assertEquals("columnName", col.getColumnName()); assertEquals(fullColumnName, col.getFullyQualifiedName()); } @Test public void testAllColumnsFromTable() throws Exception { final String statement = "SELECT tableName.* FROM tableName"; - Select select = (Select) parserManager.parse(new StringReader(statement)); + PlainSelect select = (PlainSelect) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - assertTrue(((PlainSelect) select.getSelectBody()).getSelectItems() + assertTrue(select.getSelectItems() .get(0) instanceof AllTableColumns); Table t = new Table("tableName"); assertDeparse( - new Select().withSelectBody(new PlainSelect() - .addSelectItems(new AllTableColumns().withTable(t)).withFromItem(t)), + new PlainSelect() + .addSelectItems(new AllTableColumns().withTable(t)).withFromItem(t), statement); } @@ -315,12 +315,12 @@ public void testLimit() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - Expression offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - Expression rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + Expression offset = select.getLimit().getOffset(); + Expression rowCount = select.getLimit().getRowCount(); assertEquals(3, ((LongValue) offset).getValue()); assertTrue(rowCount instanceof JdbcParameter); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); // toString uses standard syntax statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ? OFFSET 3"; @@ -329,16 +329,16 @@ public void testLimit() throws JSQLParserException { statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?"; select = (Select) parserManager.parse(new StringReader(statement)); - assertNull(((PlainSelect) select.getSelectBody()).getLimit()); - assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); + assertNull(select.getLimit()); + assertNotNull(select.getOffset()); assertEquals("?", - ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); + select.getOffset().getOffset().toString()); assertStatementCanBeDeparsedAs(select, statement); statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION " + "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) LIMIT 3, 4"; - select = (Select) parserManager.parse(new StringReader(statement)); - SetOperationList setList = (SetOperationList) select.getSelectBody(); + SetOperationList setList = + (SetOperationList) parserManager.parse(new StringReader(statement)); offset = setList.getLimit().getOffset(); rowCount = setList.getLimit().getRowCount(); @@ -363,14 +363,14 @@ public void testLimit2() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - Expression offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - Expression rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + Expression offset = select.getLimit().getOffset(); + Expression rowCount = select.getLimit().getRowCount(); assertEquals(3, ((LongValue) offset).getValue()); assertNotNull(((JdbcParameter) rowCount).getIndex()); assertFalse(((JdbcParameter) rowCount).isUseFixedIndex()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); + assertFalse(select.getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitNull()); // toString uses standard syntax statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ? OFFSET 3"; @@ -378,57 +378,57 @@ public void testLimit2() throws JSQLParserException { statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT NULL OFFSET 3"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertNull(offset); assertTrue(rowCount instanceof NullValue); assertEquals(new LongValue(3), - ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); - assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); + select.getOffset().getOffset()); + assertFalse(select.getLimit().isLimitAll()); + assertTrue(select.getLimit().isLimitNull()); assertSqlCanBeParsedAndDeparsed(statement); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ALL OFFSET 5"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertNull(offset); assertTrue(rowCount instanceof AllValue); assertEquals(new LongValue(5), - ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); - assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); + select.getOffset().getOffset()); + assertTrue(select.getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitNull()); assertSqlCanBeParsedAndDeparsed(statement); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 0 OFFSET 3"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertNull(offset); assertEquals(0, ((LongValue) rowCount).getValue()); assertEquals(new LongValue(3), - ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); + select.getOffset().getOffset()); + assertFalse(select.getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitNull()); assertSqlCanBeParsedAndDeparsed(statement); statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?"; select = (Select) parserManager.parse(new StringReader(statement)); - assertNull(((PlainSelect) select.getSelectBody()).getLimit()); - assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); + assertNull(select.getLimit()); + assertNotNull(select.getOffset()); assertEquals("?", - ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); + select.getOffset().getOffset().toString()); assertStatementCanBeDeparsedAs(select, statement); statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION " + "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) LIMIT 3, 4"; select = (Select) parserManager.parse(new StringReader(statement)); - SetOperationList setList = (SetOperationList) select.getSelectBody(); + SetOperationList setList = (SetOperationList) select; assertEquals(3, ((LongValue) (setList.getLimit().getOffset())).getValue()); assertEquals(4, ((LongValue) (setList.getLimit().getRowCount())).getValue()); @@ -449,57 +449,57 @@ public void testLimit3() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - Expression offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - Expression rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + Expression offset = select.getLimit().getOffset(); + Expression rowCount = select.getLimit().getRowCount(); assertEquals(1, (int) ((JdbcParameter) offset).getIndex()); assertEquals(2, ((LongValue) rowCount).getValue()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 1, ?2"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals(1, ((LongValue) offset).getValue()); assertEquals(2, (int) ((JdbcParameter) rowCount).getIndex()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1, ?2"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals(2, (int) (((JdbcParameter) rowCount).getIndex())); assertEquals(1, (int) ((JdbcParameter) offset).getIndex()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 1, ?"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals(1, ((LongValue) offset).getValue()); assertNotNull(((JdbcParameter) rowCount).getIndex()); assertFalse(((JdbcParameter) rowCount).isUseFixedIndex()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?, ?"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertNotNull(((JdbcParameter) offset).getIndex()); assertFalse(((JdbcParameter) offset).isUseFixedIndex()); assertNotNull(((JdbcParameter) rowCount).getIndex()); assertFalse(((JdbcParameter) rowCount).isUseFixedIndex()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertNull(offset); assertEquals(1, ((JdbcParameter) rowCount).getIndex().intValue()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); } @Test @@ -508,52 +508,52 @@ public void testLimit4() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - Expression offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - Expression rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + Expression offset = select.getLimit().getOffset(); + Expression rowCount = select.getLimit().getRowCount(); assertEquals("some_name", ((JdbcNamedParameter) offset).getName()); assertEquals(2, ((LongValue) rowCount).getValue()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 1, :some_name"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals(1, ((LongValue) offset).getValue()); assertEquals("some_name", ((JdbcNamedParameter) rowCount).getName()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT :name1, :name2"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals("name2", ((JdbcNamedParameter) rowCount).getName()); assertEquals("name1", ((JdbcNamedParameter) offset).getName()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1, :name1"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals(1, (int) ((JdbcParameter) offset).getIndex()); assertEquals("name1", ((JdbcNamedParameter) rowCount).getName()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT :name1, ?1"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertEquals(1, (int) ((JdbcParameter) rowCount).getIndex()); assertEquals("name1", ((JdbcNamedParameter) offset).getName()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT :param_name"; select = (Select) parserManager.parse(new StringReader(statement)); - offset = ((PlainSelect) select.getSelectBody()).getLimit().getOffset(); - rowCount = ((PlainSelect) select.getSelectBody()).getLimit().getRowCount(); + offset = select.getLimit().getOffset(); + rowCount = select.getLimit().getRowCount(); assertNull(offset); assertEquals("param_name", ((JdbcNamedParameter) rowCount).getName()); - assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); + assertFalse(select.getLimit().isLimitAll()); } @Test @@ -563,15 +563,15 @@ public void testLimitSqlServer1() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetParam()); - assertNotNull(((PlainSelect) select.getSelectBody()).getFetch()); - assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); - assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); - assertNull(((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter()); + assertNotNull(select.getOffset()); + assertEquals("ROWS", select.getOffset().getOffsetParam()); + assertNotNull(select.getFetch()); + assertEquals("ROWS", select.getFetch().getFetchParam()); + assertFalse(select.getFetch().isFetchParamFirst()); + assertNull(select.getFetch().getFetchJdbcParameter()); assertEquals("3", - ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); - assertEquals(5, ((PlainSelect) select.getSelectBody()).getFetch().getRowCount()); + select.getOffset().getOffset().toString()); + assertEquals(5, select.getFetch().getRowCount()); assertStatementCanBeDeparsedAs(select, statement); } @@ -583,14 +583,14 @@ public void testLimitSqlServer2() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertNotNull(((PlainSelect) select.getSelectBody()).getFetch()); - assertEquals("ROW", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetParam()); - assertEquals("ROW", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); - assertTrue(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); + assertNotNull(select.getOffset()); + assertNotNull(select.getFetch()); + assertEquals("ROW", select.getOffset().getOffsetParam()); + assertEquals("ROW", select.getFetch().getFetchParam()); + assertTrue(select.getFetch().isFetchParamFirst()); assertEquals(new LongValue(3), - ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); - assertEquals(5, ((PlainSelect) select.getSelectBody()).getFetch().getRowCount()); + select.getOffset().getOffset()); + assertEquals(5, select.getFetch().getRowCount()); assertStatementCanBeDeparsedAs(select, statement); } @@ -602,11 +602,11 @@ public void testLimitSqlServer3() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertNull(((PlainSelect) select.getSelectBody()).getFetch()); - assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetParam()); + assertNotNull(select.getOffset()); + assertNull(select.getFetch()); + assertEquals("ROWS", select.getOffset().getOffsetParam()); assertEquals(new LongValue(3), - ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); + select.getOffset().getOffset()); assertStatementCanBeDeparsedAs(select, statement); } @@ -618,11 +618,11 @@ public void testLimitSqlServer4() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertNotNull(((PlainSelect) select.getSelectBody()).getFetch()); - assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); - assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); - assertEquals(5, ((PlainSelect) select.getSelectBody()).getFetch().getRowCount()); + assertNull(select.getOffset()); + assertNotNull(select.getFetch()); + assertEquals("ROWS", select.getFetch().getFetchParam()); + assertFalse(select.getFetch().isFetchParamFirst()); + assertEquals(5, select.getFetch().getRowCount()); assertStatementCanBeDeparsedAs(select, statement); } @@ -633,14 +633,14 @@ public void testLimitSqlServerJdbcParameters() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetParam()); - assertNotNull(((PlainSelect) select.getSelectBody()).getFetch()); - assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); - assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); + assertNotNull(select.getOffset()); + assertEquals("ROWS", select.getOffset().getOffsetParam()); + assertNotNull(select.getFetch()); + assertEquals("ROWS", select.getFetch().getFetchParam()); + assertFalse(select.getFetch().isFetchParamFirst()); assertEquals("?", - ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); - assertEquals("?", ((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter() + select.getOffset().getOffset().toString()); + assertEquals("?", select.getFetch().getFetchJdbcParameter() .toString()); assertStatementCanBeDeparsedAs(select, statement); } @@ -676,15 +676,15 @@ public void testLimitOffsetKeyWordAsNamedParameter2() throws JSQLParserException public void testTop() throws JSQLParserException { String statement = "SELECT TOP 3 * FROM mytable WHERE mytable.col = 9"; - Select select = (Select) parserManager.parse(new StringReader(statement)); + PlainSelect select = (PlainSelect) parserManager.parse(new StringReader(statement)); - assertEquals(3, select.getSelectBody(PlainSelect.class).getTop() + assertEquals(3, select.getTop() .getExpression(LongValue.class).getValue()); assertStatementCanBeDeparsedAs(select, statement); statement = "select top 5 foo from bar"; - select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(5, select.getSelectBody(PlainSelect.class).getTop() + select = (PlainSelect) parserManager.parse(new StringReader(statement)); + assertEquals(5, select.getTop() .getExpression(LongValue.class).getValue()); } @@ -697,7 +697,7 @@ public void testTopWithParenthesis() throws JSQLParserException { + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); - final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + final PlainSelect selectBody = (PlainSelect) select; final Top top = selectBody.getTop(); assertEquals("5", top.getExpression().toString()); @@ -718,7 +718,7 @@ public void testTopWithTies() throws JSQLParserException { "SELECT TOP (5) PERCENT WITH TIES columnName1, columnName2 FROM tableName"; final Select select = (Select) parserManager.parse(new StringReader(statement)); - final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + final PlainSelect selectBody = (PlainSelect) select; final Top top = selectBody.getTop(); assertEquals("5", top.getExpression().toString()); @@ -735,22 +735,22 @@ public void testTopWithJdbcParameter() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1, (int) ((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop() + assertEquals(1, (int) ((JdbcParameter) ((PlainSelect) select).getTop() .getExpression()).getIndex()); assertStatementCanBeDeparsedAs(select, statement); statement = "select top :name1 foo from bar"; select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals("name1", ((JdbcNamedParameter) ((PlainSelect) select.getSelectBody()).getTop() + assertEquals("name1", ((JdbcNamedParameter) ((PlainSelect) select).getTop() .getExpression()).getName()); statement = "select top ? foo from bar"; select = (Select) parserManager.parse(new StringReader(statement)); assertNotNull( - ((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()) + ((JdbcParameter) ((PlainSelect) select).getTop().getExpression()) .getIndex()); assertFalse( - ((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()) + ((JdbcParameter) ((PlainSelect) select).getTop().getExpression()) .isUseFixedIndex()); } @@ -762,10 +762,10 @@ public void testSkip() throws JSQLParserException { + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); - final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + final PlainSelect selectBody = (PlainSelect) select; final Skip skip = selectBody.getSkip(); - assertEquals((long) 5, (long) skip.getRowCount()); + assertEquals(5, (long) skip.getRowCount()); assertNull(skip.getJdbcParameter()); assertNull(skip.getVariable()); @@ -779,7 +779,7 @@ public void testSkip() throws JSQLParserException { final String statement2 = "SELECT SKIP skipVar c1, c2 FROM t"; final Select select2 = (Select) parserManager.parse(new StringReader(statement2)); - final PlainSelect selectBody2 = (PlainSelect) select2.getSelectBody(); + final PlainSelect selectBody2 = (PlainSelect) select2; final Skip skip2 = selectBody2.getSkip(); assertNull(skip2.getRowCount()); @@ -802,10 +802,10 @@ public void testFirst() throws JSQLParserException { + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); - final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + final PlainSelect selectBody = (PlainSelect) select; final First limit = selectBody.getFirst(); - assertEquals((long) 5, (long) limit.getRowCount()); + assertEquals(5, (long) limit.getRowCount()); assertNull(limit.getJdbcParameter()); assertEquals(First.Keyword.FIRST, limit.getKeyword()); @@ -819,7 +819,7 @@ public void testFirst() throws JSQLParserException { final String statement2 = "SELECT FIRST firstVar c1, c2 FROM t"; final Select select2 = (Select) parserManager.parse(new StringReader(statement2)); - final PlainSelect selectBody2 = (PlainSelect) select2.getSelectBody(); + final PlainSelect selectBody2 = (PlainSelect) select2; final First first2 = selectBody2.getFirst(); assertNull(first2.getRowCount()); @@ -842,7 +842,7 @@ public void testFirstWithKeywordLimit() throws JSQLParserException { + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); - final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + final PlainSelect selectBody = (PlainSelect) select; final First limit = selectBody.getFirst(); assertNull(limit.getRowCount()); @@ -864,7 +864,7 @@ public void testSkipFirst() throws JSQLParserException { final String statement = "SELECT SKIP ?1 FIRST f1 c1, c2 FROM t1"; final Select select = (Select) parserManager.parse(new StringReader(statement)); - final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + final PlainSelect selectBody = (PlainSelect) select; final Skip skip = selectBody.getSkip(); assertNotNull(skip.getJdbcParameter()); @@ -890,7 +890,7 @@ public void testSelectItems() throws JSQLParserException { String statement = "SELECT myid AS MYID, mycol, tab.*, schema.tab.*, mytab.mycol2, myschema.mytab.mycol, myschema.mytab.* FROM mytable WHERE mytable.col = 9"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; final List selectItems = plainSelect.getSelectItems(); assertEquals("MYID", ((SelectExpressionItem) selectItems.get(0)).getAlias().getName()); @@ -913,14 +913,14 @@ public void testSelectItems() throws JSQLParserException { statement = "SELECT myid AS MYID, (SELECT MAX(ID) AS myid2 FROM mytable2) AS myalias FROM mytable WHERE mytable.col = 9"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; assertEquals("myalias", ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getAlias().getName()); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT (myid + myid2) AS MYID FROM mytable WHERE mytable.col = 9"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; assertEquals("MYID", ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias().getName()); assertStatementCanBeDeparsedAs(select, statement); @@ -958,8 +958,8 @@ public void testUnion() throws JSQLParserException { + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " + "SELECT * FROM mytable2 LIMIT 3, 4"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - SetOperationList setList = (SetOperationList) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + SetOperationList setList = (SetOperationList) select; assertEquals(3, setList.getSelects().size()); assertEquals("mytable", ((Table) ((PlainSelect) setList.getSelects().get(0)).getFromItem()).getName()); @@ -968,23 +968,16 @@ public void testUnion() throws JSQLParserException { assertEquals("mytable2", ((Table) ((PlainSelect) setList.getSelects().get(2)).getFromItem()).getName()); assertEquals(3, - ((LongValue) ((PlainSelect) setList.getSelects().get(2)).getLimit().getOffset()) - .getValue()); + ((LongValue) setList.getSelects().get(2).getLimit().getOffset()).getValue()); - // use brakets for toString - // use standard limit syntax - String statementToString = "SELECT * FROM mytable WHERE mytable.col = 9 UNION " - + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " - + "SELECT * FROM mytable2 LIMIT 3, 4"; - assertStatementCanBeDeparsedAs(select, statementToString); // with fetch and with ur String statement2 = "SELECT * FROM mytable WHERE mytable.col = 9 UNION " + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " + "SELECT * FROM mytable2 ORDER BY COL DESC FETCH FIRST 1 ROWS ONLY WITH UR"; - Select select2 = (Select) parserManager.parse(new StringReader(statement2)); - SetOperationList setList2 = (SetOperationList) select2.getSelectBody(); + Select select2 = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement2, true); + SetOperationList setList2 = (SetOperationList) select2; assertEquals(3, setList2.getSelects().size()); assertEquals("mytable", ((Table) ((PlainSelect) setList2.getSelects().get(0)).getFromItem()).getName()); @@ -992,11 +985,9 @@ public void testUnion() throws JSQLParserException { ((Table) ((PlainSelect) setList2.getSelects().get(1)).getFromItem()).getName()); assertEquals("mytable2", ((Table) ((PlainSelect) setList2.getSelects().get(2)).getFromItem()).getName()); - assertEquals(1, ((SetOperationList) setList2).getFetch().getRowCount()); + assertEquals(1, setList2.getFetch().getRowCount()); - assertEquals("UR", ((SetOperationList) setList2).getWithIsolation().getIsolation()); - - assertStatementCanBeDeparsedAs(select2, statement2); + assertEquals("UR", setList2.getIsolation().getIsolation()); } @Test @@ -1005,8 +996,8 @@ public void testUnion2() throws JSQLParserException { + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " + "SELECT * FROM mytable2 LIMIT 3 OFFSET 4"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - SetOperationList setList = (SetOperationList) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + SetOperationList setList = (SetOperationList) select; assertEquals(3, setList.getSelects().size()); assertEquals("mytable", ((Table) ((PlainSelect) setList.getSelects().get(0)).getFromItem()).getName()); @@ -1015,31 +1006,25 @@ public void testUnion2() throws JSQLParserException { assertEquals("mytable2", ((Table) ((PlainSelect) setList.getSelects().get(2)).getFromItem()).getName()); assertEquals(3, - ((LongValue) ((PlainSelect) setList.getSelects().get(2)).getLimit().getRowCount()) + ((LongValue) setList.getSelects().get(2).getLimit().getRowCount()) .getValue()); - assertNull(((PlainSelect) setList.getSelects().get(2)).getLimit().getOffset()); + assertNull(setList.getSelects().get(2).getLimit().getOffset()); assertEquals(new LongValue(4), - ((PlainSelect) setList.getSelects().get(2)).getOffset().getOffset()); + setList.getSelects().get(2).getOffset().getOffset()); - // use brakets for toString - // use standard limit syntax - String statementToString = "SELECT * FROM mytable WHERE mytable.col = 9 UNION " - + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " - + "SELECT * FROM mytable2 LIMIT 3 OFFSET 4"; - assertStatementCanBeDeparsedAs(select, statementToString); } @Test public void testDistinct() throws JSQLParserException { String statement = "SELECT DISTINCT ON (myid) myid, mycol FROM mytable WHERE mytable.col = 9"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + + PlainSelect plainSelect = (PlainSelect) select; assertEquals("myid", ((Column) ((SelectExpressionItem) plainSelect.getDistinct() .getOnSelectItems().get(0)).getExpression()).getColumnName()); assertEquals("mycol", ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)) .getExpression()).getColumnName()); - assertStatementCanBeDeparsedAs(select, statement); } @Test @@ -1057,14 +1042,13 @@ public void testIsNotDistinctFrom() throws JSQLParserException { @Test public void testDistinctTop() throws JSQLParserException { String statement = "SELECT DISTINCT TOP 5 myid, mycol FROM mytable WHERE mytable.col = 9"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + PlainSelect plainSelect = (PlainSelect) select; assertEquals("myid", ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) .getExpression()).getColumnName()); assertEquals("mycol", ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)) .getExpression()).getColumnName()); assertNotNull(plainSelect.getTop()); - assertStatementCanBeDeparsedAs(select, statement); } @Test @@ -1082,11 +1066,10 @@ public void testDistinctTop2() { public void testDistinctWithFollowingBrackets() throws JSQLParserException { Select select = (Select) assertSqlCanBeParsedAndDeparsed( "SELECT DISTINCT (phone), name FROM admin_user"); - PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + PlainSelect selectBody = (PlainSelect) select; Distinct distinct = selectBody.getDistinct(); - assertThat(selectBody.getDistinct()).isNotNull() - .hasFieldOrPropertyWithValue("onSelectItems", null); + assertThat(distinct).isNotNull().hasFieldOrPropertyWithValue("onSelectItems", null); assertThat(selectBody.getSelectItems().get(0).toString()).isEqualTo("(phone)"); } @@ -1094,11 +1077,9 @@ public void testDistinctWithFollowingBrackets() throws JSQLParserException { public void testFrom() throws JSQLParserException { String statement = "SELECT * FROM mytable as mytable0, mytable1 alias_tab1, mytable2 as alias_tab2, (SELECT * FROM mytable3) AS mytable4 WHERE mytable.col = 9"; - String statementToString = - "SELECT * FROM mytable AS mytable0, mytable1 alias_tab1, mytable2 AS alias_tab2, (SELECT * FROM mytable3) AS mytable4 WHERE mytable.col = 9"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + PlainSelect plainSelect = (PlainSelect) select; assertEquals(3, plainSelect.getJoins().size()); assertEquals("mytable0", plainSelect.getFromItem().getAlias().getName()); assertEquals("alias_tab1", @@ -1106,14 +1087,13 @@ public void testFrom() throws JSQLParserException { assertEquals("alias_tab2", plainSelect.getJoins().get(1).getRightItem().getAlias().getName()); assertEquals("mytable4", plainSelect.getJoins().get(2).getRightItem().getAlias().getName()); - assertStatementCanBeDeparsedAs(select, statementToString); } @Test public void testJoin() throws JSQLParserException { String statement = "SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id = tab2.id"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + PlainSelect plainSelect = (PlainSelect) select; assertEquals(1, plainSelect.getJoins().size()); assertEquals("tab2", ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); @@ -1121,39 +1101,34 @@ public void testJoin() throws JSQLParserException { ((Column) ((EqualsTo) plainSelect.getJoins().get(0).getOnExpression()) .getLeftExpression()).getFullyQualifiedName()); assertTrue(plainSelect.getJoins().get(0).isOuter()); - assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id = tab2.id INNER JOIN tab3"; - select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + plainSelect = (PlainSelect) select; assertEquals(2, plainSelect.getJoins().size()); assertEquals("tab3", ((Table) plainSelect.getJoins().get(1).getRightItem()).getFullyQualifiedName()); assertFalse(plainSelect.getJoins().get(1).isOuter()); - assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id = tab2.id JOIN tab3"; - select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + plainSelect = (PlainSelect) select; assertEquals(2, plainSelect.getJoins().size()); assertEquals("tab3", ((Table) plainSelect.getJoins().get(1).getRightItem()).getFullyQualifiedName()); assertFalse(plainSelect.getJoins().get(1).isOuter()); - assertStatementCanBeDeparsedAs(select, statement); // implicit INNER statement = "SELECT * FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id = tab2.id INNER JOIN tab3"; - select = (Select) parserManager.parse(new StringReader(statement)); - assertStatementCanBeDeparsedAs(select, statement); + TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); statement = "SELECT * FROM TA2 LEFT OUTER JOIN O USING (col1, col2) WHERE D.OasSD = 'asdf' AND (kj >= 4 OR l < 'sdf')"; - select = (Select) parserManager.parse(new StringReader(statement)); - assertStatementCanBeDeparsedAs(select, statement); + TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); statement = "SELECT * FROM tab1 INNER JOIN tab2 USING (id, id2)"; - select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + plainSelect = (PlainSelect) select; assertEquals(1, plainSelect.getJoins().size()); assertEquals("tab2", ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); @@ -1161,33 +1136,30 @@ public void testJoin() throws JSQLParserException { assertEquals(2, plainSelect.getJoins().get(0).getUsingColumns().size()); assertEquals("id2", plainSelect.getJoins().get(0).getUsingColumns().get(1).getFullyQualifiedName()); - assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM tab1 RIGHT OUTER JOIN tab2 USING (id, id2)"; assertSqlCanBeParsedAndDeparsed(statement); statement = "SELECT * FROM foo AS f LEFT OUTER JOIN (bar AS b RIGHT OUTER JOIN baz AS z ON f.id = z.id) ON f.id = b.id"; - select = (Select) parserManager.parse(new StringReader(statement)); - assertStatementCanBeDeparsedAs(select, statement); + TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + statement = "SELECT * FROM foo AS f, OUTER bar AS b WHERE f.id = b.id"; - select = (Select) parserManager.parse(new StringReader(statement)); - assertStatementCanBeDeparsedAs(select, statement); - plainSelect = (PlainSelect) select.getSelectBody(); + select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + plainSelect = (PlainSelect) select; assertEquals(1, plainSelect.getJoins().size()); assertTrue(plainSelect.getJoins().get(0).isOuter()); assertTrue(plainSelect.getJoins().get(0).isSimple()); assertEquals("bar", ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); - assertEquals("b", - ((Table) plainSelect.getJoins().get(0).getRightItem()).getAlias().getName()); + assertEquals("b", plainSelect.getJoins().get(0).getRightItem().getAlias().getName()); } @Test public void testFunctions() throws JSQLParserException { String statement = "SELECT MAX(id) AS max FROM mytable WHERE mytable.col = 9"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals("max", ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias().getName()); assertStatementCanBeDeparsedAs(select, statement); @@ -1200,14 +1172,14 @@ public void testFunctions() throws JSQLParserException { statement = "SELECT MAX(id), AVG(pro) AS myavg FROM mytable WHERE mytable.col = 9 GROUP BY pro"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; assertEquals("myavg", ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getAlias().getName()); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT MAX(a, b, c), COUNT(*), D FROM tab1 GROUP BY D"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; Function fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) .getExpression(); assertEquals("MAX", fun.getName()); @@ -1219,7 +1191,7 @@ public void testFunctions() throws JSQLParserException { statement = "SELECT {fn MAX(a, b, c)}, COUNT(*), D FROM tab1 GROUP BY D"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) .getExpression(); assertTrue(fun.isEscaped()); @@ -1232,7 +1204,7 @@ public void testFunctions() throws JSQLParserException { statement = "SELECT ab.MAX(a, b, c), cd.COUNT(*), D FROM tab1 GROUP BY D"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) .getExpression(); assertEquals("ab.MAX", fun.getName()); @@ -1282,8 +1254,8 @@ public void testWhere() throws JSQLParserException { final String statement = "SELECT * FROM tab1 WHERE"; String whereToString = "(a + b + c / d + e * f) * (a / b * (a + b)) > ?"; - PlainSelect plainSelect = (PlainSelect) ((Select) parserManager - .parse(new StringReader(statement + " " + whereToString))).getSelectBody(); + PlainSelect plainSelect = (PlainSelect) parserManager + .parse(new StringReader(statement + " " + whereToString)); assertTrue(plainSelect.getWhere() instanceof GreaterThan); assertTrue(((GreaterThan) plainSelect.getWhere()) .getLeftExpression() instanceof Multiplication); @@ -1292,26 +1264,26 @@ public void testWhere() throws JSQLParserException { assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), whereToString); whereToString = "(7 * s + 9 / 3) NOT BETWEEN 3 AND ?"; - plainSelect = (PlainSelect) ((Select) parserManager - .parse(new StringReader(statement + " " + whereToString))).getSelectBody(); + plainSelect = (PlainSelect) parserManager + .parse(new StringReader(statement + " " + whereToString)); assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), whereToString); assertEquals(statement + " " + whereToString, plainSelect.toString()); whereToString = "a / b NOT IN (?, 's''adf', 234.2)"; - plainSelect = (PlainSelect) ((Select) parserManager - .parse(new StringReader(statement + " " + whereToString))).getSelectBody(); + plainSelect = (PlainSelect) parserManager + .parse(new StringReader(statement + " " + whereToString)); assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), whereToString); assertEquals(statement + " " + whereToString, plainSelect.toString()); whereToString = " NOT 0 = 0"; - plainSelect = (PlainSelect) ((Select) parserManager - .parse(new StringReader(statement + whereToString))).getSelectBody(); + parserManager + .parse(new StringReader(statement + whereToString)); whereToString = " NOT (0 = 0)"; - plainSelect = (PlainSelect) ((Select) parserManager - .parse(new StringReader(statement + whereToString))).getSelectBody(); + plainSelect = (PlainSelect) parserManager + .parse(new StringReader(statement + whereToString)); assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), whereToString.trim()); assertEquals(statement + whereToString, plainSelect.toString()); @@ -1321,7 +1293,7 @@ public void testWhere() throws JSQLParserException { public void testGroupBy() throws JSQLParserException { String statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals(1, plainSelect.getGroupBy().getGroupByExpressions().size()); assertEquals("tab1.b", ((Column) plainSelect.getGroupBy().getGroupByExpressions().get(0)) .getFullyQualifiedName()); @@ -1329,7 +1301,7 @@ public void testGroupBy() throws JSQLParserException { statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY 2, 3"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; assertEquals(2, plainSelect.getGroupBy().getGroupByExpressions().size()); assertEquals(2, ((LongValue) plainSelect.getGroupBy().getGroupByExpressions().get(0)).getValue()); @@ -1343,14 +1315,14 @@ public void testHaving() throws JSQLParserException { String statement = "SELECT MAX(tab1.b) FROM tab1 WHERE a > 34 GROUP BY tab1.b HAVING MAX(tab1.b) > 56"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.getHaving() instanceof GreaterThan); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT MAX(tab1.b) FROM tab1 WHERE a > 34 HAVING MAX(tab1.b) IN (56, 32, 3, ?)"; select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; assertTrue(plainSelect.getHaving() instanceof InExpression); assertStatementCanBeDeparsedAs(select, statement); } @@ -1364,7 +1336,7 @@ public void testExists() throws JSQLParserException { assertEquals(statement, parsed.toString()); - PlainSelect plainSelect = (PlainSelect) ((Select) parsed).getSelectBody(); + PlainSelect plainSelect = (PlainSelect) parsed; assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), where); } @@ -1384,10 +1356,8 @@ public void testOrderBy() throws JSQLParserException { // TODO: should there be a DESC marker in the OrderByElement class? String statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a DESC, tab1.b ASC"; - String statementToString = - "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a DESC, tab1.b ASC"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + PlainSelect plainSelect = (PlainSelect) select; assertEquals(2, plainSelect.getOrderByElements().size()); assertEquals("tab1.a", ((Column) plainSelect.getOrderByElements().get(0).getExpression()) .getFullyQualifiedName()); @@ -1395,18 +1365,15 @@ public void testOrderBy() throws JSQLParserException { ((Column) plainSelect.getOrderByElements().get(1).getExpression()).getColumnName()); assertTrue(plainSelect.getOrderByElements().get(1).isAsc()); assertFalse(plainSelect.getOrderByElements().get(0).isAsc()); - assertStatementCanBeDeparsedAs(select, statementToString); statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a, 2"; - select = (Select) parserManager.parse(new StringReader(statement)); - plainSelect = (PlainSelect) select.getSelectBody(); + select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + plainSelect = (PlainSelect) select; assertEquals(2, plainSelect.getOrderByElements().size()); assertEquals("a", ((Column) plainSelect.getOrderByElements().get(0).getExpression()).getColumnName()); assertEquals(2, ((LongValue) plainSelect.getOrderByElements().get(1).getExpression()).getValue()); - assertStatementCanBeDeparsedAs(select, statement); - } @Test @@ -1425,7 +1392,7 @@ public void testOrderByWithComplexExpression() throws JSQLParserException { public void testTimestamp() throws JSQLParserException { String statement = "SELECT * FROM tab1 WHERE a > {ts '2004-04-30 04:05:34.56'}"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals("2004-04-30 04:05:34.56", ((TimestampValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()) .getValue().toString()); @@ -1436,7 +1403,7 @@ public void testTimestamp() throws JSQLParserException { public void testTime() throws JSQLParserException { String statement = "SELECT * FROM tab1 WHERE a > {t '04:05:34'}"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals("04:05:34", (((TimeValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()) .getValue()).toString()); @@ -1558,7 +1525,7 @@ public void testReplaceAsFunction() throws JSQLParserException { Statement stmt = CCJSqlParserUtil.parse(statement); Select select = (Select) stmt; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals(1, plainSelect.getSelectItems().size()); Expression expression = @@ -1574,7 +1541,7 @@ public void testLike() throws JSQLParserException { String statement = "SELECT * FROM tab1 WHERE a LIKE 'test'"; Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()) .getValue()); @@ -1582,7 +1549,7 @@ public void testLike() throws JSQLParserException { statement = "SELECT * FROM tab1 WHERE a LIKE 'test' ESCAPE 'test2'"; select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - plainSelect = (PlainSelect) select.getSelectBody(); + plainSelect = (PlainSelect) select; assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()) .getValue()); @@ -1594,24 +1561,24 @@ public void testLike() throws JSQLParserException { public void testNotLike() throws JSQLParserException { String statement = "SELECT * FROM tab1 WHERE a NOT LIKE 'test'"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()) .getValue()); - assertEquals(true, ((LikeExpression) plainSelect.getWhere()).isNot()); + assertTrue(((LikeExpression) plainSelect.getWhere()).isNot()); } @Test public void testNotLikeWithNotBeforeExpression() throws JSQLParserException { String statement = "SELECT * FROM tab1 WHERE NOT a LIKE 'test'"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.getWhere() instanceof NotExpression); NotExpression notExpr = (NotExpression) plainSelect.getWhere(); assertEquals("test", ((StringValue) ((LikeExpression) notExpr.getExpression()).getRightExpression()) .getValue()); - assertEquals(false, ((LikeExpression) notExpr.getExpression()).isNot()); + assertFalse(((LikeExpression) notExpr.getExpression()).isNot()); } @Test @@ -1638,7 +1605,7 @@ public void testDouble() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); assertEquals(1e2, - ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select) .getSelectItems().get(0)).getExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); @@ -1646,7 +1613,7 @@ public void testDouble() throws JSQLParserException { statement = "SELECT * FROM mytable WHERE mytable.col = 1.e2"; select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()) + assertEquals(1e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select) .getWhere()).getRightExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); @@ -1654,7 +1621,7 @@ public void testDouble() throws JSQLParserException { select = (Select) parserManager.parse(new StringReader(statement)); assertEquals(1.2e2, - ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()) + ((DoubleValue) ((BinaryExpression) ((PlainSelect) select) .getWhere()).getRightExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); @@ -1662,7 +1629,7 @@ public void testDouble() throws JSQLParserException { statement = "SELECT * FROM mytable WHERE mytable.col = 2e2"; select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(2e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()) + assertEquals(2e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select) .getWhere()).getRightExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); } @@ -1673,7 +1640,7 @@ public void testDouble2() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); assertEquals(1e22, - ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select) .getSelectItems().get(0)).getExpression()).getValue(), 0); } @@ -1684,7 +1651,7 @@ public void testDouble3() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); assertEquals(1.0, - ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select) .getSelectItems().get(0)).getExpression()).getValue(), 0); } @@ -1695,7 +1662,7 @@ public void testDouble4() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); assertEquals(1.2e22, - ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select) .getSelectItems().get(0)).getExpression()).getValue(), 0); } @@ -2033,7 +2000,7 @@ public void testIsNot() throws JSQLParserException { @Test public void testIsNot2() throws JSQLParserException { - // the deparser delivers always a IS NOT NULL even for NOT a IS NULL + // the deparser delivers always an IS NOT NULL even for NOT an IS NULL String stmt = "SELECT * FROM test WHERE NOT a IS NULL"; Statement parsed = parserManager.parse(new StringReader(stmt)); assertStatementCanBeDeparsedAs(parsed, "SELECT * FROM test WHERE NOT a IS NULL"); @@ -2436,7 +2403,7 @@ public void testProblemFunction() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(stmt); Statement parsed = CCJSqlParserUtil.parse(stmt); Select select = (Select) parsed; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; SelectItem get = plainSelect.getSelectItems().get(0); SelectExpressionItem item = (SelectExpressionItem) get; assertTrue(item.getExpression() instanceof Function); @@ -2500,7 +2467,7 @@ public void testLateral1() throws JSQLParserException { public void testLateralComplex1() throws IOException, JSQLParserException { String stmt = IOUtils.toString( SelectTest.class.getResourceAsStream("complex-lateral-select-request.txt"), - Charset.forName("UTF-8")); + StandardCharsets.UTF_8); Select select = (Select) parserManager.parse(new StringReader(stmt)); assertEquals( "SELECT O.ORDERID, O.CUSTNAME, OL.LINETOTAL, OC.ORDCHGTOTAL, OT.TAXTOTAL FROM ORDERS O, LATERAL(SELECT SUM(NETAMT) AS LINETOTAL FROM ORDERLINES LINES WHERE LINES.ORDERID = O.ORDERID) AS OL, LATERAL(SELECT SUM(CHGAMT) AS ORDCHGTOTAL FROM ORDERCHARGES CHARGES WHERE LINES.ORDERID = O.ORDERID) AS OC, LATERAL(SELECT SUM(TAXAMT) AS TAXTOTAL FROM ORDERTAXES TAXES WHERE TAXES.ORDERID = O.ORDERID) AS OT", @@ -2572,7 +2539,7 @@ public void testInterval2() throws JSQLParserException { Statement st = CCJSqlParserUtil.parse(stmt); Select select = (Select) st; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertEquals(1, plainSelect.getSelectItems().size()); SelectExpressionItem item = (SelectExpressionItem) plainSelect.getSelectItems().get(0); @@ -2858,7 +2825,7 @@ public void testNamedParameter() throws JSQLParserException { Statement st = CCJSqlParserUtil.parse(stmt); Select select = (Select) st; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; Expression exp = ((BinaryExpression) plainSelect.getWhere()).getRightExpression(); assertTrue(exp instanceof JdbcNamedParameter); JdbcNamedParameter namedParameter = (JdbcNamedParameter) exp; @@ -2873,7 +2840,7 @@ public void testNamedParameter2() throws JSQLParserException { Statement st = CCJSqlParserUtil.parse(stmt); Select select = (Select) st; - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; Expression exp_l = ((BinaryExpression) plainSelect.getWhere()).getLeftExpression(); Expression exp_r = ((BinaryExpression) plainSelect.getWhere()).getRightExpression(); @@ -2903,7 +2870,7 @@ public void testNamedParameter3() throws JSQLParserException { } @Test - public void testComplexUnion1() throws IOException, JSQLParserException { + public void testComplexUnion1() throws JSQLParserException { String stmt = "(SELECT 'abc-' || coalesce(mytab.a::varchar, '') AS a, mytab.b, mytab.c AS st, mytab.d, mytab.e FROM mytab WHERE mytab.del = 0) UNION (SELECT 'cde-' || coalesce(mytab2.a::varchar, '') AS a, mytab2.b, mytab2.bezeichnung AS c, 0 AS d, 0 AS e FROM mytab2 WHERE mytab2.del = 0)"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -3075,6 +3042,7 @@ public void testSqlCache() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(stmt); } + @Test public void testSelectInto1() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * INTO user_copy FROM user"); } @@ -3352,7 +3320,7 @@ public void testOracleHintExpression() throws JSQLParserException { Statement parsed = parserManager.parse(new StringReader(statement)); assertEquals(statement, parsed.toString()); - PlainSelect plainSelect = (PlainSelect) ((Select) parsed).getSelectBody(); + PlainSelect plainSelect = (PlainSelect) parsed; assertExpressionCanBeDeparsedAs(plainSelect.getOracleHint(), "--+ HINT\n"); } @@ -3360,7 +3328,7 @@ public void testOracleHintExpression() throws JSQLParserException { public void testTableFunctionWithNoParams() throws Exception { final String statement = "SELECT f2 FROM SOME_FUNCTION()"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.getFromItem() instanceof TableFunction); TableFunction fromItem = (TableFunction) plainSelect.getFromItem(); @@ -3376,7 +3344,7 @@ public void testTableFunctionWithNoParams() throws Exception { public void testTableFunctionWithParams() throws Exception { final String statement = "SELECT f2 FROM SOME_FUNCTION(1, 'val')"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.getFromItem() instanceof TableFunction); TableFunction fromItem = (TableFunction) plainSelect.getFromItem(); @@ -3392,7 +3360,7 @@ public void testTableFunctionWithParams() throws Exception { Expression firstParam = expressions.get(0); assertNotNull(firstParam); assertTrue(firstParam instanceof LongValue); - assertEquals(1l, ((LongValue) firstParam).getValue()); + assertEquals(1L, ((LongValue) firstParam).getValue()); Expression secondParam = expressions.get(1); assertNotNull(secondParam); @@ -3407,7 +3375,7 @@ public void testTableFunctionWithParams() throws Exception { public void testTableFunctionWithAlias() throws Exception { final String statement = "SELECT f2 FROM SOME_FUNCTION() AS z"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.getFromItem() instanceof TableFunction); TableFunction fromItem = (TableFunction) plainSelect.getFromItem(); @@ -3434,8 +3402,10 @@ public void testIssue217_keywordSeparator() throws JSQLParserException { @Test public void testIssue215_possibleEndlessParsing() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT (CASE WHEN ((value LIKE '%t1%') OR (value LIKE '%t2%')) THEN 't1s' WHEN ((((((((((((((((((((((((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%')) OR (value LIKE '%t6%')) OR (value LIKE '%t6%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t8%')) OR (value LIKE '%t8%')) OR (value LIKE '%CTO%')) OR (value LIKE '%cto%')) OR (value LIKE '%Cto%')) OR (value LIKE '%t9%')) OR (value LIKE '%t9%')) OR (value LIKE '%COO%')) OR (value LIKE '%coo%')) OR (value LIKE '%Coo%')) OR (value LIKE '%t10%')) OR (value LIKE '%t10%')) OR (value LIKE '%CIO%')) OR (value LIKE '%cio%')) OR (value LIKE '%Cio%')) OR (value LIKE '%t11%')) OR (value LIKE '%t11%')) THEN 't' WHEN ((((value LIKE '%t12%') OR (value LIKE '%t12%')) OR (value LIKE '%VP%')) OR (value LIKE '%vp%')) THEN 'Vice t12s' WHEN ((((((value LIKE '% IT %') OR (value LIKE '%t13%')) OR (value LIKE '%t13%')) OR (value LIKE '% it %')) OR (value LIKE '%tech%')) OR (value LIKE '%Tech%')) THEN 'IT' WHEN ((((value LIKE '%Analyst%') OR (value LIKE '%t14%')) OR (value LIKE '%Analytic%')) OR (value LIKE '%analytic%')) THEN 'Analysts' WHEN ((value LIKE '%Manager%') OR (value LIKE '%manager%')) THEN 't15' ELSE 'Other' END) FROM tab1"); + String sqlStr = + "SELECT (CASE WHEN ((value LIKE '%t1%') OR (value LIKE '%t2%')) THEN 't1s' WHEN ((((((((((((((((((((((((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%')) OR (value LIKE '%t6%')) OR (value LIKE '%t6%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t7%')) OR (value LIKE '%t8%')) OR (value LIKE '%t8%')) OR (value LIKE '%CTO%')) OR (value LIKE '%cto%')) OR (value LIKE '%Cto%')) OR (value LIKE '%t9%')) OR (value LIKE '%t9%')) OR (value LIKE '%COO%')) OR (value LIKE '%coo%')) OR (value LIKE '%Coo%')) OR (value LIKE '%t10%')) OR (value LIKE '%t10%')) OR (value LIKE '%CIO%')) OR (value LIKE '%cio%')) OR (value LIKE '%Cio%')) OR (value LIKE '%t11%')) OR (value LIKE '%t11%')) THEN 't' WHEN ((((value LIKE '%t12%') OR (value LIKE '%t12%')) OR (value LIKE '%VP%')) OR (value LIKE '%vp%')) THEN 'Vice t12s' WHEN ((((((value LIKE '% IT %') OR (value LIKE '%t13%')) OR (value LIKE '%t13%')) OR (value LIKE '% it %')) OR (value LIKE '%tech%')) OR (value LIKE '%Tech%')) THEN 'IT' WHEN ((((value LIKE '%Analyst%') OR (value LIKE '%t14%')) OR (value LIKE '%Analytic%')) OR (value LIKE '%analytic%')) THEN 'Analysts' WHEN ((value LIKE '%Manager%') OR (value LIKE '%manager%')) THEN 't15' ELSE 'Other' END) FROM tab1"; + Statement stmt2 = CCJSqlParserUtil.parse(sqlStr, + parser -> parser.withAllowComplexParsing(false).withTimeOut(20000)); } @Test @@ -3522,15 +3492,17 @@ public void testCastToSigned() throws JSQLParserException { "SELECT CAST(contact_id AS SIGNED) FROM contact WHERE contact_id = 20"); } - // @Test - // public void testWhereIssue240_notBoolean() { - // try { - // CCJSqlParserUtil.parse("SELECT count(*) FROM mytable WHERE 5"); - // fail("should not be parsed"); - // } catch (JSQLParserException ex) { - // //expected to fail - // } - // } + @Test + @Disabled + public void testWhereIssue240_notBoolean() { + Assertions.assertThrows(JSQLParserException.class, new Executable() { + @Override + public void execute() throws Throwable { + CCJSqlParserUtil.parse("SELECT count(*) FROM mytable WHERE 5"); + } + }); + } + @Test public void testWhereIssue240_true() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE true"); @@ -3557,7 +3529,7 @@ public void testSpeedTestIssue235() throws JSQLParserException { public void testSpeedTestIssue235_2() throws IOException, JSQLParserException { String stmt = IOUtils.toString(SelectTest.class.getResourceAsStream("large-sql-issue-235.txt"), - Charset.forName("UTF-8")); + StandardCharsets.UTF_8); assertSqlCanBeParsedAndDeparsed(stmt, true); } @@ -3620,7 +3592,7 @@ public void testUniqueInsteadOfDistinctIssue299() throws JSQLParserException { public void testProblemSqlIssue265() throws IOException, JSQLParserException { String sqls = IOUtils.toString( SelectTest.class.getResourceAsStream("large-sql-with-issue-265.txt"), - Charset.forName("UTF-8")); + StandardCharsets.UTF_8); Statements stmts = CCJSqlParserUtil.parseStatements(sqls); assertEquals(2, stmts.getStatements().size()); } @@ -3675,8 +3647,15 @@ public void testProblemIssue375() throws JSQLParserException { @Test public void testProblemIssue375Simplified() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "select * from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and c.relname = 'business' and n.nspname = 'public') inner join pg_catalog.pg_attribute a on (not a.attisdropped) and a.attnum > 0 and a.attrelid = c.oid) inner join pg_catalog.pg_type t on t.oid = a.atttypid) left outer join pg_attrdef d on a.atthasdef and d.adrelid = a.attrelid and d.adnum = a.attnum order by n.nspname, c.relname, attnum", + assertSqlCanBeParsedAndDeparsed("select * " + "from (((pg_catalog.pg_class c " + + " inner join pg_catalog.pg_namespace n " + " on n.oid = c.relnamespace " + + " and c.relname = 'business' and n.nspname = 'public') " + + " inner join pg_catalog.pg_attribute a " + " on (not a.attisdropped) " + + " and a.attnum > 0 and a.attrelid = c.oid) " + + " inner join pg_catalog.pg_type t " + " on t.oid = a.atttypid) " + + " left outer join pg_attrdef d " + + " on a.atthasdef and d.adrelid = a.attrelid " + + " and d.adnum = a.attnum " + "order by n.nspname, c.relname, attnum", true); } @@ -3752,7 +3731,7 @@ public void testForUpdateWaitParseDeparse() throws JSQLParserException { public void testForUpdateWaitWithTimeout() throws JSQLParserException { String statement = "SELECT * FROM mytable FOR UPDATE WAIT 60"; Select select = (Select) parserManager.parse(new StringReader(statement)); - PlainSelect ps = (PlainSelect) select.getSelectBody(); + PlainSelect ps = (PlainSelect) select; Wait wait = ps.getWait(); assertNotNull(wait, "wait should not be null"); @@ -3765,14 +3744,18 @@ public void testForUpdateNoWait() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable FOR UPDATE NOWAIT"); } - // @Test public void testSubSelectFailsIssue394() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("select aa.* , t.* from accenter.all aa, (select a.* from - // pacioli.emc_plan a) t"); - // } - // - // @Test public void testSubSelectFailsIssue394_2() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("select * from all"); - // } + @Test + public void testSubSelectFailsIssue394() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed( + "select aa.* , t.* from accenter.all aa, (select a.* from pacioli.emc_plan a) t", + true); + } + + @Test + public void testSubSelectFailsIssue394_2() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("select * from all", true); + } + @Test public void testMysqlIndexHints() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT column FROM testtable AS t0 USE INDEX (index1)"); @@ -3916,17 +3899,17 @@ public void testIssue572TaskReplacement() throws JSQLParserException { public void testIssue566LargeView() throws IOException, JSQLParserException { String stmt = IOUtils.toString(SelectTest.class.getResourceAsStream("large-sql-issue-566.txt"), - Charset.forName("UTF-8")); + StandardCharsets.UTF_8); assertSqlCanBeParsedAndDeparsed(stmt, true); } @Test - public void testIssue566PostgreSQLEscaped() throws IOException, JSQLParserException { + public void testIssue566PostgreSQLEscaped() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT E'test'"); } @Test - public void testEscaped() throws IOException, JSQLParserException { + public void testEscaped() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT _utf8'testvalue'"); } @@ -4338,8 +4321,7 @@ public void testDateArithmentic9() throws JSQLParserException { public void testDateArithmentic10() throws JSQLParserException { String sql = "select CURRENT_DATE + CASE WHEN CAST(RAND() * 3 AS INTEGER) = 1 THEN 100 ELSE 0 END DAY AS NEW_DATE from mytable"; - assertSqlCanBeParsedAndDeparsed(sql, true); - Select select = (Select) CCJSqlParserUtil.parse(sql); + assertInstanceOf(Select.class, assertSqlCanBeParsedAndDeparsed(sql, true)); } @@ -4349,7 +4331,7 @@ public void testDateArithmentic11() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(sql, true); Select select = (Select) CCJSqlParserUtil.parse(sql); final List list = new ArrayList<>(); - select.getSelectBody().accept(new SelectVisitorAdapter() { + select.accept(new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { list.addAll(plainSelect.getSelectItems()); @@ -4378,7 +4360,7 @@ public void testDateArithmentic13() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(sql); Select select = (Select) CCJSqlParserUtil.parse(sql); final List list = new ArrayList<>(); - select.getSelectBody().accept(new SelectVisitorAdapter() { + select.accept(new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { list.addAll(plainSelect.getSelectItems()); @@ -4403,7 +4385,7 @@ public void testRawStringExpressionIssue656(String prefix) throws JSQLParserExce statement.accept(new StatementVisitorAdapter() { @Override public void visit(Select select) { - select.getSelectBody().accept(new SelectVisitorAdapter() { + select.accept(new SelectVisitorAdapter() { @Override public void visit(PlainSelect plainSelect) { SelectExpressionItem typedExpression = @@ -4679,7 +4661,7 @@ public void testOuterApplyIssue930() throws JSQLParserException { public void testWrongParseTreeIssue89() throws JSQLParserException { Select unionQuery = (Select) CCJSqlParserUtil .parse("SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY col"); - SetOperationList unionQueries = (SetOperationList) unionQuery.getSelectBody(); + SetOperationList unionQueries = (SetOperationList) unionQuery; assertThat(unionQueries.getSelects()).extracting(select -> (PlainSelect) select) .allSatisfy(ps -> assertNull(ps.getOrderByElements())); @@ -4726,7 +4708,8 @@ public void testTableFunctionInExprIssue923() throws JSQLParserException { @Test public void testTableFunctionInExprIssue923_3() throws JSQLParserException, IOException { String stmt = IOUtils.toString( - SelectTest.class.getResourceAsStream("large-sql-issue-923-2.txt"), "UTF-8"); + SelectTest.class.getResourceAsStream("large-sql-issue-923-2.txt"), + StandardCharsets.UTF_8); assertSqlCanBeParsedAndDeparsed(stmt, true); } @@ -4777,14 +4760,14 @@ public void testPreserveAndOperator() throws JSQLParserException { String statement = "SELECT * FROM mytable WHERE 1 = 2 && 2 = 3"; assertSqlCanBeParsedAndDeparsed(statement); assertDeparse( - new Select().withSelectBody( - new PlainSelect().addSelectItems(Collections.singleton(new AllColumns())) - .withFromItem(new Table("mytable")) - .withWhere(new AndExpression().withUseOperator(true) - .withLeftExpression( - new EqualsTo(new LongValue(1), new LongValue(2))) - .withRightExpression( - new EqualsTo(new LongValue(2), new LongValue(3))))), + + new PlainSelect().addSelectItems(Collections.singleton(new AllColumns())) + .withFromItem(new Table("mytable")) + .withWhere(new AndExpression().withUseOperator(true) + .withLeftExpression( + new EqualsTo(new LongValue(1), new LongValue(2))) + .withRightExpression( + new EqualsTo(new LongValue(2), new LongValue(3)))), statement); } @@ -4969,29 +4952,23 @@ public void testSetOperationWithParenthesisIssue1094() throws JSQLParserExceptio @Test public void testSetOperationWithParenthesisIssue1094_2() throws JSQLParserException { - Statement stmt = CCJSqlParserUtil.parse( - "SELECT * FROM (((SELECT A FROM tbl)) UNION DISTINCT (SELECT B FROM tbl2)) AS union1"); - assertEquals( - "SELECT * FROM ((SELECT A FROM tbl) UNION DISTINCT (SELECT B FROM tbl2)) AS union1", - stmt.toString()); + String sqlStr = + "SELECT * FROM (((SELECT A FROM tbl)) UNION DISTINCT (SELECT B FROM tbl2)) AS union1"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); } @Test public void testSetOperationWithParenthesisIssue1094_3() throws JSQLParserException { - Statement stmt = CCJSqlParserUtil.parse( - "SELECT * FROM (((SELECT A FROM tbl)) UNION DISTINCT ((SELECT B FROM tbl2))) AS union1"); - assertEquals( - "SELECT * FROM ((SELECT A FROM tbl) UNION DISTINCT ((SELECT B FROM tbl2))) AS union1", - stmt.toString()); + String sqlStr = + "SELECT * FROM (((SELECT A FROM tbl)) UNION DISTINCT ((SELECT B FROM tbl2))) AS union1"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); } @Test public void testSetOperationWithParenthesisIssue1094_4() throws JSQLParserException { - Statement stmt = CCJSqlParserUtil.parse( - "SELECT * FROM (((((SELECT A FROM tbl)))) UNION DISTINCT (((((((SELECT B FROM tbl2)))))))) AS union1"); - assertEquals( - "SELECT * FROM ((SELECT A FROM tbl) UNION DISTINCT ((SELECT B FROM tbl2))) AS union1", - stmt.toString()); + String sqlStr = + "SELECT * FROM (((((SELECT A FROM tbl)))) UNION DISTINCT (((((((SELECT B FROM tbl2)))))))) AS union1"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); } @Test @@ -5068,6 +5045,7 @@ public void testConditionsWithExtraBrackets_Issue1194() throws JSQLParserExcepti assertSqlCanBeParsedAndDeparsed("SELECT (col IS NULL) FROM tbl", true); } + @Test public void testWithValueListWithExtraBrackets1135() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "with sample_data(day, value) as (values ((0, 13), (1, 12), (2, 15), (3, 4), (4, 8), (5, 16))) select day, value from sample_data", @@ -5128,11 +5106,14 @@ public void testSelectCastProblemIssue1248() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT CAST(t1.sign2 AS Nullable (char))"); } - // @Test - // public void testSelectCastProblemIssue1248_2() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("SELECT CAST(t1.sign2 AS Nullable(decimal(30, 10)))"); - // } - public void testMissinBracketsNestedInIssue() throws JSQLParserException { + @Test + @Disabled + public void testSelectCastProblemIssue1248_2() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("SELECT CAST(t1.sign2 AS Nullable(decimal(30, 10)))"); + } + + @Test + public void testMissingBracketsNestedInIssue() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "SELECT COUNT(DISTINCT CASE WHEN room IN (11167, 12074, 4484, 4483, 6314, 11168, 10336, 16445, 13176, 13177, 13178) THEN uid END) AS uidCount from tableName", true); @@ -5192,6 +5173,7 @@ public void testConnectByRootIssue1255() throws JSQLParserException { + "CONNECT BY PRIOR employee_id = manager_id", true); } + @Test public void testUnionLimitOrderByIssue1268() throws JSQLParserException { String sqlStr = "(SELECT __time FROM traffic_protocol_stat_log LIMIT 1) UNION ALL (SELECT __time FROM traffic_protocol_stat_log ORDER BY __time LIMIT 1)"; @@ -5326,7 +5308,7 @@ public void testPostgresDollarQuotes_1372() throws JSQLParserException { @Test public void testCanCallSubSelectOnWithItemEvenIfNotSetIssue1369() { WithItem item = new WithItem(); - assertThat(item.getSubSelect()).isNull(); + assertThat(item.getSelect()).isNull(); } @Test @@ -5336,6 +5318,7 @@ public void testCaseElseExpressionIssue1375() throws JSQLParserException { true); } + @Test public void testComplexInExpressionIssue905() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("select * " + "from table_a " + "where other_id in (" + " (select id from table_b where name like '%aa%')" @@ -5410,7 +5393,7 @@ public void testPerformanceIssue1397() throws Exception { * The purpose of the test is to run into a timeout and to stop the parser when this happens. We * provide an INVALID statement for this purpose, which will fail the SIMPLE parse and then hang * with COMPLEX parsing until the timeout occurs. - * + *

* We repeat that test multiple times and want to see no stale references to the Parser after * timeout. * @@ -5494,16 +5477,14 @@ public void execute() throws Throwable { @Test public void testWithIsolation() throws JSQLParserException { String statement = "SELECT * FROM mytable WHERE mytable.col = 9 WITH ur"; - Select select = (Select) parserManager.parse(new StringReader(statement)); - String isolation = ((PlainSelect) select.getSelectBody()).getWithIsolation().getIsolation(); + Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + String isolation = select.getIsolation().getIsolation(); assertEquals("ur", isolation); - assertSqlCanBeParsedAndDeparsed(statement); statement = "SELECT * FROM mytable WHERE mytable.col = 9 WITH Cs"; - select = (Select) parserManager.parse(new StringReader(statement)); - isolation = ((PlainSelect) select.getSelectBody()).getWithIsolation().getIsolation(); + select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(statement, true); + isolation = select.getIsolation().getIsolation(); assertEquals("Cs", isolation); - assertSqlCanBeParsedAndDeparsed(statement); } @Test @@ -5556,7 +5537,7 @@ public void testOracleDBLink() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(sqlStr, true); Select select = (Select) CCJSqlParserUtil.parse(sqlStr); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; Table table = (Table) plainSelect.getFromItem(); assertNotEquals("tablename@dblink", table.getName()); @@ -5570,7 +5551,7 @@ public void testSelectStatementWithForUpdateAndSkipLockedTokens() throws JSQLPar assertSqlCanBeParsedAndDeparsed(sql); Select select = (Select) CCJSqlParserUtil.parse(sql); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.isForUpdate()); assertTrue(plainSelect.isSkipLocked()); } @@ -5582,7 +5563,7 @@ public void testSelectStatementWithForUpdateButWithoutSkipLockedTokens() assertSqlCanBeParsedAndDeparsed(sql); Select select = (Select) CCJSqlParserUtil.parse(sql); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertTrue(plainSelect.isForUpdate()); assertFalse(plainSelect.isSkipLocked()); } @@ -5594,7 +5575,7 @@ public void testSelectStatementWithoutForUpdateAndSkipLockedTokens() assertSqlCanBeParsedAndDeparsed(sql); Select select = (Select) CCJSqlParserUtil.parse(sql); - PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + PlainSelect plainSelect = (PlainSelect) select; assertFalse(plainSelect.isForUpdate()); assertFalse(plainSelect.isSkipLocked()); } @@ -5603,4 +5584,53 @@ public void testSelectStatementWithoutForUpdateAndSkipLockedTokens() public void testSelectMultidimensionalArrayStatement() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT f1, f2[1][1], f3[1][2][3] FROM test"); } + + @Test + void testSetOperationListWithBracketsIssue1737() throws JSQLParserException { + String sqlStr = "(SELECT z)\n" + " UNION ALL\n" + " (SELECT z)\n" + + " ORDER BY z"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + + sqlStr = "SELECT z\n" + "FROM (\n" + + " (SELECT z)\n" + + " UNION ALL\n" + + " (SELECT z)\n" + + " ORDER BY z\n" + " )\n" + + // "GROUP BY z\n" + + "ORDER BY z\n"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "SELECT z\n" + "FROM (\n" + " (SELECT z)\n" + " UNION ALL\n" + + " (SELECT z)\n" + " ORDER BY z\n" + " )\n" + "GROUP BY z\n" + + "ORDER BY z"; + assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + + @Test + void subJoinTest() throws JSQLParserException { + String sqlStr = + "select su.d\n" + "from sku su\n" + "for update of su.up\n" + "order by su.d"; + + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + + @Test + void testNestedWithItems() throws JSQLParserException { + String sqlStr = + "with a as ( with b as ( with c as (select 1) select c.* from c) select b.* from b) select a.* from a"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + + @Test + void testSubSelectParsing() throws JSQLParserException { + String sqlStr = "(SELECT id FROM table1 WHERE find_in_set(100, ancestors))"; + Select select = (Select) CCJSqlParserUtil.parse(sqlStr); + + InExpression inExpression = new InExpression(); + inExpression.setLeftExpression(new Column("id")); + inExpression.setRightExpression(select); + + Assertions.assertEquals("id IN " + sqlStr, inExpression.toString()); + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java index b8ae25a2f..15b94009f 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java @@ -34,8 +34,8 @@ /** * Tries to parse and deparse all statments in net.sf.jsqlparser.test.oracle-tests. * - * As a matter of fact there are a lot of files that can still not processed. Here a step by step improvement is the way - * to go. + * As a matter of fact there are a lot of files that can still not processed. Here a step by step + * improvement is the way to go. * * The test ensures, that the successful parsed file count does not decrease. * @@ -43,213 +43,69 @@ */ public class SpecialOracleTest { - //@todo: this is a workaround for Maven vs. Gradle - //we will want to remove that after concluding the Gradle migration - private static final File SQLS_DIR = new File("target/test-classes/net/sf/jsqlparser/statement/select/oracle-tests").isDirectory() - ? new File("target/test-classes/net/sf/jsqlparser/statement/select/oracle-tests") - : new File("build/resources/test/net/sf/jsqlparser/statement/select/oracle-tests"); + // @todo: this is a workaround for Maven vs. Gradle + // we will want to remove that after concluding the Gradle migration + private static final File SQLS_DIR = new File( + "target/test-classes/net/sf/jsqlparser/statement/select/oracle-tests").isDirectory() + ? new File( + "target/test-classes/net/sf/jsqlparser/statement/select/oracle-tests") + : new File( + "build/resources/test/net/sf/jsqlparser/statement/select/oracle-tests"); - private static final File SQL_SOURCE_DIR = new File("src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests"); + private static final File SQL_SOURCE_DIR = + new File("src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests"); private static final Logger LOG = Logger.getLogger(SpecialOracleTest.class.getName()); - private final List EXPECTED_SUCCESSES = Arrays.asList( - "aggregate01.sql", - "analytic_query04.sql", - "analytic_query05.sql", - "analytic_query06.sql", - "analytic_query08.sql", - "analytic_query09.sql", - "analytic_query10.sql", - "bindvar01.sql", - "bindvar02.sql", - "bindvar05.sql", - "case_when01.sql", - "case_when02.sql", - "case_when03.sql", - "case_when04.sql", - "case_when05.sql", - "cast_multiset01.sql", - "cast_multiset02.sql", - "cast_multiset03.sql", - "cast_multiset04.sql", - "cast_multiset05.sql", - "cast_multiset06.sql", - "cast_multiset08.sql", - "cast_multiset10.sql", - "cast_multiset11.sql", - "cast_multiset12.sql", - "cast_multiset16.sql", - "cast_multiset17.sql", - "cast_multiset18.sql", - "cast_multiset19.sql", - "cast_multiset20.sql", - "cast_multiset21.sql", - "cast_multiset22.sql", - "cast_multiset23.sql", - "cast_multiset24.sql", - "cast_multiset25.sql", - "cast_multiset26.sql", - "cast_multiset27.sql", - "cast_multiset28.sql", - "cast_multiset29.sql", - "cast_multiset30.sql", - "cast_multiset31.sql", - "cast_multiset32.sql", - "cast_multiset33.sql", - "cast_multiset35.sql", - "cast_multiset36.sql", - "cast_multiset40.sql", - "cast_multiset41.sql", - "cast_multiset42.sql", - "cast_multiset43.sql", - "columns01.sql", - "condition01.sql", - "condition02.sql", - "condition03.sql", - "condition04.sql", - "condition05.sql", - "condition07.sql", - "condition08.sql", - "condition09.sql", - "condition10.sql", - "condition12.sql", - "condition14.sql", - "condition19.sql", - "condition20.sql", - "connect_by01.sql", - "connect_by02.sql", - "connect_by03.sql", - "connect_by04.sql", - "connect_by05.sql", - "connect_by06.sql", - "connect_by07.sql", - "datetime01.sql", - "datetime02.sql", - "datetime04.sql", - "datetime05.sql", - "datetime06.sql", - "dblink01.sql", - "for_update01.sql", - "for_update02.sql", - "for_update03.sql", - "function04.sql", - "function05.sql", - "for_update04.sql", - "for_update05.sql", - "for_update06.sql", - "for_update08.sql", - "function01.sql", - "function02.sql", - "groupby01.sql", - "groupby02.sql", - "groupby03.sql", - "groupby04.sql", - "groupby05.sql", - "groupby06.sql", - "groupby08.sql", - "groupby09.sql", - "groupby10.sql", - "groupby11.sql", - "groupby12.sql", - "groupby13.sql", - "groupby14.sql", - "groupby15.sql", - "groupby16.sql", - "groupby17.sql", - "groupby19.sql", - "groupby20.sql", - "groupby21.sql", - "groupby22.sql", - "groupby23.sql", - "insert02.sql", - "interval02.sql", - "interval04.sql", - "interval05.sql", - "join01.sql", - "join02.sql", - "join03.sql", - "join04.sql", - "join06.sql", - "join07.sql", - "join08.sql", - "join09.sql", - "join10.sql", - "join11.sql", - "join12.sql", - "join13.sql", - "join14.sql", - "join15.sql", - "join16.sql", - "join17.sql", - "join18.sql", - "join19.sql", - "join20.sql", - "join21.sql", - "keywordasidentifier01.sql", - "keywordasidentifier02.sql", - "keywordasidentifier03.sql", - "keywordasidentifier04.sql", - "keywordasidentifier05.sql", - "lexer02.sql", - "lexer03.sql", - "lexer04.sql", - "lexer05.sql", - "like01.sql", - "merge01.sql", - "merge02.sql", - "order_by01.sql", - "order_by02.sql", - "order_by03.sql", - "order_by04.sql", - "order_by05.sql", - "order_by06.sql", - "pivot01.sql", - "pivot02.sql", - "pivot03.sql", - "pivot04.sql", - "pivot05.sql", - "pivot06.sql", - "pivot07.sql", - "pivot07_Parenthesis.sql", - "pivot08.sql", - "pivot09.sql", - "pivot11.sql", - "pivot12.sql", - "query_factoring01.sql", - "query_factoring02.sql", - "query_factoring03.sql", - "query_factoring06.sql", - "query_factoring07.sql", - "query_factoring08.sql", - "query_factoring09.sql", - "query_factoring11.sql", - "query_factoring12.sql", - "set01.sql", - "set02.sql", - "simple02.sql", - "simple03.sql", - "simple04.sql", - "simple05.sql", - "simple06.sql", - "simple07.sql", - "simple08.sql", - "simple09.sql", - "simple10.sql", - "simple11.sql", - "simple12.sql", - "simple13.sql", - "union01.sql", - "union02.sql", - "union03.sql", - "union04.sql", - "union05.sql", - "union06.sql", - "union07.sql", - "union08.sql", - "union09.sql", - "union10.sql", - "xmltable02.sql"); + private final List EXPECTED_SUCCESSES = Arrays.asList("aggregate01.sql", + "analytic_query04.sql", "analytic_query05.sql", "analytic_query06.sql", + "analytic_query08.sql", "analytic_query09.sql", "analytic_query10.sql", "bindvar01.sql", + "bindvar02.sql", "bindvar05.sql", "case_when01.sql", "case_when02.sql", + "case_when03.sql", "case_when04.sql", "case_when05.sql", "cast_multiset01.sql", + "cast_multiset02.sql", "cast_multiset03.sql", "cast_multiset04.sql", + "cast_multiset05.sql", "cast_multiset06.sql", "cast_multiset07.sql", + "cast_multiset08.sql", "cast_multiset10.sql", "cast_multiset11.sql", + "cast_multiset12.sql", "cast_multiset16.sql", "cast_multiset17.sql", + "cast_multiset18.sql", "cast_multiset19.sql", "cast_multiset20.sql", + "cast_multiset21.sql", "cast_multiset22.sql", "cast_multiset23.sql", + "cast_multiset24.sql", "cast_multiset25.sql", "cast_multiset26.sql", + "cast_multiset27.sql", "cast_multiset28.sql", "cast_multiset29.sql", + "cast_multiset30.sql", "cast_multiset31.sql", "cast_multiset32.sql", + "cast_multiset33.sql", "cast_multiset35.sql", "cast_multiset36.sql", + "cast_multiset40.sql", "cast_multiset41.sql", "cast_multiset42.sql", + "cast_multiset43.sql", "columns01.sql", "condition01.sql", "condition02.sql", + "condition03.sql", "condition04.sql", "condition05.sql", "condition07.sql", + "condition08.sql", "condition09.sql", "condition10.sql", "condition12.sql", + "condition14.sql", "condition15.sql", "condition19.sql", "condition20.sql", + "connect_by01.sql", "connect_by02.sql", "connect_by03.sql", "connect_by04.sql", + "connect_by05.sql", "connect_by06.sql", "connect_by07.sql", "datetime01.sql", + "datetime02.sql", "datetime04.sql", "datetime05.sql", "datetime06.sql", "dblink01.sql", + "for_update01.sql", "for_update02.sql", "for_update03.sql", "function04.sql", + "function05.sql", "for_update04.sql", "for_update05.sql", "for_update06.sql", + "for_update08.sql", "function01.sql", "function02.sql", "groupby01.sql", + "groupby02.sql", "groupby03.sql", "groupby04.sql", "groupby05.sql", "groupby06.sql", + "groupby08.sql", "groupby09.sql", "groupby10.sql", "groupby11.sql", "groupby12.sql", + "groupby13.sql", "groupby14.sql", "groupby15.sql", "groupby16.sql", "groupby17.sql", + "groupby19.sql", "groupby20.sql", "groupby21.sql", "groupby22.sql", "groupby23.sql", + "insert02.sql", "interval02.sql", "interval04.sql", "interval05.sql", "join01.sql", + "join02.sql", "join03.sql", "join04.sql", "join06.sql", "join07.sql", "join08.sql", + "join09.sql", "join10.sql", "join11.sql", "join12.sql", "join13.sql", "join14.sql", + "join15.sql", "join16.sql", "join17.sql", "join18.sql", "join19.sql", "join20.sql", + "join21.sql", "keywordasidentifier01.sql", "keywordasidentifier02.sql", + "keywordasidentifier03.sql", "keywordasidentifier04.sql", "keywordasidentifier05.sql", + "lexer02.sql", "lexer03.sql", "lexer04.sql", "lexer05.sql", "like01.sql", "merge01.sql", + "merge02.sql", "order_by01.sql", "order_by02.sql", "order_by03.sql", "order_by04.sql", + "order_by05.sql", "order_by06.sql", "pivot01.sql", "pivot02.sql", "pivot03.sql", + "pivot04.sql", "pivot05.sql", "pivot06.sql", "pivot07.sql", "pivot07_Parenthesis.sql", + "pivot08.sql", "pivot09.sql", "pivot11.sql", "pivot12.sql", "query_factoring01.sql", + "query_factoring02.sql", "query_factoring03.sql", "query_factoring06.sql", + "query_factoring07.sql", "query_factoring08.sql", "query_factoring09.sql", + "query_factoring11.sql", "query_factoring12.sql", "set01.sql", "set02.sql", + "simple02.sql", "simple03.sql", "simple04.sql", "simple05.sql", "simple06.sql", + "simple07.sql", "simple08.sql", "simple09.sql", "simple10.sql", "simple11.sql", + "simple12.sql", "simple13.sql", "union01.sql", "union02.sql", "union03.sql", + "union04.sql", "union05.sql", "union06.sql", "union07.sql", "union08.sql", + "union09.sql", "union10.sql", "xmltable02.sql"); @Test public void testAllSqlsParseDeparse() throws IOException { @@ -271,8 +127,10 @@ public void testAllSqlsParseDeparse() throws IOException { String message = ex.getMessage(); // strip the Exception Class Name from the Message - if (message.startsWith(net.sf.jsqlparser.parser.ParseException.class.getCanonicalName())) { - message = message.substring(net.sf.jsqlparser.parser.ParseException.class.getCanonicalName().length()+2); + if (message.startsWith( + net.sf.jsqlparser.parser.ParseException.class.getCanonicalName())) { + message = message.substring(net.sf.jsqlparser.parser.ParseException.class + .getCanonicalName().length() + 2); } int pos = message.indexOf('\n'); @@ -280,8 +138,10 @@ public void testAllSqlsParseDeparse() throws IOException { message = message.substring(0, pos); } - if (sql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED") || EXPECTED_SUCCESSES.contains(file.getName())) { - LOG.log(Level.SEVERE, "UNEXPECTED PARSING FAILURE: {0}\n\t" + message, file.getName()); + if (sql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED") + || EXPECTED_SUCCESSES.contains(file.getName())) { + LOG.log(Level.SEVERE, "UNEXPECTED PARSING FAILURE: {0}\n\t" + message, + file.getName()); foundUnexpectedFailures = true; } else { LOG.log(Level.FINE, "EXPECTED PARSING FAILURE: {0}", file.getName()); @@ -289,11 +149,15 @@ public void testAllSqlsParseDeparse() throws IOException { recordFailureOnSourceFile(file, message); } catch (Exception ex) { - LOG.log(Level.SEVERE, "UNEXPECTED EXCEPTION: {0}\n\t" + ex.getMessage(), file.getName()); + LOG.log(Level.SEVERE, "UNEXPECTED EXCEPTION: {0}\n\t" + ex.getMessage(), + file.getName()); foundUnexpectedFailures = true; } catch (AssertionFailedError ex) { - if (sql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED") || EXPECTED_SUCCESSES.contains(file.getName())) { - LOG.log(Level.SEVERE, "UNEXPECTED DE-PARSING FAILURE: {0}\n" + ex.toString(), file.getName()); + if (sql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED") + || EXPECTED_SUCCESSES.contains(file.getName())) { + LOG.log(Level.SEVERE, + "UNEXPECTED DE-PARSING FAILURE: {0}\n" + ex.toString(), + file.getName()); foundUnexpectedFailures = true; } else { LOG.log(Level.FINE, "EXPECTED DE-PARSING FAILURE: {0}", file.getName()); @@ -303,14 +167,15 @@ public void testAllSqlsParseDeparse() throws IOException { } } - LOG.log(Level.INFO, "tested {0} files. got {1} correct parse results, expected {2}", new Object[]{count, success, EXPECTED_SUCCESSES.size()}); + LOG.log(Level.INFO, "tested {0} files. got {1} correct parse results, expected {2}", + new Object[] {count, success, EXPECTED_SUCCESSES.size()}); assertTrue(success >= EXPECTED_SUCCESSES.size()); assertFalse(foundUnexpectedFailures, "Found Testcases failing unexpectedly."); } @Test - //@Ignore + // @Ignore public void debugSpecificSql() throws IOException, JSQLParserException { File[] sqlTestFiles = SQLS_DIR.listFiles(new FilenameFilter() { @Override @@ -333,7 +198,7 @@ public void recordSuccessOnSourceFile(File file) throws IOException { if (!sourceSql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED")) { LOG.log(Level.INFO, "NEW SUCCESS: {0}", file.getName()); if (sourceFile.exists() && sourceFile.canWrite()) { - try ( FileWriter writer = new FileWriter(sourceFile, true)) { + try (FileWriter writer = new FileWriter(sourceFile, true)) { writer.append("\n--@SUCCESSFULLY_PARSED_AND_DEPARSED first on ") .append(DateFormat.getDateTimeInstance().format(new Date())); } @@ -342,7 +207,9 @@ public void recordSuccessOnSourceFile(File file) throws IOException { if (EXPECTED_SUCCESSES.contains(file.getName())) { LOG.log(Level.FINE, "EXPECTED SUCCESS: {0}", file.getName()); } else { - LOG.log(Level.WARNING, "UNRECORDED SUCCESS: {0}, please add to the EXPECTED_SUCCESSES List in SpecialOracleTest.java", file.getName()); + LOG.log(Level.WARNING, + "UNRECORDED SUCCESS: {0}, please add to the EXPECTED_SUCCESSES List in SpecialOracleTest.java", + file.getName()); } } } @@ -350,9 +217,8 @@ public void recordSuccessOnSourceFile(File file) throws IOException { public void recordFailureOnSourceFile(File file, String message) throws IOException { File sourceFile = new File(SQL_SOURCE_DIR, file.getName()); String sourceSql = FileUtils.readFileToString(sourceFile, Charset.forName("UTF-8")); - if (!sourceSql.contains("@FAILURE: " + message) - && sourceFile.canWrite()) { - try ( FileWriter writer = new FileWriter(sourceFile, true)) { + if (!sourceSql.contains("@FAILURE: " + message) && sourceFile.canWrite()) { + try (FileWriter writer = new FileWriter(sourceFile, true)) { writer.append("\n--@FAILURE: " + message + " recorded first on ") .append(DateFormat.getDateTimeInstance().format(new Date())); } @@ -378,11 +244,14 @@ public void testAllSqlsOnlyParse() throws IOException { message = message.substring(0, pos); } - LOG.log(Level.SEVERE, "UNEXPECTED PARSING FAILURE: {0}\n\t" + message, file.getName()); + LOG.log(Level.SEVERE, "UNEXPECTED PARSING FAILURE: {0}\n\t" + message, + file.getName()); } } - Assertions.assertThat(regressionFiles).describedAs("All files should parse successfully, a regression was detected!").isEmpty(); + Assertions.assertThat(regressionFiles) + .describedAs("All files should parse successfully, a regression was detected!") + .isEmpty(); } @Test @@ -390,39 +259,24 @@ public void testOperatorsWithSpaces() throws Exception { String sql; // First, the regular way (normal for most databases). - sql = "SELECT\n" - + " Something\n" - + "FROM\n" - + " Sometable\n" - + "WHERE\n" - + " Somefield >= Somevalue\n" - + " AND Somefield <= Somevalue\n" - + " AND Somefield <> Somevalue\n" - + " AND Somefield != Somevalue\n"; + sql = "SELECT\n" + " Something\n" + "FROM\n" + " Sometable\n" + "WHERE\n" + + " Somefield >= Somevalue\n" + " AND Somefield <= Somevalue\n" + + " AND Somefield <> Somevalue\n" + " AND Somefield != Somevalue\n"; assertSqlCanBeParsedAndDeparsed(sql, true); // Second, the special crap Oracle lets you get away with. - sql = "SELECT\n" - + " Something\n" - + "FROM\n" - + " Sometable\n" - + "WHERE\n" - + " Somefield > = Somevalue\n" - + " AND Somefield < = Somevalue\n" + sql = "SELECT\n" + " Something\n" + "FROM\n" + " Sometable\n" + "WHERE\n" + + " Somefield > = Somevalue\n" + " AND Somefield < = Somevalue\n" + " AND Somefield < > Somevalue\n"; - // Note, we do not (currently) test the "!=" with spaces in between -- Postgresql deals with this as two operators, "factorial" and "equals". + // Note, we do not (currently) test the "!=" with spaces in between -- Postgresql deals with + // this as two operators, "factorial" and "equals". assertSqlCanBeParsedAndDeparsed(sql, true); // And then with multiple whitespace - sql = "SELECT\n" - + " Something\n" - + "FROM\n" - + " Sometable\n" - + "WHERE\n" - + " Somefield > \t = Somevalue\n" - + " AND Somefield < = Somevalue\n" + sql = "SELECT\n" + " Something\n" + "FROM\n" + " Sometable\n" + "WHERE\n" + + " Somefield > \t = Somevalue\n" + " AND Somefield < = Somevalue\n" + " AND Somefield <\t\t> Somevalue\n"; assertSqlCanBeParsedAndDeparsed(sql, true); diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java index d6bfd09fe..21565c78f 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SpeedTest.java @@ -9,13 +9,6 @@ */ package net.sf.jsqlparser.statement.select; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.statement.Statement; @@ -24,6 +17,13 @@ import net.sf.jsqlparser.util.TablesNamesFinder; import org.junit.jupiter.api.Test; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + public class SpeedTest { private final static int NUM_REPS_500 = 500; @@ -32,8 +32,8 @@ public class SpeedTest { @Test public void testSpeed() throws Exception { // all the statements in testfiles/simple_parsing.txt - BufferedReader in = new BufferedReader(new InputStreamReader(SpeedTest.class. - getResourceAsStream("/simple_parsing.txt"))); + BufferedReader in = new BufferedReader( + new InputStreamReader(SpeedTest.class.getResourceAsStream("/simple_parsing.txt"))); CCJSqlParserManagerTest d; List statementsList = new ArrayList<>(); @@ -45,8 +45,8 @@ public void testSpeed() throws Exception { statementsList.add(statement); } in.close(); - in = new BufferedReader(new InputStreamReader(SpeedTest.class. - getResourceAsStream("/RUBiS-select-requests.txt"))); + in = new BufferedReader(new InputStreamReader( + SpeedTest.class.getResourceAsStream("/RUBiS-select-requests.txt"))); // all the statements in testfiles/RUBiS-select-requests.txt while (true) { @@ -85,11 +85,11 @@ public void testSpeed() throws Exception { } in.close(); - String statement = ""; + String statement; int numTests = 0; // it seems that the very first parsing takes a while, so I put it aside - Statement parsedStm = parserManager. - parse(new StringReader(statement = statementsList.get(0))); + Statement parsedStm = + parserManager.parse(new StringReader(statement = statementsList.get(0))); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List iter = parsedSelects.iterator(); - while (iter.hasNext()) { - Select select = iter.next(); + for (Select select : parsedSelects) { if (select != null) { numTests++; - List tableListRetr = tablesNamesFinder.getTableList(select); + tablesNamesFinder.getTableList((Statement) select); } } elapsedTime = System.currentTimeMillis() - time; - statementsPerSecond = numTests * 1000 / elapsedTime; - System.out. - println(numTests + " select scans for table name executed in " + elapsedTime + " milliseconds"); + statementsPerSecond = numTests * 1000L / elapsedTime; + System.out.println(numTests + " select scans for table name executed in " + elapsedTime + + " milliseconds"); System.out.println(" (" + statementsPerSecond + " select scans for table name per second, " - + df.format(1.0 / statementsPerSecond) + " seconds per select scans for table name)"); + + df.format(1.0 / statementsPerSecond) + + " seconds per select scans for table name)"); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/upsert/UpsertTest.java b/src/test/java/net/sf/jsqlparser/statement/upsert/UpsertTest.java index 92869875e..6b206dd24 100644 --- a/src/test/java/net/sf/jsqlparser/statement/upsert/UpsertTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/upsert/UpsertTest.java @@ -9,7 +9,6 @@ */ package net.sf.jsqlparser.statement.upsert; -import java.io.StringReader; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.expression.StringValue; @@ -17,6 +16,10 @@ import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.select.PlainSelect; +import org.junit.jupiter.api.Test; + +import java.io.StringReader; + import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -24,7 +27,6 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import org.junit.jupiter.api.Test; public class UpsertTest { @@ -41,8 +43,11 @@ public void testUpsert() throws JSQLParserException { assertEquals("ID", upsert.getColumns().get(1).getColumnName()); assertEquals(2, ((ExpressionList) upsert.getItemsList()).getExpressions().size()); assertEquals("foo", - ((StringValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(0)).getValue()); - assertEquals(123, ((LongValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(1)).getValue()); + ((StringValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(0)) + .getValue()); + assertEquals(123, + ((LongValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(1)) + .getValue()); assertFalse(upsert.isUseSelectBrackets()); assertFalse(upsert.isUseDuplicate()); assertEquals(statement, "" + upsert); @@ -50,7 +55,8 @@ public void testUpsert() throws JSQLParserException { @Test public void testUpsertDuplicate() throws JSQLParserException { - String statement = "UPSERT INTO TEST (ID, COUNTER) VALUES (123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1"; + String statement = + "UPSERT INTO TEST (ID, COUNTER) VALUES (123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1"; Upsert upsert = (Upsert) parserManager.parse(new StringReader(statement)); assertEquals("TEST", upsert.getTable().getName()); assertEquals(2, upsert.getColumns().size()); @@ -58,8 +64,12 @@ public void testUpsertDuplicate() throws JSQLParserException { assertEquals("ID", upsert.getColumns().get(0).getColumnName()); assertEquals("COUNTER", upsert.getColumns().get(1).getColumnName()); assertEquals(2, ((ExpressionList) upsert.getItemsList()).getExpressions().size()); - assertEquals(123, ((LongValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(0)).getValue()); - assertEquals(0, ((LongValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(1)).getValue()); + assertEquals(123, + ((LongValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(0)) + .getValue()); + assertEquals(0, + ((LongValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(1)) + .getValue()); assertEquals(1, upsert.getDuplicateUpdateColumns().size()); assertEquals("COUNTER", upsert.getDuplicateUpdateColumns().get(0).getColumnName()); assertEquals(1, upsert.getDuplicateUpdateExpressionList().size()); @@ -71,7 +81,8 @@ public void testUpsertDuplicate() throws JSQLParserException { @Test public void testUpsertSelect() throws JSQLParserException { - String statement = "UPSERT INTO test.targetTable (col1, col2) SELECT * FROM test.sourceTable"; + String statement = + "UPSERT INTO test.targetTable (col1, col2) SELECT * FROM test.sourceTable"; Upsert upsert = (Upsert) parserManager.parse(new StringReader(statement)); assertEquals("test.targetTable", upsert.getTable().getFullyQualifiedName()); assertEquals(2, upsert.getColumns().size()); @@ -81,7 +92,7 @@ public void testUpsertSelect() throws JSQLParserException { assertNull(upsert.getItemsList()); assertNotNull(upsert.getSelect()); assertEquals("test.sourceTable", - ((Table) ((PlainSelect) upsert.getSelect().getSelectBody()).getFromItem()).getFullyQualifiedName()); + ((Table) ((PlainSelect) upsert.getSelect()).getFromItem()).getFullyQualifiedName()); assertFalse(upsert.isUseDuplicate()); assertEquals(statement, "" + upsert); } @@ -94,11 +105,14 @@ public void testUpsertN() throws JSQLParserException { assertEquals(3, ((ExpressionList) upsert.getItemsList()).getExpressions().size()); assertTrue(upsert.isUseValues()); assertEquals("foo", - ((StringValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(0)).getValue()); + ((StringValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(0)) + .getValue()); assertEquals("bar", - ((StringValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(1)).getValue()); - assertEquals(3, ((LongValue) ((ExpressionList) upsert.getItemsList()).getExpressions(). - get(2)).getValue()); + ((StringValue) upsert.getItemsList(ExpressionList.class).getExpressions().get(1)) + .getValue()); + assertEquals(3, + ((LongValue) ((ExpressionList) upsert.getItemsList()).getExpressions().get(2)) + .getValue()); assertFalse(upsert.isUseSelectBrackets()); assertFalse(upsert.isUseDuplicate()); assertEquals(statement, "" + upsert); @@ -112,7 +126,8 @@ public void testUpsertMultiRowValue() throws JSQLParserException { @Test public void testUpsertMultiRowValueDifferent() throws JSQLParserException { try { - assertSqlCanBeParsedAndDeparsed("UPSERT INTO mytable (col1, col2) VALUES (a, b), (d, e, c)"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO mytable (col1, col2) VALUES (a, b), (d, e, c)"); } catch (Exception e) { return; } @@ -121,19 +136,24 @@ public void testUpsertMultiRowValueDifferent() throws JSQLParserException { @Test public void testSimpleUpsert() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("UPSERT INTO example (num, name, address, tel) VALUES (1, 'name', 'test ', '1234-1234')"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO example (num, name, address, tel) VALUES (1, 'name', 'test ', '1234-1234')"); } @Test public void testUpsertHasSelect() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("UPSERT INTO mytable (mycolumn) SELECT mycolumn FROM mytable"); - assertSqlCanBeParsedAndDeparsed("UPSERT INTO mytable (mycolumn) (SELECT mycolumn FROM mytable)"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO mytable (mycolumn) SELECT mycolumn FROM mytable"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO mytable (mycolumn) (SELECT mycolumn FROM mytable)"); } @Test public void testUpsertWithSelect() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("UPSERT INTO mytable (mycolumn) WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a"); - assertSqlCanBeParsedAndDeparsed("UPSERT INTO mytable (mycolumn) (WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a)"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO mytable (mycolumn) WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO mytable (mycolumn) (WITH a AS (SELECT mycolumn FROM mytable) SELECT mycolumn FROM a)"); } @Test @@ -158,7 +178,8 @@ public void testHexValues3() throws JSQLParserException { @Test public void testDuplicateKey() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("UPSERT INTO Users0 (UserId, Key, Value) VALUES (51311, 'T_211', 18) ON DUPLICATE KEY UPDATE Value = 18"); + assertSqlCanBeParsedAndDeparsed( + "UPSERT INTO Users0 (UserId, Key, Value) VALUES (51311, 'T_211', 18) ON DUPLICATE KEY UPDATE Value = 18"); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java b/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java index 9db5d9484..d2bdc807d 100644 --- a/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java @@ -9,49 +9,44 @@ */ package net.sf.jsqlparser.statement.values; -import java.util.Arrays; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.RowConstructor; import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.StatementVisitorAdapter; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SetOperationList; -import static net.sf.jsqlparser.test.TestUtils.*; +import net.sf.jsqlparser.statement.select.Values; import org.junit.jupiter.api.Test; +import java.util.Arrays; + +import static net.sf.jsqlparser.test.TestUtils.assertDeparse; +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + public class ValuesTest { @Test public void testDuplicateKey() throws JSQLParserException { String statement = "VALUES (1, 2, 'test')"; - Statement parsed = assertSqlCanBeParsedAndDeparsed(statement); - - ExpressionList list = new ExpressionList(new LongValue(1)) - .addExpressions(asList(new LongValue(2), new StringValue("test"))).withBrackets(true); + assertSqlCanBeParsedAndDeparsed(statement); - Select created = new Select().withSelectBody(new SetOperationList() - .addBrackets(Boolean.FALSE).addSelects( - new ValuesStatement().withExpressions( - new ExpressionList( - new RowConstructor().withExprList(list)) - .withBrackets(false)))); + Values values = new Values().addExpressions(new LongValue(1), + new LongValue(2), new StringValue("test")); + assertDeparse(values, statement); - assertDeparse(created, statement); - assertEqualsObjectTree(parsed, created); - System.out.println(toReflectionString(created)); + // this test does not make much sense, since the Object Tree is not distinct + // there are several different ways to build the statement above + // assertEqualsObjectTree(parsed, created); } @Test public void testComplexWithQueryIssue561() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("WITH split (word, str, hascomma) AS (VALUES ('', 'Auto,A,1234444', 1) UNION ALL SELECT substr(str, 0, CASE WHEN instr(str, ',') THEN instr(str, ',') ELSE length(str) + 1 END), ltrim(substr(str, instr(str, ',')), ','), instr(str, ',') FROM split WHERE hascomma) SELECT trim(word) FROM split WHERE word != ''"); + assertSqlCanBeParsedAndDeparsed( + "WITH split (word, str, hascomma) AS (VALUES ('', 'Auto,A,1234444', 1) UNION ALL SELECT substr(str, 0, CASE WHEN instr(str, ',') THEN instr(str, ',') ELSE length(str) + 1 END), ltrim(substr(str, instr(str, ',')), ','), instr(str, ',') FROM split WHERE hascomma) SELECT trim(word) FROM split WHERE word != ''"); } @Test public void testObject() { - ValuesStatement valuesStatement = new ValuesStatement().addExpressions(new StringValue("1"), new StringValue("2")); + Values valuesStatement = + new Values().addExpressions(new StringValue("1"), new StringValue("2")); valuesStatement.addExpressions(Arrays.asList(new StringValue("3"), new StringValue("4"))); valuesStatement.accept(new StatementVisitorAdapter()); diff --git a/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java b/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java index a86aa782b..22d16df36 100644 --- a/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java +++ b/src/test/java/net/sf/jsqlparser/test/HowToUseSample.java @@ -31,14 +31,13 @@ public class HowToUseSample { /* SQL Text └─Statements: net.sf.jsqlparser.statement.select.Select - └─selectBody: net.sf.jsqlparser.statement.select.PlainSelect - ├─selectItems -> Collection - │ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem - │ └─LongValue: 1 - ├─Table: dual - └─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo - ├─Column: a - └─Column: b + ├─selectItems -> Collection + │ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem + │ └─LongValue: 1 + ├─Table: dual + └─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo + ├─Column: a + └─Column: b */ //@formatter:on @@ -57,9 +56,8 @@ void writeSQL() { Expression whereExpression = new EqualsTo().withLeftExpression(columnA).withRightExpression(columnB); - PlainSelect plainSelect = new PlainSelect().addSelectItems(selectExpressionItem) + PlainSelect select = new PlainSelect().addSelectItems(selectExpressionItem) .withFromItem(table).withWhere(whereExpression); - Select select = new Select().withSelectBody(plainSelect); // Step 2a: Print into a SQL Statement Assertions.assertEquals(expectedSQLStr, select.toString()); @@ -73,7 +71,7 @@ void writeSQL() { } @Test - public void howToParseStatement() throws JSQLParserException { + public void howToParseStatementDeprecated() throws JSQLParserException { String sqlStr = "select 1 from dual where a=b"; Statement statement = CCJSqlParserUtil.parse(sqlStr); @@ -81,6 +79,25 @@ public void howToParseStatement() throws JSQLParserException { Select select = (Select) statement; PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + SelectExpressionItem selectExpressionItem = + (SelectExpressionItem) plainSelect.getSelectItems().get(0); + + Table table = (Table) plainSelect.getFromItem(); + + EqualsTo equalsTo = (EqualsTo) plainSelect.getWhere(); + Column a = (Column) equalsTo.getLeftExpression(); + Column b = (Column) equalsTo.getRightExpression(); + } + } + + @Test + public void howToParseStatement() throws JSQLParserException { + String sqlStr = "select 1 from dual where a=b"; + + Statement statement = CCJSqlParserUtil.parse(sqlStr); + if (statement instanceof Select) { + PlainSelect plainSelect = (PlainSelect) statement; + SelectExpressionItem selectExpressionItem = (SelectExpressionItem) plainSelect.getSelectItems().get(0); Assertions.assertEquals(new LongValue(1), selectExpressionItem.getExpression()); @@ -124,7 +141,7 @@ public void visit(PlainSelect plainSelect) { // Define a Statement Visitor for dispatching the Statements StatementVisitorAdapter statementVisitor = new StatementVisitorAdapter() { public void visit(Select select) { - select.getSelectBody().accept(selectVisitorAdapter); + select.accept(selectVisitorAdapter); } }; diff --git a/src/test/java/net/sf/jsqlparser/test/TestUtils.java b/src/test/java/net/sf/jsqlparser/test/TestUtils.java index 3d871aa68..c4745c91a 100644 --- a/src/test/java/net/sf/jsqlparser/test/TestUtils.java +++ b/src/test/java/net/sf/jsqlparser/test/TestUtils.java @@ -31,9 +31,7 @@ import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.delete.Delete; import net.sf.jsqlparser.statement.insert.Insert; -import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SetOperationList; +import net.sf.jsqlparser.statement.select.*; import net.sf.jsqlparser.statement.update.Update; import net.sf.jsqlparser.util.deparser.ExpressionDeParser; import net.sf.jsqlparser.util.deparser.SelectDeParser; @@ -376,16 +374,15 @@ public static void assertOracleHintExists(String sql, boolean assertDeparser, St Statement statement = CCJSqlParserUtil.parse(sql); if (statement instanceof Select) { Select stmt = (Select) statement; - if (stmt.getSelectBody() instanceof PlainSelect) { - PlainSelect ps = (PlainSelect) stmt.getSelectBody(); - OracleHint hint = ps.getOracleHint(); + if (stmt instanceof PlainSelect) { + OracleHint hint = OracleHint.getHintFromSelectBody(stmt); assertNotNull(hint); assertEquals(hints[0], hint.getValue()); - } else if (stmt.getSelectBody() instanceof SetOperationList) { - SetOperationList setop = (SetOperationList) stmt.getSelectBody(); - for (int i = 0; i < setop.getSelects().size(); i++) { - PlainSelect pselect = (PlainSelect) setop.getSelects().get(i); - OracleHint hint = pselect.getOracleHint(); + } else if (stmt instanceof SetOperationList) { + SetOperationList setOperationList = (SetOperationList) stmt; + for (int i = 0; i < setOperationList.getSelects().size(); i++) { + OracleHint hint = + OracleHint.getHintFromSelectBody(setOperationList.getSelects().get(i)); if (hints[i] == null) { assertNull(hint); } else { diff --git a/src/test/java/net/sf/jsqlparser/util/AddAliasesVisitorTest.java b/src/test/java/net/sf/jsqlparser/util/AddAliasesVisitorTest.java index ef26dfa6c..e079a9427 100644 --- a/src/test/java/net/sf/jsqlparser/util/AddAliasesVisitorTest.java +++ b/src/test/java/net/sf/jsqlparser/util/AddAliasesVisitorTest.java @@ -9,13 +9,15 @@ */ package net.sf.jsqlparser.util; -import java.io.StringReader; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.statement.select.Select; -import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import java.io.StringReader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + public class AddAliasesVisitorTest { private CCJSqlParserManager parserManager = new CCJSqlParserManager(); @@ -28,7 +30,7 @@ public void testVisit_PlainSelect() throws JSQLParserException { String sql = "select a,b,c from test"; Select select = (Select) parserManager.parse(new StringReader(sql)); final AddAliasesVisitor instance = new AddAliasesVisitor(); - select.getSelectBody().accept(instance); + select.accept(instance); assertEquals("SELECT a AS A1, b AS A2, c AS A3 FROM test", select.toString()); } @@ -38,7 +40,7 @@ public void testVisit_PlainSelect_duplicates() throws JSQLParserException { String sql = "select a,b as a1,c from test"; Select select = (Select) parserManager.parse(new StringReader(sql)); final AddAliasesVisitor instance = new AddAliasesVisitor(); - select.getSelectBody().accept(instance); + select.accept(instance); assertEquals("SELECT a AS A2, b AS a1, c AS A3 FROM test", select.toString()); } @@ -48,7 +50,7 @@ public void testVisit_PlainSelect_expression() throws JSQLParserException { String sql = "select 3+4 from test"; Select select = (Select) parserManager.parse(new StringReader(sql)); final AddAliasesVisitor instance = new AddAliasesVisitor(); - select.getSelectBody().accept(instance); + select.accept(instance); assertEquals("SELECT 3 + 4 AS A1 FROM test", select.toString()); } @@ -61,9 +63,9 @@ public void testVisit_SetOperationList() throws JSQLParserException { String sql = "select 3+4 from test union select 7+8 from test2"; Select setOpList = (Select) parserManager.parse(new StringReader(sql)); final AddAliasesVisitor instance = new AddAliasesVisitor(); - setOpList.getSelectBody().accept(instance); + setOpList.accept(instance); - assertEquals("SELECT 3 + 4 AS A1 FROM test UNION SELECT 7 + 8 AS A1 FROM test2", setOpList. - toString()); + assertEquals("SELECT 3 + 4 AS A1 FROM test UNION SELECT 7 + 8 AS A1 FROM test2", + setOpList.toString()); } } diff --git a/src/test/java/net/sf/jsqlparser/util/ConnectExpressionsVisitorTest.java b/src/test/java/net/sf/jsqlparser/util/ConnectExpressionsVisitorTest.java index 19d185efa..7f3902368 100644 --- a/src/test/java/net/sf/jsqlparser/util/ConnectExpressionsVisitorTest.java +++ b/src/test/java/net/sf/jsqlparser/util/ConnectExpressionsVisitorTest.java @@ -9,16 +9,18 @@ */ package net.sf.jsqlparser.util; -import java.io.StringReader; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.BinaryExpression; import net.sf.jsqlparser.expression.operators.arithmetic.Addition; import net.sf.jsqlparser.expression.operators.arithmetic.Concat; import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.statement.select.Select; -import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; +import java.io.StringReader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + public class ConnectExpressionsVisitorTest { private CCJSqlParserManager parserManager = new CCJSqlParserManager(); @@ -33,7 +35,7 @@ protected BinaryExpression createBinaryExpression() { return new Concat(); } }; - select.getSelectBody().accept(instance); + select.accept(instance); assertEquals("SELECT a || b || c AS expr FROM test", select.toString()); } @@ -48,7 +50,7 @@ protected BinaryExpression createBinaryExpression() { return new Addition(); } }; - select.getSelectBody().accept(instance); + select.accept(instance); assertEquals("SELECT a + b + c AS testexpr FROM test", select.toString()); } diff --git a/src/test/java/net/sf/jsqlparser/util/SelectUtilsTest.java b/src/test/java/net/sf/jsqlparser/util/SelectUtilsTest.java index 1e6acfb8a..64cff137f 100644 --- a/src/test/java/net/sf/jsqlparser/util/SelectUtilsTest.java +++ b/src/test/java/net/sf/jsqlparser/util/SelectUtilsTest.java @@ -9,8 +9,6 @@ */ package net.sf.jsqlparser.util; -import java.util.Arrays; -import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.expression.Expression; @@ -24,9 +22,13 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectExpressionItem; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; public class SelectUtilsTest { @@ -60,8 +62,8 @@ public void testAddJoin() throws JSQLParserException { @Test public void testBuildSelectFromTableAndExpressions() { - Select select = SelectUtils. - buildSelectFromTableAndExpressions(new Table("mytable"), new Column("a"), new Column("b")); + Select select = SelectUtils.buildSelectFromTableAndExpressions(new Table("mytable"), + new Column("a"), new Column("b")); assertEquals("SELECT a, b FROM mytable", select.toString()); } @@ -73,11 +75,11 @@ public void testBuildSelectFromTable() { @Test public void testBuildSelectFromTableAndParsedExpression() throws JSQLParserException { - Select select = SelectUtils. - buildSelectFromTableAndExpressions(new Table("mytable"), "a+b", "test"); + PlainSelect select = (PlainSelect) SelectUtils + .buildSelectFromTableAndExpressions(new Table("mytable"), "a+b", "test"); assertEquals("SELECT a + b, test FROM mytable", select.toString()); - assertTrue(((SelectExpressionItem) select.getSelectBody(PlainSelect.class) + assertTrue(((SelectExpressionItem) select .getSelectItems().get(0)).getExpression() instanceof Addition); } @@ -95,11 +97,12 @@ public void testTableAliasIssue311() { Table table2 = new Table("mytable2"); table2.setAlias(new Alias("tab2")); - List colunas = Arrays. - asList(new Column(table1, "col1"), new Column(table1, "col2"), new Column(table1, "col3"), new Column(table2, "b1"), new Column(table2, "b2")); + List colunas = Arrays.asList(new Column(table1, "col1"), + new Column(table1, "col2"), new Column(table1, "col3"), new Column(table2, "b1"), + new Column(table2, "b2")); - Select select = SelectUtils.buildSelectFromTableAndExpressions(table1, colunas. - toArray(new Expression[colunas.size()])); + Select select = SelectUtils.buildSelectFromTableAndExpressions(table1, + colunas.toArray(new Expression[colunas.size()])); final EqualsTo equalsTo = new EqualsTo(); equalsTo.setLeftExpression(new Column(table1, "col1")); @@ -107,7 +110,8 @@ public void testTableAliasIssue311() { Join addJoin = SelectUtils.addJoin(select, table2, equalsTo); addJoin.setLeft(true); - assertEquals("SELECT tab1.col1, tab1.col2, tab1.col3, tab2.b1, tab2.b2 FROM mytable1 AS tab1 LEFT JOIN mytable2 AS tab2 ON tab1.col1 = tab2.b1", + assertEquals( + "SELECT tab1.col1, tab1.col2, tab1.col3, tab2.b1, tab2.b2 FROM mytable1 AS tab1 LEFT JOIN mytable2 AS tab2 ON tab1.col1 = tab2.b1", select.toString()); } diff --git a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java index 72645c4b0..1919bf7c2 100644 --- a/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java +++ b/src/test/java/net/sf/jsqlparser/util/TablesNamesFinderTest.java @@ -19,16 +19,14 @@ import net.sf.jsqlparser.statement.DescribeStatement; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.comment.Comment; -import net.sf.jsqlparser.statement.create.table.CreateTable; -import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.merge.Merge; import net.sf.jsqlparser.statement.merge.MergeInsert; -import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.simpleparsing.CCJSqlParserManagerTest; import net.sf.jsqlparser.statement.update.Update; import net.sf.jsqlparser.statement.upsert.Upsert; import net.sf.jsqlparser.test.TestException; +import net.sf.jsqlparser.test.TestUtils; import org.junit.jupiter.api.Test; import java.io.BufferedReader; @@ -114,7 +112,8 @@ private void runTestOnResource(String resPath) throws Exception { assertTrue(tableListRetr.contains(element), "stm num:" + numSt); } } catch (Exception e) { - throw new TestException("error at stm num: " + numSt + " in file " + resPath, e); + throw new TestException("error at stm num: " + numSt + " in file " + resPath, + e); } numSt++; } @@ -128,25 +127,23 @@ private void runTestOnResource(String resPath) throws Exception { @Test public void testGetTableList() throws Exception { - String sql = "SELECT * FROM MY_TABLE1, MY_TABLE2, (SELECT * FROM MY_TABLE3) LEFT OUTER JOIN MY_TABLE4 " - + " WHERE ID = (SELECT MAX(ID) FROM MY_TABLE5) AND ID2 IN (SELECT * FROM MY_TABLE6)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); + String sql = + "SELECT * FROM MY_TABLE1, MY_TABLE2, (SELECT * FROM MY_TABLE3) LEFT OUTER JOIN MY_TABLE4 " + + " WHERE ID = (SELECT MAX(ID) FROM MY_TABLE5) AND ID2 IN (SELECT * FROM MY_TABLE6)"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); // now you should use a class that implements StatementVisitor to decide what to // do // based on the kind of the statement, that is SELECT or INSERT etc. but here we // are only // interested in SELECTS - if (statement instanceof Select) { - Select selectStatement = (Select) statement; - TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); - assertEquals(6, tableList.size()); - int i = 1; - for (Iterator iter = tableList.iterator(); iter.hasNext(); i++) { - String tableName = (String) iter.next(); - assertEquals("MY_TABLE" + i, tableName); - } + TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); + List tableList = tablesNamesFinder.getTableList(statement); + assertEquals(6, tableList.size()); + int i = 1; + for (Iterator iter = tableList.iterator(); iter.hasNext(); i++) { + String tableName = iter.next(); + assertEquals("MY_TABLE" + i, tableName); } } @@ -154,11 +151,10 @@ public void testGetTableList() throws Exception { @Test public void testGetTableListWithAlias() throws Exception { String sql = "SELECT * FROM MY_TABLE1 as ALIAS_TABLE1"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); - Select selectStatement = (Select) statement; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(1, tableList.size()); assertEquals("MY_TABLE1", tableList.get(0)); } @@ -166,23 +162,22 @@ public void testGetTableListWithAlias() throws Exception { @Test public void testGetTableListWithXor() throws Exception { String sql = "SELECT * FROM MY_TABLE1 WHERE true XOR false"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); - Select selectStatement = (Select) statement; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(1, tableList.size()); assertEquals("MY_TABLE1", tableList.get(0)); } @Test public void testGetTableListWithStmt() throws Exception { - String sql = "WITH TESTSTMT as (SELECT * FROM MY_TABLE1 as ALIAS_TABLE1) SELECT * FROM TESTSTMT"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); + String sql = + "WITH TESTSTMT as (SELECT * FROM MY_TABLE1 as ALIAS_TABLE1) SELECT * FROM TESTSTMT"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); - Select selectStatement = (Select) statement; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(1, tableList.size()); assertEquals("MY_TABLE1", tableList.get(0)); } @@ -190,11 +185,10 @@ public void testGetTableListWithStmt() throws Exception { @Test public void testGetTableListWithLateral() throws Exception { String sql = "SELECT * FROM MY_TABLE1, LATERAL(select a from MY_TABLE2) as AL"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); - Select selectStatement = (Select) statement; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -203,11 +197,10 @@ public void testGetTableListWithLateral() throws Exception { @Test public void testGetTableListFromDelete() throws Exception { String sql = "DELETE FROM MY_TABLE1 as AL WHERE a = (SELECT a from MY_TABLE2)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); - Delete deleteStatement = (Delete) statement; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(deleteStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -216,11 +209,9 @@ public void testGetTableListFromDelete() throws Exception { @Test public void testGetTableListFromDelete2() throws Exception { String sql = "DELETE FROM MY_TABLE1"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Delete deleteStatement = (Delete) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(deleteStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(1, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); } @@ -228,7 +219,9 @@ public void testGetTableListFromDelete2() throws Exception { @Test public void testGetTableListFromTruncate() throws Exception { String sql = "TRUNCATE TABLE MY_TABLE1"; - List tables = new TablesNamesFinder().getTableList(pm.parse(new StringReader(sql))); + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); + + List tables = new TablesNamesFinder().getTableList(statement); assertEquals(1, tables.size()); assertTrue(tables.contains("MY_TABLE1")); } @@ -236,11 +229,9 @@ public void testGetTableListFromTruncate() throws Exception { @Test public void testGetTableListFromDeleteWithJoin() throws Exception { String sql = "DELETE t1, t2 FROM MY_TABLE1 t1 JOIN MY_TABLE2 t2 ON t1.id = t2.id"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Delete deleteStatement = (Delete) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(deleteStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -249,11 +240,9 @@ public void testGetTableListFromDeleteWithJoin() throws Exception { @Test public void testGetTableListFromInsert() throws Exception { String sql = "INSERT INTO MY_TABLE1 (a) VALUES ((SELECT a from MY_TABLE2 WHERE a = 1))"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Insert insertStatement = (Insert) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(insertStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -262,11 +251,9 @@ public void testGetTableListFromInsert() throws Exception { @Test public void testGetTableListFromInsertValues() throws Exception { String sql = "INSERT INTO MY_TABLE1 (a) VALUES (5)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Insert insertStatement = (Insert) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(insertStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(1, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); } @@ -274,11 +261,9 @@ public void testGetTableListFromInsertValues() throws Exception { @Test public void testGetTableListFromReplace() throws Exception { String sql = "REPLACE INTO MY_TABLE1 (a) VALUES ((SELECT a from MY_TABLE2 WHERE a = 1))"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Upsert replaceStatement = (Upsert) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(replaceStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -287,11 +272,9 @@ public void testGetTableListFromReplace() throws Exception { @Test public void testGetTableListFromUpdate() throws Exception { String sql = "UPDATE MY_TABLE1 SET a = (SELECT a from MY_TABLE2 WHERE a = 1)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Update updateStatement = (Update) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(updateStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -300,11 +283,9 @@ public void testGetTableListFromUpdate() throws Exception { @Test public void testGetTableListFromUpdate2() throws Exception { String sql = "UPDATE MY_TABLE1 SET a = 5 WHERE 0 < (SELECT COUNT(b) FROM MY_TABLE3)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Update updateStatement = (Update) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(updateStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE3")); @@ -312,12 +293,11 @@ public void testGetTableListFromUpdate2() throws Exception { @Test public void testGetTableListFromUpdate3() throws Exception { - String sql = "UPDATE MY_TABLE1 SET a = 5 FROM MY_TABLE1 INNER JOIN MY_TABLE2 on MY_TABLE1.C = MY_TABLE2.D WHERE 0 < (SELECT COUNT(b) FROM MY_TABLE3)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Update updateStatement = (Update) statement; + String sql = + "UPDATE MY_TABLE1 SET a = 5 FROM MY_TABLE1 INNER JOIN MY_TABLE2 on MY_TABLE1.C = MY_TABLE2.D WHERE 0 < (SELECT COUNT(b) FROM MY_TABLE3)"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(updateStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(3, tableList.size()); assertTrue(tableList.contains("MY_TABLE1")); assertTrue(tableList.contains("MY_TABLE2")); @@ -326,12 +306,11 @@ public void testGetTableListFromUpdate3() throws Exception { @Test public void testCmplxSelectProblem() throws Exception { - String sql = "SELECT cid, (SELECT name FROM tbl0 WHERE tbl0.id = cid) AS name, original_id AS bc_id FROM tbl WHERE crid = ? AND user_id is null START WITH ID = (SELECT original_id FROM tbl2 WHERE USER_ID = ?) CONNECT BY prior parent_id = id AND rownum = 1"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Select selectStatement = (Select) statement; + String sql = + "SELECT cid, (SELECT name FROM tbl0 WHERE tbl0.id = cid) AS name, original_id AS bc_id FROM tbl WHERE crid = ? AND user_id is null START WITH ID = (SELECT original_id FROM tbl2 WHERE USER_ID = ?) CONNECT BY prior parent_id = id AND rownum = 1"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(3, tableList.size()); assertTrue(tableList.contains("tbl0")); assertTrue(tableList.contains("tbl")); @@ -341,11 +320,9 @@ public void testCmplxSelectProblem() throws Exception { @Test public void testInsertSelect() throws Exception { String sql = "INSERT INTO mytable (mycolumn) SELECT mycolumn FROM mytable2"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Insert insertStatement = (Insert) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(insertStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("mytable")); assertTrue(tableList.contains("mytable2")); @@ -354,11 +331,9 @@ public void testInsertSelect() throws Exception { @Test public void testCreateSelect() throws Exception { String sql = "CREATE TABLE mytable AS SELECT mycolumn FROM mytable2"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - CreateTable createTable = (CreateTable) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(createTable); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("mytable")); assertTrue(tableList.contains("mytable2")); @@ -366,10 +341,11 @@ public void testCreateSelect() throws Exception { @Test public void testInsertSubSelect() throws JSQLParserException { - String sql = "INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany'"; - Insert insert = (Insert) pm.parse(new StringReader(sql)); + String sql = + "INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany'"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(insert); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("Customers")); assertTrue(tableList.contains("Suppliers")); @@ -392,7 +368,7 @@ private String getLine(BufferedReader in) throws Exception { @Test public void testOracleHint() throws JSQLParserException { String sql = "select --+ HINT\ncol2 from mytable"; - Select select = (Select) CCJSqlParserUtil.parse(sql); + PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(sql); final OracleHint[] holder = new OracleHint[1]; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() { @@ -403,27 +379,25 @@ public void visit(OracleHint hint) { } }; - tablesNamesFinder.getTableList(select); + tablesNamesFinder.getTableList((Statement) select); assertNull(holder[0]); } @Test public void testGetTableListIssue194() throws Exception { String sql = "SELECT 1"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Select selectStatement = (Select) statement; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(0, tableList.size()); } @Test public void testGetTableListIssue284() throws Exception { String sql = "SELECT NVL( (SELECT 1 FROM DUAL), 1) AS A FROM TEST1"; - Select selectStatement = (Select) CCJSqlParserUtil.parse(sql); + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStatement); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("DUAL")); assertTrue(tableList.contains("TEST1")); @@ -442,7 +416,8 @@ public void testUpdateGetTableListIssue295() throws JSQLParserException { @Test public void testGetTableListForMerge() throws Exception { - String sql = "MERGE INTO employees e USING hr_records h ON (e.id = h.emp_id) WHEN MATCHED THEN UPDATE SET e.address = h.address WHEN NOT MATCHED THEN INSERT (id, address) VALUES (h.emp_id, h.address);"; + String sql = + "MERGE INTO employees e USING hr_records h ON (e.id = h.emp_id) WHEN MATCHED THEN UPDATE SET e.address = h.address WHEN NOT MATCHED THEN INSERT (id, address) VALUES (h.emp_id, h.address);"; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); Merge parsed = (Merge) CCJSqlParserUtil.parse(sql); @@ -452,14 +427,16 @@ public void testGetTableListForMerge() throws Exception { assertEquals("hr_records", tableList.get(1)); Merge created = new Merge() - .withMergeInsert(new MergeInsert().addColumns(new Column("id"), new Column("address"))); - // TestUtils.assertEqualsObjectTree(parsed, created); + .withMergeInsert( + new MergeInsert().addColumns(new Column("id"), new Column("address"))); + // TestUtils.assertEqualsObjectTree(parsed, created); } @Test public void testGetTableListForMergeUsingQuery() throws Exception { - String sql = "MERGE INTO employees e USING (SELECT * FROM hr_records WHERE start_date > ADD_MONTHS(SYSDATE, -1)) h ON (e.id = h.emp_id) WHEN MATCHED THEN UPDATE SET e.address = h.address WHEN NOT MATCHED THEN INSERT (id, address) VALUES (h.emp_id, h.address)"; + String sql = + "MERGE INTO employees e USING (SELECT * FROM hr_records WHERE start_date > ADD_MONTHS(SYSDATE, -1)) h ON (e.id = h.emp_id) WHEN MATCHED THEN UPDATE SET e.address = h.address WHEN NOT MATCHED THEN INSERT (id, address) VALUES (h.emp_id, h.address)"; TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List tableList = tablesNamesFinder.getTableList(CCJSqlParserUtil.parse(sql)); assertEquals(2, tableList.size()); @@ -525,19 +502,19 @@ public void testCaseWhenSubSelect3() throws JSQLParserException { @Test public void testExpressionIssue515() throws JSQLParserException { TablesNamesFinder finder = new TablesNamesFinder(); - List tableList = finder.getTableList(CCJSqlParserUtil.parseCondExpression("SOME_TABLE.COLUMN = 'A'")); + List tableList = finder + .getTableList(CCJSqlParserUtil.parseCondExpression("SOME_TABLE.COLUMN = 'A'")); assertEquals(1, tableList.size()); assertTrue(tableList.contains("SOME_TABLE")); } @Test public void testSelectHavingSubquery() throws Exception { - String sql = "SELECT * FROM TABLE1 GROUP BY COL1 HAVING SUM(COL2) > (SELECT COUNT(*) FROM TABLE2)"; - net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql)); - - Select selectStmt = (Select) statement; + String sql = + "SELECT * FROM TABLE1 GROUP BY COL1 HAVING SUM(COL2) > (SELECT COUNT(*) FROM TABLE2)"; + Statement statement = TestUtils.assertSqlCanBeParsedAndDeparsed(sql, true); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - List tableList = tablesNamesFinder.getTableList(selectStmt); + List tableList = tablesNamesFinder.getTableList(statement); assertEquals(2, tableList.size()); assertTrue(tableList.contains("TABLE1")); assertTrue(tableList.contains("TABLE2")); @@ -624,7 +601,8 @@ public void testCreateSequence_throwsException() throws JSQLParserException { String sql = "CREATE SEQUENCE my_seq"; Statement stmt = CCJSqlParserUtil.parse(sql); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - assertThatThrownBy(() -> tablesNamesFinder.getTableList(stmt)).isInstanceOf(UnsupportedOperationException.class) + assertThatThrownBy(() -> tablesNamesFinder.getTableList(stmt)) + .isInstanceOf(UnsupportedOperationException.class) .hasMessage("Finding tables from CreateSequence is not supported"); } @@ -633,7 +611,8 @@ public void testAlterSequence_throwsException() throws JSQLParserException { String sql = "ALTER SEQUENCE my_seq"; Statement stmt = CCJSqlParserUtil.parse(sql); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - assertThatThrownBy(() -> tablesNamesFinder.getTableList(stmt)).isInstanceOf(UnsupportedOperationException.class) + assertThatThrownBy(() -> tablesNamesFinder.getTableList(stmt)) + .isInstanceOf(UnsupportedOperationException.class) .hasMessage("Finding tables from AlterSequence is not supported"); } @@ -642,13 +621,15 @@ public void testCreateSynonym_throwsException() throws JSQLParserException { String sql = "CREATE SYNONYM foo FOR bar"; Statement stmt = CCJSqlParserUtil.parse(sql); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); - assertThatThrownBy(() -> tablesNamesFinder.getTableList(stmt)).isInstanceOf(UnsupportedOperationException.class) + assertThatThrownBy(() -> tablesNamesFinder.getTableList(stmt)) + .isInstanceOf(UnsupportedOperationException.class) .hasMessage("Finding tables from CreateSynonym is not supported"); } @Test public void testNPEIssue1009() throws JSQLParserException { - Statement stmt = CCJSqlParserUtil.parse(" SELECT * FROM (SELECT * FROM biz_fund_info WHERE tenant_code = ? AND ((ta_code, manager_code) IN ((?, ?)) OR department_type IN (?)))"); + Statement stmt = CCJSqlParserUtil.parse( + " SELECT * FROM (SELECT * FROM biz_fund_info WHERE tenant_code = ? AND ((ta_code, manager_code) IN ((?, ?)) OR department_type IN (?)))"); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); assertThat(tablesNamesFinder.getTableList(stmt)).containsExactly("biz_fund_info"); @@ -656,7 +637,8 @@ public void testNPEIssue1009() throws JSQLParserException { @Test public void testAtTimeZoneExpression() throws JSQLParserException { - String sql = "SELECT DATE(date1 AT TIME ZONE 'UTC' AT TIME ZONE 'australia/sydney') AS another_date FROM mytbl"; + String sql = + "SELECT DATE(date1 AT TIME ZONE 'UTC' AT TIME ZONE 'australia/sydney') AS another_date FROM mytbl"; Statement stmt = CCJSqlParserUtil.parse(sql); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List tableList = tablesNamesFinder.getTableList(stmt); diff --git a/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java b/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java index fc5842784..1d83be12a 100644 --- a/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java +++ b/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java @@ -9,8 +9,6 @@ */ package net.sf.jsqlparser.util.deparser; -import java.util.ArrayList; -import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @@ -25,7 +23,11 @@ import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.replace.Replace; -import net.sf.jsqlparser.statement.select.*; +import net.sf.jsqlparser.statement.select.OrderByElement; +import net.sf.jsqlparser.statement.select.ParenthesedSelect; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.SelectVisitor; +import net.sf.jsqlparser.statement.select.WithItem; import net.sf.jsqlparser.statement.update.Update; import net.sf.jsqlparser.statement.update.UpdateSet; import net.sf.jsqlparser.statement.upsert.Upsert; @@ -33,11 +35,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import static org.mockito.BDDMockito.then; import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.BDDMockito.then; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) public class StatementDeParserTest { @@ -52,7 +58,8 @@ public class StatementDeParserTest { @BeforeEach public void setUp() { - statementDeParser = new StatementDeParser(expressionDeParser, selectDeParser, new StringBuilder()); + statementDeParser = + new StatementDeParser(expressionDeParser, selectDeParser, new StringBuilder()); } @Test @@ -84,7 +91,7 @@ public void shouldUseProvidedDeparsersWhenDeParsingDelete() { @Test @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") - public void shouldUseProvidedDeparsersWhenDeParsingInsert() throws JSQLParserException { + public void shouldUseProvidedDeparsersWhenDeParsingInsert() { Insert insert = new Insert(); Table table = new Table(); List duplicateUpdateColumns = new ArrayList(); @@ -93,13 +100,13 @@ public void shouldUseProvidedDeparsersWhenDeParsingInsert() throws JSQLParserExc Column duplicateUpdateColumn2 = new Column(); Expression duplicateUpdateExpression1 = mock(Expression.class); Expression duplicateUpdateExpression2 = mock(Expression.class); - Select select = new Select(); + PlainSelect select = mock(PlainSelect.class); List withItemsList = new ArrayList(); WithItem withItem1 = spy(new WithItem()); WithItem withItem2 = spy(new WithItem()); - SubSelect withItem1SubSelect = mock(SubSelect.class); - SubSelect withItem2SubSelect = mock(SubSelect.class); - SelectBody selectBody = mock(SelectBody.class); + ParenthesedSelect withItem1SubSelect = mock(ParenthesedSelect.class); + ParenthesedSelect withItem2SubSelect = mock(ParenthesedSelect.class); + select.setWithItemsList(withItemsList); insert.setSelect(select); insert.setTable(table); @@ -111,18 +118,16 @@ public void shouldUseProvidedDeparsersWhenDeParsingInsert() throws JSQLParserExc duplicateUpdateExpressionList.add(duplicateUpdateExpression1); duplicateUpdateExpressionList.add(duplicateUpdateExpression2); insert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); - select.setWithItemsList(withItemsList); - select.setSelectBody(selectBody); withItemsList.add(withItem1); withItemsList.add(withItem2); - withItem1.setSubSelect(withItem1SubSelect); - withItem2.setSubSelect(withItem2SubSelect); + withItem1.setSelect(withItem1SubSelect); + withItem2.setSelect(withItem2SubSelect); - statementDeParser.visit(insert); + statementDeParser.visit(insert.withWithItemsList(withItemsList)); - then(withItem1).should().accept(selectDeParser); - then(withItem2).should().accept(selectDeParser); - then(selectBody).should().accept(selectDeParser); + then(withItem1).should().accept((SelectVisitor) selectDeParser); + then(withItem2).should().accept((SelectVisitor) selectDeParser); + then(select).should().accept(selectDeParser); then(duplicateUpdateExpression1).should().accept(expressionDeParser); then(duplicateUpdateExpression1).should().accept(expressionDeParser); } @@ -153,39 +158,41 @@ public void shouldUseProvidedDeParsersWhenDeParsingReplaceWithoutItemsList() { then(expression2).should().accept(expressionDeParser); } -// @Test -// @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") -// public void shouldUseProvidedDeParsersWhenDeParsingReplaceWithItemsList() { -// Replace replace = new Replace(); -// Table table = new Table(); -// ItemsList itemsList = mock(ItemsList.class); -// -// replace.setTable(table); -// replace.setItemsList(itemsList); -// -// statementDeParser.visit(replace); -// -// then(itemsList).should().accept(argThat(is(replaceDeParserWithDeParsers(equalTo(expressionDeParser), equalTo(selectDeParser))))); -// } + // @Test + // @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") + // public void shouldUseProvidedDeParsersWhenDeParsingReplaceWithItemsList() { + // Replace replace = new Replace(); + // Table table = new Table(); + // ItemsList itemsList = mock(ItemsList.class); + // + // replace.setTable(table); + // replace.setItemsList(itemsList); + // + // statementDeParser.visit(replace); + // + // then(itemsList).should().accept(argThat(is(replaceDeParserWithDeParsers(equalTo(expressionDeParser), + // equalTo(selectDeParser))))); + // } @Test @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") public void shouldUseProvidedDeParsersWhenDeParsingSelect() { - Select select = new Select(); WithItem withItem1 = spy(new WithItem()); + withItem1.setSelect(mock(ParenthesedSelect.class)); WithItem withItem2 = spy(new WithItem()); - SelectBody selectBody = mock(SelectBody.class); - List withItemsList = new ArrayList(); + withItem2.setSelect(mock(ParenthesedSelect.class)); - select.setWithItemsList(withItemsList); - select.setSelectBody(selectBody); + List withItemsList = new ArrayList(); withItemsList.add(withItem1); withItemsList.add(withItem2); - statementDeParser.visit(select); + PlainSelect plainSelect = mock(PlainSelect.class); + plainSelect.setWithItemsList(withItemsList); - then(withItem1).should().accept(selectDeParser); - then(withItem2).should().accept(selectDeParser); - then(selectBody).should().accept(selectDeParser); + statementDeParser.visit(plainSelect); + + // then(withItem1).should().accept((SelectVisitor) selectDeParser); + // then(withItem2).should().accept((SelectVisitor) selectDeParser); + then(plainSelect).should().accept(selectDeParser); } @Test @@ -234,7 +241,6 @@ public void shouldUseProvidedDeParsersWhenDeParsingUpdateUsingSelect() { List orderByElements = new ArrayList(); Column column1 = new Column(); Column column2 = new Column(); - SelectBody selectBody = mock(SelectBody.class); OrderByElement orderByElement1 = new OrderByElement(); OrderByElement orderByElement2 = new OrderByElement(); Expression orderByElement1Expression = mock(Expression.class); @@ -243,13 +249,9 @@ public void shouldUseProvidedDeParsersWhenDeParsingUpdateUsingSelect() { update.setWhere(where); update.setOrderByElements(orderByElements); - SubSelect subSelect = new SubSelect().withSelectBody(selectBody); - ExpressionList expressionList = new ExpressionList().addExpressions(subSelect); - UpdateSet updateSet = new UpdateSet(); updateSet.add(column1); updateSet.add(column2); - updateSet.add(expressionList); update.addUpdateSet(updateSet); @@ -262,7 +264,6 @@ public void shouldUseProvidedDeParsersWhenDeParsingUpdateUsingSelect() { then(expressionDeParser).should().visit(column1); then(expressionDeParser).should().visit(column2); - then(expressionDeParser).should().visit(subSelect); then(where).should().accept(expressionDeParser); then(orderByElement1Expression).should().accept(expressionDeParser); then(orderByElement2Expression).should().accept(expressionDeParser); @@ -303,22 +304,25 @@ public void shouldUseProvidedDeParserWhenDeParsingSetStatement() { then(expression).should().accept(expressionDeParser); } -// private Matcher replaceDeParserWithDeParsers(final Matcher expressionDeParserMatcher, final Matcher selectDeParserMatcher) { -// Description description = new StringDescription(); -// description.appendText("replace de-parser with expression de-parser "); -// expressionDeParserMatcher.describeTo(description); -// description.appendText(" and select de-parser "); -// selectDeParserMatcher.describeTo(description); -// return new CustomTypeSafeMatcher(description.toString()) { -// @Override -// public boolean matchesSafely(ReplaceDeParser item) { -// return expressionDeParserMatcher.matches(item.getExpressionVisitor()) && selectDeParserMatcher.matches(item.getSelectVisitor()); -// } -// }; -// } + // private Matcher replaceDeParserWithDeParsers(final + // Matcher expressionDeParserMatcher, final Matcher + // selectDeParserMatcher) { + // Description description = new StringDescription(); + // description.appendText("replace de-parser with expression de-parser "); + // expressionDeParserMatcher.describeTo(description); + // description.appendText(" and select de-parser "); + // selectDeParserMatcher.describeTo(description); + // return new CustomTypeSafeMatcher(description.toString()) { + // @Override + // public boolean matchesSafely(ReplaceDeParser item) { + // return expressionDeParserMatcher.matches(item.getExpressionVisitor()) && + // selectDeParserMatcher.matches(item.getSelectVisitor()); + // } + // }; + // } @Test @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") - public void shouldUseProvidedDeparsersWhenDeParsingUpsertWithExpressionList() throws JSQLParserException { + public void shouldUseProvidedDeparsersWhenDeParsingUpsertWithExpressionList() { Upsert upsert = new Upsert(); Table table = new Table(); List duplicateUpdateColumns = new ArrayList(); @@ -327,13 +331,13 @@ public void shouldUseProvidedDeparsersWhenDeParsingUpsertWithExpressionList() th Column duplicateUpdateColumn2 = new Column(); Expression duplicateUpdateExpression1 = mock(Expression.class); Expression duplicateUpdateExpression2 = mock(Expression.class); - Select select = new Select(); + PlainSelect select = mock(PlainSelect.class); List withItemsList = new ArrayList(); WithItem withItem1 = spy(new WithItem()); WithItem withItem2 = spy(new WithItem()); - SubSelect withItem1SubSelect = mock(SubSelect.class); - SubSelect withItem2SubSelect = mock(SubSelect.class); - SelectBody selectBody = mock(SelectBody.class); + ParenthesedSelect withItem1SubSelect = mock(ParenthesedSelect.class); + ParenthesedSelect withItem2SubSelect = mock(ParenthesedSelect.class); + select.setWithItemsList(withItemsList); upsert.setSelect(select); upsert.setTable(table); @@ -345,25 +349,22 @@ public void shouldUseProvidedDeparsersWhenDeParsingUpsertWithExpressionList() th duplicateUpdateExpressionList.add(duplicateUpdateExpression1); duplicateUpdateExpressionList.add(duplicateUpdateExpression2); upsert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList); - select.setWithItemsList(withItemsList); - select.setSelectBody(selectBody); withItemsList.add(withItem1); withItemsList.add(withItem2); - withItem1.setSubSelect(withItem1SubSelect); - withItem2.setSubSelect(withItem2SubSelect); + withItem1.setSelect(withItem1SubSelect); + withItem2.setSelect(withItem2SubSelect); statementDeParser.visit(upsert); - then(withItem1).should().accept(selectDeParser); - then(withItem2).should().accept(selectDeParser); - then(selectBody).should().accept(selectDeParser); + then(select).should().accept(selectDeParser); then(duplicateUpdateExpression1).should().accept(expressionDeParser); then(duplicateUpdateExpression1).should().accept(expressionDeParser); } @Test @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") - public void shouldUseProvidedDeparsersWhenDeParsingIfThenStatement() throws JSQLParserException { + public void shouldUseProvidedDeparsersWhenDeParsingIfThenStatement() + throws JSQLParserException { String sqlStr = "IF OBJECT_ID('tOrigin', 'U') IS NOT NULL DROP TABLE tOrigin1"; IfElseStatement ifElseStatement = (IfElseStatement) CCJSqlParserUtil.parse(sqlStr); statementDeParser.deParse(ifElseStatement); @@ -372,23 +373,22 @@ public void shouldUseProvidedDeparsersWhenDeParsingIfThenStatement() throws JSQL @Test public void testIssue1500AllColumns() throws JSQLParserException { String sqlStr = "select count(*) from some_table"; - Select select = (Select) CCJSqlParserUtil.parse(sqlStr); - PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + PlainSelect selectBody = (PlainSelect) CCJSqlParserUtil.parse(sqlStr); selectBody.accept(new SelectDeParser()); } @Test public void testIssue1500AllTableColumns() throws JSQLParserException { String sqlStr = "select count(a.*) from some_table a"; - Select select = (Select) CCJSqlParserUtil.parse(sqlStr); - PlainSelect selectBody = (PlainSelect) select.getSelectBody(); + PlainSelect selectBody = (PlainSelect) CCJSqlParserUtil.parse(sqlStr); selectBody.accept(new SelectDeParser()); } @Test public void testIssue1608DeparseValueList() throws JSQLParserException { - String providedSql ="INSERT INTO example (num, name, address, tel) VALUES (1, 'name', 'test ', '1234-1234')"; - String expectedSql ="INSERT INTO example (num, name, address, tel) VALUES (?, ?, ?, ?)"; + String providedSql = + "INSERT INTO example (num, name, address, tel) VALUES (1, 'name', 'test ', '1234-1234')"; + String expectedSql = "INSERT INTO example (num, name, address, tel) VALUES (?, ?, ?, ?)"; net.sf.jsqlparser.statement.Statement statement = CCJSqlParserUtil.parse(providedSql); StringBuilder builder = new StringBuilder(); @@ -408,7 +408,8 @@ public void visit(LongValue longValue) { expressionDeParser.setSelectVisitor(selectDeParser); expressionDeParser.setBuffer(builder); - StatementDeParser statementDeParser = new StatementDeParser(expressionDeParser, selectDeParser, builder); + StatementDeParser statementDeParser = + new StatementDeParser(expressionDeParser, selectDeParser, builder); statement.accept(statementDeParser); Assertions.assertEquals(expectedSql, builder.toString()); diff --git a/src/test/java/net/sf/jsqlparser/util/validation/validator/InsertValidatorTest.java b/src/test/java/net/sf/jsqlparser/util/validation/validator/InsertValidatorTest.java index f5fe80f79..7fae82abc 100644 --- a/src/test/java/net/sf/jsqlparser/util/validation/validator/InsertValidatorTest.java +++ b/src/test/java/net/sf/jsqlparser/util/validation/validator/InsertValidatorTest.java @@ -9,42 +9,37 @@ */ package net.sf.jsqlparser.util.validation.validator; -import java.util.Arrays; -import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.feature.Feature; import net.sf.jsqlparser.util.validation.ValidationTestAsserts; import net.sf.jsqlparser.util.validation.feature.DatabaseType; import net.sf.jsqlparser.util.validation.feature.FeaturesAllowed; import org.junit.jupiter.api.Test; +import java.util.Arrays; + public class InsertValidatorTest extends ValidationTestAsserts { @Test - public void testValidationInsert() throws JSQLParserException { + public void testValidationInsert() { String sql = "INSERT INTO tab1 (a, b) VALUES (5, 'val')"; validateNoErrors(sql, 1, DatabaseType.values()); } @Test - public void testValidationInsertNotAllowed() throws JSQLParserException { + public void testValidationInsertNotAllowed() { String sql = "INSERT INTO tab1 (a, b, c) VALUES (5, 'val', ?)"; - validateNotAllowed(sql, 1, 1, FeaturesAllowed.SELECT.copy().add(FeaturesAllowed.JDBC) - , Feature.insertValues - , Feature.setOperation - , Feature.insertFromSelect - , Feature.values - , Feature.insert - ); + validateNotAllowed(sql, 1, 1, FeaturesAllowed.SELECT.copy().add(FeaturesAllowed.JDBC), + Feature.insertValues, Feature.insertFromSelect, Feature.values, Feature.insert); } @Test - public void testValidationInsertSelect() throws JSQLParserException { + public void testValidationInsertSelect() { String sql = "INSERT INTO tab1 (a, b, c) SELECT col1, col2, ? FROM tab2 WHERE col3 = ?"; validateNoErrors(sql, 1, DatabaseType.DATABASES); } @Test - public void testInsertWithReturning() throws JSQLParserException { + public void testInsertWithReturning() { for (String sql : Arrays.asList("INSERT INTO mytable (mycolumn) VALUES ('1') RETURNING id", "INSERT INTO mytable (mycolumn) VALUES ('1') RETURNING id AS a1, id2 AS a2")) { validateNoErrors(sql, 1, DatabaseType.POSTGRESQL, DatabaseType.MARIADB); @@ -52,25 +47,26 @@ public void testInsertWithReturning() throws JSQLParserException { } @Test - public void testInsertWithReturningAll() throws JSQLParserException { + public void testInsertWithReturningAll() { String sql = "INSERT INTO mytable (mycolumn) VALUES ('1') RETURNING *"; validateNoErrors(sql, 1, DatabaseType.POSTGRESQL); } @Test - public void testDuplicateKey() throws JSQLParserException { - String sql = "INSERT INTO Users0 (UserId, Key, Value) VALUES (51311, 'T_211', 18) ON DUPLICATE KEY UPDATE Value = 18"; + public void testDuplicateKey() { + String sql = + "INSERT INTO Users0 (UserId, Key, Value) VALUES (51311, 'T_211', 18) ON DUPLICATE KEY UPDATE Value = 18"; validateNoErrors(sql, 1, DatabaseType.MARIADB, DatabaseType.MYSQL); } @Test - public void testInsertSetInDeparsing() throws JSQLParserException { + public void testInsertSetInDeparsing() { String sql = "INSERT INTO mytable SET col1 = 12, col2 = name1 * name2;"; validateNoErrors(sql, 1, DatabaseType.MARIADB, DatabaseType.MYSQL); } @Test - public void testInsertMultiRowValue() throws JSQLParserException { + public void testInsertMultiRowValue() { String sql = "INSERT INTO mytable (col1, col2) VALUES (a, b), (d, e)"; validateNoErrors(sql, 1, DatabaseType.SQLSERVER); } diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql index 52d37ff90..4ec094ba7 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/bindvar03.sql @@ -26,4 +26,5 @@ from ) where scn > :2 ---@FAILURE: Encountered unexpected token: "group" "GROUP" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "group" "GROUP" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "minus" "MINUS" recorded first on Mar 25, 2023, 9:30:55 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset07.sql index 4821455e9..03155690b 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset07.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset07.sql @@ -47,4 +47,5 @@ where ))) ---@FAILURE: select "a3"."r_id" "r_id" from "pe" "a3","me" "a2" where "a3"."m_id"="a2"."m_id" and "a2"."mi_t"=any((select "a4"."sys$"."id" from the(select "qa"."u_pkg"."getchartable"("qa"."u_pkg"."glist"(cursor(select "qa"."u_pkg"."glist"(cursor(select "a6"."mi_t" "mi_t" from "me" "a6" connect by "a6"."mi_uid"=prior "a6"."mi_id" start with "a6"."mi_t"=:b1))"lst" from "sys"."dual" "a5")))from dual)"a4")) recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: select "a3"."r_id" "r_id" from "pe" "a3","me" "a2" where "a3"."m_id"="a2"."m_id" and "a2"."mi_t"=any((select "a4"."sys$"."id" from the(select "qa"."u_pkg"."getchartable"("qa"."u_pkg"."glist"(cursor(select "qa"."u_pkg"."glist"(cursor(select "a6"."mi_t" "mi_t" from "me" "a6" connect by "a6"."mi_uid"=prior "a6"."mi_id" start with "a6"."mi_t"=:b1))"lst" from "sys"."dual" "a5")))from dual)"a4")) recorded first on Aug 3, 2021, 7:20:08 AM +--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Mar 25, 2023, 9:18:30 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql index 5dfc7ea46..487c15997 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset13.sql @@ -11,4 +11,5 @@ select customer_id, cust_address_ntab multiset except distinct cust_address2_ntab multiset_except from customers_demo ---@FAILURE: Encountered unexpected token: "except" "EXCEPT" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "except" "EXCEPT" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "distinct" "DISTINCT" recorded first on Mar 25, 2023, 9:18:30 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql index d32289f26..c1c16572c 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset14.sql @@ -12,4 +12,5 @@ multiset intersect all cust_address2_ntab multiset_intersect from customers_demo order by customer_id ---@FAILURE: Encountered unexpected token: "intersect" "INTERSECT" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "intersect" "INTERSECT" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "all" "ALL" recorded first on Mar 25, 2023, 9:18:30 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql index 802626c20..689791df4 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset15.sql @@ -12,4 +12,5 @@ multiset union cust_address2_ntab multiset_union from customers_demo order by customer_id ---@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "union" "UNION" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "cust_address2_ntab" recorded first on Mar 25, 2023, 9:18:30 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql index 58cf2649d..dab664623 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/cast_multiset39.sql @@ -12,4 +12,5 @@ select varchar2_ntt('a','b','c') varchar2_ntt('b','c','d') as multiset_except from dual ---@FAILURE: Encountered unexpected token: "except" "EXCEPT" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "except" "EXCEPT" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "varchar2_ntt" recorded first on Mar 25, 2023, 9:18:30 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition15.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition15.sql index fe95e6c59..be61529e8 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition15.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition15.sql @@ -21,4 +21,5 @@ where from t "a4" ))) ---@FAILURE: select "a3"."r_id" "r_id" from "pe" "a3","me" "a2" where "a3"."m_id"="a2"."m_id" and "a2"."mi_t"=any((select "a4"."sys$"."id" from t "a4")) recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: select "a3"."r_id" "r_id" from "pe" "a3","me" "a2" where "a3"."m_id"="a2"."m_id" and "a2"."mi_t"=any((select "a4"."sys$"."id" from t "a4")) recorded first on Aug 3, 2021, 7:20:08 AM +--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Mar 25, 2023, 9:18:30 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql index ddf745c89..0fbb8fe3f 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert04.sql @@ -15,4 +15,5 @@ select program_id, delivered_date, customer_id, order_date from airplanes --@FAILURE: Encountered unexpected token: "into" "INTO" recorded first on Aug 3, 2021, 7:20:08 AM ---@FAILURE: Encountered unexpected token: "ap_cust" recorded first on 24 Oct 2021, 16:56:39 \ No newline at end of file +--@FAILURE: Encountered unexpected token: "ap_cust" recorded first on 24 Oct 2021, 16:56:39 +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql index 99385692b..a8c42ad20 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert05.sql @@ -18,4 +18,5 @@ values (3, 'helen', 'lofstrom') select * from dual --@FAILURE: Encountered unexpected token: "into" "INTO" recorded first on Aug 3, 2021, 7:20:08 AM ---@FAILURE: Encountered unexpected token: "t" recorded first on 24 Oct 2021, 16:56:39 \ No newline at end of file +--@FAILURE: Encountered unexpected token: "t" recorded first on 24 Oct 2021, 16:56:39 +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql index c2eeba10f..c9ff596c6 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert06.sql @@ -22,4 +22,5 @@ else values (empno,ename,job,mgr,sal,deptno) select * from emp ---@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql index 352cc3fd4..b2d203861 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert07.sql @@ -20,4 +20,5 @@ when customer_id > 'pzzz' then select program_id, delivered_date, customer_id, order_date from airplanes ---@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "when" "WHEN" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql index ee21c0d89..0dc47fba9 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert08.sql @@ -14,4 +14,5 @@ from dept where deptno < 30) values (98, 'travel', 'seattle') ---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql index 69c122256..6078d3305 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert09.sql @@ -13,4 +13,5 @@ from dept where deptno < 30 with check option) values (99, 'travel', 'seattle') ---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql index 275b8bde2..5c5934fc8 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/insert10.sql @@ -13,4 +13,5 @@ insert into ( values (1, 'morgan', 'dba', '1', 40) ---@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "(" "(" recorded first on Aug 3, 2021, 7:20:08 AM +--@FAILURE: Encountered unexpected token: "insert" "INSERT" recorded first on Mar 26, 2023, 6:59:20 PM \ No newline at end of file