Skip to content

Commit c49fa96

Browse files
committed
Fix missing some keywords in GRANT PRIVILEGE
1 parent 57ca48c commit c49fa96

File tree

5 files changed

+249
-4
lines changed

5 files changed

+249
-4
lines changed

parser/keyword.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ const (
129129
KeywordMutation = "MUTATION"
130130
KeywordNan_sql = "NAN_SQL"
131131
KeywordNo = "NO"
132+
KeywordNone = "NONE"
132133
KeywordNot = "NOT"
133134
KeywordNull = "NULL"
134135
KeywordNulls = "NULLS"
@@ -349,6 +350,7 @@ var keywords = NewSet(
349350
KeywordMutation,
350351
KeywordNan_sql,
351352
KeywordNo,
353+
KeywordNone,
352354
KeywordNot,
353355
KeywordNull,
354356
KeywordNulls,

parser/parse_system.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -577,9 +577,14 @@ func (p *Parser) parserDropUserOrRole(pos Pos) (*DropUserOrRole, error) {
577577
func (p *Parser) parsePrivilegeSelectOrInsert(pos Pos) (*PrivilegeExpr, error) {
578578
keyword := p.last().String
579579
_ = p.lexer.consumeToken()
580-
params, err := p.parseFunctionParams(p.Pos())
581-
if err != nil {
582-
return nil, err
580+
581+
var err error
582+
var params *ParamExprList
583+
if p.matchTokenKind("(") {
584+
params, err = p.parseFunctionParams(p.Pos())
585+
if err != nil {
586+
return nil, err
587+
}
583588
}
584589
return &PrivilegeExpr{
585590
PrivilegePos: pos,
@@ -794,6 +799,15 @@ func (p *Parser) parsePrivilegeSystem(pos Pos) (*PrivilegeExpr, error) {
794799
}
795800

796801
func (p *Parser) parsePrivilege(pos Pos) (*PrivilegeExpr, error) {
802+
if p.matchTokenKind(TokenIdent) {
803+
if p.last().String == "dictGet" {
804+
_ = p.lexer.consumeToken()
805+
return &PrivilegeExpr{
806+
PrivilegePos: pos,
807+
Keywords: []string{"dictGet"},
808+
}, nil
809+
}
810+
}
797811
switch {
798812
case p.matchKeyword(KeywordSelect), p.matchKeyword(KeywordInsert):
799813
return p.parsePrivilegeSelectOrInsert(pos)
@@ -805,7 +819,8 @@ func (p *Parser) parsePrivilege(pos Pos) (*PrivilegeExpr, error) {
805819
return p.parsePrivilegeDrop(pos)
806820
case p.tryConsumeKeyword(KeywordShow) != nil:
807821
return p.parsePrivilegeShow(pos)
808-
case p.tryConsumeKeyword(KeywordAll) != nil:
822+
case p.matchKeyword(KeywordAll), p.matchTokenKind(KeywordNone):
823+
_ = p.lexer.consumeToken()
809824
return &PrivilegeExpr{
810825
PrivilegePos: pos,
811826
Keywords: []string{KeywordAll},
@@ -820,6 +835,14 @@ func (p *Parser) parsePrivilege(pos Pos) (*PrivilegeExpr, error) {
820835
}, nil
821836
case p.tryConsumeKeyword(KeywordSystem) != nil:
822837
return p.parsePrivilegeSystem(pos)
838+
case p.tryConsumeKeyword(KeywordAdmin) != nil:
839+
if err := p.consumeKeyword(KeywordOption); err != nil {
840+
return nil, err
841+
}
842+
return &PrivilegeExpr{
843+
PrivilegePos: pos,
844+
Keywords: []string{KeywordAdmin, KeywordOption},
845+
}, nil
823846
case p.matchKeyword(KeywordOptimize), p.matchKeyword(KeywordTruncate):
824847
keyword := p.last().String
825848
_ = p.lexer.consumeToken()

parser/testdata/ddl/format/grant_privilege.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ GRANT SELECT(x,y) ON *.* TO john;
77
GRANT SELECT(x,y) ON *.table TO CURRENT_USER;
88
GRANT SELECT(x,y) ON *.table TO CURRENT_USER,john,mary;
99
GRANT ALL ON *.* TO admin_role WITH GRANT OPTION;
10+
GRANT SELECT,INSERT ON database.table_1 TO table_1_select_role;
11+
GRANT SELECT(x, y, z),INSERT ON database.table_1 TO table_1_select_role;
12+
GRANT SELECT, dictGet ON *.* TO select_all_role;
13+
GRANT ADMIN OPTION ON *.* TO select_all_role;
14+
1015

1116

1217
-- Format SQL:
@@ -18,3 +23,7 @@ GRANT SELECT(x, y) ON *.* TO john;
1823
GRANT SELECT(x, y) ON *.table TO CURRENT_USER;
1924
GRANT SELECT(x, y) ON *.table TO CURRENT_USER, john, mary;
2025
GRANT ALL ON *.* TO admin_role WITH GRANT OPTION;
26+
GRANT SELECT, INSERT ON database.table_1 TO table_1_select_role;
27+
GRANT SELECT(x, y, z), INSERT ON database.table_1 TO table_1_select_role;
28+
GRANT SELECT, dictGet ON *.* TO select_all_role;
29+
GRANT ADMIN OPTION ON *.* TO select_all_role;

parser/testdata/ddl/grant_privilege.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@ GRANT SELECT(x,y) ON *.* TO john;
66
GRANT SELECT(x,y) ON *.table TO CURRENT_USER;
77
GRANT SELECT(x,y) ON *.table TO CURRENT_USER,john,mary;
88
GRANT ALL ON *.* TO admin_role WITH GRANT OPTION;
9+
GRANT SELECT,INSERT ON database.table_1 TO table_1_select_role;
10+
GRANT SELECT(x, y, z),INSERT ON database.table_1 TO table_1_select_role;
11+
GRANT SELECT, dictGet ON *.* TO select_all_role;
12+
GRANT ADMIN OPTION ON *.* TO select_all_role;
13+

parser/testdata/ddl/output/grant_privilege.sql.golden.json

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,5 +480,211 @@
480480
"WithOptions": [
481481
"GRANT"
482482
]
483+
},
484+
{
485+
"GrantPos": 373,
486+
"StatementEnd": 435,
487+
"OnCluster": null,
488+
"Privileges": [
489+
{
490+
"PrivilegePos": 379,
491+
"PrivilegeEnd": 0,
492+
"Keywords": [
493+
"SELECT"
494+
],
495+
"Params": null
496+
},
497+
{
498+
"PrivilegePos": 386,
499+
"PrivilegeEnd": 0,
500+
"Keywords": [
501+
"INSERT"
502+
],
503+
"Params": null
504+
}
505+
],
506+
"On": {
507+
"Database": {
508+
"Name": "database",
509+
"Unquoted": false,
510+
"NamePos": 396,
511+
"NameEnd": 404
512+
},
513+
"Table": {
514+
"Name": "table_1",
515+
"Unquoted": false,
516+
"NamePos": 405,
517+
"NameEnd": 412
518+
}
519+
},
520+
"To": [
521+
{
522+
"Name": "table_1_select_role",
523+
"Unquoted": false,
524+
"NamePos": 416,
525+
"NameEnd": 435
526+
}
527+
],
528+
"WithOptions": []
529+
},
530+
{
531+
"GrantPos": 437,
532+
"StatementEnd": 508,
533+
"OnCluster": null,
534+
"Privileges": [
535+
{
536+
"PrivilegePos": 443,
537+
"PrivilegeEnd": 0,
538+
"Keywords": [
539+
"SELECT"
540+
],
541+
"Params": {
542+
"LeftParenPos": 449,
543+
"RightParenPos": 457,
544+
"Items": {
545+
"ListPos": 450,
546+
"ListEnd": 457,
547+
"HasDistinct": false,
548+
"Items": [
549+
{
550+
"Name": "x",
551+
"Unquoted": false,
552+
"NamePos": 450,
553+
"NameEnd": 451
554+
},
555+
{
556+
"Name": "y",
557+
"Unquoted": false,
558+
"NamePos": 453,
559+
"NameEnd": 454
560+
},
561+
{
562+
"Name": "z",
563+
"Unquoted": false,
564+
"NamePos": 456,
565+
"NameEnd": 457
566+
}
567+
]
568+
},
569+
"ColumnArgList": null
570+
}
571+
},
572+
{
573+
"PrivilegePos": 459,
574+
"PrivilegeEnd": 0,
575+
"Keywords": [
576+
"INSERT"
577+
],
578+
"Params": null
579+
}
580+
],
581+
"On": {
582+
"Database": {
583+
"Name": "database",
584+
"Unquoted": false,
585+
"NamePos": 469,
586+
"NameEnd": 477
587+
},
588+
"Table": {
589+
"Name": "table_1",
590+
"Unquoted": false,
591+
"NamePos": 478,
592+
"NameEnd": 485
593+
}
594+
},
595+
"To": [
596+
{
597+
"Name": "table_1_select_role",
598+
"Unquoted": false,
599+
"NamePos": 489,
600+
"NameEnd": 508
601+
}
602+
],
603+
"WithOptions": []
604+
},
605+
{
606+
"GrantPos": 510,
607+
"StatementEnd": 558,
608+
"OnCluster": null,
609+
"Privileges": [
610+
{
611+
"PrivilegePos": 516,
612+
"PrivilegeEnd": 0,
613+
"Keywords": [
614+
"SELECT"
615+
],
616+
"Params": null
617+
},
618+
{
619+
"PrivilegePos": 524,
620+
"PrivilegeEnd": 0,
621+
"Keywords": [
622+
"dictGet"
623+
],
624+
"Params": null
625+
}
626+
],
627+
"On": {
628+
"Database": {
629+
"Name": "*",
630+
"Unquoted": false,
631+
"NamePos": 535,
632+
"NameEnd": 536
633+
},
634+
"Table": {
635+
"Name": "*",
636+
"Unquoted": false,
637+
"NamePos": 537,
638+
"NameEnd": 538
639+
}
640+
},
641+
"To": [
642+
{
643+
"Name": "select_all_role",
644+
"Unquoted": false,
645+
"NamePos": 543,
646+
"NameEnd": 558
647+
}
648+
],
649+
"WithOptions": []
650+
},
651+
{
652+
"GrantPos": 560,
653+
"StatementEnd": 605,
654+
"OnCluster": null,
655+
"Privileges": [
656+
{
657+
"PrivilegePos": 566,
658+
"PrivilegeEnd": 0,
659+
"Keywords": [
660+
"ADMIN",
661+
"OPTION"
662+
],
663+
"Params": null
664+
}
665+
],
666+
"On": {
667+
"Database": {
668+
"Name": "*",
669+
"Unquoted": false,
670+
"NamePos": 582,
671+
"NameEnd": 583
672+
},
673+
"Table": {
674+
"Name": "*",
675+
"Unquoted": false,
676+
"NamePos": 584,
677+
"NameEnd": 585
678+
}
679+
},
680+
"To": [
681+
{
682+
"Name": "select_all_role",
683+
"Unquoted": false,
684+
"NamePos": 590,
685+
"NameEnd": 605
686+
}
687+
],
688+
"WithOptions": []
483689
}
484690
]

0 commit comments

Comments
 (0)