V0.2 patch for TODO Item: SQL-language reference parameters by name.
От | Gevik Babakhani |
---|---|
Тема | V0.2 patch for TODO Item: SQL-language reference parameters by name. |
Дата | |
Msg-id | 000401c81e0d$d0ca8300$0a01a8c0@gevmus обсуждение исходный текст |
Ответы |
Re: V0.2 patch for TODO Item: SQL-language reference
parameters by name.
|
Список | pgsql-patches |
Hello All, This patch implements a (generic) callback functionality in the parser. The mechanism can be used to send callback messages from within the parser to external functions. I would like to know your opinion about the following: In previous discussion Tom referred to: >One point here is that it would be good to be able to qualify the argument names with the function name, for example > create function myfunc(x int) ... > select ... from t where t.x = myfunc.x The above is possible but I think qualifying the argument names with the function name can be cumbersome when one has to provide the function name multiple times. For example: (where clause) create or replace function sp_item_get_by_type_or_category(p_type integer,p_category integer) returns setof item_view as $$ select ..... from item_view i inner join tblcategory c on i.catid = c.catid inner join tbltype t on i.typeid = t.typeid where c.catid = sp_item_get_by_type_or_category.p_category or t.typeid = sp_item_get_by_type_or_categor.p_type; $$ language sql; Perhaps we could use the word "this" instead of the entire function name For example: .... where c.catid = this.p_category or t.typeid = this.p_type; .... Any thoughts? Regards, Gevik ************************************************************************ PLEASE NOTE: - This patch in created with MSVC++ - Resolving the argnames is not yet implemented correctly due above. - Two files have been added parse_callback.h and .c How does it work: >>> To setup callback; ParserCallbackContext sqlcallbackcontext; /* attaching parser callback handler*/ sqlcallbackcontext.context = T_ParsingFunctionBody; sqlcallbackcontext.ctxarg = tuple; sqlcallbackcontext.callback = sql_parser_callback_handler; sqlcallbackcontext.previous = parser_callback_context_stack; parser_callback_context_stack = &sqlcallbackcontext; .... .... parser_callback_context_stack = sqlcallbackcontext.previous; >>> To call the callback handler from within the parser: ParserCallbackContextArgs args; args.pstate = pstate; args.input = (Node *)cref; args.action = A_ResolveAmbigColumnRef; parser_do_callback(&args); To handle the callback: if(context == T_ParsingFunctionBody) { switch(action) { case A_ResolveAmbigColumnRef: .... } }
Вложения
В списке pgsql-patches по дате отправления: