Обсуждение: Expression indexes ignore typmod of expression
A Salesforce colleague asked me why, for something like regression=# create table foo1 (f1 char(15), f2 char(15)); CREATE TABLE regression=# create index on foo1((case when f1>'z' then f1 else f2 end)); CREATE INDEX regression=# \d foo1_f2_idx Index "public.foo1_f2_idx" Column | Type | Definition --------+--------+----------------------------------- f2 | bpchar | ( + | | CASE + | | WHEN f1 > 'z'::bpchar THEN f1+ | | ELSE f2 + | | END) btree, for table "public.foo1" the index column ends up as "bpchar" and not "char(15)". The CASE expression does get resolved as char(15), but it turns out that index.c just ignores that. I think this is just a hangover from before we paid much attention to expression typmods at all, and propose the attached patch. Comments? regards, tom lane diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 47f0647..c932c83 100644 *** a/src/backend/catalog/index.c --- b/src/backend/catalog/index.c *************** ConstructTupleDescriptor(Relation heapRe *** 389,395 **** to->attalign = typeTup->typalign; to->attstattarget = -1; to->attcacheoff = -1; ! to->atttypmod = -1; to->attislocal = true; to->attcollation = collationObjectId[i]; --- 389,395 ---- to->attalign = typeTup->typalign; to->attstattarget = -1; to->attcacheoff = -1; ! to->atttypmod = exprTypmod(indexkey); to->attislocal = true; to->attcollation = collationObjectId[i];
Hi, On 2014-04-25 17:05:26 -0400, Tom Lane wrote: > A Salesforce colleague asked me why, for something like > .... > the index column ends up as "bpchar" and not "char(15)". The CASE > expression does get resolved as char(15), but it turns out that > index.c just ignores that. I've seen that before but never looked what's the origin. +1 for fixing it. > I think this is just a hangover from > before we paid much attention to expression typmods at all, and > propose the attached patch. > > Comments? Any chance it could cause problems with stored trees being different from newly generated ones due to it? I.e. is it something that can be done without a catversion bump? Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training & Services
Andres Freund <andres@2ndquadrant.com> writes: > On 2014-04-25 17:05:26 -0400, Tom Lane wrote: >> I think this is just a hangover from >> before we paid much attention to expression typmods at all, and >> propose the attached patch. > Any chance it could cause problems with stored trees being different > from newly generated ones due to it? I.e. is it something that can be > done without a catversion bump? Not sure. I wasn't proposing this as a back-patch, just 9.4 only. regards, tom lane
On 2014-04-25 17:19:00 -0400, Tom Lane wrote: > Andres Freund <andres@2ndquadrant.com> writes: > > On 2014-04-25 17:05:26 -0400, Tom Lane wrote: > >> I think this is just a hangover from > >> before we paid much attention to expression typmods at all, and > >> propose the attached patch. > > > Any chance it could cause problems with stored trees being different > > from newly generated ones due to it? I.e. is it something that can be > > done without a catversion bump? > > Not sure. I wasn't proposing this as a back-patch, just 9.4 only. Then a clear +1 for me. It's rather confusing to see bpchar, a type very rarely used explicitly in explain output. Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training & Services