Re: Index not used without explicit typecast

From: Jan Kort <jan(dot)kort(at)genetics(dot)nl>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: "pgsql-bugs(at)lists(dot)postgresql(dot)org" <pgsql-bugs(at)lists(dot)postgresql(dot)org>
Subject: Re: Index not used without explicit typecast
Date: 2020-08-05 16:39:20
Message-ID: AM0PR0502MB3620493A08CC75ED6EC852589B4B0@AM0PR0502MB3620.eurprd05.prod.outlook.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Thanks for the quick reply and suggestions. I will change all references to integer type then.

Adding more indexes could be a good fallback if the other solution has unforeseen problems at the application side.

Regards,
Jan

Get Outlook for Android<https://aka.ms/ghei36>

________________________________
From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Sent: Wednesday, August 5, 2020 4:32:22 PM
To: Jan Kort <jan(dot)kort(at)genetics(dot)nl>
Cc: pgsql-bugs(at)lists(dot)postgresql(dot)org <pgsql-bugs(at)lists(dot)postgresql(dot)org>
Subject: Re: Index not used without explicit typecast

Jan Kort <jan(dot)kort(at)genetics(dot)nl> writes:
> UPDATE TABLE1 SET date1 = current_timestamp WHERE ID = 1000000;
> [ uses index on integer column ID ]
> UPDATE TABLE1 SET date1 = current_timestamp WHERE ID = 1000000::numeric;
> [ doesn't use index ]

Yeah. This is the price we pay for extensibility. The only available
"=" operator that can match the second query is "numeric = numeric",
so the parser effectively converts it to "ID::numeric = 1000000::numeric",
and then "ID::numeric" does not match the index, any more than say
"abs(ID)" would.

In principle one could invent an "integer = numeric" operator and then
make it a member of the appropriate btree operator class, but there are
assorted pitfalls and gotchas in that. The biggest risk is that the
extra operator would result in "ambiguous operator" failures for queries
that work fine today.

If you're desperate for a workaround that doesn't involve fixing the
query, you could build an additional index on "ID::numeric". This'd
be kind of expensive from an index-maintenance standpoint, of course.

regards, tom lane

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Jehan-Guillaume de Rorthais 2020-08-05 20:31:42 Re: BUG #16570: Collation not working
Previous Message Daniel Verite 2020-08-05 14:49:49 Re: BUG #16570: Collation not working