Передаются ли аргументы функции postgres по ссылке или по значению? - PullRequest
0 голосов
/ 02 мая 2018

Когда я вызываю функцию и передаю ей аргумент, действительно ли значение этого аргумента копируется в память, так что вызываемая функция получает копию значения или ей передается ссылка / указатель?

Полагаю, в некоторых случаях это очевидно - например, я ожидаю, что будет скопировано целое число, но что если у меня будет большая строка, массив или строка таблицы?

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

По этой причине мне всегда непросто передавать большие объемы данных из одной функции в другую. Я не смог найти никакой документации о том, как postgres обрабатывает аргументы, отсюда и этот вопрос. Я использую следующие типы функций: SQL и plpgsql.

1 Ответ

0 голосов
/ 02 мая 2018

Зависит от процедурного языка и типа.

Функции C :

  • Типы данных фиксированной длины передаются по значению, если столбец typbyval в pg_type равен TRUE.

  • Если вы не сконфигурируете PostgreSQL с --disable-float4-byval, real передается по значению.

  • bigint, double precision и timestamp передаются по значению в 64-разрядных архитектурах, если только вы не сконфигурируете PostgreSQL с --disable-float8-byval.

Все остальные типы данных передаются по ссылке, и вы не должны изменять данные (см. документацию и источник в configure.in и src/include/postgres.h).

Функции PL / pgSQL:

Все аргументы передаются по значению, потому что следующий код в функции plpgsql_exec_function в src/pl/plpgsql/src/pl_exec.c создает копию:

/*
 * Make local execution copies of all the datums
 */
estate.err_text = gettext_noop("during initialization of execution state");
copy_plpgsql_datums(&estate, func);

Я не проверял явно другие процедурные языки, но я совершенно уверен, что все будет также передаваться по значению, поскольку эти данные должны быть преобразованы во внутреннее представление соответствующего языка программирования.

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