Skip to content

Commit 6193ec0

Browse files
authored
Add support of the CLEAR PROJECTION statement (#62)
1 parent 42bb6d5 commit 6193ec0

File tree

6 files changed

+147
-56
lines changed

6 files changed

+147
-56
lines changed

parser/ast.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,57 @@ func (a *AlterTableClearIndex) Accept(visitor ASTVisitor) error {
868868
return visitor.VisitAlterTableClearIndex(a)
869869
}
870870

871+
type AlterTableClearProjection struct {
872+
ClearPos Pos
873+
StatementEnd Pos
874+
875+
IfExists bool
876+
ProjectionName *NestedIdentifier
877+
PartitionExpr *PartitionExpr
878+
}
879+
880+
func (a *AlterTableClearProjection) Pos() Pos {
881+
return a.ClearPos
882+
}
883+
884+
func (a *AlterTableClearProjection) End() Pos {
885+
return a.StatementEnd
886+
}
887+
888+
func (a *AlterTableClearProjection) AlterType() string {
889+
return "CLEAR_PROJECTION"
890+
}
891+
892+
func (a *AlterTableClearProjection) String(level int) string {
893+
var builder strings.Builder
894+
builder.WriteString("CLEAR PROJECTION ")
895+
if a.IfExists {
896+
builder.WriteString("IF EXISTS ")
897+
}
898+
builder.WriteString(a.ProjectionName.String(level + 1))
899+
if a.PartitionExpr != nil {
900+
builder.WriteString(NewLine(level))
901+
builder.WriteString("IN ")
902+
builder.WriteString(a.PartitionExpr.String(level))
903+
}
904+
905+
return builder.String()
906+
}
907+
908+
func (a *AlterTableClearProjection) Accept(visitor ASTVisitor) error {
909+
visitor.enter(a)
910+
defer visitor.leave(a)
911+
if err := a.ProjectionName.Accept(visitor); err != nil {
912+
return err
913+
}
914+
if a.PartitionExpr != nil {
915+
if err := a.PartitionExpr.Accept(visitor); err != nil {
916+
return err
917+
}
918+
}
919+
return visitor.VisitAlterTableClearProjection(a)
920+
}
921+
871922
type AlterTableRenameColumn struct {
872923
RenamePos Pos
873924

parser/ast_visitor.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type ASTVisitor interface {
2020
VisitAlterTableRemoveTTL(expr *AlterTableRemoveTTL) error
2121
VisitAlterTableClearColumn(expr *AlterTableClearColumn) error
2222
VisitAlterTableClearIndex(expr *AlterTableClearIndex) error
23+
VisitAlterTableClearProjection(expr *AlterTableClearProjection) error
2324
VisitAlterTableRenameColumn(expr *AlterTableRenameColumn) error
2425
VisitAlterTableModifyTTL(expr *AlterTableModifyTTL) error
2526
VisitAlterTableModifyColumn(expr *AlterTableModifyColumn) error
@@ -299,6 +300,13 @@ func (v *DefaultASTVisitor) VisitAlterTableClearIndex(expr *AlterTableClearIndex
299300
return nil
300301
}
301302

303+
func (v *DefaultASTVisitor) VisitAlterTableClearProjection(expr *AlterTableClearProjection) error {
304+
if v.Visit != nil {
305+
return v.Visit(expr)
306+
}
307+
return nil
308+
}
309+
302310
func (v *DefaultASTVisitor) VisitAlterTableRenameColumn(expr *AlterTableRenameColumn) error {
303311
if v.Visit != nil {
304312
return v.Visit(expr)

parser/parser_alter.go

Lines changed: 37 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -501,34 +501,34 @@ func (p *Parser) parseAlterTableClear(pos Pos) (AlterTableExpr, error) {
501501
if err := p.consumeKeyword(KeywordClear); err != nil {
502502
return nil, err
503503
}
504+
return p.parseAlterTableClearStatement(pos)
505+
}
504506

507+
// Syntax: ALTER TABLE CLEAR COLUMN|INDEX|PROJECTION (IF EXISTS)? nestedIdentifier (IN partitionClause)?
508+
func (p *Parser) parseAlterTableClearStatement(pos Pos) (AlterTableExpr, error) {
509+
var kind string
505510
switch {
506511
case p.matchKeyword(KeywordColumn):
507-
return p.parseAlterTableClearColumn(pos)
512+
kind = KeywordColumn
508513
case p.matchKeyword(KeywordIndex):
509-
return p.parseAlterTableClearIndex(pos)
510-
514+
kind = KeywordIndex
515+
case p.matchKeyword(KeywordProjection):
516+
kind = KeywordProjection
511517
default:
512-
return nil, errors.New("expected token: COLUMN|INDEX|PROJECTION")
513-
}
514-
}
515-
516-
// Syntax: ALTER TABLE CLEAR COLUMN (IF EXISTS)? nestedIdentifier (IN partitionClause)?
517-
func (p *Parser) parseAlterTableClearColumn(pos Pos) (AlterTableExpr, error) {
518-
if err := p.consumeKeyword(KeywordColumn); err != nil {
519-
return nil, err
518+
return nil, fmt.Errorf("expected keyword: COLUMN|INDEX|PROJECTION, but got %q", p.lastTokenKind())
520519
}
520+
_ = p.lexer.consumeToken()
521521

522522
ifExists, err := p.tryParseIfExists()
523523
if err != nil {
524524
return nil, err
525525
}
526526

527-
columnName, err := p.ParseNestedIdentifier(p.Pos())
527+
name, err := p.ParseNestedIdentifier(p.Pos())
528528
if err != nil {
529529
return nil, err
530530
}
531-
statementEnd := columnName.End()
531+
statementEnd := name.End()
532532

533533
var partitionExpr *PartitionExpr
534534
if p.tryConsumeKeyword(KeywordIn) != nil {
@@ -541,50 +541,31 @@ func (p *Parser) parseAlterTableClearColumn(pos Pos) (AlterTableExpr, error) {
541541
}
542542
}
543543

544-
return &AlterTableClearColumn{
545-
ClearPos: pos,
546-
StatementEnd: statementEnd,
547-
IfExists: ifExists,
548-
ColumnName: columnName,
549-
PartitionExpr: partitionExpr,
550-
}, nil
551-
}
552-
553-
// Syntax: ALTER TABLE CLEAR INDEX (IF EXISTS)? nestedIdentifier (IN partitionClause)?
554-
func (p *Parser) parseAlterTableClearIndex(pos Pos) (AlterTableExpr, error) {
555-
if err := p.consumeKeyword(KeywordIndex); err != nil {
556-
return nil, err
557-
}
558-
559-
ifExists, err := p.tryParseIfExists()
560-
if err != nil {
561-
return nil, err
562-
}
563-
564-
indexName, err := p.ParseNestedIdentifier(p.Pos())
565-
if err != nil {
566-
return nil, err
567-
}
568-
statementEnd := indexName.End()
569-
570-
var partitionExpr *PartitionExpr
571-
if p.tryConsumeKeyword(KeywordIn) != nil {
572-
partitionExpr, err = p.tryParsePartitionExpr(p.Pos())
573-
if err != nil {
574-
return nil, err
575-
}
576-
if partitionExpr != nil {
577-
statementEnd = partitionExpr.End()
578-
}
544+
if kind == KeywordProjection {
545+
return &AlterTableClearProjection{
546+
ClearPos: pos,
547+
StatementEnd: statementEnd,
548+
IfExists: ifExists,
549+
ProjectionName: name,
550+
PartitionExpr: partitionExpr,
551+
}, nil
552+
} else if kind == KeywordColumn {
553+
return &AlterTableClearColumn{
554+
ClearPos: pos,
555+
StatementEnd: statementEnd,
556+
IfExists: ifExists,
557+
ColumnName: name,
558+
PartitionExpr: partitionExpr,
559+
}, nil
560+
} else {
561+
return &AlterTableClearIndex{
562+
ClearPos: pos,
563+
StatementEnd: statementEnd,
564+
IfExists: ifExists,
565+
IndexName: name,
566+
PartitionExpr: partitionExpr,
567+
}, nil
579568
}
580-
581-
return &AlterTableClearIndex{
582-
ClearPos: pos,
583-
StatementEnd: statementEnd,
584-
IfExists: ifExists,
585-
IndexName: indexName,
586-
PartitionExpr: partitionExpr,
587-
}, nil
588569
}
589570

590571
// Syntax: ALTER TABLE RENAME COLUMN (IF EXISTS)? nestedIdentifier TO nestedIdentifier
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE my_table CLEAR PROJECTION hello IN PARTITION partition_name;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- Origin SQL:
2+
ALTER TABLE my_table CLEAR PROJECTION hello IN PARTITION partition_name;
3+
4+
-- Format SQL:
5+
ALTER TABLE my_table
6+
CLEAR PROJECTION hello
7+
IN PARTITION partition_name;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
[
2+
{
3+
"AlterPos": 0,
4+
"StatementEnd": 71,
5+
"TableIdentifier": {
6+
"Database": null,
7+
"Table": {
8+
"Name": "my_table",
9+
"QuoteType": 1,
10+
"NamePos": 12,
11+
"NameEnd": 20
12+
}
13+
},
14+
"OnCluster": null,
15+
"AlterExprs": [
16+
{
17+
"ClearPos": 21,
18+
"StatementEnd": 71,
19+
"IfExists": false,
20+
"ProjectionName": {
21+
"Ident": {
22+
"Name": "hello",
23+
"QuoteType": 1,
24+
"NamePos": 38,
25+
"NameEnd": 43
26+
},
27+
"DotIdent": null
28+
},
29+
"PartitionExpr": {
30+
"PartitionPos": 47,
31+
"Expr": {
32+
"Name": "partition_name",
33+
"QuoteType": 1,
34+
"NamePos": 57,
35+
"NameEnd": 71
36+
},
37+
"ID": null,
38+
"All": false
39+
}
40+
}
41+
]
42+
}
43+
]

0 commit comments

Comments
 (0)