Skip to content

Commit 101ef1d

Browse files
author
Jeffrey Gerard
committed
Add CREATE VIEW support
1 parent 272bf23 commit 101ef1d

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package net.sf.jsqlparser.statement;
2424

2525
import net.sf.jsqlparser.statement.create.table.CreateTable;
26+
import net.sf.jsqlparser.statement.create.view.CreateView;
2627
import net.sf.jsqlparser.statement.delete.Delete;
2728
import net.sf.jsqlparser.statement.drop.Drop;
2829
import net.sf.jsqlparser.statement.insert.Insert;
@@ -48,4 +49,5 @@ public interface StatementVisitor {
4849

4950
public void visit(CreateTable createTable);
5051

52+
public void visit(CreateView createView);
5153
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package net.sf.jsqlparser.statement.create.view;
2+
3+
4+
import net.sf.jsqlparser.schema.Table;
5+
import net.sf.jsqlparser.statement.Statement;
6+
import net.sf.jsqlparser.statement.StatementVisitor;
7+
import net.sf.jsqlparser.statement.select.SelectBody;
8+
9+
/**
10+
* A "CREATE VIEW" statement
11+
*/
12+
public class CreateView implements Statement {
13+
14+
private Table view;
15+
private SelectBody selectBody;
16+
private boolean orReplace = false;
17+
18+
@Override
19+
public void accept(StatementVisitor statementVisitor) {
20+
statementVisitor.visit(this);
21+
}
22+
23+
/**
24+
* In the syntax tree, a view looks and acts just like a Table.
25+
* @return The name of the view to be created.
26+
*/
27+
public Table getView() {
28+
return view;
29+
}
30+
31+
public void setView(Table view) {
32+
this.view = view;
33+
}
34+
35+
/**
36+
* @return was "OR REPLACE" specified?
37+
*/
38+
public boolean isOrReplace() {
39+
return orReplace;
40+
}
41+
42+
/**
43+
* @param orReplace was "OR REPLACE" specified?
44+
*/
45+
public void setOrReplace(boolean orReplace) {
46+
this.orReplace = orReplace;
47+
}
48+
49+
/**
50+
* @return the SelectBody
51+
*/
52+
public SelectBody getSelectBody() {
53+
return selectBody;
54+
}
55+
56+
public void setSelectBody(SelectBody selectBody) {
57+
this.selectBody = selectBody;
58+
}
59+
60+
public String toString() {
61+
String sql = "CREATE VIEW " + view + " AS " + selectBody;
62+
return sql;
63+
}
64+
}

src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import net.sf.jsqlparser.statement.StatementVisitor;
66
import net.sf.jsqlparser.statement.create.table.CreateTable;
7+
import net.sf.jsqlparser.statement.create.view.CreateView;
78
import net.sf.jsqlparser.statement.delete.Delete;
89
import net.sf.jsqlparser.statement.drop.Drop;
910
import net.sf.jsqlparser.statement.insert.Insert;
@@ -25,6 +26,11 @@ public void visit(CreateTable createTable) {
2526
createTableDeParser.deParse(createTable);
2627
}
2728

29+
@Override
30+
public void visit(CreateView createView) {
31+
throw new UnsupportedOperationException("Not supported yet.");
32+
}
33+
2834
public void visit(Delete delete) {
2935
SelectDeParser selectDeParser = new SelectDeParser();
3036
selectDeParser.setBuffer(buffer);

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ import net.sf.jsqlparser.statement.Statement;
104104
import net.sf.jsqlparser.statement.create.table.ColDataType;
105105
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
106106
import net.sf.jsqlparser.statement.create.table.CreateTable;
107+
import net.sf.jsqlparser.statement.create.view.CreateView;
107108
import net.sf.jsqlparser.statement.create.table.Index;
108109
import net.sf.jsqlparser.statement.delete.Delete;
109110
import net.sf.jsqlparser.statement.drop.Drop;
@@ -184,6 +185,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
184185
| <K_FULL:"FULL">
185186
| <K_WITH:"WITH">
186187
| <K_TABLE:"TABLE">
188+
| <K_VIEW:"VIEW">
187189
| <K_WHERE:"WHERE">
188190
| <K_USING:"USING">
189191
| <K_UNION:"UNION">
@@ -260,8 +262,12 @@ Statement Statement() :
260262
|
261263
stm = Replace()
262264
|
265+
LOOKAHEAD(2)
263266
stm = CreateTable()
264267
|
268+
LOOKAHEAD(2)
269+
stm = CreateView()
270+
|
265271
stm = Drop()
266272
|
267273
stm = Truncate()
@@ -1639,6 +1645,23 @@ ColDataType ColDataType():
16391645
}
16401646
}
16411647

1648+
CreateView CreateView():
1649+
{
1650+
CreateView createView = new CreateView();
1651+
Table view = null;
1652+
SelectBody select = null;
1653+
}
1654+
{
1655+
<K_CREATE>
1656+
[ <K_OR> <K_REPLACE> { createView.setOrReplace(true);} ]
1657+
// TODO:
1658+
// [ { TEMPORARY | TEMP } ]
1659+
<K_VIEW> view=Table() { createView.setView(view); }
1660+
<K_AS>
1661+
select=SelectBody() { createView.setSelectBody(select); }
1662+
{ return createView; }
1663+
}
1664+
16421665
String CreateParameter():
16431666
{
16441667
String retval = null;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package net.sf.jsqlparser.test.create;
2+
3+
import java.io.StringReader;
4+
5+
import junit.framework.TestCase;
6+
import net.sf.jsqlparser.JSQLParserException;
7+
import net.sf.jsqlparser.parser.CCJSqlParserManager;
8+
import net.sf.jsqlparser.schema.Table;
9+
import net.sf.jsqlparser.statement.create.view.CreateView;
10+
import net.sf.jsqlparser.statement.select.PlainSelect;
11+
12+
public class CreateViewTest extends TestCase {
13+
CCJSqlParserManager parserManager = new CCJSqlParserManager();
14+
15+
public CreateViewTest(String arg0) {
16+
super(arg0);
17+
}
18+
19+
public void testCreateView() throws JSQLParserException {
20+
String statement = "CREATE VIEW myview AS SELECT * FROM mytab";
21+
CreateView createView = (CreateView) parserManager.parse(new StringReader(statement));
22+
assertFalse(createView.isOrReplace());
23+
assertEquals("myview", createView.getView().getName());
24+
assertEquals("mytab", ((Table)((PlainSelect)createView.getSelectBody()).getFromItem()).getName());
25+
assertEquals(statement, createView.toString());
26+
}
27+
28+
public static void main(String[] args) {
29+
junit.swingui.TestRunner.run(CreateViewTest.class);
30+
}
31+
32+
}

0 commit comments

Comments
 (0)