Обсуждение: Why can NUMERIC columns not use deduplication?

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

Why can NUMERIC columns not use deduplication?

От
PG Doc comments form
Дата:
The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/14/btree-implementation.html
Description:

"64.4.3. Deduplication" says:

"numeric cannot use deduplication. Numeric display scale must be preserved
among equal datums."

However I don't understand this. An equal datum is an equal datum regardless
of display scale, isn't it?

Even in the special case of a NUMERIC column with no precision or scale
(8.1.2), for example if a table has an index on a NUMERIC column, and some
rows have the value 8 in that column, and some have the value 8.0 (I think
these are different values/datums in this special case), I would not expect
all those index entries to be deduplicated into a single list, but I would
expect them to be deduplicated into two lists (one for the value 8, and one
for the value 8.0). Then again I am not familiar with the actual
implementation.

Re: Why can NUMERIC columns not use deduplication?

От
Tom Lane
Дата:
PG Doc comments form <noreply@postgresql.org> writes:
> "64.4.3. Deduplication" says:
> "numeric cannot use deduplication. Numeric display scale must be preserved
> among equal datums."

> However I don't understand this. An equal datum is an equal datum regardless
> of display scale, isn't it?

No.  For example:

regression=# select 1.0, 1.00;
 ?column? | ?column? 
----------+----------
      1.0 |     1.00
(1 row)

regression=# select 1.0 = 1.00;
 ?column? 
----------
 t
(1 row)

These values are "equal" per the datatype's equality operator,
but there are some operations (not only output) that can distinguish
them, so the index can't lump them together.

There are similar issues in some other datatypes, for example
zero and minus zero in the float types.

            regards, tom lane