Skip to content

Commit 55a6c46

Browse files
feat: SessionStatement with options
Signed-off-by: Andreas Reichel <[email protected]>
1 parent 4ff5cc9 commit 55a6c46

File tree

3 files changed

+91
-4
lines changed

3 files changed

+91
-4
lines changed

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

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
*/
1010
package net.sf.jsqlparser.statement;
1111

12+
import java.util.LinkedHashMap;
13+
import java.util.Map;
14+
import java.util.Set;
15+
1216
public class SessionStatement implements Statement {
1317
public enum Action {
1418
START, APPLY, DROP, SHOW, DESCRIBE;
@@ -20,6 +24,7 @@ public static Action from(String flag) {
2024

2125
final private Action action;
2226
final private String id;
27+
final private LinkedHashMap<String, String> options = new LinkedHashMap<>();
2328

2429
public SessionStatement(Action action, String id) {
2530
this.action = action;
@@ -43,6 +48,54 @@ public String getId() {
4348
return id;
4449
}
4550

51+
public int size() {
52+
return options.size();
53+
}
54+
55+
public String putOption(String key, String value) {
56+
return options.put(key.replaceAll("[\"']", "").toLowerCase(), value.toLowerCase());
57+
}
58+
59+
public boolean hasOptions() {
60+
return !options.isEmpty();
61+
}
62+
63+
public void clearOptions() {
64+
options.clear();
65+
}
66+
67+
public boolean removeOption(String key, String value) {
68+
return options.remove(key, value);
69+
}
70+
71+
public boolean containsOption(String value) {
72+
return options.containsValue(value);
73+
}
74+
75+
public String removeOption(String key) {
76+
return options.remove(key);
77+
}
78+
79+
public String getOption(String key) {
80+
return options.get(key);
81+
}
82+
83+
public Set<String> getOptionKeySet() {
84+
return options.keySet();
85+
}
86+
87+
public Set<Map.Entry<String, String>> getOptions() {
88+
return options.entrySet();
89+
}
90+
91+
public boolean hasOption(String key) {
92+
return options.containsKey(key);
93+
}
94+
95+
public String getOptionOrDefault(String key, String defaultValue) {
96+
return options.getOrDefault(key, defaultValue);
97+
}
98+
4699
@Override
47100
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
48101
return statementVisitor.visit(this, context);
@@ -55,6 +108,20 @@ public void accept(StatementVisitor<?> statementVisitor) {
55108

56109
@Override
57110
public String toString() {
58-
return "SESSION " + action + " " + (id != null ? id : "") + ";";
111+
StringBuilder builder =
112+
new StringBuilder("SESSION " + action + " " + (id != null ? id : ""));
113+
if (!options.isEmpty()) {
114+
builder.append(" WITH ");
115+
int i = 0;
116+
for (Map.Entry<String, String> e : options.entrySet()) {
117+
if (i++ > 0) {
118+
builder.append(", ");
119+
}
120+
builder.append(e.getKey()).append("=").append(e.getValue());
121+
}
122+
}
123+
builder.append(";");
124+
125+
return builder.toString();
59126
}
60127
}

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,6 +2091,7 @@ DeclareStatement Declare(): {
20912091

20922092
SessionStatement SessionStatement():
20932093
{
2094+
SessionStatement sessionsStatement;
20942095
Token actionToken;
20952096
Token idToken = null;
20962097
String id = null;
@@ -2133,12 +2134,30 @@ SessionStatement SessionStatement():
21332134
) { id += "." + idToken.image; }
21342135
)?
21352136
]
2136-
21372137
{
2138-
SessionStatement sessionsStatement = id!=null
2138+
sessionsStatement = id!=null
21392139
? new SessionStatement(actionToken.image, id)
21402140
: new SessionStatement(actionToken.image);
2141+
}
2142+
2143+
// options
2144+
[
2145+
LOOKAHEAD(2) <K_WITH>
2146+
idToken = <S_IDENTIFIER>
2147+
"="
2148+
( actionToken = <S_IDENTIFIER> | actionToken = <S_QUOTED_IDENTIFIER> | actionToken = <S_CHAR_LITERAL> | actionToken = <S_LONG> | actionToken = <K_TRUE> | actionToken = <K_FALSE> | actionToken = <K_ON> | actionToken = <K_OFF> | actionToken = <K_YES> | actionToken = <K_NO> )
2149+
{ sessionsStatement.putOption(idToken.image, actionToken.image ); }
2150+
2151+
(
2152+
","
2153+
idToken = <S_IDENTIFIER>
2154+
"="
2155+
( actionToken = <S_IDENTIFIER> | actionToken = <S_QUOTED_IDENTIFIER> | actionToken = <S_CHAR_LITERAL> | actionToken = <S_LONG> | actionToken = <K_TRUE> | actionToken = <K_FALSE> | actionToken = <K_ON> | actionToken = <K_OFF> | actionToken = <K_YES> | actionToken = <K_NO> )
2156+
{ sessionsStatement.putOption(idToken.image, actionToken.image ); }
2157+
)*
2158+
]
21412159

2160+
{
21422161
//linkAST(sessionsStatement,jjtThis);
21432162
return sessionsStatement;
21442163
}

src/test/java/net/sf/jsqlparser/statement/SessionStatementTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class SessionStatementTest {
2121
@ValueSource(strings = {
2222
"SESSION START 1234", "SESSION START", "SESSION APPLY 'test'", "SESSION APPLY",
2323
"SESSION DROP \"test\"", "SESSION DROP", "SESSION SHOW test", "SESSION SHOW",
24-
"SESSION DESCRIBE 1234", "SESSION DESCRIBE", "SESSION START unnamed.session1"
24+
"SESSION DESCRIBE 1234", "SESSION DESCRIBE", "SESSION START unnamed.session1",
25+
"SESSION START unnamed.session1 WITH persist=false,cleanup=on"
2526
})
2627
void testStartSession(String sqlStr) throws JSQLParserException {
2728
SessionStatement sessionStatement =

0 commit comments

Comments
 (0)