Skip to content

Commit 8fdec64

Browse files
minleejaemj
authored andcommitted
feat(parser): model MySQL CREATE USER
1 parent 5c59b7b commit 8fdec64

11 files changed

Lines changed: 434 additions & 0 deletions

File tree

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
exports net.sf.jsqlparser.statement.create.sequence;
3434
exports net.sf.jsqlparser.statement.create.synonym;
3535
exports net.sf.jsqlparser.statement.create.table;
36+
exports net.sf.jsqlparser.statement.create.user;
3637
exports net.sf.jsqlparser.statement.create.view;
3738
exports net.sf.jsqlparser.statement.delete;
3839
exports net.sf.jsqlparser.statement.drop;

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
2424
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
2525
import net.sf.jsqlparser.statement.create.table.CreateTable;
26+
import net.sf.jsqlparser.statement.create.user.CreateUser;
2627
import net.sf.jsqlparser.statement.create.view.AlterView;
2728
import net.sf.jsqlparser.statement.create.view.CreateView;
2829
import net.sf.jsqlparser.statement.delete.Delete;
@@ -125,6 +126,12 @@ default void visit(CreateDatabase createDatabase) {
125126
this.visit(createDatabase, null);
126127
}
127128

129+
<S> T visit(CreateUser createUser, S context);
130+
131+
default void visit(CreateUser createUser) {
132+
this.visit(createUser, null);
133+
}
134+
128135
<S> T visit(CreateTable createTable, S context);
129136

130137
default void visit(CreateTable createTable) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
2828
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
2929
import net.sf.jsqlparser.statement.create.table.CreateTable;
30+
import net.sf.jsqlparser.statement.create.user.CreateUser;
3031
import net.sf.jsqlparser.statement.create.view.AlterView;
3132
import net.sf.jsqlparser.statement.create.view.CreateView;
3233
import net.sf.jsqlparser.statement.delete.Delete;
@@ -267,6 +268,11 @@ public <S> T visit(CreateDatabase createDatabase, S context) {
267268
return null;
268269
}
269270

