Skip to content

Commit b029bb5

Browse files
committed
fixes #479
1 parent fa16241 commit b029bb5

File tree

4 files changed

+32
-10
lines changed

4 files changed

+32
-10
lines changed

src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody {
4646
private Wait wait;
4747
private boolean mySqlSqlCalcFoundRows = false;
4848
private boolean sqlNoCacheFlag = false;
49+
private String forXmlPath;
4950

5051
public boolean isUseBrackets() {
5152
return useBrackets;
@@ -271,6 +272,14 @@ public Wait getWait() {
271272
return wait;
272273
}
273274

275+
public String getForXmlPath() {
276+
return forXmlPath;
277+
}
278+
279+
public void setForXmlPath(String forXmlPath) {
280+
this.forXmlPath = forXmlPath;
281+
}
282+
274283
@Override
275284
public String toString() {
276285
StringBuilder sql = new StringBuilder();
@@ -369,6 +378,9 @@ public String toString() {
369378
sql.append(" WHERE ").append(where);
370379
}
371380
}
381+
if (forXmlPath != null) {
382+
sql.append(" FOR XML PATH(").append(forXmlPath).append(")");
383+
}
372384
if (useBrackets) {
373385
sql.append(")");
374386
}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@
99
*/
1010
package net.sf.jsqlparser.util.deparser;
1111

12+
import java.util.Iterator;
13+
import java.util.List;
1214
import net.sf.jsqlparser.expression.*;
1315
import net.sf.jsqlparser.schema.*;
1416
import net.sf.jsqlparser.statement.select.*;
1517
import net.sf.jsqlparser.statement.values.ValuesStatement;
1618

17-
import java.util.Iterator;
18-
import java.util.List;
19-
2019
public class SelectDeParser implements SelectVisitor, SelectItemVisitor, FromItemVisitor, PivotVisitor {
2120

2221
protected StringBuilder buffer = new StringBuilder();
@@ -168,6 +167,9 @@ public void visit(PlainSelect plainSelect) {
168167
if (plainSelect.getOptimizeFor() != null) {
169168
deparseOptimizeFor(plainSelect.getOptimizeFor());
170169
}
170+
if (plainSelect.getForXmlPath() != null) {
171+
buffer.append(" FOR XML PATH(" + plainSelect.getForXmlPath() + ")");
172+
}
171173
if (plainSelect.isUseBrackets()) {
172174
buffer.append(")");
173175
}
@@ -328,11 +330,11 @@ public void visit(SubJoin subjoin) {
328330
}
329331

330332
public void deparseJoin(Join join) {
331-
if (join.isSimple() && join.isOuter()) {
332-
buffer.append(", OUTER ");
333-
} else if (join.isSimple()) {
334-
buffer.append(", ");
335-
} else {
333+
if (join.isSimple() && join.isOuter()) {
334+
buffer.append(", OUTER ");
335+
} else if (join.isSimple()) {
336+
buffer.append(", ");
337+
} else {
336338

337339
if (join.isRight()) {
338340
buffer.append(" RIGHT");

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
223223
| <K_OVER:"OVER">
224224
| <K_OPTIMIZE: "OPTIMIZE" >
225225
| <K_PARTITION:"PARTITION">
226+
| <K_PATH:"PATH">
226227
| <K_PERCENT:"PERCENT">
227228
| <K_PIVOT:"PIVOT">
228229
| <K_PLACING:"PLACING">
@@ -1041,7 +1042,7 @@ String RelObjectNameWithoutValue() :
10411042
| tk=<K_INSERT> | tk=<K_INDEX> | tk=<K_PRIMARY> | tk=<K_ENABLE>
10421043
| tk=<K_UNSIGNED>
10431044
| tk=<K_TEMP> | tk=<K_TEMPORARY> | tk=<K_TYPE> | tk=<K_ISNULL>
1044-
| tk=<K_ZONE> | tk=<K_COLUMNS> | tk=<K_DESCRIBE> | tk=<K_FN>
1045+
| tk=<K_ZONE> | tk=<K_COLUMNS> | tk=<K_DESCRIBE> | tk=<K_FN> | tk=<K_PATH>
10451046
/* | tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
10461047
)
10471048

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

1217-
[ <K_FOR> <K_UPDATE> { plainSelect.setForUpdate(true); }
1218+
[ LOOKAHEAD(2) <K_FOR> <K_UPDATE> { plainSelect.setForUpdate(true); }
12181219
[ <K_OF> updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ]
12191220
[ LOOKAHEAD(<K_WAIT>) wait = Wait() { plainSelect.setWait(wait); } ] ]
12201221

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

1224+
[ <K_FOR> <K_XML> <K_PATH> "(" token = <S_CHAR_LITERAL> ")" { plainSelect.setForXmlPath(token.image); } ]
1225+
12231226
{
12241227
plainSelect.setSelectItems(selectItems);
12251228
plainSelect.setFromItem(fromItem);

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3407,6 +3407,11 @@ public void testSqlContainIsNullFunctionShouldBeParsed3() throws JSQLParserExcep
34073407
assertSqlCanBeParsedAndDeparsed("SELECT name, age FROM person WHERE NOT ISNULL(home, 'earn more money')");
34083408
}
34093409

3410+
@Test
3411+
public void testForXmlPath() throws JSQLParserException {
3412+
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('')");
3413+
}
3414+
34103415
// @Test
34113416
// public void testIntervalExpression() throws JSQLParserException {
34123417
// assertSqlCanBeParsedAndDeparsed("SELECT count(emails.id) FROM emails WHERE (emails.date_entered + 30 DAYS) > CURRENT_DATE");

0 commit comments

Comments
 (0)