File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -50,6 +50,13 @@ pub enum DataType {
5050 /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
5151 /// [MsSQL]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver16#c-create-a-multi-statement-table-valued-function
5252 Table ( Vec < ColumnDef > ) ,
53+ /// Table type with a name, e.g. CREATE FUNCTION RETURNS @result TABLE(...).
54+ NamedTable (
55+ /// Table name.
56+ ObjectName ,
57+ /// Table columns.
58+ Vec < ColumnDef > ,
59+ ) ,
5360 /// Fixed-length character type, e.g. CHARACTER(10).
5461 Character ( Option < CharacterLength > ) ,
5562 /// Fixed-length char type, e.g. CHAR(10).
@@ -723,6 +730,9 @@ impl fmt::Display for DataType {
723730 }
724731 write ! ( f, "TABLE({})" , display_comma_separated( fields) )
725732 }
733+ DataType :: NamedTable ( name, fields) => {
734+ write ! ( f, "{} TABLE ({})" , name, display_comma_separated( fields) )
735+ }
726736 DataType :: GeometricType ( kind) => write ! ( f, "{}" , kind) ,
727737 }
728738 }
Original file line number Diff line number Diff line change @@ -5207,7 +5207,31 @@ impl<'a> Parser<'a> {
52075207 let (name, args) = self.parse_create_function_name_and_params()?;
52085208
52095209 self.expect_keyword(Keyword::RETURNS)?;
5210- let return_type = Some(self.parse_data_type()?);
5210+
5211+ let return_table = self.maybe_parse(|p| {
5212+ let return_table_name = p.parse_identifier()?;
5213+ let table_column_defs = if p.peek_keyword(Keyword::TABLE) {
5214+ match p.parse_data_type()? {
5215+ DataType::Table(t) => t,
5216+ _ => parser_err!(
5217+ "Expected table data type after TABLE keyword",
5218+ p.peek_token().span.start
5219+ )?,
5220+ }
5221+ } else {
5222+ parser_err!("Expected TABLE keyword after return type", p.peek_token().span.start)?
5223+ };
5224+ Ok(DataType::NamedTable(
5225+ ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5226+ table_column_defs.clone(),
5227+ ))
5228+ })?;
5229+
5230+ let return_type = if return_table.is_some() {
5231+ return_table
5232+ } else {
5233+ Some(self.parse_data_type()?)
5234+ };
52115235
52125236 self.expect_keyword_is(Keyword::AS)?;
52135237
Original file line number Diff line number Diff line change @@ -296,6 +296,17 @@ fn parse_create_function() {
296296 RETURN (SELECT 1 AS col_1)\
297297 ";
298298 let _ = ms ( ) . verified_stmt ( create_inline_table_value_function) ;
299+
300+ let create_multi_statement_table_value_function = "\
301+ CREATE FUNCTION some_multi_statement_tvf(@foo INT, @bar VARCHAR(256)) \
302+ RETURNS @t TABLE (col_1 INT) \
303+ AS \
304+ BEGIN \
305+ INSERT INTO @t SELECT 1; \
306+ RETURN; \
307+ END\
308+ ";
309+ let _ = ms ( ) . verified_stmt ( create_multi_statement_table_value_function) ;
299310}
300311
301312#[ test]
You can’t perform that action at this time.
0 commit comments