File tree 3 files changed +51
-1
lines changed
3 files changed +51
-1
lines changed Original file line number Diff line number Diff line change @@ -50,6 +50,13 @@ pub enum DataType {
50
50
/// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
51
51
/// [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
52
52
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
+ ) ,
53
60
/// Fixed-length character type, e.g. CHARACTER(10).
54
61
Character ( Option < CharacterLength > ) ,
55
62
/// Fixed-length char type, e.g. CHAR(10).
@@ -723,6 +730,9 @@ impl fmt::Display for DataType {
723
730
}
724
731
write ! ( f, "TABLE({})" , display_comma_separated( fields) )
725
732
}
733
+ DataType :: NamedTable ( name, fields) => {
734
+ write ! ( f, "{} TABLE ({})" , name, display_comma_separated( fields) )
735
+ }
726
736
DataType :: GeometricType ( kind) => write ! ( f, "{}" , kind) ,
727
737
}
728
738
}
Original file line number Diff line number Diff line change @@ -5203,7 +5203,36 @@ impl<'a> Parser<'a> {
5203
5203
let (name, args) = self.parse_create_function_name_and_params()?;
5204
5204
5205
5205
self.expect_keyword(Keyword::RETURNS)?;
5206
- let return_type = Some(self.parse_data_type()?);
5206
+
5207
+ let return_table = self.maybe_parse(|p| {
5208
+ let return_table_name = p.parse_identifier()?;
5209
+ let table_column_defs = if p.peek_keyword(Keyword::TABLE) {
5210
+ match p.parse_data_type()? {
5211
+ DataType::Table(t) => t,
5212
+ _ => {
5213
+ return parser_err!(
5214
+ "Expected table data type after TABLE keyword, got {:?}",
5215
+ p.peek_token()
5216
+ )?
5217
+ }
5218
+ }
5219
+ } else {
5220
+ return parser_err!(
5221
+ "Expected TABLE keyword after return type, got {:?}",
5222
+ p.peek_token()
5223
+ );
5224
+ };
5225
+ Ok(DataType::NamedTable(
5226
+ ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
5227
+ table_column_defs.clone(),
5228
+ ))
5229
+ })?;
5230
+
5231
+ let return_type = if return_table.is_some() {
5232
+ return_table
5233
+ } else {
5234
+ Some(self.parse_data_type()?)
5235
+ };
5207
5236
5208
5237
self.expect_keyword_is(Keyword::AS)?;
5209
5238
Original file line number Diff line number Diff line change @@ -296,6 +296,17 @@ fn parse_create_function() {
296
296
RETURN (SELECT 1 AS col_1)\
297
297
";
298
298
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) ;
299
310
}
300
311
301
312
#[ test]
You can’t perform that action at this time.
0 commit comments