]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Defend against JOINs having more than 32K columns altogether. We cannot
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 5 Apr 2008 01:58:35 +0000 (01:58 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 5 Apr 2008 01:58:35 +0000 (01:58 +0000)
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.

src/backend/parser/parse_relation.c
src/include/access/attnum.h

index 75d5a50702a50e24d07914fc19c43e6fa89099e6..7c0e0d1a3326be07b9939720907dfbd435da1c2b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.125 2006/10/04 00:29:56 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.125.2.1 2008/04/05 01:58:35 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1026,6 +1026,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;
index 75e6f9c5219687a7c56377a6959ce81e87df464e..741847a169224f1cb6d1cc867e9df5b4d90c404c 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/attnum.h,v 1.22 2006/03/05 15:58:53 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/access/attnum.h,v 1.22.2.1 2008/04/05 01:58:35 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,6 +21,7 @@
 typedef int16 AttrNumber;
 
 #define InvalidAttrNumber              0
+#define MaxAttrNumber                  32767
 
 /* ----------------
  *             support macros