Skip to content

Commit fa21512

Browse files
committed
added Oracle GRANT statement
1 parent f3ecdcb commit fa21512

File tree

8 files changed

+311
-0
lines changed

8 files changed

+311
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.sf.jsqlparser.statement.delete.Delete;
2020
import net.sf.jsqlparser.statement.drop.Drop;
2121
import net.sf.jsqlparser.statement.execute.Execute;
22+
import net.sf.jsqlparser.statement.grant.Grant;
2223
import net.sf.jsqlparser.statement.insert.Insert;
2324
import net.sf.jsqlparser.statement.merge.Merge;
2425
import net.sf.jsqlparser.statement.replace.Replace;
@@ -85,4 +86,6 @@ public interface StatementVisitor {
8586
public void visit(ShowStatement aThis);
8687

8788
public void visit(DeclareStatement aThis);
89+
90+
void visit(Grant grant);
8891
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.sf.jsqlparser.statement.delete.Delete;
2020
import net.sf.jsqlparser.statement.drop.Drop;
2121
import net.sf.jsqlparser.statement.execute.Execute;
22+
import net.sf.jsqlparser.statement.grant.Grant;
2223
import net.sf.jsqlparser.statement.insert.Insert;
2324
import net.sf.jsqlparser.statement.merge.Merge;
2425
import net.sf.jsqlparser.statement.replace.Replace;
@@ -160,4 +161,8 @@ public void visit(ShowStatement aThis) {
160161
@Override
161162
public void visit(DeclareStatement aThis) {
162163
}
164+
165+
@Override
166+
public void visit(Grant grant) {
167+
}
163168
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.grant;
11+
12+
import net.sf.jsqlparser.statement.Statement;
13+
import net.sf.jsqlparser.statement.StatementVisitor;
14+
15+
import java.util.List;
16+
17+
public class Grant implements Statement {
18+
19+
private String role;
20+
private List<String> privileges;
21+
private String objectName;
22+
private List<String> users;
23+
24+
@Override
25+
public void accept(StatementVisitor statementVisitor) {
26+
statementVisitor.visit(this);
27+
}
28+
29+
public String getRole() {
30+
return role;
31+
}
32+
33+
public void setRole(String role) {
34+
this.role = role;
35+
}
36+
37+
public List<String> getPrivileges() {
38+
return privileges;
39+
}
40+
41+
public void setPrivileges(List<String> privileges) {
42+
this.privileges = privileges;
43+
}
44+
45+
public String getObjectName() {
46+
return objectName;
47+
}
48+
49+
public void setObjectName(String objectName) {
50+
this.objectName = objectName;
51+
}
52+
53+
public List<String> getUsers() {
54+
return users;
55+
}
56+
57+
public void setUsers(List<String> users) {
58+
this.users = users;
59+
}
60+
61+
@Override
62+
public String toString() {
63+
StringBuilder buffer = new StringBuilder();
64+
65+
buffer.append("GRANT ");
66+
if (role != null) {
67+
buffer.append(role);
68+
} else {
69+
for (int i = 0; i < getPrivileges().size(); i++) {
70+
if (i != 0) {
71+
buffer.append(", ");
72+
}
73+
buffer.append(privileges.get(i));
74+
}
75+
buffer.append(" ON ");
76+
buffer.append(getObjectName());
77+
}
78+
buffer.append(" TO ");
79+
for (int i = 0; i < getUsers().size(); i++) {
80+
if (i != 0) {
81+
buffer.append(", ");
82+
}
83+
buffer.append(users.get(i));
84+
}
85+
return buffer.toString();
86+
}
87+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import net.sf.jsqlparser.statement.delete.Delete;
7979
import net.sf.jsqlparser.statement.drop.Drop;
8080
import net.sf.jsqlparser.statement.execute.Execute;
81+
import net.sf.jsqlparser.statement.grant.Grant;
8182
import net.sf.jsqlparser.statement.insert.Insert;
8283
import net.sf.jsqlparser.statement.merge.Merge;
8384
import net.sf.jsqlparser.statement.replace.Replace;
@@ -862,6 +863,11 @@ public void visit(SimilarToExpression expr) {
862863
public void visit(DeclareStatement aThis) {
863864
}
864865

866+
@Override
867+
public void visit(Grant grant) {
868+
869+
}
870+
865871
@Override
866872
public void visit(ArrayExpression array) {
867873
array.getObjExpression().accept(this);
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.util.deparser;
11+
12+
import net.sf.jsqlparser.statement.grant.Grant;
13+
14+
import java.util.Iterator;
15+
16+
public class GrantDeParser {
17+
protected StringBuilder buffer;
18+
19+
public GrantDeParser(StringBuilder buffer) {
20+
this.buffer = buffer;
21+
}
22+
23+
public void deParse(Grant grant) {
24+
buffer.append("GRANT ");
25+
if (grant.getRole() != null) {
26+
buffer.append(grant.getRole());
27+
} else {
28+
for (Iterator<String> iter = grant.getPrivileges().iterator(); iter.hasNext(); ) {
29+
String privilege = iter.next();
30+
buffer.append(privilege);
31+
if (iter.hasNext()) {
32+
buffer.append(", ");
33+
}
34+
}
35+
buffer.append(" ON ");
36+
buffer.append(grant.getObjectName());
37+
}
38+
buffer.append(" TO ");
39+
for (Iterator<String> iter = grant.getUsers().iterator(); iter.hasNext(); ) {
40+
String user = iter.next();
41+
buffer.append(user);
42+
if (iter.hasNext()) {
43+
buffer.append(", ");
44+
}
45+
}
46+
}
47+
48+
public StringBuilder getBuffer() {
49+
return buffer;
50+
}
51+
52+
public void setBuffer(StringBuilder buffer) {
53+
this.buffer = buffer;
54+
}
55+
56+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import net.sf.jsqlparser.statement.delete.Delete;
3333
import net.sf.jsqlparser.statement.drop.Drop;
3434
import net.sf.jsqlparser.statement.execute.Execute;
35+
import net.sf.jsqlparser.statement.grant.Grant;
3536
import net.sf.jsqlparser.statement.insert.Insert;
3637
import net.sf.jsqlparser.statement.merge.Merge;
3738
import net.sf.jsqlparser.statement.replace.Replace;
@@ -276,6 +277,12 @@ public void visit(DeclareStatement declare) {
276277
new DeclareStatementDeParser(expressionDeParser, buffer).deParse(declare);
277278
}
278279

280+
@Override
281+
public void visit(Grant grant) {
282+
GrantDeParser grantDeParser = new GrantDeParser(buffer);
283+
grantDeParser.deParse(grant);
284+
}
285+
279286
@Override
280287
public void visit(CreateSchema aThis) {
281288
buffer.append(aThis.toString());

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

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import net.sf.jsqlparser.statement.update.*;
5353
import net.sf.jsqlparser.statement.upsert.*;
5454
import net.sf.jsqlparser.statement.merge.*;
5555
import net.sf.jsqlparser.statement.values.*;
56+
import net.sf.jsqlparser.statement.grant.*;
5657
import java.util.*;
5758

5859
/**
@@ -144,6 +145,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
144145
| <K_COLLATE:"COLLATE">
145146
| <K_COLUMN:"COLUMN">
146147
| <K_COLUMNS:"COLUMNS">
148+
| <K_COMMA: ",">
147149
| <K_COMMIT:"COMMIT">
148150
| <K_COMMENT:"COMMENT">
149151
| <K_CONNECT:"CONNECT">
@@ -189,6 +191,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
189191
| <K_FROM:"FROM">
190192
| <K_FULL:"FULL">
191193
| <K_FULLTEXT:"FULLTEXT">
194+
| <K_GRANT:"GRANT">
192195
| <K_GROUP:"GROUP">
193196
| <K_GROUPING:"GROUPING">
194197
| <K_GROUP_CONCAT:"GROUP_CONCAT">
@@ -468,6 +471,8 @@ Statement SingleStatement() :
468471
stm = Explain()
469472
|
470473
stm = Declare()
474+
|
475+
stm = Grant()
471476
)
472477
{ return stm; }
473478
} catch (ParseException e) {
@@ -579,6 +584,8 @@ DeclareStatement Declare(): {
579584
}
580585
}
581586

587+
588+
582589
SetStatement Set(): {
583590
String name;
584591
Expression value;
@@ -4564,3 +4571,60 @@ Comment Comment():
45644571
return result;
45654572
}
45664573
}
4574+
4575+
Grant Grant():
4576+
{
4577+
Grant grant = new Grant();
4578+
ArrayList<String> privileges = new ArrayList<String>();
4579+
List<String> users;
4580+
Token tk = null;
4581+
}
4582+
{
4583+
<K_GRANT>
4584+
(
4585+
(
4586+
[readGrantTypes(privileges) (<K_COMMA> readGrantTypes(privileges))*]
4587+
<K_ON>
4588+
(
4589+
tk=<S_IDENTIFIER> { grant.setObjectName(tk.image); }
4590+
)
4591+
)
4592+
|
4593+
(
4594+
tk=<S_IDENTIFIER> { grant.setRole(tk.image); }
4595+
)
4596+
)
4597+
<K_TO> (users = UsersList() {grant.setUsers(users);})
4598+
{
4599+
if(privileges.size() > 0) {
4600+
grant.setPrivileges(privileges);
4601+
}
4602+
return grant;
4603+
}
4604+
}
4605+
4606+
List<String> UsersList():
4607+
{
4608+
List<String> users = new ArrayList<String>();
4609+
String user = null;
4610+
}
4611+
{
4612+
user=RelObjectName() { users.add(user); }
4613+
( "," user=ColumnsNamesListItem() { users.add(user); } )*
4614+
{
4615+
return users;
4616+
}
4617+
}
4618+
4619+
void readGrantTypes(ArrayList<String> privileges):
4620+
{
4621+
}
4622+
{
4623+
<K_SELECT> {privileges.add("SELECT");} |
4624+
<K_INSERT> {privileges.add("INSERT");} |
4625+
<K_UPDATE> {privileges.add("UPDATE");} |
4626+
<K_DELETE> {privileges.add("DELETE");} |
4627+
<K_EXECUTE> {privileges.add("EXECUTE");} |
4628+
<K_ALTER> {privileges.add("ALTER");} |
4629+
<K_DROP> {privileges.add("DROP");}
4630+
}

0 commit comments

Comments
 (0)