Skip to content

Commit 872c93d

Browse files
authored
Merge pull request #138 from postgres/master
Sync Fork from Upstream Repo
2 parents 61693a8 + 9e10898 commit 872c93d

Some content is hidden

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

85 files changed

+1173
-328
lines changed

configure

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12174,7 +12174,11 @@ fi
1217412174
fi
1217512175

1217612176
if test "$with_openssl" = yes ; then
12177-
if test "$PORTNAME" != "win32"; then
12177+
# Minimum required OpenSSL version is 1.0.1
12178+
12179+
$as_echo "#define OPENSSL_API_COMPAT 0x10001000L" >>confdefs.h
12180+
12181+
if test "$PORTNAME" != "win32"; then
1217812182
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRYPTO_new_ex_data in -lcrypto" >&5
1217912183
$as_echo_n "checking for CRYPTO_new_ex_data in -lcrypto... " >&6; }
1218012184
if ${ac_cv_lib_crypto_CRYPTO_new_ex_data+:} false; then :

configure.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,9 @@ fi
12061206

12071207
if test "$with_openssl" = yes ; then
12081208
dnl Order matters!
1209+
# Minimum required OpenSSL version is 1.0.1
1210+
AC_DEFINE(OPENSSL_API_COMPAT, [0x10001000L],
1211+
[Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.])
12091212
if test "$PORTNAME" != "win32"; then
12101213
AC_CHECK_LIB(crypto, CRYPTO_new_ex_data, [], [AC_MSG_ERROR([library 'crypto' is required for OpenSSL])])
12111214
AC_CHECK_LIB(ssl, SSL_new, [], [AC_MSG_ERROR([library 'ssl' is required for OpenSSL])])

contrib/btree_gist/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ OBJS = \
3131
EXTENSION = btree_gist
3232
DATA = btree_gist--1.0--1.1.sql \
3333
btree_gist--1.1--1.2.sql btree_gist--1.2.sql btree_gist--1.2--1.3.sql \
34-
btree_gist--1.3--1.4.sql btree_gist--1.4--1.5.sql
34+
btree_gist--1.3--1.4.sql btree_gist--1.4--1.5.sql \
35+
btree_gist--1.5--1.6.sql
3536
PGFILEDESC = "btree_gist - B-tree equivalent GiST operator classes"
3637

