postgres函数参数是通过引用还是值传递的?

时间:2018-05-02 11:16:54

标签: postgresql

当我调用一个函数并传递一个参数时,该参数的值是否实际复制到内存中,以便被调用的函数接收该值的副本,或者它是否传递了一个引用/指针?

我想在某些情况下很明显 - 例如,我希望复制一个整数,但是如果我有一个大的字符串或数组或表行怎么办?

从我自己的观察中看来,值总是被复制,因为我可以编辑被调用函数中的值而不改变调用函数中的值。事实上,我无法想到我能够修改作为参数传入的内容的任何情况,并且让调用函数接收更改而不从被调用函数返回更改的数据。

出于这个原因,我总是不愿意将大量数据从一个函数传递到另一个函数。我无法找到关于postgres如何处理参数的任何文档,因此这个问题。我使用的函数类型是SQL和plpgsql。

1 个答案:

答案 0 :(得分:4)

这取决于程序语言和类型。

C函数

  • 如果typbyval中的pg_type列为TRUE,则按值传递固定长度数据类型。

  • 除非您使用--disable-float4-byval配置PostgreSQL,否则real会按值传递。

  • bigintdouble precisiontimestamp类型在64位体系结构上按值传递,除非您使用--disable-float8-byval配置PostgreSQL。

    < / LI>

所有其他数据类型都是通过引用传递的,您有责任不修改数据(请参阅configure.insrc/include/postgres.hplpgsql_exec_function中的来源)。

PL / pgSQL函数:

所有参数都按值传递,因为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); 中的以下代码创建了副本:

sortAccounts(prop: string) {
    const sorted = this.accounts.sort((a, b) => a[prop] > b[prop] ? 1 : a[prop] === b[prop] ? 0 : -1);
    // asc/desc
    if (prop.charAt(0) === '-') { sorted.reverse(); }
    return sorted;
}

我没有明确检查其他过程语言,但我确信所有内容都将按值传递,因为必须将数据转换为相应编程语言的内部表示。