Skip to content

Commit 7d2e6b6

Browse files
feat: Session Statement
Signed-off-by: Andreas Reichel <[email protected]>
1 parent a04d72d commit 7d2e6b6

File tree

8 files changed

+232
-83
lines changed

8 files changed

+232
-83
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package net.sf.jsqlparser.statement;
2+
3+
public class SessionStatement implements Statement {
4+
public enum Action {
5+
START, APPLY, DROP, SHOW, DESCRIBE;
6+
7+
public static Action from(String flag) {
8+
return Enum.valueOf(Action.class, flag.toUpperCase());
9+
}
10+
}
11+
12+
final private Action action;
13+
final private String id;
14+
15+
public SessionStatement(Action action, String id) {
16+
this.action = action;
17+
this.id = id;
18+
}
19+
20+
public SessionStatement(String action, String id) {
21+
this(Action.from(action), id);
22+
}
23+
24+
public SessionStatement(String action) {
25+
this(action, null);
26+
}
27+
28+
29+
public Action getAction() {
30+
return action;
31+
}
32+
33+
public String getId() {
34+
return id;
35+
}
36+
37+
@Override
38+
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
39+
return statementVisitor.visit(this, context);
40+
}
41+
42+
@Override
43+
public void accept(StatementVisitor<?> statementVisitor) {
44+
Statement.super.accept(statementVisitor);
45+
}
46+
47+
@Override
48+
public String toString() {
49+
return "SESSION " + action + " " + (id != null ? id : "") + ";";
50+
}
51+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,10 @@ default void visit(ParenthesedUpdate parenthesedUpdate) {
323323
default void visit(ParenthesedDelete parenthesedDelete) {
324324
this.visit(parenthesedDelete, null);
325325
}
326+
327+
<S> T visit(SessionStatement sessionStatement, S context);
328+
329+
default void visit(SessionStatement sessionStatement) {
330+
this.visit(sessionStatement, null);
331+
}
326332
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ public <S> T visit(ParenthesedDelete delete, S context) {
7373
return null;
7474
}
7575

76+
@Override
77+
public <S> T visit(SessionStatement sessionStatement, S context) {
78+
return null;
79+
}
80+
7681
@Override
7782
public <S> T visit(Update update, S context) {
7883

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
import net.sf.jsqlparser.statement.ResetStatement;
131131
import net.sf.jsqlparser.statement.RollbackStatement;
132132
import net.sf.jsqlparser.statement.SavepointStatement;
133+
import net.sf.jsqlparser.statement.SessionStatement;
133134
import net.sf.jsqlparser.statement.SetStatement;
134135
import net.sf.jsqlparser.statement.ShowColumnsStatement;
135136
import net.sf.jsqlparser.statement.ShowStatement;
@@ -1031,6 +1032,11 @@ public <S> Void visit(ParenthesedDelete delete, S context) {
10311032
return visit(delete.getDelete(), context);
10321033
}
10331034

1035+
@Override
1036+
public <S> Void visit(SessionStatement sessionStatement, S context) {
1037+
return null;
1038+
}
1039+
10341040
@Override
10351041
public <S> Void visit(Update update, S context) {
10361042
if (update.getWithItemsList() != null) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import net.sf.jsqlparser.statement.ResetStatement;
2626
import net.sf.jsqlparser.statement.RollbackStatement;
2727
import net.sf.jsqlparser.statement.SavepointStatement;
28+
import net.sf.jsqlparser.statement.SessionStatement;
2829
import net.sf.jsqlparser.statement.SetStatement;
2930
import net.sf.jsqlparser.statement.ShowColumnsStatement;
3031
import net.sf.jsqlparser.statement.ShowStatement;
@@ -201,6 +202,11 @@ public <S> StringBuilder visit(ParenthesedDelete delete, S context) {
201202
return builder;
202203
}
203204

205+
@Override
206+
public <S> StringBuilder visit(SessionStatement sessionStatement, S context) {
207+
return builder.append(sessionStatement.toString());
208+
}
209+
204210

205211
private <S> StringBuilder addWithItemsToBuffer(List<WithItem<?>> withItemsList, S context) {
206212
if (withItemsList != null && !withItemsList.isEmpty()) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import net.sf.jsqlparser.statement.ResetStatement;
2222
import net.sf.jsqlparser.statement.RollbackStatement;
2323
import net.sf.jsqlparser.statement.SavepointStatement;
24+
import net.sf.jsqlparser.statement.SessionStatement;
2425
import net.sf.jsqlparser.statement.SetStatement;
2526
import net.sf.jsqlparser.statement.ShowColumnsStatement;
2627
import net.sf.jsqlparser.statement.ShowStatement;
@@ -112,6 +113,11 @@ public <S> Void visit(ParenthesedDelete delete, S context) {
112113
return visit(delete.getDelete(), context);
113114
}
114115

116+
@Override
117+
public <S> Void visit(SessionStatement sessionStatement, S context) {
118+
return null;
119+
}
120+
115121

116122
@Override
117123
public <S> Void visit(Drop drop, S context) {

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

Lines changed: 129 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,8 @@ Statement SingleStatement() :
969969
stm = Grant()
970970
|
971971
stm = PurgeStatement()
972+
|
973+
stm = SessionStatement()
972974
)
973975
{ return stm; }
974976
}
@@ -1187,7 +1189,46 @@ DeclareStatement Declare(): {
11871189
}
11881190
}
11891191

1192+
SessionStatement SessionStatement():
1193+
{
1194+
Token actionToken;
1195+
Token idToken = null;
1196+
}
1197+
{
1198+
<K_SESSION>
1199+
(
1200+
actionToken = <K_START>
1201+
|
1202+
actionToken = <K_APPLY>
1203+
|
1204+
actionToken = <K_DROP>
1205+
|
1206+
actionToken = <K_SHOW>
1207+
|
1208+
actionToken = <K_DESCRIBE>
1209+
)
1210+
1211+
[
1212+
(
1213+
idToken = <S_IDENTIFIER>
1214+
|
1215+
idToken = <S_QUOTED_IDENTIFIER>
1216+
|
1217+
idToken = <S_CHAR_LITERAL>
1218+
|
1219+
idToken = <S_LONG>
1220+
)
1221+
]
1222+
1223+
{
1224+
SessionStatement sessionsStatement = idToken!=null
1225+
? new SessionStatement(actionToken.image, idToken.image)
1226+
: new SessionStatement(actionToken.image);
11901227

1228+
//linkAST(sessionsStatement,jjtThis);
1229+
return sessionsStatement;
1230+
}
1231+
}
11911232

11921233
SetStatement Set(): {
11931234
String namePart;
@@ -8980,91 +9021,96 @@ List<Sequence.Parameter> SequenceParameters():
89809021
Token token = null;
89819022
}
89829023
{
8983-
(
8984-
(<K_INCREMENT> <K_BY> token=<S_LONG>
8985-
{
8986-
parameter = new Sequence.Parameter(Sequence.ParameterType.INCREMENT_BY);
8987-
parameter.setValue(Long.parseLong(token.image));
8988-
sequenceParameters.add(parameter);
8989-
}
8990-
)
8991-
|
8992-
(<K_START> <K_WITH> token=<S_LONG>
8993-
{
8994-
parameter = new Sequence.Parameter(Sequence.ParameterType.START_WITH);
8995-
parameter.setValue(Long.parseLong(token.image));
8996-
sequenceParameters.add(parameter);
8997-
}
8998-
)
8999-
|
9000-
(<K_RESTART> [ LOOKAHEAD(2) <K_WITH> token=<S_LONG>]
9001-
{
9002-
parameter = new Sequence.Parameter(Sequence.ParameterType.RESTART_WITH);
9003-
if(token != null){
9004-
parameter.setValue(Long.parseLong(token.image));
9005-
}
9006-
sequenceParameters.add(parameter);
9007-
}
9008-
)
9009-
|
9010-
(<K_NOMAXVALUE>
9011-
{
9012-
parameter = new Sequence.Parameter(Sequence.ParameterType.NOMAXVALUE);
9013-
sequenceParameters.add(parameter);
9014-
}
9015-
|<K_MAXVALUE> token=<S_LONG>
9016-
{
9017-
parameter = new Sequence.Parameter(Sequence.ParameterType.MAXVALUE);
9018-
parameter.setValue(Long.parseLong(token.image));
9019-
sequenceParameters.add(parameter);
9020-
}
9021-
)
9022-
|
9023-
(<K_NOMINVALUE>
9024-
{
9025-
parameter = new Sequence.Parameter(Sequence.ParameterType.NOMINVALUE);
9026-
sequenceParameters.add(parameter);
9027-
}
9028-
|<K_MINVALUE> token=<S_LONG>
9029-
{
9030-
parameter = new Sequence.Parameter(Sequence.ParameterType.MINVALUE);
9031-
parameter.setValue(Long.parseLong(token.image));
9032-
sequenceParameters.add(parameter);
9033-
}
9034-
)
9035-
|
9036-
(<K_NOCYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOCYCLE)); }
9037-
|<K_CYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.CYCLE)); }
9038-
)
9039-
|
9040-
(<K_NOCACHE>
9041-
{
9042-
parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE);
9043-
sequenceParameters.add(parameter);
9044-
}
9045-
|<K_CACHE> token=<S_LONG>
9024+
(
9025+
LOOKAHEAD(2) (
9026+
(
9027+
<K_INCREMENT> <K_BY> token=<S_LONG>
9028+
{
9029+
parameter = new Sequence.Parameter(Sequence.ParameterType.INCREMENT_BY);
9030+
parameter.setValue(Long.parseLong(token.image));
9031+
sequenceParameters.add(parameter);
9032+
}
9033+
)
9034+
|
9035+
(
9036+
<K_START> <K_WITH> token=<S_LONG>
9037+
{
9038+
parameter = new Sequence.Parameter(Sequence.ParameterType.START_WITH);
9039+
parameter.setValue(Long.parseLong(token.image));
9040+
sequenceParameters.add(parameter);
9041+
}
9042+
)
9043+
|
9044+
(
9045+
<K_RESTART> [ LOOKAHEAD(2) <K_WITH> token=<S_LONG>]
9046+
{
9047+
parameter = new Sequence.Parameter(Sequence.ParameterType.RESTART_WITH);
9048+
if(token != null) {
9049+
parameter.setValue(Long.parseLong(token.image));
9050+
}
9051+
sequenceParameters.add(parameter);
9052+
}
9053+
)
9054+
|
9055+
<K_NOMAXVALUE>
9056+
{
9057+
parameter = new Sequence.Parameter(Sequence.ParameterType.NOMAXVALUE);
9058+
sequenceParameters.add(parameter);
9059+
}
9060+
|
9061+
<K_MAXVALUE> token=<S_LONG>
9062+
{
9063+
parameter = new Sequence.Parameter(Sequence.ParameterType.MAXVALUE);
9064+
parameter.setValue(Long.parseLong(token.image));
9065+
sequenceParameters.add(parameter);
9066+
}
9067+
|
9068+
<K_NOMINVALUE>
9069+
{
9070+
parameter = new Sequence.Parameter(Sequence.ParameterType.NOMINVALUE);
9071+
sequenceParameters.add(parameter);
9072+
}
9073+
|
9074+
<K_MINVALUE> token=<S_LONG>
9075+
{
9076+
parameter = new Sequence.Parameter(Sequence.ParameterType.MINVALUE);
9077+
parameter.setValue(Long.parseLong(token.image));
9078+
sequenceParameters.add(parameter);
9079+
}
9080+
|
9081+
<K_NOCYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOCYCLE)); }
9082+
|
9083+
<K_CYCLE> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.CYCLE)); }
9084+
|
9085+
<K_NOCACHE>
9086+
{
9087+
parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE);
9088+
sequenceParameters.add(parameter);
9089+
}
9090+
|
9091+
<K_CACHE> token=<S_LONG>
9092+
{
9093+
parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE);
9094+
parameter.setValue(Long.parseLong(token.image));
9095+
sequenceParameters.add(parameter);
9096+
}
9097+
|
9098+
<K_ORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.ORDER)); }
9099+
|
9100+
<K_NOORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOORDER)); }
9101+
|
9102+
<K_KEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.KEEP)); }
9103+
|
9104+
<K_NOKEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOKEEP)); }
9105+
|
9106+
<K_SESSION> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.SESSION)); }
9107+
|
9108+
<K_GLOBAL> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.GLOBAL)); }
9109+
)
9110+
)*
90469111
{
9047-
parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE);
9048-
parameter.setValue(Long.parseLong(token.image));
9049-
sequenceParameters.add(parameter);
9112+
return sequenceParameters;
90509113
}
9051-
)
9052-
|
9053-
(<K_ORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.ORDER)); }
9054-
|<K_NOORDER> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOORDER)); }
9055-
)
9056-
|
9057-
(<K_KEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.KEEP)); }
9058-
|<K_NOKEEP> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOKEEP)); }
9059-
)
9060-
|
9061-
(<K_SESSION> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.SESSION)); }
9062-
|<K_GLOBAL> { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.GLOBAL)); }
9063-
)
9064-
)* //zero or many times those productions
9065-
{
9066-
return sequenceParameters;
9067-
}
90689114
}
90699115

90709116
CreateSequence CreateSequence():
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.sf.jsqlparser.statement;
2+
3+
import net.sf.jsqlparser.JSQLParserException;
4+
import net.sf.jsqlparser.test.TestUtils;
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.ValueSource;
8+
9+
class SessionStatementTest {
10+
11+
@ParameterizedTest
12+
@ValueSource(strings = {
13+
"SESSION START 1234", "SESSION START", "SESSION APPLY 'test'", "SESSION APPLY",
14+
"SESSION DROP \"test\"", "SESSION DROP", "SESSION SHOW test", "SESSION SHOW",
15+
"SESSION DESCRIBE 1234", "SESSION DESCRIBE"
16+
})
17+
void testStartSession(String sqlStr) throws JSQLParserException {
18+
SessionStatement sessionStatement =
19+
(SessionStatement) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
20+
Assertions.assertInstanceOf(SessionStatement.Action.class, sessionStatement.getAction());
21+
}
22+
23+
}

0 commit comments

Comments
 (0)