Department of marginal improvements: teach tupconvert.c to avoid doing a
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Aug 2009 20:34:31 +0000 (20:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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