Создать неизменный клон concat_ws - PullRequest
0 голосов
/ 25 января 2019

В этом блоге показан пример создания функции immutable_concat в Pg:

CREATE OR REPLACE FUNCTION immutable_concat(VARIADIC "any")
  RETURNS text AS 'text_concat'
  LANGUAGE internal IMMUTABLE

Я бы хотел сделать то же самое с concat_ws исоответствующий text_concat_ws существует, однако, следующее просто сбивает процесс:

CREATE OR REPLACE FUNCTION immutable_concat_ws(VARIADIC "any")
  RETURNS text AS 'text_concat_ws'
  LANGUAGE internal IMMUTABLE

Обновление: сигнатура immutable_concat_ws должна быть (glue, *parts), один клей (текст или varchar) и один или несколькочасти (текст, varchar или ноль).

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Первый , функция требует двух параметров в определении, как уже предлагал Ричард, и вы соответствующим образом обновили свой вопрос.

Второй , вы можете создать эту функцию с помощью "any", используя LANGUAGE internal.Это не значит, что вам следует это делать.

concat_ws() - это всего лишь STABLE по причине.Среди прочего, текстовое представление date или timestamp зависит от настроек локали / стиля даты, поэтому результат не является неизменным .Индексы, построенные на этом, могут молча сломаться.Ограничен на text ввод, можно объявить его IMMUTABLE.Поскольку вам нужен только ввод text (или varchar, который имеет неявное приведение к text), ограничьте его вашим вариантом использования и будьте в безопасности:

CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE;

Не поддавайтесь искушению делать что-либокак это immutable_concat_ws('|', now()::text, 'foo').Это приведет к повторному введению указанных зависимостей в вызове.

Related:

0 голосов
/ 26 января 2019

ОК, значит, вы отображаете внутренние функции "С", которые, я должен признать, я никогда не делал сам.

Однако text_concat_ws - это «с разделителем», поэтому он не просто принимает вариационный список текстовых аргументов - он принимает разделитель ТОЛЬКО вариационный список текстовых аргументов. Отрегулируйте определение вашей функции соответственно.

Если вы собираетесь это делать, вы, вероятно, захотите подключить отладчик к бэкэнду или запустить его один процесс, если это целесообразно.

Также - я только что нашел интерфейс doxygen к исходному коду PostgreSQL, отвечающий на ваш вопрос. Спасибо: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...