From 19d262540cd3d42694cd0c0962a82eefa8488b5b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 5 Apr 2008 01:58:42 +0000 Subject: [PATCH] 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 1762782efa1..5f3e8e463ca 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.116.2.2 2006/01/10 22:00:07 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/parse_relation.c,v 1.116.2.3 2008/04/05 01:58:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -935,6 +935,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 7a4822e63f7..d129af0a876 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.21 2005/05/25 21:40:42 momjian Exp $ + * $PostgreSQL: pgsql/src/include/access/attnum.h,v 1.21.2.1 2008/04/05 01:58:42 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -21,6 +21,7 @@ typedef int16 AttrNumber; #define InvalidAttrNumber 0 +#define MaxAttrNumber 32767 /* ---------------- * support macros