Skip to content

Commit a2487a9

Browse files
Merge branch 'master' of github.com:JSQLParser/JSqlParser
2 parents 619f8da + 6697c06 commit a2487a9

File tree

11 files changed

+334
-1
lines changed

11 files changed

+334
-1
lines changed

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
exports net.sf.jsqlparser.statement.grant;
4141
exports net.sf.jsqlparser.statement.imprt;
4242
exports net.sf.jsqlparser.statement.insert;
43+
exports net.sf.jsqlparser.statement.lock;
4344
exports net.sf.jsqlparser.statement.merge;
4445
exports net.sf.jsqlparser.statement.piped;
4546
exports net.sf.jsqlparser.statement.refresh;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import net.sf.jsqlparser.statement.imprt.Import;
3333
import net.sf.jsqlparser.statement.insert.Insert;
3434
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
35+
import net.sf.jsqlparser.statement.lock.LockStatement;
3536
import net.sf.jsqlparser.statement.merge.Merge;
3637
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
3738
import net.sf.jsqlparser.statement.select.Select;
@@ -343,4 +344,11 @@ default void visit(Import imprt) {
343344
default void visit(Export export) {
344345
this.visit(export, null);
345346
}
347+
348+
<S> T visit(LockStatement lock, S context);
349+
350+
default void visit(LockStatement lock) {
351+
this.visit(lock, null);
352+
}
353+
346354
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import net.sf.jsqlparser.statement.insert.Insert;
3838
import net.sf.jsqlparser.statement.insert.InsertConflictAction;
3939
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
40+
import net.sf.jsqlparser.statement.lock.LockStatement;
4041
import net.sf.jsqlparser.statement.merge.Merge;
4142
import net.sf.jsqlparser.statement.merge.MergeOperationVisitor;
4243
import net.sf.jsqlparser.statement.merge.MergeOperationVisitorAdapter;
@@ -289,6 +290,12 @@ public <S> T visit(Execute execute, S context) {
289290
return null;
290291
}
291292

293+
@Override
294+
public <S> T visit(LockStatement lock, S context) {
295+
296+
return null;
297+
}
298+
292299
@Override
293300
public <S> T visit(SetStatement set, S context) {
294301

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.sf.jsqlparser.statement.lock;
2+
3+
/**
4+
* Describes the LockMode of a LOCK TABLE-Statement.
5+
*/
6+
public enum LockMode {
7+
// These two modes are more common
8+
Share("SHARE"), Exclusive("EXCLUSIVE"),
9+
10+
// These are Oracle specific, as far as I know
11+
RowShare("ROW SHARE"), RowExclusive("ROW EXCLUSIVE"), ShareUpdate(
12+
"SHARE UPDATE"), ShareRowExclusive("SHARE ROW EXCLUSIVE");
13+
14+
private final String value;
15+
16+
LockMode(String value) {
17+
this.value = value;
18+
}
19+
20+
public String getValue() {
21+
return value;
22+
}
23+
24+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package net.sf.jsqlparser.statement.lock;
2+
3+
import net.sf.jsqlparser.schema.Table;
4+
import net.sf.jsqlparser.statement.Statement;
5+
import net.sf.jsqlparser.statement.StatementVisitor;
6+
7+
/**
8+
* Statement to Lock a specific table.<br>
9+
* Example:<br>
10+
* LOCK TABLE t IN EXCLUSIVE MODE<br>
11+
* <br>
12+
*/
13+
public class LockStatement implements Statement {
14+
15+
private Table table;
16+
private LockMode lockMode;
17+
private boolean noWait;
18+
private Long waitSeconds;
19+
20+
/**
21+
* Creates a new LockStatement
22+
*
23+
* @param table The table to lock
24+
* @param lockMode The lock mode
25+
*/
26+
public LockStatement(Table table, LockMode lockMode) {
27+
this.table = table;
28+
this.lockMode = lockMode;
29+
}
30+
31+
public LockStatement(Table table, LockMode lockMode, boolean noWait, Long waitSeconds) {
32+
this(table, lockMode);
33+
this.table = table;
34+
this.lockMode = lockMode;
35+
this.noWait = noWait;
36+
this.waitSeconds = waitSeconds;
37+
}
38+
39+
private void checkValidState() {
40+
if (noWait && waitSeconds != null) {
41+
throw new IllegalStateException(
42+
"A LOCK statement cannot have NOWAIT and WAIT at the same time");
43+
}
44+
}
45+
46+
public Table getTable() {
47+
return table;
48+
}
49+
50+
public void setTable(Table table) {
51+
this.table = table;
52+
}
53+
54+
public LockMode getLockMode() {
55+
return lockMode;
56+
}
57+
58+
public void setLockMode(LockMode lockMode) {
59+
this.lockMode = lockMode;
60+
}
61+
62+
/**
63+
* @return True if the statement has a NOWAIT clause
64+
*/
65+
public boolean isNoWait() {
66+
return noWait;
67+
}
68+
69+
/**
70+
* Sets the NOWAIT-Flag.
71+
*
72+
* @param noWait True if the statement should have the NOWAIT clause
73+
*/
74+
public void setNoWait(boolean noWait) {
75+
this.noWait = noWait;
76+
checkValidState();
77+
}
78+
79+
/**
80+
* Sets the WAIT-Timeout. If this value is set, the Statement is rendered with WAIT
81+
* &lt;timeoutSeconds&gt;<br>
82+
* If the value is set to NULL, the WAIT-clause is skipped
83+
*
84+
* @param waitSeconds The number of seconds for the WAIT timeout or NULL to skip the WAIT clause
85+
*/
86+
public void setWaitSeconds(Long waitSeconds) {
87+
this.waitSeconds = waitSeconds;
88+
checkValidState();
89+
}
90+
91+
/**
92+
* @return The number of seconds in the WAIT clause, or NULL if the statement has no WAIT clause
93+
*/
94+
public Long getWaitSeconds() {
95+
return waitSeconds;
96+
}
97+
98+
@Override
99+
public String toString() {
100+
return "LOCK TABLE "
101+
+ table.getFullyQualifiedName()
102+
+ " IN "
103+
+ lockMode.getValue()
104+
+ " MODE"
105+
+ (noWait ? " NOWAIT" : "")
106+
+ (waitSeconds != null ? " WAIT " + waitSeconds : "");
107+
}
108+
109+
@Override
110+
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
111+
return statementVisitor.visit(this, context);
112+
}
113+
114+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@
162162
import net.sf.jsqlparser.statement.imprt.Import;
163163
import net.sf.jsqlparser.statement.insert.Insert;
164164
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
165+
import net.sf.jsqlparser.statement.lock.LockStatement;
165166
import net.sf.jsqlparser.statement.merge.Merge;
166167
import net.sf.jsqlparser.statement.piped.FromQuery;
167168
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
@@ -1874,4 +1875,15 @@ public <S> Void visit(Export export, S context) {
18741875
public void visit(Export export) {
18751876
StatementVisitor.super.visit(export);
18761877
}
1878+
1879+
@Override
1880+
public <S> Void visit(LockStatement lock, S context) {
1881+
lock.getTable().accept(this);
1882+
return null;
1883+
}
1884+
1885+
@Override
1886+
public void visit(LockStatement lock) {
1887+
StatementVisitor.super.visit(lock);
1888+
}
18771889
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import net.sf.jsqlparser.statement.imprt.Import;
5858
import net.sf.jsqlparser.statement.insert.Insert;
5959
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
60+
import net.sf.jsqlparser.statement.lock.LockStatement;
6061
import net.sf.jsqlparser.statement.merge.Merge;
6162
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
6263
import net.sf.jsqlparser.statement.select.Select;
@@ -513,4 +514,10 @@ public <S> StringBuilder visit(Export export, S context) {
513514
builder.append(export.toString());
514515
return builder;
515516
}
517+
518+
@Override
519+
public <S> StringBuilder visit(LockStatement lock, S context) {
520+
builder.append(lock.toString());
521+
return builder;
522+
}
516523
}

src/main/java/net/sf/jsqlparser/util/validation/validator/StatementValidator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import net.sf.jsqlparser.statement.imprt.Import;
5656
import net.sf.jsqlparser.statement.insert.Insert;
5757
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
58+
import net.sf.jsqlparser.statement.lock.LockStatement;
5859
import net.sf.jsqlparser.statement.merge.Merge;
5960
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
6061
import net.sf.jsqlparser.statement.select.Select;
@@ -399,6 +400,12 @@ public <S> Void visit(Export export, S context) {
399400
return null;
400401
}
401402

403+
@Override
404+
public <S> Void visit(LockStatement lock, S context) {
405+
// TODO: not yet implemented
406+
return null;
407+
}
408+
402409
public void visit(CreateIndex createIndex) {
403410
visit(createIndex, null);
404411
}

0 commit comments

Comments
 (0)