Inconsistent ::bit(N) and get_bit()?
Hi,
I just came across the following confusing thing.
zozo=# create table bit_test(i integer);
CREATE TABLE
zozo=# insert into bit_test values (1), (2), (3);
INSERT 0 3
zozo=# select i, i::bit(2), get_bit(i::bit(2), 1) as bit1,
get_bit(i::bit(2), 0) as bit0 from bit_test;
i | i | bit1 | bit0
---+----+------+------
1 | 01 | 1 | 0
2 | 10 | 0 | 1
3 | 11 | 1 | 1
(3 rows)
So, conversion from int to bitstring creates a readable bitstring, i.e.
the least significant bit is the rightmost one. But get_bit() on the same
bit string works in the opposite order. The only description about get_bit
I found in the 9.0beta docs are in
http://www.postgresql.org/docs/9.0/static/functions-binarystring.html#FUNCTIONS-BINARYSTRING-OTHER
-------------------------------------
Function Return Type Description Example Result
||
|get_bit|(string, offset) int Extract bit from string
get_bit(E'Th\\000omas'::bytea, 45) 1
-------------------------------------
||
and in
http://www.postgresql.org/docs/9.0/static/functions-bitstring.html
-------------------------------------
||The following functions work on bit strings as well as binary strings:
|get_bit|, |set_bit|.
-------------------------------------
Shouldn't it at least be documented in more depth? Say, get_bit(, N)
provides the Nth bit (0-based) counting from the leftmost bit?
I would certainly appreciate a warning spelled out about this
so if you convert a number to bitstring of length N and you want the
Mth bit (according to any programming language) then you need to use
get_bit(..., N-1-M).
Best regards,
Zolt�n B�sz�rm�nyi
2010/8/11 Boszormenyi Zoltan <zb@cybertec.at>:
Shouldn't it at least be documented in more depth? Say, get_bit(, N)
provides the Nth bit (0-based) counting from the leftmost bit?
I would certainly appreciate a warning spelled out about this
so if you convert a number to bitstring of length N and you want the
Mth bit (according to any programming language) then you need to use
get_bit(..., N-1-M).
The fact that bit-strings subscript from the left rather than from the
right seems pretty odd to me, but it is documented. I wouldn't object
to adding a note to somewhere around here, if we can think of a
suitable way to word it:
http://www.postgresql.org/docs/9.0/static/functions-bitstring.html
--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise Postgres Company
Robert Haas <robertmhaas@gmail.com> writes:
2010/8/11 Boszormenyi Zoltan <zb@cybertec.at>:
Shouldn't it at least be documented in more depth? Say, get_bit(, N)
provides the Nth bit (0-based) counting from the leftmost bit?
I would certainly appreciate a warning spelled out about this
so if you convert a number to bitstring of length N and you want the
Mth bit (according to any programming language) then you need to use
get_bit(..., N-1-M).
The fact that bit-strings subscript from the left rather than from the
right seems pretty odd to me, but it is documented.
It's not odd if you think of them as strings, rather than some weird
representation of an integer.
I wouldn't object
to adding a note to somewhere around here, if we can think of a
suitable way to word it:
http://www.postgresql.org/docs/9.0/static/functions-bitstring.html
Yeah, it really needed something, especially since the docs presented
get_bit/set_bit as being not interestingly different from the bytea
versions. (They do act the same at the physical level, but because the
I/O representation of bit and bytea is so different, I think they have
to be described differently.) I committed some additional text for
this.
regards, tom lane