Thread: Why can NUMERIC columns not use deduplication?
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.
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