From fb45dd7c77ccff08aa86fbd10b3077c6dd555ecc Mon Sep 17 00:00:00 2001 From: wumpz Date: Wed, 23 Jan 2019 00:06:34 +0100 Subject: [PATCH] implemented explain select --- .../statement/ExplainStatement.java | 55 +++++++++++++++++++ .../statement/StatementVisitor.java | 2 + .../statement/StatementVisitorAdapter.java | 4 ++ .../sf/jsqlparser/util/TablesNamesFinder.java | 6 ++ .../util/deparser/StatementDeParser.java | 7 +++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 11 ++++ .../sf/jsqlparser/statement/ExplainTest.java | 17 ++++++ 7 files changed, 102 insertions(+) create mode 100644 src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/ExplainTest.java diff --git a/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java b/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java new file mode 100644 index 000000000..8920461ce --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/ExplainStatement.java @@ -0,0 +1,55 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2019 JSQLParser + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.statement.select.Select; + +/** + * + * @author tw + */ +public class ExplainStatement implements Statement { + + private Select select; + + public ExplainStatement(Select select) { + this.select = select; + } + + public Select getStatement() { + return select; + } + + public void setStatement(Select select) { + this.select = select; + } + + @Override + public String toString() { + return "EXPLAIN " + select.toString(); + } + + @Override + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index 67cfc5da2..af1280a61 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -88,4 +88,6 @@ public interface StatementVisitor { void visit(ValuesStatement values); void visit(DescribeStatement describe); + + public void visit(ExplainStatement aThis); } diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index d1e933edc..003310cda 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -155,4 +155,8 @@ public void visit(ValuesStatement values) { @Override public void visit(DescribeStatement describe) { } + + @Override + public void visit(ExplainStatement aThis) { + } } diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index 53fa5af60..f62880b6f 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -96,6 +96,7 @@ import net.sf.jsqlparser.statement.Block; import net.sf.jsqlparser.statement.Commit; import net.sf.jsqlparser.statement.DescribeStatement; +import net.sf.jsqlparser.statement.ExplainStatement; import net.sf.jsqlparser.statement.SetStatement; import net.sf.jsqlparser.statement.ShowStatement; import net.sf.jsqlparser.statement.Statement; @@ -853,4 +854,9 @@ public void visit(ValuesStatement values) { public void visit(DescribeStatement describe) { describe.getTable().accept(this); } + + @Override + public void visit(ExplainStatement explain) { + explain.getStatement().accept(this); + } } 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 d0e459230..fba4919db 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -25,6 +25,7 @@ import net.sf.jsqlparser.statement.Block; import net.sf.jsqlparser.statement.Commit; import net.sf.jsqlparser.statement.DescribeStatement; +import net.sf.jsqlparser.statement.ExplainStatement; import net.sf.jsqlparser.statement.SetStatement; import net.sf.jsqlparser.statement.ShowStatement; import net.sf.jsqlparser.statement.Statement; @@ -266,4 +267,10 @@ public void visit(DescribeStatement describe) { buffer.append("DESCRIBE "); buffer.append(describe.getTable()); } + + @Override + public void visit(ExplainStatement explain) { + buffer.append("EXPLAIN "); + explain.getStatement().accept(this); + } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index e7f8671c8..1e3b041de 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -190,6 +190,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -436,6 +437,8 @@ Statement SingleStatement() : stm = Comment() | stm = Describe() + | + stm = Explain() ) { return stm; } } catch (ParseException e) { @@ -534,6 +537,14 @@ DescribeStatement Describe(): { } } +ExplainStatement Explain(): { + Select select; +} { + select = Select() + { + return new ExplainStatement(select); + } +} UseStatement Use(): { String name; diff --git a/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java b/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java new file mode 100644 index 000000000..f7bd9f18d --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/ExplainTest.java @@ -0,0 +1,17 @@ +package net.sf.jsqlparser.statement; + +import net.sf.jsqlparser.JSQLParserException; +import static net.sf.jsqlparser.test.TestUtils.*; +import org.junit.Test; + +/** + * + * @author tw + */ +public class ExplainTest { + + @Test + public void testDescribe() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("EXPLAIN SELECT * FROM mytable"); + } +}