Skip to content

Commit 808e320

Browse files
committed
Merge origin/master
2 parents 9707e4f + 73b3d44 commit 808e320

File tree

6 files changed

+75
-6
lines changed

6 files changed

+75
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ And this is the dependency declaration in your pom:
133133
<dependency>
134134
<groupId>com.github.jsqlparser</groupId>
135135
<artifactId>jsqlparser</artifactId>
136-
<version>3.0</version>
136+
<version>3.1</version>
137137
</dependency>
138138
```
139139

src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ public static Statement parse(String sql) throws JSQLParserException {
4040
return parse(sql, null);
4141
}
4242

43+
/**
44+
* Parses an sql statement while allowing via consumer to configure the used parser before.
45+
*
46+
* For instance to activate SQLServer bracket quotation on could use:
47+
*
48+
* {@code
49+
* CCJSqlParserUtil.parse("select * from [mytable]", parser -> parser.withSquareBracketQuotation(true));
50+
* }
51+
*
52+
* @param sql
53+
* @param consumer
54+
* @return
55+
* @throws JSQLParserException
56+
*/
4357
public static Statement parse(String sql, Consumer<CCJSqlParser> consumer) throws JSQLParserException {
4458
CCJSqlParser parser = new CCJSqlParser(new StringProvider(sql));
4559
if (consumer != null) {

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody {
3535
private Fetch fetch;
3636
private OptimizeFor optimizeFor;
3737
private Skip skip;
38+
private boolean mySqlHintStraightJoin;
3839
private First first;
3940
private Top top;
4041
private OracleHierarchicalExpression oracleHierarchical = null;
@@ -48,6 +49,7 @@ public class PlainSelect extends ASTNodeAccessImpl implements SelectBody {
4849
private boolean sqlNoCacheFlag = false;
4950
private String forXmlPath;
5051
private KSQLWindow ksqlWindow = null;
52+
private boolean noWait = false;
5153

5254
public boolean isUseBrackets() {
5355
return useBrackets;
@@ -170,6 +172,14 @@ public void setSkip(Skip skip) {
170172
this.skip = skip;
171173
}
172174

175+
public boolean getMySqlHintStraightJoin() {
176+
return this.mySqlHintStraightJoin;
177+
}
178+
179+
public void setMySqlHintStraightJoin(boolean mySqlHintStraightJoin) {
180+
this.mySqlHintStraightJoin = mySqlHintStraightJoin;
181+
}
182+
173183
public First getFirst() {
174184
return first;
175185
}
@@ -297,6 +307,10 @@ public String toString() {
297307
}
298308
sql.append("SELECT ");
299309

310+
if (this.mySqlHintStraightJoin) {
311+
sql.append("STRAIGHT_JOIN ");
312+
}
313+
300314
if (oracleHint != null) {
301315
sql.append(oracleHint).append(" ");
302316
}
@@ -383,6 +397,10 @@ public String toString() {
383397
// Wait's toString will do the formatting for us
384398
sql.append(wait);
385399
}
400+
401+
if (isNoWait()) {
402+
sql.append(" NOWAIT");
403+
}
386404
}
387405
if (optimizeFor != null) {
388406
sql.append(optimizeFor);
@@ -493,4 +511,12 @@ public boolean getMySqlSqlCalcFoundRows() {
493511
public boolean getMySqlSqlNoCache() {
494512
return this.sqlNoCacheFlag;
495513
}
514+
515+
public void setNoWait(boolean noWait) {
516+
this.noWait = noWait;
517+
}
518+
519+
public boolean isNoWait() {
520+
return this.noWait;
521+
}
496522
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public void visit(PlainSelect plainSelect) {
3636
}
3737
buffer.append("SELECT ");
3838

39+
if (plainSelect.getMySqlHintStraightJoin()) {
40+
buffer.append("STRAIGHT_JOIN ");
41+
}
42+
3943
OracleHint hint = plainSelect.getOracleHint();
4044
if (hint != null) {
4145
buffer.append(hint).append(" ");
@@ -161,6 +165,9 @@ public void visit(PlainSelect plainSelect) {
161165
// wait's toString will do the formatting for us
162166
buffer.append(plainSelect.getWait());
163167
}
168+
if (plainSelect.isNoWait()) {
169+
buffer.append(" NOWAIT");
170+
}
164171
}
165172
if (plainSelect.getOptimizeFor() != null) {
166173
deparseOptimizeFor(plainSelect.getOptimizeFor());

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
233233
| <K_NOVALIDATE : "NOVALIDATE">
234234
| <K_NULL:"NULL">
235235
| <K_NULLS: "NULLS">
236+
| <K_NOWAIT: "NOWAIT">
236237
| <K_OF:"OF">
237238
| <K_OFFSET:"OFFSET">
238239
| <K_ON:"ON">
@@ -1276,11 +1277,14 @@ PlainSelect PlainSelect() #PlainSelect:
12761277
Wait wait = null;
12771278
boolean mySqlSqlCalcFoundRows = false;
12781279
Token token;
1279-
KSQLWindow ksqlWindow=null;
1280+
KSQLWindow ksqlWindow = null;
1281+
boolean noWait = false;
12801282
}
12811283
{
12821284
<K_SELECT>
12831285

1286+
[ <K_STRAIGHT> { plainSelect.setMySqlHintStraightJoin(true); } ]
1287+
12841288
{ plainSelect.setOracleHint(getOracleHint()); }
12851289

12861290
[skip = Skip() { plainSelect.setSkip(skip); } ]
@@ -1330,9 +1334,10 @@ PlainSelect PlainSelect() #PlainSelect:
13301334

13311335
[LOOKAHEAD(<K_FETCH>) fetch = Fetch() { plainSelect.setFetch(fetch); } ]
13321336

1333-
[ LOOKAHEAD(2) <K_FOR> <K_UPDATE> { plainSelect.setForUpdate(true); }
1337+
[LOOKAHEAD(2) <K_FOR> <K_UPDATE> { plainSelect.setForUpdate(true); }
13341338
[ <K_OF> updateTable = Table() { plainSelect.setForUpdateTable(updateTable); } ]
1335-
[ LOOKAHEAD(<K_WAIT>) wait = Wait() { plainSelect.setWait(wait); } ] ]
1339+
[ LOOKAHEAD(<K_WAIT>) wait = Wait() { plainSelect.setWait(wait); } ]
1340+
[ <K_NOWAIT> { plainSelect.setNoWait(true); } ] ]
13361341

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

@@ -3860,7 +3865,8 @@ ColDataType ColDataType():
38603865
| ( tk=<S_IDENTIFIER> | tk=<K_DATETIMELITERAL> | tk=<K_DATE_LITERAL> | tk=<K_XML> | tk=<K_INTERVAL> | tk=<DT_ZONE> | tk=<K_CHAR> | tk=<K_SET> )
38613866
{ colDataType.setDataType(tk.image); }
38623867
| tk=<K_UNSIGNED> tk2=<S_IDENTIFIER> {colDataType.setDataType(tk.image + " " + tk2.image);}
3863-
| tk=<K_SIGNED> tk2=<S_IDENTIFIER> {colDataType.setDataType(tk.image + " " + tk2.image);}
3868+
| LOOKAHEAD(2) tk=<K_SIGNED> tk2=<S_IDENTIFIER> {colDataType.setDataType(tk.image + " " + tk2.image);}
3869+
| tk=<K_SIGNED> { colDataType.setDataType(tk.image);}
38643870
)
38653871

38663872
[LOOKAHEAD(2) "(" {tk2 =null;} ( (tk=<S_LONG> [ tk2=<K_BYTE> | tk2=<K_CHAR> ] | tk=<S_CHAR_LITERAL> | tk=<S_IDENTIFIER> )

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1638,11 +1638,17 @@ public void testCastTypeProblem2() throws JSQLParserException {
16381638
}
16391639

16401640
@Test
1641-
public void testStraightJoin() throws JSQLParserException {
1641+
public void testMySQLHintStraightJoin() throws JSQLParserException {
16421642
String stmt = "SELECT col FROM tbl STRAIGHT_JOIN tbl2 ON tbl.id = tbl2.id";
16431643
assertSqlCanBeParsedAndDeparsed(stmt);
16441644
}
16451645

1646+
@Test
1647+
public void testStraightJoinInSelect() throws JSQLParserException {
1648+
String stmt = "SELECT STRAIGHT_JOIN col, col2 FROM tbl INNER JOIN tbl2 ON tbl.id = tbl2.id";
1649+
assertSqlCanBeParsedAndDeparsed(stmt);
1650+
}
1651+
16461652
@Test
16471653
public void testCastTypeProblem3() throws JSQLParserException {
16481654
String stmt = "SELECT col1::varchar (256) FROM tabelle1";
@@ -2939,6 +2945,11 @@ public void testCastToSignedInteger() throws JSQLParserException {
29392945
assertSqlCanBeParsedAndDeparsed("SELECT CAST(contact_id AS SIGNED INTEGER) FROM contact WHERE contact_id = 20");
29402946
}
29412947

2948+
@Test
2949+
public void testCastToSigned() throws JSQLParserException {
2950+
assertSqlCanBeParsedAndDeparsed("SELECT CAST(contact_id AS SIGNED) FROM contact WHERE contact_id = 20");
2951+
}
2952+
29422953
// @Test
29432954
// public void testWhereIssue240_notBoolean() {
29442955
// try {
@@ -3131,6 +3142,11 @@ public void testForUpdateWaitWithTimeout() throws JSQLParserException {
31313142
assertEquals("wait time should be 60", waitTime, 60L);
31323143
}
31333144

3145+
@Test
3146+
public void testForUpdateNoWait() throws JSQLParserException {
3147+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable FOR UPDATE NOWAIT");
3148+
}
3149+
31343150
// @Test public void testSubSelectFailsIssue394() throws JSQLParserException {
31353151
// assertSqlCanBeParsedAndDeparsed("select aa.* , t.* from accenter.all aa, (select a.* from pacioli.emc_plan a) t");
31363152
// }

0 commit comments

Comments
 (0)