Skip to content

Commit

Permalink
fixes #479
Browse files Browse the repository at this point in the history
  • Loading branch information
wumpz committed Feb 19, 2019
1 parent fa16241 commit b029bb5
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 10 deletions.
12 changes: 12 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody {
private Wait wait;
private boolean mySqlSqlCalcFoundRows = false;
private boolean sqlNoCacheFlag = false;
private String forXmlPath;

public boolean isUseBrackets() {
return useBrackets;
Expand Down Expand Up @@ -271,6 +272,14 @@ public Wait getWait() {
return wait;
}

public String getForXmlPath() {
return forXmlPath;
}

public void setForXmlPath(String forXmlPath) {
this.forXmlPath = forXmlPath;
}

@Override
public String toString() {
StringBuilder sql = new StringBuilder();
Expand Down Expand Up @@ -369,6 +378,9 @@ public String toString() {
sql.append(" WHERE ").append(where);
}
}
if (forXmlPath != null) {
sql.append(" FOR XML PATH(").append(forXmlPath).append(")");
}
if (useBrackets) {
sql.append(")");
}
Expand Down
18 changes: 10 additions & 8 deletions src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@
*/
package net.sf.jsqlparser.util.deparser;

import java.util.Iterator;
import java.util.List;
import net.sf.jsqlparser.expression.*;
import net.sf.jsqlparser.schema.*;
import net.sf.jsqlparser.statement.select.*;
import net.sf.jsqlparser.statement.values.ValuesStatement;

import java.util.Iterator;
import java.util.List;

public class SelectDeParser implements SelectVisitor, SelectItemVisitor, FromItemVisitor, PivotVisitor {

protected StringBuilder buffer = new StringBuilder();
Expand Down Expand Up @@ -168,6 +167,9 @@ public void visit(PlainSelect plainSelect) {
if (plainSelect.getOptimizeFor() != null) {
deparseOptimizeFor(plainSelect.getOptimizeFor());
}
if (plainSelect.getForXmlPath() != null) {
buffer.append(" FOR XML PATH(" + plainSelect.getForXmlPath() + ")");
}
if (plainSelect.isUseBrackets()) {
buffer.append(")");
}
Expand Down Expand Up @@ -328,11 +330,11 @@ public void visit(SubJoin subjoin) {
}

public void deparseJoin(Join join) {
if (join.isSimple() && join.isOuter()) {
buffer.append(", OUTER ");
} else if (join.isSimple()) {
buffer.append(", ");
} else {
if (join.isSimple() && join.isOuter()) {
buffer.append(", OUTER ");
} else if (join.isSimple()) {
buffer.append(", ");
} else {

if (join.isRight()) {
buffer.append(" RIGHT");
Expand Down
7 changes: 5 additions & 2 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_OVER:"OVER">
| <K_OPTIMIZE: "OPTIMIZE" >
| <K_PARTITION:"PARTITION">
| <K_PATH:"PATH">
| <K_PERCENT:"PERCENT">
| <K_PIVOT:"PIVOT">
| <K_PLACING:"PLACING">
Expand Down Expand Up @@ -1041,7 +1042,7 @@ String RelObjectNameWithoutValue() :
| tk=<K_INSERT> | tk=<K_INDEX> | tk=<K_PRIMARY> | tk=<K_ENABLE>
| tk=<K_UNSIGNED>
| tk=<K_TEMP> | tk=<K_TEMPORARY> | tk=<K_TYPE> | tk=<K_ISNULL>
| tk=<K_ZONE> | tk=<K_COLUMNS> | tk=<K_DESCRIBE> | tk=<K_FN>
| tk=<K_ZONE> | tk=<K_COLUMNS> | tk=<K_DESCRIBE> | tk=<K_FN> | tk=<K_PATH>
/* | tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
)

Expand Down Expand Up @@ -1214,12 +1215,14 @@ PlainSelect PlainSelect() #PlainSelect:
[LOOKAHEAD(<K_OFFSET>) offset = Offset() { plainSelect.setOffset(offset); } ]
[LOOKAHEAD(<K_FETCH>) fetch = Fetch() { plainSelect.setFetch(fetch); } ]

[ <K_FOR> <K_UPDATE> { plainSelect.setForUpdate(true); }
[ LOOKAHEAD(2) <K_FOR> <K_UPDATE> { plainSelect.setForUpdate(true); }
[ <K_OF> updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ]
[ LOOKAHEAD(<K_WAIT>) wait = Wait() { plainSelect.setWait(wait); } ] ]

[LOOKAHEAD(<K_OPTIMIZE>) optimize = OptimizeFor() { plainSelect.setOptimizeFor(optimize); } ]

[ <K_FOR> <K_XML> <K_PATH> "(" token = <S_CHAR_LITERAL> ")" { plainSelect.setForXmlPath(token.image); } ]

{
plainSelect.setSelectItems(selectItems);
plainSelect.setFromItem(fromItem);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3407,6 +3407,11 @@ public void testSqlContainIsNullFunctionShouldBeParsed3() throws JSQLParserExcep
assertSqlCanBeParsedAndDeparsed("SELECT name, age FROM person WHERE NOT ISNULL(home, 'earn more money')");
}

@Test
public void testForXmlPath() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT '|' + person_name FROM person JOIN person_group ON person.person_id = person_group.person_id WHERE person_group.group_id = 1 FOR XML PATH('')");
}

// @Test
// public void testIntervalExpression() throws JSQLParserException {
// assertSqlCanBeParsedAndDeparsed("SELECT count(emails.id) FROM emails WHERE (emails.date_entered + 30 DAYS) > CURRENT_DATE");
Expand Down

0 comments on commit b029bb5

Please sign in to comment.