Is the following behavior intentional? If so, what's the reasoning
behind it?

nconway=# select 1::bit;
 bit 
-----
 0
(1 row)
nconway=# select '1'::bit;
 bit 
-----
 1
(1 row)
nconway=# select X'1'::bit;
 bit 
-----
 0
(1 row)
nconway=# select 1::bit varying;
ERROR:  cannot cast type integer to bit varying
nconway=# select 4::int2::bit;
ERROR:  cannot cast type smallint to bit

nconway=# select 4::bit;
 bit 
-----
 0
(1 row)
nconway=# select '4'::bit;
ERROR:  "4" is not a valid binary digit
nconway=# select X'4'::bit varying;
 varbit 
--------
 0100
(1 row)
-- why is that 4 bits, not 3?

nconway=# select '14'::int::bit;
 bit 
-----
 0
(1 row)
nconway=# select bit('14'::int);
ERROR:  syntax error at or near "'14'" at character 12
nconway=# select "bit"('14'::int);
               bit                
----------------------------------
 00000000000000000000000000001110
(1 row)
-- shouldn't bit be equivalent to bit(1), which should be
right-truncated?

Cheers,

Neil


Wed, 08 Oct 2003 13:38:53 -0400
Neil Conway <neilc@samurai.com>
confused about bit strings
Neil Conway writes:

> nconway=# select 1::bit;
>  bit
> -----
>  0
> (1 row)

Oops.  I've always thought that casting between int and bit should be
disallowed, but apparently it keeps sneaking back in.

> nconway=# select X'4'::bit varying;
>  varbit
> --------
>  0100
> (1 row)
> -- why is that 4 bits, not 3?

SQL says so:

        12) The declared type of a <hex string literal> is fixed-length
            bit string. Each <hexit> appearing in the literal is equivalent
            to a quartet of bits: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,
            D, E, and F are interpreted as 0000, 0001, 0010, 0011, 0100,
            0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110,
            and 1111, respectively. The <hexit>s a, b, c, d, e, and f have
            respectively the same values as the <hexit>s A, B, C, D, E, and
            F.

> nconway=# select "bit"('14'::int);
>                bit
> ----------------------------------
>  00000000000000000000000000001110
> (1 row)
> -- shouldn't bit be equivalent to bit(1), which should be
> right-truncated?

It is, but here you're calling a function, not referring to the type.

-- 
Peter Eisentraut   peter_e@gmx.net


Wed, 8 Oct 2003 22:30:35 +0200 (CEST)
Peter Eisentraut <peter_e@gmx.net>
Re: confused about bit strings