@@ -52,6 +52,18 @@ pub struct UDFScript {
5252 pub immutable : Option < bool > ,
5353}
5454
55+ #[ derive( Clone , Debug , Eq , PartialEq , Hash ) ]
56+ pub struct UDTFServer {
57+ pub address : String ,
58+ pub handler : String ,
59+ pub headers : BTreeMap < String , String > ,
60+ pub language : String ,
61+ pub arg_names : Vec < String > ,
62+ pub arg_types : Vec < DataType > ,
63+ pub return_types : Vec < ( String , DataType ) > ,
64+ pub immutable : Option < bool > ,
65+ }
66+
5567/// User Defined Table Function (UDTF)
5668///
5769/// # Fields
@@ -98,6 +110,7 @@ pub enum UDFDefinition {
98110 UDFServer ( UDFServer ) ,
99111 UDFScript ( UDFScript ) ,
100112 UDAFScript ( UDAFScript ) ,
113+ UDTFServer ( UDTFServer ) ,
101114 UDTF ( UDTF ) ,
102115 ScalarUDF ( ScalarUDF ) ,
103116}
@@ -110,7 +123,8 @@ impl UDFDefinition {
110123 Self :: UDFScript ( _) => "UDFScript" ,
111124 Self :: UDAFScript ( _) => "UDAFScript" ,
112125 Self :: UDTF ( _) => "UDTF" ,
113- UDFDefinition :: ScalarUDF ( _) => "ScalarUDF" ,
126+ Self :: UDTFServer ( _) => "UDTFServer" ,
127+ Self :: ScalarUDF ( _) => "ScalarUDF" ,
114128 }
115129 }
116130
@@ -120,6 +134,7 @@ impl UDFDefinition {
120134 Self :: UDFServer ( _) => false ,
121135 Self :: UDFScript ( _) => false ,
122136 Self :: UDTF ( _) => false ,
137+ Self :: UDTFServer ( _) => false ,
123138 Self :: ScalarUDF ( _) => false ,
124139 Self :: UDAFScript ( _) => true ,
125140 }
@@ -130,6 +145,7 @@ impl UDFDefinition {
130145 Self :: LambdaUDF ( _) => "SQL" ,
131146 Self :: UDTF ( _) => "SQL" ,
132147 Self :: ScalarUDF ( _) => "SQL" ,
148+ Self :: UDTFServer ( x) => x. language . as_str ( ) ,
133149 Self :: UDFServer ( x) => x. language . as_str ( ) ,
134150 Self :: UDFScript ( x) => x. language . as_str ( ) ,
135151 Self :: UDAFScript ( x) => x. language . as_str ( ) ,
@@ -220,6 +236,13 @@ impl UserDefinedFunction {
220236 created_on : Utc :: now ( ) ,
221237 }
222238 }
239+
240+ pub fn as_udtf_server ( self ) -> Option < UDTFServer > {
241+ if let UDFDefinition :: UDTFServer ( udtf_server) = self . definition {
242+ return Some ( udtf_server) ;
243+ }
244+ None
245+ }
223246}
224247
225248impl Display for UDFDefinition {
@@ -353,6 +376,50 @@ impl Display for UDFDefinition {
353376 }
354377 write ! ( f, ") AS $${sql}$$" ) ?;
355378 }
379+ UDFDefinition :: UDTFServer ( UDTFServer {
380+ address,
381+ handler,
382+ headers,
383+ language,
384+ arg_names,
385+ arg_types,
386+ return_types,
387+ immutable,
388+ } ) => {
389+ for ( i, ( name, ty) ) in arg_names. iter ( ) . zip ( arg_types. iter ( ) ) . enumerate ( ) {
390+ if i > 0 {
391+ write ! ( f, ", " ) ?;
392+ }
393+ write ! ( f, "{name} {ty}" ) ?;
394+ }
395+ write ! ( f, ") RETURNS (" ) ?;
396+ for ( i, ( name, ty) ) in return_types. iter ( ) . enumerate ( ) {
397+ if i > 0 {
398+ write ! ( f, ", " ) ?;
399+ }
400+ write ! ( f, "{name} {ty}" ) ?;
401+ }
402+ write ! ( f, ") LANGUAGE {language}" ) ?;
403+ if let Some ( immutable) = immutable {
404+ if * immutable {
405+ write ! ( f, " IMMUTABLE" ) ?;
406+ } else {
407+ write ! ( f, " VOLATILE" ) ?;
408+ }
409+ }
410+ write ! ( f, " HANDLER = {handler}" ) ?;
411+ if !headers. is_empty ( ) {
412+ write ! ( f, " HEADERS = (" ) ?;
413+ for ( i, ( key, value) ) in headers. iter ( ) . enumerate ( ) {
414+ if i > 0 {
415+ write ! ( f, ", " ) ?;
416+ }
417+ write ! ( f, "{key} = {value}" ) ?;
418+ }
419+ write ! ( f, ")" ) ?;
420+ }
421+ write ! ( f, " ADDRESS = {address}" ) ?;
422+ }
356423 UDFDefinition :: ScalarUDF ( ScalarUDF {
357424 arg_types,
358425 return_type,
0 commit comments