From 67a5f8ff9e168bf2ec3540b8a389efb5f46b76fc Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 17 Aug 2009 20:34:31 +0000
Subject: [PATCH] Department of marginal improvements: teach tupconvert.c to
 avoid doing a 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 | 44 +++++++++++++++++++-------
 1 file changed, 33 insertions(+), 11 deletions(-)

diff --git a/src/backend/access/common/tupconvert.c b/src/backend/access/common/tupconvert.c
index 6f5dda2a13f..174d438d805 100644
--- a/src/backend/access/common/tupconvert.c
+++ b/src/backend/access/common/tupconvert.c
@@ -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
-- 
GitLab