mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Revert "Permit dump/reload of not-too-large >1GB tuples"
This reverts commitsfa2fa99552
and42f50cb8fa
. While the functionality that was intended to be provided by these commits is desired, the patch didn't actually solve as many of the problematic situations as we hoped, and it created a bunch of its own problems. Since we're going to require more extensive changes soon for other reasons and users have been working around these problems for a long time already, there is no point in spending effort in fixing this halfway measure. Per complaint from Tom Lane. Discussion: https://postgr.es/m/21407.1484606922@sss.pgh.pa.us (Commitfa2fa99552
had already been reverted in branches 9.5 asf858524ee4
and 9.6 ase9e44a0953
, so this touches master only. Commit42f50cb8fa
was not present in the older branches.)
This commit is contained in:
@ -4,8 +4,7 @@
|
||||
*
|
||||
* StringInfo provides an indefinitely-extensible string data type.
|
||||
* It can be used to buffer either ordinary C strings (null-terminated text)
|
||||
* or arbitrary binary data. All storage is allocated with palloc() and
|
||||
* friends.
|
||||
* or arbitrary binary data. All storage is allocated with palloc().
|
||||
*
|
||||
* Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
@ -37,29 +36,11 @@ makeStringInfo(void)
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* makeLongStringInfo
|
||||
*
|
||||
* Same as makeStringInfo, for larger strings.
|
||||
*/
|
||||
StringInfo
|
||||
makeLongStringInfo(void)
|
||||
{
|
||||
StringInfo res;
|
||||
|
||||
res = (StringInfo) palloc(sizeof(StringInfoData));
|
||||
|
||||
initLongStringInfo(res);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* initStringInfo
|
||||
*
|
||||
* Initialize a StringInfoData struct (with previously undefined contents)
|
||||
* to describe an empty string; don't enable long strings yet.
|
||||
* to describe an empty string.
|
||||
*/
|
||||
void
|
||||
initStringInfo(StringInfo str)
|
||||
@ -68,22 +49,9 @@ initStringInfo(StringInfo str)
|
||||
|
||||
str->data = (char *) palloc(size);
|
||||
str->maxlen = size;
|
||||
str->long_ok = false;
|
||||
resetStringInfo(str);
|
||||
}
|
||||
|
||||
/*
|
||||
* initLongStringInfo
|
||||
*
|
||||
* Same as initStringInfo, plus enable long strings.
|
||||
*/
|
||||
void
|
||||
initLongStringInfo(StringInfo str)
|
||||
{
|
||||
initStringInfo(str);
|
||||
str->long_ok = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* resetStringInfo
|
||||
*
|
||||
@ -174,7 +142,7 @@ appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
|
||||
/*
|
||||
* Return pvsnprintf's estimate of the space needed. (Although this is
|
||||
* given as a size_t, we know it will fit in int because it's not more
|
||||
* than either MaxAllocSize or half an int's width.)
|
||||
* than MaxAllocSize.)
|
||||
*/
|
||||
return (int) nprinted;
|
||||
}
|
||||
@ -276,17 +244,7 @@ appendBinaryStringInfo(StringInfo str, const char *data, int datalen)
|
||||
void
|
||||
enlargeStringInfo(StringInfo str, int needed)
|
||||
{
|
||||
Size newlen;
|
||||
Size limit;
|
||||
|
||||
/*
|
||||
* Determine the upper size limit. Because of overflow concerns outside
|
||||
* of this module, we limit ourselves to 4-byte signed integer range,
|
||||
* even for "long_ok" strings.
|
||||
*/
|
||||
limit = str->long_ok ?
|
||||
(((Size) 1) << (sizeof(int32) * 8 - 1)) - 1 :
|
||||
MaxAllocSize;
|
||||
int newlen;
|
||||
|
||||
/*
|
||||
* Guard against out-of-range "needed" values. Without this, we can get
|
||||
@ -294,7 +252,7 @@ enlargeStringInfo(StringInfo str, int needed)
|
||||
*/
|
||||
if (needed < 0) /* should not happen */
|
||||
elog(ERROR, "invalid string enlargement request size: %d", needed);
|
||||
if (((Size) needed) >= (limit - (Size) str->len))
|
||||
if (((Size) needed) >= (MaxAllocSize - (Size) str->len))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("out of memory"),
|
||||
@ -303,7 +261,7 @@ enlargeStringInfo(StringInfo str, int needed)
|
||||
|
||||
needed += str->len + 1; /* total space required now */
|
||||
|
||||
/* Because of the above test, we now have needed <= limit */
|
||||
/* Because of the above test, we now have needed <= MaxAllocSize */
|
||||
|
||||
if (needed <= str->maxlen)
|
||||
return; /* got enough space already */
|
||||
@ -313,20 +271,19 @@ enlargeStringInfo(StringInfo str, int needed)
|
||||
* for efficiency, double the buffer size each time it overflows.
|
||||
* Actually, we might need to more than double it if 'needed' is big...
|
||||
*/
|
||||
newlen = 2 * (Size) str->maxlen;
|
||||
while ((Size) needed > newlen)
|
||||
newlen = 2 * str->maxlen;
|
||||
while (needed > newlen)
|
||||
newlen = 2 * newlen;
|
||||
|
||||
/*
|
||||
* Clamp to the limit in case we went past it. (We used to depend on
|
||||
* limit <= INT32_MAX/2, to avoid overflow in the loop above; we no longer
|
||||
* depend on that, but if "needed" and str->maxlen ever become wider, we
|
||||
* will need similar caution here.) We will still have newlen >= needed.
|
||||
* Clamp to MaxAllocSize in case we went past it. Note we are assuming
|
||||
* here that MaxAllocSize <= INT_MAX/2, else the above loop could
|
||||
* overflow. We will still have newlen >= needed.
|
||||
*/
|
||||
if (newlen > limit)
|
||||
newlen = limit;
|
||||
if (newlen > (int) MaxAllocSize)
|
||||
newlen = (int) MaxAllocSize;
|
||||
|
||||
str->data = (char *) repalloc_huge(str->data, newlen);
|
||||
str->data = (char *) repalloc(str->data, newlen);
|
||||
|
||||
str->maxlen = newlen;
|
||||
}
|
||||
|
Reference in New Issue
Block a user