Skip to content

Commit 5e19d5c

Browse files
authored
fix(plsql): reorder grant/revoke alternatives to prioritize object_privilege (#46)
Done. I made two changes to `parser/plsql/PlSqlParser.g4`: 1. **`grant_statement` (line 2399-2406)**: Reordered the alternatives so `object_privilege` is checked first, then `system_privilege`, then `role_name`. Previously `role_name` was first, which caused keywords like `DELETE` to be incorrectly recognized as role names instead of object privileges. 2. **`revoke_statement` (line 2420-2422)**: Reordered to try `revoke_object_privileges` before `revoke_system_privilege`. This ensures that the more specific rule (with ON clause) is tried first. The parser builds successfully and all tests pass.
1 parent c815337 commit 5e19d5c

2 files changed

Lines changed: 54 additions & 54 deletions

File tree

plsql/PlSqlParser.g4

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2399,9 +2399,9 @@ rename_object
23992399
grant_statement
24002400
: GRANT
24012401
( COMMA?
2402-
(role_name
2402+
(object_privilege paren_column_list?
24032403
| system_privilege
2404-
| object_privilege paren_column_list?
2404+
| role_name
24052405
)
24062406
)+
24072407
(ON grant_object_name)?
@@ -2418,7 +2418,7 @@ container_clause
24182418

24192419
// https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/REVOKE.html
24202420
revoke_statement
2421-
: REVOKE ((revoke_system_privilege | revoke_object_privileges) container_clause? | revoke_roles_from_programs)
2421+
: REVOKE ((revoke_object_privileges | revoke_system_privilege) container_clause? | revoke_roles_from_programs)
24222422
;
24232423

24242424
revoke_system_privilege

plsql/plsql_parser.go

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2257,7 +2257,7 @@ func plsqlparserParserInit() {
22572257
8, 371, 3, 371, 7967, 8, 371, 1, 371, 1, 371, 3, 371, 7971, 8, 371, 1,
22582258
371, 3, 371, 7974, 8, 371, 1, 371, 3, 371, 7977, 8, 371, 1, 372, 1, 372,
22592259
1, 372, 1, 372, 1, 372, 1, 372, 1, 373, 1, 373, 3, 373, 7987, 8, 373, 1,
2260-
373, 1, 373, 1, 373, 1, 373, 3, 373, 7993, 8, 373, 3, 373, 7995, 8, 373,
2260+
373, 1, 373, 3, 373, 7991, 8, 373, 1, 373, 1, 373, 3, 373, 7995, 8, 373,
22612261
4, 373, 7997, 8, 373, 11, 373, 12, 373, 7998, 1, 373, 1, 373, 3, 373, 8003,
22622262
8, 373, 1, 373, 1, 373, 1, 373, 3, 373, 8008, 8, 373, 1, 373, 1, 373, 1,
22632263
373, 3, 373, 8013, 8, 373, 5, 373, 8015, 8, 373, 10, 373, 12, 373, 8018,
@@ -6947,11 +6947,11 @@ func plsqlparserParserInit() {
69476947
0, 0, 7979, 7980, 3, 722, 361, 0, 7980, 7981, 5, 2029, 0, 0, 7981, 7982,
69486948
3, 722, 361, 0, 7982, 7983, 5, 2396, 0, 0, 7983, 745, 1, 0, 0, 0, 7984,
69496949
7996, 5, 591, 0, 0, 7985, 7987, 5, 2382, 0, 0, 7986, 7985, 1, 0, 0, 0,
6950-
7986, 7987, 1, 0, 0, 0, 7987, 7994, 1, 0, 0, 0, 7988, 7995, 3, 2236, 1118,
6951-
0, 7989, 7995, 3, 2318, 1159, 0, 7990, 7992, 3, 2316, 1158, 0, 7991, 7993,
6952-
3, 2286, 1143, 0, 7992, 7991, 1, 0, 0, 0, 7992, 7993, 1, 0, 0, 0, 7993,
6953-
7995, 1, 0, 0, 0, 7994, 7988, 1, 0, 0, 0, 7994, 7989, 1, 0, 0, 0, 7994,
6954-
7990, 1, 0, 0, 0, 7995, 7997, 1, 0, 0, 0, 7996, 7986, 1, 0, 0, 0, 7997,
6950+
7986, 7987, 1, 0, 0, 0, 7987, 7994, 1, 0, 0, 0, 7988, 7990, 3, 2316, 1158,
6951+
0, 7989, 7991, 3, 2286, 1143, 0, 7990, 7989, 1, 0, 0, 0, 7990, 7991, 1,
6952+
0, 0, 0, 7991, 7995, 1, 0, 0, 0, 7992, 7995, 3, 2318, 1159, 0, 7993, 7995,
6953+
3, 2236, 1118, 0, 7994, 7988, 1, 0, 0, 0, 7994, 7992, 1, 0, 0, 0, 7994,
6954+
7993, 1, 0, 0, 0, 7995, 7997, 1, 0, 0, 0, 7996, 7986, 1, 0, 0, 0, 7997,
69556955
7998, 1, 0, 0, 0, 7998, 7996, 1, 0, 0, 0, 7998, 7999, 1, 0, 0, 0, 7999,
69566956
8002, 1, 0, 0, 0, 8000, 8001, 5, 1175, 0, 0, 8001, 8003, 3, 2282, 1141,
69576957
0, 8002, 8000, 1, 0, 0, 0, 8002, 8003, 1, 0, 0, 0, 8003, 8004, 1, 0, 0,
@@ -6971,7 +6971,7 @@ func plsqlparserParserInit() {
69716971
1, 0, 0, 0, 8035, 8036, 1, 0, 0, 0, 8036, 8037, 1, 0, 0, 0, 8037, 8038,
69726972
5, 2396, 0, 0, 8038, 747, 1, 0, 0, 0, 8039, 8040, 5, 270, 0, 0, 8040, 8041,
69736973
5, 2398, 0, 0, 8041, 8042, 7, 72, 0, 0, 8042, 749, 1, 0, 0, 0, 8043, 8052,
6974-
5, 1490, 0, 0, 8044, 8047, 3, 752, 376, 0, 8045, 8047, 3, 756, 378, 0,
6974+
5, 1490, 0, 0, 8044, 8047, 3, 756, 378, 0, 8045, 8047, 3, 752, 376, 0,
69756975
8046, 8044, 1, 0, 0, 0, 8046, 8045, 1, 0, 0, 0, 8047, 8049, 1, 0, 0, 0,
69766976
8048, 8050, 3, 748, 374, 0, 8049, 8048, 1, 0, 0, 0, 8049, 8050, 1, 0, 0,
69776977
0, 8050, 8053, 1, 0, 0, 0, 8051, 8053, 3, 760, 380, 0, 8052, 8046, 1, 0,
@@ -12632,7 +12632,7 @@ func plsqlparserParserInit() {
1263212632
7757, 7766, 7774, 7781, 7788, 7793, 7800, 7807, 7812, 7819, 7826, 7831,
1263312633
7838, 7845, 7850, 7857, 7864, 7869, 7872, 7875, 7882, 7886, 7895, 7906,
1263412634
7915, 7919, 7926, 7928, 7935, 7943, 7948, 7952, 7957, 7964, 7966, 7970,
12635-
7973, 7976, 7986, 7992, 7994, 7998, 8002, 8007, 8012, 8016, 8022, 8027,
12635+
7973, 7976, 7986, 7990, 7994, 7998, 8002, 8007, 8012, 8016, 8022, 8027,
1263612636
8032, 8035, 8046, 8049, 8052, 8058, 8065, 8070, 8074, 8080, 8082, 8088,
1263712637
8090, 8094, 8103, 8109, 8118, 8130, 8138, 8147, 8150, 8157, 8161, 8169,
1263812638
8176, 8186, 8191, 8193, 8198, 8205, 8222, 8229, 8239, 8248, 8257, 8266,
@@ -119269,12 +119269,12 @@ type IGrant_statementContext interface {
119269119269
Container_clause() IContainer_clauseContext
119270119270
ADMIN() antlr.TerminalNode
119271119271
DELEGATE() antlr.TerminalNode
119272-
AllRole_name() []IRole_nameContext
119273-
Role_name(i int) IRole_nameContext
119274-
AllSystem_privilege() []ISystem_privilegeContext
119275-
System_privilege(i int) ISystem_privilegeContext
119276119272
AllObject_privilege() []IObject_privilegeContext
119277119273
Object_privilege(i int) IObject_privilegeContext
119274+
AllSystem_privilege() []ISystem_privilegeContext
119275+
System_privilege(i int) ISystem_privilegeContext
119276+
AllRole_name() []IRole_nameContext
119277+
Role_name(i int) IRole_nameContext
119278119278
AllParen_column_list() []IParen_column_listContext
119279119279
Paren_column_list(i int) IParen_column_listContext
119280119280

@@ -119451,32 +119451,32 @@ func (s *Grant_statementContext) DELEGATE() antlr.TerminalNode {
119451119451
return s.GetToken(PlSqlParserDELEGATE, 0)
119452119452
}
119453119453

119454-
func (s *Grant_statementContext) AllRole_name() []IRole_nameContext {
119454+
func (s *Grant_statementContext) AllObject_privilege() []IObject_privilegeContext {
119455119455
children := s.GetChildren()
119456119456
len := 0
119457119457
for _, ctx := range children {
119458-
if _, ok := ctx.(IRole_nameContext); ok {
119458+
if _, ok := ctx.(IObject_privilegeContext); ok {
119459119459
len++
119460119460
}
119461119461
}
119462119462

119463-
tst := make([]IRole_nameContext, len)
119463+
tst := make([]IObject_privilegeContext, len)
119464119464
i := 0
119465119465
for _, ctx := range children {
119466-
if t, ok := ctx.(IRole_nameContext); ok {
119467-
tst[i] = t.(IRole_nameContext)
119466+
if t, ok := ctx.(IObject_privilegeContext); ok {
119467+
tst[i] = t.(IObject_privilegeContext)
119468119468
i++
119469119469
}
119470119470
}
119471119471

119472119472
return tst
119473119473
}
119474119474

119475-
func (s *Grant_statementContext) Role_name(i int) IRole_nameContext {
119475+
func (s *Grant_statementContext) Object_privilege(i int) IObject_privilegeContext {
119476119476
var t antlr.RuleContext
119477119477
j := 0
119478119478
for _, ctx := range s.GetChildren() {
119479-
if _, ok := ctx.(IRole_nameContext); ok {
119479+
if _, ok := ctx.(IObject_privilegeContext); ok {
119480119480
if j == i {
119481119481
t = ctx.(antlr.RuleContext)
119482119482
break
@@ -119489,7 +119489,7 @@ func (s *Grant_statementContext) Role_name(i int) IRole_nameContext {
119489119489
return nil
119490119490
}
119491119491

119492-
return t.(IRole_nameContext)
119492+
return t.(IObject_privilegeContext)
119493119493
}
119494119494

119495119495
func (s *Grant_statementContext) AllSystem_privilege() []ISystem_privilegeContext {
@@ -119533,32 +119533,32 @@ func (s *Grant_statementContext) System_privilege(i int) ISystem_privilegeContex
119533119533
return t.(ISystem_privilegeContext)
119534119534
}
119535119535

119536-
func (s *Grant_statementContext) AllObject_privilege() []IObject_privilegeContext {
119536+
func (s *Grant_statementContext) AllRole_name() []IRole_nameContext {
119537119537
children := s.GetChildren()
119538119538
len := 0
119539119539
for _, ctx := range children {
119540-
if _, ok := ctx.(IObject_privilegeContext); ok {
119540+
if _, ok := ctx.(IRole_nameContext); ok {
119541119541
len++
119542119542
}
119543119543
}
119544119544

119545-
tst := make([]IObject_privilegeContext, len)
119545+
tst := make([]IRole_nameContext, len)
119546119546
i := 0
119547119547
for _, ctx := range children {
119548-
if t, ok := ctx.(IObject_privilegeContext); ok {
119549-
tst[i] = t.(IObject_privilegeContext)
119548+
if t, ok := ctx.(IRole_nameContext); ok {
119549+
tst[i] = t.(IRole_nameContext)
119550119550
i++
119551119551
}
119552119552
}
119553119553

119554119554
return tst
119555119555
}
119556119556

119557-
func (s *Grant_statementContext) Object_privilege(i int) IObject_privilegeContext {
119557+
func (s *Grant_statementContext) Role_name(i int) IRole_nameContext {
119558119558
var t antlr.RuleContext
119559119559
j := 0
119560119560
for _, ctx := range s.GetChildren() {
119561-
if _, ok := ctx.(IObject_privilegeContext); ok {
119561+
if _, ok := ctx.(IRole_nameContext); ok {
119562119562
if j == i {
119563119563
t = ctx.(antlr.RuleContext)
119564119564
break
@@ -119571,7 +119571,7 @@ func (s *Grant_statementContext) Object_privilege(i int) IObject_privilegeContex
119571119571
return nil
119572119572
}
119573119573

119574-
return t.(IObject_privilegeContext)
119574+
return t.(IRole_nameContext)
119575119575
}
119576119576

119577119577
func (s *Grant_statementContext) AllParen_column_list() []IParen_column_listContext {
@@ -119698,21 +119698,9 @@ func (p *PlSqlParser) Grant_statement() (localctx IGrant_statementContext) {
119698119698
case 1:
119699119699
{
119700119700
p.SetState(7988)
119701-
p.Role_name()
119702-
}
119703-
119704-
case 2:
119705-
{
119706-
p.SetState(7989)
119707-
p.System_privilege()
119708-
}
119709-
119710-
case 3:
119711-
{
119712-
p.SetState(7990)
119713119701
p.Object_privilege()
119714119702
}
119715-
p.SetState(7992)
119703+
p.SetState(7990)
119716119704
p.GetErrorHandler().Sync(p)
119717119705
if p.HasError() {
119718119706
goto errorExit
@@ -119721,12 +119709,24 @@ func (p *PlSqlParser) Grant_statement() (localctx IGrant_statementContext) {
119721119709

119722119710
if _la == PlSqlParserLEFT_PAREN {
119723119711
{
119724-
p.SetState(7991)
119712+
p.SetState(7989)
119725119713
p.Paren_column_list()
119726119714
}
119727119715

119728119716
}
119729119717

119718+
case 2:
119719+
{
119720+
p.SetState(7992)
119721+
p.System_privilege()
119722+
}
119723+
119724+
case 3:
119725+
{
119726+
p.SetState(7993)
119727+
p.Role_name()
119728+
}
119729+
119730119730
case antlr.ATNInvalidAltNumber:
119731119731
goto errorExit
119732119732
}
@@ -120138,8 +120138,8 @@ type IRevoke_statementContext interface {
120138120138
// Getter signatures
120139120139
REVOKE() antlr.TerminalNode
120140120140
Revoke_roles_from_programs() IRevoke_roles_from_programsContext
120141-
Revoke_system_privilege() IRevoke_system_privilegeContext
120142120141
Revoke_object_privileges() IRevoke_object_privilegesContext
120142+
Revoke_system_privilege() IRevoke_system_privilegeContext
120143120143
Container_clause() IContainer_clauseContext
120144120144

120145120145
// IsRevoke_statementContext differentiates from other interfaces.
@@ -120198,10 +120198,10 @@ func (s *Revoke_statementContext) Revoke_roles_from_programs() IRevoke_roles_fro
120198120198
return t.(IRevoke_roles_from_programsContext)
120199120199
}
120200120200

120201-
func (s *Revoke_statementContext) Revoke_system_privilege() IRevoke_system_privilegeContext {
120201+
func (s *Revoke_statementContext) Revoke_object_privileges() IRevoke_object_privilegesContext {
120202120202
var t antlr.RuleContext
120203120203
for _, ctx := range s.GetChildren() {
120204-
if _, ok := ctx.(IRevoke_system_privilegeContext); ok {
120204+
if _, ok := ctx.(IRevoke_object_privilegesContext); ok {
120205120205
t = ctx.(antlr.RuleContext)
120206120206
break
120207120207
}
@@ -120211,13 +120211,13 @@ func (s *Revoke_statementContext) Revoke_system_privilege() IRevoke_system_privi
120211120211
return nil
120212120212
}
120213120213

120214-
return t.(IRevoke_system_privilegeContext)
120214+
return t.(IRevoke_object_privilegesContext)
120215120215
}
120216120216

120217-
func (s *Revoke_statementContext) Revoke_object_privileges() IRevoke_object_privilegesContext {
120217+
func (s *Revoke_statementContext) Revoke_system_privilege() IRevoke_system_privilegeContext {
120218120218
var t antlr.RuleContext
120219120219
for _, ctx := range s.GetChildren() {
120220-
if _, ok := ctx.(IRevoke_object_privilegesContext); ok {
120220+
if _, ok := ctx.(IRevoke_system_privilegeContext); ok {
120221120221
t = ctx.(antlr.RuleContext)
120222120222
break
120223120223
}
@@ -120227,7 +120227,7 @@ func (s *Revoke_statementContext) Revoke_object_privileges() IRevoke_object_priv
120227120227
return nil
120228120228
}
120229120229

120230-
return t.(IRevoke_object_privilegesContext)
120230+
return t.(IRevoke_system_privilegeContext)
120231120231
}
120232120232

120233120233
func (s *Revoke_statementContext) Container_clause() IContainer_clauseContext {
@@ -120306,13 +120306,13 @@ func (p *PlSqlParser) Revoke_statement() (localctx IRevoke_statementContext) {
120306120306
case 1:
120307120307
{
120308120308
p.SetState(8044)
120309-
p.Revoke_system_privilege()
120309+
p.Revoke_object_privileges()
120310120310
}
120311120311

120312120312
case 2:
120313120313
{
120314120314
p.SetState(8045)
120315-
p.Revoke_object_privileges()
120315+
p.Revoke_system_privilege()
120316120316
}
120317120317

120318120318
case antlr.ATNInvalidAltNumber:

0 commit comments

Comments
 (0)