@@ -5204,19 +5204,62 @@ impl<'a> Parser<'a> {
52045204 let (name, args) = self.parse_create_function_name_and_params()?;
52055205
52065206 self.expect_keyword(Keyword::RETURNS)?;
5207- let return_type = Some(self.parse_data_type()?);
52085207
5209- self.expect_keyword_is(Keyword::AS)?;
5208+ let return_table = self.maybe_parse(|p| {
5209+ let return_table_name = p.parse_identifier()?;
5210+
5211+ p.expect_keyword_is(Keyword::TABLE)?;
5212+ p.prev_token();
5213+
5214+ let table_column_defs = match p.parse_data_type()? {
5215+ DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
5216+ table_column_defs
5217+ }
5218+ _ => parser_err!(
5219+ "Expected table column definitions after TABLE keyword",
5220+ p.peek_token().span.start
5221+ )?,
5222+ };
5223+
5224+ Ok(DataType::NamedTable {
5225+ name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5226+ columns: table_column_defs,
5227+ })
5228+ })?;
52105229
5211- let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5212- let statements = self.parse_statement_list(&[Keyword::END])?;
5213- let end_token = self.expect_keyword(Keyword::END)?;
5230+ let return_type = if return_table.is_some() {
5231+ return_table
5232+ } else {
5233+ Some(self.parse_data_type()?)
5234+ };
52145235
5215- let function_body = Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
5216- begin_token: AttachedToken(begin_token),
5217- statements,
5218- end_token: AttachedToken(end_token),
5219- }));
5236+ let _ = self.parse_keyword(Keyword::AS);
5237+
5238+ let function_body = if self.peek_keyword(Keyword::BEGIN) {
5239+ let begin_token = self.expect_keyword(Keyword::BEGIN)?;
5240+ let statements = self.parse_statement_list(&[Keyword::END])?;
5241+ let end_token = self.expect_keyword(Keyword::END)?;
5242+
5243+ Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
5244+ begin_token: AttachedToken(begin_token),
5245+ statements,
5246+ end_token: AttachedToken(end_token),
5247+ }))
5248+ } else if self.parse_keyword(Keyword::RETURN) {
5249+ if self.peek_token() == Token::LParen {
5250+ Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
5251+ } else if self.peek_keyword(Keyword::SELECT) {
5252+ let select = self.parse_select()?;
5253+ Some(CreateFunctionBody::AsReturnSelect(select))
5254+ } else {
5255+ parser_err!(
5256+ "Expected a subquery (or bare SELECT statement) after RETURN",
5257+ self.peek_token().span.start
5258+ )?
5259+ }
5260+ } else {
5261+ parser_err!("Unparsable function body", self.peek_token().span.start)?
5262+ };
52205263
52215264 Ok(Statement::CreateFunction(CreateFunction {
52225265 or_alter,
@@ -9797,8 +9840,14 @@ impl<'a> Parser<'a> {
97979840 Ok(DataType::AnyType)
97989841 }
97999842 Keyword::TABLE => {
9800- let columns = self.parse_returns_table_columns()?;
9801- Ok(DataType::Table(columns))
9843+ // an LParen after the TABLE keyword indicates that table columns are being defined
9844+ // whereas no LParen indicates an anonymous table expression will be returned
9845+ if self.peek_token() == Token::LParen {
9846+ let columns = self.parse_returns_table_columns()?;
9847+ Ok(DataType::Table(Some(columns)))
9848+ } else {
9849+ Ok(DataType::Table(None))
9850+ }
98029851 }
98039852 Keyword::SIGNED => {
98049853 if self.parse_keyword(Keyword::INTEGER) {
@@ -9839,13 +9888,7 @@ impl<'a> Parser<'a> {
98399888 }
98409889
98419890 fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
9842- let name = self.parse_identifier()?;
9843- let data_type = self.parse_data_type()?;
9844- Ok(ColumnDef {
9845- name,
9846- data_type,
9847- options: Vec::new(), // No constraints expected here
9848- })
9891+ self.parse_column_def()
98499892 }
98509893
98519894 fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
0 commit comments