Re: [BUGS] BUG #14876: Segmentation fault with JSONB column used in store proc that gets used by view and later altered

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [BUGS] BUG #14876: Segmentation fault with JSONB column used in store proc that gets used by view and later altered
Дата
Msg-id 31441.1509055499@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: [BUGS] BUG #14876: Segmentation fault with JSONB column used in store proc that gets used by view and later altered  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: [BUGS] BUG #14876: Segmentation fault with JSONB column used instore proc that gets used by view and later altered
Список pgsql-bugs
I wrote:
> Thanks for posting the reproducer.  The attached seems to fix it, but
> now that I've seen this, I wonder if there are other similar cases.

After some not-very-exhaustive looking around, the only thing I've found
that seems closely related is expandRTE's behavior for a function
returning composite in an RTE_FUNCTION RTE.  It's clearly possible for
somebody to have added columns to the composite type since the calling
query was parsed, so there is a comparable hazard in that case as well.
But what that code path does is to ignore any columns beyond what it
saw originally (which it's memorialized in funccolcount; see the comment
for struct RangeTblFunction).

To be consistent with that, it seems like what the RTE_SUBQUERY case
ought to do is ignore columns beyond the length of eref->colnames.
This is probably less useful than what I posted first --- it means you
don't get to see any added columns in the result of "subqueryname.*".
But I doubt we want different behaviors in the two cases.

            regards, tom lane

diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index ca32a37..e89bebf 100644
*** a/src/backend/parser/parse_relation.c
--- b/src/backend/parser/parse_relation.c
*************** expandRTE(RangeTblEntry *rte, int rtinde
*** 2205,2213 ****
                      varattno++;
                      Assert(varattno == te->resno);

                      if (colnames)
                      {
-                         /* Assume there is one alias per target item */
                          char       *label = strVal(lfirst(aliasp_item));

                          *colnames = lappend(*colnames, makeString(pstrdup(label)));
--- 2205,2223 ----
                      varattno++;
                      Assert(varattno == te->resno);

+                     /*
+                      * In scenarios where columns have been added to a view
+                      * since the outer query was originally parsed, there can
+                      * be more items in the subquery tlist than the outer
+                      * query expects.  We should ignore such extra column(s)
+                      * --- compare the behavior for composite-returning
+                      * functions, in the RTE_FUNCTION case below.
+                      */
+                     if (!aliasp_item)
+                         break;
+
                      if (colnames)
                      {
                          char       *label = strVal(lfirst(aliasp_item));

                          *colnames = lappend(*colnames, makeString(pstrdup(label)));

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: [BUGS] BUG #14876: Segmentation fault with JSONB column used in store proc that gets used by view and later altered
Следующее
От: Peter Geoghegan
Дата:
Сообщение: Re: [BUGS] Connections hang indefinitely while taking a LWLockTranchebuffer_content lock.