@@ -1789,6 +1789,8 @@ func (p *Parser) parseCreateStatement() (ast.Statement, error) {
17891789 return p .parseCreateSequenceStatement ()
17901790 case "SPATIAL" :
17911791 return p .parseCreateSpatialIndexStatement ()
1792+ case "MATERIALIZED" :
1793+ return p .parseCreateMaterializedViewStatement ()
17921794 case "SERVER" :
17931795 // Check if it's SERVER ROLE or SERVER AUDIT
17941796 p .nextToken () // consume SERVER
@@ -2899,7 +2901,7 @@ func (p *Parser) parseCreateViewStatement() (*ast.CreateViewStatement, error) {
28992901 p .nextToken ()
29002902 // Parse view options
29012903 for p .curTok .Type == TokenIdent {
2902- opt := ast.ViewOption {OptionKind : p .curTok .Literal }
2904+ opt := & ast.ViewStatementOption {OptionKind : p .curTok .Literal }
29032905 stmt .ViewOptions = append (stmt .ViewOptions , opt )
29042906 p .nextToken ()
29052907 if p .curTok .Type == TokenComma {
@@ -2927,6 +2929,104 @@ func (p *Parser) parseCreateViewStatement() (*ast.CreateViewStatement, error) {
29272929 return stmt , nil
29282930}
29292931
2932+ func (p * Parser ) parseCreateMaterializedViewStatement () (* ast.CreateViewStatement , error ) {
2933+ // Consume MATERIALIZED
2934+ p .nextToken ()
2935+
2936+ // Expect VIEW
2937+ if p .curTok .Type != TokenView {
2938+ return nil , fmt .Errorf ("expected VIEW after MATERIALIZED, got %s" , p .curTok .Literal )
2939+ }
2940+ p .nextToken ()
2941+
2942+ stmt := & ast.CreateViewStatement {
2943+ IsMaterialized : true ,
2944+ }
2945+
2946+ // Parse view name
2947+ son , err := p .parseSchemaObjectName ()
2948+ if err != nil {
2949+ return nil , err
2950+ }
2951+ stmt .SchemaObjectName = son
2952+
2953+ // Parse WITH options for materialized view
2954+ if p .curTok .Type == TokenWith || strings .ToUpper (p .curTok .Literal ) == "WITH" {
2955+ p .nextToken () // consume WITH
2956+ if p .curTok .Type == TokenLParen {
2957+ p .nextToken ()
2958+ for p .curTok .Type != TokenRParen && p .curTok .Type != TokenEOF {
2959+ optionName := strings .ToUpper (p .curTok .Literal )
2960+ p .nextToken ()
2961+
2962+ if optionName == "DISTRIBUTION" {
2963+ // Parse DISTRIBUTION = HASH(col1, col2, ...)
2964+ if p .curTok .Type == TokenEquals {
2965+ p .nextToken ()
2966+ }
2967+ if strings .ToUpper (p .curTok .Literal ) == "HASH" {
2968+ p .nextToken ()
2969+ if p .curTok .Type == TokenLParen {
2970+ p .nextToken ()
2971+ distOpt := & ast.ViewDistributionOption {
2972+ OptionKind : "Distribution" ,
2973+ Value : & ast.ViewHashDistributionPolicy {},
2974+ }
2975+ // Parse column list
2976+ for p .curTok .Type != TokenRParen && p .curTok .Type != TokenEOF {
2977+ col := p .parseIdentifier ()
2978+ if distOpt .Value .DistributionColumn == nil {
2979+ distOpt .Value .DistributionColumn = col
2980+ }
2981+ distOpt .Value .DistributionColumns = append (distOpt .Value .DistributionColumns , col )
2982+ if p .curTok .Type == TokenComma {
2983+ p .nextToken ()
2984+ } else {
2985+ break
2986+ }
2987+ }
2988+ if p .curTok .Type == TokenRParen {
2989+ p .nextToken ()
2990+ }
2991+ stmt .ViewOptions = append (stmt .ViewOptions , distOpt )
2992+ }
2993+ }
2994+ } else if optionName == "FOR_APPEND" {
2995+ stmt .ViewOptions = append (stmt .ViewOptions , & ast.ViewForAppendOption {
2996+ OptionKind : "ForAppend" ,
2997+ })
2998+ }
2999+
3000+ if p .curTok .Type == TokenComma {
3001+ p .nextToken ()
3002+ } else if p .curTok .Type != TokenRParen {
3003+ break
3004+ }
3005+ }
3006+ if p .curTok .Type == TokenRParen {
3007+ p .nextToken ()
3008+ }
3009+ }
3010+ }
3011+
3012+ // Expect AS
3013+ if p .curTok .Type != TokenAs {
3014+ p .skipToEndOfStatement ()
3015+ return stmt , nil
3016+ }
3017+ p .nextToken ()
3018+
3019+ // Parse SELECT statement
3020+ selStmt , err := p .parseSelectStatement ()
3021+ if err != nil {
3022+ p .skipToEndOfStatement ()
3023+ return stmt , nil
3024+ }
3025+ stmt .SelectStatement = selStmt
3026+
3027+ return stmt , nil
3028+ }
3029+
29303030func (p * Parser ) parseCreateSchemaStatement () (* ast.CreateSchemaStatement , error ) {
29313031 // Consume SCHEMA
29323032 p .nextToken ()
0 commit comments