@@ -10321,87 +10321,7 @@ impl<'a> Parser<'a> {
1032110321 None
1032210322 };
1032310323
10324- let mut pipe_operators = Vec::new();
10325-
10326- while self.consume_token(&Token::VerticalBarRightAngleBracket) {
10327- let kw = self.expect_one_of_keywords(&[
10328- Keyword::SELECT,
10329- Keyword::EXTEND,
10330- Keyword::SET,
10331- Keyword::DROP,
10332- Keyword::AS,
10333- Keyword::WHERE,
10334- Keyword::LIMIT,
10335- Keyword::AGGREGATE,
10336- Keyword::ORDER,
10337- ])?;
10338- match kw {
10339- Keyword::SELECT => {
10340- let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
10341- pipe_operators.push(PipeOperator::Select { exprs })
10342- }
10343- Keyword::EXTEND => {
10344- let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
10345- pipe_operators.push(PipeOperator::Extend { exprs })
10346- }
10347- Keyword::SET => {
10348- let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
10349- pipe_operators.push(PipeOperator::Set { assignments })
10350- }
10351- Keyword::DROP => {
10352- let columns = self.parse_identifiers()?;
10353- pipe_operators.push(PipeOperator::Drop { columns })
10354- }
10355- Keyword::AS => {
10356- let alias = self.parse_identifier()?;
10357- pipe_operators.push(PipeOperator::As { alias })
10358- }
10359- Keyword::WHERE => {
10360- let expr = self.parse_expr()?;
10361- pipe_operators.push(PipeOperator::Where { expr })
10362- }
10363- Keyword::LIMIT => {
10364- let expr = self.parse_expr()?;
10365- let offset = if self.parse_keyword(Keyword::OFFSET) {
10366- Some(self.parse_expr()?)
10367- } else {
10368- None
10369- };
10370- pipe_operators.push(PipeOperator::Limit { expr, offset })
10371- }
10372- Keyword::AGGREGATE => {
10373- let full_table_exprs = self.parse_comma_separated0(
10374- |parser| {
10375- let expr = parser.parse_expr()?;
10376- let alias = parser.maybe_parse_select_item_alias()?;
10377- Ok(ExprWithAlias { expr, alias })
10378- },
10379- Token::make_keyword(keywords::GROUP),
10380- )?;
10381-
10382- let group_by_exprs = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY])
10383- {
10384- self.parse_comma_separated(|parser| {
10385- let expr = parser.parse_expr()?;
10386- let alias = parser.maybe_parse_select_item_alias()?;
10387- Ok(ExprWithAlias { expr, alias })
10388- })?
10389- } else {
10390- vec![]
10391- };
10392- pipe_operators.push(PipeOperator::Aggregate {
10393- full_table_exprs,
10394- group_by_exprs,
10395- })
10396- }
10397- Keyword::ORDER => {
10398- self.expect_one_of_keywords(&[Keyword::BY])?;
10399- let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
10400- pipe_operators.push(PipeOperator::OrderBy { exprs })
10401- }
10402- _ => {}
10403- }
10404- }
10324+ let pipe_operators = self.parse_pipe_operators()?;
1040510325
1040610326 Ok(Query {
1040710327 with,
@@ -10421,6 +10341,90 @@ impl<'a> Parser<'a> {
1042110341 }
1042210342 }
1042310343
10344+ fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
10345+ let mut pipe_operators = Vec::new();
10346+
10347+ while self.consume_token(&Token::VerticalBarRightAngleBracket) {
10348+ let kw = self.expect_one_of_keywords(&[
10349+ Keyword::SELECT,
10350+ Keyword::EXTEND,
10351+ Keyword::SET,
10352+ Keyword::DROP,
10353+ Keyword::AS,
10354+ Keyword::WHERE,
10355+ Keyword::LIMIT,
10356+ Keyword::AGGREGATE,
10357+ Keyword::ORDER,
10358+ ])?;
10359+ match kw {
10360+ Keyword::SELECT => {
10361+ let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
10362+ pipe_operators.push(PipeOperator::Select { exprs })
10363+ }
10364+ Keyword::EXTEND => {
10365+ let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
10366+ pipe_operators.push(PipeOperator::Extend { exprs })
10367+ }
10368+ Keyword::SET => {
10369+ let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
10370+ pipe_operators.push(PipeOperator::Set { assignments })
10371+ }
10372+ Keyword::DROP => {
10373+ let columns = self.parse_identifiers()?;
10374+ pipe_operators.push(PipeOperator::Drop { columns })
10375+ }
10376+ Keyword::AS => {
10377+ let alias = self.parse_identifier()?;
10378+ pipe_operators.push(PipeOperator::As { alias })
10379+ }
10380+ Keyword::WHERE => {
10381+ let expr = self.parse_expr()?;
10382+ pipe_operators.push(PipeOperator::Where { expr })
10383+ }
10384+ Keyword::LIMIT => {
10385+ let expr = self.parse_expr()?;
10386+ let offset = if self.parse_keyword(Keyword::OFFSET) {
10387+ Some(self.parse_expr()?)
10388+ } else {
10389+ None
10390+ };
10391+ pipe_operators.push(PipeOperator::Limit { expr, offset })
10392+ }
10393+ Keyword::AGGREGATE => {
10394+ let full_table_exprs = self.parse_comma_separated0(
10395+ |parser| {
10396+ let expr = parser.parse_expr()?;
10397+ let alias = parser.maybe_parse_select_item_alias()?;
10398+ Ok(ExprWithAlias { expr, alias })
10399+ },
10400+ Token::make_keyword(keywords::GROUP),
10401+ )?;
10402+
10403+ let group_by_exprs = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
10404+ self.parse_comma_separated(|parser| {
10405+ let expr = parser.parse_expr()?;
10406+ let alias = parser.maybe_parse_select_item_alias()?;
10407+ Ok(ExprWithAlias { expr, alias })
10408+ })?
10409+ } else {
10410+ vec![]
10411+ };
10412+ pipe_operators.push(PipeOperator::Aggregate {
10413+ full_table_exprs,
10414+ group_by_exprs,
10415+ })
10416+ }
10417+ Keyword::ORDER => {
10418+ self.expect_one_of_keywords(&[Keyword::BY])?;
10419+ let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
10420+ pipe_operators.push(PipeOperator::OrderBy { exprs })
10421+ }
10422+ _ => {}
10423+ }
10424+ }
10425+ Ok(pipe_operators)
10426+ }
10427+
1042410428 fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
1042510429 let settings = if dialect_of!(self is ClickHouseDialect|GenericDialect)
1042610430 && self.parse_keyword(Keyword::SETTINGS)
0 commit comments