Skip to content

Commit

Permalink
returning implemented, column as identifier allowed
Browse files Browse the repository at this point in the history
  • Loading branch information
wumpz committed Jun 20, 2014
1 parent dfda139 commit 733ff6d
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 9 deletions.
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/insert/Insert.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;

/**
* The insert statement. Every column name in
Expand All @@ -41,6 +42,10 @@ public class Insert implements Statement {
private List<Column> columns;
private ItemsList itemsList;
private boolean useValues = true;

private boolean returningAllColumns = false;

private List<SelectExpressionItem> returningExpressionList = null;

@Override
public void accept(StatementVisitor statementVisitor) {
Expand Down Expand Up @@ -89,6 +94,22 @@ public void setUseValues(boolean useValues) {
this.useValues = useValues;
}

public boolean isReturningAllColumns() {
return returningAllColumns;
}

public void setReturningAllColumns(boolean returningAllColumns) {
this.returningAllColumns = returningAllColumns;
}

public List<SelectExpressionItem> getReturningExpressionList() {
return returningExpressionList;
}

public void setReturningExpressionList(List<SelectExpressionItem> returningExpressionList) {
this.returningExpressionList = returningExpressionList;
}

@Override
public String toString() {
String sql = "";
Expand All @@ -102,6 +123,12 @@ public String toString() {
} else {
sql += "" + itemsList + "";
}

if (isReturningAllColumns())
sql += " RETURNING *";
else if (getReturningExpressionList()!=null) {
sql+= " RETURNING " + PlainSelect.getStringList(getReturningExpressionList(), true, false);
}

return sql;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SubSelect;

Expand Down Expand Up @@ -87,7 +88,17 @@ public void deParse(Insert insert) {
}

insert.getItemsList().accept(this);


if (insert.isReturningAllColumns())
buffer.append(" RETURNING *");
else if (insert.getReturningExpressionList()!=null) {
buffer.append(" RETURNING ");
for (Iterator<SelectExpressionItem> iter = insert.getReturningExpressionList().iterator();iter.hasNext();) {
buffer.append(iter.next().toString());
if (iter.hasNext())
buffer.append(", ");
}
}
}

@Override
Expand Down
27 changes: 25 additions & 2 deletions src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_FOLLOWING: "FOLLOWING">
| <K_CURRENT: "CURRENT">
| <K_ROW: "ROW">
| <K_RETURNING: "RETURNING">
}

TOKEN : /* Numeric Constants */
Expand Down Expand Up @@ -372,6 +373,17 @@ Replace Replace():
}
}

List<SelectExpressionItem> ListExpressionItem():
{
List<SelectExpressionItem> retval = new ArrayList<SelectExpressionItem>();
SelectExpressionItem item;
}
{
item = SelectExpressionItem() {retval.add(item);}
("," item = SelectExpressionItem() {retval.add(item);} )*
{ return retval; }
}

Insert Insert():
{
Insert insert = new Insert();
Expand All @@ -382,6 +394,7 @@ Insert Insert():
ItemsList itemsList = null;
Expression exp = null;
MultiExpressionList multiExpr = null;
List<SelectExpressionItem> returning = null;
}
{
<K_INSERT> [<K_INTO>] table=Table()
Expand All @@ -408,14 +421,21 @@ Insert Insert():
{ insert.setUseValues(false); }
itemsList= SubSelect()
)
[ ")" ]
[ ")" ]
)

[ <K_RETURNING> (
"*" { insert.setReturningAllColumns(true); }
| returning=ListExpressionItem()
)
]

