Commit 113a6599 authored by Tom Lane's avatar Tom Lane

Ensure that PLPGSQL_DTYPE_ROW variables have valid refname fields.

Without this, the syntax-tree-dumping functions in pl_funcs.c crash,
and there are other places that might be at risk too.  Per report
from Pavel Stehule.

Looks like I broke this in commit f9263006, so back-patch to v11.

Discussion: https://postgr.es/m/CAFj8pRA+3f5n4642q2g8BXCKjbTd7yU9JMYAgDyHgozk6cQ-VA@mail.gmail.com
parent b5f03dc7
...@@ -1896,6 +1896,8 @@ build_row_from_vars(PLpgSQL_variable **vars, int numvars) ...@@ -1896,6 +1896,8 @@ build_row_from_vars(PLpgSQL_variable **vars, int numvars)
row = palloc0(sizeof(PLpgSQL_row)); row = palloc0(sizeof(PLpgSQL_row));
row->dtype = PLPGSQL_DTYPE_ROW; row->dtype = PLPGSQL_DTYPE_ROW;
row->refname = "(unnamed row)";
row->lineno = -1;
row->rowtupdesc = CreateTemplateTupleDesc(numvars, false); row->rowtupdesc = CreateTemplateTupleDesc(numvars, false);
row->nfields = numvars; row->nfields = numvars;
row->fieldnames = palloc(numvars * sizeof(char *)); row->fieldnames = palloc(numvars * sizeof(char *));
......
...@@ -2205,6 +2205,7 @@ exec_stmt_call(PLpgSQL_execstate *estate, PLpgSQL_stmt_call *stmt) ...@@ -2205,6 +2205,7 @@ exec_stmt_call(PLpgSQL_execstate *estate, PLpgSQL_stmt_call *stmt)
row = palloc0(sizeof(*row)); row = palloc0(sizeof(*row));
row->dtype = PLPGSQL_DTYPE_ROW; row->dtype = PLPGSQL_DTYPE_ROW;
row->refname = "(unnamed row)";
row->lineno = -1; row->lineno = -1;
row->varnos = palloc(sizeof(int) * FUNC_MAX_ARGS); row->varnos = palloc(sizeof(int) * FUNC_MAX_ARGS);
......
...@@ -613,6 +613,7 @@ decl_cursor_args : ...@@ -613,6 +613,7 @@ decl_cursor_args :
new = palloc0(sizeof(PLpgSQL_row)); new = palloc0(sizeof(PLpgSQL_row));
new->dtype = PLPGSQL_DTYPE_ROW; new->dtype = PLPGSQL_DTYPE_ROW;
new->refname = "(unnamed row)";
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->rowtupdesc = NULL; new->rowtupdesc = NULL;
new->nfields = list_length($2); new->nfields = list_length($2);
...@@ -3526,6 +3527,7 @@ read_into_scalar_list(char *initial_name, ...@@ -3526,6 +3527,7 @@ read_into_scalar_list(char *initial_name,
row = palloc0(sizeof(PLpgSQL_row)); row = palloc0(sizeof(PLpgSQL_row));
row->dtype = PLPGSQL_DTYPE_ROW; row->dtype = PLPGSQL_DTYPE_ROW;
row->refname = "(unnamed row)";
row->lineno = plpgsql_location_to_lineno(initial_location); row->lineno = plpgsql_location_to_lineno(initial_location);
row->rowtupdesc = NULL; row->rowtupdesc = NULL;
row->nfields = nfields; row->nfields = nfields;
...@@ -3560,6 +3562,7 @@ make_scalar_list1(char *initial_name, ...@@ -3560,6 +3562,7 @@ make_scalar_list1(char *initial_name,
row = palloc0(sizeof(PLpgSQL_row)); row = palloc0(sizeof(PLpgSQL_row));
row->dtype = PLPGSQL_DTYPE_ROW; row->dtype = PLPGSQL_DTYPE_ROW;
row->refname = "(unnamed row)";
row->lineno = lineno; row->lineno = lineno;
row->rowtupdesc = NULL; row->rowtupdesc = NULL;
row->nfields = 1; row->nfields = 1;
......
...@@ -326,7 +326,12 @@ typedef struct PLpgSQL_var ...@@ -326,7 +326,12 @@ typedef struct PLpgSQL_var
* Note that there's no way to name the row as such from PL/pgSQL code, * Note that there's no way to name the row as such from PL/pgSQL code,
* so many functions don't need to support these. * so many functions don't need to support these.
* *
* refname, isconst, notnull, and default_val are unsupported (and hence * That also means that there's no real name for the row variable, so we
* conventionally set refname to "(unnamed row)". We could leave it NULL,
* but it's too convenient to be able to assume that refname is valid in
* all variants of PLpgSQL_variable.
*
* isconst, notnull, and default_val are unsupported (and hence
* always zero/null) for a row. The member variables of a row should have * always zero/null) for a row. The member variables of a row should have
* been checked to be writable at compile time, so isconst is correctly set * been checked to be writable at compile time, so isconst is correctly set
* to false. notnull and default_val aren't applicable. * to false. notnull and default_val aren't applicable.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment