diff --git a/.gitignore b/.gitignore index 54f477598..5097e8b10 100755 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ *.yml~ /nbproject/ +/gradle /.gradle diff --git a/build.gradle b/build.gradle index 4fc6803e7..5dadb1269 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,9 @@ compileJavacc { java { withSourcesJar() withJavadocJar() + + spotbugs + pmd } jacoco { @@ -62,16 +65,34 @@ jacocoTestReport { csv.required = false html.outputLocation = layout.buildDirectory.dir('reports/jacoco') } + + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + "**/*Adapter.class", + "**/SimpleCharStream.class", + ]) + })) + } } jacocoTestCoverageVerification { violationRules { rule { limit { - minimum = 0.840 + minimum = 0.845 } } } + + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + "**/*Adapter.class", + "**/SimpleCharStream.class", + ]) + })) + } } spotbugsMain { @@ -95,8 +116,9 @@ spotbugs { pmd { consoleOutput = false toolVersion = "6.36.0" - - sourceSets = [sourceSets.main] + + // run only over the main sources for now, but not over the tests + sourceSets = [sourceSets.main /*, sourceSets.test */] // clear the ruleset in order to use configured rules only, although we should apply the Prio 1 rules eventually ruleSets = [] @@ -133,7 +155,7 @@ task renderRR() { javaexec { standardOutput = new FileOutputStream("${buildDir}/rr/JSqlParserCC.ebnf") - main="-jar"; + main="-jar" args = [ "$buildDir/rr/convert.war", "$buildDir/generated/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jj" @@ -141,7 +163,7 @@ task renderRR() { } javaexec { - main="-jar"; + main="-jar" args = [ "$buildDir/rr/rr.war", "-noepsilon", diff --git a/src/main/java/net/sf/jsqlparser/statement/Block.java b/src/main/java/net/sf/jsqlparser/statement/Block.java index 6ee605518..415b0a3c7 100644 --- a/src/main/java/net/sf/jsqlparser/statement/Block.java +++ b/src/main/java/net/sf/jsqlparser/statement/Block.java @@ -9,7 +9,7 @@ */ package net.sf.jsqlparser.statement; -public class Block implements Statement { +public class Block extends StatementImpl { private Statements statements; @@ -27,8 +27,19 @@ public void accept(StatementVisitor statementVisitor) { } @Override - public String toString() { - return "BEGIN\n" + (statements != null ? statements.toString() : "") + "END"; + public boolean isBlock() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.BLOCK; + } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("BEGIN\n").append(statements != null ? statements.toString() : "").append("END"); + return builder; } public Block withStatements(Statements statements) { diff --git a/src/main/java/net/sf/jsqlparser/statement/Commit.java b/src/main/java/net/sf/jsqlparser/statement/Commit.java index f33a36ae1..747430492 100644 --- a/src/main/java/net/sf/jsqlparser/statement/Commit.java +++ b/src/main/java/net/sf/jsqlparser/statement/Commit.java @@ -9,14 +9,15 @@ */ package net.sf.jsqlparser.statement; -public class Commit implements Statement { +public class Commit extends DMLStatement { @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - + @Override - public String toString() { - return "COMMIT"; + public StringBuilder appendTo(StringBuilder builder) { + builder.append("COMMIT"); + return builder; } } diff --git a/src/main/java/net/sf/jsqlparser/statement/CreateFunctionalStatement.java b/src/main/java/net/sf/jsqlparser/statement/CreateFunctionalStatement.java index 6a6e3c1d2..bc840bbb6 100644 --- a/src/main/java/net/sf/jsqlparser/statement/CreateFunctionalStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/CreateFunctionalStatement.java @@ -18,7 +18,7 @@ /** * A base for the declaration of function like statements */ -public abstract class CreateFunctionalStatement implements Statement { +public abstract class CreateFunctionalStatement extends DDLStatement { private String kind; private boolean orReplace = false; @@ -89,11 +89,9 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - @Override - public String toString() { - return "CREATE " - + (orReplace?"OR REPLACE ":"") - + kind + " " + formatDeclaration(); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("CREATE ").append(orReplace ? "OR REPLACE " : "").append(kind).append(" ").append(formatDeclaration()); + return builder; } public CreateFunctionalStatement withFunctionDeclarationParts(List functionDeclarationParts) { diff --git a/src/main/java/net/sf/jsqlparser/statement/DDLStatement.java b/src/main/java/net/sf/jsqlparser/statement/DDLStatement.java new file mode 100644 index 000000000..5ea0a32cc --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/DDLStatement.java @@ -0,0 +1,33 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +/* + * To change this license header, choose License Headers in Project Properties. To change this + * template file, choose Tools | Templates and open the template in the editor. + */ + +package net.sf.jsqlparser.statement; + +/** + * + * @author Andreas Reichel + */ +public abstract class DDLStatement extends StatementImpl { + @Override + public boolean isDDL() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.DDL; + } + + public abstract StringBuilder appendTo(StringBuilder builder); +} diff --git a/src/main/java/net/sf/jsqlparser/statement/DMLStatement.java b/src/main/java/net/sf/jsqlparser/statement/DMLStatement.java new file mode 100644 index 000000000..383b2174f --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/DMLStatement.java @@ -0,0 +1,31 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +/* + * To change this license header, choose License Headers in Project Properties. To change this + * template file, choose Tools | Templates and open the template in the editor. + */ + +package net.sf.jsqlparser.statement; + +/** + * + * @author Andreas Reichel + */ +public abstract class DMLStatement extends StatementImpl { + @Override + public boolean isDML() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.DML; + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java b/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java index 4d3f51bf0..730c98ebe 100644 --- a/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/DeclareStatement.java @@ -19,7 +19,7 @@ import net.sf.jsqlparser.statement.create.table.ColDataType; import net.sf.jsqlparser.statement.create.table.ColumnDefinition; -public final class DeclareStatement implements Statement { +public final class DeclareStatement extends StatementImpl { private UserVariable userVariable = null; private DeclareType declareType = DeclareType.TYPE; @@ -47,6 +47,8 @@ public DeclareType getType() { return getDeclareType(); } + + /** * @return the {@link DeclareType} */ @@ -116,39 +118,50 @@ public void setTypeName(String typeName) { } @Override - public String toString() { - StringBuilder b = new StringBuilder("DECLARE "); + public boolean isBlock() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.BLOCK; + } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("DECLARE "); if (declareType == DeclareType.AS) { - b.append(userVariable.toString()); - b.append(" AS ").append(typeName); + builder.append(userVariable.toString()); + builder.append(" AS ").append(typeName); } else { if (declareType == DeclareType.TABLE) { - b.append(userVariable.toString()); - b.append(" TABLE ("); + builder.append(userVariable.toString()); + builder.append(" TABLE ("); for (int i = 0; i < columnDefinitions.size(); i++) { if (i > 0) { - b.append(", "); + builder.append(", "); } - b.append(columnDefinitions.get(i).toString()); + builder.append(columnDefinitions.get(i).toString()); } - b.append(")"); + builder.append(")"); } else { for (int i = 0; i < typeDefExprList.size(); i++) { if (i > 0) { - b.append(", "); + builder.append(", "); } final TypeDefExpr type = typeDefExprList.get(i); if (type.userVariable != null) { - b.append(type.userVariable.toString()).append(" "); + builder.append(type.userVariable).append(" "); } - b.append(type.colDataType.toString()); + builder.append(type.colDataType.toString()); if (type.defaultExpr != null) { - b.append(" = ").append(type.defaultExpr.toString()); + builder.append(" = ").append(type.defaultExpr); } } } } - return b.toString(); + + return builder; } @Override diff --git a/src/main/java/net/sf/jsqlparser/statement/DescribeStatement.java b/src/main/java/net/sf/jsqlparser/statement/DescribeStatement.java index 09d84c2e7..032857c9a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/DescribeStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/DescribeStatement.java @@ -11,12 +11,12 @@ import net.sf.jsqlparser.schema.Table; -public class DescribeStatement implements Statement { +public class DescribeStatement extends DDLStatement { private Table table; public DescribeStatement() { - // empty constructor + table = null; } public DescribeStatement(Table table) { @@ -31,11 +31,6 @@ public void setTable(Table table) { this.table = table; } - @Override - public String toString() { - return "DESCRIBE " + table.getFullyQualifiedName(); - } - @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); @@ -45,4 +40,10 @@ public DescribeStatement withTable(Table table) { this.setTable(table); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("DESCRIBE ").append(table.getFullyQualifiedName()); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java b/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java index 0aaf28c12..6d7a09dc8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java @@ -17,7 +17,7 @@ /** * An {@code EXPLAIN} statement */ -public class ExplainStatement implements Statement { +public class ExplainStatement extends DDLStatement { private Select select; private LinkedHashMap options; @@ -63,21 +63,21 @@ public Option getOption(OptionType optionType) { } @Override - public String toString() { - StringBuilder statementBuilder = new StringBuilder("EXPLAIN"); - if (options != null) { - statementBuilder.append(" "); - statementBuilder.append(options.values().stream().map(Option::formatOption).collect(Collectors.joining(" "))); - } - - statementBuilder.append(" "); - statementBuilder.append(select.toString()); - return statementBuilder.toString(); + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); } @Override - public void accept(StatementVisitor statementVisitor) { - statementVisitor.visit(this); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("EXPLAIN"); + if (options != null) { + builder.append(" "); + builder.append(options.values().stream().map(Option::formatOption).collect(Collectors.joining(" "))); + } + + builder.append(" "); + select.appendTo(builder); + return builder; } public enum OptionType { diff --git a/src/main/java/net/sf/jsqlparser/statement/IfElseStatement.java b/src/main/java/net/sf/jsqlparser/statement/IfElseStatement.java index 856aa5501..6d8096378 100644 --- a/src/main/java/net/sf/jsqlparser/statement/IfElseStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/IfElseStatement.java @@ -17,7 +17,7 @@ * * @author Andreas Reichel */ -public class IfElseStatement implements Statement { +public class IfElseStatement extends StatementImpl { private final Expression condition; private final Statement ifStatement; private Statement elseStatement; @@ -63,6 +63,16 @@ public boolean isUsingSemicolonForIfStatement() { return usingSemicolonForIfStatement; } + @Override + public boolean isBlock() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.BLOCK; + } + public StringBuilder appendTo(StringBuilder builder) { builder.append("IF ").append(condition).append(" ").append(ifStatement) .append(usingSemicolonForIfStatement ? ";" : ""); @@ -74,11 +84,6 @@ public StringBuilder appendTo(StringBuilder builder) { return builder; } - @Override - public String toString() { - return appendTo(new StringBuilder()).toString(); - } - @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); diff --git a/src/main/java/net/sf/jsqlparser/statement/PurgeStatement.java b/src/main/java/net/sf/jsqlparser/statement/PurgeStatement.java index bfcfff14d..11b712c20 100644 --- a/src/main/java/net/sf/jsqlparser/statement/PurgeStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/PurgeStatement.java @@ -20,7 +20,7 @@ * @see Purge */ -public class PurgeStatement implements Statement { +public class PurgeStatement extends DDLStatement { private final PurgeObjectType purgeObjectType; private final Object object; private String userName; @@ -80,11 +80,6 @@ public StringBuilder appendTo(StringBuilder builder) { return builder; } - @Override - public String toString() { - return appendTo(new StringBuilder()).toString(); - } - public String getUserName() { return userName; } diff --git a/src/main/java/net/sf/jsqlparser/statement/QueryStatement.java b/src/main/java/net/sf/jsqlparser/statement/QueryStatement.java new file mode 100644 index 000000000..e9072cdb4 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/QueryStatement.java @@ -0,0 +1,31 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +/* + * To change this license header, choose License Headers in Project Properties. To change this + * template file, choose Tools | Templates and open the template in the editor. + */ + +package net.sf.jsqlparser.statement; + +/** + * + * @author Andreas Reichel + */ +public abstract class QueryStatement extends StatementImpl { + @Override + public boolean isQuery() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.QUERY; + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/ResetStatement.java b/src/main/java/net/sf/jsqlparser/statement/ResetStatement.java index 956ffd027..9fd8b3176 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ResetStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/ResetStatement.java @@ -10,18 +10,19 @@ package net.sf.jsqlparser.statement; -public final class ResetStatement implements Statement { +public final class ResetStatement extends DDLStatement { - private String name = ""; + private String name; public ResetStatement() { - // empty constructor + name = ""; } public ResetStatement(String name) { - add(name); + this.name = name; } + @Deprecated public void add(String name) { this.name = name; } @@ -35,9 +36,9 @@ public void setName(String name) { } @Override - public String toString() { - StringBuilder b = new StringBuilder("RESET ").append(name); - return b.toString(); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("RESET ").append(name); + return builder; } @Override diff --git a/src/main/java/net/sf/jsqlparser/statement/RollbackStatement.java b/src/main/java/net/sf/jsqlparser/statement/RollbackStatement.java index ef566bc03..69b193080 100644 --- a/src/main/java/net/sf/jsqlparser/statement/RollbackStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/RollbackStatement.java @@ -27,9 +27,9 @@ /** * - * @author are + * @author Andreas Reichel */ -public class RollbackStatement implements Statement { +public class RollbackStatement extends DMLStatement { private boolean usingWorkKeyword=false; private boolean usingSavepointKeyword=false; private String savepointName=null; @@ -87,26 +87,22 @@ public void setForceDistributedTransactionIdentifier(String forceDistributedTran this.forceDistributedTransactionIdentifier = forceDistributedTransactionIdentifier; } - @Override - public String toString() { - return "ROLLBACK " - + ( usingWorkKeyword - ? "WORK " - : "" ) - + (savepointName!=null && savepointName.trim().length()!=0 - ? "TO " + (usingSavepointKeyword - ? "SAVEPOINT " - : "") + savepointName - : forceDistributedTransactionIdentifier!=null && forceDistributedTransactionIdentifier.trim().length()!=0 - ? "FORCE " + forceDistributedTransactionIdentifier - : "" - - ); - } - @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("ROLLBACK ").append(usingWorkKeyword + ? "WORK " + : "").append(savepointName != null && savepointName.trim().length() != 0 + ? "TO " + (usingSavepointKeyword + ? "SAVEPOINT " + : "") + savepointName + : forceDistributedTransactionIdentifier != null && forceDistributedTransactionIdentifier.trim().length() != 0 + ? "FORCE " + forceDistributedTransactionIdentifier + : ""); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/SavepointStatement.java b/src/main/java/net/sf/jsqlparser/statement/SavepointStatement.java index fd08d2999..e17b45030 100644 --- a/src/main/java/net/sf/jsqlparser/statement/SavepointStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/SavepointStatement.java @@ -16,7 +16,7 @@ * * @author Andreas Reichel */ -public class SavepointStatement implements Statement { +public class SavepointStatement extends DMLStatement { private String savepointName; public String getSavepointName() { @@ -32,12 +32,13 @@ public SavepointStatement(String savepointName) { } @Override - public String toString() { - return "SAVEPOINT " + savepointName; + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); } @Override - public void accept(StatementVisitor statementVisitor) { - statementVisitor.visit(this); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("SAVEPOINT ").append(savepointName); + return builder; } } diff --git a/src/main/java/net/sf/jsqlparser/statement/SetStatement.java b/src/main/java/net/sf/jsqlparser/statement/SetStatement.java index 1035ac4f7..55aac19d0 100644 --- a/src/main/java/net/sf/jsqlparser/statement/SetStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/SetStatement.java @@ -14,7 +14,7 @@ import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.statement.select.PlainSelect; -public final class SetStatement implements Statement { +public final class SetStatement extends DDLStatement { private String effectParameter; private final List values = new ArrayList<>(); @@ -104,22 +104,21 @@ private String toString(NameExpr ne) { } @Override - public String toString() { - StringBuilder b = new StringBuilder("SET "); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("SET "); if (effectParameter != null) { - b.append(effectParameter).append(" "); + builder.append(effectParameter).append(" "); } boolean addComma = false; for (NameExpr ne : values) { if (addComma) { - b.append(", "); + builder.append(", "); } else { addComma = true; } - b.append(toString(ne)); + builder.append(toString(ne)); } - - return b.toString(); + return builder; } @Override diff --git a/src/main/java/net/sf/jsqlparser/statement/ShowColumnsStatement.java b/src/main/java/net/sf/jsqlparser/statement/ShowColumnsStatement.java index 8915d81fd..c09fa55ae 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ShowColumnsStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/ShowColumnsStatement.java @@ -9,7 +9,7 @@ */ package net.sf.jsqlparser.statement; -public class ShowColumnsStatement implements Statement { +public class ShowColumnsStatement extends DDLStatement { private String tableName; @@ -29,11 +29,6 @@ public void setTableName(String tableName) { this.tableName = tableName; } - @Override - public String toString() { - return "SHOW COLUMNS FROM " + tableName; - } - @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); @@ -43,4 +38,10 @@ public ShowColumnsStatement withTableName(String tableName) { this.setTableName(tableName); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("SHOW COLUMNS FROM ").append(tableName); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/ShowStatement.java b/src/main/java/net/sf/jsqlparser/statement/ShowStatement.java index f6bc84518..de2eeb8bd 100644 --- a/src/main/java/net/sf/jsqlparser/statement/ShowStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/ShowStatement.java @@ -9,7 +9,7 @@ */ package net.sf.jsqlparser.statement; -public class ShowStatement implements Statement { +public class ShowStatement extends DDLStatement { private String name; @@ -29,11 +29,6 @@ public void setName(String name) { this.name = name; } - @Override - public String toString() { - return "SHOW " + name; - } - @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); @@ -43,4 +38,10 @@ public ShowStatement withName(String name) { this.setName(name); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("SHOW ").append(name); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/Statement.java b/src/main/java/net/sf/jsqlparser/statement/Statement.java index fee483c09..841652331 100644 --- a/src/main/java/net/sf/jsqlparser/statement/Statement.java +++ b/src/main/java/net/sf/jsqlparser/statement/Statement.java @@ -12,5 +12,14 @@ import net.sf.jsqlparser.Model; public interface Statement extends Model { + enum StatementType { QUERY, DML, DDL, BLOCK, UNPARSED } + + boolean isQuery(); + boolean isDML(); + boolean isDDL(); + boolean isBlock(); + boolean isUnparsed(); + StatementType getStatementType(); + void accept(StatementVisitor statementVisitor); } diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementImpl.java b/src/main/java/net/sf/jsqlparser/statement/StatementImpl.java new file mode 100644 index 000000000..fc3e1aee9 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/StatementImpl.java @@ -0,0 +1,46 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +/** + * + * @author Andreas Reichel + */ +public abstract class StatementImpl implements Statement { + + public boolean isQuery() { + return false; + } + + public boolean isDML() { + return false; + } + + public boolean isDDL() { + return false; + } + + public boolean isBlock() { + return false; + } + + public boolean isUnparsed() { + return false; + } + + public abstract StatementType getStatementType(); + + public abstract StringBuilder appendTo(final StringBuilder builder); + + @Override + public final String toString() { + return appendTo(new StringBuilder()).toString(); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/UnparsedStatement.java b/src/main/java/net/sf/jsqlparser/statement/UnparsedStatement.java new file mode 100644 index 000000000..a2f5ac44d --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/UnparsedStatement.java @@ -0,0 +1,31 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +/* + * To change this license header, choose License Headers in Project Properties. To change this + * template file, choose Tools | Templates and open the template in the editor. + */ + +package net.sf.jsqlparser.statement; + +/** + * + * @author Andreas Reichel + */ +public abstract class UnparsedStatement extends StatementImpl { + @Override + public boolean isUnparsed() { + return true; + } + + @Override + public StatementType getStatementType() { + return StatementType.UNPARSED; + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/UseStatement.java b/src/main/java/net/sf/jsqlparser/statement/UseStatement.java index 4022bd2da..b5d52c11c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/UseStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/UseStatement.java @@ -9,7 +9,7 @@ */ package net.sf.jsqlparser.statement; -public class UseStatement implements Statement { +public class UseStatement extends DDLStatement { private String name; @@ -29,11 +29,6 @@ public void setName(String name) { this.name = name; } - @Override - public String toString() { - return "USE " + name; - } - @Override public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); @@ -43,4 +38,10 @@ public UseStatement withName(String name) { this.setName(name); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("USE ").append(name); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java b/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java index e5adc1ea3..1acf6d91b 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/Alter.java @@ -16,10 +16,10 @@ import java.util.List; import java.util.Optional; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; -public class Alter implements Statement { +public class Alter extends DDLStatement { private Table table; private boolean useOnly = false; @@ -44,7 +44,7 @@ public void setUseOnly(boolean useOnly) { public void addAlterExpression(AlterExpression alterExpression) { if (alterExpressions == null) { - alterExpressions = new ArrayList(); + alterExpressions = new ArrayList<>(); } alterExpressions.add(alterExpression); } @@ -62,31 +62,6 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - @Override - public String toString() { - - StringBuilder b = new StringBuilder(); - b.append("ALTER TABLE "); - if (useOnly) { - b.append("ONLY "); - } - b.append(table.getFullyQualifiedName()).append(" "); - - Iterator altIter = alterExpressions.iterator(); - - while (altIter.hasNext()) { - b.append(altIter.next().toString()); - - // Need to append whitespace after each ADD or DROP statement - // but not the last one - if (altIter.hasNext()) { - b.append(", "); - } - } - - return b.toString(); - } - public Alter withTable(Table table) { this.setTable(table); return this; @@ -113,4 +88,26 @@ public Alter addAlterExpressions(Collection alterExpr collection.addAll(alterExpressions); return this.withAlterExpressions(collection); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("ALTER TABLE "); + if (useOnly) { + builder.append("ONLY "); + } + builder.append(table.getFullyQualifiedName()).append(" "); + + Iterator altIter = alterExpressions.iterator(); + + while (altIter.hasNext()) { + builder.append(altIter.next().toString()); + + // Need to append whitespace after each ADD or DROP statement + // but not the last one + if (altIter.hasNext()) { + builder.append(", "); + } + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterSession.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterSession.java index 64c25ad94..994a827a7 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterSession.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterSession.java @@ -11,15 +11,16 @@ package net.sf.jsqlparser.statement.alter; import java.util.List; -import net.sf.jsqlparser.statement.Statement; + +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; /** * - * @author are + * @author Andreas Reichel * @see ALTER SESSION */ -public class AlterSession implements Statement { +public class AlterSession extends DDLStatement { private AlterSessionOperation operation; private List parameters; @@ -44,16 +45,20 @@ public void setParameters(List parameters) { this.parameters = parameters; } - private static void appendParamaters(StringBuilder builder, List parameters) { + private static void appendParameters(StringBuilder builder, List parameters) { for (String s: parameters) { builder.append(" ").append(s); } } @Override - @SuppressWarnings({"PMD.ExcessiveMethodLength", "PMD.CyclomaticComplexity"}) - public String toString() { - StringBuilder builder = new StringBuilder(); + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } + + @Override + @SuppressWarnings({"PMD.ExcessiveMethodLength", "PMD.CyclomaticComplexity"}) + public StringBuilder appendTo(StringBuilder builder) { builder.append("ALTER SESSION "); switch (operation) { case ADVISE_COMMIT: @@ -67,7 +72,7 @@ public String toString() { break; case CLOSE_DATABASE_LINK: builder.append("CLOSE DATABASE LINK "); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; case ENABLE_COMMIT_IN_PROCEDURE: builder.append("ENABLE COMMIT IN PROCEDURE"); @@ -81,72 +86,67 @@ public String toString() { case DISABLE_GUARD: builder.append("DISABLE GUARD"); break; - + case ENABLE_PARALLEL_DML: builder.append("ENABLE PARALLEL DML"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case DISABLE_PARALLEL_DML: builder.append("DISABLE PARALLEL DML"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case FORCE_PARALLEL_DML: builder.append("FORCE PARALLEL DML"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case ENABLE_PARALLEL_DDL: builder.append("ENABLE PARALLEL DDL"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case DISABLE_PARALLEL_DDL: builder.append("DISABLE PARALLEL DDL"); break; - + case FORCE_PARALLEL_DDL: builder.append("FORCE PARALLEL DDL"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case ENABLE_PARALLEL_QUERY: builder.append("ENABLE PARALLEL QUERY"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case DISABLE_PARALLEL_QUERY: builder.append("DISABLE PARALLEL QUERY"); break; - + case FORCE_PARALLEL_QUERY: builder.append("FORCE PARALLEL QUERY"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case ENABLE_RESUMABLE: builder.append("ENABLE RESUMABLE"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; - + case DISABLE_RESUMABLE: builder.append("DISABLE RESUMABLE"); break; - + case SET: builder.append("SET"); - appendParamaters(builder, parameters); + appendParameters(builder, parameters); break; default: // not going to happen - - } - return builder.toString(); - } - @Override - public void accept(StatementVisitor statementVisitor) { - statementVisitor.visit(this); + } + return builder; } } diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterSystemStatement.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterSystemStatement.java index 15fef66f1..431b6ba63 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterSystemStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterSystemStatement.java @@ -11,7 +11,8 @@ import java.util.List; import java.util.Objects; -import net.sf.jsqlparser.statement.Statement; + +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; /** @@ -20,7 +21,7 @@ * @see ALTER SESSION */ -public class AlterSystemStatement implements Statement { +public class AlterSystemStatement extends DDLStatement { private final AlterSystemOperation operation; private final List parameters; @@ -53,10 +54,5 @@ public StringBuilder appendTo(StringBuilder builder) { appendParameters(builder, parameters); return builder; } - - @Override - public String toString() { - return appendTo(new StringBuilder()).toString(); - } } diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/RenameTableStatement.java b/src/main/java/net/sf/jsqlparser/statement/alter/RenameTableStatement.java index c53806f28..a57ac1179 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/RenameTableStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/RenameTableStatement.java @@ -16,15 +16,15 @@ import java.util.Objects; import java.util.Set; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; /** * - * @author are + * @author Andreas Reichel * @see Rename */ -public class RenameTableStatement implements Statement { +public class RenameTableStatement extends DDLStatement { private final LinkedHashMap tableNames = new LinkedHashMap<>(); private boolean usingTableKeyword = false; @@ -113,7 +113,8 @@ public Set> getTableNames() { public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - + + @Override public StringBuilder appendTo(StringBuilder builder) { int i=0; for (Entry e : tableNames.entrySet()) { @@ -138,9 +139,4 @@ public StringBuilder appendTo(StringBuilder builder) { } return builder; } - - @Override - public String toString() { - return appendTo(new StringBuilder()).toString(); - } } diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/sequence/AlterSequence.java b/src/main/java/net/sf/jsqlparser/statement/alter/sequence/AlterSequence.java index cd994717b..b0c3fe547 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/sequence/AlterSequence.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/sequence/AlterSequence.java @@ -10,13 +10,13 @@ package net.sf.jsqlparser.statement.alter.sequence; import net.sf.jsqlparser.schema.Sequence; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; /** * An {@code ALTER SEQUENCE} statement */ -public class AlterSequence implements Statement { +public class AlterSequence extends DDLStatement { public Sequence sequence; @@ -33,15 +33,14 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - @Override - public String toString() { - String sql; - sql = "ALTER SEQUENCE " + sequence; - return sql; - } - public AlterSequence withSequence(Sequence sequence) { this.setSequence(sequence); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("ALTER SEQUENCE ").append(sequence); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/comment/Comment.java b/src/main/java/net/sf/jsqlparser/statement/comment/Comment.java index 23942a889..389666300 100755 --- a/src/main/java/net/sf/jsqlparser/statement/comment/Comment.java +++ b/src/main/java/net/sf/jsqlparser/statement/comment/Comment.java @@ -12,10 +12,10 @@ import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; -public class Comment implements Statement { +public class Comment extends DDLStatement { private Table table; private Column column; @@ -60,17 +60,17 @@ public void setComment(StringValue comment) { } @Override - public String toString() { - String sql = "COMMENT ON "; + public StringBuilder appendTo(StringBuilder builder) { + builder.append("COMMENT ON "); if (table != null) { - sql += "TABLE " + table + " "; + builder.append("TABLE ").append(table).append(" "); } else if (column != null) { - sql += "COLUMN " + column + " "; + builder.append("COLUMN ").append(column).append(" "); } else if (view != null) { - sql += "VIEW " + view + " "; + builder.append("VIEW ").append(view).append(" "); } - sql += "IS " + comment; - return sql; + builder.append("IS ").append(comment); + return builder; } public Comment withTable(Table table) { diff --git a/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java b/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java index 806eda9a6..49c8b4031 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java @@ -16,7 +16,7 @@ import java.util.*; import static java.util.stream.Collectors.joining; -public class CreateIndex implements Statement { +public class CreateIndex extends DDLStatement { private Table table; private Index index; @@ -51,59 +51,56 @@ public void setTailParameters(List tailParameters) { this.tailParameters = tailParameters; } - @Override - public String toString() { - StringBuilder buffer = new StringBuilder(); + public CreateIndex withTable(Table table) { + this.setTable(table); + return this; + } + + public CreateIndex withIndex(Index index) { + this.setIndex(index); + return this; + } + + public CreateIndex withTailParameters(List tailParameters) { + this.setTailParameters(tailParameters); + return this; + } - buffer.append("CREATE "); + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("CREATE "); if (index.getType() != null) { - buffer.append(index.getType()); - buffer.append(" "); + builder.append(index.getType()); + builder.append(" "); } - buffer.append("INDEX "); - buffer.append(index.getName()); - buffer.append(" ON "); - buffer.append(table.getFullyQualifiedName()); + builder.append("INDEX "); + builder.append(index.getName()); + builder.append(" ON "); + builder.append(table.getFullyQualifiedName()); if (index.getUsing() != null) { - buffer.append(" USING "); - buffer.append(index.getUsing()); + builder.append(" USING "); + builder.append(index.getUsing()); } if (index.getColumnsNames() != null) { - buffer.append(" ("); + builder.append(" ("); - buffer.append( + builder.append( index.getColumns().stream() .map(cp -> cp.columnName + (cp.getParams() != null ? " " + String.join(" ", cp.getParams()) : "")).collect(joining(", ")) ); - buffer.append(")"); + builder.append(")"); if (tailParameters != null) { for (String param : tailParameters) { - buffer.append(" ").append(param); + builder.append(" ").append(param); } } } - - return buffer.toString(); - } - - public CreateIndex withTable(Table table) { - this.setTable(table); - return this; - } - - public CreateIndex withIndex(Index index) { - this.setIndex(index); - return this; - } - - public CreateIndex withTailParameters(List tailParameters) { - this.setTailParameters(tailParameters); - return this; + return builder; } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/schema/CreateSchema.java b/src/main/java/net/sf/jsqlparser/statement/create/schema/CreateSchema.java index 7832f291e..4b1eb542b 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/schema/CreateSchema.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/schema/CreateSchema.java @@ -14,10 +14,12 @@ import java.util.Collections; import java.util.List; import java.util.Optional; + +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.StatementVisitor; -public class CreateSchema implements Statement { +public class CreateSchema extends DDLStatement { private String authorization; private String schemaName; @@ -109,17 +111,6 @@ public void setSchemaPath(List schemaPath) { this.schemaPath = schemaPath; } - public String toString() { - String sql = "CREATE SCHEMA"; - if (schemaName != null) { - sql += " " + schemaName; - } - if (authorization != null) { - sql += " AUTHORIZATION " + authorization; - } - return sql; - } - public CreateSchema withAuthorization(String authorization) { this.setAuthorization(authorization); return this; @@ -146,4 +137,16 @@ public CreateSchema addSchemaPath(Collection schemaPath) { collection.addAll(schemaPath); return this.withSchemaPath(collection); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("CREATE SCHEMA"); + if (schemaName != null) { + builder.append(" ").append(schemaName); + } + if (authorization != null) { + builder.append(" AUTHORIZATION ").append(authorization); + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java index ba21a04b1..f0616e608 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java @@ -10,13 +10,13 @@ package net.sf.jsqlparser.statement.create.sequence; import net.sf.jsqlparser.schema.Sequence; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; /** * A {@code CREATE SEQUENCE} statement */ -public class CreateSequence implements Statement { +public class CreateSequence extends DDLStatement { public Sequence sequence; @@ -33,15 +33,14 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - @Override - public String toString() { - String sql; - sql = "CREATE SEQUENCE " + sequence; - return sql; - } - public CreateSequence withSequence(Sequence sequence) { this.setSequence(sequence); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("CREATE SEQUENCE ").append(sequence); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonym.java b/src/main/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonym.java index 3528bc60c..94ad3574b 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonym.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonym.java @@ -10,13 +10,13 @@ package net.sf.jsqlparser.statement.create.synonym; import net.sf.jsqlparser.schema.Synonym; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import java.util.ArrayList; import java.util.List; -public class CreateSynonym implements Statement { +public class CreateSynonym extends DDLStatement { private boolean orReplace; private boolean publicSynonym; @@ -71,24 +71,25 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } + public CreateSynonym withSynonym(Synonym synonym) { + this.setSynonym(synonym); + return this; + } + @Override - public String toString() { - StringBuilder sqlBuilder = new StringBuilder(); - sqlBuilder.append("CREATE "); + public StringBuilder appendTo(StringBuilder builder) { + + builder.append("CREATE "); if (orReplace) { - sqlBuilder.append("OR REPLACE "); + builder.append("OR REPLACE "); } if (publicSynonym) { - sqlBuilder.append("PUBLIC "); + builder.append("PUBLIC "); } - sqlBuilder.append("SYNONYM " + synonym); - sqlBuilder.append(' '); - sqlBuilder.append("FOR " + getFor()); - return sqlBuilder.toString(); - } + builder.append("SYNONYM ").append(synonym); + builder.append(' '); + builder.append("FOR ").append(getFor()); - public CreateSynonym withSynonym(Synonym synonym) { - this.setSynonym(synonym); - return this; + return builder; } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/CreateTable.java b/src/main/java/net/sf/jsqlparser/statement/create/table/CreateTable.java index 03faeee33..8063cf650 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/table/CreateTable.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/table/CreateTable.java @@ -16,12 +16,12 @@ import java.util.Optional; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; -public class CreateTable implements Statement { +public class CreateTable extends DDLStatement { private Table table; private boolean unlogged = false; @@ -150,47 +150,6 @@ public void setRowMovement(RowMovement rowMovement) { this.rowMovement = rowMovement; } - @Override - @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - String sql; - String createOps = PlainSelect.getStringList(createOptionsStrings, false, false); - - sql = "CREATE " + (unlogged ? "UNLOGGED " : "") - + (!"".equals(createOps) ? createOps + " " : "") - + "TABLE " + (ifNotExists ? "IF NOT EXISTS " : "") + table; - - if (columns != null && !columns.isEmpty()) { - sql += " "; - sql += PlainSelect.getStringList(columns, true, true); - } - if (columnDefinitions != null && !columnDefinitions.isEmpty()) { - sql += " ("; - - sql += PlainSelect.getStringList(columnDefinitions, true, false); - if (indexes != null && !indexes.isEmpty()) { - sql += ", "; - sql += PlainSelect.getStringList(indexes); - } - sql += ")"; - } - String options = PlainSelect.getStringList(tableOptionsStrings, false, false); - if (options != null && options.length() > 0) { - sql += " " + options; - } - - if (rowMovement != null) { - sql += " " + rowMovement.getMode().toString() + " ROW MOVEMENT"; - } - if (select != null) { - sql += " AS " + (selectParenthesis ? "(" : "") + select.toString() + (selectParenthesis ? ")" : ""); - } - if (likeTable != null) { - sql += " LIKE " + (selectParenthesis ? "(" : "") + likeTable.toString() + (selectParenthesis ? ")" : ""); - } - return sql; - } - public CreateTable withTable(Table table) { this.setTable(table); return this; @@ -288,4 +247,48 @@ public CreateTable addIndexes(Collection indexes) { collection.addAll(indexes); return this.withIndexes(collection); } + + @Override + @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) + public StringBuilder appendTo(StringBuilder builder) { + String createOps = PlainSelect.getStringList(createOptionsStrings, false, false); + + builder.append("CREATE ") + .append(unlogged ? "UNLOGGED " : "") + .append(!"".equals(createOps) ? createOps + " " : "") + .append("TABLE ") + .append(ifNotExists ? "IF NOT EXISTS " : "") + .append(table); + + if (columns != null && !columns.isEmpty()) { + builder.append(" "); + builder.append(PlainSelect.getStringList(columns, true, true)); + } + if (columnDefinitions != null && !columnDefinitions.isEmpty()) { + builder.append(" ("); + + builder.append(PlainSelect.getStringList(columnDefinitions, true, false)); + if (indexes != null && !indexes.isEmpty()) { + builder.append(", "); + builder.append(PlainSelect.getStringList(indexes)); + } + builder.append(")"); + } + String options = PlainSelect.getStringList(tableOptionsStrings, false, false); + if (options.length() > 0) { + builder.append(" ").append(options); + } + + if (rowMovement != null) { + builder.append(" ").append(rowMovement.getMode().toString()).append(" ROW MOVEMENT"); + } + if (select != null) { + builder.append(" AS ").append(selectParenthesis ? "(" : "").append(select).append(selectParenthesis ? ")" : ""); + } + if (likeTable != null) { + builder.append(" LIKE ").append(selectParenthesis ? "(" : "").append(likeTable).append(selectParenthesis ? ")" : ""); + } + + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/view/AlterView.java b/src/main/java/net/sf/jsqlparser/statement/create/view/AlterView.java index a436d6c98..50fa3a056 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/view/AlterView.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/view/AlterView.java @@ -15,12 +15,12 @@ import java.util.List; import java.util.Optional; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.SelectBody; -public class AlterView implements Statement { +public class AlterView extends DDLStatement { private Table view; private SelectBody selectBody; @@ -64,23 +64,6 @@ public void setUseReplace(boolean useReplace) { this.useReplace = useReplace; } - @Override - public String toString() { - StringBuilder sql; - if (useReplace) { - sql = new StringBuilder("REPLACE "); - } else { - sql = new StringBuilder("ALTER "); - } - sql.append("VIEW "); - sql.append(view); - if (columnNames != null) { - sql.append(PlainSelect.getStringList(columnNames, true, true)); - } - sql.append(" AS ").append(selectBody); - return sql.toString(); - } - public AlterView withView(Table view) { this.setView(view); return this; @@ -116,4 +99,20 @@ public AlterView addColumnNames(Collection columnNames) { public E getSelectBody(Class type) { return type.cast(getSelectBody()); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + if (useReplace) { + builder.append("REPLACE "); + } else { + builder.append("ALTER "); + } + builder.append("VIEW "); + builder.append(view); + if (columnNames != null) { + builder.append(PlainSelect.getStringList(columnNames, true, true)); + } + builder.append(" AS ").append(selectBody); + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java b/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java index 913f14dc1..b48871ad8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/view/CreateView.java @@ -15,12 +15,12 @@ import java.util.List; import java.util.Optional; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; -public class CreateView implements Statement { +public class CreateView extends DDLStatement { private Table view; private Select select; @@ -103,42 +103,6 @@ public void setWithReadOnly(boolean withReadOnly) { this.withReadOnly = withReadOnly; } - @Override - public String toString() { - StringBuilder sql = new StringBuilder("CREATE "); - if (isOrReplace()) { - sql.append("OR REPLACE "); - } - switch (force) { - case FORCE: - sql.append("FORCE "); - break; - case NO_FORCE: - sql.append("NO FORCE "); - break; - default: - // nothing - } - - if (temp != TemporaryOption.NONE) { - sql.append(temp.name()).append(" "); - } - - if (isMaterialized()) { - sql.append("MATERIALIZED "); - } - sql.append("VIEW "); - sql.append(view); - if (columnNames != null) { - sql.append(PlainSelect.getStringList(columnNames, true, true)); - } - sql.append(" AS ").append(select); - if (isWithReadOnly()) { - sql.append(" WITH READ ONLY"); - } - return sql.toString(); - } - public CreateView withView(Table view) { this.setView(view); return this; @@ -185,4 +149,40 @@ public CreateView addColumnNames(Collection columnNames) { collection.addAll(columnNames); return this.withColumnNames(collection); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder .append("CREATE "); + if (isOrReplace()) { + builder.append("OR REPLACE "); + } + switch (force) { + case FORCE: + builder.append("FORCE "); + break; + case NO_FORCE: + builder.append("NO FORCE "); + break; + default: + // nothing + } + + if (temp != TemporaryOption.NONE) { + builder.append(temp.name()).append(" "); + } + + if (isMaterialized()) { + builder.append("MATERIALIZED "); + } + builder.append("VIEW "); + builder.append(view); + if (columnNames != null) { + builder.append(PlainSelect.getStringList(columnNames, true, true)); + } + builder.append(" AS ").append(select); + if (isWithReadOnly()) { + builder.append(" WITH READ ONLY"); + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/delete/Delete.java b/src/main/java/net/sf/jsqlparser/statement/delete/Delete.java index 483e4fc72..1c1aec28b 100644 --- a/src/main/java/net/sf/jsqlparser/statement/delete/Delete.java +++ b/src/main/java/net/sf/jsqlparser/statement/delete/Delete.java @@ -20,7 +20,7 @@ import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.OracleHint; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DMLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.Join; import net.sf.jsqlparser.statement.select.Limit; @@ -28,7 +28,7 @@ import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.WithItem; -public class Delete implements Statement { +public class Delete extends DMLStatement { private List withItemsList; private Table table; @@ -144,37 +144,36 @@ public void setHasFrom(boolean hasFrom) { @Override @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder b = new StringBuilder(); + public StringBuilder appendTo(StringBuilder builder) { if (withItemsList != null && !withItemsList.isEmpty()) { - b.append("WITH "); + builder.append("WITH "); for (Iterator iter = withItemsList.iterator(); iter.hasNext();) { WithItem withItem = iter.next(); - b.append(withItem); + builder.append(withItem); if (iter.hasNext()) { - b.append(","); + builder.append(","); } - b.append(" "); + builder.append(" "); } } - - b.append("DELETE"); + + builder.append("DELETE"); if (tables != null && tables.size() > 0) { - b.append(" "); - b.append(tables.stream() - .map(t -> t.toString()) + builder.append(" "); + builder.append(tables.stream() + .map(Table::toString) .collect(joining(", "))); } if (hasFrom) { - b.append(" FROM"); + builder.append(" FROM"); } - b.append(" ").append(table); + builder.append(" ").append(table); if (usingList != null && usingList.size()>0) { - b.append(" USING "); - b.append(usingList.stream() + builder.append(" USING "); + builder.append(usingList.stream() .map(Table::toString) .collect(joining(", "))); } @@ -182,25 +181,25 @@ public String toString() { if (joins != null) { for (Join join : joins) { if (join.isSimple()) { - b.append(", ").append(join); + builder.append(", ").append(join); } else { - b.append(" ").append(join); + builder.append(" ").append(join); } } } if (where != null) { - b.append(" WHERE ").append(where); + builder.append(" WHERE ").append(where); } if (orderByElements != null) { - b.append(PlainSelect.orderByToString(orderByElements)); + builder.append(PlainSelect.orderByToString(orderByElements)); } if (limit != null) { - b.append(limit); + builder.append(limit); } - return b.toString(); + return builder; } public Delete withTables(List tables) { diff --git a/src/main/java/net/sf/jsqlparser/statement/drop/Drop.java b/src/main/java/net/sf/jsqlparser/statement/drop/Drop.java index 33dbd3bf3..74f8a21b9 100644 --- a/src/main/java/net/sf/jsqlparser/statement/drop/Drop.java +++ b/src/main/java/net/sf/jsqlparser/statement/drop/Drop.java @@ -15,11 +15,11 @@ import java.util.List; import java.util.Optional; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; -public class Drop implements Statement { +public class Drop extends DDLStatement { private String type; private Table name; @@ -63,18 +63,6 @@ public void setIfExists(boolean ifExists) { this.ifExists = ifExists; } - @Override - public String toString() { - String sql = "DROP " + type + " " - + (ifExists ? "IF EXISTS " : "") + name.toString(); - - if (parameters != null && !parameters.isEmpty()) { - sql += " " + PlainSelect.getStringList(parameters); - } - - return sql; - } - public Drop withIfExists(boolean ifExists) { this.setIfExists(ifExists); return this; @@ -106,4 +94,14 @@ public Drop addParameters(Collection parameters) { collection.addAll(parameters); return this.withParameters(collection); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("DROP ").append(type).append(" ").append(ifExists ? "IF EXISTS " : "").append(name.toString()); + + if (parameters != null && !parameters.isEmpty()) { + builder.append(" ").append(PlainSelect.getStringList(parameters)); + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/execute/Execute.java b/src/main/java/net/sf/jsqlparser/statement/execute/Execute.java index bc0eb16a4..80d2f85bf 100644 --- a/src/main/java/net/sf/jsqlparser/statement/execute/Execute.java +++ b/src/main/java/net/sf/jsqlparser/statement/execute/Execute.java @@ -11,11 +11,11 @@ import java.util.List; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; -public class Execute implements Statement { +public class Execute extends DDLStatement { private ExecType execType = ExecType.EXECUTE; private String name; @@ -69,13 +69,6 @@ public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } - @Override - public String toString() { - return execType.name() + " " + name - + (exprList != null && exprList.getExpressions() != null ? " " - + PlainSelect.getStringList(exprList.getExpressions(), true, parenthesis) : ""); - } - public Execute withExecType(ExecType execType) { this.setExecType(execType); return this; @@ -96,6 +89,13 @@ public Execute withParenthesis(boolean parenthesis) { return this; } + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append(execType.name()).append(" ").append(name).append(exprList != null && exprList.getExpressions() != null ? " " + + PlainSelect.getStringList(exprList.getExpressions(), true, parenthesis) : ""); + return builder; + } + public enum ExecType { EXECUTE, EXEC, diff --git a/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java b/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java index d553adff6..8994b49d8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java +++ b/src/main/java/net/sf/jsqlparser/statement/grant/Grant.java @@ -15,10 +15,11 @@ import java.util.List; import java.util.Optional; import static java.util.stream.Collectors.joining; -import net.sf.jsqlparser.statement.Statement; + +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; -public class Grant implements Statement { +public class Grant extends DDLStatement { private String role; private List privileges; @@ -74,33 +75,6 @@ public void setUsers(List users) { this.users = users; } - @Override - public String toString() { - StringBuilder buffer = new StringBuilder(); - - buffer.append("GRANT "); - if (role != null) { - buffer.append(role); - } else { - for (int i = 0; i < getPrivileges().size(); i++) { - if (i != 0) { - buffer.append(", "); - } - buffer.append(privileges.get(i)); - } - buffer.append(" ON "); - buffer.append(getObjectName()); - } - buffer.append(" TO "); - for (int i = 0; i < getUsers().size(); i++) { - if (i != 0) { - buffer.append(", "); - } - buffer.append(users.get(i)); - } - return buffer.toString(); - } - public Grant withRole(String role) { this.setRole(role); return this; @@ -149,4 +123,29 @@ public Grant addUsers(Collection users) { collection.addAll(users); return this.withUsers(collection); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("GRANT "); + if (role != null) { + builder.append(role); + } else { + for (int i = 0; i < getPrivileges().size(); i++) { + if (i != 0) { + builder.append(", "); + } + builder.append(privileges.get(i)); + } + builder.append(" ON "); + builder.append(getObjectName()); + } + builder.append(" TO "); + for (int i = 0; i < getUsers().size(); i++) { + if (i != 0) { + builder.append(", "); + } + builder.append(users.get(i)); + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java b/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java index 64be4e8ed..03d5df457 100644 --- a/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java +++ b/src/main/java/net/sf/jsqlparser/statement/insert/Insert.java @@ -20,7 +20,7 @@ import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DMLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; @@ -28,7 +28,7 @@ import net.sf.jsqlparser.statement.select.WithItem; @SuppressWarnings({"PMD.CyclomaticComplexity"}) -public class Insert implements Statement { +public class Insert extends DMLStatement { private Table table; private OracleHint oracleHint = null; @@ -208,82 +208,80 @@ public void setWithItemsList(List withItemsList) { @Override @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder sql = new StringBuilder(); + public StringBuilder appendTo(StringBuilder builder) { if (withItemsList != null && !withItemsList.isEmpty()) { - sql.append("WITH "); + builder.append("WITH "); for (Iterator iter = withItemsList.iterator(); iter.hasNext();) { WithItem withItem = iter.next(); - sql.append(withItem); + builder.append(withItem); if (iter.hasNext()) { - sql.append(","); + builder.append(","); } - sql.append(" "); + builder.append(" "); } } - sql.append("INSERT "); + builder.append("INSERT "); if (modifierPriority != null) { - sql.append(modifierPriority.name()).append(" "); + builder.append(modifierPriority.name()).append(" "); } if (modifierIgnore) { - sql.append("IGNORE "); + builder.append("IGNORE "); } - sql.append("INTO "); - sql.append(table).append(" "); + builder.append("INTO "); + builder.append(table).append(" "); if (columns != null) { - sql.append(PlainSelect.getStringList(columns, true, true)).append(" "); + builder.append(PlainSelect.getStringList(columns, true, true)).append(" "); } if (useValues) { - sql.append("VALUES "); + builder.append("VALUES "); } if (itemsList != null) { - sql.append(itemsList); + builder.append(itemsList); } else { if (useSelectBrackets) { - sql.append("("); + builder.append("("); } if (select != null) { - sql.append(select); + builder.append(select); } if (useSelectBrackets) { - sql.append(")"); + builder.append(")"); } } - + if (useSet) { - sql.append("SET "); + builder.append("SET "); for (int i = 0; i < getSetColumns().size(); i++) { if (i != 0) { - sql.append(", "); + builder.append(", "); } - sql.append(setColumns.get(i)).append(" = "); - sql.append(setExpressionList.get(i)); + builder.append(setColumns.get(i)).append(" = "); + builder.append(setExpressionList.get(i)); } } if (useDuplicate) { - sql.append(" ON DUPLICATE KEY UPDATE "); + builder.append(" ON DUPLICATE KEY UPDATE "); for (int i = 0; i < getDuplicateUpdateColumns().size(); i++) { if (i != 0) { - sql.append(", "); + builder.append(", "); } - sql.append(duplicateUpdateColumns.get(i)).append(" = "); - sql.append(duplicateUpdateExpressionList.get(i)); + builder.append(duplicateUpdateColumns.get(i)).append(" = "); + builder.append(duplicateUpdateExpressionList.get(i)); } } if (isReturningAllColumns()) { - sql.append(" RETURNING *"); + builder.append(" RETURNING *"); } else if (getReturningExpressionList() != null) { - sql.append(" RETURNING ").append(PlainSelect. + builder.append(" RETURNING ").append(PlainSelect. getStringList(getReturningExpressionList(), true, false)); } - - return sql.toString(); + return builder; } - + public Insert withWithItemsList(List withList) { this.withItemsList = withList; return this; diff --git a/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java b/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java index 868c4680e..dd297db76 100644 --- a/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java +++ b/src/main/java/net/sf/jsqlparser/statement/merge/Merge.java @@ -19,12 +19,12 @@ import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.OracleHint; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DMLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.SubSelect; import net.sf.jsqlparser.statement.select.WithItem; -public class Merge implements Statement { +public class Merge extends DMLStatement { private List withItemsList; private Table table; @@ -144,48 +144,46 @@ public void setInsertFirst(boolean insertFirst) { @Override @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder b = new StringBuilder(); + public StringBuilder appendTo(StringBuilder builder) { if (withItemsList != null && !withItemsList.isEmpty()) { - b.append("WITH "); + builder.append("WITH "); for (Iterator iter = withItemsList.iterator(); iter.hasNext();) { WithItem withItem = iter.next(); - b.append(withItem); + builder.append(withItem); if (iter.hasNext()) { - b.append(","); + builder.append(","); } - b.append(" "); + builder.append(" "); } } - b.append("MERGE INTO "); - b.append(table); - b.append(" USING "); + builder.append("MERGE INTO "); + builder.append(table); + builder.append(" USING "); if (usingTable != null) { - b.append(usingTable.toString()); + builder.append(usingTable); } else if (usingSelect != null) { - b.append("(").append(usingSelect.toString()).append(")"); + builder.append("(").append(usingSelect).append(")"); } if (usingAlias != null) { - b.append(usingAlias.toString()); + builder.append(usingAlias); } - b.append(" ON ("); - b.append(onCondition); - b.append(")"); + builder.append(" ON ("); + builder.append(onCondition); + builder.append(")"); if (insertFirst && mergeInsert != null) { - b.append(mergeInsert.toString()); + builder.append(mergeInsert); } if (mergeUpdate != null) { - b.append(mergeUpdate.toString()); + builder.append(mergeUpdate); } if (!insertFirst && mergeInsert != null) { - b.append(mergeInsert.toString()); + builder.append(mergeInsert); } - - return b.toString(); + return builder; } public Merge withUsingTable(Table usingTable) { diff --git a/src/main/java/net/sf/jsqlparser/statement/replace/Replace.java b/src/main/java/net/sf/jsqlparser/statement/replace/Replace.java index e62b7ddb7..1ca254584 100644 --- a/src/main/java/net/sf/jsqlparser/statement/replace/Replace.java +++ b/src/main/java/net/sf/jsqlparser/statement/replace/Replace.java @@ -18,11 +18,11 @@ import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; -public class Replace implements Statement { +public class Replace extends DDLStatement { private Table table; private List columns; @@ -89,44 +89,6 @@ public void setUseValues(boolean useValues) { this.useValues = useValues; } - @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - sql.append("REPLACE "); - if (isUseIntoTables()) { - sql.append("INTO "); - } - sql.append(table); - - if (expressions != null && columns != null) { - // the SET col1=exp1, col2=exp2 case - sql.append(" SET "); - // each element from expressions match up with a column from columns. - for (int i = 0, s = columns.size(); i < s; i++) { - sql.append(columns.get(i)).append("=").append(expressions.get(i)); - sql.append( i < s - 1 - ? ", " - : "" ); - } - } else if (columns != null) { - // the REPLACE mytab (col1, col2) [...] case - sql.append(" ").append(PlainSelect.getStringList(columns, true, true)); - } - - if (itemsList != null) { - // REPLACE mytab SELECT * FROM mytab2 - // or VALUES ('as', ?, 565) - - if (useValues) { - sql.append(" VALUES"); - } - - sql.append(" ").append(itemsList); - } - - return sql.toString(); - } - public Replace withUseValues(boolean useValues) { this.setUseValues(useValues); return this; @@ -184,4 +146,40 @@ public Replace addExpressions(Collection expressions) { public E getItemsList(Class type) { return type.cast(getItemsList()); } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("REPLACE "); + if (isUseIntoTables()) { + builder.append("INTO "); + } + builder.append(table); + + if (expressions != null && columns != null) { + // the SET col1=exp1, col2=exp2 case + builder.append(" SET "); + // each element from expressions match up with a column from columns. + for (int i = 0, s = columns.size(); i < s; i++) { + builder.append(columns.get(i)).append("=").append(expressions.get(i)); + builder.append( i < s - 1 + ? ", " + : "" ); + } + } else if (columns != null) { + // the REPLACE mytab (col1, col2) [...] case + builder.append(" ").append(PlainSelect.getStringList(columns, true, true)); + } + + if (itemsList != null) { + // REPLACE mytab SELECT * FROM mytab2 + // or VALUES ('as', ?, 565) + + if (useValues) { + builder.append(" VALUES"); + } + + builder.append(" ").append(itemsList); + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/select/Select.java b/src/main/java/net/sf/jsqlparser/statement/select/Select.java index 7886f44f7..c56ca3c7c 100644 --- a/src/main/java/net/sf/jsqlparser/statement/select/Select.java +++ b/src/main/java/net/sf/jsqlparser/statement/select/Select.java @@ -15,10 +15,10 @@ import java.util.Iterator; import java.util.List; import java.util.Optional; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.QueryStatement; import net.sf.jsqlparser.statement.StatementVisitor; -public class Select implements Statement { +public class Select extends QueryStatement { private SelectBody selectBody; private List withItemsList; @@ -42,22 +42,20 @@ public void setSelectBody(SelectBody body) { } @Override - @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder retval = new StringBuilder(); + public StringBuilder appendTo(StringBuilder builder) { if (withItemsList != null && !withItemsList.isEmpty()) { - retval.append("WITH "); + builder.append("WITH "); for (Iterator iter = withItemsList.iterator(); iter.hasNext();) { WithItem withItem = iter.next(); - retval.append(withItem); + builder.append(withItem); if (iter.hasNext()) { - retval.append(","); + builder.append(","); } - retval.append(" "); + builder.append(" "); } } - retval.append(selectBody); - return retval.toString(); + builder.append(selectBody); + return builder; } public List getWithItemsList() { diff --git a/src/main/java/net/sf/jsqlparser/statement/show/ShowTablesStatement.java b/src/main/java/net/sf/jsqlparser/statement/show/ShowTablesStatement.java index 9024c564e..c1497e610 100644 --- a/src/main/java/net/sf/jsqlparser/statement/show/ShowTablesStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/show/ShowTablesStatement.java @@ -10,7 +10,7 @@ package net.sf.jsqlparser.statement.show; import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import java.util.EnumSet; @@ -19,7 +19,7 @@ * A {@code SHOW TABLES} statement * @see MySQL show tables */ -public class ShowTablesStatement implements Statement { +public class ShowTablesStatement extends DDLStatement { private EnumSet modifiers; private SelectionMode selectionMode; @@ -68,8 +68,12 @@ public void setWhereCondition(Expression whereCondition) { } @Override - public String toString() { - StringBuilder builder = new StringBuilder(); + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } + + @Override + public StringBuilder appendTo(StringBuilder builder) { builder.append("SHOW"); if (modifiers.contains(Modifiers.EXTENDED)) { @@ -92,13 +96,7 @@ public String toString() { if (whereCondition != null) { builder.append(" ").append("WHERE").append(" ").append(whereCondition); } - - return builder.toString(); - } - - @Override - public void accept(StatementVisitor statementVisitor) { - statementVisitor.visit(this); + return builder; } public enum SelectionMode { diff --git a/src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java b/src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java index 67d064249..7d33f3783 100644 --- a/src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java +++ b/src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java @@ -10,10 +10,10 @@ package net.sf.jsqlparser.statement.truncate; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DDLStatement; import net.sf.jsqlparser.statement.StatementVisitor; -public class Truncate implements Statement { +public class Truncate extends DDLStatement { private Table table; boolean cascade; // to support TRUNCATE TABLE ... CASCADE @@ -39,14 +39,6 @@ public void setCascade(boolean c) { cascade = c; } - @Override - public String toString() { - if (cascade) { - return "TRUNCATE TABLE " + table + " CASCADE"; - } - return "TRUNCATE TABLE " + table; - } - public Truncate withTable(Table table) { this.setTable(table); return this; @@ -56,4 +48,13 @@ public Truncate withCascade(boolean cascade) { this.setCascade(cascade); return this; } + + @Override + public StringBuilder appendTo(StringBuilder builder) { + builder.append("TRUNCATE TABLE ").append(table); + if (cascade) { + builder.append(" CASCADE"); + } + return builder; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/update/Update.java b/src/main/java/net/sf/jsqlparser/statement/update/Update.java index aebdf125f..5cddf5a21 100644 --- a/src/main/java/net/sf/jsqlparser/statement/update/Update.java +++ b/src/main/java/net/sf/jsqlparser/statement/update/Update.java @@ -19,7 +19,7 @@ import net.sf.jsqlparser.expression.OracleHint; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DMLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.FromItem; import net.sf.jsqlparser.statement.select.Join; @@ -31,7 +31,7 @@ import net.sf.jsqlparser.statement.select.WithItem; @SuppressWarnings({"PMD.CyclomaticComplexity"}) -public class Update implements Statement { +public class Update extends DMLStatement { private List withItemsList; private Table table; @@ -202,90 +202,88 @@ public void setReturningExpressionList(List returningExpre @Override @SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"}) - public String toString() { - StringBuilder b = new StringBuilder(); - + public StringBuilder appendTo(StringBuilder builder) { if (withItemsList != null && !withItemsList.isEmpty()) { - b.append("WITH "); + builder.append("WITH "); for (Iterator iter = withItemsList.iterator(); iter.hasNext();) { WithItem withItem = iter.next(); - b.append(withItem); + builder.append(withItem); if (iter.hasNext()) { - b.append(","); + builder.append(","); } - b.append(" "); + builder.append(" "); } } - b.append("UPDATE "); - b.append(table); + builder.append("UPDATE "); + builder.append(table); if (startJoins != null) { for (Join join : startJoins) { if (join.isSimple()) { - b.append(", ").append(join); + builder.append(", ").append(join); } else { - b.append(" ").append(join); + builder.append(" ").append(join); } } } - b.append(" SET "); + builder.append(" SET "); if (!useSelect) { for (int i = 0; i < getColumns().size(); i++) { if (i != 0) { - b.append(", "); + builder.append(", "); } - b.append(columns.get(i)).append(" = "); - b.append(expressions.get(i)); + builder.append(columns.get(i)).append(" = "); + builder.append(expressions.get(i)); } } else { if (useColumnsBrackets) { - b.append("("); + builder.append("("); } for (int i = 0; i < getColumns().size(); i++) { if (i != 0) { - b.append(", "); + builder.append(", "); } - b.append(columns.get(i)); + builder.append(columns.get(i)); } if (useColumnsBrackets) { - b.append(")"); + builder.append(")"); } - b.append(" = "); - b.append("(").append(select).append(")"); + builder.append(" = "); + builder.append("(").append(select).append(")"); } if (fromItem != null) { - b.append(" FROM ").append(fromItem); + builder.append(" FROM ").append(fromItem); if (joins != null) { for (Join join : joins) { if (join.isSimple()) { - b.append(", ").append(join); + builder.append(", ").append(join); } else { - b.append(" ").append(join); + builder.append(" ").append(join); } } } } if (where != null) { - b.append(" WHERE "); - b.append(where); + builder.append(" WHERE "); + builder.append(where); } if (orderByElements != null) { - b.append(PlainSelect.orderByToString(orderByElements)); + builder.append(PlainSelect.orderByToString(orderByElements)); } if (limit != null) { - b.append(limit); + builder.append(limit); } if (isReturningAllColumns()) { - b.append(" RETURNING *"); + builder.append(" RETURNING *"); } else if (getReturningExpressionList() != null) { - b.append(" RETURNING ").append(PlainSelect. + builder.append(" RETURNING ").append(PlainSelect. getStringList(getReturningExpressionList(), true, false)); } - return b.toString(); + return builder; } public Update withTable(Table table) { diff --git a/src/main/java/net/sf/jsqlparser/statement/upsert/Upsert.java b/src/main/java/net/sf/jsqlparser/statement/upsert/Upsert.java index e68969691..0a5b82386 100644 --- a/src/main/java/net/sf/jsqlparser/statement/upsert/Upsert.java +++ b/src/main/java/net/sf/jsqlparser/statement/upsert/Upsert.java @@ -18,12 +18,12 @@ import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.DMLStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; -public class Upsert implements Statement { +public class Upsert extends DMLStatement { private Table table; private List columns; @@ -111,47 +111,45 @@ public void setDuplicateUpdateExpressionList(List duplicateUpdateExp public List getDuplicateUpdateExpressionList() { return duplicateUpdateExpressionList; } - + @Override @SuppressWarnings({"PMD.CyclomaticComplexity"}) - public String toString() { - StringBuilder sb = new StringBuilder(); - - sb.append("UPSERT INTO "); - sb.append(table).append(" "); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("UPSERT INTO "); + builder.append(table).append(" "); if (columns != null) { - sb.append(PlainSelect.getStringList(columns, true, true)).append(" "); + builder.append(PlainSelect.getStringList(columns, true, true)).append(" "); } if (useValues) { - sb.append("VALUES "); + builder.append("VALUES "); } - + if (itemsList != null) { - sb.append(itemsList); + builder.append(itemsList); } else { if (useSelectBrackets) { - sb.append("("); + builder.append("("); } if (select != null) { - sb.append(select); + builder.append(select); } if (useSelectBrackets) { - sb.append(")"); + builder.append(")"); } } if (useDuplicate) { - sb.append(" ON DUPLICATE KEY UPDATE "); + builder.append(" ON DUPLICATE KEY UPDATE "); for (int i = 0; i < getDuplicateUpdateColumns().size(); i++) { if (i != 0) { - sb.append(", "); + builder.append(", "); } - sb.append(duplicateUpdateColumns.get(i)).append(" = "); - sb.append(duplicateUpdateExpressionList.get(i)); + builder.append(duplicateUpdateColumns.get(i)).append(" = "); + builder.append(duplicateUpdateExpressionList.get(i)); } } - - return sb.toString(); + + return builder; } public Upsert withUseValues(boolean useValues) { diff --git a/src/main/java/net/sf/jsqlparser/statement/values/ValuesStatement.java b/src/main/java/net/sf/jsqlparser/statement/values/ValuesStatement.java index 51fbe058d..48c21b006 100644 --- a/src/main/java/net/sf/jsqlparser/statement/values/ValuesStatement.java +++ b/src/main/java/net/sf/jsqlparser/statement/values/ValuesStatement.java @@ -14,12 +14,12 @@ import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.expression.operators.relational.ItemsList; -import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.QueryStatement; import net.sf.jsqlparser.statement.StatementVisitor; import net.sf.jsqlparser.statement.select.SelectBody; import net.sf.jsqlparser.statement.select.SelectVisitor; -public class ValuesStatement implements Statement, SelectBody { +public class ValuesStatement extends QueryStatement implements SelectBody { private ItemsList expressions; @@ -45,11 +45,10 @@ public void setExpressions(ItemsList expressions) { } @Override - public String toString() { - StringBuilder sql = new StringBuilder(); - sql.append("VALUES "); - sql.append(expressions.toString()); - return sql.toString(); + public StringBuilder appendTo(StringBuilder builder) { + builder.append("VALUES "); + builder.append(expressions.toString()); + return builder; } @Override diff --git a/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java b/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java index f146f239b..3239a6780 100644 --- a/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java @@ -65,5 +65,8 @@ public void getOption_returnsValues() throws JSQLParserException { ExplainStatement.Option buffers = explain.getOption(ExplainStatement.OptionType.BUFFERS); assertThat(buffers).isNotNull().extracting(ExplainStatement.Option::getValue).isEqualTo("FALSE"); + + explain = (ExplainStatement) CCJSqlParserUtil.parse("EXPLAIN SELECT * FROM mytable"); + assertThat(explain.getOption(ExplainStatement.OptionType.ANALYZE)).isNull(); } } diff --git a/src/test/java/net/sf/jsqlparser/statement/IfElseStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/IfElseStatementTest.java index ff71a2f4e..67a80d3ee 100644 --- a/src/test/java/net/sf/jsqlparser/statement/IfElseStatementTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/IfElseStatementTest.java @@ -50,6 +50,11 @@ public void testIfElseStatements1() throws Exception { Statements result = CCJSqlParserUtil.parseStatements(sqlStr); Assert.assertEquals(sqlStr, result.toString()); + + for (Statement statement: result.getStatements()) { + Assert.assertTrue(statement.isBlock()); + Assert.assertEquals(Statement.StatementType.BLOCK, statement.getStatementType()); + } } @Test @@ -82,7 +87,7 @@ public void testObjectBuilder() throws JSQLParserException { } @Test - public void testValidation() throws JSQLParserException { + public void testValidation() { String sqlStr = "IF OBJECT_ID('tOrigin', 'U') IS NOT NULL DROP TABLE tOrigin1;"; List errors = Validation.validate(Arrays.asList(DatabaseType.SQLSERVER, FeaturesAllowed.DROP), sqlStr); diff --git a/src/test/java/net/sf/jsqlparser/statement/ResetStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/ResetStatementTest.java index e64c709bd..745348d41 100644 --- a/src/test/java/net/sf/jsqlparser/statement/ResetStatementTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/ResetStatementTest.java @@ -10,6 +10,7 @@ package net.sf.jsqlparser.statement; import net.sf.jsqlparser.JSQLParserException; +import org.junit.Assert; import org.junit.Test; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; @@ -25,4 +26,14 @@ public void tesResetAll() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("RESET ALL"); } + @Test + public void testObject() { + ResetStatement resetStatement=new ResetStatement(); + Assert.assertNotNull(resetStatement.getName()); + + resetStatement.add("something"); + resetStatement.setName("somethingElse"); + Assert.assertEquals("somethingElse", resetStatement.getName()); + } + } diff --git a/src/test/java/net/sf/jsqlparser/statement/RollbackStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/RollbackStatementTest.java new file mode 100644 index 000000000..5d72bd0d1 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/RollbackStatementTest.java @@ -0,0 +1,30 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import org.junit.Assert; +import org.junit.Test; + +public class RollbackStatementTest { + + @Test + public void testObject() { + RollbackStatement rollbackStatement = new RollbackStatement() + .withUsingWorkKeyword(true) + .withUsingSavepointKeyword(true) + .withSavepointName("mySavePoint") + .withForceDistributedTransactionIdentifier("$ForceDistributedTransactionIdentifier"); + + Assert.assertTrue(rollbackStatement.isUsingSavepointKeyword()); + Assert.assertEquals("mySavePoint", rollbackStatement.getSavepointName()); + Assert.assertEquals("$ForceDistributedTransactionIdentifier", rollbackStatement.getForceDistributedTransactionIdentifier()); + } + +} diff --git a/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java index c99220e37..bf55cd34f 100644 --- a/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/SetStatementTest.java @@ -11,8 +11,13 @@ import net.sf.jsqlparser.JSQLParserException; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + +import net.sf.jsqlparser.expression.StringValue; +import org.junit.Assert; import org.junit.Test; +import java.util.Collections; + /** * * @author toben @@ -57,4 +62,13 @@ public void tesLocalWithEq() throws JSQLParserException { public void testValueOnIssue927() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("SET standard_conforming_strings = on"); } + + @Test + public void testObject() { + SetStatement setStatement = new SetStatement(); + setStatement.add("standard_conforming_strings", Collections.singletonList(new StringValue("ON")), false); + setStatement.withUseEqual(0, true).remove(0); + + Assert.assertEquals(0, setStatement.getCount()); + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/StatementImplTest.java b/src/test/java/net/sf/jsqlparser/statement/StatementImplTest.java new file mode 100644 index 000000000..4edbae5c2 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/StatementImplTest.java @@ -0,0 +1,33 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.junit.Assert; +import org.junit.Test; + +public class StatementImplTest { + @Test + public void testObject() throws JSQLParserException { + Statement statement = CCJSqlParserUtil.parse("SELECT * FROM DUAL"); + Assert.assertEquals(Statement.StatementType.QUERY, statement.getStatementType()); + Assert.assertTrue(statement.isQuery()); + + statement = CCJSqlParserUtil.parse("UPDATE foo SET bar=1"); + Assert.assertEquals(Statement.StatementType.DML, statement.getStatementType()); + Assert.assertTrue(statement.isDML()); + + statement = CCJSqlParserUtil.parse("CREATE TABLE foo ( bar DECIMAL(1))"); + Assert.assertEquals(Statement.StatementType.DDL, statement.getStatementType()); + Assert.assertTrue(statement.isDDL()); + } + +} diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterSessionTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterSessionTest.java index 7b61b4a07..e02c28f59 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterSessionTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterSessionTest.java @@ -11,8 +11,12 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.test.TestUtils; +import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; +import java.util.Collections; + public class AlterSessionTest { @Test public void testAlterSessionAdvise() throws JSQLParserException { @@ -64,4 +68,26 @@ public void testAlterSessionSet() throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed("ALTER SESSION SET ddl_lock_timeout=7200", true); TestUtils.assertSqlCanBeParsedAndDeparsed("ALTER SESSION SET ddl_lock_timeout = 7200", true); } + + @Test + public void testAlterSessionResumable() throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed("ALTER SESSION ENABLE RESUMABLE", true); + TestUtils.assertSqlCanBeParsedAndDeparsed("ALTER SESSION DISABLE RESUMABLE", true); + } + + @Test + public void testObject() { + AlterSession alterSession = new AlterSession(AlterSessionOperation.FORCE_PARALLEL_QUERY, Collections.emptyList()); + Assert.assertEquals(AlterSessionOperation.FORCE_PARALLEL_QUERY, alterSession.getOperation()); + + alterSession.setOperation(AlterSessionOperation.DISABLE_PARALLEL_DML); + Assert.assertEquals(AlterSessionOperation.DISABLE_PARALLEL_DML, alterSession.getOperation()); + + Assert.assertEquals(0, alterSession.getParameters().size()); + + alterSession.setParameters(Arrays.asList("PARALLEL", "6")); + Assert.assertEquals(2, alterSession.getParameters().size()); + } + + } diff --git a/src/test/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonymTest.java b/src/test/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonymTest.java index 74ad5248f..cb5a2c981 100644 --- a/src/test/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonymTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/create/synonym/CreateSynonymTest.java @@ -11,7 +11,9 @@ import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.schema.Synonym; import org.assertj.core.api.Assertions; +import org.junit.Assert; import org.junit.Test; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; @@ -51,5 +53,9 @@ public void synonymAttributes() throws Exception { Assertions.assertThat(createSynonym.isPublicSynonym()).isTrue(); Assertions.assertThat(createSynonym.getSynonym().getFullyQualifiedName()).isEqualTo("TBL_TABLE_NAME"); Assertions.assertThat(createSynonym.getFor()).isEqualTo("SCHEMA.T_TBL_NAME"); + + Assert.assertEquals(2, createSynonym.getForList().size()); + Assert.assertEquals("NEW_TBL_TABLE_NAME", createSynonym.withSynonym(new Synonym().withName("NEW_TBL_TABLE_NAME")).getSynonym().getName()); + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java index c62f92ff6..64b8561bb 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java @@ -13,7 +13,7 @@ import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.Arrays; import java.util.Date; @@ -115,10 +115,12 @@ public class SpecialOracleTest { "condition14.sql", "condition19.sql", "condition20.sql", + "connect_by01.sql", "connect_by02.sql", "connect_by03.sql", "connect_by04.sql", "connect_by05.sql", + "connect_by06.sql", "connect_by07.sql", "datetime01.sql", "datetime02.sql", @@ -250,10 +252,12 @@ public void testAllSqlsParseDeparse() throws IOException { boolean foundUnexpectedFailures = false; + assert sqlTestFiles != null; + for (File file : sqlTestFiles) { if (file.isFile()) { count++; - String sql = FileUtils.readFileToString(file, Charset.forName("UTF-8")); + String sql = FileUtils.readFileToString(file, StandardCharsets.UTF_8); try { assertSqlCanBeParsedAndDeparsed(sql, true); success++; @@ -278,7 +282,7 @@ public void testAllSqlsParseDeparse() throws IOException { foundUnexpectedFailures = true; } catch (ComparisonFailure ex) { if (sql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED") || EXPECTED_SUCCESSES.contains(file.getName())) { - LOG.log(Level.SEVERE, "UNEXPECTED DE-PARSING FAILURE: {0}\n" + ex.toString(), file.getName()); + LOG.log(Level.SEVERE, "UNEXPECTED DE-PARSING FAILURE: {0}\n" + ex, file.getName()); foundUnexpectedFailures = true; } else { LOG.log(Level.FINE, "EXPECTED DE-PARSING FAILURE: {0}", file.getName()); @@ -304,9 +308,11 @@ public boolean accept(File dir, String name) { } }); + assert sqlTestFiles != null; + for (File file : sqlTestFiles) { if (file.isFile()) { - String sql = FileUtils.readFileToString(file, Charset.forName("UTF-8")); + String sql = FileUtils.readFileToString(file, StandardCharsets.UTF_8); assertSqlCanBeParsedAndDeparsed(sql, true); } } @@ -314,7 +320,7 @@ public boolean accept(File dir, String name) { public void recordSuccessOnSourceFile(File file) throws IOException { File sourceFile = new File(SQL_SOURCE_DIR, file.getName()); - String sourceSql = FileUtils.readFileToString(sourceFile, Charset.forName("UTF-8")); + String sourceSql = FileUtils.readFileToString(sourceFile, StandardCharsets.UTF_8); if (!sourceSql.contains("@SUCCESSFULLY_PARSED_AND_DEPARSED")) { LOG.log(Level.INFO, "NEW SUCCESS: {0}", file.getName()); if (sourceFile.exists() && sourceFile.canWrite()) { @@ -334,11 +340,11 @@ public void recordSuccessOnSourceFile(File file) throws IOException { public void recordFailureOnSourceFile(File file, String message) throws IOException { File sourceFile = new File(SQL_SOURCE_DIR, file.getName()); - String sourceSql = FileUtils.readFileToString(sourceFile, Charset.forName("UTF-8")); + String sourceSql = FileUtils.readFileToString(sourceFile, StandardCharsets.UTF_8); if (!sourceSql.contains("@FAILURE: " + message) && sourceFile.canWrite() ) { try (FileWriter writer = new FileWriter(sourceFile, true)) { - writer.append("\n--@FAILURE: " + message + " recorded first on ") + writer.append("\n--@FAILURE: ").append(message).append(" recorded first on ") .append(DateFormat.getDateTimeInstance().format(new Date())); } } @@ -349,8 +355,9 @@ public void testAllSqlsOnlyParse() throws IOException { File[] sqlTestFiles = new File(SQLS_DIR, "only-parse-test").listFiles(); List regressionFiles = new LinkedList<>(); + assert sqlTestFiles != null; for (File file : sqlTestFiles) { - String sql = FileUtils.readFileToString(file, Charset.forName("UTF-8")); + String sql = FileUtils.readFileToString(file, StandardCharsets.UTF_8); try { CCJSqlParserUtil.parse(sql); LOG.log(Level.FINE, "EXPECTED SUCCESS: {0}", file.getName()); diff --git a/src/test/java/net/sf/jsqlparser/statement/show/ShowTablesStatementTest.java b/src/test/java/net/sf/jsqlparser/statement/show/ShowTablesStatementTest.java index 535759351..2e303f002 100644 --- a/src/test/java/net/sf/jsqlparser/statement/show/ShowTablesStatementTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/show/ShowTablesStatementTest.java @@ -9,8 +9,12 @@ */ package net.sf.jsqlparser.statement.show; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.junit.Assert; import org.junit.Test; +import static net.sf.jsqlparser.test.TestUtils.assertExpressionCanBeDeparsedAs; import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; public class ShowTablesStatementTest { @@ -44,4 +48,18 @@ public void showTablesLikeExpression() throws Exception { public void showTablesWhereExpression() throws Exception { assertSqlCanBeParsedAndDeparsed("SHOW TABLES WHERE table_name = 'FOO'"); } + + @Test + public void testObject() throws JSQLParserException { + ShowTablesStatement showTablesStatement = (ShowTablesStatement) CCJSqlParserUtil.parse("SHOW TABLES WHERE table_name = 'FOO'"); + Assert.assertEquals(0, showTablesStatement.getModifiers().size()); + assertExpressionCanBeDeparsedAs(showTablesStatement.getWhereCondition(), "table_name = 'FOO'"); + + showTablesStatement = (ShowTablesStatement) CCJSqlParserUtil.parse("SHOW FULL TABLES IN db_name"); + Assert.assertEquals(1, showTablesStatement.getModifiers().size()); + Assert.assertEquals(ShowTablesStatement.SelectionMode.IN, showTablesStatement.getSelectionMode()); + + showTablesStatement = (ShowTablesStatement) CCJSqlParserUtil.parse("SHOW TABLES LIKE '%FOO%'"); + assertExpressionCanBeDeparsedAs(showTablesStatement.getLikeExpression(), "'%FOO%'"); + } } diff --git a/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java b/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java index aa32bc543..46d71a1bc 100644 --- a/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/values/ValuesTest.java @@ -15,6 +15,7 @@ import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitorAdapter; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SetOperationList; @@ -22,6 +23,8 @@ import org.junit.Test; +import java.util.Arrays; + public class ValuesTest { @Test @@ -48,4 +51,12 @@ public void testDuplicateKey() throws JSQLParserException { public void testComplexWithQueryIssue561() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed("WITH split (word, str, hascomma) AS (VALUES ('', 'Auto,A,1234444', 1) UNION ALL SELECT substr(str, 0, CASE WHEN instr(str, ',') THEN instr(str, ',') ELSE length(str) + 1 END), ltrim(substr(str, instr(str, ',')), ','), instr(str, ',') FROM split WHERE hascomma) SELECT trim(word) FROM split WHERE word != ''"); } + + @Test + public void testObject() { + ValuesStatement valuesStatement=new ValuesStatement().addExpressions(new StringValue("1"), new StringValue("2")); + valuesStatement.addExpressions(Arrays.asList(new StringValue("3"), new StringValue("4"))); + + valuesStatement.accept(new StatementVisitorAdapter()); + } } diff --git a/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java b/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java index 6cf67c89d..306769122 100644 --- a/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java +++ b/src/test/java/net/sf/jsqlparser/util/deparser/StatementDeParserTest.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.List; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,7 +31,6 @@ import net.sf.jsqlparser.statement.IfElseStatement; import net.sf.jsqlparser.statement.SetStatement; import net.sf.jsqlparser.statement.delete.Delete; -import net.sf.jsqlparser.statement.drop.Drop; import net.sf.jsqlparser.statement.execute.Execute; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.replace.Replace; @@ -367,12 +367,9 @@ public void shouldUseProvidedDeparsersWhenDeParsingUpsertWithExpressionList() th @Test @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") - public void shouldUseProvidedDeparsersWhenDeParsingIfThenStatement() { - Expression condition = mock(Expression.class); - Drop ifStatement = mock(Drop.class); - - IfElseStatement ifElseStatement = new IfElseStatement(condition, ifStatement); - + public void shouldUseProvidedDeparsersWhenDeParsingIfThenStatement() throws JSQLParserException { + String sqlStr = "IF OBJECT_ID('tOrigin', 'U') IS NOT NULL DROP TABLE tOrigin1"; + IfElseStatement ifElseStatement = (IfElseStatement) CCJSqlParserUtil.parse(sqlStr); statementDeParser.deParse(ifElseStatement); } diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql index cc882de68..412823de1 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by01.sql @@ -28,4 +28,5 @@ connect by nocycle obj=prior link start with obj='a' ---@FAILURE: Encountered unexpected token: "root" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "root" recorded first on Aug 3, 2021, 7:20:08 AM +--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 10, 2021, 6:39:53 AM \ No newline at end of file diff --git a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by06.sql b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by06.sql index 80ea47f8e..e59f7c8de 100644 --- a/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by06.sql +++ b/src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/connect_by06.sql @@ -15,4 +15,5 @@ select last_name "Employee", connect_by_root last_name "Manager", order by "Employee", "Manager", "Pathlen", "Path" ---@FAILURE: Encountered unexpected token: "\"Manager\"" recorded first on Aug 3, 2021, 7:20:08 AM \ No newline at end of file +--@FAILURE: Encountered unexpected token: "\"Manager\"" recorded first on Aug 3, 2021, 7:20:08 AM +--@SUCCESSFULLY_PARSED_AND_DEPARSED first on Aug 10, 2021, 6:39:53 AM \ No newline at end of file