postgres.git / summary / log / commit / refs

commit    66f0f69a236cb5f8642492aa42977b860cd6ce0b
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sat Apr 05 01:58:35 2008 +0000
First released in: 8.4.0, 7.4.20, 8.0.16, 8.1.12, 8.2.8, 8.3.2

    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.


src/backend/parser/parse_relation.c | 12 +++++++++++- src/include/access/attnum.h | 3 ++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 75d5a50702a..7c0e0d1a332 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.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; diff --git a/src/include/access/attnum.h b/src/include/access/attnum.h index 75e6f9c5219..741847a1692 100644 --- a/src/include/access/attnum.h +++ b/src/include/access/attnum.h @@ -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 [parent: cca48e1cf29c]