I also like the 'System' keyword. I think we can assume we reached consensus on this topic.
On Sat, 21 Sep 2019, 06:37 Xuefu Z, <usxu...@gmail.com> wrote: > +1 for using the keyword "SYSTEM". Thanks to Timo for chiming in! > > --Xuefu > > On Fri, Sep 20, 2019 at 3:28 PM Timo Walther <twal...@apache.org> wrote: > > > Hi everyone, > > > > sorry, for the late replay. I give also +1 for option #2. Thus, I guess > > we have a clear winner. > > > > I would also like to find a better keyword/syntax for this statement. > > Esp. the BUILTIN keyword can confuse people, because it could be written > > as BUILTIN, BUILDIN, BUILT_IN, or BUILD_IN. And we would need to > > introduce a new reserved keyword in the parser which affects also > > non-DDL queries. How about: > > > > CREATE TEMPORARY SYSTEM FUNCTION xxx > > > > The SYSTEM keyword is already a reserved keyword and in FLIP-66 we are > > discussing to prefix some of the function with a SYSTEM_ prefix like > > SYSTEM_WATERMARK. Also SQL defines syntax like "FOR SYSTEM_TIME AS OF". > > > > What do you think? > > > > Thanks, > > Timo > > > > > > On 20.09.19 05:45, Bowen Li wrote: > > > Another reason I prefer "CREATE TEMPORARY BUILTIN FUNCTION" over "ALTER > > > BUILTIN FUNCTION xxx TEMPORARILY" is - what if users want to drop the > > > temporary built-in function in the same session? With the former one, > > they > > > can run something like "DROP TEMPORARY BUILTIN FUNCTION"; With the > latter > > > one, I'm not sure how users can "restore" the original builtin function > > > easily from an "altered" function without introducing further > nonstandard > > > SQL syntax. > > > > > > Also please pardon me as I realized using net may not be a good idea... > > I'm > > > trying to fit this vote into cases listed in Flink Bylaw [1]. > > > > > > >From the following result, the majority seems to be #2 too as it has > the > > > most approval so far and doesn't have strong "-1". > > > > > > #1:3 (+1), 1 (0), 4(-1) > > > #2:4(0), 3 (+1), 1(+0.5) > > > * Dawid -1/0 depending on keyword > > > #3:2(+1), 3(-1), 3(0) > > > > > > [1] > > > > > > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=120731026 > > > > > > On Thu, Sep 19, 2019 at 10:30 AM Bowen Li <bowenl...@gmail.com> wrote: > > > > > >> Hi, > > >> > > >> Thanks everyone for your votes. I summarized the result as following: > > >> > > >> #1:3 (+1), 1 (0), 4(-1) - net: -1 > > >> #2:4(0), 2 (+1), 1(+0.5) - net: +2.5 > > >> Dawid -1/0 depending on keyword > > >> #3:2(+1), 3(-1), 3(0) - net: -1 > > >> > > >> Given the result, I'd like to change my vote for #2 from 0 to +1, to > > make > > >> it a stronger case with net +3.5. So the votes so far are: > > >> > > >> #1:3 (+1), 1 (0), 4(-1) - net: -1 > > >> #2:4(0), 3 (+1), 1(+0.5) - net: +3.5 > > >> Dawid -1/0 depending on keyword > > >> #3:2(+1), 3(-1), 3(0) - net: -1 > > >> > > >> What do you think? Do you think we can conclude with this result? Or > > would > > >> you like to take it as a formal FLIP vote with 3 days voting period? > > >> > > >> BTW, I'd prefer "CREATE TEMPORARY BUILTIN FUNCTION" over "ALTER > BUILTIN > > >> FUNCTION xxx TEMPORARILY" because > > >> 1. the syntax is more consistent with "CREATE FUNCTION" and "CREATE > > >> TEMPORARY FUNCTION" > > >> 2. "ALTER BUILTIN FUNCTION xxx TEMPORARILY" implies it alters a > built-in > > >> function but it actually doesn't, the logic only creates a temp > function > > >> with higher priority than that built-in function in ambiguous > resolution > > >> order; and it would behave inconsistently with "ALTER FUNCTION". > > >> > > >> > > >> > > >> On Thu, Sep 19, 2019 at 2:58 AM Fabian Hueske <fhue...@gmail.com> > > wrote: > > >> > > >>> I agree, it's very similar from the implementation point of view and > > the > > >>> implications. > > >>> > > >>> IMO, the difference is mostly on the mental model for the user. > > >>> Instead of having a special class of temporary functions that have > > >>> precedence over builtin functions it suggests to temporarily change > > >>> built-in functions. > > >>> > > >>> Fabian > > >>> > > >>> Am Do., 19. Sept. 2019 um 11:52 Uhr schrieb Kurt Young < > > ykt...@gmail.com > > >>>> : > > >>>> Hi Fabian, > > >>>> > > >>>> I think it's almost the same with #2 with different keyword: > > >>>> > > >>>> CREATE TEMPORARY BUILTIN FUNCTION xxx > > >>>> > > >>>> Best, > > >>>> Kurt > > >>>> > > >>>> > > >>>> On Thu, Sep 19, 2019 at 5:50 PM Fabian Hueske <fhue...@gmail.com> > > >>> wrote: > > >>>>> Hi, > > >>>>> > > >>>>> I thought about it a bit more and think that there is some good > value > > >>> in > > >>>> my > > >>>>> last proposal. > > >>>>> > > >>>>> A lot of complexity comes from the fact that we want to allow > > >>> overriding > > >>>>> built-in functions which are differently addressed as other > functions > > >>>> (and > > >>>>> db objects). > > >>>>> We could just have "CREATE TEMPORARY FUNCTION" do exactly the same > > >>> thing > > >>>> as > > >>>>> "CREATE FUNCTION" and treat both functions exactly the same except > > >>> that: > > >>>>> 1) temp functions disappear at the end of the session > > >>>>> 2) temp function are resolved before other functions > > >>>>> > > >>>>> This would be Dawid's proposal from the beginning of this thread > (in > > >>> case > > >>>>> you still remember... ;-) ) > > >>>>> > > >>>>> Temporarily overriding built-in functions would be supported with > an > > >>>>> explicit command like > > >>>>> > > >>>>> ALTER BUILTIN FUNCTION xxx TEMPORARILY AS ... > > >>>>> > > >>>>> This would also address the concerns about accidentally changing > the > > >>>>> semantics of built-in functions. > > >>>>> IMO, it can't get much more explicit than the above command. > > >>>>> > > >>>>> Sorry for bringing up a new option in the middle of the discussion, > > >>> but > > >>>> as > > >>>>> I said, I think it has a bunch of benefits and I don't see major > > >>>> drawbacks > > >>>>> (maybe you do?). > > >>>>> > > >>>>> What do you think? > > >>>>> > > >>>>> Fabian > > >>>>> > > >>>>> Am Do., 19. Sept. 2019 um 11:24 Uhr schrieb Fabian Hueske < > > >>>>> fhue...@gmail.com > > >>>>>> : > > >>>>>> Hi everyone, > > >>>>>> > > >>>>>> I thought again about option #1 and something that I don't like is > > >>> that > > >>>>>> the resolved address of xyz is different in "CREATE FUNCTION xyz" > > >>> and > > >>>>>> "CREATE TEMPORARY FUNCTION xyz". > > >>>>>> IMO, adding the keyword "TEMPORARY" should only change the > > >>> lifecycle of > > >>>>>> the function, but not where it is located. This implicitly changed > > >>>>> location > > >>>>>> might be confusing for users. > > >>>>>> After all, a temp function should behave pretty much like any > other > > >>>>>> function, except for the fact that it disappears when the session > is > > >>>>> closed. > > >>>>>> Approach #2 with the additional keyword would make that pretty > > >>> clear, > > >>>>> IMO. > > >>>>>> However, I neither like GLOBAL (for reasons mentioned by Dawid) or > > >>>>> BUILDIN > > >>>>>> (we are not adding a built-in function). > > >>>>>> So I'd be OK with #2 if we find a good keyword. In fact, approach > #2 > > >>>>> could > > >>>>>> also be an alias for approach #3 to avoid explicit specification > of > > >>> the > > >>>>>> system catalog/db. > > >>>>>> > > >>>>>> Approach #3 would be consistent with other db objects and the > > >>> "CREATE > > >>>>>> FUNCTION" statement. > > >>>>>> Adding system catalog/db seems rather complex, but then again how > > >>> often > > >>>>> do > > >>>>>> we expect users to override built-in functions? If this becomes a > > >>> major > > >>>>>> issue, we can still add option #2 as an alias. > > >>>>>> > > >>>>>> Not sure what's the best approach from an internal point of view, > > >>> but I > > >>>>>> certainly think that consistent behavior is important. > > >>>>>> Hence my votes are: > > >>>>>> > > >>>>>> -1 for #1 > > >>>>>> 0 for #2 > > >>>>>> 0 for #3 > > >>>>>> > > >>>>>> Btw. Did we consider a completely separate command for overriding > > >>>>> built-in > > >>>>>> functions like "ALTER BUILTIN FUNCTION xxx TEMPORARILY AS ..."? > > >>>>>> > > >>>>>> Cheers, Fabian > > >>>>>> > > >>>>>> > > >>>>>> Am Do., 19. Sept. 2019 um 11:03 Uhr schrieb JingsongLee > > >>>>>> <lzljs3620...@aliyun.com.invalid>: > > >>>>>> > > >>>>>>> I know Hive and Spark can shadow built-in functions by temporary > > >>>>> function. > > >>>>>>> Mysql, Oracle, Sql server can not shadow. > > >>>>>>> User can use full names to access functions instead of shadowing. > > >>>>>>> > > >>>>>>> So I think it is a completely new thing, and the direct way to > deal > > >>>> with > > >>>>>>> new things is to add new grammar. So, > > >>>>>>> +1 for #2, +0 for #3, -1 for #1 > > >>>>>>> > > >>>>>>> Best, > > >>>>>>> Jingsong Lee > > >>>>>>> > > >>>>>>> > > >>>>>>> > ------------------------------------------------------------------ > > >>>>>>> From:Kurt Young <ykt...@gmail.com> > > >>>>>>> Send Time:2019年9月19日(星期四) 16:43 > > >>>>>>> To:dev <dev@flink.apache.org> > > >>>>>>> Subject:Re: [DISCUSS] FLIP-57 - Rework FunctionCatalog > > >>>>>>> > > >>>>>>> And let me make my vote complete: > > >>>>>>> > > >>>>>>> -1 for #1 > > >>>>>>> +1 for #2 with different keyword > > >>>>>>> -0 for #3 > > >>>>>>> > > >>>>>>> Best, > > >>>>>>> Kurt > > >>>>>>> > > >>>>>>> > > >>>>>>> On Thu, Sep 19, 2019 at 4:40 PM Kurt Young <ykt...@gmail.com> > > >>> wrote: > > >>>>>>>> Looks like I'm the only person who is willing to +1 to #2 for > now > > >>>> :-) > > >>>>>>>> But I would suggest to change the keyword from GLOBAL to > > >>>>>>>> something like BUILTIN. > > >>>>>>>> > > >>>>>>>> I think #2 and #3 are almost the same proposal, just with > > >>> different > > >>>>>>>> format to indicate whether it want to override built-in > > >>> functions. > > >>>>>>>> My biggest reason to choose it is I want this behavior be > > >>> consistent > > >>>>>>>> with temporal tables. I will give some examples to show the > > >>> behavior > > >>>>>>>> and also make sure I'm not misunderstanding anything here. > > >>>>>>>> > > >>>>>>>> For most DBs, when user create a temporary table with: > > >>>>>>>> > > >>>>>>>> CREATE TEMPORARY TABLE t1 > > >>>>>>>> > > >>>>>>>> It's actually equivalent with: > > >>>>>>>> > > >>>>>>>> CREATE TEMPORARY TABLE `curent_db`.t1 > > >>>>>>>> > > >>>>>>>> If user change current database, they will not be able to access > > >>> t1 > > >>>>>>> without > > >>>>>>>> fully qualified name, .i.e db1.t1 (assuming db1 is current > > >>> database > > >>>>> when > > >>>>>>>> this temporary table is created). > > >>>>>>>> > > >>>>>>>> Only #2 and #3 followed this behavior and I would vote for this > > >>>> since > > >>>>>>> this > > >>>>>>>> makes such behavior consistent through temporal tables and > > >>>> functions. > > >>>>>>>> Why I'm not voting for #3 is a special catalog and database just > > >>>> looks > > >>>>>>> very > > >>>>>>>> hacky to me. It gave a imply that our built-in functions saved > > >>> at a > > >>>>>>>> special > > >>>>>>>> catalog and database, which is actually not. Introducing a > > >>> dedicated > > >>>>>>>> keyword > > >>>>>>>> like CREATE TEMPORARY BUILTIN FUNCTION looks more clear and > > >>>>>>>> straightforward. One can argue that we should avoid introducing > > >>> new > > >>>>>>>> keyword, > > >>>>>>>> but it's also very rare that a system can overwrite built-in > > >>>>> functions. > > >>>>>>>> Since we > > >>>>>>>> decided to support this, introduce a new keyword is not a big > > >>> deal > > >>>>> IMO. > > >>>>>>>> Best, > > >>>>>>>> Kurt > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> On Thu, Sep 19, 2019 at 3:07 PM Piotr Nowojski < > > >>> pi...@ververica.com > > >>>>>>>> wrote: > > >>>>>>>> > > >>>>>>>>> Hi, > > >>>>>>>>> > > >>>>>>>>> It is a quite long discussion to follow and I hope I didn’t > > >>>>>>> misunderstand > > >>>>>>>>> anything. From the proposals presented by Xuefu I would vote: > > >>>>>>>>> > > >>>>>>>>> -1 for #1 and #2 > > >>>>>>>>> +1 for #3 > > >>>>>>>>> > > >>>>>>>>> Besides #3 being IMO more general and more consistent, having > > >>>>> qualified > > >>>>>>>>> names (#3) would help/make easier for someone to use cross > > >>>>>>>>> databases/catalogs queries (joining multiple data > sets/streams). > > >>>> For > > >>>>>>>>> example with some functions to manipulate/clean up/convert the > > >>>> stored > > >>>>>>> data > > >>>>>>>>> in different catalogs registered in the respective catalogs. > > >>>>>>>>> > > >>>>>>>>> Piotrek > > >>>>>>>>> > > >>>>>>>>>> On 19 Sep 2019, at 06:35, Jark Wu <imj...@gmail.com> wrote: > > >>>>>>>>>> > > >>>>>>>>>> I agree with Xuefu that inconsistent handling with all the > > >>> other > > >>>>>>>>> objects is > > >>>>>>>>>> not a big problem. > > >>>>>>>>>> > > >>>>>>>>>> Regarding to option#3, the special "system.system" namespace > > >>> may > > >>>>>>> confuse > > >>>>>>>>>> users. > > >>>>>>>>>> Users need to know the set of built-in function names to know > > >>>> when > > >>>>> to > > >>>>>>>>> use > > >>>>>>>>>> "system.system" namespace. > > >>>>>>>>>> What will happen if user registers a non-builtin function name > > >>>>> under > > >>>>>>> the > > >>>>>>>>>> "system.system" namespace? > > >>>>>>>>>> Besides, I think it doesn't solve the "explode" problem I > > >>>> mentioned > > >>>>>>> at > > >>>>>>>>> the > > >>>>>>>>>> beginning of this thread. > > >>>>>>>>>> > > >>>>>>>>>> So here is my vote: > > >>>>>>>>>> > > >>>>>>>>>> +1 for #1 > > >>>>>>>>>> 0 for #2 > > >>>>>>>>>> -1 for #3 > > >>>>>>>>>> > > >>>>>>>>>> Best, > > >>>>>>>>>> Jark > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> On Thu, 19 Sep 2019 at 08:38, Xuefu Z <usxu...@gmail.com> > > >>> wrote: > > >>>>>>>>>>> @Dawid, Re: we also don't need additional referencing the > > >>>>>>>>> specialcatalog > > >>>>>>>>>>> anywhere. > > >>>>>>>>>>> > > >>>>>>>>>>> True. But once we allow such reference, then user can do so > > >>> in > > >>>> any > > >>>>>>>>> possible > > >>>>>>>>>>> place where a function name is expected, for which we have to > > >>>>>>> handle. > > >>>>>>>>>>> That's a big difference, I think. > > >>>>>>>>>>> > > >>>>>>>>>>> Thanks, > > >>>>>>>>>>> Xuefu > > >>>>>>>>>>> > > >>>>>>>>>>> On Wed, Sep 18, 2019 at 5:25 PM Dawid Wysakowicz < > > >>>>>>>>>>> wysakowicz.da...@gmail.com> > > >>>>>>>>>>> wrote: > > >>>>>>>>>>> > > >>>>>>>>>>>> @Bowen I am not suggesting introducing additional catalog. I > > >>>>> think > > >>>>>>> we > > >>>>>>>>>>> need > > >>>>>>>>>>>> to get rid of the current built-in catalog. > > >>>>>>>>>>>> > > >>>>>>>>>>>> @Xuefu in option #3 we also don't need additional > > >>> referencing > > >>>> the > > >>>>>>>>> special > > >>>>>>>>>>>> catalog anywhere else besides in the CREATE statement. The > > >>>>>>> resolution > > >>>>>>>>>>>> behaviour is exactly the same in both options. > > >>>>>>>>>>>> > > >>>>>>>>>>>> On Thu, 19 Sep 2019, 08:17 Xuefu Z, <usxu...@gmail.com> > > >>> wrote: > > >>>>>>>>>>>>> Hi Dawid, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> "GLOBAL" is a temporary keyword that was given to the > > >>>> approach. > > >>>>> It > > >>>>>>>>> can > > >>>>>>>>>>> be > > >>>>>>>>>>>>> changed to something else for better. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> The difference between this and the #3 approach is that we > > >>>> only > > >>>>>>> need > > >>>>>>>>>>> the > > >>>>>>>>>>>>> keyword for this create DDL. For other places (such as > > >>>> function > > >>>>>>>>>>>>> referencing), no keyword or special namespace is needed. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>> Xuefu > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> On Wed, Sep 18, 2019 at 4:32 PM Dawid Wysakowicz < > > >>>>>>>>>>>>> wysakowicz.da...@gmail.com> > > >>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>> I think it makes sense to start voting at this point. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Option 1: Only 1-part identifiers > > >>>>>>>>>>>>>> PROS: > > >>>>>>>>>>>>>> - allows shadowing built-in functions > > >>>>>>>>>>>>>> CONS: > > >>>>>>>>>>>>>> - incosistent with all the other objects, both permanent & > > >>>>>>> temporary > > >>>>>>>>>>>>>> - does not allow shadowing catalog functions > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Option 2: Special keyword for built-in function > > >>>>>>>>>>>>>> I think this is quite similar to the special catalog/db. > > >>> The > > >>>>>>> thing I > > >>>>>>>>>>> am > > >>>>>>>>>>>>>> strongly against in this proposal is the GLOBAL keyword. > > >>> This > > >>>>>>>>> keyword > > >>>>>>>>>>>>> has a > > >>>>>>>>>>>>>> meaning in rdbms systems and means a function that is > > >>> present > > >>>>>>> for a > > >>>>>>>>>>>>>> lifetime of a session in which it was created, but > > >>> available > > >>>> in > > >>>>>>> all > > >>>>>>>>>>>> other > > >>>>>>>>>>>>>> sessions. Therefore I really don't want to use this > > >>> keyword > > >>>> in > > >>>>> a > > >>>>>>>>>>>>> different > > >>>>>>>>>>>>>> context. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Option 3: Special catalog/db > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> PROS: > > >>>>>>>>>>>>>> - allows shadowing built-in functions > > >>>>>>>>>>>>>> - allows shadowing catalog functions > > >>>>>>>>>>>>>> - consistent with other objects > > >>>>>>>>>>>>>> CONS: > > >>>>>>>>>>>>>> - we introduce a special namespace for built-in functions > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> I don't see a problem with introducing the special > > >>> namespace. > > >>>>> In > > >>>>>>> the > > >>>>>>>>>>>> end > > >>>>>>>>>>>>> it > > >>>>>>>>>>>>>> is very similar to the keyword approach. In this case the > > >>>>>>> catalog/db > > >>>>>>>>>>>>>> combination would be the "keyword" > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Therefore my votes: > > >>>>>>>>>>>>>> Option 1: -0 > > >>>>>>>>>>>>>> Option 2: -1 (I might change to +0 if we can come up with > > >>> a > > >>>>>>> better > > >>>>>>>>>>>>> keyword) > > >>>>>>>>>>>>>> Option 3: +1 > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Best, > > >>>>>>>>>>>>>> Dawid > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Thu, 19 Sep 2019, 05:12 Xuefu Z, <usxu...@gmail.com> > > >>>> wrote: > > >>>>>>>>>>>>>>> Hi Aljoscha, > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Thanks for the summary and these are great questions to > > >>> be > > >>>>>>>>>>> answered. > > >>>>>>>>>>>>> The > > >>>>>>>>>>>>>>> answer to your first question is clear: there is a > > >>> general > > >>>>>>>>>>> agreement > > >>>>>>>>>>>> to > > >>>>>>>>>>>>>>> override built-in functions with temp functions. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> However, your second and third questions are sort of > > >>>> related, > > >>>>>>> as a > > >>>>>>>>>>>>>> function > > >>>>>>>>>>>>>>> reference can be either just function name (like "func") > > >>> or > > >>>> in > > >>>>>>> the > > >>>>>>>>>>>> form > > >>>>>>>>>>>>>> or > > >>>>>>>>>>>>>>> "cat.db.func". When a reference is just function name, it > > >>>> can > > >>>>>>> mean > > >>>>>>>>>>>>>> either a > > >>>>>>>>>>>>>>> built-in function or a function defined in the current > > >>>> cat/db. > > >>>>>>> If > > >>>>>>>>>>> we > > >>>>>>>>>>>>>>> support overriding a built-in function with a temp > > >>> function, > > >>>>>>> such > > >>>>>>>>>>>>>>> overriding can also cover a function in the current > > >>> cat/db. > > >>>>>>>>>>>>>>> I think what Timo referred as "overriding a catalog > > >>>> function" > > >>>>>>>>>>> means a > > >>>>>>>>>>>>>> temp > > >>>>>>>>>>>>>>> function defined as "cat.db.func" overrides a catalog > > >>>> function > > >>>>>>>>>>> "func" > > >>>>>>>>>>>>> in > > >>>>>>>>>>>>>>> cat/db even if cat/db is not current. To support this, > > >>> temp > > >>>>>>>>>>> function > > >>>>>>>>>>>>> has > > >>>>>>>>>>>>>> to > > >>>>>>>>>>>>>>> be tied to a cat/db. What's why I said above that the 2nd > > >>>> and > > >>>>>>> 3rd > > >>>>>>>>>>>>>> questions > > >>>>>>>>>>>>>>> are related. The problem with such support is the > > >>> ambiguity > > >>>>> when > > >>>>>>>>>>> user > > >>>>>>>>>>>>>>> defines a function w/o namespace, "CREATE TEMPORARY > > >>> FUNCTION > > >>>>>>> func > > >>>>>>>>>>>> ...". > > >>>>>>>>>>>>>>> Here "func" can means a global temp function, or a temp > > >>>>>>> function in > > >>>>>>>>>>>>>> current > > >>>>>>>>>>>>>>> cat/db. If we can assume the former, this creates an > > >>>>>>> inconsistency > > >>>>>>>>>>>>>> because > > >>>>>>>>>>>>>>> "CREATE FUNCTION func" actually means a function in > > >>> current > > >>>>>>> cat/db. > > >>>>>>>>>>>> If > > >>>>>>>>>>>>> we > > >>>>>>>>>>>>>>> assume the latter, then there is no way for user to > > >>> create a > > >>>>>>> global > > >>>>>>>>>>>>> temp > > >>>>>>>>>>>>>>> function. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Giving a special namespace for built-in functions may > > >>> solve > > >>>>> the > > >>>>>>>>>>>>> ambiguity > > >>>>>>>>>>>>>>> problem above, but it also introduces artificial > > >>>>>>> catalog/database > > >>>>>>>>>>>> that > > >>>>>>>>>>>>>>> needs special treatment and pollutes the cleanness of > > >>> the > > >>>>>>> code. I > > >>>>>>>>>>>>> would > > >>>>>>>>>>>>>>> rather introduce a syntax in DDL to solve the problem, > > >>> like > > >>>>>>> "CREATE > > >>>>>>>>>>>>>>> [GLOBAL] TEMPORARY FUNCTION func". > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Thus, I'd like to summarize a few candidate proposals for > > >>>>> voting > > >>>>>>>>>>>>>> purposes: > > >>>>>>>>>>>>>>> 1. Support only global, temporary functions without > > >>>> namespace. > > >>>>>>> Such > > >>>>>>>>>>>>> temp > > >>>>>>>>>>>>>>> functions overrides built-in functions and catalog > > >>> functions > > >>>>> in > > >>>>>>>>>>>> current > > >>>>>>>>>>>>>>> cat/db. The resolution order is: temp functions -> > > >>> built-in > > >>>>>>>>>>> functions > > >>>>>>>>>>>>> -> > > >>>>>>>>>>>>>>> catalog functions. (Partially or fully qualified > > >>> functions > > >>>> has > > >>>>>>> no > > >>>>>>>>>>>>>>> ambiguity!) > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> 2. In addition to #1, support creating and referencing > > >>>>> temporary > > >>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>> associated with a cat/db with "GLOBAL" qualifier in DDL > > >>> for > > >>>>>>> global > > >>>>>>>>>>>> temp > > >>>>>>>>>>>>>>> functions. The resolution order is: global temp > > >>> functions -> > > >>>>>>>>>>> built-in > > >>>>>>>>>>>>>>> functions -> temp functions in current cat/db -> catalog > > >>>>>>> function. > > >>>>>>>>>>>>>>> (Resolution for partially or fully qualified function > > >>>>> reference > > >>>>>>> is: > > >>>>>>>>>>>>> temp > > >>>>>>>>>>>>>>> functions -> persistent functions.) > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> 3. In addition to #1, support creating and referencing > > >>>>> temporary > > >>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>> associated with a cat/db with a special namespace for > > >>>> built-in > > >>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>> and global temp functions. The resolution is the same as > > >>> #2, > > >>>>>>> except > > >>>>>>>>>>>>> that > > >>>>>>>>>>>>>>> the special namespace might be prefixed to a reference > > >>> to a > > >>>>>>>>>>> built-in > > >>>>>>>>>>>>>>> function or global temp function. (In absence of the > > >>> special > > >>>>>>>>>>>> namespace, > > >>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>> resolution order is the same as in #2.) > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> My personal preference is #1, given the unknown use case > > >>> and > > >>>>>>>>>>>> introduced > > >>>>>>>>>>>>>>> complexity for #2 and #3. However, #2 is an acceptable > > >>>>>>> alternative. > > >>>>>>>>>>>>> Thus, > > >>>>>>>>>>>>>>> my votes are: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> +1 for #1 > > >>>>>>>>>>>>>>> +0 for #2 > > >>>>>>>>>>>>>>> -1 for #3 > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Everyone, please cast your vote (in above format > > >>> please!), > > >>>> or > > >>>>>>> let > > >>>>>>>>>>> me > > >>>>>>>>>>>>> know > > >>>>>>>>>>>>>>> if you have more questions or other candidates. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>> Xuefu > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> On Wed, Sep 18, 2019 at 6:42 AM Aljoscha Krettek < > > >>>>>>>>>>>> aljos...@apache.org> > > >>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> I think this discussion and the one for FLIP-64 are very > > >>>>>>>>>>> connected. > > >>>>>>>>>>>>> To > > >>>>>>>>>>>>>>>> resolve the differences, think we have to think about > > >>> the > > >>>>> basic > > >>>>>>>>>>>>>>> principles > > >>>>>>>>>>>>>>>> and find consensus there. The basic questions I see are: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> - Do we want to support overriding builtin functions? > > >>>>>>>>>>>>>>>> - Do we want to support overriding catalog functions? > > >>>>>>>>>>>>>>>> - And then later: should temporary functions be tied to > > >>> a > > >>>>>>>>>>>>>>>> catalog/database? > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> I don’t have much to say about these, except that we > > >>> should > > >>>>>>>>>>>> somewhat > > >>>>>>>>>>>>>>> stick > > >>>>>>>>>>>>>>>> to what the industry does. But I also understand that > > >>> the > > >>>>>>>>>>> industry > > >>>>>>>>>>>> is > > >>>>>>>>>>>>>>>> already very divided on this. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Best, > > >>>>>>>>>>>>>>>> Aljoscha > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> On 18. Sep 2019, at 11:41, Jark Wu <imj...@gmail.com> > > >>>>> wrote: > > >>>>>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> +1 to strive for reaching consensus on the remaining > > >>>> topics. > > >>>>>>> We > > >>>>>>>>>>>> are > > >>>>>>>>>>>>>>>> close to the truth. It will waste a lot of time if we > > >>>> resume > > >>>>>>> the > > >>>>>>>>>>>>> topic > > >>>>>>>>>>>>>>> some > > >>>>>>>>>>>>>>>> time later. > > >>>>>>>>>>>>>>>>> +1 to “1-part/override” and I’m also fine with Timo’s > > >>>>>>>>>>>> “cat.db.fun” > > >>>>>>>>>>>>>> way > > >>>>>>>>>>>>>>>> to override a catalog function. > > >>>>>>>>>>>>>>>>> I’m not sure about “system.system.fun”, it introduces a > > >>>>>>>>>>>> nonexistent > > >>>>>>>>>>>>>> cat > > >>>>>>>>>>>>>>>> & db? And we still need to do special treatment for the > > >>>>>>> dedicated > > >>>>>>>>>>>>>>>> system.system cat & db? > > >>>>>>>>>>>>>>>>> Best, > > >>>>>>>>>>>>>>>>> Jark > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> 在 2019年9月18日,06:54,Timo Walther <twal...@apache.org> > > >>> 写道: > > >>>>>>>>>>>>>>>>>> Hi everyone, > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> @Xuefu: I would like to avoid adding too many things > > >>>>>>>>>>>>> incrementally. > > >>>>>>>>>>>>>>>> Users should be able to override all catalog objects > > >>>>>>> consistently > > >>>>>>>>>>>>>>> according > > >>>>>>>>>>>>>>>> to FLIP-64 (Support for Temporary Objects in Table > > >>> module). > > >>>>> If > > >>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>>> are treated completely different, we need more code and > > >>>>> special > > >>>>>>>>>>>>> cases. > > >>>>>>>>>>>>>>> From > > >>>>>>>>>>>>>>>> an implementation perspective, this topic only affects > > >>> the > > >>>>>>> lookup > > >>>>>>>>>>>>> logic > > >>>>>>>>>>>>>>>> which is rather low implementation effort which is why I > > >>>>> would > > >>>>>>>>>>> like > > >>>>>>>>>>>>> to > > >>>>>>>>>>>>>>>> clarify the remaining items. As you said, we have a > > >>> slight > > >>>>>>>>>>> consenus > > >>>>>>>>>>>>> on > > >>>>>>>>>>>>>>>> overriding built-in functions; we should also strive for > > >>>>>>> reaching > > >>>>>>>>>>>>>>> consensus > > >>>>>>>>>>>>>>>> on the remaining topics. > > >>>>>>>>>>>>>>>>>> @Dawid: I like your idea as it ensures registering > > >>>> catalog > > >>>>>>>>>>>> objects > > >>>>>>>>>>>>>>>> consistent and the overriding of built-in functions more > > >>>>>>>>>>> explicit. > > >>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> On 17.09.19 11:59, kai wang wrote: > > >>>>>>>>>>>>>>>>>>> hi, everyone > > >>>>>>>>>>>>>>>>>>> I think this flip is very meaningful. it supports > > >>>>> functions > > >>>>>>>>>>>> that > > >>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>> shared by different catalogs and dbs, reducing the > > >>>>>>>>>>> duplication > > >>>>>>>>>>>> of > > >>>>>>>>>>>>>>>> functions. > > >>>>>>>>>>>>>>>>>>> Our group based on flink's sql parser module > > >>> implements > > >>>>>>>>>>> create > > >>>>>>>>>>>>>>> function > > >>>>>>>>>>>>>>>>>>> feature, stores the parsed function metadata and > > >>> schema > > >>>>> into > > >>>>>>>>>>>>> mysql, > > >>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>> also customizes the catalog, customizes sql-client to > > >>>>>>> support > > >>>>>>>>>>>>>> custom > > >>>>>>>>>>>>>>>>>>> schemas and functions. Loaded, but the function is > > >>>>> currently > > >>>>>>>>>>>>>> global, > > >>>>>>>>>>>>>>>> and is > > >>>>>>>>>>>>>>>>>>> not subdivided according to catalog and db. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> In addition, I very much hope to participate in the > > >>>>>>>>>>> development > > >>>>>>>>>>>>> of > > >>>>>>>>>>>>>>> this > > >>>>>>>>>>>>>>>>>>> flip, I have been paying attention to the community, > > >>> but > > >>>>>>>>>>> found > > >>>>>>>>>>>> it > > >>>>>>>>>>>>>> is > > >>>>>>>>>>>>>>>> more > > >>>>>>>>>>>>>>>>>>> difficult to join. > > >>>>>>>>>>>>>>>>>>> thank you. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Xuefu Z <usxu...@gmail.com> 于2019年9月17日周二 上午11:19写道: > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Thanks to Tmo and Dawid for sharing thoughts. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> It seems to me that there is a general consensus on > > >>>>> having > > >>>>>>>>>>>> temp > > >>>>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>>>>>>> that have no namespaces and overwrite built-in > > >>>> functions. > > >>>>>>>>>>> (As > > >>>>>>>>>>>> a > > >>>>>>>>>>>>>> side > > >>>>>>>>>>>>>>>> note > > >>>>>>>>>>>>>>>>>>>> for comparability, the current user defined > > >>> functions > > >>>> are > > >>>>>>>>>>> all > > >>>>>>>>>>>>>>>> temporary and > > >>>>>>>>>>>>>>>>>>>> having no namespaces.) > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Nevertheless, I can also see the merit of having > > >>>>> namespaced > > >>>>>>>>>>>> temp > > >>>>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>>>>>>> that can overwrite functions defined in a specific > > >>>>> cat/db. > > >>>>>>>>>>>>>> However, > > >>>>>>>>>>>>>>>> this > > >>>>>>>>>>>>>>>>>>>> idea appears orthogonal to the former and can be > > >>> added > > >>>>>>>>>>>>>>> incrementally. > > >>>>>>>>>>>>>>>>>>>> How about we first implement non-namespaced temp > > >>>>> functions > > >>>>>>>>>>> now > > >>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>> leave > > >>>>>>>>>>>>>>>>>>>> the door open for namespaced ones for later > > >>> releases as > > >>>>> the > > >>>>>>>>>>>>>>>> requirement > > >>>>>>>>>>>>>>>>>>>> might become more crystal? This also helps shorten > > >>> the > > >>>>>>>>>>> debate > > >>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>> allow us > > >>>>>>>>>>>>>>>>>>>> to make some progress along this direction. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> As to Dawid's idea of having a dedicated cat/db to > > >>> host > > >>>>> the > > >>>>>>>>>>>>>>> temporary > > >>>>>>>>>>>>>>>> temp > > >>>>>>>>>>>>>>>>>>>> functions that don't have namespaces, my only > > >>> concern > > >>>> is > > >>>>>>> the > > >>>>>>>>>>>>>> special > > >>>>>>>>>>>>>>>>>>>> treatment for a cat/db, which makes code less > > >>> clean, as > > >>>>>>>>>>>> evident > > >>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>> treating > > >>>>>>>>>>>>>>>>>>>> the built-in catalog currently. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>>>> Xuefiu > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> On Mon, Sep 16, 2019 at 5:07 PM Dawid Wysakowicz < > > >>>>>>>>>>>>>>>>>>>> wysakowicz.da...@gmail.com> > > >>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>>>>>>>>> Another idea to consider on top of Timo's > > >>> suggestion. > > >>>>> How > > >>>>>>>>>>>> about > > >>>>>>>>>>>>>> we > > >>>>>>>>>>>>>>>> have a > > >>>>>>>>>>>>>>>>>>>>> special namespace (catalog + database) for built-in > > >>>>>>>>>>> objects? > > >>>>>>>>>>>>> This > > >>>>>>>>>>>>>>>> catalog > > >>>>>>>>>>>>>>>>>>>>> would be invisible for users as Xuefu was > > >>> suggesting. > > >>>>>>>>>>>>>>>>>>>>> Then users could still override built-in > > >>> functions, if > > >>>>>>> they > > >>>>>>>>>>>>> fully > > >>>>>>>>>>>>>>>> qualify > > >>>>>>>>>>>>>>>>>>>>> object with the built-in namespace, but by default > > >>> the > > >>>>>>>>>>> common > > >>>>>>>>>>>>>> logic > > >>>>>>>>>>>>>>>> of > > >>>>>>>>>>>>>>>>>>>>> current dB & cat would be used. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> CREATE TEMPORARY FUNCTION func ... > > >>>>>>>>>>>>>>>>>>>>> registers temporary function in current cat & dB > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> CREATE TEMPORARY FUNCTION cat.db.func ... > > >>>>>>>>>>>>>>>>>>>>> registers temporary function in cat db > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> CREATE TEMPORARY FUNCTION system.system.func ... > > >>>>>>>>>>>>>>>>>>>>> Overrides built-in function with temporary function > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> The built-in/system namespace would not be writable > > >>>> for > > >>>>>>>>>>>>> permanent > > >>>>>>>>>>>>>>>>>>>> objects. > > >>>>>>>>>>>>>>>>>>>>> WDYT? > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> This way I think we can have benefits of both > > >>>> solutions. > > >>>>>>>>>>>>>>>>>>>>> Best, > > >>>>>>>>>>>>>>>>>>>>> Dawid > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> On Tue, 17 Sep 2019, 07:24 Timo Walther, < > > >>>>>>>>>>> twal...@apache.org > > >>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>> Hi Bowen, > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> I understand the potential benefit of overriding > > >>>>> certain > > >>>>>>>>>>>>>> built-in > > >>>>>>>>>>>>>>>>>>>>>> functions. I'm open to such a feature if many > > >>> people > > >>>>>>>>>>> agree. > > >>>>>>>>>>>>>>>> However, it > > >>>>>>>>>>>>>>>>>>>>>> would be great to still support overriding catalog > > >>>>>>>>>>> functions > > >>>>>>>>>>>>>> with > > >>>>>>>>>>>>>>>>>>>>>> temporary functions in order to prototype a query > > >>>> even > > >>>>>>>>>>>> though > > >>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>> catalog/database might not be available currently > > >>> or > > >>>>>>>>>>> should > > >>>>>>>>>>>>> not > > >>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>> modified yet. How about we support both cases? > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> CREATE TEMPORARY FUNCTION abs > > >>>>>>>>>>>>>>>>>>>>>> -> creates/overrides a built-in function and never > > >>>>>>>>>>>> consideres > > >>>>>>>>>>>>>>>> current > > >>>>>>>>>>>>>>>>>>>>>> catalog and database; inconsistent with other DDL > > >>> but > > >>>>>>>>>>>>> acceptable > > >>>>>>>>>>>>>>> for > > >>>>>>>>>>>>>>>>>>>>>> functions I guess. > > >>>>>>>>>>>>>>>>>>>>>> CREATE TEMPORARY FUNCTION cat.db.fun > > >>>>>>>>>>>>>>>>>>>>>> -> creates/overrides a catalog function > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> Regarding "Flink don't have any other built-in > > >>>> objects > > >>>>>>>>>>>>> (tables, > > >>>>>>>>>>>>>>>> views) > > >>>>>>>>>>>>>>>>>>>>>> except functions", this might change in the near > > >>>>> future. > > >>>>>>>>>>>> Take > > >>>>>>>>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/FLINK-13900 > > >>> as > > >>>>> an > > >>>>>>>>>>>>>> example. > > >>>>>>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> On 14.09.19 01:40, Bowen Li wrote: > > >>>>>>>>>>>>>>>>>>>>>>> Hi Fabian, > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Yes, I agree 1-part/no-override is the least > > >>>> favorable > > >>>>>>>>>>>> thus I > > >>>>>>>>>>>>>>>> didn't > > >>>>>>>>>>>>>>>>>>>>>>> include that as a voting option, and the > > >>> discussion > > >>>> is > > >>>>>>>>>>>> mainly > > >>>>>>>>>>>>>>>> between > > >>>>>>>>>>>>>>>>>>>>>>> 1-part/override builtin and 3-part/not override > > >>>>> builtin. > > >>>>>>>>>>>>>>>>>>>>>>> Re > However, it means that temp functions are > > >>>>>>>>>>> differently > > >>>>>>>>>>>>>>> treated > > >>>>>>>>>>>>>>>>>>>> than > > >>>>>>>>>>>>>>>>>>>>>>> other db objects. > > >>>>>>>>>>>>>>>>>>>>>>> IMO, the treatment difference results from the > > >>> fact > > >>>>> that > > >>>>>>>>>>>>>>> functions > > >>>>>>>>>>>>>>>>>>>> are > > >>>>>>>>>>>>>>>>>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>> bit different from other objects - Flink don't > > >>> have > > >>>>> any > > >>>>>>>>>>>> other > > >>>>>>>>>>>>>>>>>>>> built-in > > >>>>>>>>>>>>>>>>>>>>>>> objects (tables, views) except functions. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Cheers, > > >>>>>>>>>>>>>>>>>>>>>>> Bowen > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>> Xuefu Zhang > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> "In Honey We Trust!" > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>> Xuefu Zhang > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> "In Honey We Trust!" > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> -- > > >>>>>>>>>>>>> Xuefu Zhang > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> "In Honey We Trust!" > > >>>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> -- > > >>>>>>>>>>> Xuefu Zhang > > >>>>>>>>>>> > > >>>>>>>>>>> "In Honey We Trust!" > > >>>>>>>>>>> > > >>>>>>>>> > > > > > > -- > Xuefu Zhang > > "In Honey We Trust!" >