Поместите $$ в строку в кавычках в 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? Все в этом роде должно быть только для частного или очень безопасного использования.