3738
REGRESS = init int2 int4 int8 float4 float8 cash oid timestamp timestamptz \
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
/* contrib/btree_gist/btree_gist--1.5--1.6.sql */
2+
3+
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
4+
\echo Use "ALTER EXTENSION btree_gist UPDATE TO '1.6'" to load this file. \quit
5+
6+
-- This upgrade script marks all btree_gist functions as parallel safe.
7+
8+
-- Input/output functions for GiST key types (gbtreekey*)
9+
ALTER FUNCTION gbtreekey4_in(cstring) PARALLEL SAFE;
10+
ALTER FUNCTION gbtreekey4_out(gbtreekey4) PARALLEL SAFE;
11+
ALTER FUNCTION gbtreekey8_in(cstring) PARALLEL SAFE;
12+
ALTER FUNCTION gbtreekey8_out(gbtreekey8) PARALLEL SAFE;
13+
ALTER FUNCTION gbtreekey16_in(cstring) PARALLEL SAFE;
14+
ALTER FUNCTION gbtreekey16_out(gbtreekey16) PARALLEL SAFE;
15+
ALTER FUNCTION gbtreekey32_in(cstring) PARALLEL SAFE;
16+
ALTER FUNCTION gbtreekey32_out(gbtreekey32) PARALLEL SAFE;
17+
ALTER FUNCTION gbtreekey_var_in(cstring) PARALLEL SAFE;
18+
ALTER FUNCTION gbtreekey_var_out(gbtreekey_var) PARALLEL SAFE;
19+
20+
-- Functions, which implement distance operators (<->)
21+
ALTER FUNCTION cash_dist(money, money) PARALLEL SAFE;
22+
ALTER FUNCTION date_dist(date, date) PARALLEL SAFE;
23+
ALTER FUNCTION float4_dist(real, real) PARALLEL SAFE;
24+
ALTER FUNCTION float8_dist(double precision, double precision) PARALLEL SAFE;
25+
ALTER FUNCTION int2_dist(smallint, smallint) PARALLEL SAFE;
26+
ALTER FUNCTION int4_dist(integer, integer) PARALLEL SAFE;
27+
ALTER FUNCTION int8_dist(bigint, bigint) PARALLEL SAFE;
28+
ALTER FUNCTION interval_dist(interval, interval) PARALLEL SAFE;
29+
ALTER FUNCTION oid_dist(oid, oid) PARALLEL SAFE;
30+
ALTER FUNCTION time_dist(time without time zone, time without time zone) PARALLEL SAFE;
31+
ALTER FUNCTION ts_dist(timestamp without time zone, timestamp without time zone) PARALLEL SAFE;
32+
ALTER FUNCTION tstz_dist(timestamp with time zone, timestamp with time zone) PARALLEL SAFE;
33+
34+
-- GiST support methods
35+
ALTER FUNCTION gbt_oid_consistent(internal, oid, smallint, oid, internal) PARALLEL SAFE;
36+
ALTER FUNCTION gbt_oid_distance(internal, oid, smallint, oid, internal) PARALLEL SAFE;
37+
ALTER FUNCTION gbt_oid_fetch(internal) PARALLEL SAFE;
38+
ALTER FUNCTION gbt_oid_compress(internal) PARALLEL SAFE;
39+
ALTER FUNCTION gbt_decompress(internal) PARALLEL SAFE;
40+
ALTER FUNCTION gbt_var_decompress(internal) PARALLEL SAFE;
41+
ALTER FUNCTION gbt_var_fetch(internal) PARALLEL SAFE;
42+
ALTER FUNCTION gbt_oid_penalty(internal, internal, internal) PARALLEL SAFE;
43+
ALTER FUNCTION gbt_oid_picksplit(internal, internal) PARALLEL SAFE;
44+
ALTER FUNCTION gbt_oid_union(internal, internal) PARALLEL SAFE;
45+
ALTER FUNCTION gbt_oid_same(gbtreekey8, gbtreekey8, internal) PARALLEL SAFE;
46+
ALTER FUNCTION gbt_int2_consistent(internal, smallint, smallint, oid, internal) PARALLEL SAFE;
47+
ALTER FUNCTION gbt_int2_distance(internal, smallint, smallint, oid, internal) PARALLEL SAFE;
48+
ALTER FUNCTION gbt_int2_compress(internal) PARALLEL SAFE;
49+
ALTER FUNCTION gbt_int2_fetch(internal) PARALLEL SAFE;
50+
ALTER FUNCTION gbt_int2_penalty(internal, internal, internal) PARALLEL SAFE;
51+
ALTER FUNCTION gbt_int2_picksplit(internal, internal) PARALLEL SAFE;
52+
ALTER FUNCTION gbt_int2_union(internal, internal) PARALLEL SAFE;
53+
ALTER FUNCTION gbt_int2_same(gbtreekey4, gbtreekey4, internal) PARALLEL SAFE;
54+
ALTER FUNCTION gbt_int4_consistent(internal, integer, smallint, oid, internal) PARALLEL SAFE;
55+
ALTER FUNCTION gbt_int4_distance(internal, integer, smallint, oid, internal) PARALLEL SAFE;
56+
ALTER FUNCTION gbt_int4_compress(internal) PARALLEL SAFE;
57+
ALTER FUNCTION gbt_int4_fetch(internal) PARALLEL SAFE;
58+
ALTER FUNCTION gbt_int4_penalty(internal, internal, internal) PARALLEL SAFE;
59+
ALTER FUNCTION gbt_int4_picksplit(internal, internal) PARALLEL SAFE;
60+
ALTER FUNCTION gbt_int4_union(internal, internal) PARALLEL SAFE;
61+
ALTER FUNCTION gbt_int4_same(gbtreekey8, gbtreekey8, internal) PARALLEL SAFE;
62+
ALTER FUNCTION gbt_int8_consistent(internal, bigint, smallint, oid, internal) PARALLEL SAFE;
63+
ALTER FUNCTION gbt_int8_distance(internal, bigint, smallint, oid, internal) PARALLEL SAFE;
64+
ALTER FUNCTION gbt_int8_compress(internal) PARALLEL SAFE;
65+
ALTER FUNCTION gbt_int8_fetch(internal) PARALLEL SAFE;
66+
ALTER FUNCTION gbt_int8_penalty(internal, internal, internal) PARALLEL SAFE;
67+
ALTER FUNCTION gbt_int8_picksplit(internal, internal) PARALLEL SAFE;
68+
ALTER FUNCTION gbt_int8_union(internal, internal) PARALLEL SAFE;
69+
ALTER FUNCTION gbt_int8_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
70+
ALTER FUNCTION gbt_float4_consistent(internal, real, smallint, oid, internal) PARALLEL SAFE;
71+
ALTER FUNCTION gbt_float4_distance(internal, real, smallint, oid, internal) PARALLEL SAFE;
72+
ALTER FUNCTION gbt_float4_compress(internal) PARALLEL SAFE;
73+
ALTER FUNCTION gbt_float4_fetch(internal) PARALLEL SAFE;
74+
ALTER FUNCTION gbt_float4_penalty(internal, internal, internal) PARALLEL SAFE;
75+
ALTER FUNCTION gbt_float4_picksplit(internal, internal) PARALLEL SAFE;
76+
ALTER FUNCTION gbt_float4_union(internal, internal) PARALLEL SAFE;
77+
ALTER FUNCTION gbt_float4_same(gbtreekey8, gbtreekey8, internal) PARALLEL SAFE;
78+
ALTER FUNCTION gbt_float8_consistent(internal, double precision, smallint, oid, internal) PARALLEL SAFE;
79+
ALTER FUNCTION gbt_float8_distance(internal, double precision, smallint, oid, internal) PARALLEL SAFE;
80+
ALTER FUNCTION gbt_float8_compress(internal) PARALLEL SAFE;
81+
ALTER FUNCTION gbt_float8_fetch(internal) PARALLEL SAFE;
82+
ALTER FUNCTION gbt_float8_penalty(internal, internal, internal) PARALLEL SAFE;
83+
ALTER FUNCTION gbt_float8_picksplit(internal, internal) PARALLEL SAFE;
84+
ALTER FUNCTION gbt_float8_union(internal, internal) PARALLEL SAFE;
85+
ALTER FUNCTION gbt_float8_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
86+
ALTER FUNCTION gbt_ts_consistent(internal, timestamp without time zone, smallint, oid, internal) PARALLEL SAFE;
87+
ALTER FUNCTION gbt_ts_distance(internal, timestamp without time zone, smallint, oid, internal) PARALLEL SAFE;
88+
ALTER FUNCTION gbt_tstz_consistent(internal, timestamp with time zone, smallint, oid, internal) PARALLEL SAFE;
89+
ALTER FUNCTION gbt_tstz_distance(internal, timestamp with time zone, smallint, oid, internal) PARALLEL SAFE;
90+
ALTER FUNCTION gbt_ts_compress(internal) PARALLEL SAFE;
91+
ALTER FUNCTION gbt_tstz_compress(internal) PARALLEL SAFE;
92+
ALTER FUNCTION gbt_ts_fetch(internal) PARALLEL SAFE;
93+
ALTER FUNCTION gbt_ts_penalty(internal, internal, internal) PARALLEL SAFE;
94+
ALTER FUNCTION gbt_ts_picksplit(internal, internal) PARALLEL SAFE;
95+
ALTER FUNCTION gbt_ts_union(internal, internal) PARALLEL SAFE;
96+
ALTER FUNCTION gbt_ts_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
97+
ALTER FUNCTION gbt_time_consistent(internal, time without time zone, smallint, oid, internal) PARALLEL SAFE;
98+
ALTER FUNCTION gbt_time_distance(internal, time without time zone, smallint, oid, internal) PARALLEL SAFE;
99+
ALTER FUNCTION gbt_timetz_consistent(internal, time with time zone, smallint, oid, internal) PARALLEL SAFE;
100+
ALTER FUNCTION gbt_time_compress(internal) PARALLEL SAFE;
101+
ALTER FUNCTION gbt_timetz_compress(internal) PARALLEL SAFE;
102+
ALTER FUNCTION gbt_time_fetch(internal) PARALLEL SAFE;
103+
ALTER FUNCTION gbt_time_penalty(internal, internal, internal) PARALLEL SAFE;
104+
ALTER FUNCTION gbt_time_picksplit(internal, internal) PARALLEL SAFE;
105+
ALTER FUNCTION gbt_time_union(internal, internal) PARALLEL SAFE;
106+
ALTER FUNCTION gbt_time_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
107+
ALTER FUNCTION gbt_date_consistent(internal, date, smallint, oid, internal) PARALLEL SAFE;
108+
ALTER FUNCTION gbt_date_distance(internal, date, smallint, oid, internal) PARALLEL SAFE;
109+
ALTER FUNCTION gbt_date_compress(internal) PARALLEL SAFE;
110+
ALTER FUNCTION gbt_date_fetch(internal) PARALLEL SAFE;
111+
ALTER FUNCTION gbt_date_penalty(internal, internal, internal) PARALLEL SAFE;
112+
ALTER FUNCTION gbt_date_picksplit(internal, internal) PARALLEL SAFE;
113+
ALTER FUNCTION gbt_date_union(internal, internal) PARALLEL SAFE;
114+
ALTER FUNCTION gbt_date_same(gbtreekey8, gbtreekey8, internal) PARALLEL SAFE;
115+
ALTER FUNCTION gbt_intv_consistent(internal, interval, smallint, oid, internal) PARALLEL SAFE;
116+
ALTER FUNCTION gbt_intv_distance(internal, interval, smallint, oid, internal) PARALLEL SAFE;
117+
ALTER FUNCTION gbt_intv_compress(internal) PARALLEL SAFE;
118+
ALTER FUNCTION gbt_intv_decompress(internal) PARALLEL SAFE;
119+
ALTER FUNCTION gbt_intv_fetch(internal) PARALLEL SAFE;
120+
ALTER FUNCTION gbt_intv_penalty(internal, internal, internal) PARALLEL SAFE;
121+
ALTER FUNCTION gbt_intv_picksplit(internal, internal) PARALLEL SAFE;
122+
ALTER FUNCTION gbt_intv_union(internal, internal) PARALLEL SAFE;
123+
ALTER FUNCTION gbt_intv_same(gbtreekey32, gbtreekey32, internal) PARALLEL SAFE;
124+
ALTER FUNCTION gbt_cash_consistent(internal, money, smallint, oid, internal) PARALLEL SAFE;
125+
ALTER FUNCTION gbt_cash_distance(internal, money, smallint, oid, internal) PARALLEL SAFE;
126+
ALTER FUNCTION gbt_cash_compress(internal) PARALLEL SAFE;
127+
ALTER FUNCTION gbt_cash_fetch(internal) PARALLEL SAFE;
128+
ALTER FUNCTION gbt_cash_penalty(internal, internal, internal) PARALLEL SAFE;
129+
ALTER FUNCTION gbt_cash_picksplit(internal, internal) PARALLEL SAFE;
130+
ALTER FUNCTION gbt_cash_union(internal, internal) PARALLEL SAFE;
131+
ALTER FUNCTION gbt_cash_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
132+
ALTER FUNCTION gbt_macad_consistent(internal, macaddr, smallint, oid, internal) PARALLEL SAFE;
133+
ALTER FUNCTION gbt_macad_compress(internal) PARALLEL SAFE;
134+
ALTER FUNCTION gbt_macad_fetch(internal) PARALLEL SAFE;
135+
ALTER FUNCTION gbt_macad_penalty(internal, internal, internal) PARALLEL SAFE;
136+
ALTER FUNCTION gbt_macad_picksplit(internal, internal) PARALLEL SAFE;
137+
ALTER FUNCTION gbt_macad_union(internal, internal) PARALLEL SAFE;
138+
ALTER FUNCTION gbt_macad_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
139+
ALTER FUNCTION gbt_text_consistent(internal, text, smallint, oid, internal) PARALLEL SAFE;
140+
ALTER FUNCTION gbt_bpchar_consistent(internal, character, smallint, oid, internal) PARALLEL SAFE;
141+
ALTER FUNCTION gbt_text_compress(internal) PARALLEL SAFE;
142+
ALTER FUNCTION gbt_bpchar_compress(internal) PARALLEL SAFE;
143+
ALTER FUNCTION gbt_text_penalty(internal, internal, internal) PARALLEL SAFE;
144+
ALTER FUNCTION gbt_text_picksplit(internal, internal) PARALLEL SAFE;
145+
ALTER FUNCTION gbt_text_union(internal, internal) PARALLEL SAFE;
146+
ALTER FUNCTION gbt_text_same(gbtreekey_var, gbtreekey_var, internal) PARALLEL SAFE;
147+
ALTER FUNCTION gbt_bytea_consistent(internal, bytea, smallint, oid, internal) PARALLEL SAFE;
148+
ALTER FUNCTION gbt_bytea_compress(internal) PARALLEL SAFE;
149+
ALTER FUNCTION gbt_bytea_penalty(internal, internal, internal) PARALLEL SAFE;
150+
ALTER FUNCTION gbt_bytea_picksplit(internal, internal) PARALLEL SAFE;
151+
ALTER FUNCTION gbt_bytea_union(internal, internal) PARALLEL SAFE;
152+
ALTER FUNCTION gbt_bytea_same(gbtreekey_var, gbtreekey_var, internal) PARALLEL SAFE;
153+
ALTER FUNCTION gbt_numeric_consistent(internal, numeric, smallint, oid, internal) PARALLEL SAFE;
154+
ALTER FUNCTION gbt_numeric_compress(internal) PARALLEL SAFE;
155+
ALTER FUNCTION gbt_numeric_penalty(internal, internal, internal) PARALLEL SAFE;
156+
ALTER FUNCTION gbt_numeric_picksplit(internal, internal) PARALLEL SAFE;
157+
ALTER FUNCTION gbt_numeric_union(internal, internal) PARALLEL SAFE;
158+
ALTER FUNCTION gbt_numeric_same(gbtreekey_var, gbtreekey_var, internal) PARALLEL SAFE;
159+
ALTER FUNCTION gbt_bit_consistent(internal, bit, smallint, oid, internal) PARALLEL SAFE;
160+
ALTER FUNCTION gbt_bit_compress(internal) PARALLEL SAFE;
161+
ALTER FUNCTION gbt_bit_penalty(internal, internal, internal) PARALLEL SAFE;
162+
ALTER FUNCTION gbt_bit_picksplit(internal, internal) PARALLEL SAFE;
163+
ALTER FUNCTION gbt_bit_union(internal, internal) PARALLEL SAFE;
164+
ALTER FUNCTION gbt_bit_same(gbtreekey_var, gbtreekey_var, internal) PARALLEL SAFE;
165+
ALTER FUNCTION gbt_inet_consistent(internal, inet, smallint, oid, internal) PARALLEL SAFE;
166+
ALTER FUNCTION gbt_inet_compress(internal) PARALLEL SAFE;
167+
ALTER FUNCTION gbt_inet_penalty(internal, internal, internal) PARALLEL SAFE;
168+
ALTER FUNCTION gbt_inet_picksplit(internal, internal) PARALLEL SAFE;
169+
ALTER FUNCTION gbt_inet_union(internal, internal) PARALLEL SAFE;
170+
ALTER FUNCTION gbt_inet_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
171+
ALTER FUNCTION gbt_uuid_consistent(internal, uuid, smallint, oid, internal) PARALLEL SAFE;
172+
ALTER FUNCTION gbt_uuid_fetch(internal) PARALLEL SAFE;
173+
ALTER FUNCTION gbt_uuid_compress(internal) PARALLEL SAFE;
174+
ALTER FUNCTION gbt_uuid_penalty(internal, internal, internal) PARALLEL SAFE;
175+
ALTER FUNCTION gbt_uuid_picksplit(internal, internal) PARALLEL SAFE;
176+
ALTER FUNCTION gbt_uuid_union(internal, internal) PARALLEL SAFE;
177+
ALTER FUNCTION gbt_uuid_same(gbtreekey32, gbtreekey32, internal) PARALLEL SAFE;
178+
ALTER FUNCTION gbt_macad8_consistent(internal, macaddr8, smallint, oid, internal) PARALLEL SAFE;
179+
ALTER FUNCTION gbt_macad8_compress(internal) PARALLEL SAFE;
180+
ALTER FUNCTION gbt_macad8_fetch(internal) PARALLEL SAFE;
181+
ALTER FUNCTION gbt_macad8_penalty(internal, internal, internal) PARALLEL SAFE;
182+
ALTER FUNCTION gbt_macad8_picksplit(internal, internal) PARALLEL SAFE;
183+
ALTER FUNCTION gbt_macad8_union(internal, internal) PARALLEL SAFE;
184+
ALTER FUNCTION gbt_macad8_same(gbtreekey16, gbtreekey16, internal) PARALLEL SAFE;
185+
ALTER FUNCTION gbt_enum_consistent(internal, anyenum, smallint, oid, internal) PARALLEL SAFE;
186+
ALTER FUNCTION gbt_enum_compress(internal) PARALLEL SAFE;
187+
ALTER FUNCTION gbt_enum_fetch(internal) PARALLEL SAFE;
188+
ALTER FUNCTION gbt_enum_penalty(internal, internal, internal) PARALLEL SAFE;
189+
ALTER FUNCTION gbt_enum_picksplit(internal, internal) PARALLEL SAFE;
190+
ALTER FUNCTION gbt_enum_union(internal, internal) PARALLEL SAFE;
191+
ALTER FUNCTION gbt_enum_same(gbtreekey8, gbtreekey8, internal) PARALLEL SAFE;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# btree_gist extension
22
comment = 'support for indexing common datatypes in GiST'
3-
default_version = '1.5'
3+
default_version = '1.6'
44
module_pathname = '$libdir/btree_gist'
55
relocatable = true
66
trusted = true

