> > And there seems another solution for this:
> >
> > In the patch, We only use the { ii_Expressions , ii_NumIndexAttrs ,
> > ii_IndexAttrNumbers } from the IndexInfo, which seems can get from
> "Relation-> rd_index".
> >
> > Based on above, May be we do not need to call BuildIndexInfo to build
> the IndexInfo.
> > It can avoid some unnecessary cost.
> > And in this solution we do not need to remove expression_planner.
> >
>
> Hmmm, when I debugged my simple test case, I found rel->rd_index was NULL,
> so it seems that the call to BuildIndexInfo is needed.
> (have I understood your suggestion correctly?)
>
Hi greg,
Thanks for debugging this.
May be I missed something. I am not sure about the case when rel->rd_index was NULL.
Because, In function BuildIndexInfo, it seems does not have NULL-check for index->rd_index.
Like the following:
----
BuildIndexInfo(Relation index)
{
IndexInfo *ii;
Form_pg_index indexStruct = index->rd_index;
int i;
int numAtts;
/* check the number of keys, and copy attr numbers into the IndexInfo */
numAtts = indexStruct->indnatts;
----
And the patch do not have NULL-check for index->rd_index too.
So I thought we can assume index->rd_index is not null, but it seems I may missed something ?
Can you please share the test case with me ?
I use the following code to replace the call of BuildIndexInfo.
And the installcheck passed.
Example:
+ Form_pg_index indexStruct = index_rel->rd_index;
+ List *ii_Expressions = RelationGetIndexExpressions(index_rel);
+ int ii_NumIndexAttrs = indexStruct->indnatts;
+ AttrNumber ii_IndexAttrNumbers[INDEX_MAX_KEYS];
+ for (int i = 0; i < ii_NumIndexAttrs; i++)
+ ii_IndexAttrNumbers[i] = indexStruct->indkey.values[i];
Best regards,
houzj