Skip to content

Commit 3f8a4d8

Browse files
authored
Support SELECT ON CHANGE STREAM privilege (#169)
* Implement SELECT ON CHANGE STREAM in GRANT/REVOKE * Update testdadta * Reorder
1 parent 72cd05c commit 3f8a4d8

10 files changed

+176
-2
lines changed

ast/ast.go

+13
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ type Privilege interface {
334334
}
335335

336336
func (PrivilegeOnTable) isPrivilege() {}
337+
func (SelectPrivilegeOnChangeStream) isPrivilege() {}
337338
func (SelectPrivilegeOnView) isPrivilege() {}
338339
func (ExecutePrivilegeOnTableFunction) isPrivilege() {}
339340
func (RolePrivilege) isPrivilege() {}
@@ -2492,6 +2493,18 @@ type DeletePrivilege struct {
24922493
Delete token.Pos // position of "DELETE" keyword
24932494
}
24942495

2496+
// SelectPrivilegeOnChangeStream is SELECT ON CHANGE STREAM privilege node in GRANT and REVOKE.
2497+
//
2498+
// SELECT ON CHANGE STREAM {{.Names | sqlJoin ", "}}
2499+
type SelectPrivilegeOnChangeStream struct {
2500+
// pos = Select
2501+
// end = Names[$].end
2502+
2503+
Select token.Pos
2504+
2505+
Names []*Ident // len(Names) > 0
2506+
}
2507+
24952508
// SelectPrivilegeOnView is SELECT ON VIEW privilege node in GRANT and REVOKE.
24962509
//
24972510
// SELECT ON VIEW {{.Names | sqlJoin ","}}

ast/pos.go

+3
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,9 @@ func (u *UpdatePrivilege) End() token.Pos {
874874
func (d *DeletePrivilege) Pos() token.Pos { return d.Delete }
875875
func (d *DeletePrivilege) End() token.Pos { return d.Delete + 6 }
876876

877+
func (p *SelectPrivilegeOnChangeStream) Pos() token.Pos { return p.Select }
878+
func (p *SelectPrivilegeOnChangeStream) End() token.Pos { return lastEnd(p.Names) }
879+
877880
func (s *SelectPrivilegeOnView) Pos() token.Pos { return s.Select }
878881
func (s *SelectPrivilegeOnView) End() token.Pos { return s.Names[len(s.Names)-1].End() }
879882

ast/sql.go

+4
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,10 @@ func (d *DeletePrivilege) SQL() string {
12061206
return "DELETE"
12071207
}
12081208

1209+
func (p *SelectPrivilegeOnChangeStream) SQL() string {
1210+
return "SELECT ON CHANGE STREAM " + sqlJoin(p.Names, ", ")
1211+
}
1212+
12091213
func (s *SelectPrivilegeOnView) SQL() string {
12101214
sql := "SELECT ON VIEW " + s.Names[0].SQL()
12111215
for _, v := range s.Names[1:] {

parser.go

+30-2
Original file line numberDiff line numberDiff line change
@@ -3237,9 +3237,12 @@ func (p *Parser) parsePrivilege() ast.Privilege {
32373237
if e := p.tryParseExecutePrivilegeOnTableFunction(); e != nil {
32383238
return e
32393239
}
3240-
if r := p.tryRolePrivilege(); r != nil {
3240+
if r := p.tryParseRolePrivilege(); r != nil {
32413241
return r
32423242
}
3243+
if c := p.tryParseSelectPrivilegeOnChangeStream(); c != nil {
3244+
return c
3245+
}
32433246
return p.parsePrivilegeOnTable()
32443247
}
32453248

@@ -3281,7 +3284,7 @@ func (p *Parser) tryParseExecutePrivilegeOnTableFunction() *ast.ExecutePrivilege
32813284
}
32823285
}
32833286

3284-
func (p *Parser) tryRolePrivilege() *ast.RolePrivilege {
3287+
func (p *Parser) tryParseRolePrivilege() *ast.RolePrivilege {
32853288
if !p.Token.IsKeywordLike("ROLE") {
32863289
return nil
32873290
}
@@ -3293,6 +3296,31 @@ func (p *Parser) tryRolePrivilege() *ast.RolePrivilege {
32933296
}
32943297
}
32953298

3299+
func (p *Parser) tryParseSelectPrivilegeOnChangeStream() *ast.SelectPrivilegeOnChangeStream {
3300+
if p.Token.Kind != "SELECT" {
3301+
return nil
3302+
}
3303+
lexer := p.Lexer.Clone()
3304+
pos := p.expect("SELECT").Pos
3305+
if p.Token.Kind != "ON" {
3306+
p.Lexer = lexer
3307+
return nil
3308+
}
3309+
p.expect("ON")
3310+
if !p.Token.IsKeywordLike("CHANGE") {
3311+
p.Lexer = lexer
3312+
return nil
3313+
}
3314+
p.expectKeywordLike("CHANGE")
3315+
p.expectKeywordLike("STREAM")
3316+
names := parseCommaSeparatedList(p, p.parseIdent)
3317+
3318+
return &ast.SelectPrivilegeOnChangeStream{
3319+
Select: pos,
3320+
Names: names,
3321+
}
3322+
}
3323+
32963324
func (p *Parser) parsePrivilegeOnTable() *ast.PrivilegeOnTable {
32973325
privileges := parseCommaSeparatedList(p, p.parseTablePrivilege)
32983326
p.expect("ON")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
GRANT SELECT ON CHANGE STREAM cs_name_one, cs_name_two TO ROLE hr_manager
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
REVOKE SELECT ON CHANGE STREAM cs_name_one, cs_name_two FROM ROLE hr_manager
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--- grant_change_stream_privilege.sql
2+
GRANT SELECT ON CHANGE STREAM cs_name_one, cs_name_two TO ROLE hr_manager
3+
--- AST
4+
&ast.Grant{
5+
Grant: 0,
6+
Privilege: &ast.SelectPrivilegeOnChangeStream{
7+
Select: 6,
8+
Names: []*ast.Ident{
9+
&ast.Ident{
10+
NamePos: 30,
11+
NameEnd: 41,
12+
Name: "cs_name_one",
13+
},
14+
&ast.Ident{
15+
NamePos: 43,
16+
NameEnd: 54,
17+
Name: "cs_name_two",
18+
},
19+
},
20+
},
21+
Roles: []*ast.Ident{
22+
&ast.Ident{
23+
NamePos: 63,
24+
NameEnd: 73,
25+
Name: "hr_manager",
26+
},
27+
},
28+
}
29+
30+
--- SQL
31+
GRANT SELECT ON CHANGE STREAM cs_name_one, cs_name_two TO ROLE hr_manager
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--- revoke_change_stream_privilege.sql
2+
REVOKE SELECT ON CHANGE STREAM cs_name_one, cs_name_two FROM ROLE hr_manager
3+
--- AST
4+
&ast.Revoke{
5+
Revoke: 0,
6+
Privilege: &ast.SelectPrivilegeOnChangeStream{
7+
Select: 7,
8+
Names: []*ast.Ident{
9+
&ast.Ident{
10+
NamePos: 31,
11+
NameEnd: 42,
12+
Name: "cs_name_one",
13+
},
14+
&ast.Ident{
15+
NamePos: 44,
16+
NameEnd: 55,
17+
Name: "cs_name_two",
18+
},
19+
},
20+
},
21+
Roles: []*ast.Ident{
22+
&ast.Ident{
23+
NamePos: 66,
24+
NameEnd: 76,
25+
Name: "hr_manager",
26+
},
27+
},
28+
}
29+
30+
--- SQL
31+
REVOKE SELECT ON CHANGE STREAM cs_name_one, cs_name_two FROM ROLE hr_manager
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--- grant_change_stream_privilege.sql
2+
GRANT SELECT ON CHANGE STREAM cs_name_one, cs_name_two TO ROLE hr_manager
3+
--- AST
4+
&ast.Grant{
5+
Grant: 0,
6+
Privilege: &ast.SelectPrivilegeOnChangeStream{
7+
Select: 6,
8+
Names: []*ast.Ident{
9+
&ast.Ident{
10+
NamePos: 30,
11+
NameEnd: 41,
12+
Name: "cs_name_one",
13+
},
14+
&ast.Ident{
15+
NamePos: 43,
16+
NameEnd: 54,
17+
Name: "cs_name_two",
18+
},
19+
},
20+
},
21+
Roles: []*ast.Ident{
22+
&ast.Ident{
23+
NamePos: 63,
24+
NameEnd: 73,
25+
Name: "hr_manager",
26+
},
27+
},
28+
}
29+
30+
--- SQL
31+
GRANT SELECT ON CHANGE STREAM cs_name_one, cs_name_two TO ROLE hr_manager
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--- revoke_change_stream_privilege.sql
2+
REVOKE SELECT ON CHANGE STREAM cs_name_one, cs_name_two FROM ROLE hr_manager
3+
--- AST
4+
&ast.Revoke{
5+
Revoke: 0,
6+
Privilege: &ast.SelectPrivilegeOnChangeStream{
7+
Select: 7,
8+
Names: []*ast.Ident{
9+
&ast.Ident{
10+
NamePos: 31,
11+
NameEnd: 42,
12+
Name: "cs_name_one",
13+
},
14+
&ast.Ident{
15+
NamePos: 44,
16+
NameEnd: 55,
17+
Name: "cs_name_two",
18+
},
19+
},
20+
},
21+
Roles: []*ast.Ident{
22+
&ast.Ident{
23+
NamePos: 66,
24+
NameEnd: 76,
25+
Name: "hr_manager",
26+
},
27+
},
28+
}
29+
30+
--- SQL
31+
REVOKE SELECT ON CHANGE STREAM cs_name_one, cs_name_two FROM ROLE hr_manager

0 commit comments

Comments
 (0)