mirror of
https://github.com/postgres/postgres.git
synced 2025-08-28 18:48:04 +03:00
Change post-rewriter representation of dropped columns in joinaliasvars.
It's possible to drop a column from an input table of a JOIN clause in a view, if that column is nowhere actually referenced in the view. But it will still be there in the JOIN clause's joinaliasvars list. We used to replace such entries with NULL Const nodes, which is handy for generation of RowExpr expansion of a whole-row reference to the view. The trouble with that is that it can't be distinguished from the situation after subquery pull-up of a constant subquery output expression below the JOIN. Instead, replace such joinaliasvars with null pointers (empty expression trees), which can't be confused with pulled-up expressions. expandRTE() still emits the old convention, though, for convenience of RowExpr generation and to reduce the risk of breaking extension code. In HEAD and 9.3, this patch also fixes a problem with some new code in ruleutils.c that was failing to cope with implicitly-casted joinaliasvars entries, as per recent report from Feike Steenbergen. That oversight was because of an inadequate description of the data structure in parsenodes.h, which I've now corrected. There were some pre-existing oversights of the same ilk elsewhere, which I believe are now all fixed.
This commit is contained in:
@@ -639,7 +639,7 @@ typedef struct XmlSerialize
|
||||
* a stored rule might contain entries for columns dropped since the rule
|
||||
* was created. (This is only possible for columns not actually referenced
|
||||
* in the rule.) When loading a stored rule, we replace the joinaliasvars
|
||||
* items for any such columns with NULL Consts. (We can't simply delete
|
||||
* items for any such columns with null pointers. (We can't simply delete
|
||||
* them from the joinaliasvars list, because that would affect the attnums
|
||||
* of Vars referencing the rest of the list.)
|
||||
*
|
||||
@@ -709,13 +709,19 @@ typedef struct RangeTblEntry
|
||||
/*
|
||||
* Fields valid for a join RTE (else NULL/zero):
|
||||
*
|
||||
* joinaliasvars is a list of Vars or COALESCE expressions corresponding
|
||||
* to the columns of the join result. An alias Var referencing column K
|
||||
* of the join result can be replaced by the K'th element of joinaliasvars
|
||||
* --- but to simplify the task of reverse-listing aliases correctly, we
|
||||
* do not do that until planning time. In a Query loaded from a stored
|
||||
* rule, it is also possible for joinaliasvars items to be NULL Consts,
|
||||
* denoting columns dropped since the rule was made.
|
||||
* joinaliasvars is a list of (usually) Vars corresponding to the columns
|
||||
* of the join result. An alias Var referencing column K of the join
|
||||
* result can be replaced by the K'th element of joinaliasvars --- but to
|
||||
* simplify the task of reverse-listing aliases correctly, we do not do
|
||||
* that until planning time. In detail: an element of joinaliasvars can
|
||||
* be a Var of one of the join's input relations, or such a Var with an
|
||||
* implicit coercion to the join's output column type, or a COALESCE
|
||||
* expression containing the two input column Vars (possibly coerced).
|
||||
* Within a Query loaded from a stored rule, it is also possible for
|
||||
* joinaliasvars items to be null pointers, which are placeholders for
|
||||
* (necessarily unreferenced) columns dropped since the rule was made.
|
||||
* Also, once planning begins, joinaliasvars items can be almost anything,
|
||||
* as a result of subquery-flattening substitutions.
|
||||
*/
|
||||
JoinType jointype; /* type of join */
|
||||
List *joinaliasvars; /* list of alias-var expansions */
|
||||
|
Reference in New Issue
Block a user