Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
exports net.sf.jsqlparser.statement.grant;
exports net.sf.jsqlparser.statement.imprt;
exports net.sf.jsqlparser.statement.insert;
exports net.sf.jsqlparser.statement.lock;
exports net.sf.jsqlparser.statement.merge;
exports net.sf.jsqlparser.statement.piped;
exports net.sf.jsqlparser.statement.refresh;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import net.sf.jsqlparser.statement.imprt.Import;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
import net.sf.jsqlparser.statement.lock.LockStatement;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.Select;
Expand Down Expand Up @@ -343,4 +344,11 @@ default void visit(Import imprt) {
default void visit(Export export) {
this.visit(export, null);
}

<S> T visit(LockStatement lock, S context);

default void visit(LockStatement lock) {
this.visit(lock, null);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.insert.InsertConflictAction;
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
import net.sf.jsqlparser.statement.lock.LockStatement;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.merge.MergeOperationVisitor;
import net.sf.jsqlparser.statement.merge.MergeOperationVisitorAdapter;
Expand Down Expand Up @@ -289,6 +290,12 @@ public <S> T visit(Execute execute, S context) {
return null;
}

@Override
public <S> T visit(LockStatement lock, S context) {

return null;
}

@Override
public <S> T visit(SetStatement set, S context) {

Expand Down
24 changes: 24 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/lock/LockMode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.sf.jsqlparser.statement.lock;

/**
* Describes the LockMode of a LOCK TABLE-Statement.
*/
public enum LockMode {
// These two modes are more common
Share("SHARE"), Exclusive("EXCLUSIVE"),

// These are Oracle specific, as far as I know
RowShare("ROW SHARE"), RowExclusive("ROW EXCLUSIVE"), ShareUpdate(
"SHARE UPDATE"), ShareRowExclusive("SHARE ROW EXCLUSIVE");

private final String value;

LockMode(String value) {
this.value = value;
}

public String getValue() {
return value;
}

}
114 changes: 114 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/lock/LockStatement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package net.sf.jsqlparser.statement.lock;

import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

/**
* Statement to Lock a specific table.<br>
* Example:<br>
* LOCK TABLE t IN EXCLUSIVE MODE<br>
* <br>
*/
public class LockStatement implements Statement {

private Table table;
private LockMode lockMode;
private boolean noWait;
private Long waitSeconds;

/**
* Creates a new LockStatement
*
* @param table The table to lock
* @param lockMode The lock mode
*/
public LockStatement(Table table, LockMode lockMode) {
this.table = table;
this.lockMode = lockMode;
}

public LockStatement(Table table, LockMode lockMode, boolean noWait, Long waitSeconds) {
this(table, lockMode);
this.table = table;
this.lockMode = lockMode;
this.noWait = noWait;
this.waitSeconds = waitSeconds;
}

private void checkValidState() {
if (noWait && waitSeconds != null) {
throw new IllegalStateException(
"A LOCK statement cannot have NOWAIT and WAIT at the same time");
}
}

public Table getTable() {
return table;
}

public void setTable(Table table) {
this.table = table;
}

public LockMode getLockMode() {
return lockMode;
}

public void setLockMode(LockMode lockMode) {
this.lockMode = lockMode;
}

/**
* @return True if the statement has a NOWAIT clause
*/
public boolean isNoWait() {
return noWait;
}

/**
* Sets the NOWAIT-Flag.
*
* @param noWait True if the statement should have the NOWAIT clause
*/
public void setNoWait(boolean noWait) {
this.noWait = noWait;
checkValidState();
}

/**
* Sets the WAIT-Timeout. If this value is set, the Statement is rendered with WAIT
* &lt;timeoutSeconds&gt;<br>
* If the value is set to NULL, the WAIT-clause is skipped
*
* @param waitSeconds The number of seconds for the WAIT timeout or NULL to skip the WAIT clause
*/
public void setWaitSeconds(Long waitSeconds) {
this.waitSeconds = waitSeconds;
checkValidState();
}

/**
* @return The number of seconds in the WAIT clause, or NULL if the statement has no WAIT clause
*/
public Long getWaitSeconds() {
return waitSeconds;
}

@Override
public String toString() {
return "LOCK TABLE "
+ table.getFullyQualifiedName()
+ " IN "
+ lockMode.getValue()
+ " MODE"
+ (noWait ? " NOWAIT" : "")
+ (waitSeconds != null ? " WAIT " + waitSeconds : "");
}

@Override
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
return statementVisitor.visit(this, context);
}

}
12 changes: 12 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@
import net.sf.jsqlparser.statement.imprt.Import;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
import net.sf.jsqlparser.statement.lock.LockStatement;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.piped.FromQuery;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
Expand Down Expand Up @@ -1874,4 +1875,15 @@ public <S> Void visit(Export export, S context) {
public void visit(Export export) {
StatementVisitor.super.visit(export);
}

@Override
public <S> Void visit(LockStatement lock, S context) {
lock.getTable().accept(this);
return null;
}

@Override
public void visit(LockStatement lock) {
StatementVisitor.super.visit(lock);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import net.sf.jsqlparser.statement.imprt.Import;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
import net.sf.jsqlparser.statement.lock.LockStatement;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.Select;
Expand Down Expand Up @@ -513,4 +514,10 @@ public <S> StringBuilder visit(Export export, S context) {
builder.append(export.toString());
return builder;
}

@Override
public <S> StringBuilder visit(LockStatement lock, S context) {
builder.append(lock.toString());
return builder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import net.sf.jsqlparser.statement.imprt.Import;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
import net.sf.jsqlparser.statement.lock.LockStatement;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.select.Select;
Expand Down Expand Up @@ -399,6 +400,12 @@ public <S> Void visit(Export export, S context) {
return null;
}

@Override
public <S> Void visit(LockStatement lock, S context) {
// TODO: not yet implemented
return null;
}

public void visit(CreateIndex createIndex) {
visit(createIndex, null);
}
Expand Down
Loading
Loading