powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plproxy ОШИБКА functions must be volatile
6 сообщений из 6, страница 1 из 1
plproxy ОШИБКА functions must be volatile
    #39195200
inforse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!

Решил попробовать plproxy, так сказать пощупать в реальности.

Сначала скачал отсюда: ссылка

Но наткнулся на ошибку
авторОШИБКА: несовместимая библиотека "/usr/lib/postgresql/9.1/lib/plproxy.so": несоответствие отличительного блока
DETAIL: В сервере NAMEDATALEN = 256, в библиотеке: 64.


Тогда пошёл другим путём.. Скачал отсуда ссылка

Установил необходимые пакеты.
Затем MAKE, MAKE INSTALL.

Все с компилировалось, установилось.

Затем пошел по учебнику, опробовать пример. Использовался материал книги А.Ю. Васильев "Работа с PostgreSQL"
Такой же пример был описан на хабре Только я Bouncer не использовал.

Создал все функции, ноды..

авторCREATE OR REPLACE FUNCTION public.plproxy_call_handler()
RETURNS language_handler AS
'$libdir/plproxy', 'plproxy_call_handler'
LANGUAGE 'c' VOLATILE
COST 1;
ALTER FUNCTION public.plproxy_call_handler() OWNER TO reppostgres;
-- language
CREATE TRUSTED LANGUAGE plproxy HANDLER plproxy_call_handler;

CREATE OR REPLACE FUNCTION plproxy_fdw_validator(text[], oid)
RETURNS boolean AS '$libdir/plproxy' LANGUAGE C;

CREATE FOREIGN DATA WRAPPER plproxy VALIDATOR plproxy_fdw_validator;

------------------------------------------------------------
CREATE OR REPLACE FUNCTION public.get_cluster_config
( IN cluster_name text , OUT "key" text , OUT val text )
RETURNS SETOF record AS
$BODY$
BEGIN
-- lets use same config for all clusters
key := 'connection_lifetime' ;
val := 30*60; -- 30m
RETURN NEXT;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION public.get_cluster_config(text)
OWNER TO reppostgres ;


CREATE OR REPLACE FUNCTION public.get_cluster_partitions( cluster_name text )
RETURNS SETOF text AS
$BODY$
BEGIN
IF cluster_name = 'usercluster' THEN
RETURN NEXT 'dbname=CREATE OR REPLACE VIEWtest host=192.168.4.26 port=5431 user=postgres' ;
RETURN NEXT 'dbname=CREATE OR REPLACE VIEWtest host=192.168.4.26 port=5432 user=postgres' ;
RETURN;
END IF ;
RAISE EXCEPTION 'Unknown cluster' ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION public.get_cluster_partitions(text) OWNER TO reppostgres;

CREATE OR REPLACE FUNCTION public.get_cluster_version ( cluster_name text )
RETURNS integer AS
$BODY$
BEGIN
IF cluster_name = 'usercluster' THEN
RETURN 1 ;
END IF ;
RAISE EXCEPTION 'Unknown cluster' ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION public.get_cluster_version(text) OWNER TO reppostgres;


CREATE OR REPLACE FUNCTION public.insert_user ( i_username text , i_emailaddress text )
RETURNS integer AS
$BODY$
CLUSTER 'usercluster' ;
RUN ON hashtext ( i_username, i_emailaddress ) ;
$BODY$
LANGUAGE 'plproxy'
COST 100;
ALTER FUNCTION public.insert_user(text, text) OWNER TO reppostgres;


CREATE OR REPLACE FUNCTION public.get_user_email(i_username text)
RETURNS SETOF text AS
$BODY$
CLUSTER 'clustertest';
RUN ON hashtext(i_username) ;
SELECT email FROM public.users WHERE username = i_username;
$BODY$
LANGUAGE 'plproxy'
COST 100
ROWS 1000;
ALTER FUNCTION public.get_user_email(text) OWNER TO reppostgres;

--select insert_user('sa2','mail@mail.ru');
--select public.get_user_email('Steve');



В дальнейшем при вызове :
select insert_user('sa2','mail@mail.ru');

Выдаётся ошибка:
авторОШИБКА: PL/Proxy functions must be volatile
********** Ошибка **********

ОШИБКА: PL/Proxy functions must be volatile
SQL-состояние: XX000


Никто не подскажет в чем может быть дело? Может кто сталкивался?

Версия ОС: Linux cpi-m-db-psql-oper 3.2.0-27-generic #43astra9 SMP Fri Nov 2 01:34:28 MSK 2012 x86_64 GNU/Linux
PlProxy 2.3
PostrgeSQL: PostgreSQL 9.1.6 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.7.1-2) 4.7.1, 64-bit
...
Рейтинг: 0 / 0
plproxy ОШИБКА functions must be volatile
    #39195257
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inforse,

У вас у некоторых функций есть спецификатор VOLATILE, но не у всех. Пересоздайте все функции как VOLATILE и пробуйте ещё раз.
...
Рейтинг: 0 / 0
plproxy ОШИБКА functions must be volatile
    #39195449
