Partial indexes on VARCHAR get double converted from text

Started by Josh Berkusover 11 years ago3 messagesbugs
Jump to latest
#1Josh Berkus
josh@agliodbs.com

create table stately ( id int, filename varchar(255), state varchar(255) );

create index on stately(state) where state in ( 'pending', 'waiting',
'done' );

\d stately
Table "public.stately"
Column | Type | Modifiers
----------+------------------------+-----------
id | integer |
filename | character varying(255) |
state | character varying(255) |
Indexes:
"stately_state_idx" btree (state) WHERE state::text = ANY
(ARRAY['pending'::character varying, 'waiting'::character varying,
'done'::character varying]::text[])

There is no combination of typecasting which will prevent this outcome.
I've tried.

Further, it seems to me from testing that this double type conversion
affects the planner's costing of the index, causing it to not want to
use the index.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#1)
Re: Partial indexes on VARCHAR get double converted from text

Josh Berkus <josh@agliodbs.com> writes:

create table stately ( id int, filename varchar(255), state varchar(255) );
create index on stately(state) where state in ( 'pending', 'waiting',
'done' );

\d stately
Table "public.stately"
Column | Type | Modifiers
----------+------------------------+-----------
id | integer |
filename | character varying(255) |
state | character varying(255) |
Indexes:
"stately_state_idx" btree (state) WHERE state::text = ANY
(ARRAY['pending'::character varying, 'waiting'::character varying,
'done'::character varying]::text[])

I see no bug here. It's doing what's expected.

Further, it seems to me from testing that this double type conversion
affects the planner's costing of the index, causing it to not want to
use the index.

That's not a bug report, that's just unsupported speculation. Moreover,
if there were any such effect, it would cause the planner to reject the
index entirely, not just penalize it cost-wise.

regards, tom lane

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#3Josh Berkus
josh@agliodbs.com
In reply to: Josh Berkus (#1)
Re: Partial indexes on VARCHAR get double converted from text

On 01/16/2015 02:52 PM, Tom Lane wrote:

Josh Berkus <josh@agliodbs.com> writes:

create table stately ( id int, filename varchar(255), state varchar(255) );
create index on stately(state) where state in ( 'pending', 'waiting',
'done' );

\d stately
Table "public.stately"
Column | Type | Modifiers
----------+------------------------+-----------
id | integer |
filename | character varying(255) |
state | character varying(255) |
Indexes:
"stately_state_idx" btree (state) WHERE state::text = ANY
(ARRAY['pending'::character varying, 'waiting'::character varying,
'done'::character varying]::text[])

I see no bug here. It's doing what's expected.

Why have the multiple conversions to and from TEXT? It's certainly
visually confusing to users.

Further, it seems to me from testing that this double type conversion
affects the planner's costing of the index, causing it to not want to
use the index.

That's not a bug report, that's just unsupported speculation. Moreover,
if there were any such effect, it would cause the planner to reject the
index entirely, not just penalize it cost-wise.

I thought I had a test case which showed different costing for varchar
vs. text, but the results are more confusing than that. Will delve further.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs