Hi all, Thank you for the valuable input. Since there are no new objections or suggestions, I will open a voting thread in two days.
Best, Feng On Thu, Dec 21, 2023 at 6:58 PM Benchao Li <libenc...@apache.org> wrote: > I'm glad to hear that this is in your plan. Sorry that I overlooked > the PoC link in the FLIP previously, I'll go over the code of PoC, and > post here if there are any more concerns. > > Xuyang <xyzhong...@163.com> 于2023年12月21日周四 10:39写道: > > > > > Hi, Benchao. > > > > > > When Feng Jin and I tried the poc together, we found that when using > udaf, Calcite directly using the function's input parameters from > SqlCall#getOperandList. But in fact, these input parameters may use named > arguments, the order of parameters may be wrong, and they may not include > optional parameters that need to set default values. Actually, we should > use new SqlCallBinding(this, scope, call).operands() to let this method > correct the order and add default values. (You can see the modification in > SqlToRelConverter in poc branch[1]) > > > > > > We have not reported this bug to the calcite community yet. Our original > plan was to report this bug to the calcite community during the process of > doing this flip, and fix it separately in flink's own calcite file. Because > the time for Calcite to release the version is uncertain. And the time to > upgrade flink to the latest calcite version is also unknown. > > > > > > The link to the poc code is at the bottom of the flip[2]. I'm post it > here again[1]. > > > > > > [1] > https://cwiki.apache.org/confluence/display/FLINK/FLIP-387%3A+Support+named+parameters+for+functions+and+call+procedures > > [2] > https://github.com/apache/flink/compare/master...hackergin:flink:poc_named_argument > > > > > > > > -- > > > > Best! > > Xuyang > > > > > > > > > > > > 在 2023-12-20 13:31:26,"Benchao Li" <libenc...@apache.org> 写道: > > >I didn't see your POC code, so I assumed that you'll need to add > > >SqlStdOperatorTable#DEFAULT and > > >SqlStdOperatorTable#ARGUMENT_ASSIGNMENT to FlinkSqlOperatorTable, am I > > >right? > > > > > >If yes, this would enable many builtin functions to allow default and > > >optional arguments, for example, `select md5(DEFAULT)`, I guess this > > >is not what we want to support right? If so, I would suggest to throw > > >proper errors for these unexpected usages. > > > > > >Benchao Li <libenc...@apache.org> 于2023年12月20日周三 13:16写道: > > >> > > >> Thanks Feng for driving this, it's a very useful feature. > > >> > > >> In the FLIP, you mentioned that > > >> > During POC verification, bugs were discovered in Calcite that > caused issues during the validation phase. We need to modify the > SqlValidatorImpl and SqlToRelConverter to address these problems. > > >> > > >> Could you log bugs in Calcite, and reference the corresponding Jira > > >> number in your code. We want to upgrade Calcite version to latest as > > >> much as possible, and maintaining many bugfixes in Flink will add > > >> additional burdens for upgrading Calcite. By adding corresponding > > >> issue numbers, we can easily make sure that we can remove these Flink > > >> hosted bugfixes when we upgrade to a version that already contains the > > >> fix. > > >> > > >> Feng Jin <jinfeng1...@gmail.com> 于2023年12月14日周四 19:30写道: > > >> > > > >> > Hi Timo > > >> > Thanks for your reply. > > >> > > > >> > > 1) ArgumentNames annotation > > >> > > > >> > I'm sorry for my incorrect expression. argumentNames is a method of > > >> > FunctionHints. We should introduce a new arguments method to > replace this > > >> > method and return Argument[]. > > >> > I updated the FLIP doc about this part. > > >> > > > >> > > 2) Evolution of FunctionHint > > >> > > > >> > +1 define DataTypeHint as part of ArgumentHint. I'll update the > FLIP doc. > > >> > > > >> > > 3) Semantical correctness > > >> > > > >> > I realized that I forgot to submit the latest modification of the > FLIP > > >> > document. Xuyang and I had a prior discussion before starting this > discuss. > > >> > Let's restrict it to supporting only one eval() function, which will > > >> > simplify the overall design. > > >> > > > >> > Therefore, I also concur with not permitting overloaded named > parameters. > > >> > > > >> > > > >> > Best, > > >> > Feng > > >> > > > >> > On Thu, Dec 14, 2023 at 6:15 PM Timo Walther <twal...@apache.org> > wrote: > > >> > > > >> > > Hi Feng, > > >> > > > > >> > > thank you for proposing this FLIP. This nicely completes FLIP-65 > which > > >> > > is great for usability. > > >> > > > > >> > > I read the FLIP and have some feedback: > > >> > > > > >> > > > > >> > > 1) ArgumentNames annotation > > >> > > > > >> > > > Deprecate the ArgumentNames annotation as it is not > user-friendly for > > >> > > specifying argument names with optional configuration. > > >> > > > > >> > > Which annotation does the FLIP reference here? I cannot find it > in the > > >> > > Flink code base. > > >> > > > > >> > > 2) Evolution of FunctionHint > > >> > > > > >> > > Introducing @ArgumentHint makes a lot of sense to me. However, > using it > > >> > > within @FunctionHint looks complex, because there is both > `input=` and > > >> > > `arguments=`. Ideally, the @DataTypeHint can be defined inline as > part > > >> > > of the @ArgumentHint. It could even be the `value` such that > > >> > > `@ArgumentHint(@DataTypeHint("INT"))` is valid on its own. > > >> > > > > >> > > We could deprecate `input=`. Or let both `input` and `arguments=` > > >> > > coexist but never be defined at the same time. > > >> > > > > >> > > 3) Semantical correctness > > >> > > > > >> > > As you can see in the `TypeInference` class, named parameters are > > >> > > prepared in the stack already. However, we need to watch out > between > > >> > > helpful explanation (see > `InputTypeStrategy#getExpectedSignatures`) and > > >> > > named parameters (see `TypeInference.Builder#namedArguments`) > that can > > >> > > be used in SQL. > > >> > > > > >> > > If I remember correctly, named parameters can be reordered and > don't > > >> > > allow overloading of signatures. Thus, only a single eval() > should have > > >> > > named parameters. Looking at the FLIP it seems you would like to > support > > >> > > multiple parameter lists. What changes are you planning to > TypeInference > > >> > > (which is also declared as @PublicEvoving)? This should also be > > >> > > documented as the annotations should compile into this class. > > >> > > > > >> > > In general, I would prefer to keep it simple and don't allow > overloading > > >> > > named parameters. With the optionality, users can add an arbitrary > > >> > > number of parameters to the signature of the same eval method. > > >> > > > > >> > > Regards, > > >> > > Timo > > >> > > > > >> > > On 14.12.23 10:02, Feng Jin wrote: > > >> > > > Hi all, > > >> > > > > > >> > > > > > >> > > > Xuyang and I would like to start a discussion of FLIP-387: > Support > > >> > > > named parameters for functions and call procedures [1] > > >> > > > > > >> > > > Currently, when users call a function or call a procedure, they > must > > >> > > > specify all fields in order. When there are a large number of > > >> > > > parameters, it is easy to make mistakes and cannot omit > specifying > > >> > > > non-mandatory fields. > > >> > > > > > >> > > > By using named parameters, you can selectively specify the > required > > >> > > > parameters, reducing the probability of errors and making it > more > > >> > > > convenient to use. > > >> > > > > > >> > > > Here is an example of using Named Procedure. > > >> > > > ``` > > >> > > > -- for scalar function > > >> > > > SELECT my_scalar_function(param1 => ‘value1’, param2 => > ‘value2’’) FROM > > >> > > [] > > >> > > > > > >> > > > -- for table function > > >> > > > SELECT * FROM TABLE(my_table_function(param1 => 'value1', > param2 => > > >> > > 'value2')) > > >> > > > > > >> > > > -- for agg function > > >> > > > SELECT my_agg_function(param1 => 'value1', param2 => 'value2') > FROM [] > > >> > > > > > >> > > > -- for call procedure > > >> > > > CALL procedure_name(param1 => ‘value1’, param2 => ‘value2’) > > >> > > > ``` > > >> > > > > > >> > > > For UDX and Call procedure developers, we introduce a new > annotation > > >> > > > to specify the parameter name, indicate if it is optional, and > > >> > > > potentially support specifying default values in the future > > >> > > > > > >> > > > ``` > > >> > > > public @interface ArgumentHint { > > >> > > > /** > > >> > > > * The name of the parameter, default is an empty string. > > >> > > > */ > > >> > > > String name() default ""; > > >> > > > > > >> > > > /** > > >> > > > * Whether the parameter is optional, default is true. > > >> > > > */ > > >> > > > boolean isOptional() default true; > > >> > > > }} > > >> > > > ``` > > >> > > > > > >> > > > ``` > > >> > > > // Call Procedure Development > > >> > > > > > >> > > > public static class NamedArgumentsProcedure implements > Procedure { > > >> > > > > > >> > > > // Example usage: CALL myNamedProcedure(in1 => 'value1', > in2 => > > >> > > 'value2') > > >> > > > > > >> > > > // Example usage: CALL myNamedProcedure(in1 => 'value1', > in2 => > > >> > > > 'value2', in3 => 'value3') > > >> > > > > > >> > > > @ProcedureHint( > > >> > > > input = {@DataTypeHint(value = "STRING"), > > >> > > > @DataTypeHint(value = "STRING"), @DataTypeHint(value = > "STRING")}, > > >> > > > output = @DataTypeHint("STRING"), > > >> > > > arguments = { > > >> > > > @ArgumentHint(name = "in1", isOptional = > false), > > >> > > > @ArgumentHint(name = "in2", isOptional = true) > > >> > > > @ArgumentHint(name = "in3", isOptional = > true)}) > > >> > > > public String[] call(ProcedureContext procedureContext, > String > > >> > > > arg1, String arg2, String arg3) { > > >> > > > return new String[]{arg1 + ", " + arg2 + "," + arg3}; > > >> > > > } > > >> > > > } > > >> > > > ``` > > >> > > > > > >> > > > > > >> > > > Currently, we offer support for two scenarios when calling a > function > > >> > > > or procedure: > > >> > > > > > >> > > > 1. The corresponding parameters can be specified using the > parameter > > >> > > > name, without a specific order. > > >> > > > 2. Unnecessary parameters can be omitted. > > >> > > > > > >> > > > > > >> > > > There are still some limitations when using Named parameters: > > >> > > > 1. Named parameters do not support variable arguments. > > >> > > > 2. UDX or procedure classes that support named parameters can > only > > >> > > > have one eval method. > > >> > > > 3. Due to the current limitations of Calcite-947[2], we cannot > specify > > >> > > > a default value for omitted parameters, which is Null by > default. > > >> > > > > > >> > > > > > >> > > > > > >> > > > Also, thanks very much for the suggestions and help provided by > Zelin > > >> > > > and Lincoln. > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > 1. > > >> > > > https://cwiki.apache.org/confluence/display/FLINK/FLIP-387%3A+Support+named+parameters+for+functions+and+call+procedures > > >> > > . > > >> > > > > > >> > > > 2. https://issues.apache.org/jira/browse/CALCITE-947 > > >> > > > > > >> > > > > > >> > > > > > >> > > > Best, > > >> > > > > > >> > > > Feng > > >> > > > > > >> > > > > >> > > > > >> > > >> > > >> > > >> -- > > >> > > >> Best, > > >> Benchao Li > > > > > > > > > > > >-- > > > > > >Best, > > >Benchao Li > > > > -- > > Best, > Benchao Li >