Поместите $$ в строку в кавычках в PostgreSQL - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть функция в 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 Ответ

6 голосов
/ 14 февраля 2012

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

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

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

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

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

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

...