Whole-row references were broken for subqueries and functions, because
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Dec 2003 18:20:10 +0000 (18:20 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Dec 2003 18:20:10 +0000 (18:20 +0000)
attr_needed/attr_widths optimization failed to allow for Vars with attno
zero in this case.  Per report from Tatsuo Ishii.

src/backend/optimizer/util/relnode.c

index 6168a89b4a93cca6f15570f86a317986a38dd0f6..b671ce2c2c003900205a88adc7f3b889e58b8d8a 100644 (file)
@@ -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;
 }