From 97dfff832cbc79a48ac2e053f2628c18027ee0a2 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 3 Jul 1999 00:33:04 +0000 Subject: [PATCH] Fix to prevent too large tuple from being created. --- src/backend/access/heap/stats.c | 3 ++- src/backend/catalog/index.c | 5 +++-- src/backend/commands/copy.c | 4 ++-- src/backend/commands/vacuum.c | 4 ++-- src/backend/optimizer/path/_deadcode/xfunc.c | 5 +++-- src/backend/parser/gram.y | 8 +++++--- src/backend/storage/page/bufpage.c | 4 ++-- src/backend/utils/adt/varchar.c | 23 ++++++++++++++--------- src/include/access/htup.h | 9 +++++++-- src/include/storage/bufpage.h | 14 +------------- src/interfaces/ecpg/preproc/preproc.y | 7 +++++-- 11 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/backend/access/heap/stats.c b/src/backend/access/heap/stats.c index 17d49b9398..b17a71cdd9 100644 --- a/src/backend/access/heap/stats.c +++ b/src/backend/access/heap/stats.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/heap/Attic/stats.c,v 1.15 1999/02/13 23:14:25 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/heap/Attic/stats.c,v 1.16 1999/07/03 00:32:36 momjian Exp $ * * NOTES * initam should be moved someplace else. @@ -16,6 +16,7 @@ */ #include +#include #include diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 82689d1db1..af8d401aa1 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.79 1999/06/19 04:54:11 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.80 1999/07/03 00:32:38 momjian Exp $ * * * INTERFACE ROUTINES @@ -20,6 +20,7 @@ #include "postgres.h" #include "access/genam.h" +#include "access/htup.h" #include "access/heapam.h" #include "access/istrat.h" #include "access/xact.h" @@ -56,7 +57,7 @@ /* * macros used in guessing how many tuples are on a page. */ -#define AVG_TUPLE_SIZE 8 +#define AVG_TUPLE_SIZE MinTupleSize #define NTUPLES_PER_PAGE(natts) (BLCKSZ/((natts)*AVG_TUPLE_SIZE)) /* non-export function prototypes */ diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 9d3dcfebfc..d7dced4c16 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.80 1999/06/12 20:41:25 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.81 1999/07/03 00:32:39 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -1073,7 +1073,7 @@ GetIndexRelations(Oid main_relation_oid, } } -#define EXT_ATTLEN 5*BLCKSZ +#define EXT_ATTLEN (5 * BLCKSZ) /* returns 1 is c is in s diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index ef8a1bffd7..b5fa699981 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.109 1999/06/11 09:35:08 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.110 1999/07/03 00:32:40 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -624,7 +624,7 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel, empty_end_pages; Size free_size, usable_free_size; - Size min_tlen = MAXTUPLEN; + Size min_tlen = MaxTupleSize; Size max_tlen = 0; int32 i; struct rusage ru0, diff --git a/src/backend/optimizer/path/_deadcode/xfunc.c b/src/backend/optimizer/path/_deadcode/xfunc.c index 3da0edba47..d77f9d2f10 100644 --- a/src/backend/optimizer/path/_deadcode/xfunc.c +++ b/src/backend/optimizer/path/_deadcode/xfunc.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/_deadcode/Attic/xfunc.c,v 1.4 1999/05/25 22:41:36 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/_deadcode/Attic/xfunc.c,v 1.5 1999/07/03 00:32:42 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -20,6 +20,7 @@ #include "postgres.h" +#include "access/htup.h" #include "access/heapam.h" #include "catalog/pg_language.h" #include "catalog/pg_proc.h" @@ -1094,7 +1095,7 @@ xfunc_expense_per_tuple(JoinPath joinnode, int whichchild) RelOptInfo outerrel = get_parent((Path) get_outerjoinpath(joinnode)); RelOptInfo innerrel = get_parent((Path) get_innerjoinpath(joinnode)); Count outerwidth = get_width(outerrel); - Count outers_per_page = ceil(BLCKSZ / (outerwidth + sizeof(HeapTupleData))); + Count outers_per_page = ceil(BLCKSZ / (outerwidth + MinTupleSize)); if (IsA(joinnode, HashPath)) { diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index bb36c6f042..dcb61ec132 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.84 1999/06/07 14:28:25 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.85 1999/07/03 00:32:44 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -36,6 +36,7 @@ #include #include "postgres.h" +#include "access/htup.h" #include "nodes/parsenodes.h" #include "nodes/print.h" #include "parser/gramparse.h" @@ -3384,8 +3385,9 @@ Character: character '(' Iconst ')' if ($3 < 1) elog(ERROR,"length for '%s' type must be at least 1",$1); - else if ($3 > BLCKSZ - 128) - elog(ERROR,"length for type '%s' cannot exceed %d",$1, BLCKSZ-128); + else if ($3 > MaxTupleSize) + elog(ERROR,"length for type '%s' cannot exceed %d",$1, + MaxTupleSize); /* we actually implement this sort of like a varlen, so * the first 4 bytes is the length. (the difference diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 8c12a7652c..204c06302d 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.22 1999/05/25 16:11:25 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.23 1999/07/03 00:32:48 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -45,7 +45,7 @@ PageInit(Page page, Size pageSize, Size specialSize) Assert(pageSize == BLCKSZ); Assert(pageSize > - specialSize + sizeof(PageHeaderData) - sizeof(ItemIdData)); + specialSize + sizeof(PageHeaderData) - sizeof(ItemIdData)); specialSize = DOUBLEALIGN(specialSize); diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index cb0982a52d..1f1b8d6497 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -7,13 +7,14 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.46 1999/05/25 16:12:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.47 1999/07/03 00:32:50 momjian Exp $ * *------------------------------------------------------------------------- */ #include /* for sprintf() */ #include #include "postgres.h" +#include "access/htup.h" #include "utils/array.h" #include "utils/builtins.h" #include "catalog/pg_type.h" @@ -81,8 +82,9 @@ bpcharin(char *s, int dummy, int32 atttypmod) else len = atttypmod - VARHDRSZ; - if (len > BLCKSZ - 128) - elog(ERROR, "bpcharin: length of char() must be less than %d", BLCKSZ - 128); + if (len > MaxTupleSize) + elog(ERROR, "bpcharin: length of char() must be less than %d", + MaxTupleSize); result = (char *) palloc(atttypmod); VARSIZE(result) = atttypmod; @@ -151,8 +153,9 @@ bpchar(char *s, int32 len) rlen = len - VARHDRSZ; - if (rlen > BLCKSZ - 128) - elog(ERROR, "bpchar: length of char() must be less than %d", BLCKSZ - 128); + if (rlen > MaxTupleSize) + elog(ERROR, "bpchar: length of char() must be less than %d", + MaxTupleSize); #ifdef STRINGDEBUG printf("bpchar- convert string length %d (%d) ->%d (%d)\n", @@ -332,8 +335,9 @@ varcharin(char *s, int dummy, int32 atttypmod) if (atttypmod != -1 && len > atttypmod) len = atttypmod; /* clip the string at max length */ - if (len > BLCKSZ - 128) - elog(ERROR, "varcharin: length of char() must be less than %d", BLCKSZ - 128); + if (len > MaxTupleSize) + elog(ERROR, "varcharin: length of char() must be less than %d", + MaxTupleSize); result = (char *) palloc(len); VARSIZE(result) = len; @@ -403,8 +407,9 @@ varchar(char *s, int32 slen) len = slen - VARHDRSZ; #endif - if (len > BLCKSZ - 128) - elog(ERROR, "varchar: length of varchar() must be less than BLCKSZ-128"); + if (len > MaxTupleSize) + elog(ERROR, "varchar: length of varchar() must be less than %d", + MaxTupleSize); result = (char *) palloc(slen); VARSIZE(result) = slen; diff --git a/src/include/access/htup.h b/src/include/access/htup.h index 996d2c158c..d4107b9cc2 100644 --- a/src/include/access/htup.h +++ b/src/include/access/htup.h @@ -6,14 +6,14 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: htup.h,v 1.16 1999/05/25 22:42:32 momjian Exp $ + * $Id: htup.h,v 1.17 1999/07/03 00:32:55 momjian Exp $ * *------------------------------------------------------------------------- */ #ifndef HTUP_H #define HTUP_H -#include +#include #include #define MinHeapTupleBitmapSize 32 /* 8 * 4 */ @@ -52,6 +52,11 @@ typedef struct HeapTupleHeaderData typedef HeapTupleHeaderData *HeapTupleHeader; +#define MinTupleSize (sizeof (PageHeaderData) + \ + sizeof(HeapTupleHeaderData) + sizeof(int4)) + +#define MaxTupleSize (BLCKSZ/2 - MinTupleSize) + #define SelfItemPointerAttributeNumber (-1) #define ObjectIdAttributeNumber (-2) #define MinTransactionIdAttributeNumber (-3) diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index 5c8574a450..74729eaddc 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: bufpage.h,v 1.22 1999/05/25 16:14:40 momjian Exp $ + * $Id: bufpage.h,v 1.23 1999/07/03 00:32:59 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -133,18 +133,6 @@ typedef enum OverwritePageManagerMode } PageManagerMode; -/* ---------------- - * misc support macros - * ---------------- - */ - -/* - * XXX this is wrong -- ignores padding/alignment, variable page size, - * AM-specific opaque space at the end of the page (as in btrees), ... - * however, it at least serves as an upper bound for heap pages. - */ -#define MAXTUPLEN (BLCKSZ - sizeof (PageHeaderData)) - /* ---------------------------------------------------------------- * page support macros * ---------------------------------------------------------------- diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 9d21b064e5..75127b308d 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -3,6 +3,9 @@ #include #include #include + +#include "postgres.h" +#include "access/htup.h" #include "catalog/catname.h" #include "utils/numeric.h" @@ -3351,8 +3354,8 @@ Character: character '(' Iconst ')' sprintf(errortext, "length for '%s' type must be at least 1",$1); yyerror(errortext); } - else if (atol($3) > BLCKSZ - 128) { - sprintf(errortext, "length for type '%s' cannot exceed %d",$1,BLCKSZ - 128); + else if (atol($3) > MaxTupleSize) { + sprintf(errortext, "length for type '%s' cannot exceed %d",$1,MaxTupleSize); yyerror(errortext); } -- 2.11.0