当我调用一个函数并向其传递一个参数时,该参数的值实际上是在内存中复制的,以便被调用的函数接收该值的副本,还是传递一个引用/指针?
我想在某些情况下这是显而易见的 - 例如,我希望复制一个整数,但是如果我有一个大字符串或数组或表行怎么办?
根据我自己的观察,该值似乎总是被复制,因为我可以编辑被调用函数中的值,而无需更改调用函数中的值。事实上,我想不出任何情况下我能够修改作为参数传入的内容,并让调用函数获取更改而不从被调用函数返回更改的数据。
由于这个原因,我总是对将大量数据从一个函数传递到另一个函数感到不安。我无法找到任何有关 postgres 如何处理参数的文档,因此出现了这个问题。我使用的函数类型是SQL和plpgsql。
这取决于过程语言和类型。
C函数:
typbyval
如果中的列pg_type
是,则固定长度数据类型按值传递TRUE
。
除非您使用 PostgreSQL 配置--disable-float4-byval
,否则real
按值传递。
bigint
,double precision
并且timestamp
类型在 64 位体系结构上按值传递,除非您使用--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);
Run Code Online (Sandbox Code Playgroud)
我没有明确检查其他过程语言,但我非常确定所有内容也都将按值传递,因为该数据必须转换为相应编程语言的内部表示形式。
归档时间: |
|
查看次数: |
2038 次 |
最近记录: |