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 @@ -33,6 +33,7 @@
exports net.sf.jsqlparser.statement.create.sequence;
exports net.sf.jsqlparser.statement.create.synonym;
exports net.sf.jsqlparser.statement.create.table;
exports net.sf.jsqlparser.statement.create.user;
exports net.sf.jsqlparser.statement.create.view;
exports net.sf.jsqlparser.statement.delete;
exports net.sf.jsqlparser.statement.drop;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand Down Expand Up @@ -125,6 +126,12 @@ default void visit(CreateDatabase createDatabase) {
this.visit(createDatabase, null);
}

<S> T visit(CreateUser createUser, S context);

default void visit(CreateUser createUser) {
this.visit(createUser, null);
}

<S> T visit(CreateTable createTable, S context);

default void visit(CreateTable createTable) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand Down Expand Up @@ -267,6 +268,11 @@ public <S> T visit(CreateDatabase createDatabase, S context) {
return null;
}

@Override
public <S> T visit(CreateUser createUser, S context) {
return null;
}

@Override
public <S> T visit(CreateTable createTable, S context) {
return createTable.getTable().accept(fromItemVisitor, context);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement.create.user;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

/** MySQL {@code CREATE USER} statement with structured account and authentication data. */
public class CreateUser implements Statement {

private boolean ifNotExists;
private final List<UserAccount> accounts = new ArrayList<>();

public boolean isIfNotExists() {
return ifNotExists;
}

public void setIfNotExists(boolean ifNotExists) {
this.ifNotExists = ifNotExists;
}

public List<UserAccount> getAccounts() {
return Collections.unmodifiableList(accounts);
}

public void setAccounts(Collection<? extends UserAccount> accounts) {
this.accounts.clear();
if (accounts != null) {
this.accounts.addAll(accounts);
}
}

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

@Override
public String toString() {
return "CREATE USER " + (ifNotExists ? "IF NOT EXISTS " : "")
+ accounts.stream().map(Object::toString).collect(Collectors.joining(", "));
}

public CreateUser withIfNotExists(boolean ifNotExists) {
setIfNotExists(ifNotExists);
return this;
}

public CreateUser withAccounts(Collection<? extends UserAccount> accounts) {
setAccounts(accounts);
return this;
}

public CreateUser addAccounts(UserAccount... accounts) {
Collections.addAll(this.accounts, accounts);
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement.create.user;

import java.io.Serializable;
import net.sf.jsqlparser.expression.StringValue;

/** A user and optional host together with its authentication clause. */
public class UserAccount implements Serializable {

private StringValue user;
private StringValue host;
private UserAuthentication authentication;

public StringValue getUser() {
return user;
}

public void setUser(StringValue user) {
this.user = user;
}

public StringValue getHost() {
return host;
}

public void setHost(StringValue host) {
this.host = host;
}

public UserAuthentication getAuthentication() {
return authentication;
}

public void setAuthentication(UserAuthentication authentication) {
this.authentication = authentication;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder().append(user);
if (host != null) {
builder.append("@").append(host);
}
if (authentication != null) {
builder.append(" ").append(authentication);
}
return builder.toString();
}

public UserAccount withUser(StringValue user) {
setUser(user);
return this;
}

public UserAccount withHost(StringValue host) {
setHost(host);
return this;
}

public UserAccount withAuthentication(UserAuthentication authentication) {
setAuthentication(authentication);
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement.create.user;

import java.io.Serializable;
import net.sf.jsqlparser.expression.StringValue;

/** Structured authentication clause of a MySQL user account. */
public class UserAuthentication implements Serializable {

public enum Mode {
BY_PASSWORD, BY_RANDOM_PASSWORD, WITH_PLUGIN, WITH_PLUGIN_BY_PASSWORD, WITH_PLUGIN_BY_RANDOM_PASSWORD, WITH_PLUGIN_AS_STRING
}

private Mode mode;
private String plugin;
private StringValue credential;

public Mode getMode() {
return mode;
}

public void setMode(Mode mode) {
this.mode = mode;
}

public String getPlugin() {
return plugin;
}

public void setPlugin(String plugin) {
this.plugin = plugin;
}

public StringValue getCredential() {
return credential;
}

public void setCredential(StringValue credential) {
this.credential = credential;
}

@Override
public String toString() {
switch (mode) {
case BY_PASSWORD:
return "IDENTIFIED BY " + credential;
case BY_RANDOM_PASSWORD:
return "IDENTIFIED BY RANDOM PASSWORD";
case WITH_PLUGIN:
return "IDENTIFIED WITH " + plugin;
case WITH_PLUGIN_BY_PASSWORD:
return "IDENTIFIED WITH " + plugin + " BY " + credential;
case WITH_PLUGIN_BY_RANDOM_PASSWORD:
return "IDENTIFIED WITH " + plugin + " BY RANDOM PASSWORD";
case WITH_PLUGIN_AS_STRING:
return "IDENTIFIED WITH " + plugin + " AS " + credential;
default:
throw new IllegalStateException("Unsupported authentication mode: " + mode);
}
}

public UserAuthentication withMode(Mode mode) {
setMode(mode);
return this;
}

public UserAuthentication withPlugin(String plugin) {
setPlugin(plugin);
return this;
}

public UserAuthentication withCredential(StringValue credential) {
setCredential(credential);
return this;
}
}
11 changes: 11 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand Down Expand Up @@ -1555,6 +1556,16 @@ public void visit(CreateDatabase createDatabase) {
StatementVisitor.super.visit(createDatabase);
}

@Override
public <S> Void visit(CreateUser createUser, S context) {
return null;
}

@Override
public void visit(CreateUser createUser) {
StatementVisitor.super.visit(createUser);
}

@Override
public <S> Void visit(CreateTable create, S context) {
visit(create.getTable(), null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand Down Expand Up @@ -437,6 +438,12 @@ public <S> StringBuilder visit(CreateDatabase aThis, S context) {
return builder;
}

@Override
public <S> StringBuilder visit(CreateUser createUser, S context) {
builder.append(createUser);
return builder;
}

@Override
public <S> StringBuilder visit(CreateSequence createSequence, S context) {
new CreateSequenceDeParser(builder).deParse(createSequence);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand Down Expand Up @@ -307,6 +308,11 @@ public <S> Void visit(CreateDatabase aThis, S context) {
return null;
}

@Override
public <S> Void visit(CreateUser createUser, S context) {
return null;
}

@Override
public <S> Void visit(CreateSequence createSequence, S context) {
getValidator(CreateSequenceValidator.class).validate(createSequence);
Expand Down Expand Up @@ -539,6 +545,10 @@ public void visit(CreateSchema aThis) {
visit(aThis, null);
}

public void visit(CreateUser createUser) {
visit(createUser, null);
}

public void visit(CreateSequence createSequence) {
visit(createSequence, null);
}
Expand Down
Loading
Loading