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  (Joe Conway <mail@joeconway.com>)
Re: [HACKERS] Missing array support  (Tom Lane <tgl@sss.pgh.pa.us>)
Список 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 по дате отправления:

Предыдущее
От: Joe Conway
Дата:
Сообщение: Re: [HACKERS] Missing array support
Следующее
От: Joe Conway
Дата:
Сообщение: Re: [HACKERS] Missing array support