bytea в postgres неправильно сбежал?

У меня проблемы с копированием данных bytea в триггере из одной таблицы в другую.

Исходный запрос выглядит так:

INSERT INTO "mytable" ("dataid","data")
VALUES 
(123456,'\x3008d1a10a000000050000000000000000000000fb27000009090504010804060a08020b020c040000000000000000000000000001000000'::bytea);

Внутри триггера «перед вставкой» я получаю синтаксическую ошибку при попытке вставить это значение в другую таблицу. Причина в том, что внутри триггера значение NEW.data уже экранировано и выглядит как

0\010\321\241\012\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\373\'000\000\011\011\005\004\001\010\004\006\012\010\002\013\002\014\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000

Есть ли способ получить фактическое значение NEW.dataid (до приведения типа или в виде строки)?

p.s. Я не могу изменить исходный запрос или преобразовать или установить bytea_output в шестнадцатеричном формате в производственной базе данных

Код функции триггера:

BEGIN 
PERFORM dblink('logsyellow', '
    INSERT INTO datastorage(dataid,data)    
    VALUES(' || new.dataid || ','||new.data||') 
');
RETURN new;
END;

Ошибка, которую я получаю:

PL/pgSQL function fn_replicate_data() line 4 at PERFORM
2014-07-08 13:24:35 GMT OPERATOR:  INSERT INTO mytable ( dataid, data ) VALUES ( 123456, '\x3008d1a10a000000050000000000000000000000fb27000009090504010804060a08020b020c040000000000000000000000000001000000'::bytea );
2014-07-08 13:24:35 GMT ERROR:  syntax error (at near "\")
2014-07-08 13:24:35 GMT CONTEXT:  Error occurred on dblink connection named "unnamed": could not execute command.
        SQL-operator: "SELECT DBLINK_EXEC('logsyellow','INSERT INTO datastorage(dataid,data)        VALUES('||new.dataid||','''||new.data||''') ')"

person Natalie    schedule 10.07.2014    source источник
comment
В этом нет ничего особенного, так как столбец bytea в NEW в триггере на самом деле не экранирован. Пожалуйста, покажите код и сообщение об ошибке или воспроизводимый тестовый пример, который заставляет вас думать иначе.   -  person Daniel Vérité    schedule 10.07.2014
comment
Привет Даниэль, только что добавил код функции и ошибку выше. Причина, по которой я думаю, что она уже экранирована, потому что повышение уведомления + запрос sql показывает INSERT INTO datastorage (dataid, data) VALUES(123456,0\010\321\241\012\000\000\000 \005\000\000\000\000\000\000\000\000\000\000\000\373\'000\000\011\011\005\004\001\010\004\006\012\ 010\002\013\002\014\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000);   -  person Natalie    schedule 10.07.2014
comment
@Natalie Он экранируется как часть форматирования в строку для отображения.   -  person Craig Ringer    schedule 10.07.2014
comment
@Craig, он экранируется на этапе построения запроса dblink или раньше, иначе я бы не получил синтаксическую ошибку. Исходный запрос правильный и не выдает ошибок.   -  person Natalie    schedule 10.07.2014


Ответы (1)


Наконец-то я нашел решение.. всем спасибо)

PERFORM dblink('logsyellow','INSERT INTO datastorage(dataid,data)   VALUES(' || new.dataid || ','||quote_literal(new.data)||') ')
person Natalie    schedule 10.07.2014