Re: [HACKERS] Missing array support
От | Joe Conway |
---|---|
Тема | Re: [HACKERS] Missing array support |
Дата | |
Msg-id | 3EFF8C01.1060709@joeconway.com обсуждение исходный текст |
Ответ на | Re: [HACKERS] Missing array support (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: [HACKERS] Missing array support
Re: [HACKERS] Missing array support |
Список | pgsql-patches |
Tom Lane wrote: > Joe Conway <mail@joeconway.com> writes: > >>Included in the patch, I changed SQL language functions so that they >>could be declared with and use polymorphic types. > > I'm not convinced that will work ... in particular, does the parsetree > get fixed correctly when a SQL function is inlined? As far as I can see (and verified through testing), evaluate_function() is no problem; it passes on the args from the original FuncExpr at about line 1690 of clauses.c newexpr->args = args; and they get found just fine in init_sql_fcache. regression=# CREATE OR REPLACE FUNCTION ffp(anyarray) returns anyarray as 'select $1' language 'sql' strict immutable; CREATE FUNCTION regression=# select ffp(array[1]); NOTICE: init_sql_fcache: arg 0, oid 1007 NOTICE: simplify_function: !newexpr = 0, allow_inline = 1 ffp ----- {1} (1 row) When the function is defined as above, getting it to try to inline: regression=# select ffp(array[f]) from (select 1 as f) as ss; NOTICE: simplify_function: !newexpr = 1, allow_inline = 1 NOTICE: inline_function: I'm here NOTICE: init_sql_fcache: arg 0, oid 1007 ffp ----- {1} (1 row) It doesn't get inlined (as defined above) because it fails this check in inline_function(): /* Forget it if declared return type is tuple or void */ result_typtype = get_typtype(funcform->prorettype); if (result_typtype != 'b' && result_typtype != 'd') return NULL; So the only way a problem can arise given the patch I sent, is when the function accepts polymorphic arguments, but does not return polymorphic: regression=# drop FUNCTION ffp(anyarray); DROP FUNCTION regression=# CREATE OR REPLACE FUNCTION ffp(anyarray) returns int[] as 'select array[1]' language 'sql'; CREATE FUNCTION regression=# select ffp(array[f]) from (select 1 as f) as ss; NOTICE: simplify_function: !newexpr = 1, allow_inline = 1 NOTICE: inline_function: I'm here NOTICE: inline_function: simplified ffp ----- {1} (1 row) So I'd propose that we put another check in inline_function(), and reject attempts to inline functions with polymorphic arguments. The other bases are already covered and we already have the proc tuple available in inline_function(). Sound OK? Thanks, Joe
В списке pgsql-patches по дате отправления: