mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-20 21:37:11 +08:00
Adjust bytea get_bit/set_bit to use int8 not int4 for bit numbering.
Since the existing bit number argument can't exceed INT32_MAX, it's not possible for these functions to manipulate bits beyond the first 256MB of a bytea value. Lift that restriction by redeclaring the bit number arguments as int8 (which requires a catversion bump, hence is not back-patchable). The similarly-named functions for bit/varbit don't really have a problem because we restrict those types to at most VARBITMAXLEN bits; hence leave them alone. While here, extend the encode/decode functions in utils/adt/encode.c to allow dealing with values wider than 1GB. This is not a live bug or restriction in current usage, because no input could be more than 1GB, and since none of the encoders can expand a string more than 4X, the result size couldn't overflow uint32. But it might be desirable to support more in future, so make the input length values size_t and the potential-output-length values uint64. Also add some test cases to improve the miserable code coverage of these functions. Movead Li, editorialized some by me; also reviewed by Ashutosh Bapat Discussion: https://postgr.es/m/20200312115135445367128@highgo.ca
This commit is contained in:
@ -597,6 +597,29 @@ SELECT sha384('The quick brown fox jumps over the lazy dog.');
|
||||
SELECT sha512('');
|
||||
SELECT sha512('The quick brown fox jumps over the lazy dog.');
|
||||
|
||||
--
|
||||
-- encode/decode
|
||||
--
|
||||
SELECT encode('\x1234567890abcdef00', 'hex');
|
||||
SELECT decode('1234567890abcdef00', 'hex');
|
||||
SELECT encode(('\x' || repeat('1234567890abcdef0001', 7))::bytea, 'base64');
|
||||
SELECT decode(encode(('\x' || repeat('1234567890abcdef0001', 7))::bytea,
|
||||
'base64'), 'base64');
|
||||
SELECT encode('\x1234567890abcdef00', 'escape');
|
||||
SELECT decode(encode('\x1234567890abcdef00', 'escape'), 'escape');
|
||||
|
||||
--
|
||||
-- get_bit/set_bit etc
|
||||
--
|
||||
SELECT get_bit('\x1234567890abcdef00'::bytea, 43);
|
||||
SELECT get_bit('\x1234567890abcdef00'::bytea, 99); -- error
|
||||
SELECT set_bit('\x1234567890abcdef00'::bytea, 43, 0);
|
||||
SELECT set_bit('\x1234567890abcdef00'::bytea, 99, 0); -- error
|
||||
SELECT get_byte('\x1234567890abcdef00'::bytea, 3);
|
||||
SELECT get_byte('\x1234567890abcdef00'::bytea, 99); -- error
|
||||
SELECT set_byte('\x1234567890abcdef00'::bytea, 7, 11);
|
||||
SELECT set_byte('\x1234567890abcdef00'::bytea, 99, 11); -- error
|
||||
|
||||
--
|
||||
-- test behavior of escape_string_warning and standard_conforming_strings options
|
||||
--
|
||||
|
||||
Reference in New Issue
Block a user