Поместите $$ в строку в кавычках в PostgreSQL

У меня есть функция в Postgres:

CREATE OR REPLACE FUNCTION upsert(sql_insert text, sql_update text) 
RETURNS integer AS
$BODY$
BEGIN
 EXECUTE sql_insert;
 RETURN 1;
EXCEPTION WHEN unique_violation THEN
 EXECUTE sql_update; 
 RETURN 2;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION upsert(text, text) OWNER TO dce;

Я обычно использую этот запрос для вызова этой функции:

select upsert(
  $$INSERT INTO zz(a, b) VALUES (66, 'hahahaha')$$,
  $$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$
)

Оно работает. К сожалению, моя строка запроса не может содержать $$, как это:

select upsert(
  $$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$$,
  $$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$
)

Я прочитал эту документацию Postgres, но мне все еще нужна помощь, как это сделать.

1 ответ

Поэтому используйте вместо этого другую долларовую цитату:

выберите upsert ($ weird_string $ INSERT INTO zz (a, b) VALUES (66, 'ha $$ hahaha') $ weird_string $,
   $ weird_string $ UPDATE zz SET a = 66, b = 'хахахаха' ГДЕ a = 66 $ weird_string $)

Это все еще оставляет теоретический шанс, что долларовая цитата может быть найдена внутри строки.

Если вы строите запрос вручную, просто проверьте $ в строке. Если вы строите запрос из переменных, вы можете использовать quote_literal(querystring) вместо.

Начиная с Postgres 9.1, есть и удобные format() функция.

В качестве отступления: я предполагаю, что вы знаете, что эта форма динамического SQL чрезвычайно уязвима для внедрения SQL? Все в этом роде должно быть только для частного или очень безопасного использования.

Другие вопросы по тегам