On 2018/04/10 16:07, Jaime Casanova wrote:
> Hi,
> 
> Trying covering indexes on partitioned tables i get this error
> """
> postgres=# create index on t1_part (i) include (t);
> ERROR:  cache lookup failed for opclass 0
> """
> 
> To reproduce:
> 
> create table t1_part (i int, t text) partition by hash (i);
> create table t1_part_0 partition of t1_part for values with (modulus
> 2, remainder 0);
> create table t1_part_1 partition of t1_part for values with (modulus
> 2, remainder 1);
> insert into t1_part values (1, repeat('abcdefquerty', 20));
> 
> create index on t1_part (i) include (t);

It seems that the bug is caused due to the original IndexStmt that
DefineIndex receives being overwritten when processing the INCLUDE
columns.  Also, the original copy of it should be used when recursing for
defining the index in partitions.

Does the attached fix look correct?  Haven't checked the fix with ATTACH
PARTITION though.

Maybe add this to open items list?

Thanks,
Amit
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 860a60d109..109d48bb2f 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -366,6 +366,7 @@ DefineIndex(Oid relationId,
        LOCKMODE        lockmode;
        Snapshot        snapshot;
        int                     i;
+       IndexStmt  *orig_stmt = copyObject(stmt);
 
        if (list_intersection(stmt->indexParams, stmt->indexIncludingParams) != 
NIL)
                ereport(ERROR,
@@ -886,8 +887,8 @@ DefineIndex(Oid relationId,
                        memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts);
 
                        parentDesc = CreateTupleDescCopy(RelationGetDescr(rel));
-                       opfamOids = palloc(sizeof(Oid) * numberOfAttributes);
-                       for (i = 0; i < numberOfAttributes; i++)
+                       opfamOids = palloc(sizeof(Oid) * numberOfKeyAttributes);
+                       for (i = 0; i < numberOfKeyAttributes; i++)
                                opfamOids[i] = 
get_opclass_family(classObjectId[i]);
 
                        heap_close(rel, NoLock);
@@ -987,11 +988,11 @@ DefineIndex(Oid relationId,
                                 */
                                if (!found)
                                {
-                                       IndexStmt  *childStmt = 
copyObject(stmt);
+                                       IndexStmt  *childStmt = 
copyObject(orig_stmt);
                                        bool            found_whole_row;
 
                                        childStmt->whereClause =
-                                               
map_variable_attnos(stmt->whereClause, 1, 0,
+                                               
map_variable_attnos(orig_stmt->whereClause, 1, 0,
                                                                                
        attmap, maplen,
                                                                                
        InvalidOid, &found_whole_row);
                                        if (found_whole_row)

Reply via email to