mirror of
https://github.com/postgres/postgres.git
synced 2025-09-09 13:09:39 +03:00
Allow examine_simple_variable() to work on INSERT RETURNING Vars.
Since commit599b33b94
, this function assumed that every RTE_RELATION RangeTblEntry would have an associated RelOptInfo. But that's not so: we only build RelOptInfos for relations that are scanned by the query. In particular the target of an INSERT won't have one, so that Vars appearing in an INSERT ... RETURNING list will not have an associated RelOptInfo. This apparently wasn't a problem before commitf7816aec2
taught examine_simple_variable() to drill down into CTEs containing INSERT RETURNING, but it is now. To fix, add a fallback code path that gets the userid to use directly from the RTEPermissionInfo associated with the RTE. (Sadly, we must have two code paths, because not every RTE has a RTEPermissionInfo either.) Per report from Alexander Lakhin. No back-patch, since the case is apparently unreachable beforef7816aec2
. Discussion: https://postgr.es/m/608a4886-6c60-0f9e-97d5-591256bd4150@gmail.com
This commit is contained in:
@@ -420,6 +420,19 @@ find_base_rel(PlannerInfo *root, int relid)
|
||||
return NULL; /* keep compiler quiet */
|
||||
}
|
||||
|
||||
/*
|
||||
* find_base_rel_noerr
|
||||
* Find a base or otherrel relation entry, returning NULL if there's none
|
||||
*/
|
||||
RelOptInfo *
|
||||
find_base_rel_noerr(PlannerInfo *root, int relid)
|
||||
{
|
||||
/* use an unsigned comparison to prevent negative array element access */
|
||||
if ((uint32) relid < (uint32) root->simple_rel_array_size)
|
||||
return root->simple_rel_array[relid];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* find_base_rel_ignore_join
|
||||
* Find a base or otherrel relation entry, which must already exist.
|
||||
|
Reference in New Issue
Block a user