Skip to content

Commit d038bf0

Browse files
committed
Allow to use the column type for Tuple
1 parent 118a450 commit d038bf0

File tree

4 files changed

+592
-3
lines changed

4 files changed

+592
-3
lines changed

parser/parser_column.go

+31-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (p *Parser) parseInfix(expr Expr, precedence int) (Expr, error) {
8181
p.matchTokenKind(opTypeDiv), p.matchTokenKind(opTypeMod),
8282
p.matchKeyword(KeywordIn), p.matchKeyword(KeywordLike),
8383
p.matchKeyword(KeywordIlike), p.matchKeyword(KeywordAnd), p.matchKeyword(KeywordOr),
84-
p.matchTokenKind(opTypeCast), p.matchTokenKind(opTypeArrow), p.matchTokenKind(opTypeDoubleEQ):
84+
p.matchTokenKind(opTypeArrow), p.matchTokenKind(opTypeDoubleEQ):
8585
op := p.last().ToString()
8686
_ = p.lexer.consumeToken()
8787
rightExpr, err := p.parseSubExpr(p.Pos(), precedence)
@@ -93,6 +93,36 @@ func (p *Parser) parseInfix(expr Expr, precedence int) (Expr, error) {
9393
Operation: TokenKind(op),
9494
RightExpr: rightExpr,
9595
}, nil
96+
case p.matchTokenKind(opTypeCast):
97+
_ = p.lexer.consumeToken()
98+
99+
if p.matchTokenKind(TokenIdent) && p.last().String == "Tuple" {
100+
name, err := p.parseIdent()
101+
if err != nil {
102+
return nil, err
103+
}
104+
p.consumeTokenKind("(")
105+
// it's a tuple type definition after "::" operator
106+
rightExpr, err := p.parseNestedType(name, p.Pos())
107+
if err != nil {
108+
return nil, err
109+
}
110+
return &BinaryOperation{
111+
LeftExpr: expr,
112+
Operation: opTypeCast,
113+
RightExpr: rightExpr,
114+
}, nil
115+
}
116+
117+
rightExpr, err := p.parseSubExpr(p.Pos(), precedence)
118+
if err != nil {
119+
return nil, err
120+
}
121+
return &BinaryOperation{
122+
LeftExpr: expr,
123+
Operation: opTypeCast,
124+
RightExpr: rightExpr,
125+
}, nil
96126
case p.matchKeyword(KeywordBetween):
97127
return p.parseBetweenClause(expr)
98128
case p.matchKeyword(KeywordGlobal):
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
SELECT tuple('a','b','c').3, .1234
1+
SELECT tuple('a','b','c').3, .1234;
2+
3+
SELECT toTypeName( tuple('a' as first,'b' as second ,'c' as third)::Tuple(first String,second String,third String)),
4+
(tuple('a' as first,'b' as second ,'c' as third)::Tuple(first String,second String,third String)).second,
5+
tuple('a','b','c').3,
6+
tupleElement(tuple('a','b','c'),1)
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
-- Origin SQL:
2-
SELECT tuple('a','b','c').3, .1234
2+
SELECT tuple('a','b','c').3, .1234;
3+
4+
SELECT toTypeName( tuple('a' as first,'b' as second ,'c' as third)::Tuple(first String,second String,third String)),
5+
(tuple('a' as first,'b' as second ,'c' as third)::Tuple(first String,second String,third String)).second,
6+
tuple('a','b','c').3,
7+
tupleElement(tuple('a','b','c'),1)
38

49
-- Format SQL:
510
SELECT tuple('a', 'b', 'c').3, .1234;
11+
SELECT toTypeName(tuple('a' AS first, 'b' AS second, 'c' AS third)::Tuple(first String, second String, third String)), (tuple('a' AS first, 'b' AS second, 'c' AS third)::Tuple(first String, second String, third String)).second, tuple('a', 'b', 'c').3, tupleElement(tuple('a', 'b', 'c'), 1);

0 commit comments

Comments
 (0)