Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite9e44a0

Browse files
committed
Revert "Permit dump/reload of not-too-large >1GB tuples"
This reverts commit4e01eca.Per Tom Lane, changing the definition of StringInfoData amounts to anABI break, which is unacceptable in back branches.
1 parent06fa667 commite9e44a0

File tree

4 files changed

+22
-74
lines changed

4 files changed

+22
-74
lines changed

‎src/backend/access/common/heaptuple.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -741,9 +741,7 @@ heap_form_tuple(TupleDesc tupleDescriptor,
741741
* Allocate and zero the space needed. Note that the tuple body and
742742
* HeapTupleData management structure are allocated in one chunk.
743743
*/
744-
tuple=MemoryContextAllocExtended(CurrentMemoryContext,
745-
HEAPTUPLESIZE+len,
746-
MCXT_ALLOC_HUGE |MCXT_ALLOC_ZERO);
744+
tuple= (HeapTuple)palloc0(HEAPTUPLESIZE+len);
747745
tuple->t_data=td= (HeapTupleHeader) ((char*)tuple+HEAPTUPLESIZE);
748746

749747
/*

‎src/backend/commands/copy.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ ReceiveCopyBegin(CopyState cstate)
397397
pq_sendint(&buf,format,2);/* per-column formats */
398398
pq_endmessage(&buf);
399399
cstate->copy_dest=COPY_NEW_FE;
400-
cstate->fe_msgbuf=makeLongStringInfo();
400+
cstate->fe_msgbuf=makeStringInfo();
401401
}
402402
elseif (PG_PROTOCOL_MAJOR(FrontendProtocol) >=2)
403403
{
@@ -1903,7 +1903,7 @@ CopyTo(CopyState cstate)
19031903
cstate->null_print_client=cstate->null_print;/* default */
19041904

19051905
/* We use fe_msgbuf as a per-row buffer regardless of copy_dest */
1906-
cstate->fe_msgbuf=makeLongStringInfo();
1906+
cstate->fe_msgbuf=makeStringInfo();
19071907

19081908
/* Get info about the columns we need to process. */
19091909
cstate->out_functions= (FmgrInfo*)palloc(num_phys_attrs*sizeof(FmgrInfo));
@@ -2717,8 +2717,8 @@ BeginCopyFrom(Relation rel,
27172717
cstate->cur_attval=NULL;
27182718

27192719
/* Set up variables to avoid per-attribute overhead. */
2720-
initLongStringInfo(&cstate->attribute_buf);
2721-
initLongStringInfo(&cstate->line_buf);
2720+
initStringInfo(&cstate->attribute_buf);
2721+
initStringInfo(&cstate->line_buf);
27222722
cstate->line_buf_converted= false;
27232723
cstate->raw_buf= (char*)palloc(RAW_BUF_SIZE+1);
27242724
cstate->raw_buf_index=cstate->raw_buf_len=0;

‎src/backend/lib/stringinfo.c

Lines changed: 12 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
*
55
* StringInfo provides an indefinitely-extensible string data type.
66
* It can be used to buffer either ordinary C strings (null-terminated text)
7-
* or arbitrary binary data. All storage is allocated with palloc() and
8-
* friends.
7+
* or arbitrary binary data. All storage is allocated with palloc().
98
*
109
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
1110
* Portions Copyright (c) 1994, Regents of the University of California
@@ -37,29 +36,11 @@ makeStringInfo(void)
3736
returnres;
3837
}
3938

40-
/*
41-
* makeLongStringInfo
42-
*
43-
* Same as makeStringInfo, for larger strings.
44-
*/
45-
StringInfo
46-
makeLongStringInfo(void)
47-
{
48-
StringInfores;
49-
50-
res= (StringInfo)palloc(sizeof(StringInfoData));
51-
52-
initLongStringInfo(res);
53-
54-
returnres;
55-
}
56-
57-
5839
/*
5940
* initStringInfo
6041
*
6142
* Initialize a StringInfoData struct (with previously undefined contents)
62-
* to describe an empty string; don't enable long strings yet.
43+
* to describe an empty string.
6344
*/
6445
void
6546
initStringInfo(StringInfostr)
@@ -68,22 +49,9 @@ initStringInfo(StringInfo str)
6849

6950
str->data= (char*)palloc(size);
7051
str->maxlen=size;
71-
str->long_ok= false;
7252
resetStringInfo(str);
7353
}
7454

