diff --git a/build.gradle b/build.gradle index 6aaa8909f..de289105c 100644 --- a/build.gradle +++ b/build.gradle @@ -106,12 +106,6 @@ test { minHeapSize = "128m" maxHeapSize = "1G" - jvmArgs << [ - '-Djunit.jupiter.execution.parallel.enabled=true', - '-Djunit.jupiter.execution.parallel.config.strategy=dynamic', - '-Djunit.jupiter.execution.parallel.mode.default=concurrent' - ] - finalizedBy check } diff --git a/config/checkstyle/checkstyle_checks.xml b/config/checkstyle/checkstyle_checks.xml index 171ec589d..708f38789 100644 --- a/config/checkstyle/checkstyle_checks.xml +++ b/config/checkstyle/checkstyle_checks.xml @@ -123,7 +123,7 @@ - + @@ -410,7 +410,7 @@ - + diff --git a/src/main/java/net/sf/jsqlparser/expression/Function.java b/src/main/java/net/sf/jsqlparser/expression/Function.java index 321ffd9ee..0912d50e9 100644 --- a/src/main/java/net/sf/jsqlparser/expression/Function.java +++ b/src/main/java/net/sf/jsqlparser/expression/Function.java @@ -14,6 +14,7 @@ import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.NamedExpressionList; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; +import net.sf.jsqlparser.schema.*; import net.sf.jsqlparser.statement.select.OrderByElement; import net.sf.jsqlparser.statement.select.PlainSelect; @@ -29,8 +30,8 @@ public class Function extends ASTNodeAccessImpl implements Expression { private boolean distinct = false; private boolean unique = false; private boolean isEscaped = false; - private Expression attribute; - private String attributeName; + private Expression attributeExpression; + private Column attributeColumn = null; private List orderByElements; private KeepExpression keep = null; private boolean ignoreNulls = false; @@ -43,7 +44,7 @@ public void accept(ExpressionVisitor expressionVisitor) { public String getName() { return nameparts == null ? null : String.join(".", nameparts); } - + public List getMultipartName() { return nameparts; } @@ -51,12 +52,12 @@ public List getMultipartName() { public void setName(String string) { nameparts = Arrays.asList(string); } - + public Function withName(String name) { this.setName(name); return this; } - + public void setName(List string) { nameparts = string; } @@ -148,20 +149,35 @@ public void setEscaped(boolean isEscaped) { this.isEscaped = isEscaped; } - public Expression getAttribute() { - return attribute; + public Object getAttribute() { + return attributeExpression != null ? attributeExpression : attributeColumn; } - public void setAttribute(Expression attribute) { - this.attribute = attribute; + public void setAttribute(Expression attributeExpression) { + this.attributeExpression = attributeExpression; } + @Deprecated public String getAttributeName() { - return attributeName; + return attributeColumn.toString(); } public void setAttributeName(String attributeName) { - this.attributeName = attributeName; + this.attributeColumn = new Column().withColumnName(attributeName); + } + + public Column getAttributeColumn() { + return attributeColumn; + } + + public void setAttribute(Column attributeColumn) { + attributeExpression = null; + this.attributeColumn = attributeColumn; + } + + public Function withAttribute(Column attributeColumn) { + setAttribute(attributeColumn); + return this; } public KeepExpression getKeep() { @@ -213,14 +229,14 @@ public String toString() { String ans = getName() + params; - if (attribute != null) { - ans += "." + attribute.toString(); - } else if (attributeName != null) { - ans += "." + attributeName; + if (attributeExpression != null) { + ans += "." + attributeExpression; + } else if (attributeColumn != null) { + ans += "." + attributeColumn; } if (keep != null) { - ans += " " + keep.toString(); + ans += " " + keep; } if (isEscaped) { @@ -235,6 +251,7 @@ public Function withAttribute(Expression attribute) { return this; } + @Deprecated public Function withAttributeName(String attributeName) { this.setAttributeName(attributeName); return this; diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java b/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java index 80468b81b..1bf4c1eba 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/Fetch.java @@ -9,27 +9,41 @@ */ package net.sf.jsqlparser.statement.select; -import net.sf.jsqlparser.expression.JdbcParameter; +import net.sf.jsqlparser.expression.*; import java.io.Serializable; public class Fetch implements Serializable { - - private long rowCount; - private JdbcParameter fetchJdbcParameter = null; + private Expression expression = null; private boolean isFetchParamFirst = false; private String fetchParam = "ROW"; + @Deprecated public long getRowCount() { - return rowCount; + return expression instanceof LongValue ? ((LongValue) expression).getValue() : null; } + @Deprecated public void setRowCount(long l) { - rowCount = l; + setExpression(new LongValue(l)); + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + public Fetch withExpression(Expression expression) { + this.setExpression(expression); + return this; } + @Deprecated public JdbcParameter getFetchJdbcParameter() { - return fetchJdbcParameter; + return expression instanceof JdbcParameter ? (JdbcParameter) expression : null; } public String getFetchParam() { @@ -40,8 +54,9 @@ public boolean isFetchParamFirst() { return isFetchParamFirst; } + @Deprecated public void setFetchJdbcParameter(JdbcParameter jdbc) { - fetchJdbcParameter = jdbc; + this.setExpression(jdbc); } public void setFetchParam(String s) { @@ -54,9 +69,8 @@ public void setFetchParamFirst(boolean b) { @Override public String toString() { - return " FETCH " + (isFetchParamFirst ? "FIRST" : "NEXT") + " " - + (fetchJdbcParameter!=null ? fetchJdbcParameter.toString() : - Long.toString(rowCount)) + " " + fetchParam + " ONLY"; + return " FETCH " + (isFetchParamFirst ? "FIRST" : "NEXT") + " " + expression.toString() + + " " + fetchParam + " ONLY"; } public Fetch withRowCount(long rowCount) { diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java index 33cd00aab..a99e8c88f 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java @@ -77,7 +77,8 @@ public ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer) { this(selectVisitor, buffer, new OrderByDeParser()); } - ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer, OrderByDeParser orderByDeParser) { + ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer, + OrderByDeParser orderByDeParser) { super(buffer); this.selectVisitor = selectVisitor; this.orderByDeParser = orderByDeParser; @@ -157,10 +158,11 @@ public void visit(BitwiseLeftShift expr) { visitBinaryExpression(expr, " << "); } - public void visitOldOracleJoinBinaryExpression(OldOracleJoinBinaryExpression expression, String operator) { -// if (expression.isNot()) { -// buffer.append(NOT); -// } + public void visitOldOracleJoinBinaryExpression(OldOracleJoinBinaryExpression expression, + String operator) { + // if (expression.isNot()) { + // buffer.append(NOT); + // } expression.getLeftExpression().accept(this); if (expression.getOldOracleJoinSyntax() == EqualsTo.ORACLE_JOIN_RIGHT) { buffer.append("(+)"); @@ -186,7 +188,8 @@ public void visit(GreaterThanEquals greaterThanEquals) { @Override public void visit(InExpression inExpression) { inExpression.getLeftExpression().accept(this); - if (inExpression.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) { + if (inExpression + .getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) { buffer.append("(+)"); } if (inExpression.isNot()) { @@ -212,8 +215,12 @@ public void visit(FullTextSearch fullTextSearch) { columnsListCommaSeperated += ","; } } - buffer.append("MATCH (" + columnsListCommaSeperated + ") AGAINST (" + fullTextSearch.getAgainstValue() - + (fullTextSearch.getSearchModifier() != null ? " " + fullTextSearch.getSearchModifier() : "") + ")"); + buffer.append("MATCH (" + columnsListCommaSeperated + ") AGAINST (" + + fullTextSearch.getAgainstValue() + + (fullTextSearch.getSearchModifier() != null + ? " " + fullTextSearch.getSearchModifier() + : "") + + ")"); } @Override @@ -269,8 +276,8 @@ public void visit(JdbcParameter jdbcParameter) { @Override public void visit(LikeExpression likeExpression) { - visitBinaryExpression(likeExpression, - (likeExpression.isNot() ? " NOT" : "") + (likeExpression.isCaseInsensitive() ? " ILIKE " : " LIKE ")); + visitBinaryExpression(likeExpression, (likeExpression.isNot() ? " NOT" : "") + + (likeExpression.isCaseInsensitive() ? " ILIKE " : " LIKE ")); Expression escape = likeExpression.getEscape(); if (escape != null) { buffer.append(" ESCAPE "); @@ -314,7 +321,8 @@ public void visit(Multiplication multiplication) { @Override public void visit(NotEqualsTo notEqualsTo) { - visitOldOracleJoinBinaryExpression(notEqualsTo, " " + notEqualsTo.getStringExpression() + " "); + visitOldOracleJoinBinaryExpression(notEqualsTo, + " " + notEqualsTo.getStringExpression() + " "); } @@ -372,7 +380,8 @@ public void visit(SubSelect subSelect) { if (selectVisitor != null) { if (subSelect.getWithItemsList() != null) { buffer.append("WITH "); - for (Iterator iter = subSelect.getWithItemsList().iterator(); iter.hasNext();) { + for (Iterator iter = subSelect.getWithItemsList().iterator(); iter + .hasNext();) { iter.next().accept(selectVisitor); if (iter.hasNext()) { buffer.append(", "); @@ -451,8 +460,6 @@ public void visit(Function function) { if (function.getAttribute() != null) { buffer.append(".").append(function.getAttribute()); - } else if (function.getAttributeName() != null) { - buffer.append(".").append(function.getAttributeName()); } if (function.getKeep() != null) { buffer.append(" ").append(function.getKeep()); @@ -465,7 +472,8 @@ public void visit(Function function) { @Override public void visit(ExpressionList expressionList) { - new ExpressionListDeParser(this, buffer, expressionList.isUsingBrackets(), true).deParse(expressionList.getExpressions()); + new ExpressionListDeParser(this, buffer, expressionList.isUsingBrackets(), true) + .deParse(expressionList.getExpressions()); } @Override @@ -549,8 +557,8 @@ public void visit(AnyComparisonExpression anyComparisonExpression) { } else { ExpressionList expressionList = (ExpressionList) anyComparisonExpression.getItemsList(); buffer.append("VALUES "); - buffer.append( - PlainSelect.getStringList(expressionList.getExpressions(), true, anyComparisonExpression.isUsingBracketsForValues())); + buffer.append(PlainSelect.getStringList(expressionList.getExpressions(), true, + anyComparisonExpression.isUsingBracketsForValues())); } buffer.append(" ) "); } @@ -586,7 +594,8 @@ public void visit(CastExpression cast) { buffer.append("CAST("); cast.getLeftExpression().accept(this); buffer.append(" AS "); - buffer.append(cast.getRowConstructor() != null ? cast.getRowConstructor() : cast.getType()); + buffer.append( + cast.getRowConstructor() != null ? cast.getRowConstructor() : cast.getType()); buffer.append(")"); } else { cast.getLeftExpression().accept(this); @@ -601,7 +610,8 @@ public void visit(TryCastExpression cast) { buffer.append("TRY_CAST("); cast.getLeftExpression().accept(this); buffer.append(" AS "); - buffer.append(cast.getRowConstructor() != null ? cast.getRowConstructor() : cast.getType()); + buffer.append( + cast.getRowConstructor() != null ? cast.getRowConstructor() : cast.getType()); buffer.append(")"); } else { cast.getLeftExpression().accept(this); @@ -616,7 +626,8 @@ public void visit(SafeCastExpression cast) { buffer.append("SAFE_CAST("); cast.getLeftExpression().accept(this); buffer.append(" AS "); - buffer.append(cast.getRowConstructor() != null ? cast.getRowConstructor() : cast.getType()); + buffer.append( + cast.getRowConstructor() != null ? cast.getRowConstructor() : cast.getType()); buffer.append(")"); } else { cast.getLeftExpression().accept(this); @@ -632,7 +643,8 @@ public void visit(Modulo modulo) { } @Override - @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", "PMD.MissingBreakInSwitch"}) + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", + "PMD.MissingBreakInSwitch"}) public void visit(AnalyticExpression aexpr) { String name = aexpr.getName(); Expression expression = aexpr.getExpression(); @@ -669,7 +681,8 @@ public void visit(AnalyticExpression aexpr) { } if (aexpr.getFuncOrderBy() != null) { buffer.append(" ORDER BY "); - buffer.append(aexpr.getFuncOrderBy().stream().map(OrderByElement::toString).collect(joining(", "))); + buffer.append(aexpr.getFuncOrderBy().stream().map(OrderByElement::toString) + .collect(joining(", "))); } buffer.append(") "); @@ -710,10 +723,11 @@ public void visit(AnalyticExpression aexpr) { if (aexpr.getWindowName() != null) { buffer.append(" ").append(aexpr.getWindowName()); - } else if (aexpr.getType()!=AnalyticType.WITHIN_GROUP_OVER) { + } else if (aexpr.getType() != AnalyticType.WITHIN_GROUP_OVER) { buffer.append(" ("); - if (partitionExpressionList != null && !partitionExpressionList.getExpressions().isEmpty()) { + if (partitionExpressionList != null + && !partitionExpressionList.getExpressions().isEmpty()) { buffer.append("PARTITION BY "); if (aexpr.isPartitionByBrackets()) { buffer.append("("); @@ -884,12 +898,14 @@ public void visit(DateTimeLiteralExpression literal) { @Override public void visit(NextValExpression nextVal) { - buffer.append(nextVal.isUsingNextValueFor() ? "NEXT VALUE FOR " : "NEXTVAL FOR ").append(nextVal.getName()); + buffer.append(nextVal.isUsingNextValueFor() ? "NEXT VALUE FOR " : "NEXTVAL FOR ") + .append(nextVal.getName()); } @Override public void visit(CollateExpression col) { - buffer.append(col.getLeftExpression().toString()).append(" COLLATE ").append(col.getCollate()); + buffer.append(col.getLeftExpression().toString()).append(" COLLATE ") + .append(col.getCollate()); } @Override @@ -948,7 +964,7 @@ public void visit(VariableAssignment var) { @Override public void visit(XMLSerializeExpr expr) { - //xmlserialize(xmlagg(xmltext(COMMENT_LINE) ORDER BY COMMENT_SEQUENCE) as varchar(1024)) + // xmlserialize(xmlagg(xmltext(COMMENT_LINE) ORDER BY COMMENT_SEQUENCE) as varchar(1024)) buffer.append("xmlserialize(xmlagg(xmltext("); expr.getExpression().accept(this); buffer.append(")"); @@ -992,9 +1008,7 @@ public void visit(ConnectByRootOperator connectByRootOperator) { @Override public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) { - buffer - .append(oracleNamedFunctionParameter.getName()) - .append(" => "); + buffer.append(oracleNamedFunctionParameter.getName()).append(" => "); oracleNamedFunctionParameter.getExpression().accept(this); } @@ -1023,6 +1037,7 @@ public void visit(IsDistinctExpression isDistinctExpression) { @Override public void visit(GeometryDistance geometryDistance) { - visitOldOracleJoinBinaryExpression(geometryDistance, " " + geometryDistance.getStringExpression() + " "); + visitOldOracleJoinBinaryExpression(geometryDistance, + " " + geometryDistance.getStringExpression() + " "); } } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java index 3e2c18e83..c75939c8c 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java @@ -52,8 +52,8 @@ import net.sf.jsqlparser.statement.values.ValuesStatement; @SuppressWarnings({"PMD.CyclomaticComplexity"}) -public class SelectDeParser extends AbstractDeParser - implements SelectVisitor, SelectItemVisitor, FromItemVisitor, PivotVisitor, ItemsListVisitor { +public class SelectDeParser extends AbstractDeParser implements SelectVisitor, + SelectItemVisitor, FromItemVisitor, PivotVisitor, ItemsListVisitor { private ExpressionVisitor expressionVisitor; @@ -71,7 +71,8 @@ public SelectDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) } @Override - @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", "PMD.NPathComplexity"}) + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.ExcessiveMethodLength", + "PMD.NPathComplexity"}) public void visit(PlainSelect plainSelect) { if (plainSelect.isUseBrackets()) { buffer.append("("); @@ -105,8 +106,8 @@ public void visit(PlainSelect plainSelect) { } if (plainSelect.getDistinct().getOnSelectItems() != null) { buffer.append("ON ("); - for (Iterator iter = plainSelect.getDistinct().getOnSelectItems().iterator(); iter - .hasNext();) { + for (Iterator iter = + plainSelect.getDistinct().getOnSelectItems().iterator(); iter.hasNext();) { SelectItem selectItem = iter.next(); selectItem.accept(this); if (iter.hasNext()) { @@ -185,7 +186,8 @@ public void visit(PlainSelect plainSelect) { } if (plainSelect.getWindowDefinitions() != null) { buffer.append(" WINDOW "); - buffer.append(plainSelect.getWindowDefinitions().stream().map(WindowDefinition::toString).collect(joining(", "))); + buffer.append(plainSelect.getWindowDefinitions().stream() + .map(WindowDefinition::toString).collect(joining(", "))); } if (plainSelect.getOrderByElements() != null) { new OrderByDeParser(expressionVisitor, buffer).deParse(plainSelect.isOracleSiblings(), @@ -198,10 +200,10 @@ public void visit(PlainSelect plainSelect) { new LimitDeparser(buffer).deParse(plainSelect.getLimit()); } if (plainSelect.getOffset() != null) { - deparseOffset(plainSelect.getOffset()); + visit(plainSelect.getOffset()); } if (plainSelect.getFetch() != null) { - deparseFetch(plainSelect.getFetch()); + visit(plainSelect.getFetch()); } if (plainSelect.getWithIsolation() != null) { buffer.append(plainSelect.getWithIsolation().toString()); @@ -251,7 +253,8 @@ public void visit(SubSelect subSelect) { buffer.append(subSelect.isUseBrackets() ? "(" : ""); if (subSelect.getWithItemsList() != null && !subSelect.getWithItemsList().isEmpty()) { buffer.append("WITH "); - for (Iterator iter = subSelect.getWithItemsList().iterator(); iter.hasNext();) { + for (Iterator iter = subSelect.getWithItemsList().iterator(); iter + .hasNext();) { WithItem withItem = iter.next(); withItem.accept(this); if (iter.hasNext()) { @@ -305,9 +308,12 @@ public void visit(Table tableName) { @Override public void visit(Pivot pivot) { List forColumns = pivot.getForColumns(); - buffer.append(" PIVOT (").append(PlainSelect.getStringList(pivot.getFunctionItems())).append(" FOR ") - .append(PlainSelect.getStringList(forColumns, true, forColumns != null && forColumns.size() > 1)) - .append(" IN ").append(PlainSelect.getStringList(pivot.getInItems(), true, true)).append(")"); + buffer.append(" PIVOT (").append(PlainSelect.getStringList(pivot.getFunctionItems())) + .append(" FOR ") + .append(PlainSelect.getStringList(forColumns, true, + forColumns != null && forColumns.size() > 1)) + .append(" IN ").append(PlainSelect.getStringList(pivot.getInItems(), true, true)) + .append(")"); if (pivot.getAlias() != null) { buffer.append(pivot.getAlias().toString()); } @@ -319,15 +325,16 @@ public void visit(UnPivot unpivot) { boolean includeNulls = unpivot.getIncludeNulls(); List unPivotClause = unpivot.getUnPivotClause(); List unpivotForClause = unpivot.getUnPivotForClause(); - buffer - .append(" UNPIVOT") - .append(showOptions && includeNulls ? " INCLUDE NULLS" : "") - .append(showOptions && !includeNulls ? " EXCLUDE NULLS" : "") - .append(" (").append(PlainSelect.getStringList(unPivotClause, true, - unPivotClause != null && unPivotClause.size() > 1)) - .append(" FOR ").append(PlainSelect.getStringList(unpivotForClause, true, - unpivotForClause != null && unpivotForClause.size() > 1)) - .append(" IN ").append(PlainSelect.getStringList(unpivot.getUnPivotInClause(), true, true)).append(")"); + buffer.append(" UNPIVOT").append(showOptions && includeNulls ? " INCLUDE NULLS" : "") + .append(showOptions && !includeNulls ? " EXCLUDE NULLS" : "").append(" (") + .append(PlainSelect.getStringList(unPivotClause, true, + unPivotClause != null && unPivotClause.size() > 1)) + .append(" FOR ") + .append(PlainSelect.getStringList(unpivotForClause, true, + unpivotForClause != null && unpivotForClause.size() > 1)) + .append(" IN ") + .append(PlainSelect.getStringList(unpivot.getUnPivotInClause(), true, true)) + .append(")"); if (unpivot.getAlias() != null) { buffer.append(unpivot.getAlias().toString()); } @@ -336,8 +343,9 @@ public void visit(UnPivot unpivot) { @Override public void visit(PivotXml pivot) { List forColumns = pivot.getForColumns(); - buffer.append(" PIVOT XML (").append(PlainSelect.getStringList(pivot.getFunctionItems())).append(" FOR ") - .append(PlainSelect.getStringList(forColumns, true, forColumns != null && forColumns.size() > 1)) + buffer.append(" PIVOT XML (").append(PlainSelect.getStringList(pivot.getFunctionItems())) + .append(" FOR ").append(PlainSelect.getStringList(forColumns, true, + forColumns != null && forColumns.size() > 1)) .append(" IN ("); if (pivot.isInAny()) { buffer.append("ANY"); @@ -349,18 +357,18 @@ public void visit(PivotXml pivot) { buffer.append("))"); } - public void deparseOffset(Offset offset) { + public void visit(Offset offset) { // OFFSET offset // or OFFSET offset (ROW | ROWS) buffer.append(" OFFSET "); - buffer.append(offset.getOffset()); + offset.getOffset().accept(expressionVisitor); if (offset.getOffsetParam() != null) { buffer.append(" ").append(offset.getOffsetParam()); } } - public void deparseFetch(Fetch fetch) { + public void visit(Fetch fetch) { // FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY buffer.append(" FETCH "); if (fetch.isFetchParamFirst()) { @@ -368,11 +376,7 @@ public void deparseFetch(Fetch fetch) { } else { buffer.append("NEXT "); } - if (fetch.getFetchJdbcParameter() != null) { - buffer.append(fetch.getFetchJdbcParameter().toString()); - } else { - buffer.append(fetch.getRowCount()); - } + fetch.getExpression().accept(expressionVisitor); buffer.append(" ").append(fetch.getFetchParam()).append(" ONLY"); } @@ -401,7 +405,7 @@ public void visit(SubJoin subjoin) { @SuppressWarnings({"PMD.CyclomaticComplexity"}) public void deparseJoin(Join join) { - if ( join.isGlobal() ) { + if (join.isGlobal()) { buffer.append(" GLOBAL "); } @@ -455,7 +459,8 @@ public void deparseJoin(Join join) { } if (join.getUsingColumns().size() > 0) { buffer.append(" USING ("); - for (Iterator iterator = join.getUsingColumns().iterator(); iterator.hasNext();) { + for (Iterator iterator = join.getUsingColumns().iterator(); iterator + .hasNext();) { Column column = iterator.next(); buffer.append(column.toString()); if (iterator.hasNext()) { @@ -490,10 +495,10 @@ public void visit(SetOperationList list) { new LimitDeparser(buffer).deParse(list.getLimit()); } if (list.getOffset() != null) { - deparseOffset(list.getOffset()); + visit(list.getOffset()); } if (list.getFetch() != null) { - deparseFetch(list.getFetch()); + visit(list.getFetch()); } if (list.getWithIsolation() != null) { buffer.append(list.getWithIsolation().toString()); @@ -507,7 +512,8 @@ public void visit(WithItem withItem) { } buffer.append(withItem.getName()); if (withItem.getWithItemList() != null) { - buffer.append(" ").append(PlainSelect.getStringList(withItem.getWithItemList(), true, true)); + buffer.append(" ") + .append(PlainSelect.getStringList(withItem.getWithItemList(), true, true)); } buffer.append(" AS "); @@ -517,8 +523,8 @@ public void visit(WithItem withItem) { buffer.append("(VALUES "); ExpressionList expressionList = (ExpressionList) itemsList; - buffer.append( - PlainSelect.getStringList(expressionList.getExpressions(), true, useBracketsForValues)); + buffer.append(PlainSelect.getStringList(expressionList.getExpressions(), true, + useBracketsForValues)); buffer.append(")"); } else { SubSelect subSelect = withItem.getSubSelect(); @@ -540,12 +546,14 @@ public void visit(LateralSubSelect lateralSubSelect) { @Override public void visit(ValuesList valuesList) { buffer.append("(VALUES "); - List expressionLists = valuesList.getMultiExpressionList().getExpressionLists(); + List expressionLists = + valuesList.getMultiExpressionList().getExpressionLists(); int n = expressionLists.size() - 1; int i = 0; for (ExpressionList expressionList : expressionLists) { - new ExpressionListDeParser(expressionVisitor, buffer, !valuesList.isNoBrackets(), true).deParse(expressionList.getExpressions()); - if (i implements ExpressionVisitor { +public class ExpressionValidator extends AbstractValidator + implements ExpressionVisitor { @Override public void visit(Addition addition) { visitBinaryExpression(addition, " + "); @@ -126,14 +127,16 @@ public void visit(BitwiseLeftShift expr) { visitBinaryExpression(expr, " << "); } - public void visitOldOracleJoinBinaryExpression(OldOracleJoinBinaryExpression expression, String operator) { + public void visitOldOracleJoinBinaryExpression(OldOracleJoinBinaryExpression expression, + String operator) { for (ValidationCapability c : getCapabilities()) { validateOptionalExpression(expression.getLeftExpression(), this); if (expression.getOldOracleJoinSyntax() != SupportsOldOracleJoinSyntax.NO_ORACLE_JOIN) { validateFeature(c, Feature.oracleOldJoinSyntax); } validateOptionalExpression(expression.getRightExpression(), this); - if (expression.getOraclePriorPosition() != SupportsOldOracleJoinSyntax.NO_ORACLE_PRIOR) { + if (expression + .getOraclePriorPosition() != SupportsOldOracleJoinSyntax.NO_ORACLE_PRIOR) { validateFeature(c, Feature.oraclePriorPosition); } } @@ -154,7 +157,8 @@ public void visit(GreaterThanEquals greaterThanEquals) { public void visit(InExpression inExpression) { for (ValidationCapability c : getCapabilities()) { validateOptionalExpression(inExpression.getLeftExpression(), this); - if (inExpression.getOldOracleJoinSyntax() != SupportsOldOracleJoinSyntax.NO_ORACLE_JOIN) { + if (inExpression + .getOldOracleJoinSyntax() != SupportsOldOracleJoinSyntax.NO_ORACLE_JOIN) { validateFeature(c, Feature.oracleOldJoinSyntax); } } @@ -190,8 +194,7 @@ public void visit(JdbcParameter jdbcParameter) { @Override public void visit(LikeExpression likeExpression) { validateFeature(Feature.exprLike); - visitBinaryExpression(likeExpression, - (likeExpression.isNot() ? " NOT" : "") + visitBinaryExpression(likeExpression, (likeExpression.isNot() ? " NOT" : "") + (likeExpression.isCaseInsensitive() ? " ILIKE " : " LIKE ")); } @@ -225,7 +228,8 @@ public void visit(Multiplication multiplication) { @Override public void visit(NotEqualsTo notEqualsTo) { - visitOldOracleJoinBinaryExpression(notEqualsTo, " " + notEqualsTo.getStringExpression() + " "); + visitOldOracleJoinBinaryExpression(notEqualsTo, + " " + notEqualsTo.getStringExpression() + " "); } @Override @@ -281,7 +285,12 @@ public void visit(Function function) { validateOptionalItemsList(function.getNamedParameters()); validateOptionalItemsList(function.getParameters()); - validateOptionalExpression(function.getAttribute(), this); + + Object attribute = function.getAttribute(); + if (attribute instanceof Expression) { + validateOptionalExpression((Expression) attribute, this); + } + validateOptionalExpression(function.getKeep(), this); validateOptionalOrderByElements(function.getOrderByElements()); } @@ -476,7 +485,7 @@ public void visit(RowConstructor rowConstructor) { if (rowConstructor.getColumnDefinitions().isEmpty()) { validateOptionalExpressionList(rowConstructor.getExprList()); } else { - for (ColumnDefinition columnDefinition: rowConstructor.getColumnDefinitions()) { + for (ColumnDefinition columnDefinition : rowConstructor.getColumnDefinitions()) { validateName(NamedObject.column, columnDefinition.getColumnName()); } } @@ -496,6 +505,7 @@ public void visit(OracleHint hint) { public void visit(TimeKeyExpression timeKeyExpression) { // nothing to validate } + @Override public void visit(DateTimeLiteralExpression literal) { // nothing to validate @@ -575,19 +585,17 @@ public void visit(JsonFunction expression) { public void visit(ConnectByRootOperator connectByRootOperator) { connectByRootOperator.getColumn().accept(this); } - + @Override public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) { oracleNamedFunctionParameter.getExpression().accept(this); } @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) { diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index fd7a8ada0..bd99ec238 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -503,7 +503,7 @@ TOKEN: // An is U+00B7, “Middle Dot”, or any character in the Unicode General Category classes “Mn”, “Mc”, “Nd”, “Pc”, or “Cf”. // unicode_identifier_start -| <#UnicodeIdentifierStart: ("\u00B7" | | | | | | ) > +| <#UnicodeIdentifierStart: ("\u00B7" | | | | | | |) > | <#Ll: ["a"-"z","µ","ß"-"ö","ø"-"ÿ","ā","ă","ą","ć","ĉ","ċ","č","ď","đ","ē","ĕ","ė","ę","ě","ĝ","ğ","ġ","ģ","ĥ","ħ","ĩ","ī","ĭ","į","ı","ij","ĵ","ķ"-"ĸ","ĺ","ļ","ľ","ŀ","ł","ń","ņ","ň"-"ʼn","ŋ","ō","ŏ","ő","œ","ŕ","ŗ","ř","ś","ŝ","ş","š","ţ","ť","ŧ","ũ","ū","ŭ","ů","ű","ų","ŵ","ŷ","ź","ż","ž"-"ƀ","ƃ","ƅ","ƈ","ƌ"-"ƍ","ƒ","ƕ","ƙ"-"ƛ","ƞ","ơ","ƣ","ƥ","ƨ","ƪ"-"ƫ","ƭ","ư","ƴ","ƶ","ƹ"-"ƺ","ƽ"-"ƿ","dž","lj","nj","ǎ","ǐ","ǒ","ǔ","ǖ","ǘ","ǚ","ǜ"-"ǝ","ǟ","ǡ","ǣ","ǥ","ǧ","ǩ","ǫ","ǭ","ǯ"-"ǰ","dz","ǵ","ǹ","ǻ","ǽ","ǿ","ȁ","ȃ","ȅ","ȇ","ȉ","ȋ","ȍ","ȏ","ȑ","ȓ","ȕ","ȗ","ș","ț","ȝ","ȟ","ȡ","ȣ","ȥ","ȧ","ȩ","ȫ","ȭ","ȯ","ȱ","ȳ"-"ȹ","ȼ","ȿ"-"ɀ","ɂ","ɇ","ɉ","ɋ","ɍ","ɏ"-"ʓ","ʕ"-"ʯ","ͱ","ͳ","ͷ","ͻ"-"ͽ","ΐ","ά"-"ώ","ϐ"-"ϑ","ϕ"-"ϗ","ϙ","ϛ","ϝ","ϟ","ϡ","ϣ","ϥ","ϧ","ϩ","ϫ","ϭ","ϯ"-"ϳ","ϵ","ϸ","ϻ"-"ϼ","а"-"џ","ѡ","ѣ","ѥ","ѧ","ѩ","ѫ","ѭ","ѯ","ѱ","ѳ","ѵ","ѷ","ѹ","ѻ","ѽ","ѿ","ҁ","ҋ","ҍ","ҏ","ґ","ғ","ҕ","җ","ҙ","қ","ҝ","ҟ","ҡ","ң","ҥ","ҧ","ҩ","ҫ","ҭ","ү","ұ","ҳ","ҵ","ҷ","ҹ","һ","ҽ","ҿ","ӂ","ӄ","ӆ","ӈ","ӊ","ӌ","ӎ"-"ӏ","ӑ","ӓ","ӕ","ӗ","ә","ӛ","ӝ","ӟ","ӡ","ӣ","ӥ","ӧ","ө","ӫ","ӭ","ӯ","ӱ","ӳ","ӵ","ӷ","ӹ","ӻ","ӽ","ӿ","ԁ","ԃ","ԅ","ԇ","ԉ","ԋ","ԍ","ԏ","ԑ","ԓ","ԕ","ԗ","ԙ","ԛ","ԝ","ԟ","ԡ","ԣ","ԥ","ԧ","ԩ","ԫ","ԭ","ԯ","ՠ"-"ֈ","ა"-"ჺ","ჽ"-"ჿ","ᏸ"-"ᏽ","ᲀ"-"ᲈ","ᴀ"-"ᴫ","ᵫ"-"ᵷ","ᵹ"-"ᶚ","ḁ","ḃ","ḅ","ḇ","ḉ","ḋ","ḍ","ḏ","ḑ","ḓ","ḕ","ḗ","ḙ","ḛ","ḝ","ḟ","ḡ","ḣ","ḥ","ḧ","ḩ","ḫ","ḭ","ḯ","ḱ","ḳ","ḵ","ḷ","ḹ","ḻ","ḽ","ḿ","ṁ","ṃ","ṅ","ṇ","ṉ","ṋ","ṍ","ṏ","ṑ","ṓ","ṕ","ṗ","ṙ","ṛ","ṝ","ṟ","ṡ","ṣ","ṥ","ṧ","ṩ","ṫ","ṭ","ṯ","ṱ","ṳ","ṵ","ṷ","ṹ","ṻ","ṽ","ṿ","ẁ","ẃ","ẅ","ẇ","ẉ","ẋ","ẍ","ẏ","ẑ","ẓ","ẕ"-"ẝ","ẟ","ạ","ả","ấ","ầ","ẩ","ẫ","ậ","ắ","ằ","ẳ","ẵ","ặ","ẹ","ẻ","ẽ","ế","ề","ể","ễ","ệ","ỉ","ị","ọ","ỏ","ố","ồ","ổ","ỗ","ộ","ớ","ờ","ở","ỡ","ợ","ụ","ủ","ứ","ừ","ử","ữ","ự","ỳ","ỵ","ỷ","ỹ","ỻ","ỽ","ỿ"-"ἇ","ἐ"-"ἕ","ἠ"-"ἧ","ἰ"-"ἷ","ὀ"-"ὅ","ὐ"-"ὗ","ὠ"-"ὧ","ὰ"-"ώ","ᾀ"-"ᾇ","ᾐ"-"ᾗ","ᾠ"-"ᾧ","ᾰ"-"ᾴ","ᾶ"-"ᾷ","ι","ῂ"-"ῄ","ῆ"-"ῇ","ῐ"-"ΐ","ῖ"-"ῗ","ῠ"-"ῧ","ῲ"-"ῴ","ῶ"-"ῷ","ℊ","ℎ"-"ℏ","ℓ","ℯ","ℴ","ℹ","ℼ"-"ℽ","ⅆ"-"ⅉ","ⅎ","ↄ","ⰰ"-"ⱟ","ⱡ","ⱥ"-"ⱦ","ⱨ","ⱪ","ⱬ","ⱱ","ⱳ"-"ⱴ","ⱶ"-"ⱻ","ⲁ","ⲃ","ⲅ","ⲇ","ⲉ","ⲋ","ⲍ","ⲏ","ⲑ","ⲓ","ⲕ","ⲗ","ⲙ","ⲛ","ⲝ","ⲟ","ⲡ","ⲣ","ⲥ","ⲧ","ⲩ","ⲫ","ⲭ","ⲯ","ⲱ","ⲳ","ⲵ","ⲷ","ⲹ","ⲻ","ⲽ","ⲿ","ⳁ","ⳃ","ⳅ","ⳇ","ⳉ","ⳋ","ⳍ","ⳏ","ⳑ","ⳓ","ⳕ","ⳗ","ⳙ","ⳛ","ⳝ","ⳟ","ⳡ","ⳣ"-"ⳤ","ⳬ","ⳮ","ⳳ","ⴀ"-"ⴥ","ⴧ","ⴭ","ꙁ","ꙃ","ꙅ","ꙇ","ꙉ","ꙋ","ꙍ","ꙏ","ꙑ","ꙓ","ꙕ","ꙗ","ꙙ","ꙛ","ꙝ","ꙟ","ꙡ","ꙣ","ꙥ","ꙧ","ꙩ","ꙫ","ꙭ","ꚁ","ꚃ","ꚅ","ꚇ","ꚉ","ꚋ","ꚍ","ꚏ","ꚑ","ꚓ","ꚕ","ꚗ","ꚙ","ꚛ","ꜣ","ꜥ","ꜧ","ꜩ","ꜫ","ꜭ","ꜯ"-"ꜱ","ꜳ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ꜿ","ꝁ","ꝃ","ꝅ","ꝇ","ꝉ","ꝋ","ꝍ","ꝏ","ꝑ","ꝓ","ꝕ","ꝗ","ꝙ","ꝛ","ꝝ","ꝟ","ꝡ","ꝣ","ꝥ","ꝧ","ꝩ","ꝫ","ꝭ","ꝯ","ꝱ"-"ꝸ","ꝺ","ꝼ","ꝿ","ꞁ","ꞃ","ꞅ","ꞇ","ꞌ","ꞎ","ꞑ","ꞓ"-"ꞕ","ꞗ","ꞙ","ꞛ","ꞝ","ꞟ","ꞡ","ꞣ","ꞥ","ꞧ","ꞩ","ꞯ","ꞵ","ꞷ","ꞹ","ꞻ","ꞽ","ꞿ","ꟁ","ꟃ","ꟈ","ꟊ","ꟑ","ꟓ","ꟕ","ꟗ","ꟙ","ꟶ","ꟺ","ꬰ"-"ꭚ","ꭠ"-"ꭨ","ꭰ"-"ꮿ","ff"-"st","ﬓ"-"ﬗ","a"-"z"]> | <#Lm: ["ʰ"-"ˁ","ˆ"-"ˑ","ˠ"-"ˤ","ˬ","ˮ","ʹ","ͺ","ՙ","ـ","ۥ"-"ۦ","ߴ"-"ߵ","ߺ","ࠚ","ࠤ","ࠨ","ࣉ","ॱ","ๆ","ໆ","ჼ","ៗ","ᡃ","ᪧ","ᱸ"-"ᱽ","ᴬ"-"ᵪ","ᵸ","ᶛ"-"ᶿ","ⁱ","ⁿ","ₐ"-"ₜ","ⱼ"-"ⱽ","ⵯ","ⸯ","々","〱"-"〵","〻","ゝ"-"ゞ","ー"-"ヾ","ꀕ","ꓸ"-"ꓽ","ꘌ","ꙿ","ꚜ"-"ꚝ","ꜗ"-"ꜟ","ꝰ","ꞈ","ꟲ"-"ꟴ","ꟸ"-"ꟹ","ꧏ","ꧦ","ꩰ","ꫝ","ꫳ"-"ꫴ","ꭜ"-"ꭟ","ꭩ","ー","゙"-"゚"]> | <#Lo: ["ª","º","ƻ","ǀ"-"ǃ","ʔ","א"-"ת","ׯ"-"ײ","ؠ"-"ؿ","ف"-"ي","ٮ"-"ٯ","ٱ"-"ۓ","ە","ۮ"-"ۯ","ۺ"-"ۼ","ۿ","ܐ","ܒ"-"ܯ","ݍ"-"ޥ","ޱ","ߊ"-"ߪ","ࠀ"-"ࠕ","ࡀ"-"ࡘ","ࡠ"-"ࡪ","ࡰ"-"ࢇ","ࢉ"-"ࢎ","ࢠ"-"ࣈ","ऄ"-"ह","ऽ","ॐ","क़"-"ॡ","ॲ"-"ঀ","অ"-"ঌ","এ"-"ঐ","ও"-"ন","প"-"র","ল","শ"-"হ","ঽ","ৎ","ড়"-"ঢ়","য়"-"ৡ","ৰ"-"ৱ","ৼ","ਅ"-"ਊ","ਏ"-"ਐ","ਓ"-"ਨ","ਪ"-"ਰ","ਲ"-"ਲ਼","ਵ"-"ਸ਼","ਸ"-"ਹ","ਖ਼"-"ੜ","ਫ਼","ੲ"-"ੴ","અ"-"ઍ","એ"-"ઑ","ઓ"-"ન","પ"-"ર","લ"-"ળ","વ"-"હ","ઽ","ૐ","ૠ"-"ૡ","ૹ","ଅ"-"ଌ","ଏ"-"ଐ","ଓ"-"ନ","ପ"-"ର","ଲ"-"ଳ","ଵ"-"ହ","ଽ","ଡ଼"-"ଢ଼","ୟ"-"ୡ","ୱ","ஃ","அ"-"ஊ","எ"-"ஐ","ஒ"-"க","ங"-"ச","ஜ","ஞ"-"ட","ண"-"த","ந"-"ப","ம"-"ஹ","ௐ","అ"-"ఌ","ఎ"-"ఐ","ఒ"-"న","ప"-"హ","ఽ","ౘ"-"ౚ","ౝ","ౠ"-"ౡ","ಀ","ಅ"-"ಌ","ಎ"-"ಐ","ಒ"-"ನ","ಪ"-"ಳ","ವ"-"ಹ","ಽ","ೝ"-"ೞ","ೠ"-"ೡ","ೱ"-"ೲ","ഄ"-"ഌ","എ"-"ഐ","ഒ"-"ഺ","ഽ","ൎ","ൔ"-"ൖ","ൟ"-"ൡ","ൺ"-"ൿ","අ"-"ඖ","ක"-"න","ඳ"-"ර","ල","ව"-"ෆ","ก"-"ะ","า"-"ำ","เ"-"ๅ","ກ"-"ຂ","ຄ","ຆ"-"ຊ","ຌ"-"ຣ","ລ","ວ"-"ະ","າ"-"ຳ","ຽ","ເ"-"ໄ","ໜ"-"ໟ","ༀ","ཀ"-"ཇ","ཉ"-"ཬ","ྈ"-"ྌ","က"-"ဪ","ဿ","ၐ"-"ၕ","ၚ"-"ၝ","ၡ","ၥ"-"ၦ","ၮ"-"ၰ","ၵ"-"ႁ","ႎ","ᄀ"-"ቈ","ቊ"-"ቍ","ቐ"-"ቖ","ቘ","ቚ"-"ቝ","በ"-"ኈ","ኊ"-"ኍ","ነ"-"ኰ","ኲ"-"ኵ","ኸ"-"ኾ","ዀ","ዂ"-"ዅ","ወ"-"ዖ","ዘ"-"ጐ","ጒ"-"ጕ","ጘ"-"ፚ","ᎀ"-"ᎏ","ᐁ"-"ᙬ","ᙯ"-"ᙿ","ᚁ"-"ᚚ","ᚠ"-"ᛪ","ᛱ"-"ᛸ","ᜀ"-"ᜑ","ᜟ"-"ᜱ","ᝀ"-"ᝑ","ᝠ"-"ᝬ","ᝮ"-"ᝰ","ក"-"ឳ","ៜ","ᠠ"-"ᡂ","ᡄ"-"ᡸ","ᢀ"-"ᢄ","ᢇ"-"ᢨ","ᢪ","ᢰ"-"ᣵ","ᤀ"-"ᤞ","ᥐ"-"ᥭ","ᥰ"-"ᥴ","ᦀ"-"ᦫ","ᦰ"-"ᧉ","ᨀ"-"ᨖ","ᨠ"-"ᩔ","ᬅ"-"ᬳ","ᭅ"-"ᭌ","ᮃ"-"ᮠ","ᮮ"-"ᮯ","ᮺ"-"ᯥ","ᰀ"-"ᰣ","ᱍ"-"ᱏ","ᱚ"-"ᱷ","ᳩ"-"ᳬ","ᳮ"-"ᳳ","ᳵ"-"ᳶ","ᳺ","ℵ"-"ℸ","ⴰ"-"ⵧ","ⶀ"-"ⶖ","ⶠ"-"ⶦ","ⶨ"-"ⶮ","ⶰ"-"ⶶ","ⶸ"-"ⶾ","ⷀ"-"ⷆ","ⷈ"-"ⷎ","ⷐ"-"ⷖ","ⷘ"-"ⷞ","〆","〼","ぁ"-"ゖ","ゟ","ァ"-"ヺ","ヿ","ㄅ"-"ㄯ","ㄱ"-"ㆎ","ㆠ"-"ㆿ","ㇰ"-"ㇿ","䶿","鿿"-"ꀔ","ꀖ"-"ꒌ","ꓐ"-"ꓷ","ꔀ"-"ꘋ","ꘐ"-"ꘟ","ꘪ"-"ꘫ","ꙮ","ꚠ"-"ꛥ","ꞏ","ꟷ","ꟻ"-"ꠁ","ꠃ"-"ꠅ","ꠇ"-"ꠊ","ꠌ"-"ꠢ","ꡀ"-"ꡳ","ꢂ"-"ꢳ","ꣲ"-"ꣷ","ꣻ","ꣽ"-"ꣾ","ꤊ"-"ꤥ","ꤰ"-"ꥆ","ꥠ"-"ꥼ","ꦄ"-"ꦲ","ꧠ"-"ꧤ","ꧧ"-"ꧯ","ꧺ"-"ꧾ","ꨀ"-"ꨨ","ꩀ"-"ꩂ","ꩄ"-"ꩋ","ꩠ"-"ꩯ","ꩱ"-"ꩶ","ꩺ","ꩾ"-"ꪯ","ꪱ","ꪵ"-"ꪶ","ꪹ"-"ꪽ","ꫀ","ꫂ","ꫛ"-"ꫜ","ꫠ"-"ꫪ","ꫲ","ꬁ"-"ꬆ","ꬉ"-"ꬎ","ꬑ"-"ꬖ","ꬠ"-"ꬦ","ꬨ"-"ꬮ","ꯀ"-"ꯢ","힣","ힰ"-"ퟆ","ퟋ"-"ퟻ","豈"-"舘","並"-"龎","יִ","ײַ"-"ﬨ","שׁ"-"זּ","טּ"-"לּ","מּ","נּ"-"סּ","ףּ"-"פּ","צּ"-"ﮱ","ﯓ"-"ﴽ","ﵐ"-"ﶏ","ﶒ"-"ﷇ","ﷰ"-"ﷻ","ﹰ"-"ﹴ","ﹶ"-"ﻼ","ヲ"-"ッ","ア"-"ン","ᅠ"-"ᄒ","ᅡ"-"ᅦ","ᅧ"-"ᅬ","ᅭ"-"ᅲ","ᅳ"-"ᅵ"]> @@ -512,13 +512,16 @@ TOKEN: | <#Nl: ["ᛮ"-"ᛰ","Ⅰ"-"ↂ","ↅ"-"ↈ","〇","〡"-"〩","〸"-"〺","ꛦ"-"ꛯ"]> // unicode_identifier_extend -| <#UnicodeIdentifierExtend: (||||)> +| <#UnicodeIdentifierExtend: (|||||)> | <#Cf: ["­","؀"-"؅","؜","۝","܏","࢐"-"࢑","࣢","᠎","​"-"‏","‪"-"‮","⁠"-"⁤","⁦"-"","",""-""]> | <#Mc: ["ः","ऻ","ा"-"ी","ॉ"-"ौ","ॎ"-"ॏ","ং"-"ঃ","া"-"ী","ে"-"ৈ","ো"-"ৌ","ৗ","ਃ","ਾ"-"ੀ","ઃ","ા"-"ી","ૉ","ો"-"ૌ","ଂ"-"ଃ","ା","ୀ","େ"-"ୈ","ୋ"-"ୌ","ୗ","ா"-"ி","ு"-"ூ","ெ"-"ை","ொ"-"ௌ","ௗ","ఁ"-"ః","ు"-"ౄ","ಂ"-"ಃ","ಾ","ೀ"-"ೄ","ೇ"-"ೈ","ೊ"-"ೋ","ೕ"-"ೖ","ೳ","ം"-"ഃ","ാ"-"ീ","െ"-"ൈ","ൊ"-"ൌ","ൗ","ං"-"ඃ","ා"-"ෑ","ෘ"-"ෟ","ෲ"-"ෳ","༾"-"༿","ཿ","ါ"-"ာ","ေ","း","ျ"-"ြ","ၖ"-"ၗ","ၢ"-"ၤ","ၧ"-"ၭ","ႃ"-"ႄ","ႇ"-"ႌ","ႏ","ႚ"-"ႜ","᜕","᜴","ា","ើ"-"ៅ","ះ"-"ៈ","ᤣ"-"ᤦ","ᤩ"-"ᤫ","ᤰ"-"ᤱ","ᤳ"-"ᤸ","ᨙ"-"ᨚ","ᩕ","ᩗ","ᩡ","ᩣ"-"ᩤ","ᩭ"-"ᩲ","ᬄ","ᬵ","ᬻ","ᬽ"-"ᭁ","ᭃ"-"᭄","ᮂ","ᮡ","ᮦ"-"ᮧ","᮪","ᯧ","ᯪ"-"ᯬ","ᯮ","᯲"-"᯳","ᰤ"-"ᰫ","ᰴ"-"ᰵ","᳡","᳷","〮"-"〯","ꠣ"-"ꠤ","ꠧ","ꢀ"-"ꢁ","ꢴ"-"ꣃ","ꥒ"-"꥓","ꦃ","ꦴ"-"ꦵ","ꦺ"-"ꦻ","ꦾ"-"꧀","ꨯ"-"ꨰ","ꨳ"-"ꨴ","ꩍ","ꩻ","ꩽ","ꫫ","ꫮ"-"ꫯ","ꫵ","ꯣ"-"ꯤ","ꯦ"-"ꯧ","ꯩ"-"ꯪ","꯬"]> | <#Mn: ["̀"-"ͯ","҃"-"҇","֑"-"ֽ","ֿ","ׁ"-"ׂ","ׄ"-"ׅ","ׇ","ؐ"-"ؚ","ً"-"ٟ","ٰ","ۖ"-"ۜ","۟"-"ۤ","ۧ"-"ۨ","۪"-"ۭ","ܑ","ܰ"-"݊","ަ"-"ް","߫"-"߳","߽","ࠖ"-"࠙","ࠛ"-"ࠣ","ࠥ"-"ࠧ","ࠩ"-"࠭","࡙"-"࡛","࢘"-"࢟","࣊"-"࣡","ࣣ"-"ं","ऺ","़","ु"-"ै","्","॑"-"ॗ","ॢ"-"ॣ","ঁ","়","ু"-"ৄ","্","ৢ"-"ৣ","৾","ਁ"-"ਂ","਼","ੁ"-"ੂ","ੇ"-"ੈ","ੋ"-"੍","ੑ","ੰ"-"ੱ","ੵ","ઁ"-"ં","઼","ુ"-"ૅ","ે"-"ૈ","્","ૢ"-"ૣ","ૺ"-"૿","ଁ","଼","ି","ୁ"-"ୄ","୍","୕"-"ୖ","ୢ"-"ୣ","ஂ","ீ","்","ఀ","ఄ","఼","ా"-"ీ","ె"-"ై","ొ"-"్","ౕ"-"ౖ","ౢ"-"ౣ","ಁ","಼","ಿ","ೆ","ೌ"-"್","ೢ"-"ೣ","ഀ"-"ഁ","഻"-"഼","ു"-"ൄ","്","ൢ"-"ൣ","ඁ","්","ි"-"ු","ූ","ั","ิ"-"ฺ","็"-"๎","ັ","ິ"-"ຼ","່"-"໎","༘"-"༙","༵","༷","༹","ཱ"-"ཾ","ྀ"-"྄","྆"-"྇","ྍ"-"ྗ","ྙ"-"ྼ","࿆","ိ"-"ူ","ဲ"-"့","္"-"်","ွ"-"ှ","ၘ"-"ၙ","ၞ"-"ၠ","ၱ"-"ၴ","ႂ","ႅ"-"ႆ","ႍ","ႝ","፝"-"፟","ᜒ"-"᜔","ᜲ"-"ᜳ","ᝒ"-"ᝓ","ᝲ"-"ᝳ","឴"-"឵","ិ"-"ួ","ំ","៉"-"៓","៝","᠋"-"᠍","᠏","ᢅ"-"ᢆ","ᢩ","ᤠ"-"ᤢ","ᤧ"-"ᤨ","ᤲ","᤹"-"᤻","ᨗ"-"ᨘ","ᨛ","ᩖ","ᩘ"-"ᩞ","᩠","ᩢ","ᩥ"-"ᩬ","ᩳ"-"᩼","᩿","᪰"-"᪽","ᪿ"-"ᫎ","ᬀ"-"ᬃ","᬴","ᬶ"-"ᬺ","ᬼ","ᭂ","᭫"-"᭳","ᮀ"-"ᮁ","ᮢ"-"ᮥ","ᮨ"-"ᮩ","᮫"-"ᮭ","᯦","ᯨ"-"ᯩ","ᯭ","ᯯ"-"ᯱ","ᰬ"-"ᰳ","ᰶ"-"᰷","᳐"-"᳒","᳔"-"᳠","᳢"-"᳨","᳭","᳴","᳸"-"᳹","᷀"-"᷿","⃐"-"⃜","⃡","⃥"-"⃰","⳯"-"⳱","⵿","ⷠ"-"ⷿ","〪"-"〭","゙"-"゚","꙯","ꙴ"-"꙽","ꚞ"-"ꚟ","꛰"-"꛱","ꠂ","꠆","ꠋ","ꠥ"-"ꠦ","꠬","꣄"-"ꣅ","꣠"-"꣱","ꣿ","ꤦ"-"꤭","ꥇ"-"ꥑ","ꦀ"-"ꦂ","꦳","ꦶ"-"ꦹ","ꦼ"-"ꦽ","ꧥ","ꨩ"-"ꨮ","ꨱ"-"ꨲ","ꨵ"-"ꨶ","ꩃ","ꩌ","ꩼ","ꪰ","ꪲ"-"ꪴ","ꪷ"-"ꪸ","ꪾ"-"꪿","꫁","ꫬ"-"ꫭ","꫶","ꯥ","ꯨ","꯭","ﬞ","︀"-"️","︠"-"︯"]> | <#Nd: ["0"-"9","٠"-"٩","۰"-"۹","߀"-"߉","०"-"९","০"-"৯","੦"-"੯","૦"-"૯","୦"-"୯","௦"-"௯","౦"-"౯","೦"-"೯","൦"-"൯","෦"-"෯","๐"-"๙","໐"-"໙","༠"-"༩","၀"-"၉","႐"-"႙","០"-"៩","᠐"-"᠙","᥆"-"᥏","᧐"-"᧙","᪀"-"᪉","᪐"-"᪙","᭐"-"᭙","᮰"-"᮹","᱀"-"᱉","᱐"-"᱙","꘠"-"꘩","꣐"-"꣙","꤀"-"꤉","꧐"-"꧙","꧰"-"꧹","꩐"-"꩙","꯰"-"꯹","0"-"9"]> | <#Pc: ["‿"-"⁀","⁔","︳"-"︴","﹍"-"﹏","_"]> +// CJK Unified Ideographs block according to https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) +| <#CJK: ["\u4E00"-"\u9FFF"]> + | < #SPECIAL_ESC: "\\'" > /* Allowing this will break LIKE ... ESCAPE ... */ | < #ESC: "\\" ["n","t","b","r","f","\\","\""] > | < S_CHAR_LITERAL: (["U","E","N","R","B"]|"RB"|"_utf8")? @@ -3079,19 +3082,15 @@ Fetch Fetch(): { Fetch fetch = new Fetch(); Token token = null; - JdbcParameter jdbc; + Expression expression; } { ( - // sqlserver-oracle-> FETCH (FIRST | NEXT) row_count (ROW | ROWS) ONLY - - ( { fetch.setFetchParamFirst(true); } | ) - (token= { fetch.setRowCount(Long.parseLong(token.image)); } - | jdbc = SimpleJdbcParameter() { fetch.setFetchJdbcParameter(jdbc); } ) /* "?" { fetch.setFetchJdbcParameter(true); } ) */ - ( { fetch.setFetchParam("ROWS"); } | ) - - - ) + // sqlserver-oracle-> FETCH (FIRST | NEXT) expression (ROW | ROWS) ONLY + ( { fetch.setFetchParamFirst(true); } | ) + expression = Expression() { fetch.setExpression(expression); } + ( { fetch.setFetchParam("ROWS"); } | ) + ) { return fetch; } @@ -4930,7 +4929,7 @@ Function SpecialStringFunctionWithNamedParameters() : Function InternalFunction(Function retval) : { List funcName; - String tmp = null; + Expression allColumnsExpression = null; List expressions = new ArrayList(); ExpressionList expressionList = null; NamedExpressionList namedExpressionList = null; @@ -4938,7 +4937,8 @@ Function InternalFunction(Function retval) : SubSelect expr = null; Token tk1 = null; Token tk2 = null; - Expression expr1 = null; + Expression attributeExpression = null; + Column attributeColumn = null; List orderByList; boolean ignoreNulls = false; } @@ -4947,9 +4947,9 @@ Function InternalFunction(Function retval) : "(" [ LOOKAHEAD(2) [ LOOKAHEAD(2)( { retval.setDistinct(true); } | { retval.setAllColumns(true); } | { retval.setUnique(true); }) ] ( LOOKAHEAD(4) - "*" { expr1 = new AllColumns(); expressionList = new ExpressionList(expr1).withUsingBrackets(false); } + "*" { allColumnsExpression = new AllColumns(); expressionList = new ExpressionList(allColumnsExpression).withUsingBrackets(false); } | - LOOKAHEAD(AllTableColumns()) expr1=AllTableColumns() { expressionList = new ExpressionList(expr1).withUsingBrackets(false); } + LOOKAHEAD(AllTableColumns()) allColumnsExpression=AllTableColumns() { expressionList = new ExpressionList(allColumnsExpression).withUsingBrackets(false); } | LOOKAHEAD(3, { getAsBoolean(Feature.allowComplexParsing) }) (expressionList=ComplexExpressionList() {expressionList.setUsingBrackets(false);} [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ]) | @@ -4962,8 +4962,12 @@ Function InternalFunction(Function retval) : ")" [ "." ( - LOOKAHEAD(2) expr1=Function() { retval.setAttribute(expr1); } - | tmp=RelObjectName() { retval.setAttributeName(tmp); } + // tricky lookahead since we do need to support the following constructs + // schema.f1().f2() - Function with Function Column + // schema.f1().f2.f3 - Function with Attribute Column + LOOKAHEAD( Function() ) attributeExpression=Function() { retval.setAttribute(attributeExpression); } + | + attributeColumn=Column() { retval.setAttribute(attributeColumn); } ) ] diff --git a/src/main/resources/rr/xhtml2rst.xsl b/src/main/resources/rr/xhtml2rst.xsl index 621ca66f6..918685a4f 100644 --- a/src/main/resources/rr/xhtml2rst.xsl +++ b/src/main/resources/rr/xhtml2rst.xsl @@ -92,12 +92,12 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
  • - + - - + + - +
  • diff --git a/src/site/sphinx/changelog.rst b/src/site/sphinx/changelog.rst index 899d66cdd..af003fb7d 100644 --- a/src/site/sphinx/changelog.rst +++ b/src/site/sphinx/changelog.rst @@ -8,779 +8,850 @@ Latest Changes since |JSQLPARSER_VERSION| ============================================================= -* **doc: Better integration of the RR diagrams** - + * **test: commit missing test** + + Andreas Reichel, 2023-03-07 + * **style: apply Spotless** + + Andreas Reichel, 2023-03-07 + * **feat: FETCH uses EXPRESSION** + + Andreas Reichel, 2023-03-07 + * **version 4.7-SNAPSHOT** + + Tobias Warneke, 2023-02-23 + * **[maven-release-plugin] prepare for next development iteration** + + Tobias Warneke, 2023-02-23 + * **feat: Support more Statement Separators** + + Andreas Reichel, 2023-02-02 + * **Update issue templates** + + manticore-projects, 2023-02-01 + * **Update issue templates** + + manticore-projects, 2023-02-01 + * **doc: fix the issue template** + + Andreas Reichel, 2023-02-01 + * **feat: CREATE VIEW ... REFRESH AUTO...** + + Andreas Reichel, 2023-01-30 + * **style: Appease PMD/Codacy** + + Andreas Reichel, 2023-01-29 + * **feat: Oracle Alternative Quoting** + + Andreas Reichel, 2023-01-29 + * **doc: Better integration of the RR diagrams** + Andreas Reichel, 2023-01-21 -* **feat: make important Classes Serializable** - + * **feat: make important Classes Serializable** + Andreas Reichel, 2023-01-21 -* **chore: Make Serializable** - + * **chore: Make Serializable** + Andreas Reichel, 2023-01-21 -* **doc: request for `Conventional Commit` messages** - + * **doc: request for `Conventional Commit` messages** + Andreas Reichel, 2023-01-21 -* **Sphinx Documentation** - + * **Sphinx Documentation** + Andreas Reichel, 2023-01-21 -* **Define Reserved Keywords explicitly** - + * **Define Reserved Keywords explicitly** + Andreas Reichel, 2023-01-21 -* **Adjust Gradle to JUnit 5** - + * **Adjust Gradle to JUnit 5** + Andreas Reichel, 2023-01-21 -* **Enhanced Keywords** - + * **Enhanced Keywords** + Andreas Reichel, 2023-01-21 -* **Remove unused imports** - + * **Remove unused imports** + Andreas Reichel, 2023-01-21 -* **Fix test resources** - + * **Fix test resources** + Andreas Reichel, 2023-01-21 -* **Do not mark SpeedTest for concurrent execution** - + * **Do not mark SpeedTest for concurrent execution** + Andreas Reichel, 2023-01-21 -* **Fix incorrect tests** - + * **Fix incorrect tests** + Andreas Reichel, 2023-01-21 -* **Remove unused imports** - + * **Remove unused imports** + Andreas Reichel, 2023-01-21 -* **Adjust Gradle to JUnit 5** - + * **Adjust Gradle to JUnit 5** + Andreas Reichel, 2023-01-21 -* **Do not mark SpeedTest for concurrent execution** - + * **Do not mark SpeedTest for concurrent execution** + Andreas Reichel, 2023-01-21 -* **Sphinx Website (#1624)** + * **Reduce cyclomatic complexity in CreateView.toString** + + zaza, 2023-01-08 + * **Fixes #1684: Support CREATE MATERIALIZED VIEW with AUTO REFRESH** + + zaza, 2022-12-11 + +Version jsqlparser-4.6 +============================================================= - manticore-projects, 2023-01-20 -* **Assorted Fixes #5 (#1715)** + * **[maven-release-plugin] prepare release jsqlparser-4.6** + + Tobias Warneke, 2023-02-23 + * **actualized release plugin** + + Tobias Warneke, 2023-02-23 + * **actualized release plugin** + + Tobias Warneke, 2023-02-23 + * **Update build.gradle** + + Tobias, 2023-02-17 + * **Update README.md** + + Tobias, 2023-02-17 + * **Oracle Alternative Quoting (#1722)** + + manticore-projects, 2023-02-07 + * **Issue1673 case within brackets (#1675)** + + manticore-projects, 2023-01-31 + * **Added support for SHOW INDEX from table (#1704)** + + Jayant Kumar Yadav, 2023-01-31 + * **Sphinx Website (#1624)** + manticore-projects, 2023-01-20 -* **Support DROP MATERIALIZED VIEW statements (#1711)** - + * **Assorted Fixes #5 (#1715)** + + manticore-projects, 2023-01-20 + * **Support DROP MATERIALIZED VIEW statements (#1711)** + Tomasz Zarna, 2023-01-12 -* **corrected readme** - + * **corrected readme** + Tobias Warneke, 2023-01-04 -* **Update README.md** - + * **Update README.md** + Tobias, 2022-12-27 -* **Fix #1686: add support for creating views with "IF NOT EXISTS" clause (#1690)** - + * **Fix #1686: add support for creating views with "IF NOT EXISTS" clause (#1690)** + Tomasz Zarna, 2022-12-22 -* **Assorted Fixes #4 (#1676)** - + * **Assorted Fixes #4 (#1676)** + manticore-projects, 2022-12-22 -* **Fixed download war script in the renderRR task (#1659)** - + * **Fixed download war script in the renderRR task (#1659)** + haha1903, 2022-12-10 -* **Assorted fixes (#1666)** - + * **Assorted fixes (#1666)** + manticore-projects, 2022-11-20 -* **Fix parsing statements with multidimensional array PR2 (#1665)** - + * **Fix parsing statements with multidimensional array PR2 (#1665)** + manticore-projects, 2022-11-20 -* **removed disabled from Keyword tests and imports** - + * **removed disabled from Keyword tests and imports** + Tobias Warneke, 2022-11-02 -* **removed disabled from Keyword tests** - + * **removed disabled from Keyword tests** + Tobias Warneke, 2022-11-02 -* **Keywords2: Update whitelisted Keywords (#1653)** - + * **Keywords2: Update whitelisted Keywords (#1653)** + manticore-projects, 2022-11-02 -* **Enhanced Keywords (#1382)** - + * **Enhanced Keywords (#1382)** + manticore-projects, 2022-10-25 -* **#1610 Support for SKIP LOCKED tokens on SELECT statements (#1649)** - + * **#1610 Support for SKIP LOCKED tokens on SELECT statements (#1649)** + Lucas Dillmann, 2022-10-25 -* **Assorted fixes (#1646)** - + * **Assorted fixes (#1646)** + manticore-projects, 2022-10-16 -* **actualized multiple dependencies** - + * **actualized multiple dependencies** + Tobias Warneke, 2022-09-28 -* **Bump h2 from 1.4.200 to 2.1.210 (#1639)** - + * **Bump h2 from 1.4.200 to 2.1.210 (#1639)** + dependabot[bot], 2022-09-28 -* **Support BigQuery SAFE_CAST (#1622) (#1634)** - + * **Support BigQuery SAFE_CAST (#1622) (#1634)** + dequn, 2022-09-20 -* **fix: add missing public Getter (#1632)** - + * **fix: add missing public Getter (#1632)** + manticore-projects, 2022-09-20 -* **Support timestamptz dateliteral (#1621)** - + * **Support timestamptz dateliteral (#1621)** + Todd Pollak, 2022-08-31 -* **fixes #1617** - + * **fixes #1617** + Tobias Warneke, 2022-08-31 -* **fixes #419** - + * **fixes #419** + Tobias Warneke, 2022-08-31 -* **Closes #1604, added simple OVERLAPS support (#1611)** - + * **Closes #1604, added simple OVERLAPS support (#1611)** + Rob Audenaerde, 2022-08-16 -* **Fixes PR #1524 support hive alter sql (#1609)** - + * **Fixes PR #1524 support hive alter sql (#1609)** + manticore-projects, 2022-08-14 -* **#1524 support hive alter sql : ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) (#1605)** - + * **#1524 support hive alter sql : ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...]) (#1605)** + Zhumin-lv-wn, 2022-08-03 -* **fixes #1581** - + * **fixes #1581** + Tobias Warneke, 2022-07-25 -* **Using own Feature - constant for "delete with returning" #1597 (#1598)** - + * **Using own Feature - constant for "delete with returning" #1597 (#1598)** + gitmotte, 2022-07-25 -* **[maven-release-plugin] prepare for next development iteration** - + * **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2022-07-22 Version jsqlparser-4.5 ============================================================= -* **[maven-release-plugin] prepare release jsqlparser-4.5** - + * **[maven-release-plugin] prepare release jsqlparser-4.5** + Tobias Warneke, 2022-07-22 -* **introduced changelog generator** - + * **introduced changelog generator** + Tobias Warneke, 2022-07-22 -* **fixes #1596** - + * **fixes #1596** + Tobias Warneke, 2022-07-22 -* **integrated test for #1595** - + * **integrated test for #1595** + Tobias Warneke, 2022-07-19 -* **reduced time to parse exception to minimize impact on building time** - + * **reduced time to parse exception to minimize impact on building time** + Tobias Warneke, 2022-07-19 -* **add support for drop column if exists (#1594)** - + * **add support for drop column if exists (#1594)** + rrrship, 2022-07-19 -* **PostgreSQL INSERT ... ON CONFLICT Issue #1551 (#1552)** - + * **PostgreSQL INSERT ... ON CONFLICT Issue #1551 (#1552)** + manticore-projects, 2022-07-19 -* **Configurable Parser Timeout via Feature (#1592)** - + * **Configurable Parser Timeout via Feature (#1592)** + manticore-projects, 2022-07-19 -* **fixes #1590** - + * **fixes #1590** + Tobias Warneke, 2022-07-19 -* **fixes #1590** - + * **fixes #1590** + Tobias Warneke, 2022-07-19 -* **extended support Postgres' `Extract( field FROM source)` where `field` is a String instead of a Keyword (#1591)** - + * **extended support Postgres' `Extract( field FROM source)` where `field` is a String instead of a Keyword (#1591)** + manticore-projects, 2022-07-19 -* **Closes #1579. Added ANALYZE support. (#1587)** - + * **Closes #1579. Added ANALYZE
    support. (#1587)** + Rob Audenaerde, 2022-07-14 -* **Closes #1583:: Implement Postgresql optional TABLE in TRUNCATE (#1585)** - + * **Closes #1583:: Implement Postgresql optional TABLE in TRUNCATE (#1585)** + Rob Audenaerde, 2022-07-14 -* **Support table option character set and index options (#1586)** - + * **Support table option character set and index options (#1586)** + luofei, 2022-07-14 -* **corrected a last minute bug** - + * **corrected a last minute bug** + Tobias Warneke, 2022-07-09 -* **corrected a last minute bug** - + * **corrected a last minute bug** + Tobias Warneke, 2022-07-09 -* **corrected a last minute bug** - + * **corrected a last minute bug** + Tobias Warneke, 2022-07-09 -* **fixes #1576** - + * **fixes #1576** + Tobias Warneke, 2022-07-09 -* **added simple test for #1580** - + * **added simple test for #1580** + Tobias Warneke, 2022-07-07 -* **disabled test for large cnf expansion and stack overflow problem** - + * **disabled test for large cnf expansion and stack overflow problem** + Tobias Warneke, 2022-07-07 -* **Add test for LikeExpression.setEscape and LikeExpression.getStringExpression (#1568)** - + * **Add test for LikeExpression.setEscape and LikeExpression.getStringExpression (#1568)** + Caro, 2022-07-07 -* **add support for postgres drop function statement (#1557)** - + * **add support for postgres drop function statement (#1557)** + rrrship, 2022-07-06 -* **Add support for Hive dialect GROUPING SETS. (#1539)** - + * **Add support for Hive dialect GROUPING SETS. (#1539)** + chenwl, 2022-07-06 -* **fixes #1566** - + * **fixes #1566** + Tobias Warneke, 2022-06-28 -* **Postgres NATURAL LEFT/RIGHT joins (#1560)** - + * **Postgres NATURAL LEFT/RIGHT joins (#1560)** + manticore-projects, 2022-06-28 -* **compound statement tests (#1545)** - + * **compound statement tests (#1545)** + Matthew Rathbone, 2022-06-08 -* **Allow isolation keywords as column name and aliases (#1534)** - + * **Allow isolation keywords as column name and aliases (#1534)** + Tomer Shay (Shimshi), 2022-05-19 -* **added github action badge** - + * **added github action badge** + Tobias, 2022-05-16 -* **Create maven.yml** - + * **Create maven.yml** + Tobias, 2022-05-16 -* **introduced deparser and toString correction for insert output clause** - + * **introduced deparser and toString correction for insert output clause** + Tobias Warneke, 2022-05-15 -* **revived compilable status after merge** - + * **revived compilable status after merge** + Tobias Warneke, 2022-05-15 -* **INSERT with SetOperations (#1531)** - + * **INSERT with SetOperations (#1531)** + manticore-projects, 2022-05-15 -* **#1516 rename without column keyword (#1533)** - + * **#1516 rename without column keyword (#1533)** + manticore-projects, 2022-05-11 -* **Add support for `... ALTER COLUMN ... DROP DEFAULT` (#1532)** - + * **Add support for `... ALTER COLUMN ... DROP DEFAULT` (#1532)** + manticore-projects, 2022-05-11 -* **#1527 DELETE ... RETURNING ... (#1528)** - + * **#1527 DELETE ... RETURNING ... (#1528)** + manticore-projects, 2022-05-11 -* **fixs #1520 (#1521)** - + * **fixs #1520 (#1521)** + chiangcho, 2022-05-11 -* **Unsupported statement (#1519)** - + * **Unsupported statement (#1519)** + manticore-projects, 2022-05-11 -* **fixes #1518** - + * **fixes #1518** + Tobias Warneke, 2022-04-26 -* **Update bug_report.md (#1512)** - + * **Update bug_report.md (#1512)** + manticore-projects, 2022-04-22 -* **changed to allow #1481** - + * **changed to allow #1481** + Tobias Warneke, 2022-04-22 -* **Performance Improvements (#1439)** - + * **Performance Improvements (#1439)** + manticore-projects, 2022-04-14 -* **[maven-release-plugin] prepare for next development iteration** - + * **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2022-04-10 Version jsqlparser-4.4 ============================================================= -* **[maven-release-plugin] prepare release jsqlparser-4.4** - + * **[maven-release-plugin] prepare release jsqlparser-4.4** + Tobias Warneke, 2022-04-10 -* **Json function Improvements (#1506)** - + * **Json function Improvements (#1506)** + manticore-projects, 2022-04-09 -* **fixes #1505** - + * **fixes #1505** + Tobias Warneke, 2022-04-09 -* **fixes #1502** - + * **fixes #1502** + Tobias Warneke, 2022-04-09 -* **Issue1500 - Circular References in `AllColumns` and `AllTableColumns` (#1501)** - + * **Issue1500 - Circular References in `AllColumns` and `AllTableColumns` (#1501)** + manticore-projects, 2022-04-03 -* **Optimize assertCanBeParsedAndDeparsed (#1389)** - + * **Optimize assertCanBeParsedAndDeparsed (#1389)** + manticore-projects, 2022-04-02 -* **Add geometry distance operator (#1493)** - + * **Add geometry distance operator (#1493)** + Thomas Powell, 2022-04-02 -* **Support WITH TIES option in TOP #1435 (#1479)** - + * **Support WITH TIES option in TOP #1435 (#1479)** + Olivier Cavadenti, 2022-04-02 -* **https://github.com/JSQLParser/JSqlParser/issues/1483 (#1485)** - + * **https://github.com/JSQLParser/JSqlParser/issues/1483 (#1485)** + gitmotte, 2022-04-02 -* **fixes #1482** - + * **fixes #1482** + Tobias Warneke, 2022-03-15 -* **fixes #1482** - + * **fixes #1482** + Tobias Warneke, 2022-03-15 -* **Extending CaseExpression, covering #1458 (#1459)** - + * **Extending CaseExpression, covering #1458 (#1459)** + Mathieu Goeminne, 2022-03-15 -* **fixes #1471** - + * **fixes #1471** + Tobias Warneke, 2022-02-18 -* **fixes #1471** - + * **fixes #1471** + Tobias Warneke, 2022-02-18 -* **fixes #1470** - + * **fixes #1470** + Tobias Warneke, 2022-02-06 -* **Add support for IS DISTINCT FROM clause (#1457)** - + * **Add support for IS DISTINCT FROM clause (#1457)** + Tomer Shay (Shimshi), 2022-01-18 -* **fix fetch present in the end of union query (#1456)** - + * **fix fetch present in the end of union query (#1456)** + chiangcho, 2022-01-18 -* **added SQL_CACHE implementation and changed** - + * **added SQL_CACHE implementation and changed** + Tobias Warneke, 2022-01-09 -* **support for db2 with ru (#1446)** - + * **support for db2 with ru (#1446)** + chiangcho, 2021-12-20 -* **[maven-release-plugin] prepare for next development iteration** - + * **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-12-12 Version jsqlparser-4.3 ============================================================= -* **[maven-release-plugin] prepare release jsqlparser-4.3** - + * **[maven-release-plugin] prepare release jsqlparser-4.3** + Tobias Warneke, 2021-12-12 -* **updated readme.md to show all changes for version 4.3** - + * **updated readme.md to show all changes for version 4.3** + Tobias Warneke, 2021-12-12 -* **Adjust Gradle to JUnit 5 (#1428)** - + * **Adjust Gradle to JUnit 5 (#1428)** + manticore-projects, 2021-11-28 -* **corrected some maven plugin versions** - + * **corrected some maven plugin versions** + Tobias Warneke, 2021-11-28 -* **fixes #1429** - + * **fixes #1429** + Tobias Warneke, 2021-11-23 -* **closes #1427** - + * **closes #1427** + Tobias Warneke, 2021-11-21 -* **CreateTableTest** - + * **CreateTableTest** + Tobias Warneke, 2021-11-21 -* **Support EMIT CHANGES for KSQL (#1426)** - + * **Support EMIT CHANGES for KSQL (#1426)** + Olivier Cavadenti, 2021-11-21 -* **SelectTest.testMultiPartColumnNameWithDatabaseNameAndSchemaName** - + * **SelectTest.testMultiPartColumnNameWithDatabaseNameAndSchemaName** + Tobias Warneke, 2021-11-21 -* **reformatted test source code** - + * **reformatted test source code** + Tobias Warneke, 2021-11-21 -* **organize imports** - + * **organize imports** + Tobias Warneke, 2021-11-21 -* **replaced all junit 3 and 4 with junit 5 stuff** - + * **replaced all junit 3 and 4 with junit 5 stuff** + Tobias Warneke, 2021-11-21 -* **Support RESTART without value (#1425)** - + * **Support RESTART without value (#1425)** + Olivier Cavadenti, 2021-11-20 -* **Add support for oracle UnPivot when use multi columns at once. (#1419)** - + * **Add support for oracle UnPivot when use multi columns at once. (#1419)** + LeiJun, 2021-11-19 -* **Fix issue in parsing TRY_CAST() function (#1391)** - + * **Fix issue in parsing TRY_CAST() function (#1391)** + Prashant Sutar, 2021-11-19 -* **fixes #1414** - + * **fixes #1414** + Tobias Warneke, 2021-11-19 -* **Add support for expressions (such as columns) in AT TIME ZONE expressions (#1413)** - + * **Add support for expressions (such as columns) in AT TIME ZONE expressions (#1413)** + Tomer Shay (Shimshi), 2021-11-19 -* **Add supported for quoted cast expressions for PostgreSQL (#1411)** - + * **Add supported for quoted cast expressions for PostgreSQL (#1411)** + Tomer Shay (Shimshi), 2021-11-19 -* **added USE SCHEMA and CREATE OR REPLACE
    support; things that are allowed in Snowflake SQL (#1409)** - + * **added USE SCHEMA and CREATE OR REPLACE
    support; things that are allowed in Snowflake SQL (#1409)** + Richard Kooijman, 2021-11-19 -* **Issue #420 Like Expression with Escape Expression (#1406)** - + * **Issue #420 Like Expression with Escape Expression (#1406)** + manticore-projects, 2021-11-19 -* **fixes #1405 and some junit.jupiter stuff** - + * **fixes #1405 and some junit.jupiter stuff** + Tobias Warneke, 2021-11-19 -* **#1401 add junit-jupiter-api (#1403)** - + * **#1401 add junit-jupiter-api (#1403)** + gitmotte, 2021-11-19 -* **Support Postgres Dollar Quotes #1372 (#1395)** - + * **Support Postgres Dollar Quotes #1372 (#1395)** + Olivier Cavadenti, 2021-11-19 -* **Add Delete / Update modifiers for MySQL #1254 (#1396)** - + * **Add Delete / Update modifiers for MySQL #1254 (#1396)** + Olivier Cavadenti, 2021-11-19 -* **Fixes #1381 (#1383)** - + * **Fixes #1381 (#1383)** + manticore-projects, 2021-11-19 -* **Allows CASE ... ELSE ComplexExpression (#1388)** - + * **Allows CASE ... ELSE ComplexExpression (#1388)** + manticore-projects, 2021-11-02 -* **IN() with complex expressions (#1384)** - + * **IN() with complex expressions (#1384)** + manticore-projects, 2021-11-01 -* **Fixes #1385 and PR#1380 (#1386)** - + * **Fixes #1385 and PR#1380 (#1386)** + manticore-projects, 2021-10-22 -* **Fixes #1369 (#1370)** - + * **Fixes #1369 (#1370)** + Ben Grabham, 2021-10-20 -* **Fixes #1371 (#1377)** - + * **Fixes #1371 (#1377)** + manticore-projects, 2021-10-20 -* **LIMIT OFFSET with Expressions (#1378)** - + * **LIMIT OFFSET with Expressions (#1378)** + manticore-projects, 2021-10-20 -* **Oracle Multi Column Drop (#1379)** - + * **Oracle Multi Column Drop (#1379)** + manticore-projects, 2021-10-20 -* **Support alias for UnPivot statement (see discussion #1374) (#1380)** - + * **Support alias for UnPivot statement (see discussion #1374) (#1380)** + fabriziodelfranco, 2021-10-20 -* **Issue1352 (#1353)** - + * **Issue1352 (#1353)** + manticore-projects, 2021-10-09 -* **Enhance ALTER TABLE ... DROP CONSTRAINTS ... (#1351)** - + * **Enhance ALTER TABLE ... DROP CONSTRAINTS ... (#1351)** + manticore-projects, 2021-10-08 -* **Function to use AllColumns or AllTableColumns Expression (#1350)** - + * **Function to use AllColumns or AllTableColumns Expression (#1350)** + manticore-projects, 2021-10-08 -* **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** - + * **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** + manticore-projects, 2021-09-18 -* **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** - + * **Postgres compliant ALTER TABLE ... RENAME TO ... (#1334)** + manticore-projects, 2021-09-18 -* **corrected readme to the new snapshot version** - + * **corrected readme to the new snapshot version** + Tobias Warneke, 2021-09-08 -* **[maven-release-plugin] prepare for next development iteration** - + * **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-09-08 Version jsqlparser-4.2 ============================================================= -* **[maven-release-plugin] prepare release jsqlparser-4.2** - + * **[maven-release-plugin] prepare release jsqlparser-4.2** + Tobias Warneke, 2021-09-08 -* **introducing test for issue #1328** - + * **introducing test for issue #1328** + Tobias Warneke, 2021-09-07 -* **included some distinct check** - + * **included some distinct check** + Tobias Warneke, 2021-09-07 -* **corrected a merge bug** - + * **corrected a merge bug** + Tobias Warneke, 2021-09-07 -* **Prepare4.2 (#1329)** - + * **Prepare4.2 (#1329)** + manticore-projects, 2021-09-07 -* **CREATE TABLE AS (...) UNION (...) fails (#1309)** - + * **CREATE TABLE AS (...) UNION (...) fails (#1309)** + François Sécherre, 2021-09-07 -* **Fixes #1325 (#1327)** - + * **Fixes #1325 (#1327)** + manticore-projects, 2021-09-06 -* **Implement Joins with multiple trailing ON Expressions (#1303)** - + * **Implement Joins with multiple trailing ON Expressions (#1303)** + manticore-projects, 2021-09-06 -* **Fix Gradle PMD and Checkstyle (#1318)** - + * **Fix Gradle PMD and Checkstyle (#1318)** + manticore-projects, 2021-09-01 -* **Fixes #1306 (#1311)** - + * **Fixes #1306 (#1311)** + manticore-projects, 2021-08-28 -* **Update sets (#1317)** - + * **Update sets (#1317)** + manticore-projects, 2021-08-27 -* **Special oracle tests (#1279)** - + * **Special oracle tests (#1279)** + manticore-projects, 2021-08-09 -* **Implements Hierarchical CONNECT_BY_ROOT Operator (#1282)** - + * **Implements Hierarchical CONNECT_BY_ROOT Operator (#1282)** + manticore-projects, 2021-08-09 -* **Implement Transact-SQL IF ELSE Statement Control Flows. (#1275)** - + * **Implement Transact-SQL IF ELSE Statement Control Flows. (#1275)** + manticore-projects, 2021-08-09 -* **Add some flexibility to the Alter Statement (#1293)** - + * **Add some flexibility to the Alter Statement (#1293)** + manticore-projects, 2021-08-02 -* **Implement Oracle's Alter System (#1288)** - + * **Implement Oracle's Alter System (#1288)** + manticore-projects, 2021-08-02 -* **Implement Oracle Named Function Parameters Func( param1 => arg1, ...) (#1283)** - + * **Implement Oracle Named Function Parameters Func( param1 => arg1, ...) (#1283)** + manticore-projects, 2021-08-02 -* **Implement Gradle Buildsystem (#1271)** - + * **Implement Gradle Buildsystem (#1271)** + manticore-projects, 2021-08-02 -* **fixes #1272** - + * **fixes #1272** + Tobias Warneke, 2021-07-26 -* **Allowes JdbcParameter or JdbcNamedParameter for MySQL FullTextSearch (#1278)** - + * **Allowes JdbcParameter or JdbcNamedParameter for MySQL FullTextSearch (#1278)** + manticore-projects, 2021-07-26 -* **Fixes #1267 Cast into RowConstructor (#1274)** - + * **Fixes #1267 Cast into RowConstructor (#1274)** + manticore-projects, 2021-07-26 -* **Separate MySQL Special String Functions accepting Named Argument Separation as this could collide with ComplexExpressionList when InExpression is involved (#1285)** - + * **Separate MySQL Special String Functions accepting Named Argument Separation as this could collide with ComplexExpressionList when InExpression is involved (#1285)** + manticore-projects, 2021-07-26 -* **Implements Oracle RENAME oldTable TO newTable Statement (#1286)** - + * **Implements Oracle RENAME oldTable TO newTable Statement (#1286)** + manticore-projects, 2021-07-26 -* **Implement Oracle Purge Statement (#1287)** - + * **Implement Oracle Purge Statement (#1287)** + manticore-projects, 2021-07-26 -* **included jacoco to allow code coverage for netbeans** - + * **included jacoco to allow code coverage for netbeans** + Tobias Warneke, 2021-07-18 -* **corrected a Lookahead problem** - + * **corrected a Lookahead problem** + Tobias Warneke, 2021-07-16 -* **Json functions (#1263)** - + * **Json functions (#1263)** + manticore-projects, 2021-07-16 -* **fixes #1255** - + * **fixes #1255** + Tobias Warneke, 2021-07-16 -* **Active JJDoc and let it create the Grammar BNF documentation (#1256)** - + * **Active JJDoc and let it create the Grammar BNF documentation (#1256)** + manticore-projects, 2021-07-16 -* **Bump commons-io from 2.6 to 2.7 (#1265)** - + * **Bump commons-io from 2.6 to 2.7 (#1265)** + dependabot[bot], 2021-07-14 -* **Update README.md** - + * **Update README.md** + Tobias, 2021-07-13 -* **Implement DB2 Special Register Date Time CURRENT DATE and CURRENT TIME (#1252)** - + * **Implement DB2 Special Register Date Time CURRENT DATE and CURRENT TIME (#1252)** + manticore-projects, 2021-07-13 -* **Rename the PMD ruleset configuration file hoping for automatic synchronization with Codacy (#1251)** - + * **Rename the PMD ruleset configuration file hoping for automatic synchronization with Codacy (#1251)** + manticore-projects, 2021-07-13 -* **corrected .travis.yml** - + * **corrected .travis.yml** + Tobias Warneke, 2021-07-05 -* **corrected .travis.yml** - + * **corrected .travis.yml** + Tobias Warneke, 2021-07-05 -* **Update README.md** - + * **Update README.md** + Tobias, 2021-07-05 -* **fixes #1250** - + * **fixes #1250** + Tobias Warneke, 2021-07-01 -* **[maven-release-plugin] prepare for next development iteration** - + * **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-06-30 Version jsqlparser-4.1 ============================================================= -* **[maven-release-plugin] prepare release jsqlparser-4.1** - + * **[maven-release-plugin] prepare release jsqlparser-4.1** + Tobias Warneke, 2021-06-30 -* **fixes #1140** - + * **fixes #1140** + Tobias Warneke, 2021-06-30 -* **introduced #1248 halfway** - + * **introduced #1248 halfway** + Tobias Warneke, 2021-06-30 -* **Savepoint rollback (#1236)** - + * **Savepoint rollback (#1236)** + manticore-projects, 2021-06-30 -* **Fixes Function Parameter List Brackets issue #1239 (#1240)** - + * **Fixes Function Parameter List Brackets issue #1239 (#1240)** + manticore-projects, 2021-06-30 -* **corrected javadoc problem** - + * **corrected javadoc problem** + Tobias Warneke, 2021-06-27 -* **corrected some lookahead problem** - + * **corrected some lookahead problem** + Tobias Warneke, 2021-06-26 -* **RESET statement, SET PostgreSQL compatibility (#1104)** - + * **RESET statement, SET PostgreSQL compatibility (#1104)** + Роман Зотов, 2021-06-26 -* **corrected some lookahead problem** - + * **corrected some lookahead problem** + Tobias Warneke, 2021-06-26 -* **Implement Oracle Alter Session Statements (#1234)** - + * **Implement Oracle Alter Session Statements (#1234)** + manticore-projects, 2021-06-26 -* **fixes #1230** - + * **fixes #1230** + Tobias Warneke, 2021-06-26 -* **Support DELETE FROM T1 USING T2 WHERE ... (#1228)** - + * **Support DELETE FROM T1 USING T2 WHERE ... (#1228)** + francois-secherre, 2021-06-16 -* **Row access support (#1181)** - + * **Row access support (#1181)** + Роман Зотов, 2021-06-16 -* **corrected lookahead problem of PR #1225** - + * **corrected lookahead problem of PR #1225** + Tobias Warneke, 2021-06-14 -* **Delete queries without from, with a schema identifier fails (#1224)** - + * **Delete queries without from, with a schema identifier fails (#1224)** + François Sécherre, 2021-06-14 -* **Create temporary table t(c1, c2) as select ... (#1225)** - + * **Create temporary table t(c1, c2) as select ... (#1225)** + francois-secherre, 2021-06-14 -* **Nested with items (#1221)** - + * **Nested with items (#1221)** + manticore-projects, 2021-06-10 -* **Implement GROUP BY () without columns (#1218)** - + * **Implement GROUP BY () without columns (#1218)** + manticore-projects, 2021-06-03 -* **TSQL Compliant NEXT VALUE FOR sequence_id (but keeping the spurious NEXTVAL FOR expression) (#1216)** - + * **TSQL Compliant NEXT VALUE FOR sequence_id (but keeping the spurious NEXTVAL FOR expression) (#1216)** + manticore-projects, 2021-06-02 -* **Pmd clean up (#1215)** - + * **Pmd clean up (#1215)** + manticore-projects, 2021-06-02 -* **Add support for boolean 'XOR' operator (#1193)** - + * **Add support for boolean 'XOR' operator (#1193)** + Adaptive Recognition, 2021-06-02 -* **Update README.md** - + * **Update README.md** + Tobias, 2021-05-31 -* **Implement WITH for DELETE, UPDATE and MERGE statements (#1217)** - + * **Implement WITH for DELETE, UPDATE and MERGE statements (#1217)** + manticore-projects, 2021-05-31 -* **increases complex scanning range** - + * **increases complex scanning range** + Tobias Warneke, 2021-05-26 -* **Allow Complex Parsing of Functions (#1200)** - + * **Allow Complex Parsing of Functions (#1200)** + manticore-projects, 2021-05-26 -* **Add support for AT TIME ZONE expressions (#1196)** - + * **Add support for AT TIME ZONE expressions (#1196)** + Tomer Shay (Shimshi), 2021-05-25 -* **fixes #1211** - + * **fixes #1211** + Tobias Warneke, 2021-05-25 -* **fixes #1212** - + * **fixes #1212** + Tobias Warneke, 2021-05-25 -* **Fix Nested CASE WHEN performance, fixes issue #1162 (#1208)** - + * **Fix Nested CASE WHEN performance, fixes issue #1162 (#1208)** + manticore-projects, 2021-05-25 -* **Add support for casts in json expressions (#1189)** - + * **Add support for casts in json expressions (#1189)** + Tomer Shay (Shimshi), 2021-05-10 -* **fixes #1185** - + * **fixes #1185** + Tobias Warneke, 2021-05-04 -* **supporting/fixing unique inside sql function such as count eg - SELECT count(UNIQUE col2) FROM mytable (#1184)** - + * **supporting/fixing unique inside sql function such as count eg - SELECT count(UNIQUE col2) FROM mytable (#1184)** + RajaSudharsan Adhikesavan, 2021-05-01 -* **Oracle compliant ALTER TABLE ADD/MODIFY deparser (#1163)** - + * **Oracle compliant ALTER TABLE ADD/MODIFY deparser (#1163)** + manticore-projects, 2021-04-21 -* **Pmd (#1165)** - + * **Pmd (#1165)** + manticore-projects, 2021-04-20 -* **function order by support (#1108)** - + * **function order by support (#1108)** + Роман Зотов, 2021-04-20 -* **fixes #1159** - + * **fixes #1159** + Tobias Warneke, 2021-04-16 -* **added improvements of pr to readme** - + * **added improvements of pr to readme** + Tobias Warneke, 2021-04-16 -* **Assorted fixes to the Java CC Parser definition (#1153)** - + * **Assorted fixes to the Java CC Parser definition (#1153)** + manticore-projects, 2021-04-16 -* **fixes #1138** - + * **fixes #1138** + Tobias Warneke, 2021-04-10 -* **fixes #1138** - + * **fixes #1138** + Tobias Warneke, 2021-04-10 -* **fixes #1137** - + * **fixes #1137** + Tobias Warneke, 2021-04-10 -* **fixes #1136** - + * **fixes #1136** + Tobias Warneke, 2021-04-10 -* **issue #1134 adressed** - + * **issue #1134 adressed** + Tobias Warneke, 2021-03-20 -* **Add support for union_with_brackets_and_orderby (#1131)** - + * **Add support for union_with_brackets_and_orderby (#1131)** + Tomer Shay (Shimshi), 2021-03-14 -* **Add support for union without brackets and with limit (#1132)** - + * **Add support for union without brackets and with limit (#1132)** + Tomer Shay (Shimshi), 2021-03-14 -* **Add support for functions in an interval expression (#1099)** - + * **Add support for functions in an interval expression (#1099)** + Tomer Shay (Shimshi), 2021-03-14 -* **subArray support arr[1:3] (#1109)** - + * **subArray support arr[1:3] (#1109)** + Роман Зотов, 2021-02-05 -* **bug fix (#769)** - + * **bug fix (#769)** + Kunal jha, 2021-02-05 -* **Array contructor support (#1105)** - + * **Array contructor support (#1105)** + Роман Зотов, 2021-02-04 -* **Partial support construct tuple as simple expression (#1107)** - + * **Partial support construct tuple as simple expression (#1107)** + Роман Зотов, 2021-01-31 -* **support create table parameters without columns, parameter values any names (#1106)** - + * **support create table parameters without columns, parameter values any names (#1106)** + Роман Зотов, 2021-01-31 -* **fixes #995** - + * **fixes #995** + Tobias Warneke, 2021-01-13 -* **fixes #1100** - + * **fixes #1100** + Tobias Warneke, 2021-01-13 -* **next correction of parenthesis around unions** - + * **next correction of parenthesis around unions** + Tobias Warneke, 2021-01-11 -* **fixes #992** - + * **fixes #992** + Tobias Warneke, 2021-01-07 -* **corrected patch for case as table name** - + * **corrected patch for case as table name** + Tobias Warneke, 2021-01-07 -* **Added support for the Case keyword in table names (#1093)** - + * **Added support for the Case keyword in table names (#1093)** + Tomer Shay (Shimshi), 2021-01-07 -* **corrected some javadoc parameter** - + * **corrected some javadoc parameter** + Tobias Warneke, 2021-01-03 -* **added missing pivot test files** - + * **added missing pivot test files** + Tobias Warneke, 2021-01-03 -* **fixes #282 - first refactoring to allow with clause as a start in insert and update** - + * **fixes #282 - first refactoring to allow with clause as a start in insert and update** + Tobias Warneke, 2021-01-02 -* **fixes #282 - first refactoring to allow with clause as a start in insert and update** - + * **fixes #282 - first refactoring to allow with clause as a start in insert and update** + Tobias Warneke, 2021-01-02 -* **Update README.md** - + * **Update README.md** + Tobias, 2021-01-02 -* **fixes #887** - + * **fixes #887** + Tobias Warneke, 2021-01-02 -* **fixes #1091 - added H2 casewhen function with conditional parameters** - + * **fixes #1091 - added H2 casewhen function with conditional parameters** + Tobias Warneke, 2021-01-01 -* **fixes #1091 - added H2 casewhen function with conditional parameters** - + * **fixes #1091 - added H2 casewhen function with conditional parameters** + Tobias Warneke, 2021-01-01 -* **[maven-release-plugin] prepare for next development iteration** - + * **[maven-release-plugin] prepare for next development iteration** + Tobias Warneke, 2021-01-01 diff --git a/src/site/sphinx/syntax.rst b/src/site/sphinx/syntax.rst index cf3f92f40..bea6bc83c 100644 --- a/src/site/sphinx/syntax.rst +++ b/src/site/sphinx/syntax.rst @@ -13,7 +13,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -23,24 +23,25 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. SingleStatement - Block - ; - - ELSE - - SingleStatement - - Block - ; - - EOF + Block + + ST_SEMICOLON + ELSE + + SingleStatement + + Block + + ST_SEMICOLON + + EOF - UnsupportedStatement - -
    + UnsupportedStatement + +
    -
             ::= ( 'IF' Condition ( ( SingleStatement | Block ) ';'? 'ELSE' )? )? ( SingleStatement | Block ) ';'? EOF
    +
             ::= ( 'IF' Condition ( ( SingleStatement | Block ) ST_SEMICOLON? 'ELSE' )? )? ( SingleStatement | Block ) ST_SEMICOLON? EOF
               | UnsupportedStatement
    Not referenced by any. @@ -54,7 +55,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -115,32 +116,34 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. Reset - ShowColumns - - ShowTables - - Show - - Use - - SavepointStatement - - RollbackStatement - COMMIT - - Comment - - Describe - - Explain - - Declare - - Grant - - PurgeStatement - - AlterSystemStatement + ShowColumns + + ShowIndex + + ShowTables + + Show + + Use + + SavepointStatement + + RollbackStatement + COMMIT + + Comment + + Describe + + Explain + + Declare + + Grant + + PurgeStatement + + AlterSystemStatement
    @@ -167,6 +170,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
               | RenameTableStatement
               | Reset
               | ShowColumns
    +
               | ShowIndex
               | ShowTables
               | Show
               | Use
    @@ -192,27 +196,26 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - BEGIN - - ; - - SingleStatement - - Block - ; - - END - - ; - - -
    - -
    Block    ::= 'BEGIN' ';'* ( ( SingleStatement | Block ) ';' )+ 'END' ';'?
    + BEGIN + + ST_SEMICOLON + + SingleStatement + + Block + + ST_SEMICOLON + END + + ST_SEMICOLON + +
    + +
    Block    ::= 'BEGIN' ST_SEMICOLON* ( ( SingleStatement | Block ) ST_SEMICOLON )+ 'END' ST_SEMICOLON?
    Referenced by:
    @@ -225,63 +228,64 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - ; - - IF - - Condition - - SingleStatement - - Block - ; - - ELSE - - SingleStatement - - Block - - SingleStatement - - Block - ; - - UnsupportedStatement - ; - - IF - - Condition - - SingleStatement - - Block - ; - - ELSE - - SingleStatement - - Block - - SingleStatement - - Block - ; - - UnsupportedStatement - - EOF - -
    + + + + + ST_SEMICOLON + IF + + Condition + + SingleStatement + + Block + + ST_SEMICOLON + ELSE + + SingleStatement + + Block + + SingleStatement + + Block + + ST_SEMICOLON + + UnsupportedStatement + + ST_SEMICOLON + IF + + Condition + + SingleStatement + + Block + + ST_SEMICOLON + ELSE + + SingleStatement + + Block + + SingleStatement + + Block + + ST_SEMICOLON + + UnsupportedStatement + + EOF + +
    -
             ::= ';'* ( 'IF' Condition ( SingleStatement | Block ) ( ';'? 'ELSE' ( SingleStatement | Block ) )? | SingleStatement | Block ';'? | UnsupportedStatement ) ( ';' ( 'IF' Condition ( SingleStatement | Block ) ( ';'? 'ELSE' ( SingleStatement | Block ) )? | SingleStatement | Block ';'? | UnsupportedStatement )? )* EOF
    +
    Not referenced by any.
    @@ -673,6 +677,34 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
    +====================================================================================================================== + ShowIndex +====================================================================================================================== + + +.. raw:: html + + + + + + SHOW + + INDEX + + FROM + + RelObjectNameExt + +
    + + +
             ::= 'SHOW' 'INDEX' 'FROM' RelObjectNameExt
    +
    + Referenced by: +
    + + ====================================================================================================================== ShowTables ====================================================================================================================== @@ -1380,7 +1412,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -1426,391 +1458,397 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. AT AUTHORIZATION - - BEGIN - - BINARY - - BIT - - BUFFERS - - BY - - BYTE - - BYTES - - CACHE - - CALL - - CASCADE - - CASE + + AUTO + + BEGIN + + BINARY + + BIT + + BUFFERS + + BY + + BYTE + + BYTES + + CACHE + + CALL + + CASCADE - CAST - - CHANGE - - CHANGES - - CHAR - - CHARACTER - - CHECKPOINT - - CLOSE - - COLLATE + CASE + + CAST + + CHANGE + + CHANGES + + CHAR + + CHARACTER + + CHECKPOINT + + CLOSE - COLUMN - - COLUMNS - - COMMENT - - COMMIT - - CONFLICT - - COSTS - - CS - - CYCLE - - DATABASE - - DDL - - DECLARE + COLLATE + + COLUMN + + COLUMNS + + COMMENT + + COMMIT + + CONFLICT + + COSTS + + CS + + CYCLE + + DATABASE + + DDL - DEFAULT - - DEFERRABLE - - DELAYED - - DELETE - - DESC - - DESCRIBE - - DISABLE - - DISCONNECT - - DIV - - DML - - DO - - DROP - - DUMP - - DUPLICATE - - EMIT - - ENABLE - - END - - ESCAPE - - EXCLUDE - - EXEC - - EXECUTE - - EXPLAIN - - EXTENDED - - EXTRACT - - FALSE - - FILTER - - FIRST - - FLUSH - - FN - - FOLLOWING - - FORMAT - - FULLTEXT - - FUNCTION - - GLOBAL - - GRANT + DECLARE + + DEFAULT + + DEFERRABLE + + DELAYED + + DELETE + + DESC + + DESCRIBE + + DISABLE + + DISCONNECT + + DIV + + DML + + DO + + DROP + + DUMP + + DUPLICATE + + EMIT + + ENABLE + + END + + ESCAPE + + EXCLUDE + + EXEC + + EXECUTE + + EXPLAIN + + EXTENDED + + EXTRACT + + FALSE + + FILTER + + FIRST + + FLUSH + + FN + + FOLLOWING + + FORMAT + + FULLTEXT + + FUNCTION + + GLOBAL - GUARD - - HISTORY - - HOPPING - - INCLUDE - - INCREMENT - - INDEX - - INSERT - - INTERLEAVE - - ISNULL - - JSON - - KEEP - - KEY - - KEYS + GRANT + + GUARD + + HISTORY + + HOPPING + + INCLUDE + + INCREMENT + + INDEX + + INSERT + + INTERLEAVE + + ISNULL + + JSON + + KEEP + + KEY - LAST - - LEADING - - LINK - - LOCAL - - LOCKED - - LOG - - MATCH - - MATCHED - - MATERIALIZED - - MAXVALUE - - MERGE - - MINVALUE - - MODIFY - - MOVEMENT - - NEXT - - NO - - NOCACHE - - NOKEEP - - NOLOCK - - NOMAXVALUE - - NOMINVALUE - - NOORDER - - NOTHING - - NOVALIDATE - - NOWAIT - - NULLS - - OF - - OFF - - OPEN + KEYS + + LAST + + LEADING + + LINK + + LOCAL + + LOCKED + + LOG + + MATCH + + MATCHED + + MATERIALIZED + + MAXVALUE + + MERGE + + MINVALUE + + MODIFY + + MOVEMENT + + NEXT + + NO + + NOCACHE + + NOKEEP + + NOLOCK + + NOMAXVALUE + + NOMINVALUE + + NOORDER + + NOTHING + + NOVALIDATE + + NOWAIT + + NULLS + + OF + + OFF - OVER - - OVERLAPS - - PARALLEL - - PARENT - - PARTITION - - PATH - - PERCENT + OPEN + + OVER + + OVERLAPS + + PARALLEL + + PARENT + + PARTITION + + PATH - PLACING - - PRECEDING + PERCENT + + PLACING - PRECISION - - PRIMARY - - PRIOR + PRECEDING + + PRECISION + + PRIMARY - PURGE - - QUERY - - QUICK - - QUIESCE - - RANGE - - READ - - RECYCLEBIN - - REFERENCES - - REGISTER - - RENAME - - REPLACE - - RESET + PRIOR + + PURGE + + QUERY + + QUICK + + QUIESCE + + RANGE + + READ + + RECYCLEBIN + + REFERENCES + + REFRESH + + REGISTER + + RENAME - RESTART - - RESTRICT - - RESTRICTED - - RESUMABLE - - RESUME - - RLIKE - - ROLLBACK - - ROW - - ROWS - - RR - - RS - - SAVEPOINT - - SCHEMA - - SEPARATOR - - SEQUENCE - - SESSION - - SETS - - SHOW - - SHUTDOWN - - SIBLINGS - - SIGNED - - SIMILAR - - SIZE - - SKIP - - STORED - - STRING - - SUSPEND - - SWITCH - - SYNONYM - - SYSTEM - - TABLE - - TABLESPACE - - TEMP - - TEMPORARY + REPLACE + + RESET + + RESTART + + RESTRICT + + RESTRICTED + + RESUMABLE + + RESUME + + RLIKE + + ROLLBACK + + ROW + + ROWS + + RR + + RS + + SAVEPOINT + + SCHEMA + + SEPARATOR + + SEQUENCE + + SESSION + + SETS + + SHOW + + SHUTDOWN + + SIBLINGS + + SIGNED + + SIMILAR + + SIZE + + SKIP + + STORED + + STRING + + SUSPEND + + SWITCH + + SYNONYM + + SYSTEM + + TABLE + + TABLESPACE - THEN - - TIMEOUT - - TIMESTAMPTZ - - TO - - TRUE - - TRUNCATE - - TUMBLING - - TYPE - - UNLOGGED - - UNQIESCE - - UNSIGNED - - UPDATE - - UPSERT - - UR - - USER - - VALIDATE - - VERBOSE - - VIEW - - WAIT - - WITHIN - - WITHOUT - - WORK - - XML - - XMLAGG - - XMLTEXT - - YAML - - ZONE - + TEMP + + TEMPORARY + + THEN + + TIMEOUT + + TIMESTAMPTZ + + TO + + TRUE + + TRUNCATE + + TUMBLING + + TYPE + + UNLOGGED + + UNQIESCE + + UNSIGNED + + UPDATE + + UPSERT + + UR + + USER + + VALIDATE + + VERBOSE + + VIEW + + WAIT + + WITHIN + + WITHOUT + + WORK + + XML + + XMLAGG + + XMLTEXT + + YAML + + YES + + ZONE +
    @@ -1837,6 +1875,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
               | 'ASC'
               | 'AT'
               | 'AUTHORIZATION'
    +
               | 'AUTO'
               | 'BEGIN'
               | 'BINARY'
               | 'BIT'
    @@ -1964,6 +2003,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
               | 'READ'
               | 'RECYCLEBIN'
               | 'REFERENCES'
    +
               | 'REFRESH'
               | 'REGISTER'
               | 'RENAME'
               | 'REPLACE'
    @@ -2028,6 +2068,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
               | 'XMLAGG'
               | 'XMLTEXT'
               | 'YAML'
    +
               | 'YES'
               | 'ZONE'
    Referenced by: @@ -2196,7 +2237,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
               | 'ORDER'
    +
    ====================================================================================================================== @@ -2651,18 +2692,22 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + - - - Expression - - Alias - -
    + + + Condition + + ConcatExpression + + Expression + + Alias + +
    -
             ::= Expression Alias?
    +
             ::= ( Condition | ConcatExpression | Expression ) Alias?
    @@ -3776,7 +3821,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
             ::= '?' S_LONG?
    +
    ====================================================================================================================== @@ -3896,7 +3941,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -3904,21 +3949,19 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. FIRST - NEXT - - S_LONG - - SimpleJdbcParameter - ROWS - - ROW - - ONLY - - -
    + NEXT + + Expression + ROWS + + ROW + + ONLY + + +
    -
    Fetch    ::= 'FETCH' ( 'FIRST' | 'NEXT' ) ( S_LONG | SimpleJdbcParameter ) ( 'ROWS' | 'ROW' ) 'ONLY'
    +
    Fetch    ::= 'FETCH' ( 'FIRST' | 'NEXT' ) Expression ( 'ROWS' | 'ROW' ) 'ONLY'
    @@ -4088,7 +4131,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
             ::= XorExpression
    +
    ====================================================================================================================== @@ -4199,7 +4242,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
             ::= ( 'NOT' | '!' )? ( RegularCondition | SQLCondition )
    + ====================================================================================================================== @@ -4937,7 +4980,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
             ::= BitwiseAndOr ( OP_CONCAT BitwiseAndOr )*
    Referenced by: -
    + ====================================================================================================================== @@ -7076,7 +7119,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - + @@ -7098,29 +7141,37 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. VIEW - Table - IF - - NOT - - EXISTS - - ColumnsNamesList - AS - - SelectWithWithItems - WITH - - READ - - ONLY - - -
    + Table + AUTO + + REFRESH + + YES + + NO + + IF + + NOT + + EXISTS + + ColumnsNamesList + AS + + SelectWithWithItems + WITH + + READ + + ONLY + + +
             ::= 'CREATE' ( 'OR' 'REPLACE' )? ( 'NO'? 'FORCE' )? ( 'TEMP' | 'TEMPORARY' - )? 'MATERIALIZED'? 'VIEW' Table ( 'IF' 'NOT' 'EXISTS' )? ColumnsNamesList? 'AS' SelectWithWithItems ( 'WITH' 'READ' 'ONLY' )?
    + )? 'MATERIALIZED'? 'VIEW' Table ( 'AUTO' 'REFRESH' ( 'YES' | 'NO' ) )? ( 'IF' 'NOT' 'EXISTS' )? ColumnsNamesList? 'AS' SelectWithWithItems ( 'WITH' 'READ' 'ONLY' )?
    @@ -8931,6 +8982,40 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
    +====================================================================================================================== + ST_SEMICOLON +====================================================================================================================== + + +.. raw:: html + + + + + + ; + + [#xA] + + / + + [#xA] + + [#xA] + + go + + +
    + + +
             ::= ';'
    +
               | #xA ( [/#xA] #xA | 'go' )
    +
    + Referenced by: +
    + + ====================================================================================================================== OP_GREATERTHANEQUALS ====================================================================================================================== @@ -9177,7 +9262,7 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|.
    S_LONG   ::= DIGIT+
    + ====================================================================================================================== @@ -13674,42 +13759,66 @@ The EBNF and Railroad Diagrams for JSQLParser-|JSQLPARSER_VERSION|. .. raw:: html - - - - - U - - E - - N - - R - - B - - RB - - _utf8 - - ' - - ESC - \' - - [^'\] - - '' - - [^'] - - ' - - -
    + + + + + U + + E + + N + + R + + B + + RB + + _utf8 + + q'{ + + . + + }' + + ' + + ESC + \' + + [^'\] + + '' + + [^'] + + ' + + q'( + + . + + )' + + q'[ + + . + + ]' + + q'' + + . + + '' + + +
    -
             ::= ( [UENRB] | 'RB' | '_utf8' )? "'" ( ( ESC | "\'" | [^'\] )* | ( "''" | [^'] )+ ) "'"
    +
             ::= ( [UENRB] | 'RB' | '_utf8' )? ( "'" ( ( ESC | "\'" | [^'\] )* | ( "''" | [^'] )+ ) "'" | "q'{" .* "}'" | "q'(" .* ")'" | "q'[" .* "]'" | "q''" .* "''" )
    diff --git a/src/test/java/net/sf/jsqlparser/statement/select/ClickHouseTest.java b/src/test/java/net/sf/jsqlparser/statement/select/ClickHouseTest.java index d7d97f627..fa52af6a9 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/ClickHouseTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/ClickHouseTest.java @@ -9,6 +9,7 @@ */ package net.sf.jsqlparser.statement.select; +import net.sf.jsqlparser.JSQLParserException; import org.junit.jupiter.api.Test; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; @@ -16,8 +17,21 @@ public class ClickHouseTest { @Test - public void testGlobalJoin() throws Exception { - String sql = "SELECT a.*,b.* from lineorder_all as a global left join supplier_all as b on a.LOLINENUMBER=b.SSUPPKEY"; + public void testGlobalJoin() throws JSQLParserException { + String sql = + "SELECT a.*,b.* from lineorder_all as a global left join supplier_all as b on a.LOLINENUMBER=b.SSUPPKEY"; + assertSqlCanBeParsedAndDeparsed(sql, true); + } + + @Test + public void testFunctionWithAttributesIssue1742() throws JSQLParserException { + String sql = "SELECT f1(arguments).f2.f3 from dual"; + assertSqlCanBeParsedAndDeparsed(sql, true); + + sql = "SELECT f1(arguments).f2(arguments).f3.f4 from dual"; + assertSqlCanBeParsedAndDeparsed(sql, true); + + sql = "SELECT schemaName.f1(arguments).f2(arguments).f3.f4 from dual"; assertSqlCanBeParsedAndDeparsed(sql, 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 new file mode 100644 index 000000000..342431c1b --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/select/FetchTest.java @@ -0,0 +1,25 @@ +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.*; + +class FetchTest { + @Test + void testParser() throws JSQLParserException { + String sqlStr = "SELECT table_schema \n" + "FROM information_schema.tables \n" + + "fetch next :variable rows only"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + + @Test + 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(); + Fetch fetch = plainSelect.getFetch(); + Assertions.assertInstanceOf(SubSelect.class, fetch.getExpression()); + } +} 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 b27cf993b..c17168fd3 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -69,37 +69,43 @@ public class SelectTest { private final CCJSqlParserManager parserManager = new CCJSqlParserManager(); @Test - public void testMultiPartTableNameWithServerNameAndDatabaseNameAndSchemaName() throws Exception { - final String statement = "SELECT columnName FROM [server-name\\server-instance].databaseName.schemaName.tableName"; + public void testMultiPartTableNameWithServerNameAndDatabaseNameAndSchemaName() + throws Exception { + final String statement = + "SELECT columnName FROM [server-name\\server-instance].databaseName.schemaName.tableName"; assertSqlCanBeParsedAndDeparsed(statement, false, parser -> parser.withSquareBracketQuotation(true)); - assertDeparse(new Select().withSelectBody(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"))), + assertDeparse( + new Select().withSelectBody(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"))), statement); } @Test public void testMultiPartTableNameWithServerNameAndDatabaseName() throws Exception { - final String statement = "SELECT columnName FROM [server-name\\server-instance].databaseName..tableName"; + final String statement = + "SELECT columnName FROM [server-name\\server-instance].databaseName..tableName"; assertSqlCanBeParsedAndDeparsed(statement, false, parser -> parser.withSquareBracketQuotation(true)); assertDeparse(new Select().withSelectBody(new PlainSelect() .addSelectItems(new SelectExpressionItem(new Column().withColumnName("columnName"))) .withFromItem(new Table() - .withDatabase( - new Database("databaseName").withServer(new Server("[server-name\\server-instance]"))) + .withDatabase(new Database("databaseName") + .withServer(new Server("[server-name\\server-instance]"))) .withName("tableName"))), statement); } @Test public void testMultiPartTableNameWithServerNameAndSchemaName() throws Exception { - final String statement = "SELECT columnName FROM [server-name\\server-instance]..schemaName.tableName"; + final String statement = + "SELECT columnName FROM [server-name\\server-instance]..schemaName.tableName"; assertSqlCanBeParsedAndDeparsed(statement, false, parser -> parser.withSquareBracketQuotation(true)); } @@ -112,7 +118,8 @@ public void testMultiPartTableNameWithServerProblem() throws Exception { @Test public void testMultiPartTableNameWithServerName() throws Exception { - final String statement = "SELECT columnName FROM [server-name\\server-instance]...tableName"; + final String statement = + "SELECT columnName FROM [server-name\\server-instance]...tableName"; assertSqlCanBeParsedAndDeparsed(statement, false, parser -> parser.withSquareBracketQuotation(true)); } @@ -151,8 +158,10 @@ public void testMultiPartTableNameWithColumnName() throws Exception { // Select statement statement multipart @Test - public void testMultiPartColumnNameWithDatabaseNameAndSchemaNameAndTableName() throws Exception { - final String statement = "SELECT databaseName.schemaName.tableName.columnName FROM tableName"; + public void testMultiPartColumnNameWithDatabaseNameAndSchemaNameAndTableName() + throws Exception { + final String statement = + "SELECT databaseName.schemaName.tableName.columnName FROM tableName"; Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); @@ -160,7 +169,8 @@ public void testMultiPartColumnNameWithDatabaseNameAndSchemaNameAndTableName() t @Test public void testMultiPartColumnNameWithDatabaseNameAndSchemaName() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT databaseName.schemaName..columnName FROM tableName"); + assertSqlCanBeParsedAndDeparsed( + "SELECT databaseName.schemaName..columnName FROM tableName"); } @Test @@ -181,7 +191,7 @@ public void testMultiPartColumnNameWithDatabaseName() { select = (Select) parserManager.parse(new StringReader(statement)); fail("must not work"); } catch (JSQLParserException ex) { - //Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex); + // Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex); } } @@ -203,7 +213,7 @@ public void testMultiPartColumnNameWithSchemaName() { select = (Select) parserManager.parse(new StringReader(statement)); fail("must not work"); } catch (JSQLParserException ex) { - //Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex); + // Logger.getLogger(SelectTest.class.getName()).log(Level.SEVERE, null, ex); } } @@ -226,8 +236,8 @@ public void testMultiPartColumnName() throws Exception { } void checkMultipartIdentifier(Select select, String columnName, String fullColumnName) { - final Expression expr = ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()). - getSelectItems().get(0)).getExpression(); + final Expression expr = ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + .getSelectItems().get(0)).getExpression(); assertTrue(expr instanceof Column); Column col = (Column) expr; assertEquals(columnName, col.getColumnName()); @@ -240,12 +250,13 @@ public void testAllColumnsFromTable() throws Exception { Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - assertTrue(((PlainSelect) select.getSelectBody()).getSelectItems().get(0) instanceof AllTableColumns); + assertTrue(((PlainSelect) select.getSelectBody()).getSelectItems() + .get(0) instanceof AllTableColumns); Table t = new Table("tableName"); assertDeparse( - new Select().withSelectBody( - new PlainSelect().addSelectItems(new AllTableColumns().withTable(t)).withFromItem(t)), + new Select().withSelectBody(new PlainSelect() + .addSelectItems(new AllTableColumns().withTable(t)).withFromItem(t)), statement); } @@ -259,7 +270,8 @@ public void testSimpleSigns() throws JSQLParserException { @Test public void testSimpleAdditionsAndSubtractionsWithSigns() throws JSQLParserException { - final String statement = "SELECT 1 - 1, 1 + 1, -1 - 1, -1 + 1, +1 + 1, +1 - 1 FROM tableName"; + final String statement = + "SELECT 1 - 1, 1 + 1, -1 - 1, -1 + 1, +1 + 1, +1 - 1 FROM tableName"; Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); @@ -281,7 +293,8 @@ public void testOperationsWithSigns() throws JSQLParserException { @Test public void testSignedColumns() throws JSQLParserException { - final String statement = "SELECT -columnName, +columnName, +(columnName), -(columnName) FROM tableName"; + final String statement = + "SELECT -columnName, +columnName, +(columnName), -(columnName) FROM tableName"; Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); @@ -289,7 +302,8 @@ public void testSignedColumns() throws JSQLParserException { @Test public void testSigns() throws Exception { - final String statement = "SELECT (-(1)), -(1), (-(columnName)), -(columnName), (-1), -1, (-columnName), -columnName FROM tableName"; + final String statement = + "SELECT (-(1)), -(1), (-(columnName)), -(columnName), (-1), -1, (-columnName), -columnName FROM tableName"; Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); @@ -317,7 +331,8 @@ public void testLimit() throws JSQLParserException { assertNull(((PlainSelect) select.getSelectBody()).getLimit()); assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertEquals("?", ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); + assertEquals("?", + ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); assertStatementCanBeDeparsedAs(select, statement); statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION " @@ -368,7 +383,8 @@ public void testLimit2() throws JSQLParserException { assertNull(offset); assertTrue(rowCount instanceof NullValue); - assertEquals(new LongValue(3), ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); + assertEquals(new LongValue(3), + ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); assertSqlCanBeParsedAndDeparsed(statement); @@ -381,7 +397,8 @@ public void testLimit2() throws JSQLParserException { assertNull(offset); assertTrue(rowCount instanceof AllValue); - assertEquals(new LongValue(5), ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); + assertEquals(new LongValue(5), + ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); assertSqlCanBeParsedAndDeparsed(statement); @@ -393,7 +410,8 @@ public void testLimit2() throws JSQLParserException { assertNull(offset); assertEquals(0, ((LongValue) rowCount).getValue()); - assertEquals(new LongValue(3), ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); + assertEquals(new LongValue(3), + ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll()); assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitNull()); assertSqlCanBeParsedAndDeparsed(statement); @@ -403,7 +421,8 @@ public void testLimit2() throws JSQLParserException { assertNull(((PlainSelect) select.getSelectBody()).getLimit()); assertNotNull(((PlainSelect) select.getSelectBody()).getOffset()); - assertEquals("?", ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); + assertEquals("?", + ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); assertStatementCanBeDeparsedAs(select, statement); statement = "(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION " @@ -539,7 +558,8 @@ public void testLimit4() throws JSQLParserException { @Test public void testLimitSqlServer1() throws JSQLParserException { - String statement = "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROWS FETCH NEXT 5 ROWS ONLY"; + String statement = + "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROWS FETCH NEXT 5 ROWS ONLY"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -549,7 +569,8 @@ public void testLimitSqlServer1() throws JSQLParserException { assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); assertNull(((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter()); - assertEquals("3", ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); + assertEquals("3", + ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); assertEquals(5, ((PlainSelect) select.getSelectBody()).getFetch().getRowCount()); assertStatementCanBeDeparsedAs(select, statement); } @@ -557,7 +578,8 @@ public void testLimitSqlServer1() throws JSQLParserException { @Test public void testLimitSqlServer2() throws JSQLParserException { // Alternative with the other keywords - String statement = "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROW FETCH FIRST 5 ROW ONLY"; + String statement = + "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROW FETCH FIRST 5 ROW ONLY"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -566,7 +588,8 @@ public void testLimitSqlServer2() throws JSQLParserException { assertEquals("ROW", ((PlainSelect) select.getSelectBody()).getOffset().getOffsetParam()); assertEquals("ROW", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); assertTrue(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); - assertEquals(new LongValue(3), ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); + assertEquals(new LongValue(3), + ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); assertEquals(5, ((PlainSelect) select.getSelectBody()).getFetch().getRowCount()); assertStatementCanBeDeparsedAs(select, statement); } @@ -574,21 +597,24 @@ public void testLimitSqlServer2() throws JSQLParserException { @Test public void testLimitSqlServer3() throws JSQLParserException { // Query with no Fetch - String statement = "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROWS"; + String statement = + "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET 3 ROWS"; 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()); - assertEquals(new LongValue(3), ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); + assertEquals(new LongValue(3), + ((PlainSelect) select.getSelectBody()).getOffset().getOffset()); assertStatementCanBeDeparsedAs(select, statement); } @Test public void testLimitSqlServer4() throws JSQLParserException { // For Oracle syntax, query with no offset - String statement = "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id FETCH NEXT 5 ROWS ONLY"; + String statement = + "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id FETCH NEXT 5 ROWS ONLY"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -602,7 +628,8 @@ public void testLimitSqlServer4() throws JSQLParserException { @Test public void testLimitSqlServerJdbcParameters() throws JSQLParserException { - String statement = "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; + String statement = + "SELECT * FROM mytable WHERE mytable.col = 9 ORDER BY mytable.id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -611,15 +638,18 @@ public void testLimitSqlServerJdbcParameters() throws JSQLParserException { assertNotNull(((PlainSelect) select.getSelectBody()).getFetch()); assertEquals("ROWS", ((PlainSelect) select.getSelectBody()).getFetch().getFetchParam()); assertFalse(((PlainSelect) select.getSelectBody()).getFetch().isFetchParamFirst()); - assertEquals("?", ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); - assertEquals("?", ((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter().toString()); + assertEquals("?", + ((PlainSelect) select.getSelectBody()).getOffset().getOffset().toString()); + assertEquals("?", ((PlainSelect) select.getSelectBody()).getFetch().getFetchJdbcParameter() + .toString()); assertStatementCanBeDeparsedAs(select, statement); } @Test public void testLimitPR404() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE mytable.col = 9 LIMIT ?1"); - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE mytable.col = 9 LIMIT :param_name"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT :param_name"); } @Test @@ -648,19 +678,23 @@ public void testTop() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(3, select.getSelectBody(PlainSelect.class).getTop().getExpression(LongValue.class).getValue()); + assertEquals(3, select.getSelectBody(PlainSelect.class).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().getExpression(LongValue.class).getValue()); + assertEquals(5, select.getSelectBody(PlainSelect.class).getTop() + .getExpression(LongValue.class).getValue()); } @Test public void testTopWithParenthesis() throws JSQLParserException { final String firstColumnName = "alias.columnName1"; final String secondColumnName = "alias.columnName2"; - final String statement = "SELECT TOP (5) PERCENT " + firstColumnName + ", " + secondColumnName + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; + final String statement = + "SELECT TOP (5) PERCENT " + firstColumnName + ", " + secondColumnName + + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); @@ -680,7 +714,8 @@ public void testTopWithParenthesis() throws JSQLParserException { @Test public void testTopWithTies() throws JSQLParserException { - final String statement = "SELECT TOP (5) PERCENT WITH TIES columnName1, columnName2 FROM tableName"; + final String statement = + "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(); @@ -700,28 +735,31 @@ public void testTopWithJdbcParameter() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1, (int) ((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop(). - getExpression()).getIndex()); + assertEquals(1, (int) ((JdbcParameter) ((PlainSelect) select.getSelectBody()).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(). - getExpression()).getName()); + assertEquals("name1", ((JdbcNamedParameter) ((PlainSelect) select.getSelectBody()).getTop() + .getExpression()).getName()); statement = "select top ? foo from bar"; select = (Select) parserManager.parse(new StringReader(statement)); - assertNotNull(((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop(). - getExpression()).getIndex()); - assertFalse(((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()). - isUseFixedIndex()); + assertNotNull( + ((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()) + .getIndex()); + assertFalse( + ((JdbcParameter) ((PlainSelect) select.getSelectBody()).getTop().getExpression()) + .isUseFixedIndex()); } @Test public void testSkip() throws JSQLParserException { final String firstColumnName = "alias.columnName1"; final String secondColumnName = "alias.columnName2"; - final String statement = "SELECT SKIP 5 " + firstColumnName + ", " + secondColumnName + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; + final String statement = "SELECT SKIP 5 " + firstColumnName + ", " + secondColumnName + + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); @@ -760,7 +798,8 @@ public void testSkip() throws JSQLParserException { public void testFirst() throws JSQLParserException { final String firstColumnName = "alias.columnName1"; final String secondColumnName = "alias.columnName2"; - final String statement = "SELECT FIRST 5 " + firstColumnName + ", " + secondColumnName + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; + final String statement = "SELECT FIRST 5 " + firstColumnName + ", " + secondColumnName + + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); @@ -799,7 +838,8 @@ public void testFirst() throws JSQLParserException { public void testFirstWithKeywordLimit() throws JSQLParserException { final String firstColumnName = "alias.columnName1"; final String secondColumnName = "alias.columnName2"; - final String statement = "SELECT LIMIT ? " + firstColumnName + ", " + secondColumnName + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; + final String statement = "SELECT LIMIT ? " + firstColumnName + ", " + secondColumnName + + " FROM schemaName.tableName alias ORDER BY " + secondColumnName + " DESC"; final Select select = (Select) parserManager.parse(new StringReader(statement)); final PlainSelect selectBody = (PlainSelect) select.getSelectBody(); @@ -847,38 +887,42 @@ public void testSkipFirst() throws JSQLParserException { @Test 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"; + 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(); final List selectItems = plainSelect.getSelectItems(); assertEquals("MYID", ((SelectExpressionItem) selectItems.get(0)).getAlias().getName()); - assertEquals("mycol", ((Column) ((SelectExpressionItem) selectItems.get(1)).getExpression()). - getColumnName()); + assertEquals("mycol", ((Column) ((SelectExpressionItem) selectItems.get(1)).getExpression()) + .getColumnName()); assertEquals("tab", ((AllTableColumns) selectItems.get(2)).getTable().getName()); assertEquals("schema", ((AllTableColumns) selectItems.get(3)).getTable().getSchemaName()); - assertEquals("schema.tab", ((AllTableColumns) selectItems.get(3)).getTable(). - getFullyQualifiedName()); - assertEquals("mytab.mycol2", ((Column) ((SelectExpressionItem) selectItems.get(4)). - getExpression()).getFullyQualifiedName()); - assertEquals("myschema.mytab.mycol", ((Column) ((SelectExpressionItem) selectItems.get(5)). - getExpression()).getFullyQualifiedName()); - assertEquals("myschema.mytab", ((AllTableColumns) selectItems.get(6)).getTable(). - getFullyQualifiedName()); + assertEquals("schema.tab", + ((AllTableColumns) selectItems.get(3)).getTable().getFullyQualifiedName()); + assertEquals("mytab.mycol2", + ((Column) ((SelectExpressionItem) selectItems.get(4)).getExpression()) + .getFullyQualifiedName()); + assertEquals("myschema.mytab.mycol", + ((Column) ((SelectExpressionItem) selectItems.get(5)).getExpression()) + .getFullyQualifiedName()); + assertEquals("myschema.mytab", + ((AllTableColumns) selectItems.get(6)).getTable().getFullyQualifiedName()); assertStatementCanBeDeparsedAs(select, statement); - statement = "SELECT myid AS MYID, (SELECT MAX(ID) AS myid2 FROM mytable2) AS myalias FROM mytable WHERE mytable.col = 9"; + 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(); - assertEquals("myalias", ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getAlias().getName()); + 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(); - assertEquals("MYID", ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias(). - getName()); + assertEquals("MYID", + ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias().getName()); assertStatementCanBeDeparsedAs(select, statement); } @@ -890,13 +934,15 @@ public void testTimezoneExpression() throws JSQLParserException { @Test public void testTimezoneExpressionWithTwoTransformations() throws JSQLParserException { - String stmt = "SELECT DATE(date1 AT TIME ZONE 'UTC' AT TIME ZONE 'australia/sydney') AS another_date"; + String stmt = + "SELECT DATE(date1 AT TIME ZONE 'UTC' AT TIME ZONE 'australia/sydney') AS another_date"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testTimezoneExpressionWithColumnBasedTimezone() throws JSQLParserException { - String stmt = "SELECT 1 FROM tbl WHERE col AT TIME ZONE timezone_col < '2021-11-05 00:00:35'::date + INTERVAL '1 day' * 0"; + String stmt = + "SELECT 1 FROM tbl WHERE col AT TIME ZONE timezone_col < '2021-11-05 00:00:35'::date + INTERVAL '1 day' * 0"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -909,19 +955,21 @@ public void testUnionWithOrderByAndLimitAndNoBrackets() throws JSQLParserExcepti @Test public void testUnion() throws JSQLParserException { String statement = "SELECT * FROM mytable WHERE mytable.col = 9 UNION " - + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " + "SELECT * FROM mytable2 LIMIT 3, 4"; + + "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(); assertEquals(3, setList.getSelects().size()); - assertEquals("mytable", ((Table) ((PlainSelect) setList.getSelects().get(0)).getFromItem()). - getName()); - assertEquals("mytable3", ((Table) ((PlainSelect) setList.getSelects().get(1)).getFromItem()). - getName()); - assertEquals("mytable2", ((Table) ((PlainSelect) setList.getSelects().get(2)).getFromItem()). - getName()); - assertEquals(3, ((LongValue) ((PlainSelect) setList.getSelects().get(2)).getLimit(). - getOffset()).getValue()); + assertEquals("mytable", + ((Table) ((PlainSelect) setList.getSelects().get(0)).getFromItem()).getName()); + assertEquals("mytable3", + ((Table) ((PlainSelect) setList.getSelects().get(1)).getFromItem()).getName()); + assertEquals("mytable2", + ((Table) ((PlainSelect) setList.getSelects().get(2)).getFromItem()).getName()); + assertEquals(3, + ((LongValue) ((PlainSelect) setList.getSelects().get(2)).getLimit().getOffset()) + .getValue()); // use brakets for toString // use standard limit syntax @@ -930,19 +978,20 @@ public void testUnion() throws JSQLParserException { + "SELECT * FROM mytable2 LIMIT 3, 4"; assertStatementCanBeDeparsedAs(select, statementToString); - //with fetch and with ur + // 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 * 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(); assertEquals(3, setList2.getSelects().size()); - assertEquals("mytable", ((Table) ((PlainSelect) setList2.getSelects().get(0)).getFromItem()). - getName()); - assertEquals("mytable3", ((Table) ((PlainSelect) setList2.getSelects().get(1)).getFromItem()). - getName()); - assertEquals("mytable2", ((Table) ((PlainSelect) setList2.getSelects().get(2)).getFromItem()). - getName()); + assertEquals("mytable", + ((Table) ((PlainSelect) setList2.getSelects().get(0)).getFromItem()).getName()); + assertEquals("mytable3", + ((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("UR", ((SetOperationList) setList2).getWithIsolation().getIsolation()); @@ -953,21 +1002,24 @@ public void testUnion() throws JSQLParserException { @Test public void testUnion2() throws JSQLParserException { String statement = "SELECT * FROM mytable WHERE mytable.col = 9 UNION " - + "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION " + "SELECT * FROM mytable2 LIMIT 3 OFFSET 4"; + + "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(); assertEquals(3, setList.getSelects().size()); - assertEquals("mytable", ((Table) ((PlainSelect) setList.getSelects().get(0)).getFromItem()). - getName()); - assertEquals("mytable3", ((Table) ((PlainSelect) setList.getSelects().get(1)).getFromItem()). - getName()); - assertEquals("mytable2", ((Table) ((PlainSelect) setList.getSelects().get(2)).getFromItem()). - getName()); - assertEquals(3, ((LongValue) ((PlainSelect) setList.getSelects().get(2)).getLimit(). - getRowCount()).getValue()); + assertEquals("mytable", + ((Table) ((PlainSelect) setList.getSelects().get(0)).getFromItem()).getName()); + assertEquals("mytable3", + ((Table) ((PlainSelect) setList.getSelects().get(1)).getFromItem()).getName()); + assertEquals("mytable2", + ((Table) ((PlainSelect) setList.getSelects().get(2)).getFromItem()).getName()); + assertEquals(3, + ((LongValue) ((PlainSelect) setList.getSelects().get(2)).getLimit().getRowCount()) + .getValue()); assertNull(((PlainSelect) setList.getSelects().get(2)).getLimit().getOffset()); - assertEquals(new LongValue(4), ((PlainSelect) setList.getSelects().get(2)).getOffset().getOffset()); + assertEquals(new LongValue(4), + ((PlainSelect) setList.getSelects().get(2)).getOffset().getOffset()); // use brakets for toString // use standard limit syntax @@ -979,16 +1031,14 @@ public void testUnion2() throws JSQLParserException { @Test public void testDistinct() throws JSQLParserException { - String statement = "SELECT DISTINCT ON (myid) myid, mycol FROM mytable WHERE mytable.col = 9"; + 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(); - assertEquals("myid", - ((Column) ((SelectExpressionItem) plainSelect.getDistinct().getOnSelectItems(). - get(0)).getExpression()) - .getColumnName()); - assertEquals("mycol", - ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getExpression()).getColumnName()); + assertEquals("myid", ((Column) ((SelectExpressionItem) plainSelect.getDistinct() + .getOnSelectItems().get(0)).getExpression()).getColumnName()); + assertEquals("mycol", ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)) + .getExpression()).getColumnName()); assertStatementCanBeDeparsedAs(select, statement); } @@ -1009,13 +1059,10 @@ 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(); - assertEquals("myid", - ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)). - getExpression()) - .getColumnName()); - assertEquals("mycol", - ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getExpression()).getColumnName()); + 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); } @@ -1027,34 +1074,37 @@ public void testDistinctTop2() { parserManager.parse(new StringReader(statement)); fail("sould not work"); } catch (JSQLParserException ex) { - //expected to fail + // expected to fail } } @Test public void testDistinctWithFollowingBrackets() throws JSQLParserException { - Select select = (Select) assertSqlCanBeParsedAndDeparsed("SELECT DISTINCT (phone), name FROM admin_user"); + Select select = (Select) assertSqlCanBeParsedAndDeparsed( + "SELECT DISTINCT (phone), name FROM admin_user"); PlainSelect selectBody = (PlainSelect) select.getSelectBody(); Distinct distinct = selectBody.getDistinct(); - assertThat(selectBody.getDistinct()) - .isNotNull() + assertThat(selectBody.getDistinct()).isNotNull() .hasFieldOrPropertyWithValue("onSelectItems", null); - assertThat(selectBody.getSelectItems().get(0).toString()) - .isEqualTo("(phone)"); + assertThat(selectBody.getSelectItems().get(0).toString()).isEqualTo("(phone)"); } @Test 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"; + 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(); assertEquals(3, plainSelect.getJoins().size()); assertEquals("mytable0", plainSelect.getFromItem().getAlias().getName()); - assertEquals("alias_tab1", plainSelect.getJoins().get(0).getRightItem().getAlias().getName()); - assertEquals("alias_tab2", plainSelect.getJoins().get(1).getRightItem().getAlias().getName()); + assertEquals("alias_tab1", + plainSelect.getJoins().get(0).getRightItem().getAlias().getName()); + assertEquals("alias_tab2", + plainSelect.getJoins().get(1).getRightItem().getAlias().getName()); assertEquals("mytable4", plainSelect.getJoins().get(2).getRightItem().getAlias().getName()); assertStatementCanBeDeparsedAs(select, statementToString); } @@ -1065,12 +1115,11 @@ public void testJoin() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(1, plainSelect.getJoins().size()); - assertEquals("tab2", ((Table) plainSelect.getJoins().get(0).getRightItem()). - getFullyQualifiedName()); + assertEquals("tab2", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); assertEquals("tab1.id", - ((Column) ((EqualsTo) plainSelect.getJoins().get(0).getOnExpression()). - getLeftExpression()) - .getFullyQualifiedName()); + ((Column) ((EqualsTo) plainSelect.getJoins().get(0).getOnExpression()) + .getLeftExpression()).getFullyQualifiedName()); assertTrue(plainSelect.getJoins().get(0).isOuter()); assertStatementCanBeDeparsedAs(select, statement); @@ -1078,8 +1127,8 @@ public void testJoin() throws JSQLParserException { select = (Select) parserManager.parse(new StringReader(statement)); plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(2, plainSelect.getJoins().size()); - assertEquals("tab3", ((Table) plainSelect.getJoins().get(1).getRightItem()). - getFullyQualifiedName()); + assertEquals("tab3", + ((Table) plainSelect.getJoins().get(1).getRightItem()).getFullyQualifiedName()); assertFalse(plainSelect.getJoins().get(1).isOuter()); assertStatementCanBeDeparsedAs(select, statement); @@ -1087,8 +1136,8 @@ public void testJoin() throws JSQLParserException { select = (Select) parserManager.parse(new StringReader(statement)); plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(2, plainSelect.getJoins().size()); - assertEquals("tab3", ((Table) plainSelect.getJoins().get(1).getRightItem()). - getFullyQualifiedName()); + assertEquals("tab3", + ((Table) plainSelect.getJoins().get(1).getRightItem()).getFullyQualifiedName()); assertFalse(plainSelect.getJoins().get(1).isOuter()); assertStatementCanBeDeparsedAs(select, statement); @@ -1097,7 +1146,8 @@ public void testJoin() throws JSQLParserException { select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - statement = "SELECT * FROM TA2 LEFT OUTER JOIN O USING (col1, col2) WHERE D.OasSD = 'asdf' AND (kj >= 4 OR l < 'sdf')"; + 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); @@ -1105,8 +1155,8 @@ public void testJoin() throws JSQLParserException { select = (Select) parserManager.parse(new StringReader(statement)); plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(1, plainSelect.getJoins().size()); - assertEquals("tab2", ((Table) plainSelect.getJoins().get(0).getRightItem()). - getFullyQualifiedName()); + assertEquals("tab2", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); assertFalse(plainSelect.getJoins().get(0).isOuter()); assertEquals(2, plainSelect.getJoins().get(0).getUsingColumns().size()); assertEquals("id2", @@ -1116,7 +1166,8 @@ public void testJoin() throws JSQLParserException { 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"; + 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); statement = "SELECT * FROM foo AS f, OUTER bar AS b WHERE f.id = b.id"; @@ -1126,8 +1177,10 @@ public void testJoin() throws JSQLParserException { 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("bar", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getFullyQualifiedName()); + assertEquals("b", + ((Table) plainSelect.getJoins().get(0).getRightItem()).getAlias().getName()); } @Test @@ -1135,56 +1188,58 @@ 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(); - assertEquals("max", ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias(). - getName()); + assertEquals("max", + ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias().getName()); assertStatementCanBeDeparsedAs(select, statement); - statement = "SELECT substring(id, 2, 3), substring(id from 2 for 3), substring(id from 2), trim(BOTH ' ' from 'foo bar '), trim(LEADING ' ' from 'foo bar '), trim(TRAILING ' ' from 'foo bar '), trim(' ' from 'foo bar '), position('foo' in 'bar'), overlay('foo' placing 'bar' from 1), overlay('foo' placing 'bar' from 1 for 2) FROM my table"; + statement = + "SELECT substring(id, 2, 3), substring(id from 2 for 3), substring(id from 2), trim(BOTH ' ' from 'foo bar '), trim(LEADING ' ' from 'foo bar '), trim(TRAILING ' ' from 'foo bar '), trim(' ' from 'foo bar '), position('foo' in 'bar'), overlay('foo' placing 'bar' from 1), overlay('foo' placing 'bar' from 1 for 2) FROM my table"; select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); - statement = "SELECT MAX(id), AVG(pro) AS myavg FROM mytable WHERE mytable.col = 9 GROUP BY pro"; + 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(); - assertEquals("myavg", ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getAlias().getName()); + 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(); - Function fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)). - getExpression(); + Function fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) + .getExpression(); assertEquals("MAX", fun.getName()); - assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)). - getFullyQualifiedName()); - assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getExpression()).getParameters().getExpressions().get(0) instanceof AllColumns); + assertEquals("b", + ((Column) fun.getParameters().getExpressions().get(1)).getFullyQualifiedName()); + assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)) + .getExpression()).getParameters().getExpressions().get(0) instanceof AllColumns); assertStatementCanBeDeparsedAs(select, statement); 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(); - fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)). - getExpression(); + fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) + .getExpression(); assertTrue(fun.isEscaped()); assertEquals("MAX", fun.getName()); - assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)). - getFullyQualifiedName()); - assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getExpression()).getParameters().getExpressions().get(0) instanceof AllColumns); + assertEquals("b", + ((Column) fun.getParameters().getExpressions().get(1)).getFullyQualifiedName()); + assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)) + .getExpression()).getParameters().getExpressions().get(0) instanceof AllColumns); assertStatementCanBeDeparsedAs(select, statement); 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(); - fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)). - getExpression(); + fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)) + .getExpression(); assertEquals("ab.MAX", fun.getName()); - assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)). - getFullyQualifiedName()); - fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)). - getExpression(); + assertEquals("b", + ((Column) fun.getParameters().getExpressions().get(1)).getFullyQualifiedName()); + fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)) + .getExpression(); assertEquals("cd.COUNT", fun.getName()); assertTrue(fun.getParameters().getExpressions().get(0) instanceof AllColumns); assertStatementCanBeDeparsedAs(select, statement); @@ -1193,7 +1248,7 @@ public void testFunctions() throws JSQLParserException { @Test public void testEscapedFunctionsIssue647() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT {fn test(0)} AS COL"); - //assertSqlCanBeParsedAndDeparsed("SELECT {fn current_timestamp(0)} AS COL"); + // assertSqlCanBeParsedAndDeparsed("SELECT {fn current_timestamp(0)} AS COL"); assertSqlCanBeParsedAndDeparsed("SELECT {fn concat(a, b)} AS COL"); } @@ -1206,7 +1261,8 @@ public void testEscapedFunctionsIssue753() throws JSQLParserException { @Test public void testNamedParametersPR702() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT substring(id, 2, 3), substring(id from 2 for 3), substring(id from 2), trim(BOTH ' ' from 'foo bar '), trim(LEADING ' ' from 'foo bar '), trim(TRAILING ' ' from 'foo bar '), trim(' ' from 'foo bar '), position('foo' in 'bar'), overlay('foo' placing 'bar' from 1), overlay('foo' placing 'bar' from 1 for 2) FROM my table"); + assertSqlCanBeParsedAndDeparsed( + "SELECT substring(id, 2, 3), substring(id from 2 for 3), substring(id from 2), trim(BOTH ' ' from 'foo bar '), trim(LEADING ' ' from 'foo bar '), trim(TRAILING ' ' from 'foo bar '), trim(' ' from 'foo bar '), position('foo' in 'bar'), overlay('foo' placing 'bar' from 1), overlay('foo' placing 'bar' from 1 for 2) FROM my table"); } @Test @@ -1217,7 +1273,8 @@ public void testNamedParametersPR702_2() throws JSQLParserException { @Test public void testQuotedCastExpression() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT col FROM test WHERE status = CASE WHEN anothercol = 5 THEN 'pending'::\"enum_test\" END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT col FROM test WHERE status = CASE WHEN anothercol = 5 THEN 'pending'::\"enum_test\" END"); } @Test @@ -1225,40 +1282,36 @@ 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) ((Select) parserManager + .parse(new StringReader(statement + " " + whereToString))).getSelectBody(); assertTrue(plainSelect.getWhere() instanceof GreaterThan); - assertTrue(((GreaterThan) plainSelect.getWhere()).getLeftExpression() instanceof Multiplication); + assertTrue(((GreaterThan) plainSelect.getWhere()) + .getLeftExpression() instanceof Multiplication); assertEquals(statement + " " + whereToString, plainSelect.toString()); 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) ((Select) parserManager + .parse(new StringReader(statement + " " + whereToString))).getSelectBody(); 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) ((Select) parserManager + .parse(new StringReader(statement + " " + whereToString))).getSelectBody(); assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), whereToString); assertEquals(statement + " " + whereToString, plainSelect.toString()); whereToString = " NOT 0 = 0"; - plainSelect = (PlainSelect) ((Select) parserManager. - parse(new StringReader(statement + whereToString))) - .getSelectBody(); + plainSelect = (PlainSelect) ((Select) parserManager + .parse(new StringReader(statement + whereToString))).getSelectBody(); whereToString = " NOT (0 = 0)"; - plainSelect = (PlainSelect) ((Select) parserManager. - parse(new StringReader(statement + whereToString))) - .getSelectBody(); + plainSelect = (PlainSelect) ((Select) parserManager + .parse(new StringReader(statement + whereToString))).getSelectBody(); assertExpressionCanBeDeparsedAs(plainSelect.getWhere(), whereToString.trim()); assertEquals(statement + whereToString, plainSelect.toString()); @@ -1270,28 +1323,32 @@ public void testGroupBy() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(1, plainSelect.getGroupBy().getGroupByExpressions().size()); - assertEquals("tab1.b", ((Column) plainSelect.getGroupBy().getGroupByExpressions().get(0)). - getFullyQualifiedName()); + assertEquals("tab1.b", ((Column) plainSelect.getGroupBy().getGroupByExpressions().get(0)) + .getFullyQualifiedName()); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY 2, 3"; select = (Select) parserManager.parse(new StringReader(statement)); plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(2, plainSelect.getGroupBy().getGroupByExpressions().size()); - assertEquals(2, ((LongValue) plainSelect.getGroupBy().getGroupByExpressions().get(0)).getValue()); - assertEquals(3, ((LongValue) plainSelect.getGroupBy().getGroupByExpressions().get(1)).getValue()); + assertEquals(2, + ((LongValue) plainSelect.getGroupBy().getGroupByExpressions().get(0)).getValue()); + assertEquals(3, + ((LongValue) plainSelect.getGroupBy().getGroupByExpressions().get(1)).getValue()); assertStatementCanBeDeparsedAs(select, statement); } @Test 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"; + 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(); 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, ?)"; + 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(); assertTrue(plainSelect.getHaving() instanceof InExpression); @@ -1318,20 +1375,22 @@ public void testNotExists() throws JSQLParserException { @Test public void testNotExistsIssue() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM t001 t WHERE NOT EXISTS (SELECT * FROM t002 t1 WHERE t.c1 = t1.c1 AND t.c2 = t1.c2 AND ('241' IN (t1.c3 || t1.c4)))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM t001 t WHERE NOT EXISTS (SELECT * FROM t002 t1 WHERE t.c1 = t1.c1 AND t.c2 = t1.c2 AND ('241' IN (t1.c3 || t1.c4)))"); } @Test 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"; + 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(); assertEquals(2, plainSelect.getOrderByElements().size()); - assertEquals("tab1.a", - ((Column) plainSelect.getOrderByElements().get(0).getExpression()) - .getFullyQualifiedName()); + assertEquals("tab1.a", ((Column) plainSelect.getOrderByElements().get(0).getExpression()) + .getFullyQualifiedName()); assertEquals("b", ((Column) plainSelect.getOrderByElements().get(1).getExpression()).getColumnName()); assertTrue(plainSelect.getOrderByElements().get(1).isAsc()); @@ -1368,8 +1427,8 @@ public void testTimestamp() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals("2004-04-30 04:05:34.56", - ((TimestampValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()). - getValue().toString()); + ((TimestampValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()) + .getValue().toString()); assertStatementCanBeDeparsedAs(select, statement); } @@ -1379,14 +1438,15 @@ public void testTime() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals("04:05:34", - (((TimeValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()). - getValue()).toString()); + (((TimeValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()) + .getValue()).toString()); assertStatementCanBeDeparsedAs(select, statement); } @Test public void testBetweenDate() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE col BETWEEN {d '2015-09-19'} AND {d '2015-09-24'}"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE col BETWEEN {d '2015-09-19'} AND {d '2015-09-24'}"); } @Test @@ -1403,14 +1463,17 @@ public void testCase() throws JSQLParserException { statement = "SELECT a, (CASE b WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END) FROM tab1"; assertSqlCanBeParsedAndDeparsed(statement); - statement = "SELECT a, (CASE " + "WHEN b > 1 THEN 'BBB' " + "WHEN a = 3 THEN 'AAA' " + "END) FROM tab1"; + statement = "SELECT a, (CASE " + "WHEN b > 1 THEN 'BBB' " + "WHEN a = 3 THEN 'AAA' " + + "END) FROM tab1"; assertSqlCanBeParsedAndDeparsed(statement); - statement = "SELECT a, (CASE " + "WHEN b > 1 THEN 'BBB' " + "WHEN a = 3 THEN 'AAA' " + "END) FROM tab1 " - + "WHERE c = (CASE " + "WHEN d <> 3 THEN 5 " + "ELSE 10 " + "END)"; + statement = "SELECT a, (CASE " + "WHEN b > 1 THEN 'BBB' " + "WHEN a = 3 THEN 'AAA' " + + "END) FROM tab1 " + "WHERE c = (CASE " + "WHEN d <> 3 THEN 5 " + "ELSE 10 " + + "END)"; assertSqlCanBeParsedAndDeparsed(statement); - statement = "SELECT a, CASE a " + "WHEN 'b' THEN 'BBB' " + "WHEN 'a' THEN 'AAA' " + "END AS b FROM tab1"; + statement = "SELECT a, CASE a " + "WHEN 'b' THEN 'BBB' " + "WHEN 'a' THEN 'AAA' " + + "END AS b FROM tab1"; assertSqlCanBeParsedAndDeparsed(statement); statement = "SELECT a FROM tab1 WHERE CASE b WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END > 34"; @@ -1419,16 +1482,32 @@ public void testCase() throws JSQLParserException { statement = "SELECT a FROM tab1 WHERE CASE b WHEN 1 THEN 2 + 3 ELSE 4 END > 34"; assertSqlCanBeParsedAndDeparsed(statement); - statement = "SELECT a, (CASE " + "WHEN (CASE a WHEN 1 THEN 10 ELSE 20 END) > 15 THEN 'BBB' " - + // "WHEN (SELECT c FROM tab2 WHERE d = 2) = 3 THEN 'AAA' " + - "END) FROM tab1"; + statement = + "SELECT a, (CASE " + "WHEN (CASE a WHEN 1 THEN 10 ELSE 20 END) > 15 THEN 'BBB' " + // "WHEN + // (SELECT + // c + // FROM + // tab2 + // WHERE + // d + // = + // 2) + // = + // 3 + // THEN + // 'AAA' + // " + // + + "END) FROM tab1"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testNestedCaseCondition() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN CASE WHEN 1 THEN 10 ELSE 20 END > 15 THEN 'BBB' END FROM tab1"); - assertSqlCanBeParsedAndDeparsed("SELECT (CASE WHEN (CASE a WHEN 1 THEN 10 ELSE 20 END) > 15 THEN 'BBB' END) FROM tab1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN CASE WHEN 1 THEN 10 ELSE 20 END > 15 THEN 'BBB' END FROM tab1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT (CASE WHEN (CASE a WHEN 1 THEN 10 ELSE 20 END) > 15 THEN 'BBB' END) FROM tab1"); } @Test @@ -1443,28 +1522,33 @@ public void testIssue371SimplifiedCase2() throws JSQLParserException { @Test public void testIssue235SimplifiedCase3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN (CASE WHEN (CASE WHEN (1) THEN 0 END) THEN 0 END) THEN 0 END FROM a"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN (CASE WHEN (CASE WHEN (1) THEN 0 END) THEN 0 END) THEN 0 END FROM a"); } @Test public void testIssue235SimplifiedCase4() 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"); + 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"); } @Test public void testIssue862CaseWhenConcat() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT c1, CASE c1 || c2 WHEN '091' THEN '2' ELSE '1' END AS c11 FROM T2"); + assertSqlCanBeParsedAndDeparsed( + "SELECT c1, CASE c1 || c2 WHEN '091' THEN '2' ELSE '1' END AS c11 FROM T2"); } @Test public void testExpressionsInCaseBeforeWhen() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT a FROM tbl1 LEFT JOIN tbl2 ON CASE tbl1.col1 WHEN tbl1.col1 = 1 THEN tbl1.col2 = tbl2.col2 ELSE tbl1.col3 = tbl2.col3 END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT a FROM tbl1 LEFT JOIN tbl2 ON CASE tbl1.col1 WHEN tbl1.col1 = 1 THEN tbl1.col2 = tbl2.col2 ELSE tbl1.col3 = tbl2.col3 END"); } @Test @Disabled public void testExpressionsInIntervalExpression() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT DATE_SUB(mydate, INTERVAL DAY(anotherdate) - 1 DAY) FROM tbl"); + assertSqlCanBeParsedAndDeparsed( + "SELECT DATE_SUB(mydate, INTERVAL DAY(anotherdate) - 1 DAY) FROM tbl"); } @Test @@ -1477,8 +1561,8 @@ public void testReplaceAsFunction() throws JSQLParserException { PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertEquals(1, plainSelect.getSelectItems().size()); - Expression expression = ((SelectExpressionItem) plainSelect.getSelectItems().get(0)). - getExpression(); + Expression expression = + ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getExpression(); assertTrue(expression instanceof Function); Function func = (Function) expression; assertEquals("REPLACE", func.getName()); @@ -1491,16 +1575,19 @@ public void testLike() throws JSQLParserException { Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); - assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()). - getRightExpression()).getValue()); + assertEquals("test", + ((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()) + .getValue()); statement = "SELECT * FROM tab1 WHERE a LIKE 'test' ESCAPE 'test2'"; select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); plainSelect = (PlainSelect) select.getSelectBody(); - assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()). - getRightExpression()).getValue()); - assertEquals(new StringValue("test2"), ((LikeExpression) plainSelect.getWhere()).getEscape()); + assertEquals("test", + ((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()) + .getValue()); + assertEquals(new StringValue("test2"), + ((LikeExpression) plainSelect.getWhere()).getEscape()); } @Test @@ -1508,8 +1595,9 @@ 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(); - assertEquals("test", ((StringValue) ((LikeExpression) plainSelect.getWhere()). - getRightExpression()).getValue()); + assertEquals("test", + ((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()) + .getValue()); assertEquals(true, ((LikeExpression) plainSelect.getWhere()).isNot()); } @@ -1520,8 +1608,9 @@ public void testNotLikeWithNotBeforeExpression() throws JSQLParserException { PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); assertTrue(plainSelect.getWhere() instanceof NotExpression); NotExpression notExpr = (NotExpression) plainSelect.getWhere(); - assertEquals("test", ((StringValue) ((LikeExpression) notExpr.getExpression()). - getRightExpression()).getValue()); + assertEquals("test", + ((StringValue) ((LikeExpression) notExpr.getExpression()).getRightExpression()) + .getValue()); assertEquals(false, ((LikeExpression) notExpr.getExpression()).isNot()); } @@ -1538,7 +1627,8 @@ public void testIlike() throws JSQLParserException { @Test public void testSelectOrderHaving() throws JSQLParserException { - String statement = "SELECT units, count(units) AS num FROM currency GROUP BY units HAVING count(units) > 1 ORDER BY num"; + String statement = + "SELECT units, count(units) AS num FROM currency GROUP BY units HAVING count(units) > 1 ORDER BY num"; assertSqlCanBeParsedAndDeparsed(statement); } @@ -1547,33 +1637,33 @@ public void testDouble() throws JSQLParserException { String statement = "SELECT 1e2, * FROM mytable WHERE mytable.col = 9"; Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1e2, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select. - getSelectBody()) - .getSelectItems().get(0)).getExpression()).getValue(), 0); + assertEquals(1e2, + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + .getSelectItems().get(0)).getExpression()).getValue(), + 0); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM mytable WHERE mytable.col = 1.e2"; select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1e2, - ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()).getWhere()). - getRightExpression()).getValue(), 0); + assertEquals(1e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()) + .getWhere()).getRightExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM mytable WHERE mytable.col = 1.2e2"; select = (Select) parserManager.parse(new StringReader(statement)); assertEquals(1.2e2, - ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()).getWhere()). - getRightExpression()).getValue(), 0); + ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()) + .getWhere()).getRightExpression()).getValue(), + 0); assertStatementCanBeDeparsedAs(select, statement); statement = "SELECT * FROM mytable WHERE mytable.col = 2e2"; select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(2e2, - ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()).getWhere()). - getRightExpression()).getValue(), 0); + assertEquals(2e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()) + .getWhere()).getRightExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); } @@ -1582,9 +1672,10 @@ public void testDouble2() throws JSQLParserException { String statement = "SELECT 1.e22 FROM mytable"; Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1e22, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select. - getSelectBody()) - .getSelectItems().get(0)).getExpression()).getValue(), 0); + assertEquals(1e22, + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + .getSelectItems().get(0)).getExpression()).getValue(), + 0); } @Test @@ -1592,9 +1683,10 @@ public void testDouble3() throws JSQLParserException { String statement = "SELECT 1. FROM mytable"; Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1.0, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select. - getSelectBody()) - .getSelectItems().get(0)).getExpression()).getValue(), 0); + assertEquals(1.0, + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + .getSelectItems().get(0)).getExpression()).getValue(), + 0); } @Test @@ -1602,9 +1694,10 @@ public void testDouble4() throws JSQLParserException { String statement = "SELECT 1.2e22 FROM mytable"; Select select = (Select) parserManager.parse(new StringReader(statement)); - assertEquals(1.2e22, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select. - getSelectBody()) - .getSelectItems().get(0)).getExpression()).getValue(), 0); + assertEquals(1.2e22, + ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) + .getSelectItems().get(0)).getExpression()).getValue(), + 0); } @Test @@ -1620,7 +1713,8 @@ public void testWith() throws JSQLParserException { @Test public void testWithRecursive() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("WITH RECURSIVE t (n) AS ((SELECT 1) UNION ALL (SELECT n + 1 FROM t WHERE n < 100)) SELECT sum(n) FROM t"); + assertSqlCanBeParsedAndDeparsed( + "WITH RECURSIVE t (n) AS ((SELECT 1) UNION ALL (SELECT n + 1 FROM t WHERE n < 100)) SELECT sum(n) FROM t"); } @Test @@ -1637,14 +1731,16 @@ public void testSelectAliasWithoutAs() throws JSQLParserException { @Test public void testSelectJoinWithComma() throws JSQLParserException { - String statement = "SELECT cb.Genus, cb.Species FROM Coleccion_de_Briofitas AS cb, unigeoestados AS es " - + "WHERE es.nombre = \"Tamaulipas\" AND cb.the_geom = es.geom"; + String statement = + "SELECT cb.Genus, cb.Species FROM Coleccion_de_Briofitas AS cb, unigeoestados AS es " + + "WHERE es.nombre = \"Tamaulipas\" AND cb.the_geom = es.geom"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testDeparser() throws JSQLParserException { - String statement = "SELECT a.OWNERLASTNAME, a.OWNERFIRSTNAME " + "FROM ANTIQUEOWNERS AS a, ANTIQUES AS b " + String statement = "SELECT a.OWNERLASTNAME, a.OWNERFIRSTNAME " + + "FROM ANTIQUEOWNERS AS a, ANTIQUES AS b " + "WHERE b.BUYERID = a.OWNERID AND b.ITEM = 'Chair'"; assertSqlCanBeParsedAndDeparsed(statement); @@ -1667,7 +1763,8 @@ public void testCount3() throws JSQLParserException { @Test public void testMysqlQuote() throws JSQLParserException { - String statement = "SELECT `a.OWNERLASTNAME`, `OWNERFIRSTNAME` " + "FROM `ANTIQUEOWNERS` AS a, ANTIQUES AS b " + String statement = "SELECT `a.OWNERLASTNAME`, `OWNERFIRSTNAME` " + + "FROM `ANTIQUEOWNERS` AS a, ANTIQUES AS b " + "WHERE b.BUYERID = a.OWNERID AND b.ITEM = 'Chair'"; assertSqlCanBeParsedAndDeparsed(statement); } @@ -1696,13 +1793,15 @@ public void testConcatProblem2_1() throws JSQLParserException { @Test public void testConcatProblem2_2() throws JSQLParserException { - String stmt = "SELECT MAX((SPA.SOORTAANLEVERPERIODE)::VARCHAR (2) || (VARCHAR(SPA.AANLEVERPERIODEJAAR))::VARCHAR (4)) AS GESLACHT_TMP FROM testtable"; + String stmt = + "SELECT MAX((SPA.SOORTAANLEVERPERIODE)::VARCHAR (2) || (VARCHAR(SPA.AANLEVERPERIODEJAAR))::VARCHAR (4)) AS GESLACHT_TMP FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testConcatProblem2_3() throws JSQLParserException { - String stmt = "SELECT TO_CHAR((10000 - SPA.VERSCHIJNINGSVOLGNR), 'FM0999'::VARCHAR) FROM testtable"; + String stmt = + "SELECT TO_CHAR((10000 - SPA.VERSCHIJNINGSVOLGNR), 'FM0999'::VARCHAR) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -1738,7 +1837,8 @@ public void testConcatProblem2_6() throws JSQLParserException { @Test public void testMatches() throws JSQLParserException { - String statement = "SELECT * FROM team WHERE team.search_column @@ to_tsquery('new & york & yankees')"; + String statement = + "SELECT * FROM team WHERE team.search_column @@ to_tsquery('new & york & yankees')"; assertSqlCanBeParsedAndDeparsed(statement); } @@ -1763,7 +1863,8 @@ public void testSelectFunction() throws JSQLParserException { @Test public void testWeirdSelect() throws JSQLParserException { - String sql = "select r.reviews_id, substring(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, r.customers_name from reviews r, reviews_description rd where r.products_id = '19' and r.reviews_id = rd.reviews_id and rd.languages_id = '1' and r.reviews_status = 1 order by r.reviews_id desc limit 0, 6"; + String sql = + "select r.reviews_id, substring(rd.reviews_text, 100) as reviews_text, r.reviews_rating, r.date_added, r.customers_name from reviews r, reviews_description rd where r.products_id = '19' and r.reviews_id = rd.reviews_id and rd.languages_id = '1' and r.reviews_status = 1 order by r.reviews_id desc limit 0, 6"; parserManager.parse(new StringReader(sql)); } @@ -1815,7 +1916,8 @@ public void testTryCastInTryCast() throws JSQLParserException { @Test public void testTryCastInTryCast2() throws JSQLParserException { - String stmt = "SELECT TRY_CAST('test' + TRY_CAST(assertEqual AS numeric) AS varchar) FROM tabelle1"; + String stmt = + "SELECT TRY_CAST('test' + TRY_CAST(assertEqual AS numeric) AS varchar) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -1918,7 +2020,8 @@ public void testProblemSqlServer_Modulo_mod() throws Exception { @Test public void testProblemSqlServer_Modulo() throws Exception { - String stmt = "SELECT convert(varchar(255), DATEDIFF(month, year1, abc_datum) / 12) + ' year, ' + convert(varchar(255), DATEDIFF(month, year2, abc_datum) % 12) + ' month' FROM test_table"; + String stmt = + "SELECT convert(varchar(255), DATEDIFF(month, year1, abc_datum) / 12) + ' year, ' + convert(varchar(255), DATEDIFF(month, year2, abc_datum) % 12) + ' month' FROM test_table"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -1930,7 +2033,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 a IS NOT NULL even for NOT a 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"); @@ -1980,13 +2083,15 @@ public void testProblemSqlAnalytic7Count() throws JSQLParserException { @Test public void testProblemSqlAnalytic8Complex() throws JSQLParserException { - String stmt = "SELECT ID, NAME, SALARY, SUM(SALARY) OVER () AS SUM_SAL, AVG(SALARY) OVER () AS AVG_SAL, MIN(SALARY) OVER () AS MIN_SAL, MAX(SALARY) OVER () AS MAX_SAL, COUNT(*) OVER () AS ROWS2 FROM STAFF WHERE ID < 60 ORDER BY ID"; + String stmt = + "SELECT ID, NAME, SALARY, SUM(SALARY) OVER () AS SUM_SAL, AVG(SALARY) OVER () AS AVG_SAL, MIN(SALARY) OVER () AS MIN_SAL, MAX(SALARY) OVER () AS MAX_SAL, COUNT(*) OVER () AS ROWS2 FROM STAFF WHERE ID < 60 ORDER BY ID"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testProblemSqlAnalytic9CommaListPartition() throws JSQLParserException { - String stmt = "SELECT a, row_number() OVER (PARTITION BY c, d ORDER BY a, b) AS n FROM table1"; + String stmt = + "SELECT a, row_number() OVER (PARTITION BY c, d ORDER BY a, b) AS n FROM table1"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2034,52 +2139,61 @@ public void testAnalyticFunction16() throws JSQLParserException { @Test public void testAnalyticFunction17() throws JSQLParserException { - String statement = "SELECT AVG(sal) OVER (PARTITION BY deptno ORDER BY sal ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING) AS avg_of_current_sal FROM emp"; + String statement = + "SELECT AVG(sal) OVER (PARTITION BY deptno ORDER BY sal ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING) AS avg_of_current_sal FROM emp"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testAnalyticFunction18() throws JSQLParserException { - String statement = "SELECT AVG(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE CURRENT ROW) AS avg_of_current_sal FROM emp"; + String statement = + "SELECT AVG(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE CURRENT ROW) AS avg_of_current_sal FROM emp"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testAnalyticFunctionProblem1() throws JSQLParserException { - String statement = "SELECT last_value(s.revenue_hold) OVER (PARTITION BY s.id_d_insertion_order, s.id_d_product_ad_attr, trunc(s.date_id, 'mm') ORDER BY s.date_id) AS col FROM s"; + String statement = + "SELECT last_value(s.revenue_hold) OVER (PARTITION BY s.id_d_insertion_order, s.id_d_product_ad_attr, trunc(s.date_id, 'mm') ORDER BY s.date_id) AS col FROM s"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testAnalyticFunction19() throws JSQLParserException { - String statement = "SELECT count(DISTINCT CASE WHEN client_organic_search_drop_flag = 1 THEN brand END) OVER (PARTITION BY client, category_1, category_2, category_3, category_4 ) AS client_brand_org_drop_count FROM sometable"; + String statement = + "SELECT count(DISTINCT CASE WHEN client_organic_search_drop_flag = 1 THEN brand END) OVER (PARTITION BY client, category_1, category_2, category_3, category_4 ) AS client_brand_org_drop_count FROM sometable"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testAnalyticFunctionProblem1b() throws JSQLParserException { - String statement = "SELECT last_value(s.revenue_hold) OVER (PARTITION BY s.id_d_insertion_order, s.id_d_product_ad_attr, trunc(s.date_id, 'mm') ORDER BY s.date_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS col FROM s"; + String statement = + "SELECT last_value(s.revenue_hold) OVER (PARTITION BY s.id_d_insertion_order, s.id_d_product_ad_attr, trunc(s.date_id, 'mm') ORDER BY s.date_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS col FROM s"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testAnalyticFunctionIssue670() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT last_value(some_column IGNORE NULLS) OVER (PARTITION BY some_other_column_1, some_other_column_2 ORDER BY some_other_column_3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) column_alias FROM some_table"); + assertSqlCanBeParsedAndDeparsed( + "SELECT last_value(some_column IGNORE NULLS) OVER (PARTITION BY some_other_column_1, some_other_column_2 ORDER BY some_other_column_3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) column_alias FROM some_table"); } @Test public void testAnalyticFunctionFilterIssue866() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COUNT(*) FILTER (WHERE name = 'Raj') OVER (PARTITION BY name ) FROM table"); + assertSqlCanBeParsedAndDeparsed( + "SELECT COUNT(*) FILTER (WHERE name = 'Raj') OVER (PARTITION BY name ) FROM table"); } @Test public void testAnalyticPartitionBooleanExpressionIssue864() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COUNT(*) OVER (PARTITION BY (event = 'admit' OR event = 'family visit') ORDER BY day ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) family_visits FROM patients"); + assertSqlCanBeParsedAndDeparsed( + "SELECT COUNT(*) OVER (PARTITION BY (event = 'admit' OR event = 'family visit') ORDER BY day ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) family_visits FROM patients"); } @Test public void testAnalyticPartitionBooleanExpressionIssue864_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COUNT(*) OVER (PARTITION BY (event = 'admit' OR event = 'family visit') ) family_visits FROM patients"); + assertSqlCanBeParsedAndDeparsed( + "SELECT COUNT(*) OVER (PARTITION BY (event = 'admit' OR event = 'family visit') ) family_visits FROM patients"); } @Test @@ -2101,19 +2215,22 @@ public void testFunctionRight() throws JSQLParserException { @Test public void testOneColumnFullTextSearchMySQL() throws JSQLParserException { - String statement = "SELECT MATCH (col1) AGAINST ('test' IN NATURAL LANGUAGE MODE) relevance FROM tbl"; + String statement = + "SELECT MATCH (col1) AGAINST ('test' IN NATURAL LANGUAGE MODE) relevance FROM tbl"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testSeveralColumnsFullTextSearchMySQL() throws JSQLParserException { - String statement = "SELECT MATCH (col1,col2,col3) AGAINST ('test' IN NATURAL LANGUAGE MODE) relevance FROM tbl"; + String statement = + "SELECT MATCH (col1,col2,col3) AGAINST ('test' IN NATURAL LANGUAGE MODE) relevance FROM tbl"; assertSqlCanBeParsedAndDeparsed(statement); } @Test public void testFullTextSearchInDefaultMode() throws JSQLParserException { - String statement = "SELECT col FROM tbl WHERE MATCH (col1,col2,col3) AGAINST ('test') ORDER BY col"; + String statement = + "SELECT col FROM tbl WHERE MATCH (col1,col2,col3) AGAINST ('test') ORDER BY col"; assertSqlCanBeParsedAndDeparsed(statement); } @@ -2156,13 +2273,16 @@ public void testOracleJoin2() throws JSQLParserException { @ParameterizedTest @ValueSource(strings = {"(+)", "( +)", "(+ )", "( + )", " (+) "}) public void testOracleJoin2_1(String value) throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a" + value + " = tabelle2.b", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a" + value + " = tabelle2.b", + true); } @ParameterizedTest @ValueSource(strings = {"(+)", "( +)", "(+ )", "( + )", " (+) "}) public void testOracleJoin2_2(String value) throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a = tabelle2.b" + value, true); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a = tabelle2.b" + value, true); } @Test @@ -2179,13 +2299,15 @@ public void testOracleJoin3_1() throws JSQLParserException { @Test public void testOracleJoin4() throws JSQLParserException { - String stmt = "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a(+) = tabelle2.b AND tabelle1.b(+) IN ('A', 'B')"; + String stmt = + "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a(+) = tabelle2.b AND tabelle1.b(+) IN ('A', 'B')"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testOracleJoinIssue318() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM TBL_A, TBL_B, TBL_C WHERE TBL_A.ID(+) = TBL_B.ID AND TBL_C.ROOM(+) = TBL_B.ROOM"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM TBL_A, TBL_B, TBL_C WHERE TBL_A.ID(+) = TBL_B.ID AND TBL_C.ROOM(+) = TBL_B.ROOM"); } @Test @@ -2232,7 +2354,8 @@ public void testProblemSqlCombinedSets() throws Exception { @Test public void testWithStatement() throws JSQLParserException { - String stmt = "WITH test AS (SELECT mslink FROM feature) SELECT * FROM feature WHERE mslink IN (SELECT mslink FROM test)"; + String stmt = + "WITH test AS (SELECT mslink FROM feature) SELECT * FROM feature WHERE mslink IN (SELECT mslink FROM test)"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2244,31 +2367,36 @@ public void testSubjoinWithJoins() throws JSQLParserException { @Test public void testWithUnionProblem() throws JSQLParserException { - String stmt = "WITH test AS ((SELECT mslink FROM tablea) UNION (SELECT mslink FROM tableb)) SELECT * FROM tablea WHERE mslink IN (SELECT mslink FROM test)"; + String stmt = + "WITH test AS ((SELECT mslink FROM tablea) UNION (SELECT mslink FROM tableb)) SELECT * FROM tablea WHERE mslink IN (SELECT mslink FROM test)"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testWithUnionAllProblem() throws JSQLParserException { - String stmt = "WITH test AS ((SELECT mslink FROM tablea) UNION ALL (SELECT mslink FROM tableb)) SELECT * FROM tablea WHERE mslink IN (SELECT mslink FROM test)"; + String stmt = + "WITH test AS ((SELECT mslink FROM tablea) UNION ALL (SELECT mslink FROM tableb)) SELECT * FROM tablea WHERE mslink IN (SELECT mslink FROM test)"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testWithUnionProblem3() throws JSQLParserException { - String stmt = "WITH test AS ((SELECT mslink, CAST(tablea.fname AS varchar) FROM tablea INNER JOIN tableb ON tablea.mslink = tableb.mslink AND tableb.deleted = 0 WHERE tablea.fname IS NULL AND 1 = 0) UNION ALL (SELECT mslink FROM tableb)) SELECT * FROM tablea WHERE mslink IN (SELECT mslink FROM test)"; + String stmt = + "WITH test AS ((SELECT mslink, CAST(tablea.fname AS varchar) FROM tablea INNER JOIN tableb ON tablea.mslink = tableb.mslink AND tableb.deleted = 0 WHERE tablea.fname IS NULL AND 1 = 0) UNION ALL (SELECT mslink FROM tableb)) SELECT * FROM tablea WHERE mslink IN (SELECT mslink FROM test)"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testWithUnionProblem4() throws JSQLParserException { - String stmt = "WITH hist AS ((SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, 0 AS level, CAST(gl.mslink AS VARCHAR) AS path, ae.feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 WHERE gl.parent IS NULL AND gl.mslink <> 0) UNION ALL (SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, hist.level + 1 AS level, CAST(hist.path + '.' + CAST(gl.mslink AS VARCHAR) AS VARCHAR) AS path, ae.feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 INNER JOIN hist ON gl.parent = hist.mslink WHERE gl.mslink <> 0)) SELECT mslink, space(level * 4) + txt AS txt, nr, feature, path FROM hist WHERE EXISTS (SELECT feature FROM tablec WHERE mslink = 0 AND ((feature IN (1, 2) AND hist.feature = 3) OR (feature IN (4) AND hist.feature = 2)))"; + String stmt = + "WITH hist AS ((SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, 0 AS level, CAST(gl.mslink AS VARCHAR) AS path, ae.feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 WHERE gl.parent IS NULL AND gl.mslink <> 0) UNION ALL (SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, hist.level + 1 AS level, CAST(hist.path + '.' + CAST(gl.mslink AS VARCHAR) AS VARCHAR) AS path, ae.feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 INNER JOIN hist ON gl.parent = hist.mslink WHERE gl.mslink <> 0)) SELECT mslink, space(level * 4) + txt AS txt, nr, feature, path FROM hist WHERE EXISTS (SELECT feature FROM tablec WHERE mslink = 0 AND ((feature IN (1, 2) AND hist.feature = 3) OR (feature IN (4) AND hist.feature = 2)))"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testWithUnionProblem5() throws JSQLParserException { - String stmt = "WITH hist AS ((SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, 0 AS level, CAST(gl.mslink AS VARCHAR) AS path, ae.feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 WHERE gl.parent IS NULL AND gl.mslink <> 0) UNION ALL (SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, hist.level + 1 AS level, CAST(hist.path + '.' + CAST(gl.mslink AS VARCHAR) AS VARCHAR) AS path, 5 AS feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 INNER JOIN hist ON gl.parent = hist.mslink WHERE gl.mslink <> 0)) SELECT * FROM hist"; + String stmt = + "WITH hist AS ((SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, 0 AS level, CAST(gl.mslink AS VARCHAR) AS path, ae.feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 WHERE gl.parent IS NULL AND gl.mslink <> 0) UNION ALL (SELECT gl.mslink, ba.gl_name AS txt, ba.gl_nummer AS nr, hist.level + 1 AS level, CAST(hist.path + '.' + CAST(gl.mslink AS VARCHAR) AS VARCHAR) AS path, 5 AS feature FROM tablea AS gl INNER JOIN tableb AS ba ON gl.mslink = ba.gl_mslink INNER JOIN tablec AS ae ON gl.mslink = ae.mslink AND ae.deleted = 0 INNER JOIN hist ON gl.parent = hist.mslink WHERE gl.mslink <> 0)) SELECT * FROM hist"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2296,11 +2424,12 @@ public void testExtractFrom4() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(stmt); } - // @Test - // public void testExtractFromIssue673() throws JSQLParserException { - // String stmt = "select EXTRACT(DAY FROM (SYSDATE - to_date('20180101', 'YYYYMMDD' ) ) DAY TO SECOND) from dual"; - // assertSqlCanBeParsedAndDeparsed(stmt); - // } + // @Test + // public void testExtractFromIssue673() throws JSQLParserException { + // String stmt = "select EXTRACT(DAY FROM (SYSDATE - to_date('20180101', 'YYYYMMDD' ) ) DAY TO + // SECOND) from dual"; + // assertSqlCanBeParsedAndDeparsed(stmt); + // } @Test public void testProblemFunction() throws JSQLParserException { String stmt = "SELECT test() FROM testtable"; @@ -2349,7 +2478,8 @@ public void testAdditionalLettersSpanish() throws JSQLParserException { @Test public void testMultiTableJoin() throws JSQLParserException { - String stmt = "SELECT * FROM taba INNER JOIN tabb ON taba.a = tabb.a, tabc LEFT JOIN tabd ON tabc.c = tabd.c"; + String stmt = + "SELECT * FROM taba INNER JOIN tabb ON taba.a = tabb.a, tabc LEFT JOIN tabd ON tabc.c = tabd.c"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2361,18 +2491,20 @@ public void testTableCrossJoin() throws JSQLParserException { @Test public void testLateral1() throws JSQLParserException { - String stmt = "SELECT O.ORDERID, O.CUSTNAME, OL.LINETOTAL FROM ORDERS AS O, LATERAL(SELECT SUM(NETAMT) AS LINETOTAL FROM ORDERLINES AS LINES WHERE LINES.ORDERID = O.ORDERID) AS OL"; + String stmt = + "SELECT O.ORDERID, O.CUSTNAME, OL.LINETOTAL FROM ORDERS AS O, LATERAL(SELECT SUM(NETAMT) AS LINETOTAL FROM ORDERLINES AS LINES WHERE LINES.ORDERID = O.ORDERID) AS OL"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testLateralComplex1() throws IOException, JSQLParserException { - String stmt = IOUtils.toString(SelectTest.class. - getResourceAsStream("complex-lateral-select-request.txt"), + String stmt = IOUtils.toString( + SelectTest.class.getResourceAsStream("complex-lateral-select-request.txt"), Charset.forName("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", select. - toString()); + 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", + select.toString()); } @Test @@ -2407,19 +2539,22 @@ public void testValues5() throws JSQLParserException { @Test public void testValues6BothVariants() throws JSQLParserException { - String stmt = "SELECT I FROM (VALUES 1, 2, 3) AS MY_TEMP_TABLE(I) WHERE I IN (SELECT * FROM (VALUES 1, 2) AS TEST)"; + String stmt = + "SELECT I FROM (VALUES 1, 2, 3) AS MY_TEMP_TABLE(I) WHERE I IN (SELECT * FROM (VALUES 1, 2) AS TEST)"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testIntervalWithColumn() throws JSQLParserException { - String stmt = "SELECT DATE_ADD(start_date, INTERVAL duration MINUTE) AS end_datetime FROM appointment"; + String stmt = + "SELECT DATE_ADD(start_date, INTERVAL duration MINUTE) AS end_datetime FROM appointment"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testIntervalWithFunction() throws JSQLParserException { - String stmt = "SELECT DATE_ADD(start_date, INTERVAL COALESCE(duration, 21) MINUTE) AS end_datetime FROM appointment"; + String stmt = + "SELECT DATE_ADD(start_date, INTERVAL COALESCE(duration, 21) MINUTE) AS end_datetime FROM appointment"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2431,7 +2566,8 @@ public void testInterval1() throws JSQLParserException { @Test public void testInterval2() throws JSQLParserException { - String stmt = "SELECT to_timestamp(to_char(now() - INTERVAL '45 MINUTE', 'YYYY-MM-DD-HH24:')) AS START_TIME FROM tab1"; + String stmt = + "SELECT to_timestamp(to_char(now() - INTERVAL '45 MINUTE', 'YYYY-MM-DD-HH24:')) AS START_TIME FROM tab1"; assertSqlCanBeParsedAndDeparsed(stmt); Statement st = CCJSqlParserUtil.parse(stmt); @@ -2472,8 +2608,10 @@ public void testInterval4() throws JSQLParserException { @Test public void testInterval5_Issue228() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT ADDDATE(timeColumn1, INTERVAL 420 MINUTES) AS timeColumn1 FROM tbl"); - assertSqlCanBeParsedAndDeparsed("SELECT ADDDATE(timeColumn1, INTERVAL -420 MINUTES) AS timeColumn1 FROM tbl"); + assertSqlCanBeParsedAndDeparsed( + "SELECT ADDDATE(timeColumn1, INTERVAL 420 MINUTES) AS timeColumn1 FROM tbl"); + assertSqlCanBeParsedAndDeparsed( + "SELECT ADDDATE(timeColumn1, INTERVAL -420 MINUTES) AS timeColumn1 FROM tbl"); } @Test @@ -2484,19 +2622,22 @@ public void testMultiValueIn() throws JSQLParserException { @Test public void testMultiValueIn2() throws JSQLParserException { - String stmt = "SELECT * FROM mytable WHERE (trim(a), trim(b)) IN (SELECT a, b FROM mytable2)"; + String stmt = + "SELECT * FROM mytable WHERE (trim(a), trim(b)) IN (SELECT a, b FROM mytable2)"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testMultiValueIn3() throws JSQLParserException { - String stmt = "SELECT * FROM mytable WHERE (SSN, SSM) IN (('11111111111111', '22222222222222'))"; + String stmt = + "SELECT * FROM mytable WHERE (SSN, SSM) IN (('11111111111111', '22222222222222'))"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testMultiValueIn_withAnd() throws JSQLParserException { - String stmt = "SELECT * FROM mytable WHERE (SSN, SSM) IN (('11111111111111', '22222222222222')) AND 1 = 1"; + String stmt = + "SELECT * FROM mytable WHERE (SSN, SSM) IN (('11111111111111', '22222222222222')) AND 1 = 1"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2520,7 +2661,8 @@ public void testMultiValueInBinds() throws JSQLParserException { @Test public void testUnionWithBracketsAndOrderBy() throws JSQLParserException { - String stmt = "(SELECT a FROM tbl ORDER BY a) UNION DISTINCT (SELECT a FROM tbl ORDER BY a)"; + String stmt = + "(SELECT a FROM tbl ORDER BY a) UNION DISTINCT (SELECT a FROM tbl ORDER BY a)"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2532,7 +2674,8 @@ public void testMultiValueNotInBinds() throws JSQLParserException { @Test public void testMultiValueIn_NTuples() throws JSQLParserException { - String stmt = "SELECT * FROM mytable WHERE (a, b, c, d, e) IN ((1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15))"; + String stmt = + "SELECT * FROM mytable WHERE (a, b, c, d, e) IN ((1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15))"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2550,7 +2693,8 @@ public void testPivot2() throws JSQLParserException { @Test public void testPivot3() throws JSQLParserException { - String stmt = "SELECT * FROM mytable PIVOT (count(a) AS vals FOR b IN (10 AS d1, 20, 30 AS d3))"; + String stmt = + "SELECT * FROM mytable PIVOT (count(a) AS vals FOR b IN (10 AS d1, 20, 30 AS d3))"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2562,7 +2706,8 @@ public void testPivot4() throws JSQLParserException { @Test public void testPivot5() throws JSQLParserException { - String stmt = "SELECT * FROM mytable PIVOT (count(a) FOR (b, c) IN ((10, 'a'), (20, 'b'), (30, 'c')))"; + String stmt = + "SELECT * FROM mytable PIVOT (count(a) FOR (b, c) IN ((10, 'a'), (20, 'b'), (30, 'c')))"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2574,7 +2719,8 @@ public void testPivotXml1() throws JSQLParserException { @Test public void testPivotXml2() throws JSQLParserException { - String stmt = "SELECT * FROM mytable PIVOT XML (count(a) FOR b IN (SELECT vals FROM myothertable))"; + String stmt = + "SELECT * FROM mytable PIVOT XML (count(a) FOR b IN (SELECT vals FROM myothertable))"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2586,70 +2732,67 @@ public void testPivotXml3() throws JSQLParserException { @Test public void testPivotXmlSubquery1() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM (SELECT times_purchased, state_code FROM customers t) PIVOT (count(state_code) FOR state_code IN ('NY', 'CT', 'NJ', 'FL', 'MO')) ORDER BY times_purchased"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM (SELECT times_purchased, state_code FROM customers t) PIVOT (count(state_code) FOR state_code IN ('NY', 'CT', 'NJ', 'FL', 'MO')) ORDER BY times_purchased"); } @Test public void testPivotFunction() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT to_char((SELECT col1 FROM (SELECT times_purchased, state_code FROM customers t) PIVOT (count(state_code) FOR state_code IN ('NY', 'CT', 'NJ', 'FL', 'MO')) ORDER BY times_purchased)) FROM DUAL"); + assertSqlCanBeParsedAndDeparsed( + "SELECT to_char((SELECT col1 FROM (SELECT times_purchased, state_code FROM customers t) PIVOT (count(state_code) FOR state_code IN ('NY', 'CT', 'NJ', 'FL', 'MO')) ORDER BY times_purchased)) FROM DUAL"); } @Test public void testUnPivotWithAlias() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT simulation_id, un_piv_alias.signal, un_piv_alias.val AS value FROM" - + " (SELECT simulation_id," - + " convert(numeric(18, 2), sum(convert(int, init_on))) DosingOnStatus_TenMinutes_sim," - + " convert(numeric(18, 2), sum(CASE WHEN pump_status = 0 THEN 10 ELSE 0 END)) AS DosingOffDurationHour_Hour_sim" - + " FROM ft_simulation_result" - + " WHERE simulation_id = 210 AND data_timestamp BETWEEN convert(datetime, '2021-09-14', 120) AND convert(datetime, '2021-09-18', 120)" - + " GROUP BY simulation_id) sim_data" - + " UNPIVOT" - + " (" - + "val" - + " FOR signal IN (DosingOnStatus_TenMinutes_sim, DosingOnDuration_Hour_sim)" - + ") un_piv_alias"); + assertSqlCanBeParsedAndDeparsed( + "SELECT simulation_id, un_piv_alias.signal, un_piv_alias.val AS value FROM" + + " (SELECT simulation_id," + + " convert(numeric(18, 2), sum(convert(int, init_on))) DosingOnStatus_TenMinutes_sim," + + " convert(numeric(18, 2), sum(CASE WHEN pump_status = 0 THEN 10 ELSE 0 END)) AS DosingOffDurationHour_Hour_sim" + + " FROM ft_simulation_result" + + " WHERE simulation_id = 210 AND data_timestamp BETWEEN convert(datetime, '2021-09-14', 120) AND convert(datetime, '2021-09-18', 120)" + + " GROUP BY simulation_id) sim_data" + " UNPIVOT" + " (" + "val" + + " FOR signal IN (DosingOnStatus_TenMinutes_sim, DosingOnDuration_Hour_sim)" + + ") un_piv_alias"); } @Test public void testUnPivot() throws JSQLParserException { - String stmt = "SELECT * FROM sale_stats" - + " UNPIVOT (" - + "quantity" + String stmt = "SELECT * FROM sale_stats" + " UNPIVOT (" + "quantity" + " FOR product_code IN (product_a AS 'A', product_b AS 'B', product_c AS 'C'))"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testUnPivotWithMultiColumn() throws JSQLParserException { - String stmt = "SELECT * FROM sale_stats" - + " UNPIVOT (" - + "(quantity, rank)" + String stmt = "SELECT * FROM sale_stats" + " UNPIVOT (" + "(quantity, rank)" + " FOR product_code IN ((product_a, product_1) AS 'A', (product_b, product_2) AS 'B', (product_c, product_3) AS 'C'))"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testPivotWithAlias() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) f PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) f PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH))"); } @Test public void testPivotWithAlias2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) f PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH)) d"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) f PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH)) d"); } @Test public void testPivotWithAlias3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH)) d"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM (SELECT * FROM mytable LEFT JOIN mytable2 ON Factor_ID = Id) PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH)) d"); } @Test public void testPivotWithAlias4() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * FROM (" + "SELECT a.Station_ID stationId, b.Factor_Code factoryCode, a.Value value" - + " FROM T_Data_Real a" - + " LEFT JOIN T_Bas_Factor b ON a.Factor_ID = b.Id" - + ") f " + + " FROM T_Data_Real a" + " LEFT JOIN T_Bas_Factor b ON a.Factor_ID = b.Id" + ") f " + "PIVOT (max(f.value) FOR f.factoryCode IN (ZD, COD, SW, PH)) d"); } @@ -2661,7 +2804,8 @@ public void testRegexpLike1() throws JSQLParserException { @Test public void testRegexpLike2() throws JSQLParserException { - String stmt = "SELECT CASE WHEN REGEXP_LIKE(first_name, '^Ste(v|ph)en$') THEN 1 ELSE 2 END FROM mytable"; + String stmt = + "SELECT CASE WHEN REGEXP_LIKE(first_name, '^Ste(v|ph)en$') THEN 1 ELSE 2 END FROM mytable"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2673,12 +2817,14 @@ public void testRegexpMySQL() throws JSQLParserException { @Test public void testNotRegexpMySQLIssue887() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE first_name NOT REGEXP '^Ste(v|ph)en$'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE first_name NOT REGEXP '^Ste(v|ph)en$'"); } @Test public void testNotRegexpMySQLIssue887_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE NOT first_name REGEXP '^Ste(v|ph)en$'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE NOT first_name REGEXP '^Ste(v|ph)en$'"); } @Test @@ -2689,12 +2835,14 @@ public void testRegexpBinaryMySQL() throws JSQLParserException { @Test public void testXorCondition() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE field = value XOR other_value"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE field = value XOR other_value"); } @Test public void testRlike() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE first_name RLIKE '^Ste(v|ph)en$'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE first_name RLIKE '^Ste(v|ph)en$'"); } @Test @@ -2756,37 +2904,43 @@ public void testNamedParameter3() throws JSQLParserException { @Test public void testComplexUnion1() throws IOException, 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)"; + 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); } @Test public void testOracleHierarchicalQuery() throws JSQLParserException { - String stmt = "SELECT last_name, employee_id, manager_id FROM employees CONNECT BY employee_id = manager_id ORDER BY last_name"; + String stmt = + "SELECT last_name, employee_id, manager_id FROM employees CONNECT BY employee_id = manager_id ORDER BY last_name"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testOracleHierarchicalQuery2() throws JSQLParserException { - String stmt = "SELECT employee_id, last_name, manager_id FROM employees CONNECT BY PRIOR employee_id = manager_id"; + String stmt = + "SELECT employee_id, last_name, manager_id FROM employees CONNECT BY PRIOR employee_id = manager_id"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testOracleHierarchicalQuery3() throws JSQLParserException { - String stmt = "SELECT last_name, employee_id, manager_id, LEVEL FROM employees START WITH employee_id = 100 CONNECT BY PRIOR employee_id = manager_id ORDER SIBLINGS BY last_name"; + String stmt = + "SELECT last_name, employee_id, manager_id, LEVEL FROM employees START WITH employee_id = 100 CONNECT BY PRIOR employee_id = manager_id ORDER SIBLINGS BY last_name"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testOracleHierarchicalQuery4() throws JSQLParserException { - String stmt = "SELECT last_name, employee_id, manager_id, LEVEL FROM employees CONNECT BY PRIOR employee_id = manager_id START WITH employee_id = 100 ORDER SIBLINGS BY last_name"; + String stmt = + "SELECT last_name, employee_id, manager_id, LEVEL FROM employees CONNECT BY PRIOR employee_id = manager_id START WITH employee_id = 100 ORDER SIBLINGS BY last_name"; assertSqlCanBeParsedAndDeparsed(stmt); } @Test public void testOracleHierarchicalQueryIssue196() throws JSQLParserException { - String stmt = "SELECT num1, num2, level FROM carol_tmp START WITH num2 = 1008 CONNECT BY num2 = PRIOR num1 ORDER BY level DESC"; + String stmt = + "SELECT num1, num2, level FROM carol_tmp START WITH num2 = 1008 CONNECT BY num2 = PRIOR num1 ORDER BY level DESC"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2816,7 +2970,24 @@ public void testPostgreSQLRegExpCaseSensitiveMatch4() throws JSQLParserException @Test public void testReservedKeyword() throws JSQLParserException { - final String statement = "SELECT cast, do, extract, first, following, last, materialized, nulls, partition, range, row, rows, siblings, value, xml FROM tableName"; // all of these are legal in SQL server; 'row' and 'rows' are not legal on Oracle, though; + final String statement = + "SELECT cast, do, extract, first, following, last, materialized, nulls, partition, range, row, rows, siblings, value, xml FROM tableName"; // all + // of + // these + // are + // legal + // in + // SQL + // server; + // 'row' + // and + // 'rows' + // are + // not + // legal + // on + // Oracle, + // though; final Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement); } @@ -2829,12 +3000,14 @@ public void testReservedKeyword2() throws JSQLParserException { @Test public void testReservedKeyword3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable1 t JOIN mytable2 AS prior ON t.id = prior.id"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable1 t JOIN mytable2 AS prior ON t.id = prior.id"); } @Test public void testCharacterSetClause() throws JSQLParserException { - String stmt = "SELECT DISTINCT CAST(`view0`.`nick2` AS CHAR (8000) CHARACTER SET utf8) AS `v0` FROM people `view0` WHERE `view0`.`nick2` IS NOT NULL"; + String stmt = + "SELECT DISTINCT CAST(`view0`.`nick2` AS CHAR (8000) CHARACTER SET utf8) AS `v0` FROM people `view0` WHERE `view0`.`nick2` IS NOT NULL"; assertSqlCanBeParsedAndDeparsed(stmt); } @@ -2852,21 +3025,26 @@ public void testGeometryDistance() throws JSQLParserException { @Test public void testJsonExpression() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram"); - assertSqlCanBeParsedAndDeparsed("SELECT * FROM sales WHERE sale->'items'->>'description' = 'milk'"); - assertSqlCanBeParsedAndDeparsed("SELECT * FROM sales WHERE sale->'items'->>'quantity' = 12::TEXT"); - //assertSqlCanBeParsedAndDeparsed("SELECT * FROM sales WHERE CAST(sale->'items'->>'quantity' AS integer) = 2"); - assertSqlCanBeParsedAndDeparsed("SELECT SUM(CAST(sale->'items'->>'quantity' AS integer)) AS total_quantity_sold FROM sales"); + assertSqlCanBeParsedAndDeparsed( + "SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM sales WHERE sale->'items'->>'description' = 'milk'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM sales WHERE sale->'items'->>'quantity' = 12::TEXT"); + // assertSqlCanBeParsedAndDeparsed("SELECT * FROM sales WHERE + // CAST(sale->'items'->>'quantity' AS integer) = 2"); + assertSqlCanBeParsedAndDeparsed( + "SELECT SUM(CAST(sale->'items'->>'quantity' AS integer)) AS total_quantity_sold FROM sales"); assertSqlCanBeParsedAndDeparsed("SELECT sale->>'items' FROM sales"); - assertSqlCanBeParsedAndDeparsed("SELECT json_typeof(sale->'items'), json_typeof(sale->'items'->'quantity') FROM sales"); - - //The following staments can be parsed but not deparsed - for (String statement : new String[]{ - "SELECT doc->'site_name' FROM websites WHERE doc @> '{\"tags\":[{\"term\":\"paris\"}, {\"term\":\"food\"}]}'", - "SELECT * FROM sales where sale ->'items' @> '[{\"count\":0}]'", - "SELECT * FROM sales where sale ->'items' ? 'name'", - "SELECT * FROM sales where sale ->'items' -# 'name'" - }) { + assertSqlCanBeParsedAndDeparsed( + "SELECT json_typeof(sale->'items'), json_typeof(sale->'items'->'quantity') FROM sales"); + + // The following staments can be parsed but not deparsed + for (String statement : new String[] { + "SELECT doc->'site_name' FROM websites WHERE doc @> '{\"tags\":[{\"term\":\"paris\"}, {\"term\":\"food\"}]}'", + "SELECT * FROM sales where sale ->'items' @> '[{\"count\":0}]'", + "SELECT * FROM sales where sale ->'items' ? 'name'", + "SELECT * FROM sales where sale ->'items' -# 'name'"}) { Select select = (Select) parserManager.parse(new StringReader(statement)); assertStatementCanBeDeparsedAs(select, statement, true); } @@ -2874,12 +3052,15 @@ public void testJsonExpression() throws JSQLParserException { @Test public void testJsonExpressionWithCastExpression() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT id FROM tbl WHERE p.company::json->'info'->>'country' = 'test'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT id FROM tbl WHERE p.company::json->'info'->>'country' = 'test'"); } @Test public void testJsonExpressionWithIntegerParameterIssue909() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select uc.\"id\", u.nickname, u.avatar, b.title, uc.images, uc.created_at as createdAt from library.ugc_comment uc INNER JOIN library.book b on (uc.books_id ->> 0)::INTEGER = b.\"id\" INNER JOIN library.users u ON uc.user_id = u.user_id where uc.id = 1", true); + assertSqlCanBeParsedAndDeparsed( + "select uc.\"id\", u.nickname, u.avatar, b.title, uc.images, uc.created_at as createdAt from library.ugc_comment uc INNER JOIN library.book b on (uc.books_id ->> 0)::INTEGER = b.\"id\" INNER JOIN library.users u ON uc.user_id = u.user_id where uc.id = 1", + true); } @Test @@ -2910,51 +3091,63 @@ public void testSelectForUpdate2() throws JSQLParserException { @Test public void testSelectJoin() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT pg_class.relname, pg_attribute.attname, pg_constraint.conname " - + "FROM pg_constraint JOIN pg_class ON pg_class.oid = pg_constraint.conrelid" - + " JOIN pg_attribute ON pg_attribute.attrelid = pg_constraint.conrelid" - + " WHERE pg_constraint.contype = 'u' AND (pg_attribute.attnum = ANY(pg_constraint.conkey))" - + " ORDER BY pg_constraint.conname"); + assertSqlCanBeParsedAndDeparsed( + "SELECT pg_class.relname, pg_attribute.attname, pg_constraint.conname " + + "FROM pg_constraint JOIN pg_class ON pg_class.oid = pg_constraint.conrelid" + + " JOIN pg_attribute ON pg_attribute.attrelid = pg_constraint.conrelid" + + " WHERE pg_constraint.contype = 'u' AND (pg_attribute.attnum = ANY(pg_constraint.conkey))" + + " ORDER BY pg_constraint.conname"); } @Test public void testSelectJoin2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM pg_constraint WHERE pg_attribute.attnum = ANY(pg_constraint.conkey)"); - assertSqlCanBeParsedAndDeparsed("SELECT * FROM pg_constraint WHERE pg_attribute.attnum = ALL(pg_constraint.conkey)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM pg_constraint WHERE pg_attribute.attnum = ANY(pg_constraint.conkey)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM pg_constraint WHERE pg_attribute.attnum = ALL(pg_constraint.conkey)"); } @Test public void testAnyConditionSubSelect() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT e1.empno, e1.sal FROM emp e1 WHERE e1.sal > ANY (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 10)", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT e1.empno, e1.sal FROM emp e1 WHERE e1.sal > ANY (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 10)", + true); } @Test public void testAllConditionSubSelect() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT e1.empno, e1.sal FROM emp e1 WHERE e1.sal > ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 10)", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT e1.empno, e1.sal FROM emp e1 WHERE e1.sal > ALL (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 10)", + true); } @Test public void testSelectOracleColl() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM the_table tt WHERE TT.COL1 = lines(idx).COL1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM the_table tt WHERE TT.COL1 = lines(idx).COL1"); } @Test public void testSelectInnerWith() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM (WITH actor AS (SELECT 'a' aid FROM DUAL) SELECT aid FROM actor)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM (WITH actor AS (SELECT 'a' aid FROM DUAL) SELECT aid FROM actor)"); } -// @Test -// public void testSelectInnerWithAndUnionIssue1084() throws JSQLParserException { -// assertSqlCanBeParsedAndDeparsed("WITH actor AS (SELECT 'b' aid FROM DUAL) SELECT aid FROM actor UNION WITH actor2 AS (SELECT 'a' aid FROM DUAL) SELECT aid FROM actor2"); -// } + // @Test + // public void testSelectInnerWithAndUnionIssue1084() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("WITH actor AS (SELECT 'b' aid FROM DUAL) SELECT aid FROM + // actor UNION WITH actor2 AS (SELECT 'a' aid FROM DUAL) SELECT aid FROM actor2"); + // } @Test public void testSelectInnerWithAndUnionIssue1084_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("WITH actor AS (SELECT 'b' aid FROM DUAL) SELECT aid FROM actor UNION SELECT aid FROM actor2"); + assertSqlCanBeParsedAndDeparsed( + "WITH actor AS (SELECT 'b' aid FROM DUAL) SELECT aid FROM actor UNION SELECT aid FROM actor2"); } @Test public void testSelectWithinGroup() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT LISTAGG(col1, '##') WITHIN GROUP (ORDER BY col1) FROM table1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT LISTAGG(col1, '##') WITHIN GROUP (ORDER BY col1) FROM table1"); } @Test @@ -2979,7 +3172,8 @@ public void testSelectBrackets2() throws JSQLParserException { @Test public void testSelectBrackets3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT avg((EXTRACT(epoch FROM age(d1, d2)) / 2)::numeric)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT avg((EXTRACT(epoch FROM age(d1, d2)) / 2)::numeric)"); } @Test @@ -2989,7 +3183,8 @@ public void testSelectBrackets4() throws JSQLParserException { @Test public void testSelectForUpdateOfTable() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT foo.*, bar.* FROM foo, bar WHERE foo.id = bar.foo_id FOR UPDATE OF foo"); + assertSqlCanBeParsedAndDeparsed( + "SELECT foo.*, bar.* FROM foo, bar WHERE foo.id = bar.foo_id FOR UPDATE OF foo"); } @Test @@ -3014,47 +3209,56 @@ public void testSelectKeywordPercent() throws JSQLParserException { @Test public void testSelectJPQLPositionalParameter() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT email FROM users WHERE (type LIKE 'B') AND (username LIKE ?1)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT email FROM users WHERE (type LIKE 'B') AND (username LIKE ?1)"); } @Test public void testSelectKeep() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT col1, min(col2) KEEP (DENSE_RANK FIRST ORDER BY col3), col4 FROM table1 GROUP BY col5 ORDER BY col3"); + assertSqlCanBeParsedAndDeparsed( + "SELECT col1, min(col2) KEEP (DENSE_RANK FIRST ORDER BY col3), col4 FROM table1 GROUP BY col5 ORDER BY col3"); } @Test public void testSelectKeepOver() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) OVER (PARTITION BY department_id ) \"Worst\" FROM employees ORDER BY department_id, salary"); + assertSqlCanBeParsedAndDeparsed( + "SELECT MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) OVER (PARTITION BY department_id ) \"Worst\" FROM employees ORDER BY department_id, salary"); } @Test public void testGroupConcat() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name"); + assertSqlCanBeParsedAndDeparsed( + "SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name"); } @Test public void testRowConstructor1() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1 WHERE (col1, col2) = (SELECT col3, col4 FROM t2 WHERE id = 10)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM t1 WHERE (col1, col2) = (SELECT col3, col4 FROM t2 WHERE id = 10)"); } @Test public void testRowConstructor2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1 WHERE ROW(col1, col2) = (SELECT col3, col4 FROM t2 WHERE id = 10)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM t1 WHERE ROW(col1, col2) = (SELECT col3, col4 FROM t2 WHERE id = 10)"); } @Test public void testIssue154() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT d.id, d.uuid, d.name, d.amount, d.percentage, d.modified_time FROM discount d LEFT OUTER JOIN discount_category dc ON d.id = dc.discount_id WHERE merchant_id = ? AND deleted = ? AND dc.discount_id IS NULL AND modified_time < ? AND modified_time >= ? ORDER BY modified_time"); + assertSqlCanBeParsedAndDeparsed( + "SELECT d.id, d.uuid, d.name, d.amount, d.percentage, d.modified_time FROM discount d LEFT OUTER JOIN discount_category dc ON d.id = dc.discount_id WHERE merchant_id = ? AND deleted = ? AND dc.discount_id IS NULL AND modified_time < ? AND modified_time >= ? ORDER BY modified_time"); } @Test public void testIssue154_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT r.id, r.uuid, r.name, r.system_role FROM role r WHERE r.merchant_id = ? AND r.deleted_time IS NULL ORDER BY r.id DESC"); + assertSqlCanBeParsedAndDeparsed( + "SELECT r.id, r.uuid, r.name, r.system_role FROM role r WHERE r.merchant_id = ? AND r.deleted_time IS NULL ORDER BY r.id DESC"); } @Test public void testIssue160_signedParameter() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT start_date WHERE start_date > DATEADD(HH, -?, GETDATE())"); + assertSqlCanBeParsedAndDeparsed( + "SELECT start_date WHERE start_date > DATEADD(HH, -?, GETDATE())"); } @Test @@ -3064,89 +3268,81 @@ public void testIssue160_signedParameter2() throws JSQLParserException { @Test public void testIssue162_doubleUserVar() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT @@SPID AS ID, SYSTEM_USER AS \"Login Name\", USER AS \"User Name\""); + assertSqlCanBeParsedAndDeparsed( + "SELECT @@SPID AS ID, SYSTEM_USER AS \"Login Name\", USER AS \"User Name\""); } @ParameterizedTest - @ValueSource(strings = { - "SELECT 'a'" - , "SELECT ''''" - , "SELECT '\\''" - , "SELECT 'ab''ab'" - , "SELECT 'ab\\'ab'" - }) + @ValueSource(strings = {"SELECT 'a'", "SELECT ''''", "SELECT '\\''", "SELECT 'ab''ab'", + "SELECT 'ab\\'ab'"}) public void testIssue167_singleQuoteEscape(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed( - sqlStr - , true - , parser -> parser.withBackslashEscapeCharacter(true) - ); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withBackslashEscapeCharacter(true)); } @ParameterizedTest - @ValueSource(strings = { - "SELECT '\\'''" - , "SELECT '\\\\\\''" - }) + @ValueSource(strings = {"SELECT '\\'''", "SELECT '\\\\\\''"}) public void testIssue167_singleQuoteEscape2(String sqlStr) throws JSQLParserException { - TestUtils.assertSqlCanBeParsedAndDeparsed( - sqlStr - , true - , parser -> parser.withBackslashEscapeCharacter(true) - ); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withBackslashEscapeCharacter(true)); } @Test public void testIssue77_singleQuoteEscape2() throws JSQLParserException { - String sqlStr ="SELECT 'test\\'' FROM dual"; - TestUtils.assertSqlCanBeParsedAndDeparsed( - sqlStr - , true - , parser -> parser.withBackslashEscapeCharacter(true) - ); + String sqlStr = "SELECT 'test\\'' FROM dual"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withBackslashEscapeCharacter(true)); } @Test public void testIssue223_singleQuoteEscape() throws JSQLParserException { String sqlStr = "SELECT '\\'test\\''"; - TestUtils.assertSqlCanBeParsedAndDeparsed( - sqlStr - , true - , parser -> parser.withBackslashEscapeCharacter(true) - ); + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true, + parser -> parser.withBackslashEscapeCharacter(true)); } @Test public void testOracleHint() throws JSQLParserException { assertOracleHintExists("SELECT /*+ SOMEHINT */ * FROM mytable", true, "SOMEHINT"); - assertOracleHintExists("SELECT /*+ MORE HINTS POSSIBLE */ * FROM mytable", true, "MORE HINTS POSSIBLE"); - assertOracleHintExists("SELECT /*+ MORE\nHINTS\t\nPOSSIBLE */ * FROM mytable", true, "MORE\nHINTS\t\nPOSSIBLE"); - assertOracleHintExists("SELECT /*+ leading(sn di md sh ot) cardinality(ot 1000) */ c, b FROM mytable", true, "leading(sn di md sh ot) cardinality(ot 1000)"); + assertOracleHintExists("SELECT /*+ MORE HINTS POSSIBLE */ * FROM mytable", true, + "MORE HINTS POSSIBLE"); + assertOracleHintExists("SELECT /*+ MORE\nHINTS\t\nPOSSIBLE */ * FROM mytable", true, + "MORE\nHINTS\t\nPOSSIBLE"); + assertOracleHintExists( + "SELECT /*+ leading(sn di md sh ot) cardinality(ot 1000) */ c, b FROM mytable", + true, "leading(sn di md sh ot) cardinality(ot 1000)"); assertOracleHintExists("SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" - + " USE_NL (glcc glf) USE_MERGE (gp gsb) */\n" - + " b.application_id\n" - + "FROM jl_br_journals j,\n" - + " po_vendors p", true, "ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" - + " USE_NL (glcc glf) USE_MERGE (gp gsb)"); - assertOracleHintExists("SELECT /*+ROWID(emp)*/ /*+ THIS IS NOT HINT! ***/ * \n" - + "FROM emp \n" - + "WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND empno = 155", false, "ROWID(emp)"); - assertOracleHintExists("SELECT /*+ INDEX(patients sex_index) use sex_index because there are few\n" - + " male patients */ name, height, weight\n" - + "FROM patients\n" - + "WHERE sex = 'm'", true, "INDEX(patients sex_index) use sex_index because there are few\n male patients"); - assertOracleHintExists("SELECT /*+INDEX_COMBINE(emp sal_bmi hiredate_bmi)*/ * \n" - + "FROM emp \n" - + "WHERE sal < 50000 AND hiredate < '01-JAN-1990'", true, "INDEX_COMBINE(emp sal_bmi hiredate_bmi)"); - assertOracleHintExists("SELECT --+ CLUSTER \n" - + "emp.ename, deptno\n" - + "FROM emp, dept\n" - + "WHERE deptno = 10 \n" - + "AND emp.deptno = dept.deptno", true, "CLUSTER"); - assertOracleHintExists("SELECT --+ CLUSTER \n --+ some other comment, not hint\n /* even more comments */ * from dual", false, "CLUSTER"); - assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual)", true, null, "CLUSTER"); - assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual) UNION (select * from dual)", true, null, "CLUSTER", null); - assertOracleHintExists("(SELECT --+ HINT1 HINT2 HINT3\n * from t1) UNION (select /*+ HINT4 HINT5 */ * from dual)", true, "HINT1 HINT2 HINT3", "HINT4 HINT5"); + + " USE_NL (glcc glf) USE_MERGE (gp gsb) */\n" + " b.application_id\n" + + "FROM jl_br_journals j,\n" + " po_vendors p", true, + "ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) \n" + + " USE_NL (glcc glf) USE_MERGE (gp gsb)"); + assertOracleHintExists( + "SELECT /*+ROWID(emp)*/ /*+ THIS IS NOT HINT! ***/ * \n" + "FROM emp \n" + + "WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND empno = 155", + false, "ROWID(emp)"); + assertOracleHintExists( + "SELECT /*+ INDEX(patients sex_index) use sex_index because there are few\n" + + " male patients */ name, height, weight\n" + "FROM patients\n" + + "WHERE sex = 'm'", + true, + "INDEX(patients sex_index) use sex_index because there are few\n male patients"); + assertOracleHintExists( + "SELECT /*+INDEX_COMBINE(emp sal_bmi hiredate_bmi)*/ * \n" + "FROM emp \n" + + "WHERE sal < 50000 AND hiredate < '01-JAN-1990'", + true, "INDEX_COMBINE(emp sal_bmi hiredate_bmi)"); + assertOracleHintExists("SELECT --+ CLUSTER \n" + "emp.ename, deptno\n" + "FROM emp, dept\n" + + "WHERE deptno = 10 \n" + "AND emp.deptno = dept.deptno", true, "CLUSTER"); + assertOracleHintExists( + "SELECT --+ CLUSTER \n --+ some other comment, not hint\n /* even more comments */ * from dual", + false, "CLUSTER"); + assertOracleHintExists("(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual)", true, + null, "CLUSTER"); + assertOracleHintExists( + "(SELECT * from t1) UNION (select /*+ CLUSTER */ * from dual) UNION (select * from dual)", + true, null, "CLUSTER", null); + assertOracleHintExists( + "(SELECT --+ HINT1 HINT2 HINT3\n * from t1) UNION (select /*+ HINT4 HINT5 */ * from dual)", + true, "HINT1 HINT2 HINT3", "HINT4 HINT5"); } @@ -3227,7 +3423,8 @@ public void testTableFunctionWithAlias() throws Exception { @Test public void testIssue151_tableFunction() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM tables a LEFT JOIN getdata() b ON a.id = b.id"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM tables a LEFT JOIN getdata() b ON a.id = b.id"); } @Test @@ -3237,37 +3434,44 @@ 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"); + 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"); } @Test public void testIssue215_possibleEndlessParsing2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT (CASE WHEN ((value LIKE '%t1%') OR (value LIKE '%t2%')) THEN 't1s' ELSE 'Other' END) FROM tab1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT (CASE WHEN ((value LIKE '%t1%') OR (value LIKE '%t2%')) THEN 't1s' ELSE 'Other' END) FROM tab1"); } @Test public void testIssue215_possibleEndlessParsing3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE ((((((((((((((((((((((((((((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%'))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE ((((((((((((((((((((((((((((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%'))"); } @Test public void testIssue215_possibleEndlessParsing4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE ((value LIKE '%t3%') OR (value LIKE '%t3%'))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE ((value LIKE '%t3%') OR (value LIKE '%t3%'))"); } @Test public void testIssue215_possibleEndlessParsing5() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE ((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%'))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE ((((((value LIKE '%t3%') OR (value LIKE '%t3%')) OR (value LIKE '%t3%')) OR (value LIKE '%t4%')) OR (value LIKE '%t4%')) OR (value LIKE '%t5%'))"); } @Test public void testIssue215_possibleEndlessParsing6() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (((((((((((((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%'))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE (((((((((((((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%'))"); } @Test public void testIssue215_possibleEndlessParsing7() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (((((((((((((((((((((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%'))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE (((((((((((((((((((((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%'))"); } @Test @@ -3287,7 +3491,8 @@ public void testBooleanValue2() throws JSQLParserException { @Test public void testNotWithoutParenthesisIssue234() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM \"Persons\" WHERE NOT \"F_NAME\" = 'John'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT count(*) FROM \"Persons\" WHERE NOT \"F_NAME\" = 'John'"); } @Test @@ -3307,23 +3512,25 @@ public void testCaseKeyword() throws JSQLParserException { @Test public void testCastToSignedInteger() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CAST(contact_id AS SIGNED INTEGER) FROM contact WHERE contact_id = 20"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CAST(contact_id AS SIGNED INTEGER) FROM contact WHERE contact_id = 20"); } @Test public void testCastToSigned() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CAST(contact_id AS SIGNED) FROM contact WHERE contact_id = 20"); + assertSqlCanBeParsedAndDeparsed( + "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 + // 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 public void testWhereIssue240_true() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE true"); @@ -3341,14 +3548,16 @@ public void testWhereIssue241KeywordEnd() throws JSQLParserException { @Test public void testSpeedTestIssue235() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM tbl WHERE (ROUND((((((period_diff(date_format(tbl.CD, '%Y%m'), date_format(SUBTIME(CURRENT_TIMESTAMP(), 25200), '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(), 25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),25200)) - MONTH('2012-02-01')) - 1) / 3)))) = -3)", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM tbl WHERE (ROUND((((((period_diff(date_format(tbl.CD, '%Y%m'), date_format(SUBTIME(CURRENT_TIMESTAMP(), 25200), '%Y%m')) + month(SUBTIME(CURRENT_TIMESTAMP(), 25200))) - MONTH('2012-02-01')) - 1) / 3) - ROUND((((month(SUBTIME(CURRENT_TIMESTAMP(),25200)) - MONTH('2012-02-01')) - 1) / 3)))) = -3)", + true); } @Test public void testSpeedTestIssue235_2() throws IOException, JSQLParserException { - String stmt = IOUtils.toString(SelectTest.class. - getResourceAsStream("large-sql-issue-235.txt"), - Charset.forName("UTF-8")); + String stmt = + IOUtils.toString(SelectTest.class.getResourceAsStream("large-sql-issue-235.txt"), + Charset.forName("UTF-8")); assertSqlCanBeParsedAndDeparsed(stmt, true); } @@ -3359,7 +3568,8 @@ public void testCastVarCharMaxIssue245() throws JSQLParserException { @Test public void testNestedFunctionCallIssue253() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT (replace_regex(replace_regex(replace_regex(get_json_string(a_column, 'value'), '\\n', ' '), '\\r', ' '), '\\\\', '\\\\\\\\')) FROM a_table WHERE b_column = 'value'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT (replace_regex(replace_regex(replace_regex(get_json_string(a_column, 'value'), '\\n', ' '), '\\r', ' '), '\\\\', '\\\\\\\\')) FROM a_table WHERE b_column = 'value'"); } @Test @@ -3389,7 +3599,8 @@ public void testFunctionIssue284() throws JSQLParserException { @Test public void testFunctionDateTimeValues() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM tab1 WHERE a > TIMESTAMP '2004-04-30 04:05:34.56'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM tab1 WHERE a > TIMESTAMP '2004-04-30 04:05:34.56'"); } @Test @@ -3400,13 +3611,15 @@ public void testPR73() throws JSQLParserException { @Test public void testUniqueInsteadOfDistinctIssue299() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT UNIQUE trunc(timez(ludate)+ 8/24) bus_dt, j.object j_name , timez(j.starttime) START_TIME , timez(j.endtime) END_TIME FROM TEST_1 j", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT UNIQUE trunc(timez(ludate)+ 8/24) bus_dt, j.object j_name , timez(j.starttime) START_TIME , timez(j.endtime) END_TIME FROM TEST_1 j", + true); } @Test public void testProblemSqlIssue265() throws IOException, JSQLParserException { - String sqls = IOUtils.toString(SelectTest.class. - getResourceAsStream("large-sql-with-issue-265.txt"), + String sqls = IOUtils.toString( + SelectTest.class.getResourceAsStream("large-sql-with-issue-265.txt"), Charset.forName("UTF-8")); Statements stmts = CCJSqlParserUtil.parseStatements(sqls); assertEquals(2, stmts.getStatements().size()); @@ -3414,17 +3627,27 @@ public void testProblemSqlIssue265() throws IOException, JSQLParserException { @Test public void testProblemSqlIssue330() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COUNT(*) FROM C_Invoice WHERE IsSOTrx='Y' AND (Processed='N' OR Updated>(current_timestamp - CAST('90 days' AS interval))) AND C_Invoice.AD_Client_ID IN(0,1010016) AND C_Invoice.AD_Org_ID IN(0,1010053,1010095,1010094)", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT COUNT(*) FROM C_Invoice WHERE IsSOTrx='Y' AND (Processed='N' OR Updated>(current_timestamp - CAST('90 days' AS interval))) AND C_Invoice.AD_Client_ID IN(0,1010016) AND C_Invoice.AD_Org_ID IN(0,1010053,1010095,1010094)", + true); } @Test public void testProblemSqlIssue330_2() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT CAST('90 days' AS interval)"); } - // won't fix due to lookahead impact on parser - // @Test public void testKeywordOrderAsColumnnameIssue333() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("SELECT choice.response_choice_id AS uuid, choice.digit AS digit, choice.text_response AS textResponse, choice.voice_prompt AS voicePrompt, choice.action AS action, choice.contribution AS contribution, choice.order_num AS order, choice.description AS description, choice.is_join_conference AS joinConference, choice.voice_prompt_language_code AS voicePromptLanguageCode, choice.text_response_language_code AS textResponseLanguageCode, choice.description_language_code AS descriptionLanguageCode, choice.rec_phrase AS recordingPhrase FROM response_choices choice WHERE choice.presentation_id = ? ORDER BY choice.order_num", true); - // } + // won't fix due to lookahead impact on parser + // @Test public void testKeywordOrderAsColumnnameIssue333() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("SELECT choice.response_choice_id AS uuid, choice.digit AS + // digit, choice.text_response AS textResponse, choice.voice_prompt AS voicePrompt, + // choice.action AS action, choice.contribution AS contribution, choice.order_num AS order, + // choice.description AS description, choice.is_join_conference AS joinConference, + // choice.voice_prompt_language_code AS voicePromptLanguageCode, + // choice.text_response_language_code AS textResponseLanguageCode, + // choice.description_language_code AS descriptionLanguageCode, choice.rec_phrase AS + // recordingPhrase FROM response_choices choice WHERE choice.presentation_id = ? ORDER BY + // choice.order_num", true); + // } @Test public void testProblemKeywordCommitIssue341() throws JSQLParserException { @@ -3438,32 +3661,59 @@ public void testProblemSqlIssue352() throws JSQLParserException { @Test public void testProblemIsIssue331() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT C_DocType.C_DocType_ID,NULL,COALESCE(C_DocType_Trl.Name,C_DocType.Name) AS Name,C_DocType.IsActive FROM C_DocType LEFT JOIN C_DocType_TRL ON (C_DocType.C_DocType_ID=C_DocType_Trl.C_DocType_ID AND C_DocType_Trl.AD_Language='es_AR') WHERE C_DocType.AD_Client_ID=1010016 AND C_DocType.AD_Client_ID IN (0,1010016) AND C_DocType.c_doctype_id in ( select c_doctype2.c_doctype_id from c_doctype as c_doctype2 where substring( c_doctype2.printname,6, length(c_doctype2.printname) ) = ( select letra from c_letra_comprobante as clc where clc.c_letra_comprobante_id = 1010039) ) AND ( (1010094!=0 AND C_DocType.ad_org_id = 1010094) OR 1010094=0 ) ORDER BY 3 LIMIT 2000", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT C_DocType.C_DocType_ID,NULL,COALESCE(C_DocType_Trl.Name,C_DocType.Name) AS Name,C_DocType.IsActive FROM C_DocType LEFT JOIN C_DocType_TRL ON (C_DocType.C_DocType_ID=C_DocType_Trl.C_DocType_ID AND C_DocType_Trl.AD_Language='es_AR') WHERE C_DocType.AD_Client_ID=1010016 AND C_DocType.AD_Client_ID IN (0,1010016) AND C_DocType.c_doctype_id in ( select c_doctype2.c_doctype_id from c_doctype as c_doctype2 where substring( c_doctype2.printname,6, length(c_doctype2.printname) ) = ( select letra from c_letra_comprobante as clc where clc.c_letra_comprobante_id = 1010039) ) AND ( (1010094!=0 AND C_DocType.ad_org_id = 1010094) OR 1010094=0 ) ORDER BY 3 LIMIT 2000", + true); } @Test public void testProblemIssue375() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids 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); + assertSqlCanBeParsedAndDeparsed( + "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids 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); } @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", true); + 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); } @Test public void testProblemIssue375Simplified2() 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", true); + 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", + true); } - // @Test public void testProblemIssue377() throws Exception { - // try { - // assertSqlCanBeParsedAndDeparsed("select 'yelp'::name as pktable_cat, n2.nspname as pktable_schem, c2.relname as pktable_name, a2.attname as pkcolumn_name, 'yelp'::name as fktable_cat, n1.nspname as fktable_schem, c1.relname as fktable_name, a1.attname as fkcolumn_name, i::int2 as key_seq, case ref.confupdtype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as update_rule, case ref.confdeltype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as delete_rule, ref.conname as fk_name, cn.conname as pk_name, case when ref.condeferrable then case when ref.condeferred then 5::int2 else 6::int2 end else 7::int2 end as deferrablity from ((((((( (select cn.oid, conrelid, conkey, confrelid, confkey, generate_series(array_lower(conkey, 1), array_upper(conkey, 1)) as i, confupdtype, confdeltype, conname, condeferrable, condeferred from pg_catalog.pg_constraint cn, pg_catalog.pg_class c, pg_catalog.pg_namespace n where contype = 'f' and conrelid = c.oid and relname = 'business' and n.oid = c.relnamespace and n.nspname = 'public' ) ref inner join pg_catalog.pg_class c1 on c1.oid = ref.conrelid) inner join pg_catalog.pg_namespace n1 on n1.oid = c1.relnamespace) inner join pg_catalog.pg_attribute a1 on a1.attrelid = c1.oid and a1.attnum = conkey[i]) inner join pg_catalog.pg_class c2 on c2.oid = ref.confrelid) inner join pg_catalog.pg_namespace n2 on n2.oid = c2.relnamespace) inner join pg_catalog.pg_attribute a2 on a2.attrelid = c2.oid and a2.attnum = confkey[i]) left outer join pg_catalog.pg_constraint cn on cn.conrelid = ref.confrelid and cn.contype = 'p') order by ref.oid, ref.i", true); - // } catch (Exception ex) { - // ex.printStackTrace(); - // throw ex; - // } - // } + // @Test public void testProblemIssue377() throws Exception { + // try { + // assertSqlCanBeParsedAndDeparsed("select 'yelp'::name as pktable_cat, n2.nspname as + // pktable_schem, c2.relname as pktable_name, a2.attname as pkcolumn_name, 'yelp'::name as + // fktable_cat, n1.nspname as fktable_schem, c1.relname as fktable_name, a1.attname as + // fkcolumn_name, i::int2 as key_seq, case ref.confupdtype when 'c' then 0::int2 when 'n' then + // 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as update_rule, case + // ref.confdeltype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' + // then 1::int2 else 3::int2 end as delete_rule, ref.conname as fk_name, cn.conname as pk_name, + // case when ref.condeferrable then case when ref.condeferred then 5::int2 else 6::int2 end else + // 7::int2 end as deferrablity from ((((((( (select cn.oid, conrelid, conkey, confrelid, + // confkey, generate_series(array_lower(conkey, 1), array_upper(conkey, 1)) as i, confupdtype, + // confdeltype, conname, condeferrable, condeferred from pg_catalog.pg_constraint cn, + // pg_catalog.pg_class c, pg_catalog.pg_namespace n where contype = 'f' and conrelid = c.oid and + // relname = 'business' and n.oid = c.relnamespace and n.nspname = 'public' ) ref inner join + // pg_catalog.pg_class c1 on c1.oid = ref.conrelid) inner join pg_catalog.pg_namespace n1 on + // n1.oid = c1.relnamespace) inner join pg_catalog.pg_attribute a1 on a1.attrelid = c1.oid and + // a1.attnum = conkey[i]) inner join pg_catalog.pg_class c2 on c2.oid = ref.confrelid) inner + // join pg_catalog.pg_namespace n2 on n2.oid = c2.relnamespace) inner join + // pg_catalog.pg_attribute a2 on a2.attrelid = c2.oid and a2.attnum = confkey[i]) left outer + // join pg_catalog.pg_constraint cn on cn.conrelid = ref.confrelid and cn.contype = 'p') order + // by ref.oid, ref.i", true); + // } catch (Exception ex) { + // ex.printStackTrace(); + // throw ex; + // } + // } @Test public void testProblemInNotInProblemIssue379() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT rank FROM DBObjects WHERE rank NOT IN (0, 1)"); @@ -3472,7 +3722,8 @@ public void testProblemInNotInProblemIssue379() throws JSQLParserException { @Test public void testProblemLargeNumbersIssue390() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM student WHERE student_no = 20161114000000035001"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM student WHERE student_no = 20161114000000035001"); } @Test @@ -3494,8 +3745,8 @@ public void testForUpdateWaitParseDeparse() throws JSQLParserException { } /** - * Validates that a SELECT with FOR UPDATE WAIT correctly sets a {@link Wait} with the correct timeout - * value. + * Validates that a SELECT with FOR UPDATE WAIT correctly sets a {@link Wait} with the + * correct timeout value. */ @Test public void testForUpdateWaitWithTimeout() throws JSQLParserException { @@ -3514,13 +3765,14 @@ 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() 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_2() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("select * from all"); + // } @Test public void testMysqlIndexHints() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT column FROM testtable AS t0 USE INDEX (index1)"); @@ -3530,21 +3782,28 @@ public void testMysqlIndexHints() throws JSQLParserException { @Test public void testMysqlIndexHintsWithJoins() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT column FROM table0 t0 INNER JOIN table1 t1 USE INDEX (index1)"); - assertSqlCanBeParsedAndDeparsed("SELECT column FROM table0 t0 INNER JOIN table1 t1 IGNORE INDEX (index1)"); - assertSqlCanBeParsedAndDeparsed("SELECT column FROM table0 t0 INNER JOIN table1 t1 FORCE INDEX (index1)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT column FROM table0 t0 INNER JOIN table1 t1 USE INDEX (index1)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT column FROM table0 t0 INNER JOIN table1 t1 IGNORE INDEX (index1)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT column FROM table0 t0 INNER JOIN table1 t1 FORCE INDEX (index1)"); } @Test public void testMysqlMultipleIndexHints() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT column FROM testtable AS t0 USE INDEX (index1,index2)"); - assertSqlCanBeParsedAndDeparsed("SELECT column FROM testtable AS t0 IGNORE INDEX (index1,index2)"); - assertSqlCanBeParsedAndDeparsed("SELECT column FROM testtable AS t0 FORCE INDEX (index1,index2)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT column FROM testtable AS t0 USE INDEX (index1,index2)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT column FROM testtable AS t0 IGNORE INDEX (index1,index2)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT column FROM testtable AS t0 FORCE INDEX (index1,index2)"); } @Test public void testSqlServerHints() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM TB_Sys_Pedido WITH (NOLOCK) WHERE ID_Pedido = :ID_Pedido"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM TB_Sys_Pedido WITH (NOLOCK) WHERE ID_Pedido = :ID_Pedido"); } @Test @@ -3554,7 +3813,8 @@ public void testSqlServerHintsWithIndexIssue915() throws JSQLParserException { @Test public void testSqlServerHintsWithIndexIssue915_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT 1 FROM tableName1 AS t1 WITH (INDEX (idx1)) JOIN tableName2 AS t2 WITH (INDEX (idx2)) ON t1.id = t2.id"); + assertSqlCanBeParsedAndDeparsed( + "SELECT 1 FROM tableName1 AS t1 WITH (INDEX (idx1)) JOIN tableName2 AS t2 WITH (INDEX (idx2)) ON t1.id = t2.id"); } @Test @@ -3564,12 +3824,15 @@ public void testProblemIssue435() throws JSQLParserException { @Test public void testProblemIssue437Index() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select count(id) from p_custom_data ignore index(pri) where tenant_id=28257 and entity_id=92609 and delete_flg=0 and ( (dbc_relation_2 = 52701) and (dbc_relation_2 in ( select id from a_order where tenant_id = 28257 and 1=1 ) ) ) order by id desc, id desc", true); + assertSqlCanBeParsedAndDeparsed( + "select count(id) from p_custom_data ignore index(pri) where tenant_id=28257 and entity_id=92609 and delete_flg=0 and ( (dbc_relation_2 = 52701) and (dbc_relation_2 in ( select id from a_order where tenant_id = 28257 and 1=1 ) ) ) order by id desc, id desc", + true); } @Test public void testProblemIssue445() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT E.ID_NUMBER, row_number() OVER (PARTITION BY E.ID_NUMBER ORDER BY E.DEFINED_UPDATED DESC) rn FROM T_EMPLOYMENT E"); + assertSqlCanBeParsedAndDeparsed( + "SELECT E.ID_NUMBER, row_number() OVER (PARTITION BY E.ID_NUMBER ORDER BY E.DEFINED_UPDATED DESC) rn FROM T_EMPLOYMENT E"); } @Test @@ -3579,7 +3842,8 @@ public void testProblemIssue485Date() throws JSQLParserException { @Test public void testGroupByProblemIssue482() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT SUM(orderTotalValue) AS value, MONTH(invoiceDate) AS month, YEAR(invoiceDate) AS year FROM invoice.Invoices WHERE projectID = 1 GROUP BY MONTH(invoiceDate), YEAR(invoiceDate) ORDER BY YEAR(invoiceDate) DESC, MONTH(invoiceDate) DESC"); + assertSqlCanBeParsedAndDeparsed( + "SELECT SUM(orderTotalValue) AS value, MONTH(invoiceDate) AS month, YEAR(invoiceDate) AS year FROM invoice.Invoices WHERE projectID = 1 GROUP BY MONTH(invoiceDate), YEAR(invoiceDate) ORDER BY YEAR(invoiceDate) DESC, MONTH(invoiceDate) DESC"); } @Test @@ -3598,7 +3862,8 @@ public void testIssue512_2() throws JSQLParserException { @Test public void testIssue514() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT listagg(c1, ';') WITHIN GROUP (PARTITION BY 1 ORDER BY 1) col FROM dual"); + assertSqlCanBeParsedAndDeparsed( + "SELECT listagg(c1, ';') WITHIN GROUP (PARTITION BY 1 ORDER BY 1) col FROM dual"); } @Test @@ -3609,7 +3874,9 @@ public void testIssue508LeftRightBitwiseShift() throws JSQLParserException { @Test public void testIssue522() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE mr.required_quantity - mr.quantity_issued WHEN 0 THEN NULL ELSE CASE SIGN(mr.required_quantity) WHEN -1 * SIGN(mr.quantity_issued) THEN mr.required_quantity - mr.quantity_issued ELSE CASE SIGN(ABS(mr.required_quantity) - ABS(mr.quantity_issued)) WHEN -1 THEN NULL ELSE mr.required_quantity - mr.quantity_issued END END END quantity_open FROM mytable", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE mr.required_quantity - mr.quantity_issued WHEN 0 THEN NULL ELSE CASE SIGN(mr.required_quantity) WHEN -1 * SIGN(mr.quantity_issued) THEN mr.required_quantity - mr.quantity_issued ELSE CASE SIGN(ABS(mr.required_quantity) - ABS(mr.quantity_issued)) WHEN -1 THEN NULL ELSE mr.required_quantity - mr.quantity_issued END END END quantity_open FROM mytable", + true); } @Test @@ -3619,12 +3886,15 @@ public void testIssue522_2() throws JSQLParserException { @Test public void testIssue522_3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE SIGN(mr.required_quantity) WHEN -1 * SIGN(mr.quantity_issued) THEN mr.required_quantity - mr.quantity_issued ELSE 5 END quantity_open FROM mytable", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE SIGN(mr.required_quantity) WHEN -1 * SIGN(mr.quantity_issued) THEN mr.required_quantity - mr.quantity_issued ELSE 5 END quantity_open FROM mytable", + true); } @Test public void testIssue522_4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE a + b WHEN -1 * 5 THEN 1 ELSE CASE b + c WHEN -1 * 6 THEN 2 ELSE 3 END END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE a + b WHEN -1 * 5 THEN 1 ELSE CASE b + c WHEN -1 * 6 THEN 2 ELSE 3 END END"); } @Test @@ -3644,8 +3914,9 @@ public void testIssue572TaskReplacement() throws JSQLParserException { @Test public void testIssue566LargeView() throws IOException, JSQLParserException { - String stmt = IOUtils.toString(SelectTest.class.getResourceAsStream("large-sql-issue-566.txt"), - Charset.forName("UTF-8")); + String stmt = + IOUtils.toString(SelectTest.class.getResourceAsStream("large-sql-issue-566.txt"), + Charset.forName("UTF-8")); assertSqlCanBeParsedAndDeparsed(stmt, true); } @@ -3661,7 +3932,8 @@ public void testEscaped() throws IOException, JSQLParserException { @Test public void testIssue563MultiSubJoin() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT c FROM ((SELECT a FROM t) JOIN (SELECT b FROM t2) ON a = B JOIN (SELECT c FROM t3) ON b = c)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT c FROM ((SELECT a FROM t) JOIN (SELECT b FROM t2) ON a = B JOIN (SELECT c FROM t3) ON b = c)"); } @Test @@ -3677,7 +3949,8 @@ public void testIssue582NumericConstants() throws JSQLParserException { @Test public void testIssue583CharacterLiteralAsAlias() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN T.ISC = 1 THEN T.EXTDESC WHEN T.b = 2 THEN '2' ELSE T.C END AS 'Test' FROM T"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN T.ISC = 1 THEN T.EXTDESC WHEN T.b = 2 THEN '2' ELSE T.C END AS 'Test' FROM T"); } @Test @@ -3714,15 +3987,18 @@ public void testParenthesisAroundFromItem3() throws JSQLParserException { @Test public void testJoinerExpressionIssue596() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM a JOIN (b JOIN c ON b.id = c.id) ON a.id = c.id"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM a JOIN (b JOIN c ON b.id = c.id) ON a.id = c.id"); } - // @Test public void testJoinerExpressionIssue596_2() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("SELECT * FROM a JOIN b JOIN c ON b.id = c.id ON a.id = c.id"); - // } + // @Test public void testJoinerExpressionIssue596_2() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("SELECT * FROM a JOIN b JOIN c ON b.id = c.id ON a.id = + // c.id"); + // } @Test public void testProblemSqlIssue603() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN MAX(CAST(a.jobNum AS INTEGER)) IS NULL THEN '1000' ELSE MAX(CAST(a.jobNum AS INTEGER)) + 1 END FROM user_employee a"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN MAX(CAST(a.jobNum AS INTEGER)) IS NULL THEN '1000' ELSE MAX(CAST(a.jobNum AS INTEGER)) + 1 END FROM user_employee a"); } @Test @@ -3732,7 +4008,9 @@ public void testProblemSqlIssue603_2() throws JSQLParserException { @Test public void testProblemSqlFuncParamIssue605() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT p.id, pt.name, array_to_string( array( select pc.name from product_category pc ), ',' ) AS categories FROM product p", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT p.id, pt.name, array_to_string( array( select pc.name from product_category pc ), ',' ) AS categories FROM product p", + true); } @Test @@ -3742,7 +4020,8 @@ public void testProblemSqlFuncParamIssue605_2() throws JSQLParserException { @Test public void testSqlContainIsNullFunctionShouldBeParsed() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT name, age, ISNULL(home, 'earn more money') FROM person"); + assertSqlCanBeParsedAndDeparsed( + "SELECT name, age, ISNULL(home, 'earn more money') FROM person"); } @Test @@ -3754,7 +4033,8 @@ public void testNestedCast() throws JSQLParserException { public void testAndOperator() throws JSQLParserException { String stmt = "SELECT name from customers where name = 'John' && lastname = 'Doh'"; Statement parsed = parserManager.parse(new StringReader(stmt)); - assertStatementCanBeDeparsedAs(parsed, "SELECT name FROM customers WHERE name = 'John' && lastname = 'Doh'"); + assertStatementCanBeDeparsedAs(parsed, + "SELECT name FROM customers WHERE name = 'John' && lastname = 'Doh'"); } @Test @@ -3795,7 +4075,8 @@ public void testMultiPartNames5() throws JSQLParserException { @Test public void testMultiPartNamesIssue163() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT mymodel.name FROM com.myproject.MyModelClass AS mymodel"); + assertSqlCanBeParsedAndDeparsed( + "SELECT mymodel.name FROM com.myproject.MyModelClass AS mymodel"); } @Test @@ -3808,8 +4089,8 @@ public void testMultiPartNamesForFunctionsIssue944() throws JSQLParserException assertSqlCanBeParsedAndDeparsed("SELECT pg_catalog.now()"); } - // Teradata allows SEL to be used in place of SELECT - // Deparse to the non-contracted form + // Teradata allows SEL to be used in place of SELECT + // Deparse to the non-contracted form @Test public void testSelContraction() throws JSQLParserException { final String statementSrc = "SEL name, age FROM person"; @@ -3820,7 +4101,8 @@ public void testSelContraction() throws JSQLParserException { @Test public void testMultiPartNamesIssue643() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT id, bid, pid, devnum, pointdesc, sysid, zone, sort FROM fault ORDER BY id DESC LIMIT ?, ?"); + assertSqlCanBeParsedAndDeparsed( + "SELECT id, bid, pid, devnum, pointdesc, sysid, zone, sort FROM fault ORDER BY id DESC LIMIT ?, ?"); } @Test @@ -3840,7 +4122,8 @@ public void testTrueFalseLiteral() throws JSQLParserException { @Test public void testTopKeyWord() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT top.date AS mycol1 FROM mytable top WHERE top.myid = :myid AND top.myid2 = 123"); + assertSqlCanBeParsedAndDeparsed( + "SELECT top.date AS mycol1 FROM mytable top WHERE top.myid = :myid AND top.myid2 = 123"); } @Test @@ -3865,32 +4148,38 @@ public void testNotProblem2() throws JSQLParserException { @Test public void testCaseThenCondition() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE CASE WHEN a = 'c' THEN a IN (1, 2, 3) END = 1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE CASE WHEN a = 'c' THEN a IN (1, 2, 3) END = 1"); } @Test public void testCaseThenCondition2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE CASE WHEN a = 'c' THEN a IN (1, 2, 3) END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE CASE WHEN a = 'c' THEN a IN (1, 2, 3) END"); } @Test public void testCaseThenCondition3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN a > 0 THEN b + a ELSE 0 END p FROM mytable"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN a > 0 THEN b + a ELSE 0 END p FROM mytable"); } @Test public void testCaseThenCondition4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM col WHERE CASE WHEN a = 'c' THEN a IN (SELECT id FROM mytable) END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM col WHERE CASE WHEN a = 'c' THEN a IN (SELECT id FROM mytable) END"); } @Test public void testCaseThenCondition5() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM col WHERE CASE WHEN a = 'c' THEN a IN (SELECT id FROM mytable) ELSE b IN (SELECT id FROM mytable) END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM col WHERE CASE WHEN a = 'c' THEN a IN (SELECT id FROM mytable) ELSE b IN (SELECT id FROM mytable) END"); } @Test public void testOptimizeForIssue348() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM EMP ORDER BY SALARY DESC OPTIMIZE FOR 20 ROWS"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM EMP ORDER BY SALARY DESC OPTIMIZE FOR 20 ROWS"); } @Test @@ -3905,42 +4194,51 @@ public void testFuncConditionParameter2() throws JSQLParserException { @Test public void testFuncConditionParameter3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CAST((MAX(CAST(IIF(isnumeric(license_no) = 1, license_no, 0) AS INT)) + 2) AS varchar) FROM lcps.t_license WHERE profession_id = 60 and license_type = 100 and YEAR(issue_date) % 2 = case when YEAR(issue_date) % 2 = 0 then 0 else 1 end and ISNUMERIC(license_no) = 1", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT CAST((MAX(CAST(IIF(isnumeric(license_no) = 1, license_no, 0) AS INT)) + 2) AS varchar) FROM lcps.t_license WHERE profession_id = 60 and license_type = 100 and YEAR(issue_date) % 2 = case when YEAR(issue_date) % 2 = 0 then 0 else 1 end and ISNUMERIC(license_no) = 1", + true); } @Test public void testFuncConditionParameter4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT IIF(isnumeric(license_no) = 1, license_no, 0) FROM mytable", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT IIF(isnumeric(license_no) = 1, license_no, 0) FROM mytable", true); } @Test public void testSqlContainIsNullFunctionShouldBeParsed3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT name, age FROM person WHERE NOT ISNULL(home, 'earn more money')"); + assertSqlCanBeParsedAndDeparsed( + "SELECT name, age FROM person WHERE NOT ISNULL(home, 'earn more money')"); } @Test public void testForXmlPath() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT '|' + person_name FROM person JOIN person_group ON person.person_id = person_group.person_id WHERE person_group.group_id = 1 FOR XML PATH('')"); + assertSqlCanBeParsedAndDeparsed( + "SELECT '|' + person_name FROM person JOIN person_group ON person.person_id = person_group.person_id WHERE person_group.group_id = 1 FOR XML PATH('')"); } - // @Test - // public void testForXmlPath2() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("SELECT ( STUFF( (SELECT '|' + person_name FROM person JOIN person_group ON person.person_id = person_group.person_id WHERE person_group.group_id = 1 FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,'')) AS person_name"); - // } + // @Test + // public void testForXmlPath2() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("SELECT ( STUFF( (SELECT '|' + person_name FROM person JOIN + // person_group ON person.person_id = person_group.person_id WHERE person_group.group_id = 1 FOR + // XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1,'')) AS person_name"); + // } @Test - public void testChainedunctions() throws JSQLParserException { + public void testChainedFunctions() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT func('').func2('') AS foo FROM some_tables"); } @Test public void testCollateExprIssue164() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT u.name COLLATE Latin1_General_CI_AS AS User FROM users u"); + assertSqlCanBeParsedAndDeparsed( + "SELECT u.name COLLATE Latin1_General_CI_AS AS User FROM users u"); } - // @Test - // public void testIntervalExpression() throws JSQLParserException { - // assertSqlCanBeParsedAndDeparsed("SELECT count(emails.id) FROM emails WHERE (emails.date_entered + 30 DAYS) > CURRENT_DATE"); - // } + // @Test + // public void testIntervalExpression() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("SELECT count(emails.id) FROM emails WHERE + // (emails.date_entered + 30 DAYS) > CURRENT_DATE"); + // } @Test public void testNotVariant() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT ! (1 + 1)"); @@ -3964,7 +4262,8 @@ public void testNotVariant4() throws JSQLParserException { @Test public void testNotVariantIssue850() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE id = 1 AND ! (id = 1 AND id = 2)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE id = 1 AND ! (id = 1 AND id = 2)"); } @Test @@ -3974,37 +4273,44 @@ public void testDateArithmentic() throws JSQLParserException { @Test public void testDateArithmentic2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE + 1 DAY AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE + 1 DAY AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); } @Test public void testDateArithmentic3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE + 1 DAY NEXT_DATE FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE + 1 DAY NEXT_DATE FROM SYSIBM.SYSDUMMY1"); } @Test public void testDateArithmentic4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE - 1 DAY + 1 YEAR - 1 MONTH FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE - 1 DAY + 1 YEAR - 1 MONTH FROM SYSIBM.SYSDUMMY1"); } @Test public void testDateArithmentic5() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN CURRENT_DATE BETWEEN (CURRENT_DATE - 1 DAY) AND ('2019-01-01') THEN 1 ELSE 0 END FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN CURRENT_DATE BETWEEN (CURRENT_DATE - 1 DAY) AND ('2019-01-01') THEN 1 ELSE 0 END FROM SYSIBM.SYSDUMMY1"); } @Test public void testDateArithmentic6() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE + HOURS_OFFSET HOUR AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE + HOURS_OFFSET HOUR AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); } @Test public void testDateArithmentic7() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE + MINUTE_OFFSET MINUTE AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE + MINUTE_OFFSET MINUTE AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); } @Test public void testDateArithmentic8() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE + SECONDS_OFFSET SECOND AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE + SECONDS_OFFSET SECOND AS NEXT_DATE FROM SYSIBM.SYSDUMMY1"); } @Test @@ -4015,10 +4321,7 @@ public void testNotProblemIssue721() throws JSQLParserException { @Test @Disabled public void testIssue699() throws JSQLParserException { - String sql = "SELECT count(1) " - + "FROM table_name " - + "WHERE 1 = 1 " - + "AN D uid = 1 " + String sql = "SELECT count(1) " + "FROM table_name " + "WHERE 1 = 1 " + "AN D uid = 1 " + "AND type IN (1, 2, 3) " + "AND time >= TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL 2 DAY),'00:00:00') " + "AND time < TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL (2 - 1) DAY),'00:00:00')"; @@ -4027,12 +4330,14 @@ public void testIssue699() throws JSQLParserException { @Test public void testDateArithmentic9() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CURRENT_DATE + (RAND() * 12 MONTH) AS new_date FROM mytable"); + assertSqlCanBeParsedAndDeparsed( + "SELECT CURRENT_DATE + (RAND() * 12 MONTH) AS new_date FROM mytable"); } @Test 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"; + 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); @@ -4062,7 +4367,9 @@ public void visit(PlainSelect plainSelect) { @Test public void testDateArithmentic12() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select CASE WHEN CAST(RAND() * 3 AS INTEGER) = 1 THEN NULL ELSE CURRENT_DATE + (month_offset MONTH) END FROM mytable", true); + assertSqlCanBeParsedAndDeparsed( + "select CASE WHEN CAST(RAND() * 3 AS INTEGER) = 1 THEN NULL ELSE CURRENT_DATE + (month_offset MONTH) END FROM mytable", + true); } @Test @@ -4088,35 +4395,35 @@ public void visit(PlainSelect plainSelect) { } @ParameterizedTest - @ValueSource(strings = {"u", "e", "n", "r", "b", "rb"}) + @ValueSource(strings = {"u", "e", "n", "r", "b", "rb"}) public void testRawStringExpressionIssue656(String prefix) throws JSQLParserException { - String sql = "select " + prefix + "'test' from foo"; - Statement statement = CCJSqlParserUtil.parse(sql); - assertNotNull(statement); - statement.accept(new StatementVisitorAdapter() { - @Override - public void visit(Select select) { - select.getSelectBody().accept(new SelectVisitorAdapter() { - @Override - public void visit(PlainSelect plainSelect) { - SelectExpressionItem typedExpression - = (SelectExpressionItem) plainSelect.getSelectItems().get(0); - assertNotNull(typedExpression); - assertNull(typedExpression.getAlias()); - StringValue value = (StringValue) typedExpression.getExpression(); - assertEquals(prefix.toUpperCase(), value.getPrefix()); - assertEquals("test", value.getValue()); - } - }); - } - }); + String sql = "select " + prefix + "'test' from foo"; + Statement statement = CCJSqlParserUtil.parse(sql); + assertNotNull(statement); + statement.accept(new StatementVisitorAdapter() { + @Override + public void visit(Select select) { + select.getSelectBody().accept(new SelectVisitorAdapter() { + @Override + public void visit(PlainSelect plainSelect) { + SelectExpressionItem typedExpression = + (SelectExpressionItem) plainSelect.getSelectItems().get(0); + assertNotNull(typedExpression); + assertNull(typedExpression.getAlias()); + StringValue value = (StringValue) typedExpression.getExpression(); + assertEquals(prefix.toUpperCase(), value.getPrefix()); + assertEquals("test", value.getValue()); + } + }); + } + }); } @Test public void testGroupingSets1() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COL_1, COL_2, COL_3, COL_4, COL_5, COL_6 FROM TABLE_1 " - + "GROUP BY " - + "GROUPING SETS ((COL_1, COL_2, COL_3, COL_4), (COL_5, COL_6))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT COL_1, COL_2, COL_3, COL_4, COL_5, COL_6 FROM TABLE_1 " + "GROUP BY " + + "GROUPING SETS ((COL_1, COL_2, COL_3, COL_4), (COL_5, COL_6))"); } @Test @@ -4126,43 +4433,51 @@ public void testGroupingSets2() throws JSQLParserException { @Test public void testGroupingSets3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COL_1 FROM TABLE_1 GROUP BY GROUPING SETS (COL_1, ())"); + assertSqlCanBeParsedAndDeparsed( + "SELECT COL_1 FROM TABLE_1 GROUP BY GROUPING SETS (COL_1, ())"); } @Test public void testLongQualifiedNamesIssue763() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT mongodb.test.test.intField, postgres.test.test.intField, postgres.test.test.datefield FROM mongodb.test.test JOIN postgres.postgres.test.test ON mongodb.test.test.intField = postgres.test.test.intField WHERE mongodb.test.test.intField = 123"); + assertSqlCanBeParsedAndDeparsed( + "SELECT mongodb.test.test.intField, postgres.test.test.intField, postgres.test.test.datefield FROM mongodb.test.test JOIN postgres.postgres.test.test ON mongodb.test.test.intField = postgres.test.test.intField WHERE mongodb.test.test.intField = 123"); } @Test public void testLongQualifiedNamesIssue763_2() throws JSQLParserException { - Statement parse = CCJSqlParserUtil.parse(new StringReader("SELECT mongodb.test.test.intField, postgres.test.test.intField, postgres.test.test.datefield FROM mongodb.test.test JOIN postgres.postgres.test.test ON mongodb.test.test.intField = postgres.test.test.intField WHERE mongodb.test.test.intField = 123")); + Statement parse = CCJSqlParserUtil.parse(new StringReader( + "SELECT mongodb.test.test.intField, postgres.test.test.intField, postgres.test.test.datefield FROM mongodb.test.test JOIN postgres.postgres.test.test ON mongodb.test.test.intField = postgres.test.test.intField WHERE mongodb.test.test.intField = 123")); System.out.println(parse.toString()); } @Test public void testSubQueryAliasIssue754() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT C0 FROM T0 INNER JOIN T1 ON C1 = C0 INNER JOIN (SELECT W1 FROM T2) S1 ON S1.W1 = C0 ORDER BY C0"); + assertSqlCanBeParsedAndDeparsed( + "SELECT C0 FROM T0 INNER JOIN T1 ON C1 = C0 INNER JOIN (SELECT W1 FROM T2) S1 ON S1.W1 = C0 ORDER BY C0"); } @Test public void testSimilarToIssue789() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (w_id SIMILAR TO '/foo/__/bar/(left|right)/[0-9]{4}-[0-9]{2}-[0-9]{2}(/[0-9]*)?')"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE (w_id SIMILAR TO '/foo/__/bar/(left|right)/[0-9]{4}-[0-9]{2}-[0-9]{2}(/[0-9]*)?')"); } @Test public void testSimilarToIssue789_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (w_id NOT SIMILAR TO '/foo/__/bar/(left|right)/[0-9]{4}-[0-9]{2}-[0-9]{2}(/[0-9]*)?')"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE (w_id NOT SIMILAR TO '/foo/__/bar/(left|right)/[0-9]{4}-[0-9]{2}-[0-9]{2}(/[0-9]*)?')"); } @Test public void testCaseWhenExpressionIssue262() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT X1, (CASE WHEN T.ID IS NULL THEN CASE P.WEIGHT * SUM(T.QTY) WHEN 0 THEN NULL ELSE P.WEIGHT END ELSE SUM(T.QTY) END) AS W FROM A LEFT JOIN T ON T.ID = ? RIGHT JOIN P ON P.ID = ?"); + assertSqlCanBeParsedAndDeparsed( + "SELECT X1, (CASE WHEN T.ID IS NULL THEN CASE P.WEIGHT * SUM(T.QTY) WHEN 0 THEN NULL ELSE P.WEIGHT END ELSE SUM(T.QTY) END) AS W FROM A LEFT JOIN T ON T.ID = ? RIGHT JOIN P ON P.ID = ?"); } @Test public void testCaseWhenExpressionIssue200() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1, t2 WHERE CASE WHEN t1.id = 1 THEN t2.name = 'Marry' WHEN t1.id = 2 THEN t2.age = 10 END"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM t1, t2 WHERE CASE WHEN t1.id = 1 THEN t2.name = 'Marry' WHEN t1.id = 2 THEN t2.age = 10 END"); } @Test @@ -4187,7 +4502,8 @@ public void testEmptyDoubleQuotes_2() throws JSQLParserException { @Test public void testInnerWithBlock() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select 1 from (with mytable1 as (select 2 ) select 3 from mytable1 ) first", true); + assertSqlCanBeParsedAndDeparsed( + "select 1 from (with mytable1 as (select 2 ) select 3 from mytable1 ) first", true); } @Test @@ -4207,12 +4523,16 @@ public void testArrayIssue489() throws JSQLParserException { @Test public void testArrayIssue377() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select 'yelp'::name as pktable_cat, n2.nspname as pktable_schem, c2.relname as pktable_name, a2.attname as pkcolumn_name, 'yelp'::name as fktable_cat, n1.nspname as fktable_schem, c1.relname as fktable_name, a1.attname as fkcolumn_name, i::int2 as key_seq, case ref.confupdtype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as update_rule, case ref.confdeltype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as delete_rule, ref.conname as fk_name, cn.conname as pk_name, case when ref.condeferrable then case when ref.condeferred then 5::int2 else 6::int2 end else 7::int2 end as deferrablity from ((((((( (select cn.oid, conrelid, conkey, confrelid, confkey, generate_series(array_lower(conkey, 1), array_upper(conkey, 1)) as i, confupdtype, confdeltype, conname, condeferrable, condeferred from pg_catalog.pg_constraint cn, pg_catalog.pg_class c, pg_catalog.pg_namespace n where contype = 'f' and conrelid = c.oid and relname = 'business' and n.oid = c.relnamespace and n.nspname = 'public' ) ref inner join pg_catalog.pg_class c1 on c1.oid = ref.conrelid) inner join pg_catalog.pg_namespace n1 on n1.oid = c1.relnamespace) inner join pg_catalog.pg_attribute a1 on a1.attrelid = c1.oid and a1.attnum = conkey[i]) inner join pg_catalog.pg_class c2 on c2.oid = ref.confrelid) inner join pg_catalog.pg_namespace n2 on n2.oid = c2.relnamespace) inner join pg_catalog.pg_attribute a2 on a2.attrelid = c2.oid and a2.attnum = confkey[i]) left outer join pg_catalog.pg_constraint cn on cn.conrelid = ref.confrelid and cn.contype = 'p') order by ref.oid, ref.i", true); + assertSqlCanBeParsedAndDeparsed( + "select 'yelp'::name as pktable_cat, n2.nspname as pktable_schem, c2.relname as pktable_name, a2.attname as pkcolumn_name, 'yelp'::name as fktable_cat, n1.nspname as fktable_schem, c1.relname as fktable_name, a1.attname as fkcolumn_name, i::int2 as key_seq, case ref.confupdtype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as update_rule, case ref.confdeltype when 'c' then 0::int2 when 'n' then 2::int2 when 'd' then 4::int2 when 'r' then 1::int2 else 3::int2 end as delete_rule, ref.conname as fk_name, cn.conname as pk_name, case when ref.condeferrable then case when ref.condeferred then 5::int2 else 6::int2 end else 7::int2 end as deferrablity from ((((((( (select cn.oid, conrelid, conkey, confrelid, confkey, generate_series(array_lower(conkey, 1), array_upper(conkey, 1)) as i, confupdtype, confdeltype, conname, condeferrable, condeferred from pg_catalog.pg_constraint cn, pg_catalog.pg_class c, pg_catalog.pg_namespace n where contype = 'f' and conrelid = c.oid and relname = 'business' and n.oid = c.relnamespace and n.nspname = 'public' ) ref inner join pg_catalog.pg_class c1 on c1.oid = ref.conrelid) inner join pg_catalog.pg_namespace n1 on n1.oid = c1.relnamespace) inner join pg_catalog.pg_attribute a1 on a1.attrelid = c1.oid and a1.attnum = conkey[i]) inner join pg_catalog.pg_class c2 on c2.oid = ref.confrelid) inner join pg_catalog.pg_namespace n2 on n2.oid = c2.relnamespace) inner join pg_catalog.pg_attribute a2 on a2.attrelid = c2.oid and a2.attnum = confkey[i]) left outer join pg_catalog.pg_constraint cn on cn.conrelid = ref.confrelid and cn.contype = 'p') order by ref.oid, ref.i", + true); } @Test public void testArrayIssue378() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class tc, pg_catalog.pg_index i, pg_catalog.pg_namespace n, pg_catalog.pg_class ic where tc.relname = 'business' and n.nspname = 'public' and tc.oid = i.indrelid and n.oid = tc.relnamespace and i.indisprimary = 't' and ia.attrelid = i.indexrelid and ta.attrelid = i.indrelid and ta.attnum = i.indkey[ia.attnum-1] and (not ta.attisdropped) and (not ia.attisdropped) and ic.oid = i.indexrelid order by ia.attnum", true); + assertSqlCanBeParsedAndDeparsed( + "select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class tc, pg_catalog.pg_index i, pg_catalog.pg_namespace n, pg_catalog.pg_class ic where tc.relname = 'business' and n.nspname = 'public' and tc.oid = i.indrelid and n.oid = tc.relnamespace and i.indisprimary = 't' and ia.attrelid = i.indexrelid and ta.attrelid = i.indrelid and ta.attnum = i.indkey[ia.attnum-1] and (not ta.attisdropped) and (not ia.attisdropped) and ic.oid = i.indexrelid order by ia.attnum", + true); } @Test @@ -4223,14 +4543,12 @@ public void testArrayRange() throws JSQLParserException { @Test public void testIssue842() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT a.id lendId, " - + "a.lend_code lendCode, " - + "a.amount, " + + "a.lend_code lendCode, " + "a.amount, " + "a.remaining_principal remainingPrincipal, " + "a.interest_rate interestRate, " + "date_add(a.lend_time, INTERVAL a.repayment_period DAY) lendEndTime, " + "a.lend_time lendTime " - + "FROM risk_lend a " - + "WHERE a.loan_id = 1", true); + + "FROM risk_lend a " + "WHERE a.loan_id = 1", true); } @Test @@ -4250,12 +4568,15 @@ public void testIssue848_2() throws JSQLParserException { @Test public void testIssue848_3() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT c1, multiset(SELECT * FROM mytable WHERE cond = 10) FROM T1 WHERE cond2 = 20"); + assertSqlCanBeParsedAndDeparsed( + "SELECT c1, multiset(SELECT * FROM mytable WHERE cond = 10) FROM T1 WHERE cond2 = 20"); } @Test public void testIssue848_4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select c1 from T1 where someFunc(select f1 from t2 where t2.id = T1.key) = 10", true); + assertSqlCanBeParsedAndDeparsed( + "select c1 from T1 where someFunc(select f1 from t2 where t2.id = T1.key) = 10", + true); } @Test @@ -4265,14 +4586,14 @@ public void testMultiColumnAliasIssue849() throws JSQLParserException { @Test public void testMultiColumnAliasIssue849_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM crosstab('select rowid, attribute, value from ct where attribute = ''att2'' or attribute = ''att3'' order by 1,2') AS ct(row_name text, category_1 text, category_2 text, category_3 text)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM crosstab('select rowid, attribute, value from ct where attribute = ''att2'' or attribute = ''att3'' order by 1,2') AS ct(row_name text, category_1 text, category_2 text, category_3 text)"); } @Test public void testLimitClauseDroppedIssue845() throws JSQLParserException { - assertEquals( - "SELECT * FROM employee ORDER BY emp_id LIMIT 10 OFFSET 2", - CCJSqlParserUtil.parse("SELECT * FROM employee ORDER BY emp_id OFFSET 2 LIMIT 10").toString()); + assertEquals("SELECT * FROM employee ORDER BY emp_id LIMIT 10 OFFSET 2", CCJSqlParserUtil + .parse("SELECT * FROM employee ORDER BY emp_id OFFSET 2 LIMIT 10").toString()); } @Test @@ -4302,13 +4623,16 @@ public void testSizeKeywordIssue867() throws JSQLParserException { @Test public void testPartitionByWithBracketsIssue865() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT subject_id, student_id, sum(mark) OVER (PARTITION BY subject_id, student_id ) FROM marks"); - assertSqlCanBeParsedAndDeparsed("SELECT subject_id, student_id, sum(mark) OVER (PARTITION BY (subject_id, student_id) ) FROM marks"); + assertSqlCanBeParsedAndDeparsed( + "SELECT subject_id, student_id, sum(mark) OVER (PARTITION BY subject_id, student_id ) FROM marks"); + assertSqlCanBeParsedAndDeparsed( + "SELECT subject_id, student_id, sum(mark) OVER (PARTITION BY (subject_id, student_id) ) FROM marks"); } @Test public void testWithAsRecursiveIssue874() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("WITH rn AS (SELECT rownum rn FROM dual CONNECT BY level <= (SELECT max(cases) FROM t1)) SELECT pname FROM t1, rn WHERE rn <= cases ORDER BY pname"); + assertSqlCanBeParsedAndDeparsed( + "WITH rn AS (SELECT rownum rn FROM dual CONNECT BY level <= (SELECT max(cases) FROM t1)) SELECT pname FROM t1, rn WHERE rn <= cases ORDER BY pname"); } @Test @@ -4318,12 +4642,15 @@ public void testSessionKeywordIssue876() throws JSQLParserException { @Test public void testWindowClauseWithoutOrderByIssue869() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT subject_id, student_id, mark, sum(mark) OVER (PARTITION BY (subject_id) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM marks"); + assertSqlCanBeParsedAndDeparsed( + "SELECT subject_id, student_id, mark, sum(mark) OVER (PARTITION BY (subject_id) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM marks"); } @Test public void testKeywordSizeIssue880() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT b.pattern_size_id, b.pattern_id, b.variation, b.measure_remark, b.pake_name, b.ident_size, CONCAT( GROUP_CONCAT(a.size) ) AS 'title', CONCAT( '[', GROUP_CONCAT( '{\"patternSizeDetailId\":', a.pattern_size_detail_id, ',\"patternSizeId\":', a.pattern_size_id, ',\"size\":\"', a.size, '\",\"sizeValue\":', a.size_value SEPARATOR '},' ), '}]' ) AS 'designPatternSizeDetailJson' FROM design_pattern_size_detail a LEFT JOIN design_pattern_size b ON a.pattern_size_id = b.pattern_size_id WHERE b.pattern_id = 792679713905573986 GROUP BY b.pake_name,b.pattern_size_id", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT b.pattern_size_id, b.pattern_id, b.variation, b.measure_remark, b.pake_name, b.ident_size, CONCAT( GROUP_CONCAT(a.size) ) AS 'title', CONCAT( '[', GROUP_CONCAT( '{\"patternSizeDetailId\":', a.pattern_size_detail_id, ',\"patternSizeId\":', a.pattern_size_id, ',\"size\":\"', a.size, '\",\"sizeValue\":', a.size_value SEPARATOR '},' ), '}]' ) AS 'designPatternSizeDetailJson' FROM design_pattern_size_detail a LEFT JOIN design_pattern_size b ON a.pattern_size_id = b.pattern_size_id WHERE b.pattern_id = 792679713905573986 GROUP BY b.pake_name,b.pattern_size_id", + true); } @Test @@ -4333,51 +4660,43 @@ public void testKeywordCharacterIssue884() throws JSQLParserException { @Test public void testCrossApplyIssue344() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select s.*, c.*, calc2.summary\n" - + "from student s\n" - + "join class c on s.class_id = c.id\n" - + "cross apply (\n" + assertSqlCanBeParsedAndDeparsed("select s.*, c.*, calc2.summary\n" + "from student s\n" + + "join class c on s.class_id = c.id\n" + "cross apply (\n" + " select s.first_name + ' ' + s.last_name + ' (' + s.sex + ')' as student_full_name\n" - + ") calc1\n" - + "cross apply (\n" + + ") calc1\n" + "cross apply (\n" + " select case c.some_styling_type when 'A' then c.name + ' - ' + calc1.student_full_name\n" + " when 'B' then calc1.student_full_name + ' - ' + c.name\n" - + " else calc1.student_full_name end as summary\n" - + ") calc2", true); + + " else calc1.student_full_name end as summary\n" + ") calc2", true); } @Test public void testOuterApplyIssue930() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable D OUTER APPLY (SELECT * FROM mytable2 E WHERE E.ColID = D.ColID) A"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable D OUTER APPLY (SELECT * FROM mytable2 E WHERE E.ColID = D.ColID) A"); } @Test public void testWrongParseTreeIssue89() throws JSQLParserException { - Select unionQuery = (Select) CCJSqlParserUtil.parse("SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY col"); + Select unionQuery = (Select) CCJSqlParserUtil + .parse("SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY col"); SetOperationList unionQueries = (SetOperationList) unionQuery.getSelectBody(); - assertThat(unionQueries.getSelects()) - .extracting(select -> (PlainSelect) select).allSatisfy(ps -> assertNull(ps.getOrderByElements())); + assertThat(unionQueries.getSelects()).extracting(select -> (PlainSelect) select) + .allSatisfy(ps -> assertNull(ps.getOrderByElements())); - assertThat(unionQueries.getOrderByElements()) - .isNotNull() - .hasSize(1) - .extracting(item -> item.toString()) - .contains("col"); + assertThat(unionQueries.getOrderByElements()).isNotNull().hasSize(1) + .extracting(item -> item.toString()).contains("col"); } @Test public void testCaseWithComplexWhenExpression() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT av.app_id, MAX(av.version_no) AS version_no\n" - + "FROM app_version av\n" - + "JOIN app_version_policy avp ON av.id = avp.app_version_id\n" - + "WHERE av.`status` = 1\n" - + "AND CASE \n" - + "WHEN avp.area IS NOT NULL\n" - + "AND length(avp.area) > 0 THEN avp.area LIKE CONCAT('%,', '12', ',%')\n" - + "OR avp.area LIKE CONCAT('%,', '13', ',%')\n" - + "ELSE 1 = 1\n" - + "END\n", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT av.app_id, MAX(av.version_no) AS version_no\n" + "FROM app_version av\n" + + "JOIN app_version_policy avp ON av.id = avp.app_version_id\n" + + "WHERE av.`status` = 1\n" + "AND CASE \n" + "WHEN avp.area IS NOT NULL\n" + + "AND length(avp.area) > 0 THEN avp.area LIKE CONCAT('%,', '12', ',%')\n" + + "OR avp.area LIKE CONCAT('%,', '13', ',%')\n" + "ELSE 1 = 1\n" + "END\n", + true); } @Test @@ -4397,13 +4716,13 @@ public void testTableFunctionInExprIssue923() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE func(a) IN func(b)"); } -// @Test -// public void testTableFunctionInExprIssue923_2() throws JSQLParserException, IOException { -// String stmt = IOUtils.toString( -// SelectTest.class.getResourceAsStream("large-sql-issue-923.txt"), "UTF-8") -// .replace("@Prompt", "MyFunc"); -// assertSqlCanBeParsedAndDeparsed(stmt, true); -// } + // @Test + // public void testTableFunctionInExprIssue923_2() throws JSQLParserException, IOException { + // String stmt = IOUtils.toString( + // SelectTest.class.getResourceAsStream("large-sql-issue-923.txt"), "UTF-8") + // .replace("@Prompt", "MyFunc"); + // assertSqlCanBeParsedAndDeparsed(stmt, true); + // } @Test public void testTableFunctionInExprIssue923_3() throws JSQLParserException, IOException { String stmt = IOUtils.toString( @@ -4413,12 +4732,16 @@ public void testTableFunctionInExprIssue923_3() throws JSQLParserException, IOEx @Test public void testTableFunctionInExprIssue923_4() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT MAX(CASE WHEN DUPLICATE_CLAIM_NUMBER IN '1' THEN COALESCE(CLAIM_STATUS2,CLAIM_STATUS1) ELSE NULL END) AS DUPE_1_KINAL_CLAIM_STATUS", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT MAX(CASE WHEN DUPLICATE_CLAIM_NUMBER IN '1' THEN COALESCE(CLAIM_STATUS2,CLAIM_STATUS1) ELSE NULL END) AS DUPE_1_KINAL_CLAIM_STATUS", + true); } @Test public void testTableFunctionInExprIssue923_5() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN DUPLICATE_CLAIM_NUMBER IN '1' THEN COALESCE(CLAIM_STATUS2,CLAIM_STATUS1) ELSE NULL END", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT CASE WHEN DUPLICATE_CLAIM_NUMBER IN '1' THEN COALESCE(CLAIM_STATUS2,CLAIM_STATUS1) ELSE NULL END", + true); } @Test @@ -4438,12 +4761,15 @@ public void testKeyWordCreateIssue941_2() throws JSQLParserException { @Test public void testCurrentIssue940() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT date(current) AS test_date FROM systables WHERE tabid = 1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT date(current) AS test_date FROM systables WHERE tabid = 1"); } @Test public void testKeyWordView() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT ma.m_a_id, ma.anounsment, ma.max_view, ma.end_date, ma.view FROM member_anounsment as ma WHERE ( ( (ma.end_date > now() ) AND (ma.max_view >= ma.view) ) AND ( (ma.member_id='xxx') ) )", true); + assertSqlCanBeParsedAndDeparsed( + "SELECT ma.m_a_id, ma.anounsment, ma.max_view, ma.end_date, ma.view FROM member_anounsment as ma WHERE ( ( (ma.end_date > now() ) AND (ma.max_view >= ma.view) ) AND ( (ma.member_id='xxx') ) )", + true); } @Test @@ -4451,12 +4777,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 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))))), statement); } @@ -4482,7 +4810,8 @@ public void testCheckDateFunctionIssue_3() throws JSQLParserException { @Test public void testCheckColonVariable() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (col1, col2) IN ((:qp0, :qp1), (:qp2, :qp3))"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE (col1, col2) IN ((:qp0, :qp1), (:qp2, :qp3))"); } @Test @@ -4502,7 +4831,8 @@ public void testVariableAssignment3() throws JSQLParserException { @Test public void testKeyWordOfIssue1029() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT of.Full_Name_c AS FullName FROM comdb.Offer_c AS of"); + assertSqlCanBeParsedAndDeparsed( + "SELECT of.Full_Name_c AS FullName FROM comdb.Offer_c AS of"); } @Test @@ -4519,7 +4849,7 @@ public void testSelectConditionsIssue720And991() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT 1 > 2"); assertSqlCanBeParsedAndDeparsed("SELECT 1 + 2 AS a, 3 < 4 AS b"); assertSqlCanBeParsedAndDeparsed("SELECT 1 < 2 AS a, 0 IS NULL AS b"); -// assertSqlCanBeParsedAndDeparsed("SELECT 1 < 2 AS a, (0 IS NULL) AS b"); + // assertSqlCanBeParsedAndDeparsed("SELECT 1 < 2 AS a, (0 IS NULL) AS b"); } @Test @@ -4529,7 +4859,8 @@ public void testKeyWordExceptIssue1040() throws JSQLParserException { @Test public void testKeyWordExceptIssue1044() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT SP_ID FROM ST_PR WHERE INSTR(',' || SP_OFF || ',', ',' || ? || ',') > 0"); + assertSqlCanBeParsedAndDeparsed( + "SELECT SP_ID FROM ST_PR WHERE INSTR(',' || SP_OFF || ',', ',' || ? || ',') > 0"); } @Test @@ -4539,17 +4870,20 @@ public void testKeyWordExceptIssue1055() throws JSQLParserException { @Test public void testKeyWordExceptIssue1055_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE A.end_time > now() AND A.end_time <= date_add(now(), INTERVAL ? DAY)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE A.end_time > now() AND A.end_time <= date_add(now(), INTERVAL ? DAY)"); } @Test public void testIssue1062() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE temperature.timestamp <= @to AND temperature.timestamp >= @from"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE temperature.timestamp <= @to AND temperature.timestamp >= @from"); } @Test public void testIssue1062_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE temperature.timestamp <= @until AND temperature.timestamp >= @from"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM mytable WHERE temperature.timestamp <= @until AND temperature.timestamp >= @from"); } @Test @@ -4584,12 +4918,14 @@ public void testExistsKeywordIssue1076() throws JSQLParserException { @Test public void testExistsKeywordIssue1076_1() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT mycol, EXISTS (SELECT mycol FROM mytable) mycol2 FROM mytable"); + assertSqlCanBeParsedAndDeparsed( + "SELECT mycol, EXISTS (SELECT mycol FROM mytable) mycol2 FROM mytable"); } @Test public void testFormatKeywordIssue1078() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT FORMAT(date, 'yyyy-MM') AS year_month FROM mine_table"); + assertSqlCanBeParsedAndDeparsed( + "SELECT FORMAT(date, 'yyyy-MM') AS year_month FROM mine_table"); } @Test @@ -4599,7 +4935,8 @@ public void testConditionalParametersForFunctions() throws JSQLParserException { @Test public void testCreateTableWithParameterDefaultFalseIssue1088() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT p.*, rhp.house_id FROM rel_house_person rhp INNER JOIN person p ON rhp.person_id = p.if WHERE rhp.house_id IN (SELECT house_id FROM rel_house_person WHERE person_id = :personId AND current_occupant = :current) AND rhp.current_occupant = :currentOccupant"); + assertSqlCanBeParsedAndDeparsed( + "SELECT p.*, rhp.house_id FROM rel_house_person rhp INNER JOIN person p ON rhp.person_id = p.if WHERE rhp.house_id IN (SELECT house_id FROM rel_house_person WHERE person_id = :personId AND current_occupant = :current) AND rhp.current_occupant = :currentOccupant"); } @Test @@ -4610,7 +4947,8 @@ public void testMissingLimitKeywordIssue1006() throws JSQLParserException { @Test public void testKeywordUnsignedIssue961() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT COLUMN1, COLUMN2, CASE WHEN COLUMN1.DATA NOT IN ('1', '3') THEN CASE WHEN CAST(COLUMN2 AS UNSIGNED) IN ('1', '2', '3') THEN 'Q1' ELSE 'Q2' END END AS YEAR FROM TESTTABLE"); + assertSqlCanBeParsedAndDeparsed( + "SELECT COLUMN1, COLUMN2, CASE WHEN COLUMN1.DATA NOT IN ('1', '3') THEN CASE WHEN CAST(COLUMN2 AS UNSIGNED) IN ('1', '2', '3') THEN 'Q1' ELSE 'Q2' END END AS YEAR FROM TESTTABLE"); } @Test @@ -4625,25 +4963,35 @@ public void testMultiPartTypesIssue992() throws JSQLParserException { @Test public void testSetOperationWithParenthesisIssue1094() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM ((SELECT A FROM tbl) UNION DISTINCT (SELECT B FROM tbl2)) AS union1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM ((SELECT A FROM tbl) UNION DISTINCT (SELECT B FROM tbl2)) AS union1"); } @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()); + 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()); } @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()); + 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()); } @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()); + 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()); } @Test @@ -4663,7 +5011,8 @@ public void testSelectTuple() throws JSQLParserException { @Test public void testArrayDeclare() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT ARRAY[1, f1], ARRAY[[1, 2], [3, f2 + 1]], ARRAY[]::text[] FROM t1"); + assertSqlCanBeParsedAndDeparsed( + "SELECT ARRAY[1, f1], ARRAY[[1, 2], [3, f2 + 1]], ARRAY[]::text[] FROM t1"); } @Test @@ -4694,7 +5043,8 @@ public void testFunctionOrderBy() throws JSQLParserException { @Test public void testProblematicDeparsingIssue1183() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT ARRAY_AGG(NAME ORDER BY ID) FILTER (WHERE NAME IS NOT NULL)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT ARRAY_AGG(NAME ORDER BY ID) FILTER (WHERE NAME IS NOT NULL)"); } @Test @@ -4704,7 +5054,8 @@ public void testProblematicDeparsingIssue1183_2() throws JSQLParserException { @Test public void testKeywordCostsIssue1185() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("WITH costs AS (SELECT * FROM MY_TABLE1 AS ALIAS_TABLE1) SELECT * FROM TESTSTMT"); + assertSqlCanBeParsedAndDeparsed( + "WITH costs AS (SELECT * FROM MY_TABLE1 AS ALIAS_TABLE1) SELECT * FROM TESTSTMT"); } @Test @@ -4718,14 +5069,18 @@ public void testConditionsWithExtraBrackets_Issue1194() throws JSQLParserExcepti } 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", true); + 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", + true); } @Test public void testWithValueListWithOutExtraBrackets1135() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("with sample_data(\"DAY\") as (values 0, 1, 2)\n" + " select \"DAY\" from sample_data", true); - 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", true); + 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", + true); } @Test @@ -4737,38 +5092,35 @@ public void testWithInsideWithIssue1186() throws JSQLParserException { @Test public void testKeywordSynonymIssue1211() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("select businessDate as \"bd\", synonym as \"synonym\" from sc.tab", true); + assertSqlCanBeParsedAndDeparsed( + "select businessDate as \"bd\", synonym as \"synonym\" from sc.tab", true); } @Test public void testGroupedByIssue1176() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("select id_instrument, count(*)\n" + "from cfe.instrument\n" + + "group by (id_instrument)", true); assertSqlCanBeParsedAndDeparsed( - "select id_instrument, count(*)\n" + "from cfe.instrument\n" + "group by (id_instrument)", - true); - assertSqlCanBeParsedAndDeparsed("select count(*)\n" + "from cfe.instrument\n" + "group by ()", - true); + "select count(*)\n" + "from cfe.instrument\n" + "group by ()", true); } @Test public void testGroupedByWithExtraBracketsIssue1210() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "select a,b,c from table group by rollup(a,b,c)", - true); - assertSqlCanBeParsedAndDeparsed("select a,b,c from table group by rollup((a,b,c))", - true); + assertSqlCanBeParsedAndDeparsed("select a,b,c from table group by rollup(a,b,c)", true); + assertSqlCanBeParsedAndDeparsed("select a,b,c from table group by rollup((a,b,c))", true); } @Test public void testGroupedByWithExtraBracketsIssue1168() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( - "select sum(a) as amount, b, c from TEST_TABLE group by rollup ((a,b),c)", - true); + "select sum(a) as amount, b, c from TEST_TABLE group by rollup ((a,b),c)", true); } @Test public void testSelectRowElement() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT (t.tup).id, (tup).name FROM t WHERE (t.tup).id IN (1, 2, 3)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT (t.tup).id, (tup).name FROM t WHERE (t.tup).id IN (1, 2, 3)"); } @Test @@ -4776,23 +5128,21 @@ 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)))"); -// } + // @Test + // public void testSelectCastProblemIssue1248_2() throws JSQLParserException { + // assertSqlCanBeParsedAndDeparsed("SELECT CAST(t1.sign2 AS Nullable(decimal(30, 10)))"); + // } public void testMissinBracketsNestedInIssue() 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); + 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); } @Test public void testAnyComparisionExpressionValuesList1232() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "select * from foo where id != ALL(VALUES 1,2,3)", - true); + assertSqlCanBeParsedAndDeparsed("select * from foo where id != ALL(VALUES 1,2,3)", true); - assertSqlCanBeParsedAndDeparsed( - "select * from foo where id != ALL(?::uid[])", - true); + assertSqlCanBeParsedAndDeparsed("select * from foo where id != ALL(?::uid[])", true); } @Test @@ -4809,8 +5159,10 @@ public void testSelectAllOperatorIssue1140_2() throws JSQLParserException { public void testDB2SpecialRegisterDateTimeIssue1249() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT_TIME", true); assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT TIME", true); - assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT_TIMESTAMP", true); - assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT TIMESTAMP", true); + assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT_TIMESTAMP", + true); + assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT TIMESTAMP", + true); assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT_DATE", true); assertSqlCanBeParsedAndDeparsed("SELECT * FROM test.abc WHERE col > CURRENT DATE", true); } @@ -4824,158 +5176,108 @@ public void testKeywordFilterIssue1255() throws JSQLParserException { public void testConnectByRootIssue1255() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( "SELECT last_name \"Employee\", CONNECT_BY_ROOT last_name \"Manager\",\n" - + " LEVEL-1 \"Pathlen\", SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n" - + " FROM employees\n" - + " WHERE LEVEL > 1 and department_id = 110\n" - + " CONNECT BY PRIOR employee_id = manager_id", true); + + " LEVEL-1 \"Pathlen\", SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n" + + " FROM employees\n" + " WHERE LEVEL > 1 and department_id = 110\n" + + " CONNECT BY PRIOR employee_id = manager_id", + true); - assertSqlCanBeParsedAndDeparsed( - "SELECT name, SUM(salary) \"Total_Salary\" FROM (\n" - + " SELECT CONNECT_BY_ROOT last_name as name, Salary\n" - + " FROM employees\n" + assertSqlCanBeParsedAndDeparsed("SELECT name, SUM(salary) \"Total_Salary\" FROM (\n" + + " SELECT CONNECT_BY_ROOT last_name as name, Salary\n" + " FROM employees\n" + " WHERE department_id = 110\n" - + " CONNECT BY PRIOR employee_id = manager_id)\n" - + " GROUP BY name", true); + + " CONNECT BY PRIOR employee_id = manager_id)\n" + " GROUP BY name", + true); - assertSqlCanBeParsedAndDeparsed( - "SELECT CONNECT_BY_ROOT last_name as name" - + ", salary " - + "FROM employees " - + "WHERE department_id = 110 " + assertSqlCanBeParsedAndDeparsed("SELECT CONNECT_BY_ROOT last_name as name" + ", salary " + + "FROM employees " + "WHERE department_id = 110 " + "CONNECT BY PRIOR employee_id = manager_id", true); } 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)"; + 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)"; assertSqlCanBeParsedAndDeparsed(sqlStr, true); } @Test public void testCastToRowConstructorIssue1267() throws JSQLParserException { - String sqlStr = "SELECT CAST(ROW(dataid, value, calcMark) AS ROW(datapointid CHAR, value CHAR, calcMark CHAR)) AS datapoints"; + String sqlStr = + "SELECT CAST(ROW(dataid, value, calcMark) AS ROW(datapointid CHAR, value CHAR, calcMark CHAR)) AS datapoints"; assertSqlCanBeParsedAndDeparsed(sqlStr, true); } @Test public void testCollisionWithSpecialStringFunctionsIssue1284() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT test( a in (1) AND 2=2) ", true); + assertSqlCanBeParsedAndDeparsed("SELECT test( a in (1) AND 2=2) ", true); - assertSqlCanBeParsedAndDeparsed( - "select\n" + assertSqlCanBeParsedAndDeparsed("select\n" + "sum(if(column1 in('value1', 'value2'), 1, 0)) as tcp_logs,\n" + "sum(if(column1 in ('value1', 'value2') and column2 = 'value3', 1, 0)) as base_tcp_logs\n" - + "from\n" - + "table1\n" - + "where\n" + + "from\n" + "table1\n" + "where\n" + "recv_time >= toDateTime('2021-07-20 00:00:00')\n" + "and recv_time < toDateTime('2021-07-21 00:00:00')", true); } @Test public void testJoinWithTrailingOnExpressionIssue1302() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT * FROM TABLE1 tb1\n" - + "INNER JOIN TABLE2 tb2\n" - + "INNER JOIN TABLE3 tb3\n" - + "INNER JOIN TABLE4 tb4\n" - + "ON (tb3.aaa = tb4.aaa)\n" - + "ON (tb2.aaa = tb3.aaa)\n" - + "ON (tb1.aaa = tb2.aaa)", true); + assertSqlCanBeParsedAndDeparsed("SELECT * FROM TABLE1 tb1\n" + "INNER JOIN TABLE2 tb2\n" + + "INNER JOIN TABLE3 tb3\n" + "INNER JOIN TABLE4 tb4\n" + "ON (tb3.aaa = tb4.aaa)\n" + + "ON (tb2.aaa = tb3.aaa)\n" + "ON (tb1.aaa = tb2.aaa)", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT *\n" - + "FROM\n" - + "TABLE1 tbl1\n" - + " INNER JOIN TABLE2 tbl2\n" - + " INNER JOIN TABLE3 tbl3\n" + assertSqlCanBeParsedAndDeparsed("SELECT *\n" + "FROM\n" + "TABLE1 tbl1\n" + + " INNER JOIN TABLE2 tbl2\n" + " INNER JOIN TABLE3 tbl3\n" + " ON (tbl2.column1 = tbl3.column1)\n" - + " ON (tbl1.column2 = tbl2.column2)\n" - + "WHERE\n" - + "tbl1.column1 = 123", true); + + " ON (tbl1.column2 = tbl2.column2)\n" + "WHERE\n" + "tbl1.column1 = 123", + true); } @Test public void testSimpleJoinOnExpressionIssue1229() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( - "select t1.column1,t1.column2,t2.field1,t2.field2 from T_DT_ytb_01 t1 , T_DT_ytb_02 t2 on t1.column1 = t2.field1", true); + "select t1.column1,t1.column2,t2.field1,t2.field2 from T_DT_ytb_01 t1 , T_DT_ytb_02 t2 on t1.column1 = t2.field1", + true); } @Test public void testNestedCaseComplexExpressionIssue1306() throws JSQLParserException { // with extra brackets - assertSqlCanBeParsedAndDeparsed( - "SELECT CASE\n" - + "WHEN 'USD' = 'USD'\n" - + "THEN 0\n" - + "ELSE CASE\n" - + "WHEN 'USD' = 'EURO'\n" - + "THEN ( CASE\n" - + "WHEN 'A' = 'B'\n" - + "THEN 0\n" - + "ELSE 1\n" - + "END * 100 )\n" - + "ELSE 2\n" - + "END\n" - + "END AS \"column1\"\n" - + "FROM test_schema.table_name\n" - + "", true); + assertSqlCanBeParsedAndDeparsed("SELECT CASE\n" + "WHEN 'USD' = 'USD'\n" + "THEN 0\n" + + "ELSE CASE\n" + "WHEN 'USD' = 'EURO'\n" + "THEN ( CASE\n" + "WHEN 'A' = 'B'\n" + + "THEN 0\n" + "ELSE 1\n" + "END * 100 )\n" + "ELSE 2\n" + "END\n" + + "END AS \"column1\"\n" + "FROM test_schema.table_name\n" + "", true); // without brackets - assertSqlCanBeParsedAndDeparsed( - "SELECT CASE\n" - + "WHEN 'USD' = 'USD'\n" - + "THEN 0\n" - + "ELSE CASE\n" - + "WHEN 'USD' = 'EURO'\n" - + "THEN CASE\n" - + "WHEN 'A' = 'B'\n" - + "THEN 0\n" - + "ELSE 1\n" - + "END * 100 \n" - + "ELSE 2\n" - + "END\n" - + "END AS \"column1\"\n" - + "FROM test_schema.table_name\n" - + "", true); + assertSqlCanBeParsedAndDeparsed("SELECT CASE\n" + "WHEN 'USD' = 'USD'\n" + "THEN 0\n" + + "ELSE CASE\n" + "WHEN 'USD' = 'EURO'\n" + "THEN CASE\n" + "WHEN 'A' = 'B'\n" + + "THEN 0\n" + "ELSE 1\n" + "END * 100 \n" + "ELSE 2\n" + "END\n" + + "END AS \"column1\"\n" + "FROM test_schema.table_name\n" + "", true); } @Test public void testGroupByComplexExpressionIssue1308() throws JSQLParserException { // without extra brackets - assertSqlCanBeParsedAndDeparsed( - "select * \n" - + "from dual \n" + assertSqlCanBeParsedAndDeparsed("select * \n" + "from dual \n" + "group by case when 1=1 then 'X' else 'Y' end, column1", true); - // with extra brackets for List - assertSqlCanBeParsedAndDeparsed( - "select * \n" - + "from dual \n" + // with extra brackets for List + assertSqlCanBeParsedAndDeparsed("select * \n" + "from dual \n" + "group by (case when 1=1 then 'X' else 'Y' end, column1)", true); // with extra brackets for Expression - assertSqlCanBeParsedAndDeparsed( - "select * \n" - + "from dual \n" + assertSqlCanBeParsedAndDeparsed("select * \n" + "from dual \n" + "group by (case when 1=1 then 'X' else 'Y' end), column1", true); } @Test public void testReservedKeywordsMSSQLUseIndexIssue1325() throws JSQLParserException { // without extra brackets - assertSqlCanBeParsedAndDeparsed( - "SELECT col FROM table USE INDEX(primary)", true); + assertSqlCanBeParsedAndDeparsed("SELECT col FROM table USE INDEX(primary)", true); } @Test public void testReservedKeywordsIssue1352() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT system from b1.system", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT query from query.query", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT fulltext from fulltext.fulltext", true); + assertSqlCanBeParsedAndDeparsed("SELECT system from b1.system", true); + assertSqlCanBeParsedAndDeparsed("SELECT query from query.query", true); + assertSqlCanBeParsedAndDeparsed("SELECT fulltext from fulltext.fulltext", true); } @Test @@ -4983,35 +5285,33 @@ public void testTableSpaceKeyword() throws JSQLParserException { // without extra brackets assertSqlCanBeParsedAndDeparsed( "SELECT DDF.tablespace TABLESPACE_NAME\n" - + " , maxtotal / 1024 / 1024 \"MAX_MB\"\n" - + " , ( total - free ) / 1024 / 1024 \"USED_MB\"\n" - + " , ( maxtotal - ( total - free ) ) / 1024 / 1024 \"AVAILABLE_MB\"\n" - + " , total / 1024 / 1024 \"ALLOCATED_MB\"\n" - + " , free / 1024 / 1024 \"ALLOCATED_FREE_MB\"\n" - + " , ( ( total - free ) / maxtotal * 100 ) \"USED_PERC\"\n" - + " , cnt \"FILE_COUNT\"\n" - + " FROM (SELECT tablespace_name TABLESPACE\n" - + " , SUM(bytes) TOTAL\n" - + " , SUM(Greatest(maxbytes, bytes)) MAXTOTAL\n" - + " , Count(*) CNT\n" - + " FROM dba_data_files\n" - + " GROUP BY tablespace_name) DDF\n" - + " , (SELECT tablespace_name TABLESPACE\n" - + " , SUM(bytes) FREE\n" - + " , Max(bytes) MAXF\n" - + " FROM dba_free_space\n" - + " GROUP BY tablespace_name) DFS\n" - + " WHERE DDF.tablespace = DFS.tablespace\n" - + " ORDER BY 1 DESC", true); + + " , maxtotal / 1024 / 1024 \"MAX_MB\"\n" + + " , ( total - free ) / 1024 / 1024 \"USED_MB\"\n" + + " , ( maxtotal - ( total - free ) ) / 1024 / 1024 \"AVAILABLE_MB\"\n" + + " , total / 1024 / 1024 \"ALLOCATED_MB\"\n" + + " , free / 1024 / 1024 \"ALLOCATED_FREE_MB\"\n" + + " , ( ( total - free ) / maxtotal * 100 ) \"USED_PERC\"\n" + + " , cnt \"FILE_COUNT\"\n" + + " FROM (SELECT tablespace_name TABLESPACE\n" + + " , SUM(bytes) TOTAL\n" + + " , SUM(Greatest(maxbytes, bytes)) MAXTOTAL\n" + + " , Count(*) CNT\n" + + " FROM dba_data_files\n" + + " GROUP BY tablespace_name) DDF\n" + + " , (SELECT tablespace_name TABLESPACE\n" + + " , SUM(bytes) FREE\n" + + " , Max(bytes) MAXF\n" + + " FROM dba_free_space\n" + + " GROUP BY tablespace_name) DFS\n" + + " WHERE DDF.tablespace = DFS.tablespace\n" + " ORDER BY 1 DESC", + true); } @Test public void testTableSpecificAllColumnsIssue1346() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT count(*) from a", true); + assertSqlCanBeParsedAndDeparsed("SELECT count(*) from a", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT count(a.*) from a", true); + assertSqlCanBeParsedAndDeparsed("SELECT count(a.*) from a", true); } @Test @@ -5032,49 +5332,33 @@ public void testCanCallSubSelectOnWithItemEvenIfNotSetIssue1369() { @Test public void testCaseElseExpressionIssue1375() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed( - "SELECT * FROM t1 WHERE CASE WHEN 1 = 1 THEN c1 = 'a' ELSE c2 = 'b' AND c4 = 'd' END", true); + "SELECT * FROM t1 WHERE CASE WHEN 1 = 1 THEN c1 = 'a' ELSE c2 = 'b' AND c4 = 'd' END", + true); } public void testComplexInExpressionIssue905() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "select * " - + "from table_a " - + "where other_id in (" + assertSqlCanBeParsedAndDeparsed("select * " + "from table_a " + "where other_id in (" + " (select id from table_b where name like '%aa%')" - + " , (select id from table_b where name like '%bb%')" - + ")", true); - - assertSqlCanBeParsedAndDeparsed( - "select * from v.e\n" - + "where\n" - + "\tcid <> rid\n" - + "\tand rid not in\n" - + "\t(\n" - + "\t\t(select distinct rid from v.s )\n" - + "\t\tunion\n" - + "\t\t(select distinct rid from v.p )\n" - + "\t)\n" + + " , (select id from table_b where name like '%bb%')" + ")", true); + + assertSqlCanBeParsedAndDeparsed("select * from v.e\n" + "where\n" + "\tcid <> rid\n" + + "\tand rid not in\n" + "\t(\n" + "\t\t(select distinct rid from v.s )\n" + + "\t\tunion\n" + "\t\t(select distinct rid from v.p )\n" + "\t)\n" + "\tand \"timestamp\" <= 1298505600000", true); assertSqlCanBeParsedAndDeparsed( - "select * " - + "from table_a " - + "where (a, b, c) in ((1, 2, 3), (3, 4, 5))", true); + "select * " + "from table_a " + "where (a, b, c) in ((1, 2, 3), (3, 4, 5))", true); } @Test public void testLogicalExpressionSelectItemIssue1381() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT ( 1 + 1 ) = ( 1 + 2 )", true); + assertSqlCanBeParsedAndDeparsed("SELECT ( 1 + 1 ) = ( 1 + 2 )", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT ( 1 = 1 ) = ( 1 = 2 )", true); + assertSqlCanBeParsedAndDeparsed("SELECT ( 1 = 1 ) = ( 1 = 2 )", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT ( ( 1 = 1 ) AND ( 1 = 2 ) )", true); + assertSqlCanBeParsedAndDeparsed("SELECT ( ( 1 = 1 ) AND ( 1 = 2 ) )", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT ( 1 = 1 ) AND ( 1 = 2 )", true); + assertSqlCanBeParsedAndDeparsed("SELECT ( 1 = 1 ) AND ( 1 = 2 )", true); } @Test @@ -5084,17 +5368,15 @@ public void testKeywordAtIssue1414() throws JSQLParserException { @Test public void testIgnoreNullsForWindowFunctionsIssue1429() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT lag(mydata) IGNORE NULLS OVER (ORDER BY sortorder) AS previous_status FROM mytable"); + assertSqlCanBeParsedAndDeparsed( + "SELECT lag(mydata) IGNORE NULLS OVER (ORDER BY sortorder) AS previous_status FROM mytable"); } @Test @Timeout(1000) public void testPerformanceIssue1438() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("" - + "SELECT \t* FROM TABLE_1 t1\n" - + "WHERE\n" - + "\t(((t1.COL1 = 'VALUE2' )\n" - + "\t\tAND (t1.CAL2 = 'VALUE2' ))\n" + assertSqlCanBeParsedAndDeparsed("" + "SELECT \t* FROM TABLE_1 t1\n" + "WHERE\n" + + "\t(((t1.COL1 = 'VALUE2' )\n" + "\t\tAND (t1.CAL2 = 'VALUE2' ))\n" + "\t\tAND (((1 = 1 )\n" + "\t\t\tAND ((((((t1.id IN (940550 ,940600 ,940650 ,940700 ,940750 ,940800 ,940850 ,940900 ,940950 ,941000 ,941050 ,941100 ,941150 ,941200 ,941250 ,941300 ,941350 ,941400 ,941450 ,941500 ,941550 ,941600 ,941650 ,941700 ,941750 ,941800 ,941850 ,941900 ,941950 ,942000 ,942050 ,942100 ,942150 ,942200 ,942250 ,942300 ,942350 ,942400 ,942450 ,942500 ,942550 ,942600 ,942650 ,942700 ,942750 ,942800 ,942850 ,942900 ,942950 ,943000 ,943050 ,943100 ,943150 ,943200 ,943250 ,943300 ,943350 ,943400 ,943450 ,943500 ,943550 ,943600 ,943650 ,943700 ,943750 ,943800 ,943850 ,943900 ,943950 ,944000 ,944050 ,944100 ,944150 ,944200 ,944250 ,944300 ,944350 ,944400 ,944450 ,944500 ,944550 ,944600 ,944650 ,944700 ,944750 ,944800 ,944850 ,944900 ,944950 ,945000 ,945050 ,945100 ,945150 ,945200 ,945250 ,945300 ))\n" + "\t\t\t\tOR (t1.id IN (945350 ,945400 ,945450 ,945500 ,945550 ,945600 ,945650 ,945700 ,945750 ,945800 ,945850 ,945900 ,945950 ,946000 ,946050 ,946100 ,946150 ,946200 ,946250 ,946300 ,946350 ,946400 ,946450 ,946500 ,946550 ,946600 ,946650 ,946700 ,946750 ,946800 ,946850 ,946900 ,946950 ,947000 ,947050 ,947100 ,947150 ,947200 ,947250 ,947300 ,947350 ,947400 ,947450 ,947500 ,947550 ,947600 ,947650 ,947700 ,947750 ,947800 ,947850 ,947900 ,947950 ,948000 ,948050 ,948100 ,948150 ,948200 ,948250 ,948300 ,948350 ,948400 ,948450 ,948500 ,948550 ,948600 ,948650 ,948700 ,948750 ,948800 ,948850 ,948900 ,948950 ,949000 ,949050 ,949100 ,949150 ,949200 ,949250 ,949300 ,949350 ,949400 ,949450 ,949500 ,949550 ,949600 ,949650 ,949700 ,949750 ,949800 ,949850 ,949900 ,949950 ,950000 ,950050 ,950100 )))\n" @@ -5103,51 +5385,41 @@ public void testPerformanceIssue1438() throws JSQLParserException { + "\t\t\t\tOR (t1.id IN (944100, 944150, 944200, 944250, 944300, 944350, 944400, 944450, 944500, 944550, 944600, 944650, 944700, 944750, 944800, 944850, 944900, 944950, 945000 )))\n" + "\t\t\t\tOR (t1.id IN (957350 ,957400 ,957450 ,957500 ,957550 ,957600 ,957650 ,957700 ,957750 ,957800 ,957850 ,957900 ,957950 ,958000 ,958050 ,958100 ,958150 ,958200 ,958250 ,958300 ,958350 ,958400 ,958450 ,958500 ,958550 ,958600 ,958650 ,958700 ,958750 ,958800 ,958850 ,958900 ,958950 ,959000 ,959050 ,959100 ,959150 ,959200 ,959250 ,959300 ,959350 ,959400 ,959450 ,959500 ,959550 ,959600 ,959650 ,959700 ,959750 ,959800 ,959850 ,959900 ,959950 ,960000 ,960050 ,960100 ,960150 ,960200 ,960250 ,960300 ,960350 ,960400 ,960450 ,960500 ,960550 ,960600 ,960650 ,960700 ,960750 ,960800 ,960850 ,960900 ,960950 ,961000 ,961050 ,961100 ,961150 ,961200 ,961250 ,961300 ,961350 ,961400 ,961450 ,961500 ,961550 ,961600 ,961650 ,961700 ,961750 ,961800 ,961850 ,961900 ,961950 ,962000 ,962050 ,962100 ))))\n" + "\t\t\t\tOR (t1.id IN (962150 ,962200 ,962250 ,962300 ,962350 ,962400 ,962450 ,962500 ,962550 ,962600 ,962650 ,962700 ,962750 ,962800 ,962850 ,962900 ,962950 ,963000 ,963050 ,963100 ,963150 ,963200 ,963250 ,963300 ,963350 ,963400 ,963450 ,963500 ,963550 ,963600 ,963650 ,963700 ,963750 ,963800 ,963850 ,963900 ,963950 ,964000 ,964050 ,964100 ,964150 ,964200 ,964250 ,964300 ,964350 ,964400 ,964450 ,964500 ,964550 ,964600 ,964650 ,964700 ,964750 ,964800 ,964850 ,964900 ,964950 ,965000 ,965050 ,965100 ,965150 ,965200 ,965250 ,965300 ,965350 ,965400 ,965450 ,965500 ))))\n" - + "\tAND t1.COL3 IN (\n" - + "\t SELECT\n" - + "\t\t t2.COL3\n" - + "\t FROM\n" - + "\t\t TABLE_6 t6,\n" - + "\t\t TABLE_1 t5,\n" - + "\t\t TABLE_4 t4,\n" - + "\t\t TABLE_3 t3,\n" - + "\t\t TABLE_1 t2\n" - + "\t WHERE\n" - + "\t\t (((((((t5.CAL3 = T6.id)\n" - + "\t\t\t AND (t5.CAL5 = t6.CAL5))\n" - + "\t\t\t AND (t5.CAL1 = t6.CAL1))\n" - + "\t\t\t AND (t3.CAL1 IN (108500)))\n" + + "\tAND t1.COL3 IN (\n" + "\t SELECT\n" + "\t\t t2.COL3\n" + "\t FROM\n" + + "\t\t TABLE_6 t6,\n" + "\t\t TABLE_1 t5,\n" + "\t\t TABLE_4 t4,\n" + + "\t\t TABLE_3 t3,\n" + "\t\t TABLE_1 t2\n" + "\t WHERE\n" + + "\t\t (((((((t5.CAL3 = T6.id)\n" + "\t\t\t AND (t5.CAL5 = t6.CAL5))\n" + + "\t\t\t AND (t5.CAL1 = t6.CAL1))\n" + "\t\t\t AND (t3.CAL1 IN (108500)))\n" + "\t\t\t AND (t5.id = t2.id))\n" + "\t\t\t AND NOT ((t6.CAL6 IN ('VALUE'))))\n" - + "\t\t\t AND ((t2.id = t3.CAL2)\n" - + "\t\t\t\t AND (t4.id = t3.CAL3))))\n" - + "ORDER BY\n" - + "\tt1.id ASC", true); + + "\t\t\t AND ((t2.id = t3.CAL2)\n" + "\t\t\t\t AND (t4.id = t3.CAL3))))\n" + + "ORDER BY\n" + "\tt1.id ASC", true); } @Test @Timeout(1000) public void testPerformanceIssue1397() throws Exception { - String sqlStr = IOUtils.toString(SelectTest.class.getResource("/net/sf/jsqlparser/statement/select/performanceIssue1397.sql"), Charset.defaultCharset()); + String sqlStr = IOUtils.toString( + SelectTest.class.getResource( + "/net/sf/jsqlparser/statement/select/performanceIssue1397.sql"), + Charset.defaultCharset()); assertSqlCanBeParsedAndDeparsed(sqlStr, true); } /** - * 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. + * 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. + * We repeat that test multiple times and want to see no stale references to the Parser after + * timeout. * * @throws JSQLParserException */ @Test public void testParserInterruptedByTimeout() { - String sqlStr = "" - + "SELECT \t* FROM TABLE_1 t1\n" - + "WHERE\n" - + "\t(((t1.COL1 = 'VALUE2' )\n" - + "\t\tAND (t1.CAL2 = 'VALUE2' ))\n" + String sqlStr = "" + "SELECT \t* FROM TABLE_1 t1\n" + "WHERE\n" + + "\t(((t1.COL1 = 'VALUE2' )\n" + "\t\tAND (t1.CAL2 = 'VALUE2' ))\n" + "\t\tAND (((1 = 1 )\n" + "\t\t\tAND ((((((t1.id IN (940550 ,940600 ,940650 ,940700 ,940750 ,940800 ,940850 ,940900 ,940950 ,941000 ,941050 ,941100 ,941150 ,941200 ,941250 ,941300 ,941350 ,941400 ,941450 ,941500 ,941550 ,941600 ,941650 ,941700 ,941750 ,941800 ,941850 ,941900 ,941950 ,942000 ,942050 ,942100 ,942150 ,942200 ,942250 ,942300 ,942350 ,942400 ,942450 ,942500 ,942550 ,942600 ,942650 ,942700 ,942750 ,942800 ,942850 ,942900 ,942950 ,943000 ,943050 ,943100 ,943150 ,943200 ,943250 ,943300 ,943350 ,943400 ,943450 ,943500 ,943550 ,943600 ,943650 ,943700 ,943750 ,943800 ,943850 ,943900 ,943950 ,944000 ,944050 ,944100 ,944150 ,944200 ,944250 ,944300 ,944350 ,944400 ,944450 ,944500 ,944550 ,944600 ,944650 ,944700 ,944750 ,944800 ,944850 ,944900 ,944950 ,945000 ,945050 ,945100 ,945150 ,945200 ,945250 ,945300 ))\n" + "\t\t\t\tOR (t1.id IN (945350 ,945400 ,945450 ,945500 ,945550 ,945600 ,945650 ,945700 ,945750 ,945800 ,945850 ,945900 ,945950 ,946000 ,946050 ,946100 ,946150 ,946200 ,946250 ,946300 ,946350 ,946400 ,946450 ,946500 ,946550 ,946600 ,946650 ,946700 ,946750 ,946800 ,946850 ,946900 ,946950 ,947000 ,947050 ,947100 ,947150 ,947200 ,947250 ,947300 ,947350 ,947400 ,947450 ,947500 ,947550 ,947600 ,947650 ,947700 ,947750 ,947800 ,947850 ,947900 ,947950 ,948000 ,948050 ,948100 ,948150 ,948200 ,948250 ,948300 ,948350 ,948400 ,948450 ,948500 ,948550 ,948600 ,948650 ,948700 ,948750 ,948800 ,948850 ,948900 ,948950 ,949000 ,949050 ,949100 ,949150 ,949200 ,949250 ,949300 ,949350 ,949400 ,949450 ,949500 ,949550 ,949600 ,949650 ,949700 ,949750 ,949800 ,949850 ,949900 ,949950 ,950000 ,950050 ,950100 )))\n" @@ -5156,29 +5428,32 @@ public void testParserInterruptedByTimeout() { + "\t\t\t\tOR (t1.id IN (944100, 944150, 944200, 944250, 944300, 944350, 944400, 944450, 944500, 944550, 944600, 944650, 944700, 944750, 944800, 944850, 944900, 944950, 945000 )))\n" + "\t\t\t\tOR (t1.id IN (957350 ,957400 ,957450 ,957500 ,957550 ,957600 ,957650 ,957700 ,957750 ,957800 ,957850 ,957900 ,957950 ,958000 ,958050 ,958100 ,958150 ,958200 ,958250 ,958300 ,958350 ,958400 ,958450 ,958500 ,958550 ,958600 ,958650 ,958700 ,958750 ,958800 ,958850 ,958900 ,958950 ,959000 ,959050 ,959100 ,959150 ,959200 ,959250 ,959300 ,959350 ,959400 ,959450 ,959500 ,959550 ,959600 ,959650 ,959700 ,959750 ,959800 ,959850 ,959900 ,959950 ,960000 ,960050 ,960100 ,960150 ,960200 ,960250 ,960300 ,960350 ,960400 ,960450 ,960500 ,960550 ,960600 ,960650 ,960700 ,960750 ,960800 ,960850 ,960900 ,960950 ,961000 ,961050 ,961100 ,961150 ,961200 ,961250 ,961300 ,961350 ,961400 ,961450 ,961500 ,961550 ,961600 ,961650 ,961700 ,961750 ,961800 ,961850 ,961900 ,961950 ,962000 ,962050 ,962100 ))))\n" + "\t\t\t\tOR (t1.id IN (962150 ,962200 ,962250 ,962300 ,962350 ,962400 ,962450 ,962500 ,962550 ,962600 ,962650 ,962700 ,962750 ,962800 ,962850 ,962900 ,962950 ,963000 ,963050 ,963100 ,963150 ,963200 ,963250 ,963300 ,963350 ,963400 ,963450 ,963500 ,963550 ,963600 ,963650 ,963700 ,963750 ,963800 ,963850 ,963900 ,963950 ,964000 ,964050 ,964100 ,964150 ,964200 ,964250 ,964300 ,964350 ,964400 ,964450 ,964500 ,964550 ,964600 ,964650 ,964700 ,964750 ,964800 ,964850 ,964900 ,964950 ,965000 ,965050 ,965100 ,965150 ,965200 ,965250 ,965300 ,965350 ,965400 ,965450 ,965500 ))))\n" - + "\tAND t1.COL3 IN (\n" - + "\t SELECT\n" - + "\t\t t2.COL3\n" - + "\t FROM\n" - + "\t\t TABLE_6 t6,\n" - + "\t\t TABLE_1 t5,\n" - + "\t\t TABLE_4 t4,\n" - + "\t\t TABLE_3 t3,\n" - + "\t\t TABLE_1 t2\n" - + "\t WHERE\n" - + "\t\t (((((((t5.CAL3 = T6.id)\n" - + "\t\t\t AND (t5.CAL5 = t6.CAL5))\n" - + "\t\t\t AND (t5.CAL1 = t6.CAL1))\n" - + "\t\t\t AND (t3.CAL1 IN (108500)))\n" + + "\tAND t1.COL3 IN (\n" + "\t SELECT\n" + "\t\t t2.COL3\n" + "\t FROM\n" + + "\t\t TABLE_6 t6,\n" + "\t\t TABLE_1 t5,\n" + "\t\t TABLE_4 t4,\n" + + "\t\t TABLE_3 t3,\n" + "\t\t TABLE_1 t2\n" + "\t WHERE\n" + + "\t\t (((((((t5.CAL3 = T6.id)\n" + "\t\t\t AND (t5.CAL5 = t6.CAL5))\n" + + "\t\t\t AND (t5.CAL1 = t6.CAL1))\n" + "\t\t\t AND (t3.CAL1 IN (108500)))\n" + "\t\t\t AND (t5.id = t2.id))\n" + "\t\t\t AND NOT ((t6.CAL6 IN ('VALUE'))))\n" - + "\t\t\t AND ((t2.id = t3.CAL2)\n" - + "\t\t\t\t AND (t4.id = t3.CAL3))))\n" - + // add two redundant unmatched brackets in order to make the Simple Parser fail - // and the complex parser stuck - " )) \n" - + "ORDER BY\n" - + "\tt1.id ASC"; + + "\t\t\t AND ((t2.id = t3.CAL2)\n" + "\t\t\t\t AND (t4.id = t3.CAL3))))\n" + // add + // two + // redundant + // unmatched + // brackets + // in + // order + // to + // make + // the + // Simple + // Parser + // fail + // and + // the + // complex + // parser + // stuck + " )) \n" + "ORDER BY\n" + "\tt1.id ASC"; MemoryLeakVerifier verifier = new MemoryLeakVerifier(); @@ -5190,7 +5465,8 @@ public void testParserInterruptedByTimeout() { @Override public void run() { try { - CCJSqlParser parser = CCJSqlParserUtil.newParser(sqlStr).withAllowComplexParsing(true); + CCJSqlParser parser = + CCJSqlParserUtil.newParser(sqlStr).withAllowComplexParsing(true); verifier.addObject(parser); Statement statement = CCJSqlParserUtil.parseStatement(parser); @@ -5202,7 +5478,8 @@ public void run() { } executorService.shutdown(); - // we should not run in any timeout here (because we expect that the Parser has timed out by itself) + // we should not run in any timeout here (because we expect that the Parser has timed out by + // itself) Assertions.assertDoesNotThrow(new Executable() { @Override public void execute() throws Throwable { @@ -5231,7 +5508,8 @@ public void testWithIsolation() throws JSQLParserException { @Test public void testLoclTimezone1471() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT TO_CHAR(CAST(SYSDATE AS TIMESTAMP WITH LOCAL TIME ZONE), 'HH:MI:SS AM TZD') FROM DUAL"); + assertSqlCanBeParsedAndDeparsed( + "SELECT TO_CHAR(CAST(SYSDATE AS TIMESTAMP WITH LOCAL TIME ZONE), 'HH:MI:SS AM TZD') FROM DUAL"); } @Test @@ -5241,30 +5519,29 @@ public void testMissingLimitIssue1505() throws JSQLParserException { @Test public void testPostgresNaturalJoinIssue1559() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed( - "SELECT t1.ID,t1.name, t2.DID, t2.name\n" - + "FROM table1 as t1\n" - + "NATURAL RIGHT JOIN table2 as t2", true); + assertSqlCanBeParsedAndDeparsed("SELECT t1.ID,t1.name, t2.DID, t2.name\n" + + "FROM table1 as t1\n" + "NATURAL RIGHT JOIN table2 as t2", true); - assertSqlCanBeParsedAndDeparsed( - "SELECT t1.ID,t1.name, t2.DID, t2.name\n" - + "FROM table1 as t1\n" - + "NATURAL RIGHT JOIN table2 as t2", true); + assertSqlCanBeParsedAndDeparsed("SELECT t1.ID,t1.name, t2.DID, t2.name\n" + + "FROM table1 as t1\n" + "NATURAL RIGHT JOIN table2 as t2", true); } @Test public void testNamedWindowDefinitionIssue1581() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT sum(salary) OVER w, avg(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT sum(salary) OVER w, avg(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC)"); } @Test public void testNamedWindowDefinitionIssue1581_2() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT sum(salary) OVER w1, avg(salary) OVER w2 FROM empsalary WINDOW w1 AS (PARTITION BY depname ORDER BY salary DESC), w2 AS (PARTITION BY depname2 ORDER BY salary2)"); + assertSqlCanBeParsedAndDeparsed( + "SELECT sum(salary) OVER w1, avg(salary) OVER w2 FROM empsalary WINDOW w1 AS (PARTITION BY depname ORDER BY salary DESC), w2 AS (PARTITION BY depname2 ORDER BY salary2)"); } @Test public void testTimestamptzDateTimeLiteral() throws JSQLParserException { - assertSqlCanBeParsedAndDeparsed("SELECT * FROM table WHERE x >= TIMESTAMPTZ '2021-07-05 00:00:00+00'"); + assertSqlCanBeParsedAndDeparsed( + "SELECT * FROM table WHERE x >= TIMESTAMPTZ '2021-07-05 00:00:00+00'"); } @Test @@ -5299,7 +5576,8 @@ public void testSelectStatementWithForUpdateAndSkipLockedTokens() throws JSQLPar } @Test - public void testSelectStatementWithForUpdateButWithoutSkipLockedTokens() throws JSQLParserException { + public void testSelectStatementWithForUpdateButWithoutSkipLockedTokens() + throws JSQLParserException { String sql = "SELECT * FROM test FOR UPDATE"; assertSqlCanBeParsedAndDeparsed(sql); @@ -5310,7 +5588,8 @@ public void testSelectStatementWithForUpdateButWithoutSkipLockedTokens() throws } @Test - public void testSelectStatementWithoutForUpdateAndSkipLockedTokens() throws JSQLParserException { + public void testSelectStatementWithoutForUpdateAndSkipLockedTokens() + throws JSQLParserException { String sql = "SELECT * FROM test"; assertSqlCanBeParsedAndDeparsed(sql); diff --git a/src/test/java/net/sf/jsqlparser/test/UnicodeTest.java b/src/test/java/net/sf/jsqlparser/test/UnicodeTest.java new file mode 100644 index 000000000..436e593d6 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/test/UnicodeTest.java @@ -0,0 +1,17 @@ +package net.sf.jsqlparser.test; + +import net.sf.jsqlparser.*; +import org.junit.jupiter.api.*; + +public class UnicodeTest { + @Test + void testCJKSetIssue1741() throws JSQLParserException { + String sqlStr = "select c as 中文 from t"; + + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "select * from t where 中文 = 'abc'"; + + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } +}