(pos Pos)
| 1310 | } |
| 1311 | |
| 1312 | func (p *Parser) parseGrantPrivilegeStmt(pos Pos) (*GrantPrivilegeStmt, error) { |
| 1313 | if err := p.expectKeyword(KeywordGrant); err != nil { |
| 1314 | return nil, err |
| 1315 | } |
| 1316 | onCluster, err := p.tryParseClusterClause(p.Pos()) |
| 1317 | if err != nil { |
| 1318 | return nil, err |
| 1319 | } |
| 1320 | var privileges []*PrivilegeClause |
| 1321 | privilege, err := p.parsePrivilegeClause(p.Pos()) |
| 1322 | if err != nil { |
| 1323 | return nil, err |
| 1324 | } |
| 1325 | privileges = append(privileges, privilege) |
| 1326 | for p.tryConsumeTokenKind(TokenKindComma) != nil { |
| 1327 | privilege, err := p.parsePrivilegeClause(p.Pos()) |
| 1328 | if err != nil { |
| 1329 | return nil, err |
| 1330 | } |
| 1331 | privileges = append(privileges, privilege) |
| 1332 | } |
| 1333 | statementEnd := privileges[len(privileges)-1].End() |
| 1334 | |
| 1335 | if err := p.expectKeyword(KeywordOn); err != nil { |
| 1336 | return nil, err |
| 1337 | } |
| 1338 | on, err := p.parseGrantSource(p.Pos()) |
| 1339 | if err != nil { |
| 1340 | return nil, err |
| 1341 | } |
| 1342 | |
| 1343 | if err := p.expectKeyword(KeywordTo); err != nil { |
| 1344 | return nil, err |
| 1345 | } |
| 1346 | toRoles, err := p.parsePrivilegeRoles(p.Pos()) |
| 1347 | if err != nil { |
| 1348 | return nil, err |
| 1349 | } |
| 1350 | if len(toRoles) != 0 { |
| 1351 | statementEnd = toRoles[len(toRoles)-1].NameEnd |
| 1352 | } |
| 1353 | options, err := p.parseGrantOptions(p.Pos()) |
| 1354 | if err != nil { |
| 1355 | return nil, err |
| 1356 | } |
| 1357 | if len(options) != 0 { |
| 1358 | statementEnd = p.End() |
| 1359 | } |
| 1360 | |
| 1361 | return &GrantPrivilegeStmt{ |
| 1362 | GrantPos: pos, |
| 1363 | StatementEnd: statementEnd, |
| 1364 | OnCluster: onCluster, |
| 1365 | Privileges: privileges, |
| 1366 | On: on, |
| 1367 | To: toRoles, |
| 1368 | WithOptions: options, |
| 1369 | }, nil |
no test coverage detected