mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-16 19:37:00 +08:00
There is a very ancient hack in check_sql_fn_retval that allows a single SELECT targetlist entry of composite type to be taken as supplying all the output columns of a function returning composite. (This is grotty and fundamentally ambiguous, but it's really hard to do nested composite-returning functions without it.) As far as I know, that doesn't cause any problems in ordinary functions. It's disastrous for procedures however. All procedures that have any output parameters are labeled with prorettype RECORD, and the CALL code expects it will get back a record with one column per output parameter, regardless of whether any of those parameters is composite. Doing something else leads to an assertion failure or core dump. This is simple enough to fix: we just need to not apply that rule when considering procedures. However, that requires adding another argument to check_sql_fn_retval, which at least in principle might be getting called by external callers. Therefore, in the back branches convert check_sql_fn_retval into an ABI-preserving wrapper around a new function check_sql_fn_retval_ext. Per report from Yahor Yuzefovich. This has been broken since we implemented procedures, so back-patch to all supported branches. Discussion: https://postgr.es/m/CABz5gWHSjj2df6uG0NRiDhZ_Uz=Y8t0FJP-_SVSsRsnrQT76Gg@mail.gmail.com
57 lines
1.8 KiB
C
57 lines
1.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* functions.h
|
|
* Declarations for execution of SQL-language functions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/executor/functions.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef FUNCTIONS_H
|
|
#define FUNCTIONS_H
|
|
|
|
#include "nodes/execnodes.h"
|
|
#include "tcop/dest.h"
|
|
|
|
/*
|
|
* Data structure needed by the parser callback hooks to resolve parameter
|
|
* references during parsing of a SQL function's body. This is separate from
|
|
* SQLFunctionCache since we sometimes do parsing separately from execution.
|
|
*/
|
|
typedef struct SQLFunctionParseInfo
|
|
{
|
|
char *fname; /* function's name */
|
|
int nargs; /* number of input arguments */
|
|
Oid *argtypes; /* resolved types of input arguments */
|
|
char **argnames; /* names of input arguments; NULL if none */
|
|
/* Note that argnames[i] can be NULL, if some args are unnamed */
|
|
Oid collation; /* function's input collation, if known */
|
|
} SQLFunctionParseInfo;
|
|
|
|
typedef SQLFunctionParseInfo *SQLFunctionParseInfoPtr;
|
|
|
|
extern Datum fmgr_sql(PG_FUNCTION_ARGS);
|
|
|
|
extern SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple,
|
|
Node *call_expr,
|
|
Oid inputCollation);
|
|
|
|
extern void sql_fn_parser_setup(struct ParseState *pstate,
|
|
SQLFunctionParseInfoPtr pinfo);
|
|
|
|
extern void check_sql_fn_statements(List *queryTreeLists);
|
|
|
|
extern bool check_sql_fn_retval(List *queryTreeLists,
|
|
Oid rettype, TupleDesc rettupdesc,
|
|
char prokind,
|
|
bool insertDroppedCols,
|
|
List **resultTargetList);
|
|
|
|
extern DestReceiver *CreateSQLFunctionDestReceiver(void);
|
|
|
|
#endif /* FUNCTIONS_H */
|