Обсуждение: BUG #3765: strange results for bit string hex notation cast to bit

Поиск
Список
Период
Сортировка

BUG #3765: strange results for bit string hex notation cast to bit

От
"Cade Cairns"
Дата:
The following bug has been logged online:

Bug reference:      3765
Logged by:          Cade Cairns
Email address:      cadec@otii.com
PostgreSQL version: 8.1.10
Operating system:   Mac OS X 10.5.1
Description:        strange results for bit string hex notation cast to bit
Details:

When casting a bit string constant using hexadecimal notation to a longer
bit string, the result is padded with 0's on the right. This will result in
inconsistent/useless results:

test=# select x'ff'::integer;
 int4
------
  255
(1 row)

test=# select x'ff'::bit(16)::integer;
 int4
-------
 65280
(1 row)

Re: BUG #3765: strange results for bit string hex notation cast to bit

От
Heikki Linnakangas
Дата:
Cade Cairns wrote:
> When casting a bit string constant using hexadecimal notation to a longer
> bit string, the result is padded with 0's on the right. This will result in
> inconsistent/useless results:
>
> test=# select x'ff'::integer;
>  int4
> ------
>   255
> (1 row)
>
> test=# select x'ff'::bit(16)::integer;
>  int4
> -------
>  65280
> (1 row)

It works like it should according to the manual:

http://www.postgresql.org/docs/8.1/interactive/datatype-bit.html

"Note:  If one explicitly casts a bit-string value to bit(n), it will be
truncated or zero-padded on the right to be exactly n bits, without
raising an error. Similarly, if one explicitly casts a bit-string value
to bit varying(n), it will be truncated on the right if it is more than
n bits."

--
   Heikki Linnakangas
   EnterpriseDB   http://www.enterprisedb.com

Re: BUG #3765: strange results for bit string hex notation cast to bit

От
Cade Cairns
Дата:
Can anyone explain why this is the case?

On 20-Nov-07, at 2:42 PM, Heikki Linnakangas wrote:

> Cade Cairns wrote:
>> When casting a bit string constant using hexadecimal notation to a
>> longer
>> bit string, the result is padded with 0's on the right. This will
>> result in
>> inconsistent/useless results:
>> test=# select x'ff'::integer;
>> int4 ------
>>  255
>> (1 row)
>> test=# select x'ff'::bit(16)::integer;
>> int4  -------
>> 65280
>> (1 row)
>
> It works like it should according to the manual:
>
> http://www.postgresql.org/docs/8.1/interactive/datatype-bit.html
>
> "Note:  If one explicitly casts a bit-string value to bit(n), it
> will be truncated or zero-padded on the right to be exactly n bits,
> without raising an error. Similarly, if one explicitly casts a bit-
> string value to bit varying(n), it will be truncated on the right if
> it is more than n bits."
>
> --
>  Heikki Linnakangas
>  EnterpriseDB   http://www.enterprisedb.com
>

Re: BUG #3765: strange results for bit string hex notation cast to bit

От
"Kevin Grittner"
Дата:
>>> On Tue, Nov 20, 2007 at  3:47 PM, in message
<24B6EF3D-B0BC-44EB-ADD1-257AE9A51FD4@otii.com>, Cade Cairns <cadec@otii.co=
m>
wrote:=20
> On 20-Nov-07, at 2:42 PM, Heikki Linnakangas wrote:
>>
>> http://www.postgresql.org/docs/8.1/interactive/datatype-bit.html
>>
>> "Note:  If one explicitly casts a bit-string value to bit(n), it=20=20
>> will be truncated or zero-padded on the right to be exactly n bits,=20=
=20
>> without raising an error. Similarly, if one explicitly casts a bit-=20
>> string value to bit varying(n), it will be truncated on the right if=20=
=20
>> it is more than n bits."
>
> Can anyone explain why this is the case?
=20
That's the correct result, as I read the CAST specification in the
ANSI standard; although I think this should generate a warning.
=20
            d) If SD is fixed-length bit string or variable-length bit
              string, then let LSV be the value of BIT_LENGTH(SV) and let
              B be the BIT_LENGTH of the character with the smallest BIT_
              LENGTH in the form-of-use of TD. Let PAD be the value of the
              remainder of the division LSV/B. Let NC be a character whose
              bits all have the value 0.

              If PAD is not 0, then append (B - PAD) 0-valued bits to
              the least significant end of SV; a completion condition is
              raised: warning-implicit zero-bit padding.

              Let SVC be the possibly padded value of SV expressed as a
              character string without regard to valid character encodings
              and let LTDS be a character string of LTD characters of value
              NC characters in the form-of-use of TD.

              TV is the result of

                 SUBSTRING (SVC | LTDS FROM 1 FOR LTD)

              Case:

              i) If the length of TV is less than the length of SVC, then a
                 completion condition is raised: warning-string data, right
                 truncation.

             ii) If the length of TV is greater than the length of SVC, then
                 a completion condition is raised: warning-implicit zero-bit
                 padding.
=20
-Kevin
=20