(pos Pos)
| 1018 | } |
| 1019 | |
| 1020 | func (p *Parser) parseSelectStmt(pos Pos) (*SelectQuery, error) { // nolint: funlen |
| 1021 | withClause, err := p.tryParseWithClause(pos) |
| 1022 | if err != nil { |
| 1023 | return nil, err |
| 1024 | } |
| 1025 | if err := p.expectKeyword(KeywordSelect); err != nil { |
| 1026 | return nil, err |
| 1027 | } |
| 1028 | // DISTINCT? |
| 1029 | hasDistinct := p.tryConsumeKeywords(KeywordDistinct) |
| 1030 | distinctOn, err := p.tryParseDistinctOn(p.Pos()) |
| 1031 | if err != nil { |
| 1032 | return nil, err |
| 1033 | } |
| 1034 | |
| 1035 | top, err := p.tryParseTopClause(p.Pos()) |
| 1036 | if err != nil { |
| 1037 | return nil, err |
| 1038 | } |
| 1039 | selectItems, err := p.parseSelectItems() |
| 1040 | if err != nil { |
| 1041 | return nil, err |
| 1042 | } |
| 1043 | |
| 1044 | statementEnd := pos |
| 1045 | if len(selectItems) > 0 { |
| 1046 | statementEnd = selectItems[len(selectItems)-1].End() |
| 1047 | } |
| 1048 | from, err := p.tryParseFromClause(p.Pos()) |
| 1049 | if err != nil { |
| 1050 | return nil, err |
| 1051 | } |
| 1052 | |
| 1053 | if from != nil { |
| 1054 | statementEnd = from.End() |
| 1055 | } |
| 1056 | prewhere, err := p.tryParsePrewhereClause(p.Pos()) |
| 1057 | if err != nil { |
| 1058 | return nil, err |
| 1059 | } |
| 1060 | if prewhere != nil { |
| 1061 | statementEnd = prewhere.End() |
| 1062 | } |
| 1063 | where, err := p.tryParseWhereClause(p.Pos()) |
| 1064 | if err != nil { |
| 1065 | return nil, err |
| 1066 | } |
| 1067 | if where != nil { |
| 1068 | statementEnd = where.End() |
| 1069 | } |
| 1070 | groupBy, err := p.tryParseGroupByClause(p.Pos()) |
| 1071 | if err != nil { |
| 1072 | return nil, err |
| 1073 | } |
| 1074 | if groupBy != nil { |
| 1075 | statementEnd = groupBy.End() |
| 1076 | } |
| 1077 | withTotal := false |
no test coverage detected