Thread: BUG #1326: Unique and Primary Key index over bigint type doesn't work

BUG #1326: Unique and Primary Key index over bigint type doesn't work

From
"PostgreSQL Bugs List"
Date:
The following bug has been logged online:

Bug reference:      1326
Logged by:          Fernando Kasten Peinado

Email address:      fernandopeinado@uol.com.br

PostgreSQL version: 7.4.5

Operating system:   Linux RedHat 7.3

Description:        Unique and Primary Key index over bigint type doesn't
work

Details:

index is not used when Type is bigint.


sislu=> \d x
              Table "public.x"
 Column |          Type          | Modifiers
--------+------------------------+-----------
 id     | bigint                 | not null
 name   | character varying(100) |
 age    | integer                |
 bigid  | bigint                 |
Indexes:
    "x_pkey" primary key, btree (id)
    "un_x_age" unique, btree (age)
    "un_x_bigid" unique, btree (bigid)
    "un_x_name" unique, btree (name)

sislu=> explain select * from x where x.id = 12345;
                    QUERY PLAN
---------------------------------------------------
 Seq Scan on x  (cost=0.00..22.50 rows=2 width=88)
   Filter: (id = 12345)
(2 rows)

sislu=> explain select * from x where x.bigid = 12345;
                    QUERY PLAN
---------------------------------------------------
 Seq Scan on x  (cost=0.00..22.50 rows=2 width=88)
   Filter: (bigid = 12345)
(2 rows)

sislu=> explain select * from x where x.name = 'asdf';
                             QUERY PLAN
--------------------------------------------------------------------
 Index Scan using un_x_name on x  (cost=0.00..4.82 rows=2 width=88)
   Index Cond: ((name)::text = 'asdf'::text)
(2 rows)

sislu=> explain select * from x where x.age = 1;
                            QUERY PLAN
-------------------------------------------------------------------
 Index Scan using un_x_age on x  (cost=0.00..4.82 rows=2 width=88)
   Index Cond: (age = 1)
(2 rows)

Re: BUG #1326: Unique and Primary Key index over bigint type

From
Richard Huxton
Date:
PostgreSQL Bugs List wrote:
> The following bug has been logged online:
>
> Bug reference:      1326
> Logged by:          Fernando Kasten Peinado
>
> Email address:      fernandopeinado@uol.com.br
>
> PostgreSQL version: 7.4.5
>
> Operating system:   Linux RedHat 7.3
>
> Description:        Unique and Primary Key index over bigint type doesn't
> work
>
> Details:
>
> index is not used when Type is bigint.

This is a known issue with versions prior to 8.0. When you provide a
constant integer smaller than 2^31 it assumes you want int4. Of course,
the planner then looks for an int4 index and can't find one.

The solution/workaround is to make sure you specify the type of your
constant, or at least make sure it doesn't look like an int4.
   select * from x where x.id = 12345::int8;
   select * from x where x.id = CAST(12345 AS int8);
   select * from x where x.id = '12345';

The last works because '...' is type unknown so it looks at x.id to see
what type it wants and casts for you.

HTH

--
   Richard Huxton
   Archonet Ltd