{
insert.setItemsList(itemsList);
insert.setTable(table);
if (columns.size() > 0)
insert.setColumns(columns);
insert.setReturningExpressionList(returning);
return insert;
}
}
Expand Down Expand Up @@ -459,7 +479,10 @@ String RelObjectName():
{ Token tk = null; }
{
(tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER>
| tk=<K_CAST> | tk=<K_DO> | tk=<K_EXTRACT> | tk=<K_FIRST> | tk=<K_FOLLOWING> | tk=<K_LAST> | tk=<K_MATERIALIZED> | tk=<K_NULLS> | tk=<K_PARTITION> | tk=<K_RANGE> | tk=<K_ROW> | tk=<K_ROWS> | tk=<K_SIBLINGS> | tk=<K_VALUE> | tk=<K_XML>)
| tk=<K_CAST> | tk=<K_DO> | tk=<K_EXTRACT> | tk=<K_FIRST> | tk=<K_FOLLOWING>
| tk=<K_LAST> | tk=<K_MATERIALIZED> | tk=<K_NULLS> | tk=<K_PARTITION> | tk=<K_RANGE>
| tk=<K_ROW> | tk=<K_ROWS> | tk=<K_SIBLINGS> | tk=<K_VALUE> | tk=<K_XML>
| tk=<K_COLUMN> )

{ return tk.image; }
}
Expand Down
31 changes: 25 additions & 6 deletions src/test/java/net/sf/jsqlparser/test/insert/InsertTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.io.StringReader;
import static junit.framework.Assert.assertEquals;

import junit.framework.TestCase;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.DoubleValue;
import net.sf.jsqlparser.expression.JdbcParameter;
Expand All @@ -17,15 +16,15 @@
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SubSelect;
import static net.sf.jsqlparser.test.TestUtils.*;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;

public class InsertTest extends TestCase {
public class InsertTest {

CCJSqlParserManager parserManager = new CCJSqlParserManager();

public InsertTest(String arg0) {
super(arg0);
}

@Test
public void testRegularInsert() throws JSQLParserException {
String statement = "INSERT INTO mytable (col1, col2, col3) VALUES (?, 'sadfsd', 234)";
Insert insert = (Insert) parserManager.parse(new StringReader(statement));
Expand All @@ -52,6 +51,7 @@ public void testRegularInsert() throws JSQLParserException {

}

@Test
public void testInsertWithKeywordValue() throws JSQLParserException {
String statement = "INSERT INTO mytable (col1) VALUE ('val1')";
Insert insert = (Insert) parserManager.parse(new StringReader(statement));
Expand All @@ -63,6 +63,7 @@ public void testInsertWithKeywordValue() throws JSQLParserException {
assertEquals("INSERT INTO mytable (col1) VALUES ('val1')", insert.toString());
}

@Test
public void testInsertFromSelect() throws JSQLParserException {
String statement = "INSERT INTO mytable (col1, col2, col3) SELECT * FROM mytable2";
Insert insert = (Insert) parserManager.parse(new StringReader(statement));
Expand All @@ -80,10 +81,12 @@ public void testInsertFromSelect() throws JSQLParserException {
assertEquals(statementToString, "" + insert);
}

@Test
public void testInsertMultiRowValue() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("INSERT INTO mytable (col1, col2) VALUES (a, b), (d, e)");
}

@Test
public void testInsertMultiRowValueDifferent() throws JSQLParserException {
try {
assertSqlCanBeParsedAndDeparsed("INSERT INTO mytable (col1, col2) VALUES (a, b), (d, e, c)");
Expand All @@ -94,7 +97,23 @@ public void testInsertMultiRowValueDifferent() throws JSQLParserException {
fail("should not work");
}

@Test
public void testSimpleInsert() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("INSERT INTO example (num, name, address, tel) VALUES (1, 'name', 'test ', '1234-1234')");
}

@Test
public void testInsertWithReturning() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("INSERT INTO mytable (mycolumn) VALUES ('1') RETURNING id");
}

@Test
public void testInsertWithReturning2() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("INSERT INTO mytable (mycolumn) VALUES ('1') RETURNING *");
}

@Test
public void testInsertWithReturning3() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("INSERT INTO mytable (mycolumn) VALUES ('1') RETURNING id AS a1, id2 AS a2");
}
}

0 comments on commit 733ff6d

Please sign in to comment.