From e5c8a89ded6d5ca5d545f604f6cf570b7caaef42 Mon Sep 17 00:00:00 2001 From: Rob Audenaerde Date: Thu, 14 Jul 2022 21:22:47 +0200 Subject: [PATCH] Closes #1579. Added ANALYZE support. (#1587) --- .../sf/jsqlparser/parser/feature/Feature.java | 9 ++++ .../statement/StatementVisitor.java | 5 ++- .../statement/StatementVisitorAdapter.java | 6 +++ .../jsqlparser/statement/analyze/Analyze.java | 42 +++++++++++++++++++ .../sf/jsqlparser/util/TablesNamesFinder.java | 4 ++ .../util/deparser/StatementDeParser.java | 6 +++ .../validator/AnalyzeValidator.java | 25 +++++++++++ .../validator/StatementValidator.java | 6 +++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 18 ++++++++ .../statement/analyze/AnalyzeTest.java | 36 ++++++++++++++++ 10 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/sf/jsqlparser/statement/analyze/Analyze.java create mode 100644 src/main/java/net/sf/jsqlparser/util/validation/validator/AnalyzeValidator.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/analyze/AnalyzeTest.java diff --git a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java index 671df0c45..4b9cce979 100644 --- a/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java +++ b/src/main/java/net/sf/jsqlparser/parser/feature/Feature.java @@ -28,6 +28,7 @@ import net.sf.jsqlparser.statement.UseStatement; import net.sf.jsqlparser.statement.alter.Alter; import net.sf.jsqlparser.statement.alter.sequence.AlterSequence; +import net.sf.jsqlparser.statement.analyze.Analyze; import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.function.CreateFunction; import net.sf.jsqlparser.statement.create.index.CreateIndex; @@ -394,6 +395,14 @@ public enum Feature { */ alterIndex, + + /** + * SQL "ANALYZE" statement is allowed + * + * @see Analyze + */ + analyze, + /** * SQL "TRUNCATE" statement is allowed * diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index 6e4c27115..1326540db 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -14,6 +14,7 @@ import net.sf.jsqlparser.statement.alter.AlterSystemStatement; import net.sf.jsqlparser.statement.alter.RenameTableStatement; import net.sf.jsqlparser.statement.alter.sequence.AlterSequence; +import net.sf.jsqlparser.statement.analyze.Analyze; import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; @@ -37,7 +38,9 @@ import net.sf.jsqlparser.statement.values.ValuesStatement; public interface StatementVisitor { - + + void visit(Analyze analyze); + void visit(SavepointStatement savepointStatement); void visit(RollbackStatement rollbackStatement); diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index aa4f6c466..1ce1330fe 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -14,6 +14,7 @@ import net.sf.jsqlparser.statement.alter.AlterSystemStatement; import net.sf.jsqlparser.statement.alter.RenameTableStatement; import net.sf.jsqlparser.statement.alter.sequence.AlterSequence; +import net.sf.jsqlparser.statement.analyze.Analyze; import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; @@ -199,6 +200,11 @@ public void visit(CreateFunctionalStatement createFunctionalStatement) { public void visit(CreateSynonym createSynonym) { } + @Override + public void visit(Analyze analyze) { + + } + @Override public void visit(SavepointStatement savepointStatement) { //@todo: do something usefull here diff --git a/src/main/java/net/sf/jsqlparser/statement/analyze/Analyze.java b/src/main/java/net/sf/jsqlparser/statement/analyze/Analyze.java new file mode 100644 index 000000000..35373ae09 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/analyze/Analyze.java @@ -0,0 +1,42 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.analyze; + +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; + +public class Analyze implements Statement { + + private Table table; + + @Override + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } + + public Table getTable() { + return table; + } + + public void setTable(Table table) { + this.table = table; + } + + @Override + public String toString() { + return "ANALYZE " + table.toString(); + } + + public Analyze withTable(Table table) { + this.setTable(table); + return this; + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index 07bc47340..945b163a1 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -27,6 +27,7 @@ import net.sf.jsqlparser.statement.alter.AlterSystemStatement; import net.sf.jsqlparser.statement.alter.RenameTableStatement; import net.sf.jsqlparser.statement.alter.sequence.AlterSequence; +import net.sf.jsqlparser.statement.analyze.Analyze; import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; @@ -686,6 +687,9 @@ public void visit(Replace replace) { } } + public void visit(Analyze analyze) { + visit(analyze.getTable()); + } @Override public void visit(Drop drop) { visit(drop.getName()); diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java index 3cadd6ccb..f10651f22 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -36,6 +36,7 @@ import net.sf.jsqlparser.statement.alter.AlterSystemStatement; import net.sf.jsqlparser.statement.alter.RenameTableStatement; import net.sf.jsqlparser.statement.alter.sequence.AlterSequence; +import net.sf.jsqlparser.statement.analyze.Analyze; import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; @@ -191,6 +192,11 @@ public void visit(Update update) { } + public void visit(Analyze analyzer) { + buffer.append("ANALYZE "); + buffer.append(analyzer.getTable()); + } + @Override public void visit(Alter alter) { AlterDeParser alterDeParser = new AlterDeParser(buffer); diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/AnalyzeValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/AnalyzeValidator.java new file mode 100644 index 000000000..82864b7ff --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/AnalyzeValidator.java @@ -0,0 +1,25 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.util.validation.validator; + +import net.sf.jsqlparser.parser.feature.Feature; +import net.sf.jsqlparser.statement.analyze.Analyze; +import net.sf.jsqlparser.util.validation.ValidationCapability; +import net.sf.jsqlparser.util.validation.metadata.NamedObject; + +public class AnalyzeValidator extends AbstractValidator{ + @Override + public void validate(Analyze analyze) { + for (ValidationCapability c : getCapabilities()) { + validateFeature(c, Feature.analyze); + validateName(c, NamedObject.table, analyze.getTable().getFullyQualifiedName(), true); + } + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java index fce739e0d..f6cfc121d 100644 --- a/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java +++ b/src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java @@ -34,6 +34,7 @@ import net.sf.jsqlparser.statement.alter.AlterSystemStatement; import net.sf.jsqlparser.statement.alter.RenameTableStatement; import net.sf.jsqlparser.statement.alter.sequence.AlterSequence; +import net.sf.jsqlparser.statement.analyze.Analyze; import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.function.CreateFunction; import net.sf.jsqlparser.statement.create.index.CreateIndex; @@ -268,6 +269,11 @@ public void visit(CreateSynonym createSynonym) { getValidator(CreateSynonymValidator.class).validate(createSynonym); } + @Override + public void visit(Analyze analyze) { + getValidator(AnalyzeValidator.class).validate(analyze); + } + @Override public void visit(SavepointStatement savepointStatement) { //TODO: not yet implemented diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 6002221ba..bba0b815c 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -37,6 +37,7 @@ import net.sf.jsqlparser.expression.operators.conditional.*; import net.sf.jsqlparser.expression.operators.relational.*; import net.sf.jsqlparser.schema.*; import net.sf.jsqlparser.statement.*; +import net.sf.jsqlparser.statement.analyze.*; import net.sf.jsqlparser.statement.alter.*; import net.sf.jsqlparser.statement.alter.sequence.*; import net.sf.jsqlparser.statement.comment.*; @@ -620,6 +621,8 @@ Statement SingleStatement() : | stm = Drop() | + stm = Analyze() + | stm = Truncate() | stm = Execute() @@ -5195,6 +5198,21 @@ ColDataType ColDataType(): } } +Analyze Analyze(): +{ + Analyze analyze = new Analyze(); + Table table = null; +} +{ + + table=Table() + + { + analyze.setTable(table); + return analyze; + } +} + CreateView CreateView(): { CreateView createView = new CreateView(); diff --git a/src/test/java/net/sf/jsqlparser/statement/analyze/AnalyzeTest.java b/src/test/java/net/sf/jsqlparser/statement/analyze/AnalyzeTest.java new file mode 100644 index 000000000..158c33ec0 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/analyze/AnalyzeTest.java @@ -0,0 +1,36 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2022 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.analyze; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.parser.CCJSqlParserManager; +import net.sf.jsqlparser.schema.Table; +import org.junit.jupiter.api.Test; + +import java.io.StringReader; + +import static net.sf.jsqlparser.test.TestUtils.assertDeparse; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AnalyzeTest { + + private final CCJSqlParserManager parserManager = new CCJSqlParserManager(); + + @Test + public void testAnalyze() throws JSQLParserException { + String statement = "ANALYZE mytab"; + Analyze parsed = (Analyze) parserManager.parse(new StringReader(statement)); + assertEquals("mytab", parsed.getTable().getFullyQualifiedName()); + assertEquals(statement, "" + parsed); + + assertDeparse(new Analyze().withTable(new Table("mytab")), statement); + } + +}