Re: BUG #15122: can't import data if table has a constraint with a function calling another function

Поиск
Список
Период
Сортировка
От Andrew Gierth
Тема Re: BUG #15122: can't import data if table has a constraint with a function calling another function
Дата
Msg-id 87r2off4fc.fsf@news-spur.riddles.org.uk
обсуждение исходный текст
Ответ на BUG #15122: can't import data if table has a constraint with afunction calling another function  (PG Bug reporting form <noreply@postgresql.org>)
Ответы Re: BUG #15122: can't import data if table has a constraint with afunction calling another function
Список pgsql-bugs
>>>>> "PG" == PG Bug reporting form <noreply@postgresql.org> writes:

 PG> Using only public schema, data in tables that use in check
 PG> constraints functions that invoke other functions does not get
 PG> imported with pg_restore after it was dumped with pg_dump. But if
 PG> functions in check constraints do not invoke other functions, data
 PG> is correctly imported.

 PG> I have noted this behavior after minor upgrading from 9.3.22 to
 PG> 9.3.23 and from 9.4.16 to 9.4.17; in 9.3.22 and 9.3.17 it worked
 PG> fine.

This is definitely fallout from the security fixes related to
search_path.

 PG> But it's unclear to me why having one level public functions is
 PG> allowed but it is not those functions to invoke other ones. It
 PG> looks inconsistent.

Yes, the reason for this is that function bodies are for the most part
treated as opaque strings everywhere except when actually executing the
function. This means that when a function makes a non-schema-qualified
reference to another function in its body, the search_path lookup is
performed at runtime, and so it depends on the runtime setting of
search_path.

In contrast, a CHECK constraint stores a pre-parsed expression tree
which refers to the function by its oid, not name, so that when pg_dump
dumps it out as SQL it can use a schema-qualified name in the output.

Since pg_dump now does the restore with only pg_catalog in the
search_path, the first function is successfully called because it is
schema-qualified in the CHECK constraint definition, but the second
function is not found because it is referenced only by an unqualified
name. You could do this:

 PG>   return is_even(n) and n > 0;  

  return public.is_even(n) and n > 0;

-- 
Andrew (irc:RhodiumToad)


В списке pgsql-bugs по дате отправления:

Предыдущее
От: PG Bug reporting form
Дата:
Сообщение: BUG #15122: can't import data if table has a constraint with afunction calling another function
Следующее
От: Asier Lostalé
Дата:
Сообщение: Re: BUG #15122: can't import data if table has a constraint with afunction calling another function