summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-04-05 01:58:51 +0000
committerTom Lane2008-04-05 01:58:51 +0000
commitda2c44736188ad5517f0533772ed93e1556a2abb (patch)
tree09b7d3a3204e4c17c57f6f0e5b1bcc7c922c5f17
parent2069940bc6c8d576f0bf628a38396bcb853f2c56 (diff)
Defend against JOINs having more than 32K columns altogether. We cannot
currently support this because we must be able to build Vars referencing join columns, and varattno is only 16 bits wide. Perhaps this should be improved in future, but considering that it never came up before, I'm not sure the problem is worth much effort. Per bug #4070 from Marcello Ceschia. The problem seems largely academic in 8.0 and 7.4, because they have (different) O(N^2) performance issues with such wide joins, but back-patch all the way anyway.
-rw-r--r--src/backend/parser/parse_relation.c12
-rw-r--r--src/include/access/attnum.h3
2 files changed, 13 insertions, 2 deletions
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 0145f86500c..d2039813bab 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.102.4.1 2005/05/29 17:10:35 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.102.4.2 2008/04/05 01:58:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1114,6 +1114,16 @@ addRangeTableEntryForJoin(ParseState *pstate,
Alias *eref;
int numaliases;
+ /*
+ * Fail if join has too many columns --- we must be able to reference
+ * any of the columns with an AttrNumber.
+ */
+ if (list_length(aliasvars) > MaxAttrNumber)
+ ereport(ERROR,
+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+ errmsg("joins can have at most %d columns",
+ MaxAttrNumber)));
+
rte->rtekind = RTE_JOIN;
rte->relid = InvalidOid;
rte->subquery = NULL;
diff --git a/src/include/access/attnum.h b/src/include/access/attnum.h
index 37a500f77f9..863bade0045 100644
--- a/src/include/access/attnum.h
+++ b/src/include/access/attnum.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/access/attnum.h,v 1.20 2004/12/31 22:03:21 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/access/attnum.h,v 1.20.4.1 2008/04/05 01:58:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -21,6 +21,7 @@
typedef int16 AttrNumber;
#define InvalidAttrNumber 0
+#define MaxAttrNumber 32767
/* ----------------
* support macros