271+
@Override
272+
public <S> T visit(CreateUser createUser, S context) {
273+
return null;
274+
}
275+
270276
@Override
271277
public <S> T visit(CreateTable createTable, S context) {
272278
return createTable.getTable().accept(fromItemVisitor, context);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.user;
11+
12+
import java.util.ArrayList;
13+
import java.util.Collection;
14+
import java.util.Collections;
15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
import net.sf.jsqlparser.statement.Statement;
18+
import net.sf.jsqlparser.statement.StatementVisitor;
19+
20+
/** MySQL {@code CREATE USER} statement with structured account and authentication data. */
21+
public class CreateUser implements Statement {
22+
23+
private boolean ifNotExists;
24+
private final List<UserAccount> accounts = new ArrayList<>();
25+
26+
public boolean isIfNotExists() {
27+
return ifNotExists;
28+
}
29+
30+
public void setIfNotExists(boolean ifNotExists) {
31+
this.ifNotExists = ifNotExists;
32+
}
33+
34+
public List<UserAccount> getAccounts() {
35+
return Collections.unmodifiableList(accounts);
36+
}
37+
38+
public void setAccounts(Collection<? extends UserAccount> accounts) {
39+
this.accounts.clear();
40+
if (accounts != null) {
41+
this.accounts.addAll(accounts);
42+
}
43+
}
44+
45+
@Override
46+
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
47+
return statementVisitor.visit(this, context);
48+
}
49+
50+
@Override
51+
public String toString() {
52+
return "CREATE USER " + (ifNotExists ? "IF NOT EXISTS " : "")
53+
+ accounts.stream().map(Object::toString).collect(Collectors.joining(", "));
54+
}
55+
56+
public CreateUser withIfNotExists(boolean ifNotExists) {
57+
setIfNotExists(ifNotExists);
58+
return this;
59+
}
60+
61+
public CreateUser withAccounts(Collection<? extends UserAccount> accounts) {
62+
setAccounts(accounts);
63+
return this;
64+
}
65+
66+
public CreateUser addAccounts(UserAccount... accounts) {
67+
Collections.addAll(this.accounts, accounts);
68+
return this;
69+
}
70+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.user;
11+
12+
import java.io.Serializable;
13+
import net.sf.jsqlparser.expression.StringValue;
14+
15+
/** A user and optional host together with its authentication clause. */
16+
public class UserAccount implements Serializable {
17+
18+
private StringValue user;
19+
private StringValue host;
20+
private UserAuthentication authentication;
21+
22+
public StringValue getUser() {
23+
return user;
24+
}
25+
26+
public void setUser(StringValue user) {
27+
this.user = user;
28+
}
29+
30+
public StringValue getHost() {
31+
return host;
32+
}
33+
34+
public void setHost(StringValue host) {
35+
this.host = host;
36+
}
37+
38+
public UserAuthentication getAuthentication() {
39+
return authentication;
40+
}
41+
42+
public void setAuthentication(UserAuthentication authentication) {
43+
this.authentication = authentication;
44+
}
45+
46+
@Override
47+
public String toString() {
48+
StringBuilder builder = new StringBuilder().append(user);
49+
if (host != null) {
50+
builder.append("@").append(host);
51+
}
52+
if (authentication != null) {
53+
builder.append(" ").append(authentication);
54+
}
55+
return builder.toString();
56+
}
57+
58+
public UserAccount withUser(StringValue user) {
59+
setUser(user);
60+
return this;
61+
}
62+
63+
public UserAccount withHost(StringValue host) {
64+
setHost(host);
65+
return this;
66+
}
67+
68+
public UserAccount withAuthentication(UserAuthentication authentication) {
69+
setAuthentication(authentication);
70+
return this;
71+
}
72+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.user;
11+
12+
import java.io.Serializable;
13+
import net.sf.jsqlparser.expression.StringValue;
14+
15+
/** Structured authentication clause of a MySQL user account. */
16+
public class UserAuthentication implements Serializable {
17+
18+
public enum Mode {
19+
BY_PASSWORD, BY_RANDOM_PASSWORD, WITH_PLUGIN, WITH_PLUGIN_BY_PASSWORD, WITH_PLUGIN_BY_RANDOM_PASSWORD, WITH_PLUGIN_AS_STRING
20+
}
21+
22+
private Mode mode;
23+
private String plugin;
24+
private StringValue credential;
25+
26+
public Mode getMode() {
27+
return mode;
28+
}
29+
30+
public void setMode(Mode mode) {
31+
this.mode = mode;
32+
}
33+
34+
public String getPlugin() {
35+
return plugin;
36+
}
37+
38+
public void setPlugin(String plugin) {
39+
this.plugin = plugin;
40+
}
41+
42+
public StringValue getCredential() {
43+
return credential;
44+
}
45+
46+
public void setCredential(StringValue credential) {
47+
this.credential = credential;
48+
}
49+
50+
@Override
51+
public String toString() {
52+
switch (mode) {
53+
case BY_PASSWORD:
54+
return "IDENTIFIED BY " + credential;
55+
case BY_RANDOM_PASSWORD:
56+
return "IDENTIFIED BY RANDOM PASSWORD";
57+
case WITH_PLUGIN:
58+
return "IDENTIFIED WITH " + plugin;
59+
case WITH_PLUGIN_BY_PASSWORD:
60+
return "IDENTIFIED WITH " + plugin + " BY " + credential;
61+
case WITH_PLUGIN_BY_RANDOM_PASSWORD:
62+
return "IDENTIFIED WITH " + plugin + " BY RANDOM PASSWORD";
63+
case WITH_PLUGIN_AS_STRING:
64+
return "IDENTIFIED WITH " + plugin + " AS " + credential;
65+
default:
66+
throw new IllegalStateException("Unsupported authentication mode: " + mode);
67+
}
68+
}
69+
70+
public UserAuthentication withMode(Mode mode) {
71+
setMode(mode);
72+
return this;
73+
}
74+
75+
public UserAuthentication withPlugin(String plugin) {
76+
setPlugin(plugin);
77+
return this;
78+
}
79+
80+
public UserAuthentication withCredential(StringValue credential) {
81+
setCredential(credential);
82+
return this;
83+
}
84+
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
105105
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
106106
import net.sf.jsqlparser.statement.create.table.CreateTable;
107+
import net.sf.jsqlparser.statement.create.user.CreateUser;
107108
import net.sf.jsqlparser.statement.create.view.AlterView;
108109
import net.sf.jsqlparser.statement.create.view.CreateView;
109110
import net.sf.jsqlparser.statement.delete.Delete;
@@ -1555,6 +1556,16 @@ public void visit(CreateDatabase createDatabase) {
15551556
StatementVisitor.super.visit(createDatabase);
15561557
}
15571558

1559+
@Override
1560+
public <S> Void visit(CreateUser createUser, S context) {
1561+
return null;
1562+
}
1563+
1564+
@Override
1565+
public void visit(CreateUser createUser) {
1566+
StatementVisitor.super.visit(createUser);
1567+
}
1568+
15581569
@Override
15591570
public <S> Void visit(CreateTable create, S context) {
15601571
visit(create.getTable(), null);

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
4949
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
5050
import net.sf.jsqlparser.statement.create.table.CreateTable;
51+
import net.sf.jsqlparser.statement.create.user.CreateUser;
5152
import net.sf.jsqlparser.statement.create.view.AlterView;
5253
import net.sf.jsqlparser.statement.create.view.CreateView;
5354
import net.sf.jsqlparser.statement.delete.Delete;
@@ -437,6 +438,12 @@ public <S> StringBuilder visit(CreateDatabase aThis, S context) {
437438
return builder;
438439
}
439440

441+
@Override
442+
public <S> StringBuilder visit(CreateUser createUser, S context) {
443+
builder.append(createUser);
444+
return builder;
445+
}
446+
440447
@Override
441448
public <S> StringBuilder visit(CreateSequence createSequence, S context) {
442449
new CreateSequenceDeParser(builder).deParse(createSequence);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
4747
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
4848
import net.sf.jsqlparser.statement.create.table.CreateTable;
49+
import net.sf.jsqlparser.statement.create.user.CreateUser;
4950
import net.sf.jsqlparser.statement.create.view.AlterView;
5051
import net.sf.jsqlparser.statement.create.view.CreateView;
5152
import net.sf.jsqlparser.statement.delete.Delete;
@@ -307,6 +308,11 @@ public <S> Void visit(CreateDatabase aThis, S context) {
307308
return null;
308309
}
309310

311+
@Override
312+
public <S> Void visit(CreateUser createUser, S context) {
313+
return null;
314+
}
315+
310316
@Override
311317
public <S> Void visit(CreateSequence createSequence, S context) {
312318
getValidator(CreateSequenceValidator.class).validate(createSequence);
@@ -539,6 +545,10 @@ public void visit(CreateSchema aThis) {
539545
visit(aThis, null);
540546
}
541547

548+
public void visit(CreateUser createUser) {
549+
visit(createUser, null);
550+
}
551+
542552
public void visit(CreateSequence createSequence) {
543553
visit(createSequence, null);
544554
}

0 commit comments

Comments
 (0)