[jworsley@cmd ~]$ gcc -shared is_zero.c -о is_zero.so
[jworsley@cmd -]$ psql -U manager booktown
Welcome to psql. the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
booktown-* CREATE FUNCTION is_zero(int4) RETURNS Boolean
booktown-l AS '/home/jworsley/is_zero.so' LANGUAGE 'C';
CREATE
Команда CREATE FUNCTION в листинге 7.49 создает функцию с именем is_zero(), которая получает один аргумент типа int4 и возвращает значение типа boolean. В объявление включена ссылка на функцию С с именем i s_zero( i nt), реализованную в объектном модуле /home/jworsley/is_zero.so (поскольку в языке С нет типа boo! ean, PostgreSQL приходится преобразовывать целочисленное значение, возвращаемое функцией, к логическому типу). При этом число 0 преобразуется в fal se, a 1 — в true.
По умолчанию PostgreSQL ищет в общем модуле функцию с тем же именем, с которым она создается в PostgreSQL. Такой способ подходит для функции i s_zero(i nteger), имя которой соответствует откомпилированному символическому имени функции is_zero(int) в файле is_zero.so. Для предотвращения конфликтов имен вторая функция в общем объектном модуле определяется с сигнатурой is_zero_two(int.int). Чтобы ассоциировать ее с перегруженной функцией PostgreSQL, получающей два аргумента вместо одного, имя функции С в виде строковой константы передастся после пути к файлу общего модуля.
Имя указывается без круглых скобок и без перечисления аргументов, а от пути к файлу оно отделяется запятой:
CREATE FUNCTION имя ( [ тип_аргумента [. ...] ] )
RETURNS тип_возвращаемого_значения
AS 'определение'. 'имя_в_объектном_файле'
LANGUAGE 'С' [ WITH ( атрибут [. ...] ) ]
В листинге 7.50 подгружается тот же общий модуль, но на этот раз перегруженная функция PostgreSQL ассоциируется с функций С is_zero_two.