75-
/*
76-
* initLongStringInfo
77-
*
78-
* Same as initStringInfo, plus enable long strings.
79-
*/
80-
void
81-
initLongStringInfo(StringInfostr)
82-
{
83-
initStringInfo(str);
84-
str->long_ok= true;
85-
}
86-
8755
/*
8856
* resetStringInfo
8957
*
@@ -174,7 +142,7 @@ appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
174142
/*
175143
* Return pvsnprintf's estimate of the space needed. (Although this is
176144
* given as a size_t, we know it will fit in int because it's not more
177-
* thaneitherMaxAllocSize or half an int's width.)
145+
* than MaxAllocSize.)
178146
*/
179147
return (int)nprinted;
180148
}
@@ -276,25 +244,15 @@ appendBinaryStringInfo(StringInfo str, const char *data, int datalen)
276244
void
277245
enlargeStringInfo(StringInfostr,intneeded)
278246
{
279-
Sizenewlen;
280-
Sizelimit;
281-
282-
/*
283-
* Determine the upper size limit. Because of overflow concerns outside
284-
* of this module, we limit ourselves to 4-byte signed integer range,
285-
* even for "long_ok" strings.
286-
*/
287-
limit=str->long_ok ?
288-
(((Size)1) << (sizeof(int32)*8-1))-1 :
289-
MaxAllocSize;
247+
intnewlen;
290248

291249
/*
292250
* Guard against out-of-range "needed" values. Without this, we can get
293251
* an overflow or infinite loop in the following.
294252
*/
295253
if (needed<0)/* should not happen */
296254
elog(ERROR,"invalid string enlargement request size: %d",needed);
297-
if (((Size)needed) >= (limit- (Size)str->len))
255+
if (((Size)needed) >= (MaxAllocSize- (Size)str->len))
298256
ereport(ERROR,
299257
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
300258
errmsg("out of memory"),
@@ -303,7 +261,7 @@ enlargeStringInfo(StringInfo str, int needed)
303261

304262
needed+=str->len+1;/* total space required now */
305263

306-
/* Because of the above test, we now have needed <=limit */
264+
/* Because of the above test, we now have needed <=MaxAllocSize */
307265

308266
if (needed <=str->maxlen)
309267
return;/* got enough space already */
@@ -318,14 +276,14 @@ enlargeStringInfo(StringInfo str, int needed)
318276
newlen=2*newlen;
319277

320278
/*
321-
* Clamp tothe limitin case we went past it. Note we are assuming here
322-
* thatlimit <= INT_MAX/2, else the above loop could overflow. We will
323-
* still have newlen >= needed.
279+
* Clamp toMaxAllocSizein case we went past it. Note we are assuming
280+
*herethatMaxAllocSize <= INT_MAX/2, else the above loop could
281+
*overflow. We willstill have newlen >= needed.
324282
*/
325-
if (newlen>limit)
326-
newlen=limit;
283+
if (newlen>(int)MaxAllocSize)
284+
newlen=(int)MaxAllocSize;
327285

328-
str->data= (char*)repalloc_huge(str->data, (Size)newlen);
286+
str->data= (char*)repalloc(str->data,newlen);
329287

330288
str->maxlen=newlen;
331289
}

‎src/include/lib/stringinfo.h

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
*cursoris initialized to zero by makeStringInfo or initStringInfo,
3131
*but is not otherwise touched by the stringinfo.c routines.
3232
*Some routines use it to scan through a StringInfo.
33-
*long_ok whether this StringInfo can allocate more than MaxAllocSize
34-
*bytes (but still up to 2GB).
3533
*-------------------------
3634
*/
3735
typedefstructStringInfoData
@@ -40,7 +38,6 @@ typedef struct StringInfoData
4038
intlen;
4139
intmaxlen;
4240
intcursor;
43-
boollong_ok;
4441
}StringInfoData;
4542

4643
typedefStringInfoData*StringInfo;
@@ -49,11 +46,11 @@ typedef StringInfoData *StringInfo;
4946
/*------------------------
5047
* There are two ways to create a StringInfo object initially:
5148
*
52-
* StringInfo stringptr = makeStringInfo(); // or makeLongStringInfo();
49+
* StringInfo stringptr = makeStringInfo();
5350
*Both the StringInfoData and the data buffer are palloc'd.
5451
*
5552
* StringInfoData string;
56-
* initStringInfo(&string); // or initLongStringInfo();
53+
* initStringInfo(&string);
5754
*The data buffer is palloc'd but the StringInfoData is just local.
5855
*This is the easiest approach for a StringInfo object that will
5956
*only live as long as the current routine.
@@ -70,26 +67,21 @@ typedef StringInfoData *StringInfo;
7067

7168
/*------------------------
7269
* makeStringInfo
73-
* makeLongStringInfo
74-
* Create an empty 'StringInfoData' & return a pointer to it. The former
75-
* allows up to 1 GB in size, per palloc(); the latter allows up to 2 GB.
70+
* Create an empty 'StringInfoData' & return a pointer to it.
7671
*/
7772
externStringInfomakeStringInfo(void);
78-
externStringInfomakeLongStringInfo(void);
7973

8074
/*------------------------
8175
* initStringInfo
82-
* initLongStringInfo
8376
* Initialize a StringInfoData struct (with previously undefined contents)
84-
* to describe an empty string. Size limits as above.
77+
* to describe an empty string.
8578
*/
8679
externvoidinitStringInfo(StringInfostr);
87-
externvoidinitLongStringInfo(StringInfostr);
8880

8981
/*------------------------
9082
* resetStringInfo
9183
* Clears the current content of the StringInfo, if any. The
92-
* StringInfo remains valid. The long_ok flag is not reset.
84+
* StringInfo remains valid.
9385
*/
9486
externvoidresetStringInfo(StringInfostr);
9587

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp