Обсуждение: Inconsistent ::bit(N) and get_bit()?

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

Inconsistent ::bit(N) and get_bit()?

От
Boszormenyi Zoltan
Дата:
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



Re: Inconsistent ::bit(N) and get_bit()?

От
Robert Haas
Дата:
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


Re: Inconsistent ::bit(N) and get_bit()?

От
Tom Lane
Дата:
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