Обсуждение: 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 | 02 | 10 | 0 | 13 | 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