diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-08 18:20:10 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-08 18:20:10 +0000 |
commit | 1b1d2d5f31735c1abb35e812984208a9639a0c8a (patch) | |
tree | 888ccec136f7cb7978802e1b44d2bd6292abf946 /src/backend/optimizer/util/relnode.c | |
parent | 1db8cd36d820ae7559f96bd61e73430d0cd46c88 (diff) |
Whole-row references were broken for subqueries and functions, because
attr_needed/attr_widths optimization failed to allow for Vars with attno
zero in this case. Per report from Tatsuo Ishii.
Diffstat (limited to 'src/backend/optimizer/util/relnode.c')
-rw-r--r-- | src/backend/optimizer/util/relnode.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index c3a99d1946d..ea15e20f2ba 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.52 2003/08/04 02:40:01 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.52.4.1 2003/12/08 18:20:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -161,7 +161,8 @@ make_base_rel(Query *root, int relid) case RTE_SUBQUERY: case RTE_FUNCTION: /* Subquery or function --- need only set up attr range */ - rel->min_attr = 1; + /* Note: 0 is included in range to support whole-row Vars */ + rel->min_attr = 0; rel->max_attr = length(rte->eref->colnames); break; default: @@ -170,18 +171,11 @@ make_base_rel(Query *root, int relid) break; } - if (rel->max_attr >= rel->min_attr) - { - rel->attr_needed = (Relids *) - palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(Relids)); - rel->attr_widths = (int32 *) - palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(int32)); - } - else - { - rel->attr_needed = NULL; - rel->attr_widths = NULL; - } + Assert(rel->max_attr >= rel->min_attr); + rel->attr_needed = (Relids *) + palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(Relids)); + rel->attr_widths = (int32 *) + palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(int32)); return rel; } |