• Tom Lane's avatar
    Adjust bytea get_bit/set_bit to use int8 not int4 for bit numbering. · 26a944cf
    Tom Lane authored
    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
    26a944cf
varlena.c 154 KB