contrib/pgcrypto/expected/pgp-compression.out

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,33 @@ select pgp_sym_decrypt(
4848
Secret message
4949
(1 row)
5050

51+
-- check corner case involving an input string of 16kB, as per bug #16476.
52+
SELECT setseed(0);
53+
setseed
54+
---------
55+
56+
(1 row)
57+
58+
WITH random_string AS
59+
(
60+
-- This generates a random string of 16366 bytes. This is chosen
61+
-- as random so that it does not get compressed, and the decompression
62+
-- would work on a string with the same length as the origin, making the
63+
-- test behavior more predictible. lpad() ensures that the generated
64+
-- hexadecimal value is completed by extra zero characters if random()
65+
-- has generated a value strictly lower than 16.
66+
SELECT string_agg(decode(lpad(to_hex((random()*256)::int), 2, '0'), 'hex'), '') as bytes
67+
FROM generate_series(0, 16365)
68+
)
69+
SELECT bytes =
70+
pgp_sym_decrypt_bytea(
71+
pgp_sym_encrypt_bytea(bytes, 'key',
72+
'compress-algo=1,compress-level=1'),
73+
'key', 'expect-compress-algo=1')
74+
AS is_same
75+
FROM random_string;
76+
is_same
77+
---------
78+
t
79+
(1 row)
80+

contrib/pgcrypto/pgp-compress.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,17 @@ decompress_read(void *priv, PullFilter *src, int len,
243243
struct DecomprData *dec = priv;
244244

245245
restart:
246+
if (dec->stream.avail_in == 0)
247+
{
248+
uint8 *tmp;
249+
250+
res = pullf_read(src, 8192, &tmp);
251+
if (res < 0)
252+
return res;
253+
dec->stream.next_in = tmp;
254+
dec->stream.avail_in = res;
255+
}
256+
246257
if (dec->buf_data > 0)
247258
{
248259
if (len > dec->buf_data)
@@ -256,17 +267,6 @@ decompress_read(void *priv, PullFilter *src, int len,
256267
if (dec->eof)
257268
return 0;
258269

259-
if (dec->stream.avail_in == 0)
260-
{
261-
uint8 *tmp;
262-
263-
res = pullf_read(src, 8192, &tmp);
264-
if (res < 0)
265-
return res;
266-
dec->stream.next_in = tmp;
267-
dec->stream.avail_in = res;
268-
}
269-
270270
dec->stream.next_out = dec->buf;
271271
dec->stream.avail_out = dec->buf_len;
272272
dec->pos = dec->buf;

contrib/pgcrypto/sql/pgp-compression.sql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,24 @@ select pgp_sym_decrypt(
2828
pgp_sym_encrypt('Secret message', 'key',
2929
'compress-algo=2, compress-level=0'),
3030
'key', 'expect-compress-algo=0');
31+
32+
-- check corner case involving an input string of 16kB, as per bug #16476.
33+
SELECT setseed(0);
34+
WITH random_string AS
35+
(
36+
-- This generates a random string of 16366 bytes. This is chosen
37+
-- as random so that it does not get compressed, and the decompression
38+
-- would work on a string with the same length as the origin, making the
39+
-- test behavior more predictible. lpad() ensures that the generated
40+
-- hexadecimal value is completed by extra zero characters if random()
41+
-- has generated a value strictly lower than 16.
42+
SELECT string_agg(decode(lpad(to_hex((random()*256)::int), 2, '0'), 'hex'), '') as bytes
43+
FROM generate_series(0, 16365)
44+
)
45+
SELECT bytes =
46+
pgp_sym_decrypt_bytea(
47+
pgp_sym_encrypt_bytea(bytes, 'key',
48+
'compress-algo=1,compress-level=1'),
49+
'key', 'expect-compress-algo=1')
50+
AS is_same
51+
FROM random_string;

doc/src/sgml/bki.sgml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,11 @@
119119
require all columns that should be non-nullable to be marked so
120120
in <structname>pg_attribute</structname>. The bootstrap code will
121121
automatically mark catalog columns as <literal>NOT NULL</literal>
122-
if they are fixed-width and are not preceded by any nullable column.
122+
if they are fixed-width and are not preceded by any nullable or
123+
variable-width column.
123124
Where this rule is inadequate, you can force correct marking by using
124125
<literal>BKI_FORCE_NOT_NULL</literal>
125-
and <literal>BKI_FORCE_NULL</literal> annotations as needed. But note
126-
that <literal>NOT NULL</literal> constraints are only enforced in the
127-
executor, not against tuples that are generated by random C code,
128-
so care is still needed when manually creating or updating catalog rows.
126+
and <literal>BKI_FORCE_NULL</literal> annotations as needed.
129127
</para>
130128

131129
<para>

0 commit comments

Comments
 (0)