54
54
* Portions Copyright (c) 1994, Regents of the University of California
55
55
*
56
56
* IDENTIFICATION
57
- * $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.179 2007/03/27 23:21:09 tgl Exp $
57
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.180 2007/04/21 02:41:13 tgl Exp $
58
58
*
59
59
*-------------------------------------------------------------------------
60
60
*/
@@ -2357,12 +2357,22 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel)
2357
2357
{
2358
2358
int32 tuple_width = 0 ;
2359
2359
ListCell * tllist ;
2360
+ Oid rel_reloid ;
2361
+
2362
+ /*
2363
+ * Usually (perhaps always), all the Vars have the same reloid, so we can
2364
+ * save some redundant list-searching by doing getrelid just once.
2365
+ */
2366
+ if (rel -> relid > 0 )
2367
+ rel_reloid = getrelid (rel -> relid , root -> parse -> rtable );
2368
+ else
2369
+ rel_reloid = InvalidOid ; /* probably can't happen */
2360
2370
2361
2371
foreach (tllist , rel -> reltargetlist )
2362
2372
{
2363
2373
Var * var = (Var * ) lfirst (tllist );
2364
2374
int ndx ;
2365
- Oid relid ;
2375
+ Oid var_reloid ;
2366
2376
int32 item_width ;
2367
2377
2368
2378
/* For now, punt on whole-row child Vars */
@@ -2383,10 +2393,14 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel)
2383
2393
continue ;
2384
2394
}
2385
2395
2386
- relid = getrelid (var -> varno , root -> parse -> rtable );
2387
- if (relid != InvalidOid )
2396
+ if (var -> varno == rel -> relid )
2397
+ var_reloid = rel_reloid ;
2398
+ else
2399
+ var_reloid = getrelid (var -> varno , root -> parse -> rtable );
2400
+
2401
+ if (var_reloid != InvalidOid )
2388
2402
{
2389
- item_width = get_attavgwidth (relid , var -> varattno );
2403
+ item_width = get_attavgwidth (var_reloid , var -> varattno );
2390
2404
if (item_width > 0 )
2391
2405
{
2392
2406
rel -> attr_widths [ndx ] = item_width ;
0 commit comments