CREATE TRANSFORM
CREATE TRANSFORM — создать трансформацию
Синтаксис
CREATE [ OR REPLACE ] TRANSFORM FORимя_типа
LANGUAGEимя_языка
( FROM SQL WITH FUNCTIONимя_функции_из_sql
[ (тип_аргумента
[, ...]) ], TO SQL WITH FUNCTIONимя_функции_в_sql
[ (тип_аргумента
[, ...]) ] );
Описание
CREATE TRANSFORM
определяет новую трансформацию. CREATE OR REPLACE TRANSFORM
либо создаёт трансформацию, либо заменяет существующую.
Трансформация определяет, как преобразовать тип данных для процедурного языка. Например, если написать на языке PL/Python функцию, использующую тип hstore
, PL/Python заведомо не знает, как должны представляться значения hstore
в среде Python. Обычно реализации языка нисходят к текстовому представлению, но это может быть неудобно, когда более уместен был бы, например, ассоциативный массив или список.
Трансформация определяет две функции:
Функция «из SQL» преобразует тип из среды SQL в среду языка. Эта функция будет вызываться для аргументов функции, написанной на этом языке.
Функция «в SQL» преобразует тип из среды языка в среду SQL. Эта функция будет вызываться для значения, возвращаемого из функции на этом языке.
Предоставлять обе эти функции не требуется, можно ограничиться одной. Если одна из них не указана, при необходимости выбирается поведение, принятое для языка по умолчанию. (Чтобы полностью перекрыть путь трансформации в одну сторону, можно написать функцию, которая будет всегда выдавать ошибку.)
Чтобы создать трансформацию, необходимо быть владельцем и иметь право USAGE
для типа, иметь право USAGE
для языка, а также быть владельцем и иметь право EXECUTE
для функций из-SQL и в-SQL, если они задаются.
Параметры
имя_типа
Имя типа данных, для которого предназначена трансформация.
имя_языка
Имя языка, для которого предназначена трансформация.
имя_функции_из_sql
[(тип_аргумента
[, ...])]Имя функции для преобразования типа из среды SQL в среду языка. Она должна принимать один аргумент типа
internal
и возвращать типinternal
. Фактический аргумент будет иметь тип, заданный для трансформации, и сама функция должна рассчитывать на это. (Но на уровне SQL нельзя объявить функцию, возвращающую типinternal
, если она не принимает минимум один аргумент типаinternal
.) Фактически возвращаемое значение будет определяться реализацией языка. Если список аргументов отсутствует, имя функции должно быть уникальным в её схеме.имя_функции_в_sql
[(тип_аргумента
[, ...])]Имя функции для преобразования типа из среды языка в среду SQL. Она должна принимать один аргумент типа
internal
и возвращать тип, для которого создаётся трансформация. Фактическое значение аргумента будет определяться реализацией языка. Если список аргументов отсутствует, имя функции должно быть уникальным в её схеме.
Замечания
Для удаления трансформаций применяется DROP TRANSFORM.
Примеры
Чтобы создать трансформацию для типа hstore
и языка plpythonu
, сначала нужно создать тип и язык:
CREATE TYPE hstore ...; CREATE EXTENSION plpythonu;
Затем создайте необходимые функции:
CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal LANGUAGE C STRICT IMMUTABLE AS ...; CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore LANGUAGE C STRICT IMMUTABLE AS ...;
И наконец, создайте трансформацию, соединяющую всё это вместе:
CREATE TRANSFORM FOR hstore LANGUAGE plpythonu ( FROM SQL WITH FUNCTION hstore_to_plpython(internal), TO SQL WITH FUNCTION plpython_to_hstore(internal) );
На практике эти команды помещаются в расширение.
В разделе contrib
представлено несколько расширений, в которых определены трансформации, что может послужить практическим примером реализации.
Совместимость
Первая форма CREATE TRANSFORM
является расширением Postgres Pro. В стандарте SQL есть команда CREATE TRANSFORM
, но её предназначение — преобразовывать типы для языков на стороне клиента. Этот вариант использования не поддерживается Postgres Pro.
См. также
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM
53.28. pg_init_privs
#
The catalog pg_init_privs
records information about the initial privileges of objects in the system. There is one entry for each object in the database which has a non-default (non-NULL) initial set of privileges.
Objects can have initial privileges either by having those privileges set when the system is initialized (by initdb) or when the object is created during a CREATE EXTENSION
and the extension script sets initial privileges using the GRANT
system. Note that the system will automatically handle recording of the privileges during the extension script and that extension authors need only use the GRANT
and REVOKE
statements in their script to have the privileges recorded. The privtype
column indicates if the initial privilege was set by initdb or during a CREATE EXTENSION
command.
Objects which have initial privileges set by initdb will have entries where privtype
is 'i'
, while objects which have initial privileges set by CREATE EXTENSION
will have entries where privtype
is 'e'
.
Table 53.28. pg_init_privs
Columns
Column Type Description |
---|
The OID of the specific object |
The OID of the system catalog the object is in |
For a table column, this is the column number (the |
A code defining the type of initial privilege of this object; see text |
The initial access privileges; see Section 5.7 for details |