Skip to content

Commit a52572c

Browse files
committed
Merge branch 'master' of https://gitlab.postgrespro.ru/pgpro-dev/postgrespro into xtm
2 parents 46c3961 + 6bcce25 commit a52572c

File tree

270 files changed

+10775
-7271
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

270 files changed

+10775
-7271
lines changed

config/c-compiler.m4

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,24 @@ fi])# PGAC_C_BUILTIN_BSWAP32
214214

215215

216216

217+
# PGAC_C_BUILTIN_BSWAP64
218+
# -------------------------
219+
# Check if the C compiler understands __builtin_bswap64(),
220+
# and define HAVE__BUILTIN_BSWAP64 if so.
221+
AC_DEFUN([PGAC_C_BUILTIN_BSWAP64],
222+
[AC_CACHE_CHECK(for __builtin_bswap64, pgac_cv__builtin_bswap64,
223+
[AC_COMPILE_IFELSE([AC_LANG_SOURCE(
224+
[static unsigned long int x = __builtin_bswap64(0xaabbccddeeff0011);]
225+
)],
226+
[pgac_cv__builtin_bswap64=yes],
227+
[pgac_cv__builtin_bswap64=no])])
228+
if test x"$pgac_cv__builtin_bswap64" = xyes ; then
229+
AC_DEFINE(HAVE__BUILTIN_BSWAP64, 1,
230+
[Define to 1 if your compiler understands __builtin_bswap64.])
231+
fi])# PGAC_C_BUILTIN_BSWAP64
232+
233+
234+
217235
# PGAC_C_BUILTIN_CONSTANT_P
218236
# -------------------------
219237
# Check if the C compiler understands __builtin_constant_p(),

configure

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11258,6 +11258,30 @@ if test x"$pgac_cv__builtin_bswap32" = xyes ; then
1125811258

1125911259
$as_echo "#define HAVE__BUILTIN_BSWAP32 1" >>confdefs.h
1126011260

11261+
fi
11262+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_bswap64" >&5
11263+
$as_echo_n "checking for __builtin_bswap64... " >&6; }
11264+
if ${pgac_cv__builtin_bswap64+:} false; then :
11265+
$as_echo_n "(cached) " >&6
11266+
else
11267+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
11268+
/* end confdefs.h. */
11269+
static unsigned long int x = __builtin_bswap64(0xaabbccddeeff0011);
11270+
11271+
_ACEOF
11272+
if ac_fn_c_try_compile "$LINENO"; then :
11273+
pgac_cv__builtin_bswap64=yes
11274+
else
11275+
pgac_cv__builtin_bswap64=no
11276+
fi
11277+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
11278+
fi
11279+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__builtin_bswap64" >&5
11280+
$as_echo "$pgac_cv__builtin_bswap64" >&6; }
11281+
if test x"$pgac_cv__builtin_bswap64" = xyes ; then
11282+
11283+
$as_echo "#define HAVE__BUILTIN_BSWAP64 1" >>confdefs.h
11284+
1126111285
fi
1126211286
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_constant_p" >&5
1126311287
$as_echo_n "checking for __builtin_constant_p... " >&6; }

configure.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,6 +1317,7 @@ PGAC_C_FUNCNAME_SUPPORT
13171317
PGAC_C_STATIC_ASSERT
13181318
PGAC_C_TYPES_COMPATIBLE
13191319
PGAC_C_BUILTIN_BSWAP32
1320+
PGAC_C_BUILTIN_BSWAP64
13201321
PGAC_C_BUILTIN_CONSTANT_P
13211322
PGAC_C_BUILTIN_UNREACHABLE
13221323
PGAC_C_VA_ARGS

contrib/earthdistance/expected/earthdistance.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
--
1010
CREATE EXTENSION earthdistance; -- fail, must install cube first
1111
ERROR: required extension "cube" is not installed
12+
HINT: Use CREATE EXTENSION CASCADE to install required extensions too.
1213
CREATE EXTENSION cube;
1314
CREATE EXTENSION earthdistance;
1415
--

