@@ -5204,19 +5204,62 @@ impl<'a> Parser<'a> {
5204
5204
let (name, args) = self.parse_create_function_name_and_params()?;
5205
5205
5206
5206
self.expect_keyword(Keyword::RETURNS)?;
5207
- let return_type = Some(self.parse_data_type()?);
5208
5207
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
+ })?;
5210
5229
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
+ };
5214
5235
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
+ };
5220
5263
5221
5264
Ok(Statement::CreateFunction(CreateFunction {
5222
5265
or_alter,
@@ -9797,8 +9840,14 @@ impl<'a> Parser<'a> {
9797
9840
Ok(DataType::AnyType)
9798
9841
}
9799
9842
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
+ }
9802
9851
}
9803
9852
Keyword::SIGNED => {
9804
9853
if self.parse_keyword(Keyword::INTEGER) {
@@ -9839,13 +9888,7 @@ impl<'a> Parser<'a> {
9839
9888
}
9840
9889
9841
9890
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()
9849
9892
}
9850
9893
9851
9894
fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
0 commit comments