mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
When index recurses to a partition, map columns numbers
Two out of three code paths were mapping column numbers correctly if a partition had different column numbers than parent table, but the most commonly used one (recursing in CREATE INDEX to a new index on a partition) failed to map attribute numbers in expressions. Oddly enough, attnums in WHERE clauses are already handled correctly everywhere. Reported-by: Amit Langote Author: Amit Langote Discussion: https://postgr.es/m/dce1fda4-e0f0-94c9-6abb-f5956a98c057@lab.ntt.co.jp Reviewed-by: Álvaro Herrera
This commit is contained in:
@ -993,7 +993,32 @@ DefineIndex(Oid relationId,
|
||||
{
|
||||
IndexStmt *childStmt = copyObject(stmt);
|
||||
bool found_whole_row;
|
||||
ListCell *lc;
|
||||
|
||||
/*
|
||||
* Adjust any Vars (both in expressions and in the index's
|
||||
* WHERE clause) to match the partition's column numbering
|
||||
* in case it's different from the parent's.
|
||||
*/
|
||||
foreach(lc, childStmt->indexParams)
|
||||
{
|
||||
IndexElem *ielem = lfirst(lc);
|
||||
|
||||
/*
|
||||
* If the index parameter is an expression, we must
|
||||
* translate it to contain child Vars.
|
||||
*/
|
||||
if (ielem->expr)
|
||||
{
|
||||
ielem->expr =
|
||||
map_variable_attnos((Node *) ielem->expr,
|
||||
1, 0, attmap, maplen,
|
||||
InvalidOid,
|
||||
&found_whole_row);
|
||||
if (found_whole_row)
|
||||
elog(ERROR, "cannot convert whole-row table reference");
|
||||
}
|
||||
}
|
||||
childStmt->whereClause =
|
||||
map_variable_attnos(stmt->whereClause, 1, 0,
|
||||
attmap, maplen,
|
||||
|
Reference in New Issue
Block a user