contrib/hstore_plperl/expected/hstore_plperl.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
CREATE EXTENSION hstore;
2-
CREATE EXTENSION plperl;
3-
CREATE EXTENSION hstore_plperl;
1+
CREATE EXTENSION hstore_plperl CASCADE;
2+
NOTICE: installing required extension "hstore"
3+
NOTICE: installing required extension "plperl"
44
SELECT transforms.udt_schema, transforms.udt_name,
55
routine_schema, routine_name,
66
group_name, transform_type

contrib/hstore_plperl/expected/hstore_plperlu.out

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
CREATE EXTENSION hstore;
2-
CREATE EXTENSION plperlu;
3-
CREATE EXTENSION hstore_plperlu;
1+
CREATE EXTENSION hstore_plperlu CASCADE;
2+
NOTICE: installing required extension "hstore"
3+
NOTICE: installing required extension "plperlu"
44
SELECT transforms.udt_schema, transforms.udt_name,
55
routine_schema, routine_name,
66
group_name, transform_type

contrib/hstore_plperl/sql/hstore_plperl.sql

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
CREATE EXTENSION hstore;
2-
CREATE EXTENSION plperl;
3-
CREATE EXTENSION hstore_plperl;
1+
CREATE EXTENSION hstore_plperl CASCADE;
42

53
SELECT transforms.udt_schema, transforms.udt_name,
64
routine_schema, routine_name,

contrib/hstore_plperl/sql/hstore_plperlu.sql

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
CREATE EXTENSION hstore;
2-
CREATE EXTENSION plperlu;
3-
CREATE EXTENSION hstore_plperlu;
1+
CREATE EXTENSION hstore_plperlu CASCADE;
42

53
SELECT transforms.udt_schema, transforms.udt_name,
64
routine_schema, routine_name,

contrib/hstore_plpython/expected/hstore_plpython.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
CREATE EXTENSION plpython2u;
2-
CREATE EXTENSION hstore_plpython2u;
1+
CREATE EXTENSION hstore_plpython2u CASCADE;
2+
NOTICE: installing required extension "plpython2u"
33
-- test hstore -> python
44
CREATE FUNCTION test1(val hstore) RETURNS int
55
LANGUAGE plpythonu

contrib/hstore_plpython/sql/hstore_plpython.sql

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
CREATE EXTENSION plpython2u;
2-
CREATE EXTENSION hstore_plpython2u;
1+
CREATE EXTENSION hstore_plpython2u CASCADE;
32

43

54
-- test hstore -> python