inforse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
CREATE OR REPLACE FUNCTION public.get_cluster_config
 ( IN cluster_name text , OUT "key" text , OUT val text )
 RETURNS SETOF record AS
 $BODY$
 BEGIN
	-- lets use same config for all clusters
	key := 'connection_lifetime' ;
	val := 30*60; -- 30m
	RETURN NEXT;
	RETURN;
 END;
 $BODY$
 LANGUAGE 'plpgsql' VOLATILE
 COST 100
 ROWS 1000;
 ALTER FUNCTION public.get_cluster_config(text)
 OWNER TO reppostgres ;
 

 CREATE OR REPLACE FUNCTION public.get_cluster_partitions( cluster_name text )
	RETURNS SETOF text AS
 $BODY$
 BEGIN
	IF cluster_name = 'usercluster' THEN
		RETURN NEXT 'dbname=CREATE OR REPLACE VIEWtest host=192.168.4.26 port=5431 user=postgres' ;
		RETURN NEXT 'dbname=CREATE OR REPLACE VIEWtest host=192.168.4.26 port=5432 user=postgres' ;
		RETURN;
	END IF ;
		RAISE EXCEPTION 'Unknown cluster' ;
END;
 $BODY$
 LANGUAGE 'plpgsql' VOLATILE
 COST 100
 ROWS 1000;
 ALTER FUNCTION public.get_cluster_partitions(text) OWNER TO reppostgres;

 CREATE OR REPLACE FUNCTION public.get_cluster_version ( cluster_name text )
 RETURNS integer AS
 $BODY$
 BEGIN
	IF cluster_name = 'usercluster' THEN
		RETURN 1 ;
	END IF ;
	RAISE EXCEPTION 'Unknown cluster' ;
 END;
 $BODY$
 LANGUAGE 'plpgsql' VOLATILE
 COST 100;
 ALTER FUNCTION public.get_cluster_version(text) OWNER TO reppostgres;


CREATE OR REPLACE FUNCTION public.insert_user ( i_username text , i_emailaddress text )
 RETURNS integer AS
 $BODY$
	CLUSTER 'usercluster' ;
	RUN ON hashtext ( i_username, i_emailaddress ) ;
 $BODY$
 LANGUAGE 'plproxy' VOLATILE
 COST 100;
 ALTER FUNCTION public.insert_user(text, text) OWNER TO reppostgres;


CREATE OR REPLACE FUNCTION public.get_user_email(i_username text)
 RETURNS SETOF text AS
$BODY$
	CLUSTER 'clustertest';
	RUN ON hashtext(i_username) ;
	SELECT email FROM public.users WHERE username = i_username;
$BODY$
 LANGUAGE 'plproxy' VOLATILE
 COST 100
 ROWS 1000;
ALTER FUNCTION public.get_user_email(text) OWNER TO reppostgres;




Я пере создавал несколько раз, просто в скрипте который здесь выложил забыл поправить.

На всякий случай еще раз пересоздал. Тоже самое пишет. На стороне нодов тоже у всех стоит VOLATILE :(
...
Рейтинг: 0 / 0
plproxy ОШИБКА functions must be volatile
    #39195497
inforse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
очень извиняюсь в листинге ошибка закралась
Код: sql
1.
2.
RETURN NEXT 'dbname=plproxytest host=192.168.4.26 port=5431 user=postgres' ;
RETURN NEXT 'dbname=plproxytest host=192.168.4.26 port=5432 user=postgres' ;
...
Рейтинг: 0 / 0
plproxy ОШИБКА functions must be volatile
    #39195516
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inforse,

А вытащите из лога базы всё, что касается ошибки — там обычно есть CONTEXT с запросом (и, наверно, названием функции) и DETAIL, и может ещё и HINT какой...
...
Рейтинг: 0 / 0
plproxy ОШИБКА functions must be volatile
    #39195543
inforse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Вот достал из логов сервера, кусок

Код: sql
1.
2.
3.
4.
5.
6.
7.
2016-03-18 16:09:26 MSK ОТЛАДКА:  StartTransaction
2016-03-18 16:09:26 MSK ОТЛАДКА:  name: unnamed; blockState:       DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: 
2016-03-18 16:09:26 MSK ОШИБКА:  PL/Proxy functions must be volatile
2016-03-18 16:09:26 MSK ОПЕРАТОР:  select insert_user('sa2','mail@mail.ru');
2016-03-18 16:09:26 MSK ОТЛАДКА:  StartTransaction
2016-03-18 16:09:26 MSK ОТЛАДКА:  name: unnamed; blockState:       DEFAULT; state: INPROGR, xid/subid/cid: 0/1/0, nestlvl: 1, children: 
2016-03-18 16:09:26 MSK ОТЛАДКА:  CommitTransaction 



Больше ничего не было.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plproxy ОШИБКА functions must be volatile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]