Department of marginal improvements: teach tupconvert.c to avoid doing a
authorTom Lane
Mon, 17 Aug 2009 20:34:31 +0000 (20:34 +0000)
committerTom Lane
Mon, 17 Aug 2009 20:34:31 +0000 (20:34 +0000)
physical conversion when there are dropped columns in the same places in
the input and output tupdescs.  This avoids possible performance loss from
the recent patch to improve dropped-column handling, in some cases where
the old code would have worked.

src/backend/access/common/tupconvert.c

index 6f5dda2a13f55e9492c8274278863d6d51a514b1..174d438d805acfe1b994eaa3752b83edabe28199 100644 (file)
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/common/tupconvert.c,v 1.1 2009/08/06 20:44:31 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/common/tupconvert.c,v 1.2 2009/08/17 20:34:31 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -146,11 +146,22 @@ convert_tuples_by_position(TupleDesc indesc,
    {
        for (i = 0; i < n; i++)
        {
-           if (attrMap[i] != (i+1))
-           {
-               same = false;
-               break;
-           }
+           if (attrMap[i] == (i+1))
+               continue;
+
+           /*
+            * If it's a dropped column and the corresponding input
+            * column is also dropped, we needn't convert.  However,
+            * attlen and attalign must agree.
+            */
+           if (attrMap[i] == 0 &&
+               indesc->attrs[i]->attisdropped &&
+               indesc->attrs[i]->attlen == outdesc->attrs[i]->attlen &&
+               indesc->attrs[i]->attalign == outdesc->attrs[i]->attalign)
+               continue;
+
+           same = false;
+           break;
        }
    }
    else
@@ -255,11 +266,22 @@ convert_tuples_by_name(TupleDesc indesc,
        same = true;
        for (i = 0; i < n; i++)
        {
-           if (attrMap[i] != (i+1))
-           {
-               same = false;
-               break;
-           }
+           if (attrMap[i] == (i+1))
+               continue;
+
+           /*
+            * If it's a dropped column and the corresponding input
+            * column is also dropped, we needn't convert.  However,
+            * attlen and attalign must agree.
+            */
+           if (attrMap[i] == 0 &&
+               indesc->attrs[i]->attisdropped &&
+               indesc->attrs[i]->attlen == outdesc->attrs[i]->attlen &&
+               indesc->attrs[i]->attalign == outdesc->attrs[i]->attalign)
+               continue;
+
+           same = false;
+           break;
        }
    }
    else