parseCreateMaterializedView parses a CREATE MATERIALIZED VIEW statement. The syntax is as follows: CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] REFRESH EVERY|AFTER interval [OFFSET interval] [RANDOMIZE FOR interval] [DEPENDS ON [db.]name [, [db.]name [, ...]]] [SETT
(pos Pos)
| 17 | // AS SELECT ... |
| 18 | // [COMMENT 'comment'] |
| 19 | func (p *Parser) parseCreateMaterializedView(pos Pos) (*CreateMaterializedView, error) { |
| 20 | if err := p.expectKeyword(KeywordMaterialized); err != nil { |
| 21 | return nil, err |
| 22 | } |
| 23 | if err := p.expectKeyword(KeywordView); err != nil { |
| 24 | return nil, err |
| 25 | } |
| 26 | |
| 27 | createMaterializedView := &CreateMaterializedView{CreatePos: pos} |
| 28 | |
| 29 | // parse IF NOT EXISTS clause if exists |
| 30 | var err error |
| 31 | createMaterializedView.IfNotExists, err = p.tryParseIfNotExists() |
| 32 | if err != nil { |
| 33 | return nil, err |
| 34 | } |
| 35 | |
| 36 | tableIdentifier, err := p.parseTableIdentifier(p.Pos()) |
| 37 | if err != nil { |
| 38 | return nil, err |
| 39 | } |
| 40 | createMaterializedView.Name = tableIdentifier |
| 41 | |
| 42 | onCluster, err := p.tryParseClusterClause(p.Pos()) |
| 43 | if err != nil { |
| 44 | return nil, err |
| 45 | } |
| 46 | createMaterializedView.OnCluster = onCluster |
| 47 | |
| 48 | refreshExpr, err := p.tryParseRefreshExpr(p.Pos()) |
| 49 | if err != nil { |
| 50 | return nil, err |
| 51 | } |
| 52 | createMaterializedView.Refresh = refreshExpr |
| 53 | |
| 54 | if p.tryConsumeKeywords(KeywordRandomize, KeywordFor) { |
| 55 | randomizeFor, err := p.parseInterval(false) |
| 56 | if err != nil { |
| 57 | return nil, err |
| 58 | } |
| 59 | createMaterializedView.RandomizeFor = randomizeFor |
| 60 | } |
| 61 | if p.tryConsumeKeywords(KeywordDepends, KeywordOn) { |
| 62 | dependsOnTables := make([]*TableIdentifier, 0) |
| 63 | table, err := p.parseTableIdentifier(p.Pos()) |
| 64 | if err != nil { |
| 65 | return nil, err |
| 66 | } |
| 67 | dependsOnTables = append(dependsOnTables, table) |
| 68 | for p.matchTokenKind(TokenKindComma) { |
| 69 | table, err := p.parseTableIdentifier(p.Pos()) |
| 70 | if err != nil { |
| 71 | return nil, err |
| 72 | } |
| 73 | dependsOnTables = append(dependsOnTables, table) |
| 74 | } |
| 75 | createMaterializedView.DependsOn = dependsOnTables |
| 76 | } |
no test coverage detected