BUG #17951: hashtext('input') returning non-integer value for certain inputs

Started by PG Bug reporting formalmost 3 years ago2 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 17951
Logged by: Ilkka Kaakkola
Email address: ilkka.kaakkola+github@gmail.com
PostgreSQL version: 15.3
Operating system: Linux (Docker)
Description:

Startup command:

user@host % docker run --rm -d --name psql -e POSTGRES_PASSWORD=password -e
POSTGRES_DB=app postgres:15.3 postgres
028d012d418351520815376f2111d47c105bfa0a0dfcc95125dbcacc3318c7d6

user@host % docker exec -it psql bash

(inside container)
root@028d012d4183:/# uname -a
Linux 028d012d4183 5.15.96-0-virt #1-Alpine SMP Sun, 26 Feb 2023 15:14:12
+0000 x86_64 GNU/Linux

root@028d012d4183:/# psql -U postgres app
psql (15.3 (Debian 15.3-1.pgdg110+1))
Type "help" for help.

app=#

PostgreSQL version:

app=# select VERSION();
version
-----------------------------------------------------------------------------------------------------------------------------
PostgreSQL 15.3 (Debian 15.3-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled
by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
(1 row)

----

Steps to reproduce:

app=# CREATE TABLE bug ( id varchar(128) );
CREATE TABLE

app=# \d bug
Table "public.bug"
Column | Type | Collation | Nullable | Default
--------+------------------------+-----------+----------+---------
id | character varying(128) | | |

app=# insert into bug (id) values ('18122447326473c034-214042692253025');
INSERT 0 1

app=# select ABS(HASHTEXT(id)) FROM bug;
ERROR: 22003: integer out of range
LOCATION: int4abs, int.c:1196

The resulting value of hashtext() for the given input overflows an integer
by 1 as can be seen by casting it manually

app=# select ABS(CAST(HASHTEXT(ID) as BIGINT)) FROM bug;
abs
------------
2147483648
(1 row)

This can also be directly observed by selecting
HASHTEXT('18122447326473c034-214042692253025'):

app=# SELECT HASHTEXT('18122447326473c034-214042692253025');
hashtext
-------------
-2147483648
(1 row)

Expected the output from hashtext('input') to always be a valid integer.

#2Ilkka Kaakkola
ilkka.kaakkola@gmail.com
In reply to: PG Bug reporting form (#1)
Re: BUG #17951: hashtext('input') returning non-integer value for certain inputs

Hi,

This is an invalid bug report and can be ignored.

The return value is a signed integer, happening to have the minimum value (-2147483648) which is too large to be represented as a positive integer (with a max value of 2147483647), hence abs() is correctly throwing an error.

Cheers,

Ilkka

Show quoted text

On 30. May 2023, at 10.07, PG Bug reporting form <noreply@postgresql.org> wrote:

The following bug has been logged on the website:

Bug reference: 17951
Logged by: Ilkka Kaakkola
Email address: ilkka.kaakkola+github@gmail.com
PostgreSQL version: 15.3
Operating system: Linux (Docker)
Description:

Startup command:

user@host % docker run --rm -d --name psql -e POSTGRES_PASSWORD=password -e
POSTGRES_DB=app postgres:15.3 postgres
028d012d418351520815376f2111d47c105bfa0a0dfcc95125dbcacc3318c7d6

user@host % docker exec -it psql bash

(inside container)
root@028d012d4183:/# uname -a
Linux 028d012d4183 5.15.96-0-virt #1-Alpine SMP Sun, 26 Feb 2023 15:14:12
+0000 x86_64 GNU/Linux

root@028d012d4183:/# psql -U postgres app
psql (15.3 (Debian 15.3-1.pgdg110+1))
Type "help" for help.

app=#

PostgreSQL version:

app=# select VERSION();
version
-----------------------------------------------------------------------------------------------------------------------------
PostgreSQL 15.3 (Debian 15.3-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled
by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
(1 row)

----

Steps to reproduce:

app=# CREATE TABLE bug ( id varchar(128) );
CREATE TABLE

app=# \d bug
Table "public.bug"
Column | Type | Collation | Nullable | Default
--------+------------------------+-----------+----------+---------
id | character varying(128) | | |

app=# insert into bug (id) values ('18122447326473c034-214042692253025');
INSERT 0 1

app=# select ABS(HASHTEXT(id)) FROM bug;
ERROR: 22003: integer out of range
LOCATION: int4abs, int.c:1196

The resulting value of hashtext() for the given input overflows an integer
by 1 as can be seen by casting it manually

app=# select ABS(CAST(HASHTEXT(ID) as BIGINT)) FROM bug;
abs
------------
2147483648
(1 row)

This can also be directly observed by selecting
HASHTEXT('18122447326473c034-214042692253025'):

app=# SELECT HASHTEXT('18122447326473c034-214042692253025');
hashtext
-------------
-2147483648
(1 row)

Expected the output from hashtext('input') to always be a valid integer.