contrib/intarray/_int_bool.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,9 @@ typedef struct
564564
static void
565565
infix(INFIX *in, bool first)
566566
{
567+
/* since this function recurses, it could be driven to stack overflow. */
568+
check_stack_depth();
569+
567570
if (in->curpol->type == VAL)
568571
{
569572
RESIZEBUF(in, 11);

contrib/ltree/ltxtquery_io.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ while( ( (inf)->cur - (inf)->buf ) + (addsize) + 1 >= (inf)->buflen ) \
416416
static void
417417
infix(INFIX *in, bool first)
418418
{
419+
/* since this function recurses, it could be driven to stack overflow. */
420+
check_stack_depth();
421+
419422
if (in->curpol->type == VAL)
420423
{
421424
char *op = in->op + in->curpol->distance;

contrib/ltree/ltxtquery_op.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <ctype.h>
99

1010
#include "ltree.h"
11+
#include "miscadmin.h"
1112

1213
PG_FUNCTION_INFO_V1(ltxtq_exec);
1314
PG_FUNCTION_INFO_V1(ltxtq_rexec);
@@ -18,6 +19,9 @@ PG_FUNCTION_INFO_V1(ltxtq_rexec);
1819
bool
1920
ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, ITEM *val))
2021
{
22+
/* since this function recurses, it could be driven to stack overflow */
23+
check_stack_depth();
24+
2125
if (curitem->type == VAL)
2226
return (*chkcond) (checkval, curitem);
2327
else if (curitem->val == (int32) '!')

contrib/ltree_plpython/expected/ltree_plpython.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
CREATE EXTENSION plpython2u;
2-
CREATE EXTENSION ltree_plpython2u;
1+
CREATE EXTENSION ltree_plpython2u CASCADE;
2+
NOTICE: installing required extension "plpython2u"
33
CREATE FUNCTION test1(val ltree) RETURNS int
44
LANGUAGE plpythonu
55
TRANSFORM FOR TYPE ltree

contrib/ltree_plpython/sql/ltree_plpython.sql

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
CREATE EXTENSION plpython2u;
2-
CREATE EXTENSION ltree_plpython2u;
1+
CREATE EXTENSION ltree_plpython2u CASCADE;
32

43

54
CREATE FUNCTION test1(val ltree) RETURNS int

contrib/pg_stat_statements/pg_stat_statements.c

Lines changed: 75 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ typedef struct pgssEntry
170170
pgssHashKey key; /* hash key of entry - MUST BE FIRST */
171171
Counters counters; /* the statistics for this query */
172172
Size query_offset; /* query text offset in external file */
173-
int query_len; /* # of valid bytes in query string */
173+
int query_len; /* # of valid bytes in query string, or -1 */
174174
int encoding; /* query text encoding */
175175
slock_t mutex; /* protects the counters only */
176176
} pgssEntry;
@@ -1705,7 +1705,8 @@ entry_cmp(const void *lhs, const void *rhs)
17051705
}
17061706

17071707
/*
1708-
* Deallocate least used entries.
1708+
* Deallocate least-used entries.
1709+
*
17091710
* Caller must hold an exclusive lock on pgss->lock.
17101711
*/
17111712
static void
@@ -1716,17 +1717,27 @@ entry_dealloc(void)
17161717
pgssEntry *entry;
17171718
int nvictims;
17181719
int i;
1719-
Size totlen = 0;
1720+
Size tottextlen;
1721+
int nvalidtexts;
17201722

17211723
/*
17221724
* Sort entries by usage and deallocate USAGE_DEALLOC_PERCENT of them.
17231725
* While we're scanning the table, apply the decay factor to the usage
1724-
* values.
1726+
* values, and update the mean query length.
1727+
*
1728+
* Note that the mean query length is almost immediately obsolete, since
1729+
* we compute it before not after discarding the least-used entries.
1730+
* Hopefully, that doesn't affect the mean too much; it doesn't seem worth
1731+
* making two passes to get a more current result. Likewise, the new
1732+
* cur_median_usage includes the entries we're about to zap.
17251733
*/
17261734

17271735
entries = palloc(hash_get_num_entries(pgss_hash) * sizeof(pgssEntry *));
17281736

17291737
i = 0;
1738+
tottextlen = 0;
1739+
nvalidtexts = 0;
1740+
17301741
hash_seq_init(&hash_seq, pgss_hash);
17311742
while ((entry = hash_seq_search(&hash_seq)) != NULL)
17321743
{
@@ -1736,20 +1747,27 @@ entry_dealloc(void)
17361747
entry->counters.usage *= STICKY_DECREASE_FACTOR;
17371748
else
17381749
entry->counters.usage *= USAGE_DECREASE_FACTOR;
1739-
/* Accumulate total size, too. */
1740-
totlen += entry->query_len + 1;
1750+
/* In the mean length computation, ignore dropped texts. */
1751+
if (entry->query_len >= 0)
1752+
{
1753+
tottextlen += entry->query_len + 1;
1754+
nvalidtexts++;
1755+
}
17411756
}
17421757

1758+
/* Sort into increasing order by usage */
17431759
qsort(entries, i, sizeof(pgssEntry *), entry_cmp);
17441760

1761+
/* Record the (approximate) median usage */
17451762
if (i > 0)
1746-
{
1747-
/* Record the (approximate) median usage */
17481763
pgss->cur_median_usage = entries[i / 2]->counters.usage;
1749-
/* Record the mean query length */
1750-
pgss->mean_query_len = totlen / i;
1751-
}
1764+
/* Record the mean query length */
1765+
if (nvalidtexts > 0)
1766+
pgss->mean_query_len = tottextlen / nvalidtexts;
1767+
else
1768+
pgss->mean_query_len = ASSUMED_LENGTH_INIT;
17521769

1770+
/* Now zap an appropriate fraction of lowest-usage entries */
17531771
nvictims = Max(10, i * USAGE_DEALLOC_PERCENT / 100);
17541772
nvictims = Min(nvictims, i);
17551773

@@ -1892,15 +1910,17 @@ qtext_load_file(Size *buffer_size)
18921910
}
18931911

