aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-01-24 01:26:08 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-01-24 01:26:08 +0000
commit234db5bae10185417fc4a569ef563da34a48b92f (patch)
treec2b2d156f4a935c5f67f281c1c4c6713c355c52c
parentfe7b0fc35da752fead8c389a2a6cbb59f2aab92a (diff)
downloadpostgresql-234db5bae10185417fc4a569ef563da34a48b92f.tar.gz
postgresql-234db5bae10185417fc4a569ef563da34a48b92f.zip
Relax an Assert() that has been found to be too strict in some situations
involving unions of types having typmods. Variants of the failure are known to occur in 8.1 and up; not sure if it's possible in 8.0 and 7.4, but since the code exists that far back, I'll just patch 'em all. Per report from Brian Hurt.
-rw-r--r--src/backend/executor/execScan.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c
index b24994c8ded..ba0f3c65516 100644
--- a/src/backend/executor/execScan.c
+++ b/src/backend/executor/execScan.c
@@ -12,7 +12,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.28.2.1 2004/01/22 02:23:35 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.28.2.2 2007/01/24 01:26:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -213,8 +213,18 @@ tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc
return false; /* out of order */
if (att_tup->attisdropped)
return false; /* table contains dropped columns */
+ /*
+ * Note: usually the Var's type should match the tupdesc exactly,
+ * but in situations involving unions of columns that have different
+ * typmods, the Var may have come from above the union and hence have
+ * typmod -1. This is a legitimate situation since the Var still
+ * describes the column, just not as exactly as the tupdesc does.
+ * We could change the planner to prevent it, but it'd then insert
+ * projection steps just to convert from specific typmod to typmod -1,
+ * which is pretty silly.
+ */
Assert(var->vartype == att_tup->atttypid);
- Assert(var->vartypmod == att_tup->atttypmod);
+ Assert(var->vartypmod == att_tup->atttypmod || var->vartypmod == -1);
tlist = lnext(tlist);
}