MCPcopy Create free account
hub / github.com/AfterShip/clickhouse-sql-parser / parseColumnExtractExpr

Method parseColumnExtractExpr

parser/parser_column.go:284–332  ·  view source on GitHub ↗
(pos Pos)

Source from the content-addressed store, hash-verified

282}
283
284func (p *Parser) parseColumnExtractExpr(pos Pos) (*ExtractExpr, error) {
285 if err := p.expectKeyword(KeywordExtract); err != nil {
286 return nil, err
287 }
288 if err := p.expectTokenKind(TokenKindLParen); err != nil {
289 return nil, err
290 }
291
292 parameters := make([]Expr, 0)
293 for !p.lexer.isEOF() {
294 expr, err := p.parseExpr(p.Pos())
295 if err != nil {
296 return nil, err
297 }
298
299 var param Expr
300 if ident, ok := expr.(*Ident); ok {
301 if intervalUnits.Contains(strings.ToUpper(ident.Name)) && p.matchKeyword(KeywordFrom) {
302 param, err = p.parseExtractFrom(ident)
303 if err != nil {
304 return nil, err
305 }
306 parameters = append(parameters, param)
307 } else {
308 parameters = append(parameters, expr)
309 }
310 } else {
311 parameters = append(parameters, expr)
312 }
313
314 if p.tryConsumeTokenKind(TokenKindComma) == nil {
315 break
316 }
317 }
318
319 if len(parameters) == 0 {
320 return nil, fmt.Errorf("EXTRACT requires at least one parameter")
321 }
322
323 extractEnd := p.Pos()
324 if err := p.expectTokenKind(TokenKindRParen); err != nil {
325 return nil, err
326 }
327 return &ExtractExpr{
328 ExtractPos: pos,
329 ExtractEnd: extractEnd,
330 Parameters: parameters,
331 }, nil
332}
333
334func (p *Parser) parseUnaryExpr(pos Pos) (Expr, error) {
335 op := p.last()

Callers 1

parseColumnExprMethod · 0.95

Calls 9

expectKeywordMethod · 0.95
expectTokenKindMethod · 0.95
parseExprMethod · 0.95
PosMethod · 0.95
matchKeywordMethod · 0.95
parseExtractFromMethod · 0.95
tryConsumeTokenKindMethod · 0.95
isEOFMethod · 0.80
ContainsMethod · 0.80

Tested by

no test coverage detected