18941912
/* Allocate buffer; beware that off_t might be wider than size_t */
1895-
if (stat.st_size <= MaxAllocSize)
1913+
if (stat.st_size <= MaxAllocHugeSize)
18961914
buf = (char *) malloc(stat.st_size);
18971915
else
18981916
buf = NULL;
18991917
if (buf == NULL)
19001918
{
19011919
ereport(LOG,
19021920
(errcode(ERRCODE_OUT_OF_MEMORY),
1903-
errmsg("out of memory")));
1921+
errmsg("out of memory"),
1922+
errdetail("Could not allocate enough memory to read pg_stat_statement file \"%s\".",
1923+
PGSS_TEXT_FILE)));
19041924
CloseTransientFile(fd);
19051925
return NULL;
19061926
}
@@ -2002,13 +2022,17 @@ need_gc_qtexts(void)
20022022
* occur in the foreseeable future.
20032023
*
20042024
* The caller must hold an exclusive lock on pgss->lock.
2025+
*
2026+
* At the first sign of trouble we unlink the query text file to get a clean
2027+
* slate (although existing statistics are retained), rather than risk
2028+
* thrashing by allowing the same problem case to recur indefinitely.
20052029
*/
20062030
static void
20072031
gc_qtexts(void)
20082032
{
20092033
char *qbuffer;
20102034
Size qbuffer_size;
2011-
FILE *qfile;
2035+
FILE *qfile = NULL;
20122036
HASH_SEQ_STATUS hash_seq;
20132037
pgssEntry *entry;
20142038
Size extent;
@@ -2023,12 +2047,15 @@ gc_qtexts(void)
20232047
return;
20242048

20252049
/*
2026-
* Load the old texts file. If we fail (out of memory, for instance) just
2027-
* skip the garbage collection.
2050+
* Load the old texts file. If we fail (out of memory, for instance),
2051+
* invalidate query texts. Hopefully this is rare. It might seem better
2052+
* to leave things alone on an OOM failure, but the problem is that the
2053+
* file is only going to get bigger; hoping for a future non-OOM result is
2054+
* risky and can easily lead to complete denial of service.
20282055
*/
20292056
qbuffer = qtext_load_file(&qbuffer_size);
20302057
if (qbuffer == NULL)
2031-
return;
2058+
goto gc_fail;
20322059

20332060
/*
20342061
* We overwrite the query texts file in place, so as to reduce the risk of
@@ -2063,6 +2090,7 @@ gc_qtexts(void)
20632090
/* Trouble ... drop the text */
20642091
entry->query_offset = 0;
20652092
entry->query_len = -1;
2093+
/* entry will not be counted in mean query length computation */
20662094
continue;
20672095
}
20682096

@@ -2147,7 +2175,36 @@ gc_qtexts(void)
21472175
entry->query_len = -1;
21482176
}
21492177

2150-
/* Seems like a good idea to bump the GC count even though we failed */
2178+
/*
2179+
* Destroy the query text file and create a new, empty one
2180+
*/
2181+
(void) unlink(PGSS_TEXT_FILE);
2182+
qfile = AllocateFile(PGSS_TEXT_FILE, PG_BINARY_W);
2183+
if (qfile == NULL)
2184+
ereport(LOG,
2185+
(errcode_for_file_access(),
2186+
errmsg("could not write new pg_stat_statement file \"%s\": %m",
2187+
PGSS_TEXT_FILE)));
2188+
else
2189+
FreeFile(qfile);
2190+
2191+
/* Reset the shared extent pointer */
2192+
pgss->extent = 0;
2193+
2194+
/* Reset mean_query_len to match the new state */
2195+
pgss->mean_query_len = ASSUMED_LENGTH_INIT;
2196+
2197+
/*
2198+
* Bump the GC count even though we failed.
2199+
*
2200+
* This is needed to make concurrent readers of file without any lock on
2201+
* pgss->lock notice existence of new version of file. Once readers
2202+
* subsequently observe a change in GC count with pgss->lock held, that
2203+
* forces a safe reopen of file. Writers also require that we bump here,
2204+
* of course. (As required by locking protocol, readers and writers don't
2205+
* trust earlier file contents until gc_count is found unchanged after
2206+
* pgss->lock acquired in shared or exclusive mode respectively.)
2207+
*/
21512208
record_gc_qtexts();
21522209
}
21532210

0 commit comments

Comments
 (0)