1 /*-------------------------------------------------------------------------
4 * Primary module of query rewriter.
6 * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
12 *-------------------------------------------------------------------------
16 #include "access/heapam.h"
17 #include "catalog/pg_type.h"
18 #include "nodes/makefuncs.h"
19 #include "nodes/nodeFuncs.h"
20 #include "parser/analyze.h"
21 #include "parser/parse_coerce.h"
22 #include "parser/parsetree.h"
23 #include "rewrite/rewriteDefine.h"
24 #include "rewrite/rewriteHandler.h"
25 #include "rewrite/rewriteManip.h"
26 #include "utils/builtins.h"
27 #include "utils/lsyscache.h"
28 #include "commands/trigger.h"
31 /* We use a list of these to detect recursion in RewriteQuery */
32 typedef struct rewrite_event
34 Oid relation
; /* OID of relation having rules */
35 CmdType event
; /* type of rule being fired */
38 static bool acquireLocksOnSubLinks(Node
*node
, void *context
);
39 static Query
*rewriteRuleAction(Query
*parsetree
,
44 bool *returning_flag
);
45 static List
*adjustJoinTreeList(Query
*parsetree
, bool removert
, int rt_index
);
46 static void rewriteTargetList(Query
*parsetree
, Relation target_relation
,
48 static TargetEntry
*process_matched_tle(TargetEntry
*src_tle
,
49 TargetEntry
*prior_tle
,
50 const char *attrName
);
51 static Node
*get_assignment_input(Node
*node
);
52 static void rewriteValuesRTE(RangeTblEntry
*rte
, Relation target_relation
,
54 static void markQueryForLocking(Query
*qry
, Node
*jtnode
,
55 bool forUpdate
, bool noWait
);
56 static List
*matchLocks(CmdType event
, RuleLock
*rulelocks
,
57 int varno
, Query
*parsetree
);
58 static Query
*fireRIRrules(Query
*parsetree
, List
*activeRIRs
);
62 * AcquireRewriteLocks -
63 * Acquire suitable locks on all the relations mentioned in the Query.
64 * These locks will ensure that the relation schemas don't change under us
65 * while we are rewriting and planning the query.
67 * A secondary purpose of this routine is to fix up JOIN RTE references to
68 * dropped columns (see details below). Because the RTEs are modified in
69 * place, it is generally appropriate for the caller of this routine to have
70 * first done a copyObject() to make a writable copy of the querytree in the
71 * current memory context.
73 * This processing can, and for efficiency's sake should, be skipped when the
74 * querytree has just been built by the parser: parse analysis already got
75 * all the same locks we'd get here, and the parser will have omitted dropped
76 * columns from JOINs to begin with. But we must do this whenever we are
77 * dealing with a querytree produced earlier than the current command.
79 * About JOINs and dropped columns: although the parser never includes an
80 * already-dropped column in a JOIN RTE's alias var list, it is possible for
81 * such a list in a stored rule to include references to dropped columns.
82 * (If the column is not explicitly referenced anywhere else in the query,
83 * the dependency mechanism won't consider it used by the rule and so won't
84 * prevent the column drop.) To support get_rte_attribute_is_dropped(),
85 * we replace join alias vars that reference dropped columns with NULL Const
88 * (In PostgreSQL 8.0, we did not do this processing but instead had
89 * get_rte_attribute_is_dropped() recurse to detect dropped columns in joins.
90 * That approach had horrible performance unfortunately; in particular
91 * construction of a nested join was O(N^2) in the nesting depth.)
94 AcquireRewriteLocks(Query
*parsetree
)
100 * First, process RTEs of the current query level.
103 foreach(l
, parsetree
->rtable
)
105 RangeTblEntry
*rte
= (RangeTblEntry
*) lfirst(l
);
110 RangeTblEntry
*curinputrte
;
114 switch (rte
->rtekind
)
119 * Grab the appropriate lock type for the relation, and do not
120 * release it until end of transaction. This protects the
121 * rewriter and planner against schema changes mid-query.
123 * If the relation is the query's result relation, then we
124 * need RowExclusiveLock. Otherwise, check to see if the
125 * relation is accessed FOR UPDATE/SHARE or not. We can't
126 * just grab AccessShareLock because then the executor would
127 * be trying to upgrade the lock, leading to possible
130 if (rt_index
== parsetree
->resultRelation
)
131 lockmode
= RowExclusiveLock
;
132 else if (get_rowmark(parsetree
, rt_index
))
133 lockmode
= RowShareLock
;
135 lockmode
= AccessShareLock
;
137 rel
= heap_open(rte
->relid
, lockmode
);
138 heap_close(rel
, NoLock
);
144 * Scan the join's alias var list to see if any columns have
145 * been dropped, and if so replace those Vars with NULL
148 * Since a join has only two inputs, we can expect to see
149 * multiple references to the same input RTE; optimize away
155 foreach(ll
, rte
->joinaliasvars
)
157 Var
*aliasvar
= (Var
*) lfirst(ll
);
160 * If the list item isn't a simple Var, then it must
161 * represent a merged column, ie a USING column, and so it
162 * couldn't possibly be dropped, since it's referenced in
163 * the join clause. (Conceivably it could also be a NULL
164 * constant already? But that's OK too.)
166 if (IsA(aliasvar
, Var
))
169 * The elements of an alias list have to refer to
170 * earlier RTEs of the same rtable, because that's the
171 * order the planner builds things in. So we already
172 * processed the referenced RTE, and so it's safe to
173 * use get_rte_attribute_is_dropped on it. (This might
174 * not hold after rewriting or planning, but it's OK
177 Assert(aliasvar
->varlevelsup
== 0);
178 if (aliasvar
->varno
!= curinputvarno
)
180 curinputvarno
= aliasvar
->varno
;
181 if (curinputvarno
>= rt_index
)
182 elog(ERROR
, "unexpected varno %d in JOIN RTE %d",
183 curinputvarno
, rt_index
);
184 curinputrte
= rt_fetch(curinputvarno
,
187 if (get_rte_attribute_is_dropped(curinputrte
,
191 * can't use vartype here, since that might be a
192 * now-dropped type OID, but it doesn't really
193 * matter what type the Const claims to be.
195 aliasvar
= (Var
*) makeNullConst(INT4OID
, -1);
198 newaliasvars
= lappend(newaliasvars
, aliasvar
);
200 rte
->joinaliasvars
= newaliasvars
;
206 * The subquery RTE itself is all right, but we have to
207 * recurse to process the represented subquery.
209 AcquireRewriteLocks(rte
->subquery
);
213 /* ignore other types of RTEs */
218 /* Recurse into subqueries in WITH */
219 foreach(l
, parsetree
->cteList
)
221 CommonTableExpr
*cte
= (CommonTableExpr
*) lfirst(l
);
223 AcquireRewriteLocks((Query
*) cte
->ctequery
);
227 * Recurse into sublink subqueries, too. But we already did the ones in
228 * the rtable and cteList.
230 if (parsetree
->hasSubLinks
)
231 query_tree_walker(parsetree
, acquireLocksOnSubLinks
, NULL
,
232 QTW_IGNORE_RC_SUBQUERIES
);
236 * Walker to find sublink subqueries for AcquireRewriteLocks
239 acquireLocksOnSubLinks(Node
*node
, void *context
)
243 if (IsA(node
, SubLink
))
245 SubLink
*sub
= (SubLink
*) node
;
247 /* Do what we came for */
248 AcquireRewriteLocks((Query
*) sub
->subselect
);
249 /* Fall through to process lefthand args of SubLink */
253 * Do NOT recurse into Query nodes, because AcquireRewriteLocks already
254 * processed subselects of subselects for us.
256 return expression_tree_walker(node
, acquireLocksOnSubLinks
, context
);
261 * rewriteRuleAction -
262 * Rewrite the rule action with appropriate qualifiers (taken from
263 * the triggering query).
266 * parsetree - original query
267 * rule_action - one action (query) of a rule
268 * rule_qual - WHERE condition of rule, or NULL if unconditional
269 * rt_index - RT index of result relation in original query
270 * event - type of rule event
272 * *returning_flag - set TRUE if we rewrite RETURNING clause in rule_action
273 * (must be initialized to FALSE)
275 * rewritten form of rule_action
278 rewriteRuleAction(Query
*parsetree
,
283 bool *returning_flag
)
289 Query
**sub_action_ptr
;
292 * Make modifiable copies of rule action and qual (what we're passed are
293 * the stored versions in the relcache; don't touch 'em!).
295 rule_action
= (Query
*) copyObject(rule_action
);
296 rule_qual
= (Node
*) copyObject(rule_qual
);
299 * Acquire necessary locks and fix any deleted JOIN RTE entries.
301 AcquireRewriteLocks(rule_action
);
302 (void) acquireLocksOnSubLinks(rule_qual
, NULL
);
304 current_varno
= rt_index
;
305 rt_length
= list_length(parsetree
->rtable
);
306 new_varno
= PRS2_NEW_VARNO
+ rt_length
;
309 * Adjust rule action and qual to offset its varnos, so that we can merge
310 * its rtable with the main parsetree's rtable.
312 * If the rule action is an INSERT...SELECT, the OLD/NEW rtable entries
313 * will be in the SELECT part, and we have to modify that rather than the
314 * top-level INSERT (kluge!).
316 sub_action
= getInsertSelectQuery(rule_action
, &sub_action_ptr
);
318 OffsetVarNodes((Node
*) sub_action
, rt_length
, 0);
319 OffsetVarNodes(rule_qual
, rt_length
, 0);
320 /* but references to *OLD* should point at original rt_index */
321 ChangeVarNodes((Node
*) sub_action
,
322 PRS2_OLD_VARNO
+ rt_length
, rt_index
, 0);
323 ChangeVarNodes(rule_qual
,
324 PRS2_OLD_VARNO
+ rt_length
, rt_index
, 0);
327 * Generate expanded rtable consisting of main parsetree's rtable plus
328 * rule action's rtable; this becomes the complete rtable for the rule
329 * action. Some of the entries may be unused after we finish rewriting,
330 * but we leave them all in place for two reasons:
332 * We'd have a much harder job to adjust the query's varnos if we
333 * selectively removed RT entries.
335 * If the rule is INSTEAD, then the original query won't be executed at
336 * all, and so its rtable must be preserved so that the executor will do
337 * the correct permissions checks on it.
339 * RT entries that are not referenced in the completed jointree will be
340 * ignored by the planner, so they do not affect query semantics. But any
341 * permissions checks specified in them will be applied during executor
342 * startup (see ExecCheckRTEPerms()). This allows us to check that the
343 * caller has, say, insert-permission on a view, when the view is not
344 * semantically referenced at all in the resulting query.
346 * When a rule is not INSTEAD, the permissions checks done on its copied
347 * RT entries will be redundant with those done during execution of the
348 * original query, but we don't bother to treat that case differently.
350 * NOTE: because planner will destructively alter rtable, we must ensure
351 * that rule action's rtable is separate and shares no substructure with
352 * the main rtable. Hence do a deep copy here.
354 sub_action
->rtable
= list_concat((List
*) copyObject(parsetree
->rtable
),
358 * There could have been some SubLinks in parsetree's rtable, in which
359 * case we'd better mark the sub_action correctly.
361 if (parsetree
->hasSubLinks
&& !sub_action
->hasSubLinks
)
365 foreach(lc
, parsetree
->rtable
)
367 RangeTblEntry
*rte
= (RangeTblEntry
*) lfirst(lc
);
369 switch (rte
->rtekind
)
372 sub_action
->hasSubLinks
=
373 checkExprHasSubLink(rte
->funcexpr
);
376 sub_action
->hasSubLinks
=
377 checkExprHasSubLink((Node
*) rte
->values_lists
);
380 /* other RTE types don't contain bare expressions */
383 if (sub_action
->hasSubLinks
)
384 break; /* no need to keep scanning rtable */
389 * Each rule action's jointree should be the main parsetree's jointree
390 * plus that rule's jointree, but usually *without* the original rtindex
391 * that we're replacing (if present, which it won't be for INSERT). Note
392 * that if the rule action refers to OLD, its jointree will add a
393 * reference to rt_index. If the rule action doesn't refer to OLD, but
394 * either the rule_qual or the user query quals do, then we need to keep
395 * the original rtindex in the jointree to provide data for the quals. We
396 * don't want the original rtindex to be joined twice, however, so avoid
397 * keeping it if the rule action mentions it.
399 * As above, the action's jointree must not share substructure with the
402 if (sub_action
->commandType
!= CMD_UTILITY
)
407 Assert(sub_action
->jointree
!= NULL
);
408 keeporig
= (!rangeTableEntry_used((Node
*) sub_action
->jointree
,
410 (rangeTableEntry_used(rule_qual
, rt_index
, 0) ||
411 rangeTableEntry_used(parsetree
->jointree
->quals
, rt_index
, 0));
412 newjointree
= adjustJoinTreeList(parsetree
, !keeporig
, rt_index
);
413 if (newjointree
!= NIL
)
416 * If sub_action is a setop, manipulating its jointree will do no
417 * good at all, because the jointree is dummy. (Perhaps someday
418 * we could push the joining and quals down to the member
419 * statements of the setop?)
421 if (sub_action
->setOperations
!= NULL
)
423 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
424 errmsg("conditional UNION/INTERSECT/EXCEPT statements are not implemented")));
426 sub_action
->jointree
->fromlist
=
427 list_concat(newjointree
, sub_action
->jointree
->fromlist
);
430 * There could have been some SubLinks in newjointree, in which
431 * case we'd better mark the sub_action correctly.
433 if (parsetree
->hasSubLinks
&& !sub_action
->hasSubLinks
)
434 sub_action
->hasSubLinks
=
435 checkExprHasSubLink((Node
*) newjointree
);
440 * Event Qualification forces copying of parsetree and splitting into two
441 * queries one w/rule_qual, one w/NOT rule_qual. Also add user query qual
444 AddQual(sub_action
, rule_qual
);
446 AddQual(sub_action
, parsetree
->jointree
->quals
);
449 * Rewrite new.attribute w/ right hand side of target-list entry for
450 * appropriate field name in insert/update.
452 * KLUGE ALERT: since ResolveNew returns a mutated copy, we can't just
453 * apply it to sub_action; we have to remember to update the sublink
454 * inside rule_action, too.
456 if ((event
== CMD_INSERT
|| event
== CMD_UPDATE
) &&
457 sub_action
->commandType
!= CMD_UTILITY
)
459 sub_action
= (Query
*) ResolveNew((Node
*) sub_action
,
464 parsetree
->targetList
,
468 *sub_action_ptr
= sub_action
;
470 rule_action
= sub_action
;
474 * If rule_action has a RETURNING clause, then either throw it away if the
475 * triggering query has no RETURNING clause, or rewrite it to emit what
476 * the triggering query's RETURNING clause asks for. Throw an error if
477 * more than one rule has a RETURNING clause.
479 if (!parsetree
->returningList
)
480 rule_action
->returningList
= NIL
;
481 else if (rule_action
->returningList
)
485 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
486 errmsg("cannot have RETURNING lists in multiple rules")));
487 *returning_flag
= true;
488 rule_action
->returningList
= (List
*)
489 ResolveNew((Node
*) parsetree
->returningList
,
490 parsetree
->resultRelation
,
492 rt_fetch(parsetree
->resultRelation
,
494 rule_action
->returningList
,
499 * There could have been some SubLinks in parsetree's returningList,
500 * in which case we'd better mark the rule_action correctly.
502 if (parsetree
->hasSubLinks
&& !rule_action
->hasSubLinks
)
503 rule_action
->hasSubLinks
=
504 checkExprHasSubLink((Node
*) rule_action
->returningList
);
511 * Copy the query's jointree list, and optionally attempt to remove any
512 * occurrence of the given rt_index as a top-level join item (we do not look
513 * for it within join items; this is OK because we are only expecting to find
514 * it as an UPDATE or DELETE target relation, which will be at the top level
515 * of the join). Returns modified jointree list --- this is a separate copy
516 * sharing no nodes with the original.
519 adjustJoinTreeList(Query
*parsetree
, bool removert
, int rt_index
)
521 List
*newjointree
= copyObject(parsetree
->jointree
->fromlist
);
526 foreach(l
, newjointree
)
528 RangeTblRef
*rtr
= lfirst(l
);
530 if (IsA(rtr
, RangeTblRef
) &&
531 rtr
->rtindex
== rt_index
)
533 newjointree
= list_delete_ptr(newjointree
, rtr
);
536 * foreach is safe because we exit loop after list_delete...
547 * rewriteTargetList - rewrite INSERT/UPDATE targetlist into standard form
549 * This has the following responsibilities:
551 * 1. For an INSERT, add tlist entries to compute default values for any
552 * attributes that have defaults and are not assigned to in the given tlist.
553 * (We do not insert anything for default-less attributes, however. The
554 * planner will later insert NULLs for them, but there's no reason to slow
555 * down rewriter processing with extra tlist nodes.) Also, for both INSERT
556 * and UPDATE, replace explicit DEFAULT specifications with column default
559 * 2. Merge multiple entries for the same target attribute, or declare error
560 * if we can't. Multiple entries are only allowed for INSERT/UPDATE of
561 * portions of an array or record field, for example
562 * UPDATE table SET foo[2] = 42, foo[4] = 43;
563 * We can merge such operations into a single assignment op. Essentially,
564 * the expression we want to produce in this case is like
565 * foo = array_set(array_set(foo, 2, 42), 4, 43)
567 * 3. Sort the tlist into standard order: non-junk fields in order by resno,
568 * then junk fields (these in no particular order).
570 * We must do items 1 and 2 before firing rewrite rules, else rewritten
571 * references to NEW.foo will produce wrong or incomplete results. Item 3
572 * is not needed for rewriting, but will be needed by the planner, and we
573 * can do it essentially for free while handling items 1 and 2.
575 * If attrno_list isn't NULL, we return an additional output besides the
576 * rewritten targetlist: an integer list of the assigned-to attnums, in
577 * order of the original tlist's non-junk entries. This is needed for
578 * processing VALUES RTEs.
581 rewriteTargetList(Query
*parsetree
, Relation target_relation
,
584 CmdType commandType
= parsetree
->commandType
;
585 TargetEntry
**new_tles
;
586 List
*new_tlist
= NIL
;
587 List
*junk_tlist
= NIL
;
588 Form_pg_attribute att_tup
;
594 if (attrno_list
) /* initialize optional result list */
598 * We process the normal (non-junk) attributes by scanning the input tlist
599 * once and transferring TLEs into an array, then scanning the array to
600 * build an output tlist. This avoids O(N^2) behavior for large numbers
603 * Junk attributes are tossed into a separate list during the same tlist
604 * scan, then appended to the reconstructed tlist.
606 numattrs
= RelationGetNumberOfAttributes(target_relation
);
607 new_tles
= (TargetEntry
**) palloc0(numattrs
* sizeof(TargetEntry
*));
608 next_junk_attrno
= numattrs
+ 1;
610 foreach(temp
, parsetree
->targetList
)
612 TargetEntry
*old_tle
= (TargetEntry
*) lfirst(temp
);
614 if (!old_tle
->resjunk
)
616 /* Normal attr: stash it into new_tles[] */
617 attrno
= old_tle
->resno
;
618 if (attrno
< 1 || attrno
> numattrs
)
619 elog(ERROR
, "bogus resno %d in targetlist", attrno
);
620 att_tup
= target_relation
->rd_att
->attrs
[attrno
- 1];
622 /* put attrno into attrno_list even if it's dropped */
624 *attrno_list
= lappend_int(*attrno_list
, attrno
);
626 /* We can (and must) ignore deleted attributes */
627 if (att_tup
->attisdropped
)
630 /* Merge with any prior assignment to same attribute */
631 new_tles
[attrno
- 1] =
632 process_matched_tle(old_tle
,
633 new_tles
[attrno
- 1],
634 NameStr(att_tup
->attname
));
639 * Copy all resjunk tlist entries to junk_tlist, and assign them
640 * resnos above the last real resno.
642 * Typical junk entries include ORDER BY or GROUP BY expressions
643 * (are these actually possible in an INSERT or UPDATE?), system
644 * attribute references, etc.
647 /* Get the resno right, but don't copy unnecessarily */
648 if (old_tle
->resno
!= next_junk_attrno
)
650 old_tle
= flatCopyTargetEntry(old_tle
);
651 old_tle
->resno
= next_junk_attrno
;
653 junk_tlist
= lappend(junk_tlist
, old_tle
);
658 for (attrno
= 1; attrno
<= numattrs
; attrno
++)
660 TargetEntry
*new_tle
= new_tles
[attrno
- 1];
662 att_tup
= target_relation
->rd_att
->attrs
[attrno
- 1];
664 /* We can (and must) ignore deleted attributes */
665 if (att_tup
->attisdropped
)
669 * Handle the two cases where we need to insert a default expression:
670 * it's an INSERT and there's no tlist entry for the column, or the
671 * tlist entry is a DEFAULT placeholder node.
673 if ((new_tle
== NULL
&& commandType
== CMD_INSERT
) ||
674 (new_tle
&& new_tle
->expr
&& IsA(new_tle
->expr
, SetToDefault
)))
678 new_expr
= build_column_default(target_relation
, attrno
);
681 * If there is no default (ie, default is effectively NULL), we
682 * can omit the tlist entry in the INSERT case, since the planner
683 * can insert a NULL for itself, and there's no point in spending
684 * any more rewriter cycles on the entry. But in the UPDATE case
685 * we've got to explicitly set the column to NULL.
689 if (commandType
== CMD_INSERT
)
693 new_expr
= (Node
*) makeConst(att_tup
->atttypid
,
699 /* this is to catch a NOT NULL domain constraint */
700 new_expr
= coerce_to_domain(new_expr
,
703 COERCE_IMPLICIT_CAST
,
711 new_tle
= makeTargetEntry((Expr
*) new_expr
,
713 pstrdup(NameStr(att_tup
->attname
)),
718 new_tlist
= lappend(new_tlist
, new_tle
);
723 parsetree
->targetList
= list_concat(new_tlist
, junk_tlist
);
728 * Convert a matched TLE from the original tlist into a correct new TLE.
730 * This routine detects and handles multiple assignments to the same target
731 * attribute. (The attribute name is needed only for error messages.)
734 process_matched_tle(TargetEntry
*src_tle
,
735 TargetEntry
*prior_tle
,
736 const char *attrName
)
746 if (prior_tle
== NULL
)
749 * Normal case where this is the first assignment to the attribute.
755 * Multiple assignments to same attribute. Allow only if all are
756 * FieldStore or ArrayRef assignment operations. This is a bit
757 * tricky because what we may actually be looking at is a nest of
758 * such nodes; consider
759 * UPDATE tab SET col.fld1.subfld1 = x, col.fld2.subfld2 = y
760 * The two expressions produced by the parser will look like
761 * FieldStore(col, fld1, FieldStore(placeholder, subfld1, x))
762 * FieldStore(col, fld2, FieldStore(placeholder, subfld2, x))
763 * However, we can ignore the substructure and just consider the top
764 * FieldStore or ArrayRef from each assignment, because it works to
766 * FieldStore(FieldStore(col, fld1,
767 * FieldStore(placeholder, subfld1, x)),
768 * fld2, FieldStore(placeholder, subfld2, x))
769 * Note the leftmost expression goes on the inside so that the
770 * assignments appear to occur left-to-right.
772 * For FieldStore, instead of nesting we can generate a single
773 * FieldStore with multiple target fields. We must nest when
774 * ArrayRefs are involved though.
777 src_expr
= (Node
*) src_tle
->expr
;
778 prior_expr
= (Node
*) prior_tle
->expr
;
779 src_input
= get_assignment_input(src_expr
);
780 prior_input
= get_assignment_input(prior_expr
);
781 if (src_input
== NULL
||
782 prior_input
== NULL
||
783 exprType(src_expr
) != exprType(prior_expr
))
785 (errcode(ERRCODE_SYNTAX_ERROR
),
786 errmsg("multiple assignments to same column \"%s\"",
790 * Prior TLE could be a nest of assignments if we do this more than once.
792 priorbottom
= prior_input
;
795 Node
*newbottom
= get_assignment_input(priorbottom
);
797 if (newbottom
== NULL
)
798 break; /* found the original Var reference */
799 priorbottom
= newbottom
;
801 if (!equal(priorbottom
, src_input
))
803 (errcode(ERRCODE_SYNTAX_ERROR
),
804 errmsg("multiple assignments to same column \"%s\"",
808 * Looks OK to nest 'em.
810 if (IsA(src_expr
, FieldStore
))
812 FieldStore
*fstore
= makeNode(FieldStore
);
814 if (IsA(prior_expr
, FieldStore
))
816 /* combine the two */
817 memcpy(fstore
, prior_expr
, sizeof(FieldStore
));
819 list_concat(list_copy(((FieldStore
*) prior_expr
)->newvals
),
820 list_copy(((FieldStore
*) src_expr
)->newvals
));
822 list_concat(list_copy(((FieldStore
*) prior_expr
)->fieldnums
),
823 list_copy(((FieldStore
*) src_expr
)->fieldnums
));
827 /* general case, just nest 'em */
828 memcpy(fstore
, src_expr
, sizeof(FieldStore
));
829 fstore
->arg
= (Expr
*) prior_expr
;
831 newexpr
= (Node
*) fstore
;
833 else if (IsA(src_expr
, ArrayRef
))
835 ArrayRef
*aref
= makeNode(ArrayRef
);
837 memcpy(aref
, src_expr
, sizeof(ArrayRef
));
838 aref
->refexpr
= (Expr
*) prior_expr
;
839 newexpr
= (Node
*) aref
;
843 elog(ERROR
, "cannot happen");
847 result
= flatCopyTargetEntry(src_tle
);
848 result
->expr
= (Expr
*) newexpr
;
853 * If node is an assignment node, return its input; else return NULL
856 get_assignment_input(Node
*node
)
860 if (IsA(node
, FieldStore
))
862 FieldStore
*fstore
= (FieldStore
*) node
;
864 return (Node
*) fstore
->arg
;
866 else if (IsA(node
, ArrayRef
))
868 ArrayRef
*aref
= (ArrayRef
*) node
;
870 if (aref
->refassgnexpr
== NULL
)
872 return (Node
*) aref
->refexpr
;
878 * Make an expression tree for the default value for a column.
880 * If there is no default, return a NULL instead.
883 build_column_default(Relation rel
, int attrno
)
885 TupleDesc rd_att
= rel
->rd_att
;
886 Form_pg_attribute att_tup
= rd_att
->attrs
[attrno
- 1];
887 Oid atttype
= att_tup
->atttypid
;
888 int32 atttypmod
= att_tup
->atttypmod
;
893 * Scan to see if relation has a default for this column.
895 if (rd_att
->constr
&& rd_att
->constr
->num_defval
> 0)
897 AttrDefault
*defval
= rd_att
->constr
->defval
;
898 int ndef
= rd_att
->constr
->num_defval
;
902 if (attrno
== defval
[ndef
].adnum
)
905 * Found it, convert string representation to node tree.
907 expr
= stringToNode(defval
[ndef
].adbin
);
916 * No per-column default, so look for a default for the type itself.
918 expr
= get_typdefault(atttype
);
922 return NULL
; /* No default anywhere */
925 * Make sure the value is coerced to the target column type; this will
926 * generally be true already, but there seem to be some corner cases
927 * involving domain defaults where it might not be true. This should match
928 * the parser's processing of non-defaulted expressions --- see
929 * transformAssignedExpr().
931 exprtype
= exprType(expr
);
933 expr
= coerce_to_target_type(NULL
, /* no UNKNOWN params here */
937 COERCE_IMPLICIT_CAST
,
941 (errcode(ERRCODE_DATATYPE_MISMATCH
),
942 errmsg("column \"%s\" is of type %s"
943 " but default expression is of type %s",
944 NameStr(att_tup
->attname
),
945 format_type_be(atttype
),
946 format_type_be(exprtype
)),
947 errhint("You will need to rewrite or cast the expression.")));
953 /* Does VALUES RTE contain any SetToDefault items? */
955 searchForDefault(RangeTblEntry
*rte
)
959 foreach(lc
, rte
->values_lists
)
961 List
*sublist
= (List
*) lfirst(lc
);
964 foreach(lc2
, sublist
)
966 Node
*col
= (Node
*) lfirst(lc2
);
968 if (IsA(col
, SetToDefault
))
976 * When processing INSERT ... VALUES with a VALUES RTE (ie, multiple VALUES
977 * lists), we have to replace any DEFAULT items in the VALUES lists with
978 * the appropriate default expressions. The other aspects of rewriteTargetList
979 * need be applied only to the query's targetlist proper.
981 * Note that we currently can't support subscripted or field assignment
982 * in the multi-VALUES case. The targetlist will contain simple Vars
983 * referencing the VALUES RTE, and therefore process_matched_tle() will
984 * reject any such attempt with "multiple assignments to same column".
987 rewriteValuesRTE(RangeTblEntry
*rte
, Relation target_relation
, List
*attrnos
)
993 * Rebuilding all the lists is a pretty expensive proposition in a big
994 * VALUES list, and it's a waste of time if there aren't any DEFAULT
995 * placeholders. So first scan to see if there are any.
997 if (!searchForDefault(rte
))
998 return; /* nothing to do */
1000 /* Check list lengths (we can assume all the VALUES sublists are alike) */
1001 Assert(list_length(attrnos
) == list_length(linitial(rte
->values_lists
)));
1004 foreach(lc
, rte
->values_lists
)
1006 List
*sublist
= (List
*) lfirst(lc
);
1007 List
*newList
= NIL
;
1011 forboth(lc2
, sublist
, lc3
, attrnos
)
1013 Node
*col
= (Node
*) lfirst(lc2
);
1014 int attrno
= lfirst_int(lc3
);
1016 if (IsA(col
, SetToDefault
))
1018 Form_pg_attribute att_tup
;
1021 att_tup
= target_relation
->rd_att
->attrs
[attrno
- 1];
1023 if (!att_tup
->attisdropped
)
1024 new_expr
= build_column_default(target_relation
, attrno
);
1026 new_expr
= NULL
; /* force a NULL if dropped */
1029 * If there is no default (ie, default is effectively NULL),
1030 * we've got to explicitly set the column to NULL.
1034 new_expr
= (Node
*) makeConst(att_tup
->atttypid
,
1040 /* this is to catch a NOT NULL domain constraint */
1041 new_expr
= coerce_to_domain(new_expr
,
1044 COERCE_IMPLICIT_CAST
,
1049 newList
= lappend(newList
, new_expr
);
1052 newList
= lappend(newList
, col
);
1054 newValues
= lappend(newValues
, newList
);
1056 rte
->values_lists
= newValues
;
1062 * match the list of locks and returns the matching rules
1065 matchLocks(CmdType event
,
1066 RuleLock
*rulelocks
,
1070 List
*matching_locks
= NIL
;
1074 if (rulelocks
== NULL
)
1077 if (parsetree
->commandType
!= CMD_SELECT
)
1079 if (parsetree
->resultRelation
!= varno
)
1083 nlocks
= rulelocks
->numLocks
;
1085 for (i
= 0; i
< nlocks
; i
++)
1087 RewriteRule
*oneLock
= rulelocks
->rules
[i
];
1090 * Suppress ON INSERT/UPDATE/DELETE rules that are disabled or
1091 * configured to not fire during the current sessions replication
1092 * role. ON SELECT rules will always be applied in order to keep views
1093 * working even in LOCAL or REPLICA role.
1095 if (oneLock
->event
!= CMD_SELECT
)
1097 if (SessionReplicationRole
== SESSION_REPLICATION_ROLE_REPLICA
)
1099 if (oneLock
->enabled
== RULE_FIRES_ON_ORIGIN
||
1100 oneLock
->enabled
== RULE_DISABLED
)
1103 else /* ORIGIN or LOCAL ROLE */
1105 if (oneLock
->enabled
== RULE_FIRES_ON_REPLICA
||
1106 oneLock
->enabled
== RULE_DISABLED
)
1111 if (oneLock
->event
== event
)
1113 if (parsetree
->commandType
!= CMD_SELECT
||
1114 (oneLock
->attrno
== -1 ?
1115 rangeTableEntry_used((Node
*) parsetree
, varno
, 0) :
1116 attribute_used((Node
*) parsetree
,
1117 varno
, oneLock
->attrno
, 0)))
1118 matching_locks
= lappend(matching_locks
, oneLock
);
1122 return matching_locks
;
1127 * ApplyRetrieveRule - expand an ON SELECT rule
1130 ApplyRetrieveRule(Query
*parsetree
,
1133 bool relation_level
,
1142 if (list_length(rule
->actions
) != 1)
1143 elog(ERROR
, "expected just one rule action");
1144 if (rule
->qual
!= NULL
)
1145 elog(ERROR
, "cannot handle qualified ON SELECT rule");
1146 if (!relation_level
)
1147 elog(ERROR
, "cannot handle per-attribute ON SELECT rule");
1150 * Make a modifiable copy of the view query, and acquire needed locks on
1151 * the relations it mentions.
1153 rule_action
= copyObject(linitial(rule
->actions
));
1155 AcquireRewriteLocks(rule_action
);
1158 * Recursively expand any view references inside the view.
1160 rule_action
= fireRIRrules(rule_action
, activeRIRs
);
1163 * VIEWs are really easy --- just plug the view query in as a subselect,
1164 * replacing the relation's original RTE.
1166 rte
= rt_fetch(rt_index
, parsetree
->rtable
);
1168 rte
->rtekind
= RTE_SUBQUERY
;
1169 rte
->relid
= InvalidOid
;
1170 rte
->subquery
= rule_action
;
1171 rte
->inh
= false; /* must not be set for a subquery */
1174 * We move the view's permission check data down to its rangetable. The
1175 * checks will actually be done against the *OLD* entry therein.
1177 subrte
= rt_fetch(PRS2_OLD_VARNO
, rule_action
->rtable
);
1178 Assert(subrte
->relid
== relation
->rd_id
);
1179 subrte
->requiredPerms
= rte
->requiredPerms
;
1180 subrte
->checkAsUser
= rte
->checkAsUser
;
1182 rte
->requiredPerms
= 0; /* no permission check on subquery itself */
1183 rte
->checkAsUser
= InvalidOid
;
1186 * FOR UPDATE/SHARE of view?
1188 if ((rc
= get_rowmark(parsetree
, rt_index
)) != NULL
)
1191 * Remove the view from the list of rels that will actually be marked
1192 * FOR UPDATE/SHARE by the executor. It will still be access-checked
1193 * for write access, though.
1195 parsetree
->rowMarks
= list_delete_ptr(parsetree
->rowMarks
, rc
);
1198 * Set up the view's referenced tables as if FOR UPDATE/SHARE.
1200 markQueryForLocking(rule_action
, (Node
*) rule_action
->jointree
,
1201 rc
->forUpdate
, rc
->noWait
);
1208 * Recursively mark all relations used by a view as FOR UPDATE/SHARE.
1210 * This may generate an invalid query, eg if some sub-query uses an
1211 * aggregate. We leave it to the planner to detect that.
1213 * NB: this must agree with the parser's transformLockingClause() routine.
1214 * However, unlike the parser we have to be careful not to mark a view's
1215 * OLD and NEW rels for updating. The best way to handle that seems to be
1216 * to scan the jointree to determine which rels are used.
1219 markQueryForLocking(Query
*qry
, Node
*jtnode
, bool forUpdate
, bool noWait
)
1223 if (IsA(jtnode
, RangeTblRef
))
1225 int rti
= ((RangeTblRef
*) jtnode
)->rtindex
;
1226 RangeTblEntry
*rte
= rt_fetch(rti
, qry
->rtable
);
1228 if (rte
->rtekind
== RTE_RELATION
)
1230 applyLockingClause(qry
, rti
, forUpdate
, noWait
);
1231 rte
->requiredPerms
|= ACL_SELECT_FOR_UPDATE
;
1233 else if (rte
->rtekind
== RTE_SUBQUERY
)
1235 /* FOR UPDATE/SHARE of subquery is propagated to subquery's rels */
1236 markQueryForLocking(rte
->subquery
, (Node
*) rte
->subquery
->jointree
,
1239 else if (rte
->rtekind
== RTE_CTE
)
1242 * We allow FOR UPDATE/SHARE of a WITH query to be propagated into
1243 * the WITH, but it doesn't seem very sane to allow this for a
1244 * reference to an outer-level WITH (compare
1245 * transformLockingClause). Which simplifies life here.
1247 CommonTableExpr
*cte
= NULL
;
1250 if (rte
->ctelevelsup
> 0 || rte
->self_reference
)
1252 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1253 errmsg("SELECT FOR UPDATE/SHARE cannot be applied to an outer-level WITH query")));
1254 foreach(lc
, qry
->cteList
)
1256 cte
= (CommonTableExpr
*) lfirst(lc
);
1257 if (strcmp(cte
->ctename
, rte
->ctename
) == 0)
1260 if (lc
== NULL
) /* shouldn't happen */
1261 elog(ERROR
, "could not find CTE \"%s\"", rte
->ctename
);
1262 /* should be analyzed by now */
1263 Assert(IsA(cte
->ctequery
, Query
));
1264 markQueryForLocking((Query
*) cte
->ctequery
,
1265 (Node
*) ((Query
*) cte
->ctequery
)->jointree
,
1269 else if (IsA(jtnode
, FromExpr
))
1271 FromExpr
*f
= (FromExpr
*) jtnode
;
1274 foreach(l
, f
->fromlist
)
1275 markQueryForLocking(qry
, lfirst(l
), forUpdate
, noWait
);
1277 else if (IsA(jtnode
, JoinExpr
))
1279 JoinExpr
*j
= (JoinExpr
*) jtnode
;
1281 markQueryForLocking(qry
, j
->larg
, forUpdate
, noWait
);
1282 markQueryForLocking(qry
, j
->rarg
, forUpdate
, noWait
);
1285 elog(ERROR
, "unrecognized node type: %d",
1286 (int) nodeTag(jtnode
));
1291 * fireRIRonSubLink -
1292 * Apply fireRIRrules() to each SubLink (subselect in expression) found
1293 * in the given tree.
1295 * NOTE: although this has the form of a walker, we cheat and modify the
1296 * SubLink nodes in-place. It is caller's responsibility to ensure that
1297 * no unwanted side-effects occur!
1299 * This is unlike most of the other routines that recurse into subselects,
1300 * because we must take control at the SubLink node in order to replace
1301 * the SubLink's subselect link with the possibly-rewritten subquery.
1304 fireRIRonSubLink(Node
*node
, List
*activeRIRs
)
1308 if (IsA(node
, SubLink
))
1310 SubLink
*sub
= (SubLink
*) node
;
1312 /* Do what we came for */
1313 sub
->subselect
= (Node
*) fireRIRrules((Query
*) sub
->subselect
,
1315 /* Fall through to process lefthand args of SubLink */
1319 * Do NOT recurse into Query nodes, because fireRIRrules already processed
1320 * subselects of subselects for us.
1322 return expression_tree_walker(node
, fireRIRonSubLink
,
1323 (void *) activeRIRs
);
1329 * Apply all RIR rules on each rangetable entry in a query
1332 fireRIRrules(Query
*parsetree
, List
*activeRIRs
)
1338 * don't try to convert this into a foreach loop, because rtable list can
1339 * get changed each time through...
1342 while (rt_index
< list_length(parsetree
->rtable
))
1353 rte
= rt_fetch(rt_index
, parsetree
->rtable
);
1356 * A subquery RTE can't have associated rules, so there's nothing to
1357 * do to this level of the query, but we must recurse into the
1358 * subquery to expand any rule references in it.
1360 if (rte
->rtekind
== RTE_SUBQUERY
)
1362 rte
->subquery
= fireRIRrules(rte
->subquery
, activeRIRs
);
1367 * Joins and other non-relation RTEs can be ignored completely.
1369 if (rte
->rtekind
!= RTE_RELATION
)
1373 * If the table is not referenced in the query, then we ignore it.
1374 * This prevents infinite expansion loop due to new rtable entries
1375 * inserted by expansion of a rule. A table is referenced if it is
1376 * part of the join set (a source table), or is referenced by any Var
1377 * nodes, or is the result table.
1379 if (rt_index
!= parsetree
->resultRelation
&&
1380 !rangeTableEntry_used((Node
*) parsetree
, rt_index
, 0))
1384 * We can use NoLock here since either the parser or
1385 * AcquireRewriteLocks should have locked the rel already.
1387 rel
= heap_open(rte
->relid
, NoLock
);
1390 * Collect the RIR rules that we must apply
1392 rules
= rel
->rd_rules
;
1395 heap_close(rel
, NoLock
);
1399 for (i
= 0; i
< rules
->numLocks
; i
++)
1401 rule
= rules
->rules
[i
];
1402 if (rule
->event
!= CMD_SELECT
)
1405 if (rule
->attrno
> 0)
1407 /* per-attr rule; do we need it? */
1408 if (!attribute_used((Node
*) parsetree
, rt_index
,
1413 locks
= lappend(locks
, rule
);
1417 * If we found any, apply them --- but first check for recursion!
1423 if (list_member_oid(activeRIRs
, RelationGetRelid(rel
)))
1425 (errcode(ERRCODE_INVALID_OBJECT_DEFINITION
),
1426 errmsg("infinite recursion detected in rules for relation \"%s\"",
1427 RelationGetRelationName(rel
))));
1428 activeRIRs
= lcons_oid(RelationGetRelid(rel
), activeRIRs
);
1434 parsetree
= ApplyRetrieveRule(parsetree
,
1442 activeRIRs
= list_delete_first(activeRIRs
);
1445 heap_close(rel
, NoLock
);
1448 /* Recurse into subqueries in WITH */
1449 foreach(lc
, parsetree
->cteList
)
1451 CommonTableExpr
*cte
= (CommonTableExpr
*) lfirst(lc
);
1453 cte
->ctequery
= (Node
*)
1454 fireRIRrules((Query
*) cte
->ctequery
, activeRIRs
);
1458 * Recurse into sublink subqueries, too. But we already did the ones in
1459 * the rtable and cteList.
1461 if (parsetree
->hasSubLinks
)
1462 query_tree_walker(parsetree
, fireRIRonSubLink
, (void *) activeRIRs
,
1463 QTW_IGNORE_RC_SUBQUERIES
);
1470 * Modify the given query by adding 'AND rule_qual IS NOT TRUE' to its
1471 * qualification. This is used to generate suitable "else clauses" for
1472 * conditional INSTEAD rules. (Unfortunately we must use "x IS NOT TRUE",
1473 * not just "NOT x" which the planner is much smarter about, else we will
1474 * do the wrong thing when the qual evaluates to NULL.)
1476 * The rule_qual may contain references to OLD or NEW. OLD references are
1477 * replaced by references to the specified rt_index (the relation that the
1478 * rule applies to). NEW references are only possible for INSERT and UPDATE
1479 * queries on the relation itself, and so they should be replaced by copies
1480 * of the related entries in the query's own targetlist.
1483 CopyAndAddInvertedQual(Query
*parsetree
,
1488 /* Don't scribble on the passed qual (it's in the relcache!) */
1489 Node
*new_qual
= (Node
*) copyObject(rule_qual
);
1492 * In case there are subqueries in the qual, acquire necessary locks and
1493 * fix any deleted JOIN RTE entries. (This is somewhat redundant with
1494 * rewriteRuleAction, but not entirely ... consider restructuring so that
1495 * we only need to process the qual this way once.)
1497 (void) acquireLocksOnSubLinks(new_qual
, NULL
);
1499 /* Fix references to OLD */
1500 ChangeVarNodes(new_qual
, PRS2_OLD_VARNO
, rt_index
, 0);
1501 /* Fix references to NEW */
1502 if (event
== CMD_INSERT
|| event
== CMD_UPDATE
)
1503 new_qual
= ResolveNew(new_qual
,
1506 rt_fetch(rt_index
, parsetree
->rtable
),
1507 parsetree
->targetList
,
1510 /* And attach the fixed qual */
1511 AddInvertedQual(parsetree
, new_qual
);
1519 * Iterate through rule locks applying rules.
1522 * parsetree - original query
1523 * rt_index - RT index of result relation in original query
1524 * event - type of rule event
1525 * locks - list of rules to fire
1527 * *instead_flag - set TRUE if any unqualified INSTEAD rule is found
1528 * (must be initialized to FALSE)
1529 * *returning_flag - set TRUE if we rewrite RETURNING clause in any rule
1530 * (must be initialized to FALSE)
1531 * *qual_product - filled with modified original query if any qualified
1532 * INSTEAD rule is found (must be initialized to NULL)
1534 * list of rule actions adjusted for use with this query
1536 * Qualified INSTEAD rules generate their action with the qualification
1537 * condition added. They also generate a modified version of the original
1538 * query with the negated qualification added, so that it will run only for
1539 * rows that the qualified action doesn't act on. (If there are multiple
1540 * qualified INSTEAD rules, we AND all the negated quals onto a single
1541 * modified original query.) We won't execute the original, unmodified
1542 * query if we find either qualified or unqualified INSTEAD rules. If
1543 * we find both, the modified original query is discarded too.
1546 fireRules(Query
*parsetree
,
1551 bool *returning_flag
,
1552 Query
**qual_product
)
1554 List
*results
= NIL
;
1559 RewriteRule
*rule_lock
= (RewriteRule
*) lfirst(l
);
1560 Node
*event_qual
= rule_lock
->qual
;
1561 List
*actions
= rule_lock
->actions
;
1565 /* Determine correct QuerySource value for actions */
1566 if (rule_lock
->isInstead
)
1568 if (event_qual
!= NULL
)
1569 qsrc
= QSRC_QUAL_INSTEAD_RULE
;
1572 qsrc
= QSRC_INSTEAD_RULE
;
1573 *instead_flag
= true; /* report unqualified INSTEAD */
1577 qsrc
= QSRC_NON_INSTEAD_RULE
;
1579 if (qsrc
== QSRC_QUAL_INSTEAD_RULE
)
1582 * If there are INSTEAD rules with qualifications, the original
1583 * query is still performed. But all the negated rule
1584 * qualifications of the INSTEAD rules are added so it does its
1585 * actions only in cases where the rule quals of all INSTEAD rules
1586 * are false. Think of it as the default action in a case. We save
1587 * this in *qual_product so RewriteQuery() can add it to the query
1588 * list after we mangled it up enough.
1590 * If we have already found an unqualified INSTEAD rule, then
1591 * *qual_product won't be used, so don't bother building it.
1595 if (*qual_product
== NULL
)
1596 *qual_product
= copyObject(parsetree
);
1597 *qual_product
= CopyAndAddInvertedQual(*qual_product
,
1604 /* Now process the rule's actions and add them to the result list */
1607 Query
*rule_action
= lfirst(r
);
1609 if (rule_action
->commandType
== CMD_NOTHING
)
1612 rule_action
= rewriteRuleAction(parsetree
, rule_action
,
1613 event_qual
, rt_index
, event
,
1616 rule_action
->querySource
= qsrc
;
1617 rule_action
->canSetTag
= false; /* might change later */
1619 results
= lappend(results
, rule_action
);
1629 * rewrites the query and apply the rules again on the queries rewritten
1631 * rewrite_events is a list of open query-rewrite actions, so we can detect
1632 * infinite recursion.
1635 RewriteQuery(Query
*parsetree
, List
*rewrite_events
)
1637 CmdType event
= parsetree
->commandType
;
1638 bool instead
= false;
1639 bool returning
= false;
1640 Query
*qual_product
= NULL
;
1641 List
*rewritten
= NIL
;
1644 * If the statement is an update, insert or delete - fire rules on it.
1646 * SELECT rules are handled later when we have all the queries that should
1647 * get executed. Also, utilities aren't rewritten at all (do we still
1650 if (event
!= CMD_SELECT
&& event
!= CMD_UTILITY
)
1652 int result_relation
;
1653 RangeTblEntry
*rt_entry
;
1654 Relation rt_entry_relation
;
1657 result_relation
= parsetree
->resultRelation
;
1658 Assert(result_relation
!= 0);
1659 rt_entry
= rt_fetch(result_relation
, parsetree
->rtable
);
1660 Assert(rt_entry
->rtekind
== RTE_RELATION
);
1663 * We can use NoLock here since either the parser or
1664 * AcquireRewriteLocks should have locked the rel already.
1666 rt_entry_relation
= heap_open(rt_entry
->relid
, NoLock
);
1669 * If it's an INSERT or UPDATE, rewrite the targetlist into standard
1670 * form. This will be needed by the planner anyway, and doing it now
1671 * ensures that any references to NEW.field will behave sanely.
1673 if (event
== CMD_UPDATE
)
1674 rewriteTargetList(parsetree
, rt_entry_relation
, NULL
);
1675 else if (event
== CMD_INSERT
)
1677 RangeTblEntry
*values_rte
= NULL
;
1680 * If it's an INSERT ... VALUES (...), (...), ... there will be a
1681 * single RTE for the VALUES targetlists.
1683 if (list_length(parsetree
->jointree
->fromlist
) == 1)
1685 RangeTblRef
*rtr
= (RangeTblRef
*) linitial(parsetree
->jointree
->fromlist
);
1687 if (IsA(rtr
, RangeTblRef
))
1689 RangeTblEntry
*rte
= rt_fetch(rtr
->rtindex
,
1692 if (rte
->rtekind
== RTE_VALUES
)
1701 /* Process the main targetlist ... */
1702 rewriteTargetList(parsetree
, rt_entry_relation
, &attrnos
);
1703 /* ... and the VALUES expression lists */
1704 rewriteValuesRTE(values_rte
, rt_entry_relation
, attrnos
);
1708 /* Process just the main targetlist */
1709 rewriteTargetList(parsetree
, rt_entry_relation
, NULL
);
1714 * Collect and apply the appropriate rules.
1716 locks
= matchLocks(event
, rt_entry_relation
->rd_rules
,
1717 result_relation
, parsetree
);
1721 List
*product_queries
;
1723 product_queries
= fireRules(parsetree
,
1732 * If we got any product queries, recursively rewrite them --- but
1733 * first check for recursion!
1735 if (product_queries
!= NIL
)
1740 foreach(n
, rewrite_events
)
1742 rev
= (rewrite_event
*) lfirst(n
);
1743 if (rev
->relation
== RelationGetRelid(rt_entry_relation
) &&
1744 rev
->event
== event
)
1746 (errcode(ERRCODE_INVALID_OBJECT_DEFINITION
),
1747 errmsg("infinite recursion detected in rules for relation \"%s\"",
1748 RelationGetRelationName(rt_entry_relation
))));
1751 rev
= (rewrite_event
*) palloc(sizeof(rewrite_event
));
1752 rev
->relation
= RelationGetRelid(rt_entry_relation
);
1754 rewrite_events
= lcons(rev
, rewrite_events
);
1756 foreach(n
, product_queries
)
1758 Query
*pt
= (Query
*) lfirst(n
);
1761 newstuff
= RewriteQuery(pt
, rewrite_events
);
1762 rewritten
= list_concat(rewritten
, newstuff
);
1765 rewrite_events
= list_delete_first(rewrite_events
);
1770 * If there is an INSTEAD, and the original query has a RETURNING, we
1771 * have to have found a RETURNING in the rule(s), else fail. (Because
1772 * DefineQueryRewrite only allows RETURNING in unconditional INSTEAD
1773 * rules, there's no need to worry whether the substituted RETURNING
1774 * will actually be executed --- it must be.)
1776 if ((instead
|| qual_product
!= NULL
) &&
1777 parsetree
->returningList
&&
1784 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1785 errmsg("cannot perform INSERT RETURNING on relation \"%s\"",
1786 RelationGetRelationName(rt_entry_relation
)),
1787 errhint("You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.")));
1791 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1792 errmsg("cannot perform UPDATE RETURNING on relation \"%s\"",
1793 RelationGetRelationName(rt_entry_relation
)),
1794 errhint("You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause.")));
1798 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1799 errmsg("cannot perform DELETE RETURNING on relation \"%s\"",
1800 RelationGetRelationName(rt_entry_relation
)),
1801 errhint("You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause.")));
1804 elog(ERROR
, "unrecognized commandType: %d",
1810 heap_close(rt_entry_relation
, NoLock
);
1814 * For INSERTs, the original query is done first; for UPDATE/DELETE, it is
1815 * done last. This is needed because update and delete rule actions might
1816 * not do anything if they are invoked after the update or delete is
1817 * performed. The command counter increment between the query executions
1818 * makes the deleted (and maybe the updated) tuples disappear so the scans
1819 * for them in the rule actions cannot find them.
1821 * If we found any unqualified INSTEAD, the original query is not done at
1822 * all, in any form. Otherwise, we add the modified form if qualified
1823 * INSTEADs were found, else the unmodified form.
1827 if (parsetree
->commandType
== CMD_INSERT
)
1829 if (qual_product
!= NULL
)
1830 rewritten
= lcons(qual_product
, rewritten
);
1832 rewritten
= lcons(parsetree
, rewritten
);
1836 if (qual_product
!= NULL
)
1837 rewritten
= lappend(rewritten
, qual_product
);
1839 rewritten
= lappend(rewritten
, parsetree
);
1849 * Primary entry point to the query rewriter.
1850 * Rewrite one query via query rewrite system, possibly returning 0
1853 * NOTE: the parsetree must either have come straight from the parser,
1854 * or have been scanned by AcquireRewriteLocks to acquire suitable locks.
1857 QueryRewrite(Query
*parsetree
)
1860 List
*results
= NIL
;
1862 CmdType origCmdType
;
1863 bool foundOriginalQuery
;
1869 * Apply all non-SELECT rules possibly getting 0 or many queries
1871 querylist
= RewriteQuery(parsetree
, NIL
);
1876 * Apply all the RIR rules on each query
1878 foreach(l
, querylist
)
1880 Query
*query
= (Query
*) lfirst(l
);
1882 query
= fireRIRrules(query
, NIL
);
1885 * If the query target was rewritten as a view, complain.
1887 if (query
->resultRelation
)
1889 RangeTblEntry
*rte
= rt_fetch(query
->resultRelation
,
1892 if (rte
->rtekind
== RTE_SUBQUERY
)
1894 switch (query
->commandType
)
1898 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1899 errmsg("cannot insert into a view"),
1900 errhint("You need an unconditional ON INSERT DO INSTEAD rule.")));
1904 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1905 errmsg("cannot update a view"),
1906 errhint("You need an unconditional ON UPDATE DO INSTEAD rule.")));
1910 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED
),
1911 errmsg("cannot delete from a view"),
1912 errhint("You need an unconditional ON DELETE DO INSTEAD rule.")));
1915 elog(ERROR
, "unrecognized commandType: %d",
1916 (int) query
->commandType
);
1922 results
= lappend(results
, query
);
1928 * Determine which, if any, of the resulting queries is supposed to set
1929 * the command-result tag; and update the canSetTag fields accordingly.
1931 * If the original query is still in the list, it sets the command tag.
1932 * Otherwise, the last INSTEAD query of the same kind as the original is
1933 * allowed to set the tag. (Note these rules can leave us with no query
1934 * setting the tag. The tcop code has to cope with this by setting up a
1935 * default tag based on the original un-rewritten query.)
1937 * The Asserts verify that at most one query in the result list is marked
1938 * canSetTag. If we aren't checking asserts, we can fall out of the loop
1939 * as soon as we find the original query.
1941 origCmdType
= parsetree
->commandType
;
1942 foundOriginalQuery
= false;
1947 Query
*query
= (Query
*) lfirst(l
);
1949 if (query
->querySource
== QSRC_ORIGINAL
)
1951 Assert(query
->canSetTag
);
1952 Assert(!foundOriginalQuery
);
1953 foundOriginalQuery
= true;
1954 #ifndef USE_ASSERT_CHECKING
1960 Assert(!query
->canSetTag
);
1961 if (query
->commandType
== origCmdType
&&
1962 (query
->querySource
== QSRC_INSTEAD_RULE
||
1963 query
->querySource
== QSRC_QUAL_INSTEAD_RULE
))
1964 lastInstead
= query
;
1968 if (!foundOriginalQuery
&& lastInstead
!= NULL
)
1969 lastInstead
->canSetTag
= true;