1 /*------------------------------------------------------------------------- 2 * 3 * rewriteHandler.c 4 * Primary module of query rewriter. 5 * 6 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * IDENTIFICATION 10 * src/backend/rewrite/rewriteHandler.c 11 * 12 * NOTES 13 * Some of the terms used in this file are of historic nature: "retrieve" 14 * was the PostQUEL keyword for what today is SELECT. "RIR" stands for 15 * "Retrieve-Instead-Retrieve", that is an ON SELECT DO INSTEAD SELECT rule 16 * (which has to be unconditional and where only one rule can exist on each 17 * relation). 18 * 19 *------------------------------------------------------------------------- 20 */ 21 #include "postgres.h" 22 23 #include "access/sysattr.h" 24 #include "catalog/dependency.h" 25 #include "catalog/pg_type.h" 26 #include "commands/trigger.h" 27 #include "foreign/fdwapi.h" 28 #include "miscadmin.h" 29 #include "nodes/makefuncs.h" 30 #include "nodes/nodeFuncs.h" 31 #include "parser/analyze.h" 32 #include "parser/parse_coerce.h" 33 #include "parser/parse_relation.h" 34 #include "parser/parsetree.h" 35 #include "rewrite/rewriteDefine.h" 36 #include "rewrite/rewriteHandler.h" 37 #include "rewrite/rewriteManip.h" 38 #include "rewrite/rowsecurity.h" 39 #include "utils/builtins.h" 40 #include "utils/lsyscache.h" 41 #include "utils/rel.h" 42 43 44 /* We use a list of these to detect recursion in RewriteQuery */ 45 typedef struct rewrite_event 46 { 47 Oid relation; /* OID of relation having rules */ 48 CmdType event; /* type of rule being fired */ 49 } rewrite_event; 50 51 typedef struct acquireLocksOnSubLinks_context 52 { 53 bool for_execute; /* AcquireRewriteLocks' forExecute param */ 54 } acquireLocksOnSubLinks_context; 55 56 static bool acquireLocksOnSubLinks(Node *node, 57 acquireLocksOnSubLinks_context *context); 58 static Query *rewriteRuleAction(Query *parsetree, 59 Query *rule_action, 60 Node *rule_qual, 61 int rt_index, 62 CmdType event, 63 bool *returning_flag); 64 static List *adjustJoinTreeList(Query *parsetree, bool removert, int rt_index); 65 static List *rewriteTargetListIU(List *targetList, 66 CmdType commandType, 67 OverridingKind override, 68 Relation target_relation, 69 int result_rti); 70 static TargetEntry *process_matched_tle(TargetEntry *src_tle, 71 TargetEntry *prior_tle, 72 const char *attrName); 73 static Node *get_assignment_input(Node *node); 74 static bool rewriteValuesRTE(Query *parsetree, RangeTblEntry *rte, int rti, 75 Relation target_relation, bool force_nulls); 76 static void markQueryForLocking(Query *qry, Node *jtnode, 77 LockClauseStrength strength, LockWaitPolicy waitPolicy, 78 bool pushedDown); 79 static List *matchLocks(CmdType event, RuleLock *rulelocks, 80 int varno, Query *parsetree, bool *hasUpdate); 81 static Query *fireRIRrules(Query *parsetree, List *activeRIRs); 82 static bool view_has_instead_trigger(Relation view, CmdType event); 83 static Bitmapset *adjust_view_column_set(Bitmapset *cols, List *targetlist); 84 85 86 /* 87 * AcquireRewriteLocks - 88 * Acquire suitable locks on all the relations mentioned in the Query. 89 * These locks will ensure that the relation schemas don't change under us 90 * while we are rewriting and planning the query. 91 * 92 * forExecute indicates that the query is about to be executed. 93 * If so, we'll acquire RowExclusiveLock on the query's resultRelation, 94 * RowShareLock on any relation accessed FOR [KEY] UPDATE/SHARE, and 95 * AccessShareLock on all other relations mentioned. 96 * 97 * If forExecute is false, AccessShareLock is acquired on all relations. 98 * This case is suitable for ruleutils.c, for example, where we only need 99 * schema stability and we don't intend to actually modify any relations. 100 * 101 * forUpdatePushedDown indicates that a pushed-down FOR [KEY] UPDATE/SHARE 102 * applies to the current subquery, requiring all rels to be opened with at 103 * least RowShareLock. This should always be false at the top of the 104 * recursion. This flag is ignored if forExecute is false. 105 * 106 * A secondary purpose of this routine is to fix up JOIN RTE references to 107 * dropped columns (see details below). Because the RTEs are modified in 108 * place, it is generally appropriate for the caller of this routine to have 109 * first done a copyObject() to make a writable copy of the querytree in the 110 * current memory context. 111 * 112 * This processing can, and for efficiency's sake should, be skipped when the 113 * querytree has just been built by the parser: parse analysis already got 114 * all the same locks we'd get here, and the parser will have omitted dropped 115 * columns from JOINs to begin with. But we must do this whenever we are 116 * dealing with a querytree produced earlier than the current command. 117 * 118 * About JOINs and dropped columns: although the parser never includes an 119 * already-dropped column in a JOIN RTE's alias var list, it is possible for 120 * such a list in a stored rule to include references to dropped columns. 121 * (If the column is not explicitly referenced anywhere else in the query, 122 * the dependency mechanism won't consider it used by the rule and so won't 123 * prevent the column drop.) To support get_rte_attribute_is_dropped(), we 124 * replace join alias vars that reference dropped columns with null pointers. 125 * 126 * (In PostgreSQL 8.0, we did not do this processing but instead had 127 * get_rte_attribute_is_dropped() recurse to detect dropped columns in joins. 128 * That approach had horrible performance unfortunately; in particular 129 * construction of a nested join was O(N^2) in the nesting depth.) 130 */ 131 void 132 AcquireRewriteLocks(Query *parsetree, 133 bool forExecute, 134 bool forUpdatePushedDown) 135 { 136 ListCell *l; 137 int rt_index; 138 acquireLocksOnSubLinks_context context; 139 140 context.for_execute = forExecute; 141 142 /* 143 * First, process RTEs of the current query level. 144 */ 145 rt_index = 0; 146 foreach(l, parsetree->rtable) 147 { 148 RangeTblEntry *rte = (RangeTblEntry *) lfirst(l); 149 Relation rel; 150 LOCKMODE lockmode; 151 List *newaliasvars; 152 Index curinputvarno; 153 RangeTblEntry *curinputrte; 154 ListCell *ll; 155 156 ++rt_index; 157 switch (rte->rtekind) 158 { 159 case RTE_RELATION: 160 161 /* 162 * Grab the appropriate lock type for the relation, and do not 163 * release it until end of transaction. This protects the 164 * rewriter and planner against schema changes mid-query. 165 * 166 * Assuming forExecute is true, this logic must match what the 167 * executor will do, else we risk lock-upgrade deadlocks. 168 */ 169 if (!forExecute) 170 lockmode = AccessShareLock; 171 else if (rt_index == parsetree->resultRelation) 172 lockmode = RowExclusiveLock; 173 else if (forUpdatePushedDown || 174 get_parse_rowmark(parsetree, rt_index) != NULL) 175 lockmode = RowShareLock; 176 else 177 lockmode = AccessShareLock; 178 179 rel = heap_open(rte->relid, lockmode); 180 181 /* 182 * While we have the relation open, update the RTE's relkind, 183 * just in case it changed since this rule was made. 184 */ 185 rte->relkind = rel->rd_rel->relkind; 186 187 heap_close(rel, NoLock); 188 break; 189 190 case RTE_JOIN: 191 192 /* 193 * Scan the join's alias var list to see if any columns have 194 * been dropped, and if so replace those Vars with null 195 * pointers. 196 * 197 * Since a join has only two inputs, we can expect to see 198 * multiple references to the same input RTE; optimize away 199 * multiple fetches. 200 */ 201 newaliasvars = NIL; 202 curinputvarno = 0; 203 curinputrte = NULL; 204 foreach(ll, rte->joinaliasvars) 205 { 206 Var *aliasitem = (Var *) lfirst(ll); 207 Var *aliasvar = aliasitem; 208 209 /* Look through any implicit coercion */ 210 aliasvar = (Var *) strip_implicit_coercions((Node *) aliasvar); 211 212 /* 213 * If the list item isn't a simple Var, then it must 214 * represent a merged column, ie a USING column, and so it 215 * couldn't possibly be dropped, since it's referenced in 216 * the join clause. (Conceivably it could also be a null 217 * pointer already? But that's OK too.) 218 */ 219 if (aliasvar && IsA(aliasvar, Var)) 220 { 221 /* 222 * The elements of an alias list have to refer to 223 * earlier RTEs of the same rtable, because that's the 224 * order the planner builds things in. So we already 225 * processed the referenced RTE, and so it's safe to 226 * use get_rte_attribute_is_dropped on it. (This might 227 * not hold after rewriting or planning, but it's OK 228 * to assume here.) 229 */ 230 Assert(aliasvar->varlevelsup == 0); 231 if (aliasvar->varno != curinputvarno) 232 { 233 curinputvarno = aliasvar->varno; 234 if (curinputvarno >= rt_index) 235 elog(ERROR, "unexpected varno %d in JOIN RTE %d", 236 curinputvarno, rt_index); 237 curinputrte = rt_fetch(curinputvarno, 238 parsetree->rtable); 239 } 240 if (get_rte_attribute_is_dropped(curinputrte, 241 aliasvar->varattno)) 242 { 243 /* Replace the join alias item with a NULL */ 244 aliasitem = NULL; 245 } 246 } 247 newaliasvars = lappend(newaliasvars, aliasitem); 248 } 249 rte->joinaliasvars = newaliasvars; 250 break; 251 252 case RTE_SUBQUERY: 253 254 /* 255 * The subquery RTE itself is all right, but we have to 256 * recurse to process the represented subquery. 257 */ 258 AcquireRewriteLocks(rte->subquery, 259 forExecute, 260 (forUpdatePushedDown || 261 get_parse_rowmark(parsetree, rt_index) != NULL)); 262 break; 263 264 default: 265 /* ignore other types of RTEs */ 266 break; 267 } 268 } 269 270 /* Recurse into subqueries in WITH */ 271 foreach(l, parsetree->cteList) 272 { 273 CommonTableExpr *cte = (CommonTableExpr *) lfirst(l); 274 275 AcquireRewriteLocks((Query *) cte->ctequery, forExecute, false); 276 } 277 278 /* 279 * Recurse into sublink subqueries, too. But we already did the ones in 280 * the rtable and cteList. 281 */ 282 if (parsetree->hasSubLinks) 283 query_tree_walker(parsetree, acquireLocksOnSubLinks, &context, 284 QTW_IGNORE_RC_SUBQUERIES); 285 } 286 287 /* 288 * Walker to find sublink subqueries for AcquireRewriteLocks 289 */ 290 static bool 291 acquireLocksOnSubLinks(Node *node, acquireLocksOnSubLinks_context *context) 292 { 293 if (node == NULL) 294 return false; 295 if (IsA(node, SubLink)) 296 { 297 SubLink *sub = (SubLink *) node; 298 299 /* Do what we came for */ 300 AcquireRewriteLocks((Query *) sub->subselect, 301 context->for_execute, 302 false); 303 /* Fall through to process lefthand args of SubLink */ 304 } 305 306 /* 307 * Do NOT recurse into Query nodes, because AcquireRewriteLocks already 308 * processed subselects of subselects for us. 309 */ 310 return expression_tree_walker(node, acquireLocksOnSubLinks, context); 311 } 312 313 314 /* 315 * rewriteRuleAction - 316 * Rewrite the rule action with appropriate qualifiers (taken from 317 * the triggering query). 318 * 319 * Input arguments: 320 * parsetree - original query 321 * rule_action - one action (query) of a rule 322 * rule_qual - WHERE condition of rule, or NULL if unconditional 323 * rt_index - RT index of result relation in original query 324 * event - type of rule event 325 * Output arguments: 326 * *returning_flag - set true if we rewrite RETURNING clause in rule_action 327 * (must be initialized to false) 328 * Return value: 329 * rewritten form of rule_action 330 */ 331 static Query * 332 rewriteRuleAction(Query *parsetree, 333 Query *rule_action, 334 Node *rule_qual, 335 int rt_index, 336 CmdType event, 337 bool *returning_flag) 338 { 339 int current_varno, 340 new_varno; 341 int rt_length; 342 Query *sub_action; 343 Query **sub_action_ptr; 344 acquireLocksOnSubLinks_context context; 345 346 context.for_execute = true; 347 348 /* 349 * Make modifiable copies of rule action and qual (what we're passed are 350 * the stored versions in the relcache; don't touch 'em!). 351 */ 352 rule_action = copyObject(rule_action); 353 rule_qual = copyObject(rule_qual); 354 355 /* 356 * Acquire necessary locks and fix any deleted JOIN RTE entries. 357 */ 358 AcquireRewriteLocks(rule_action, true, false); 359 (void) acquireLocksOnSubLinks(rule_qual, &context); 360 361 current_varno = rt_index; 362 rt_length = list_length(parsetree->rtable); 363 new_varno = PRS2_NEW_VARNO + rt_length; 364 365 /* 366 * Adjust rule action and qual to offset its varnos, so that we can merge 367 * its rtable with the main parsetree's rtable. 368 * 369 * If the rule action is an INSERT...SELECT, the OLD/NEW rtable entries 370 * will be in the SELECT part, and we have to modify that rather than the 371 * top-level INSERT (kluge!). 372 */ 373 sub_action = getInsertSelectQuery(rule_action, &sub_action_ptr); 374 375 OffsetVarNodes((Node *) sub_action, rt_length, 0); 376 OffsetVarNodes(rule_qual, rt_length, 0); 377 /* but references to OLD should point at original rt_index */ 378 ChangeVarNodes((Node *) sub_action, 379 PRS2_OLD_VARNO + rt_length, rt_index, 0); 380 ChangeVarNodes(rule_qual, 381 PRS2_OLD_VARNO + rt_length, rt_index, 0); 382 383 /* 384 * Generate expanded rtable consisting of main parsetree's rtable plus 385 * rule action's rtable; this becomes the complete rtable for the rule 386 * action. Some of the entries may be unused after we finish rewriting, 387 * but we leave them all in place for two reasons: 388 * 389 * We'd have a much harder job to adjust the query's varnos if we 390 * selectively removed RT entries. 391 * 392 * If the rule is INSTEAD, then the original query won't be executed at 393 * all, and so its rtable must be preserved so that the executor will do 394 * the correct permissions checks on it. 395 * 396 * RT entries that are not referenced in the completed jointree will be 397 * ignored by the planner, so they do not affect query semantics. But any 398 * permissions checks specified in them will be applied during executor 399 * startup (see ExecCheckRTEPerms()). This allows us to check that the 400 * caller has, say, insert-permission on a view, when the view is not 401 * semantically referenced at all in the resulting query. 402 * 403 * When a rule is not INSTEAD, the permissions checks done on its copied 404 * RT entries will be redundant with those done during execution of the 405 * original query, but we don't bother to treat that case differently. 406 * 407 * NOTE: because planner will destructively alter rtable, we must ensure 408 * that rule action's rtable is separate and shares no substructure with 409 * the main rtable. Hence do a deep copy here. 410 */ 411 sub_action->rtable = list_concat(copyObject(parsetree->rtable), 412 sub_action->rtable); 413 414 /* 415 * There could have been some SubLinks in parsetree's rtable, in which 416 * case we'd better mark the sub_action correctly. 417 */ 418 if (parsetree->hasSubLinks && !sub_action->hasSubLinks) 419 { 420 ListCell *lc; 421 422 foreach(lc, parsetree->rtable) 423 { 424 RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); 425 426 switch (rte->rtekind) 427 { 428 case RTE_RELATION: 429 sub_action->hasSubLinks = 430 checkExprHasSubLink((Node *) rte->tablesample); 431 break; 432 case RTE_FUNCTION: 433 sub_action->hasSubLinks = 434 checkExprHasSubLink((Node *) rte->functions); 435 break; 436 case RTE_TABLEFUNC: 437 sub_action->hasSubLinks = 438 checkExprHasSubLink((Node *) rte->tablefunc); 439 break; 440 case RTE_VALUES: 441 sub_action->hasSubLinks = 442 checkExprHasSubLink((Node *) rte->values_lists); 443 break; 444 default: 445 /* other RTE types don't contain bare expressions */ 446 break; 447 } 448 if (sub_action->hasSubLinks) 449 break; /* no need to keep scanning rtable */ 450 } 451 } 452 453 /* 454 * Also, we might have absorbed some RTEs with RLS conditions into the 455 * sub_action. If so, mark it as hasRowSecurity, whether or not those 456 * RTEs will be referenced after we finish rewriting. (Note: currently 457 * this is a no-op because RLS conditions aren't added till later, but it 458 * seems like good future-proofing to do this anyway.) 459 */ 460 sub_action->hasRowSecurity |= parsetree->hasRowSecurity; 461 462 /* 463 * Each rule action's jointree should be the main parsetree's jointree 464 * plus that rule's jointree, but usually *without* the original rtindex 465 * that we're replacing (if present, which it won't be for INSERT). Note 466 * that if the rule action refers to OLD, its jointree will add a 467 * reference to rt_index. If the rule action doesn't refer to OLD, but 468 * either the rule_qual or the user query quals do, then we need to keep 469 * the original rtindex in the jointree to provide data for the quals. We 470 * don't want the original rtindex to be joined twice, however, so avoid 471 * keeping it if the rule action mentions it. 472 * 473 * As above, the action's jointree must not share substructure with the 474 * main parsetree's. 475 */ 476 if (sub_action->commandType != CMD_UTILITY) 477 { 478 bool keeporig; 479 List *newjointree; 480 481 Assert(sub_action->jointree != NULL); 482 keeporig = (!rangeTableEntry_used((Node *) sub_action->jointree, 483 rt_index, 0)) && 484 (rangeTableEntry_used(rule_qual, rt_index, 0) || 485 rangeTableEntry_used(parsetree->jointree->quals, rt_index, 0)); 486 newjointree = adjustJoinTreeList(parsetree, !keeporig, rt_index); 487 if (newjointree != NIL) 488 { 489 /* 490 * If sub_action is a setop, manipulating its jointree will do no 491 * good at all, because the jointree is dummy. (Perhaps someday 492 * we could push the joining and quals down to the member 493 * statements of the setop?) 494 */ 495 if (sub_action->setOperations != NULL) 496 ereport(ERROR, 497 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 498 errmsg("conditional UNION/INTERSECT/EXCEPT statements are not implemented"))); 499 500 sub_action->jointree->fromlist = 501 list_concat(newjointree, sub_action->jointree->fromlist); 502 503 /* 504 * There could have been some SubLinks in newjointree, in which 505 * case we'd better mark the sub_action correctly. 506 */ 507 if (parsetree->hasSubLinks && !sub_action->hasSubLinks) 508 sub_action->hasSubLinks = 509 checkExprHasSubLink((Node *) newjointree); 510 } 511 } 512 513 /* 514 * If the original query has any CTEs, copy them into the rule action. But 515 * we don't need them for a utility action. 516 */ 517 if (parsetree->cteList != NIL && sub_action->commandType != CMD_UTILITY) 518 { 519 ListCell *lc; 520 521 /* 522 * Annoying implementation restriction: because CTEs are identified by 523 * name within a cteList, we can't merge a CTE from the original query 524 * if it has the same name as any CTE in the rule action. 525 * 526 * This could possibly be fixed by using some sort of internally 527 * generated ID, instead of names, to link CTE RTEs to their CTEs. 528 * However, decompiling the results would be quite confusing; note the 529 * merge of hasRecursive flags below, which could change the apparent 530 * semantics of such redundantly-named CTEs. 531 */ 532 foreach(lc, parsetree->cteList) 533 { 534 CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); 535 ListCell *lc2; 536 537 foreach(lc2, sub_action->cteList) 538 { 539 CommonTableExpr *cte2 = (CommonTableExpr *) lfirst(lc2); 540 541 if (strcmp(cte->ctename, cte2->ctename) == 0) 542 ereport(ERROR, 543 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 544 errmsg("WITH query name \"%s\" appears in both a rule action and the query being rewritten", 545 cte->ctename))); 546 } 547 } 548 549 /* OK, it's safe to combine the CTE lists */ 550 sub_action->cteList = list_concat(sub_action->cteList, 551 copyObject(parsetree->cteList)); 552 /* ... and don't forget about the associated flags */ 553 sub_action->hasRecursive |= parsetree->hasRecursive; 554 sub_action->hasModifyingCTE |= parsetree->hasModifyingCTE; 555 556 /* 557 * If rule_action is different from sub_action (i.e., the rule action 558 * is an INSERT...SELECT), then we might have just added some 559 * data-modifying CTEs that are not at the top query level. This is 560 * disallowed by the parser and we mustn't generate such trees here 561 * either, so throw an error. 562 * 563 * Conceivably such cases could be supported by attaching the original 564 * query's CTEs to rule_action not sub_action. But to do that, we'd 565 * have to increment ctelevelsup in RTEs and SubLinks copied from the 566 * original query. For now, it doesn't seem worth the trouble. 567 */ 568 if (sub_action->hasModifyingCTE && rule_action != sub_action) 569 ereport(ERROR, 570 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 571 errmsg("INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH"))); 572 } 573 574 /* 575 * Event Qualification forces copying of parsetree and splitting into two 576 * queries one w/rule_qual, one w/NOT rule_qual. Also add user query qual 577 * onto rule action 578 */ 579 AddQual(sub_action, rule_qual); 580 581 AddQual(sub_action, parsetree->jointree->quals); 582 583 /* 584 * Rewrite new.attribute with right hand side of target-list entry for 585 * appropriate field name in insert/update. 586 * 587 * KLUGE ALERT: since ReplaceVarsFromTargetList returns a mutated copy, we 588 * can't just apply it to sub_action; we have to remember to update the 589 * sublink inside rule_action, too. 590 */ 591 if ((event == CMD_INSERT || event == CMD_UPDATE) && 592 sub_action->commandType != CMD_UTILITY) 593 { 594 sub_action = (Query *) 595 ReplaceVarsFromTargetList((Node *) sub_action, 596 new_varno, 597 0, 598 rt_fetch(new_varno, sub_action->rtable), 599 parsetree->targetList, 600 (event == CMD_UPDATE) ? 601 REPLACEVARS_CHANGE_VARNO : 602 REPLACEVARS_SUBSTITUTE_NULL, 603 current_varno, 604 NULL); 605 if (sub_action_ptr) 606 *sub_action_ptr = sub_action; 607 else 608 rule_action = sub_action; 609 } 610 611 /* 612 * If rule_action has a RETURNING clause, then either throw it away if the 613 * triggering query has no RETURNING clause, or rewrite it to emit what 614 * the triggering query's RETURNING clause asks for. Throw an error if 615 * more than one rule has a RETURNING clause. 616 */ 617 if (!parsetree->returningList) 618 rule_action->returningList = NIL; 619 else if (rule_action->returningList) 620 { 621 if (*returning_flag) 622 ereport(ERROR, 623 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 624 errmsg("cannot have RETURNING lists in multiple rules"))); 625 *returning_flag = true; 626 rule_action->returningList = (List *) 627 ReplaceVarsFromTargetList((Node *) parsetree->returningList, 628 parsetree->resultRelation, 629 0, 630 rt_fetch(parsetree->resultRelation, 631 parsetree->rtable), 632 rule_action->returningList, 633 REPLACEVARS_REPORT_ERROR, 634 0, 635 &rule_action->hasSubLinks); 636 637 /* 638 * There could have been some SubLinks in parsetree's returningList, 639 * in which case we'd better mark the rule_action correctly. 640 */ 641 if (parsetree->hasSubLinks && !rule_action->hasSubLinks) 642 rule_action->hasSubLinks = 643 checkExprHasSubLink((Node *) rule_action->returningList); 644 } 645 646 return rule_action; 647 } 648 649 /* 650 * Copy the query's jointree list, and optionally attempt to remove any 651 * occurrence of the given rt_index as a top-level join item (we do not look 652 * for it within join items; this is OK because we are only expecting to find 653 * it as an UPDATE or DELETE target relation, which will be at the top level 654 * of the join). Returns modified jointree list --- this is a separate copy 655 * sharing no nodes with the original. 656 */ 657 static List * 658 adjustJoinTreeList(Query *parsetree, bool removert, int rt_index) 659 { 660 List *newjointree = copyObject(parsetree->jointree->fromlist); 661 ListCell *l; 662 663 if (removert) 664 { 665 foreach(l, newjointree) 666 { 667 RangeTblRef *rtr = lfirst(l); 668 669 if (IsA(rtr, RangeTblRef) && 670 rtr->rtindex == rt_index) 671 { 672 newjointree = list_delete_ptr(newjointree, rtr); 673 674 /* 675 * foreach is safe because we exit loop after list_delete... 676 */ 677 break; 678 } 679 } 680 } 681 return newjointree; 682 } 683 684 685 /* 686 * rewriteTargetListIU - rewrite INSERT/UPDATE targetlist into standard form 687 * 688 * This has the following responsibilities: 689 * 690 * 1. For an INSERT, add tlist entries to compute default values for any 691 * attributes that have defaults and are not assigned to in the given tlist. 692 * (We do not insert anything for default-less attributes, however. The 693 * planner will later insert NULLs for them, but there's no reason to slow 694 * down rewriter processing with extra tlist nodes.) Also, for both INSERT 695 * and UPDATE, replace explicit DEFAULT specifications with column default 696 * expressions. 697 * 698 * 2. For an UPDATE on a trigger-updatable view, add tlist entries for any 699 * unassigned-to attributes, assigning them their old values. These will 700 * later get expanded to the output values of the view. (This is equivalent 701 * to what the planner's expand_targetlist() will do for UPDATE on a regular 702 * table, but it's more convenient to do it here while we still have easy 703 * access to the view's original RT index.) This is only necessary for 704 * trigger-updatable views, for which the view remains the result relation of 705 * the query. For auto-updatable views we must not do this, since it might 706 * add assignments to non-updatable view columns. For rule-updatable views it 707 * is unnecessary extra work, since the query will be rewritten with a 708 * different result relation which will be processed when we recurse via 709 * RewriteQuery. 710 * 711 * 3. Merge multiple entries for the same target attribute, or declare error 712 * if we can't. Multiple entries are only allowed for INSERT/UPDATE of 713 * portions of an array or record field, for example 714 * UPDATE table SET foo[2] = 42, foo[4] = 43; 715 * We can merge such operations into a single assignment op. Essentially, 716 * the expression we want to produce in this case is like 717 * foo = array_set_element(array_set_element(foo, 2, 42), 4, 43) 718 * 719 * 4. Sort the tlist into standard order: non-junk fields in order by resno, 720 * then junk fields (these in no particular order). 721 * 722 * We must do items 1,2,3 before firing rewrite rules, else rewritten 723 * references to NEW.foo will produce wrong or incomplete results. Item 4 724 * is not needed for rewriting, but will be needed by the planner, and we 725 * can do it essentially for free while handling the other items. 726 * 727 * Note that for an inheritable UPDATE, this processing is only done once, 728 * using the parent relation as reference. It must not do anything that 729 * will not be correct when transposed to the child relation(s). (Step 4 730 * is incorrect by this light, since child relations might have different 731 * column ordering, but the planner will fix things by re-sorting the tlist 732 * for each child.) 733 */ 734 static List * 735 rewriteTargetListIU(List *targetList, 736 CmdType commandType, 737 OverridingKind override, 738 Relation target_relation, 739 int result_rti) 740 { 741 TargetEntry **new_tles; 742 List *new_tlist = NIL; 743 List *junk_tlist = NIL; 744 Form_pg_attribute att_tup; 745 int attrno, 746 next_junk_attrno, 747 numattrs; 748 ListCell *temp; 749 750 /* 751 * We process the normal (non-junk) attributes by scanning the input tlist 752 * once and transferring TLEs into an array, then scanning the array to 753 * build an output tlist. This avoids O(N^2) behavior for large numbers 754 * of attributes. 755 * 756 * Junk attributes are tossed into a separate list during the same tlist 757 * scan, then appended to the reconstructed tlist. 758 */ 759 numattrs = RelationGetNumberOfAttributes(target_relation); 760 new_tles = (TargetEntry **) palloc0(numattrs * sizeof(TargetEntry *)); 761 next_junk_attrno = numattrs + 1; 762 763 foreach(temp, targetList) 764 { 765 TargetEntry *old_tle = (TargetEntry *) lfirst(temp); 766 767 if (!old_tle->resjunk) 768 { 769 /* Normal attr: stash it into new_tles[] */ 770 attrno = old_tle->resno; 771 if (attrno < 1 || attrno > numattrs) 772 elog(ERROR, "bogus resno %d in targetlist", attrno); 773 att_tup = TupleDescAttr(target_relation->rd_att, attrno - 1); 774 775 /* We can (and must) ignore deleted attributes */ 776 if (att_tup->attisdropped) 777 continue; 778 779 /* Merge with any prior assignment to same attribute */ 780 new_tles[attrno - 1] = 781 process_matched_tle(old_tle, 782 new_tles[attrno - 1], 783 NameStr(att_tup->attname)); 784 } 785 else 786 { 787 /* 788 * Copy all resjunk tlist entries to junk_tlist, and assign them 789 * resnos above the last real resno. 790 * 791 * Typical junk entries include ORDER BY or GROUP BY expressions 792 * (are these actually possible in an INSERT or UPDATE?), system 793 * attribute references, etc. 794 */ 795 796 /* Get the resno right, but don't copy unnecessarily */ 797 if (old_tle->resno != next_junk_attrno) 798 { 799 old_tle = flatCopyTargetEntry(old_tle); 800 old_tle->resno = next_junk_attrno; 801 } 802 junk_tlist = lappend(junk_tlist, old_tle); 803 next_junk_attrno++; 804 } 805 } 806 807 for (attrno = 1; attrno <= numattrs; attrno++) 808 { 809 TargetEntry *new_tle = new_tles[attrno - 1]; 810 bool apply_default; 811 812 att_tup = TupleDescAttr(target_relation->rd_att, attrno - 1); 813 814 /* We can (and must) ignore deleted attributes */ 815 if (att_tup->attisdropped) 816 continue; 817 818 /* 819 * Handle the two cases where we need to insert a default expression: 820 * it's an INSERT and there's no tlist entry for the column, or the 821 * tlist entry is a DEFAULT placeholder node. 822 */ 823 apply_default = ((new_tle == NULL && commandType == CMD_INSERT) || 824 (new_tle && new_tle->expr && IsA(new_tle->expr, SetToDefault))); 825 826 if (commandType == CMD_INSERT) 827 { 828 if (att_tup->attidentity == ATTRIBUTE_IDENTITY_ALWAYS && !apply_default) 829 { 830 if (override != OVERRIDING_SYSTEM_VALUE) 831 ereport(ERROR, 832 (errcode(ERRCODE_GENERATED_ALWAYS), 833 errmsg("cannot insert into column \"%s\"", NameStr(att_tup->attname)), 834 errdetail("Column \"%s\" is an identity column defined as GENERATED ALWAYS.", 835 NameStr(att_tup->attname)), 836 errhint("Use OVERRIDING SYSTEM VALUE to override."))); 837 } 838 839 if (att_tup->attidentity == ATTRIBUTE_IDENTITY_BY_DEFAULT && override == OVERRIDING_USER_VALUE) 840 apply_default = true; 841 } 842 843 if (commandType == CMD_UPDATE) 844 { 845 if (att_tup->attidentity == ATTRIBUTE_IDENTITY_ALWAYS && new_tle && !apply_default) 846 ereport(ERROR, 847 (errcode(ERRCODE_GENERATED_ALWAYS), 848 errmsg("column \"%s\" can only be updated to DEFAULT", NameStr(att_tup->attname)), 849 errdetail("Column \"%s\" is an identity column defined as GENERATED ALWAYS.", 850 NameStr(att_tup->attname)))); 851 } 852 853 if (apply_default) 854 { 855 Node *new_expr; 856 857 new_expr = build_column_default(target_relation, attrno); 858 859 /* 860 * If there is no default (ie, default is effectively NULL), we 861 * can omit the tlist entry in the INSERT case, since the planner 862 * can insert a NULL for itself, and there's no point in spending 863 * any more rewriter cycles on the entry. But in the UPDATE case 864 * we've got to explicitly set the column to NULL. 865 */ 866 if (!new_expr) 867 { 868 if (commandType == CMD_INSERT) 869 new_tle = NULL; 870 else 871 { 872 new_expr = (Node *) makeConst(att_tup->atttypid, 873 -1, 874 att_tup->attcollation, 875 att_tup->attlen, 876 (Datum) 0, 877 true, /* isnull */ 878 att_tup->attbyval); 879 /* this is to catch a NOT NULL domain constraint */ 880 new_expr = coerce_to_domain(new_expr, 881 InvalidOid, -1, 882 att_tup->atttypid, 883 COERCION_IMPLICIT, 884 COERCE_IMPLICIT_CAST, 885 -1, 886 false); 887 } 888 } 889 890 if (new_expr) 891 new_tle = makeTargetEntry((Expr *) new_expr, 892 attrno, 893 pstrdup(NameStr(att_tup->attname)), 894 false); 895 } 896 897 /* 898 * For an UPDATE on a trigger-updatable view, provide a dummy entry 899 * whenever there is no explicit assignment. 900 */ 901 if (new_tle == NULL && commandType == CMD_UPDATE && 902 target_relation->rd_rel->relkind == RELKIND_VIEW && 903 view_has_instead_trigger(target_relation, CMD_UPDATE)) 904 { 905 Node *new_expr; 906 907 new_expr = (Node *) makeVar(result_rti, 908 attrno, 909 att_tup->atttypid, 910 att_tup->atttypmod, 911 att_tup->attcollation, 912 0); 913 914 new_tle = makeTargetEntry((Expr *) new_expr, 915 attrno, 916 pstrdup(NameStr(att_tup->attname)), 917 false); 918 } 919 920 if (new_tle) 921 new_tlist = lappend(new_tlist, new_tle); 922 } 923 924 pfree(new_tles); 925 926 return list_concat(new_tlist, junk_tlist); 927 } 928 929 930 /* 931 * Convert a matched TLE from the original tlist into a correct new TLE. 932 * 933 * This routine detects and handles multiple assignments to the same target 934 * attribute. (The attribute name is needed only for error messages.) 935 */ 936 static TargetEntry * 937 process_matched_tle(TargetEntry *src_tle, 938 TargetEntry *prior_tle, 939 const char *attrName) 940 { 941 TargetEntry *result; 942 CoerceToDomain *coerce_expr = NULL; 943 Node *src_expr; 944 Node *prior_expr; 945 Node *src_input; 946 Node *prior_input; 947 Node *priorbottom; 948 Node *newexpr; 949 950 if (prior_tle == NULL) 951 { 952 /* 953 * Normal case where this is the first assignment to the attribute. 954 */ 955 return src_tle; 956 } 957 958 /*---------- 959 * Multiple assignments to same attribute. Allow only if all are 960 * FieldStore or ArrayRef assignment operations. This is a bit 961 * tricky because what we may actually be looking at is a nest of 962 * such nodes; consider 963 * UPDATE tab SET col.fld1.subfld1 = x, col.fld2.subfld2 = y 964 * The two expressions produced by the parser will look like 965 * FieldStore(col, fld1, FieldStore(placeholder, subfld1, x)) 966 * FieldStore(col, fld2, FieldStore(placeholder, subfld2, y)) 967 * However, we can ignore the substructure and just consider the top 968 * FieldStore or ArrayRef from each assignment, because it works to 969 * combine these as 970 * FieldStore(FieldStore(col, fld1, 971 * FieldStore(placeholder, subfld1, x)), 972 * fld2, FieldStore(placeholder, subfld2, y)) 973 * Note the leftmost expression goes on the inside so that the 974 * assignments appear to occur left-to-right. 975 * 976 * For FieldStore, instead of nesting we can generate a single 977 * FieldStore with multiple target fields. We must nest when 978 * ArrayRefs are involved though. 979 * 980 * As a further complication, the destination column might be a domain, 981 * resulting in each assignment containing a CoerceToDomain node over a 982 * FieldStore or ArrayRef. These should have matching target domains, 983 * so we strip them and reconstitute a single CoerceToDomain over the 984 * combined FieldStore/ArrayRef nodes. (Notice that this has the result 985 * that the domain's checks are applied only after we do all the field or 986 * element updates, not after each one. This is arguably desirable.) 987 *---------- 988 */ 989 src_expr = (Node *) src_tle->expr; 990 prior_expr = (Node *) prior_tle->expr; 991 992 if (src_expr && IsA(src_expr, CoerceToDomain) && 993 prior_expr && IsA(prior_expr, CoerceToDomain) && 994 ((CoerceToDomain *) src_expr)->resulttype == 995 ((CoerceToDomain *) prior_expr)->resulttype) 996 { 997 /* we assume without checking that resulttypmod/resultcollid match */ 998 coerce_expr = (CoerceToDomain *) src_expr; 999 src_expr = (Node *) ((CoerceToDomain *) src_expr)->arg; 1000 prior_expr = (Node *) ((CoerceToDomain *) prior_expr)->arg; 1001 } 1002 1003 src_input = get_assignment_input(src_expr); 1004 prior_input = get_assignment_input(prior_expr); 1005 if (src_input == NULL || 1006 prior_input == NULL || 1007 exprType(src_expr) != exprType(prior_expr)) 1008 ereport(ERROR, 1009 (errcode(ERRCODE_SYNTAX_ERROR), 1010 errmsg("multiple assignments to same column \"%s\"", 1011 attrName))); 1012 1013 /* 1014 * Prior TLE could be a nest of assignments if we do this more than once. 1015 */ 1016 priorbottom = prior_input; 1017 for (;;) 1018 { 1019 Node *newbottom = get_assignment_input(priorbottom); 1020 1021 if (newbottom == NULL) 1022 break; /* found the original Var reference */ 1023 priorbottom = newbottom; 1024 } 1025 if (!equal(priorbottom, src_input)) 1026 ereport(ERROR, 1027 (errcode(ERRCODE_SYNTAX_ERROR), 1028 errmsg("multiple assignments to same column \"%s\"", 1029 attrName))); 1030 1031 /* 1032 * Looks OK to nest 'em. 1033 */ 1034 if (IsA(src_expr, FieldStore)) 1035 { 1036 FieldStore *fstore = makeNode(FieldStore); 1037 1038 if (IsA(prior_expr, FieldStore)) 1039 { 1040 /* combine the two */ 1041 memcpy(fstore, prior_expr, sizeof(FieldStore)); 1042 fstore->newvals = 1043 list_concat(list_copy(((FieldStore *) prior_expr)->newvals), 1044 list_copy(((FieldStore *) src_expr)->newvals)); 1045 fstore->fieldnums = 1046 list_concat(list_copy(((FieldStore *) prior_expr)->fieldnums), 1047 list_copy(((FieldStore *) src_expr)->fieldnums)); 1048 } 1049 else 1050 { 1051 /* general case, just nest 'em */ 1052 memcpy(fstore, src_expr, sizeof(FieldStore)); 1053 fstore->arg = (Expr *) prior_expr; 1054 } 1055 newexpr = (Node *) fstore; 1056 } 1057 else if (IsA(src_expr, ArrayRef)) 1058 { 1059 ArrayRef *aref = makeNode(ArrayRef); 1060 1061 memcpy(aref, src_expr, sizeof(ArrayRef)); 1062 aref->refexpr = (Expr *) prior_expr; 1063 newexpr = (Node *) aref; 1064 } 1065 else 1066 { 1067 elog(ERROR, "cannot happen"); 1068 newexpr = NULL; 1069 } 1070 1071 if (coerce_expr) 1072 { 1073 /* put back the CoerceToDomain */ 1074 CoerceToDomain *newcoerce = makeNode(CoerceToDomain); 1075 1076 memcpy(newcoerce, coerce_expr, sizeof(CoerceToDomain)); 1077 newcoerce->arg = (Expr *) newexpr; 1078 newexpr = (Node *) newcoerce; 1079 } 1080 1081 result = flatCopyTargetEntry(src_tle); 1082 result->expr = (Expr *) newexpr; 1083 return result; 1084 } 1085 1086 /* 1087 * If node is an assignment node, return its input; else return NULL 1088 */ 1089 static Node * 1090 get_assignment_input(Node *node) 1091 { 1092 if (node == NULL) 1093 return NULL; 1094 if (IsA(node, FieldStore)) 1095 { 1096 FieldStore *fstore = (FieldStore *) node; 1097 1098 return (Node *) fstore->arg; 1099 } 1100 else if (IsA(node, ArrayRef)) 1101 { 1102 ArrayRef *aref = (ArrayRef *) node; 1103 1104 if (aref->refassgnexpr == NULL) 1105 return NULL; 1106 return (Node *) aref->refexpr; 1107 } 1108 return NULL; 1109 } 1110 1111 /* 1112 * Make an expression tree for the default value for a column. 1113 * 1114 * If there is no default, return a NULL instead. 1115 */ 1116 Node * 1117 build_column_default(Relation rel, int attrno) 1118 { 1119 TupleDesc rd_att = rel->rd_att; 1120 Form_pg_attribute att_tup = TupleDescAttr(rd_att, attrno - 1); 1121 Oid atttype = att_tup->atttypid; 1122 int32 atttypmod = att_tup->atttypmod; 1123 Node *expr = NULL; 1124 Oid exprtype; 1125 1126 if (att_tup->attidentity) 1127 { 1128 NextValueExpr *nve = makeNode(NextValueExpr); 1129 1130 nve->seqid = getOwnedSequence(RelationGetRelid(rel), attrno); 1131 nve->typeId = att_tup->atttypid; 1132 1133 return (Node *) nve; 1134 } 1135 1136 /* 1137 * Scan to see if relation has a default for this column. 1138 */ 1139 if (att_tup->atthasdef && rd_att->constr && 1140 rd_att->constr->num_defval > 0) 1141 { 1142 AttrDefault *defval = rd_att->constr->defval; 1143 int ndef = rd_att->constr->num_defval; 1144 1145 while (--ndef >= 0) 1146 { 1147 if (attrno == defval[ndef].adnum) 1148 { 1149 /* 1150 * Found it, convert string representation to node tree. 1151 */ 1152 expr = stringToNode(defval[ndef].adbin); 1153 break; 1154 } 1155 } 1156 } 1157 1158 if (expr == NULL) 1159 { 1160 /* 1161 * No per-column default, so look for a default for the type itself. 1162 */ 1163 expr = get_typdefault(atttype); 1164 } 1165 1166 if (expr == NULL) 1167 return NULL; /* No default anywhere */ 1168 1169 /* 1170 * Make sure the value is coerced to the target column type; this will 1171 * generally be true already, but there seem to be some corner cases 1172 * involving domain defaults where it might not be true. This should match 1173 * the parser's processing of non-defaulted expressions --- see 1174 * transformAssignedExpr(). 1175 */ 1176 exprtype = exprType(expr); 1177 1178 expr = coerce_to_target_type(NULL, /* no UNKNOWN params here */ 1179 expr, exprtype, 1180 atttype, atttypmod, 1181 COERCION_ASSIGNMENT, 1182 COERCE_IMPLICIT_CAST, 1183 -1); 1184 if (expr == NULL) 1185 ereport(ERROR, 1186 (errcode(ERRCODE_DATATYPE_MISMATCH), 1187 errmsg("column \"%s\" is of type %s" 1188 " but default expression is of type %s", 1189 NameStr(att_tup->attname), 1190 format_type_be(atttype), 1191 format_type_be(exprtype)), 1192 errhint("You will need to rewrite or cast the expression."))); 1193 1194 return expr; 1195 } 1196 1197 1198 /* Does VALUES RTE contain any SetToDefault items? */ 1199 static bool 1200 searchForDefault(RangeTblEntry *rte) 1201 { 1202 ListCell *lc; 1203 1204 foreach(lc, rte->values_lists) 1205 { 1206 List *sublist = (List *) lfirst(lc); 1207 ListCell *lc2; 1208 1209 foreach(lc2, sublist) 1210 { 1211 Node *col = (Node *) lfirst(lc2); 1212 1213 if (IsA(col, SetToDefault)) 1214 return true; 1215 } 1216 } 1217 return false; 1218 } 1219 1220 /* 1221 * When processing INSERT ... VALUES with a VALUES RTE (ie, multiple VALUES 1222 * lists), we have to replace any DEFAULT items in the VALUES lists with 1223 * the appropriate default expressions. The other aspects of targetlist 1224 * rewriting need be applied only to the query's targetlist proper. 1225 * 1226 * For an auto-updatable view, each DEFAULT item in the VALUES list is 1227 * replaced with the default from the view, if it has one. Otherwise it is 1228 * left untouched so that the underlying base relation's default can be 1229 * applied instead (when we later recurse to here after rewriting the query 1230 * to refer to the base relation instead of the view). 1231 * 1232 * For other types of relation, including rule- and trigger-updatable views, 1233 * all DEFAULT items are replaced, and if the target relation doesn't have a 1234 * default, the value is explicitly set to NULL. 1235 * 1236 * Additionally, if force_nulls is true, the target relation's defaults are 1237 * ignored and all DEFAULT items in the VALUES list are explicitly set to 1238 * NULL, regardless of the target relation's type. This is used for the 1239 * product queries generated by DO ALSO rules attached to an auto-updatable 1240 * view, for which we will have already called this function with force_nulls 1241 * false. For these product queries, we must then force any remaining DEFAULT 1242 * items to NULL to provide concrete values for the rule actions. 1243 * Essentially, this is a mix of the 2 cases above --- the original query is 1244 * an insert into an auto-updatable view, and the product queries are inserts 1245 * into a rule-updatable view. 1246 * 1247 * Note that we may have subscripted or field assignment targetlist entries, 1248 * as well as more complex expressions from already-replaced DEFAULT items if 1249 * we have recursed to here for an auto-updatable view. However, it ought to 1250 * be impossible for such entries to have DEFAULTs assigned to them --- we 1251 * should only have to replace DEFAULT items for targetlist entries that 1252 * contain simple Vars referencing the VALUES RTE. 1253 * 1254 * Returns true if all DEFAULT items were replaced, and false if some were 1255 * left untouched. 1256 */ 1257 static bool 1258 rewriteValuesRTE(Query *parsetree, RangeTblEntry *rte, int rti, 1259 Relation target_relation, bool force_nulls) 1260 { 1261 List *newValues; 1262 ListCell *lc; 1263 bool isAutoUpdatableView; 1264 bool allReplaced; 1265 int numattrs; 1266 int *attrnos; 1267 1268 /* 1269 * Rebuilding all the lists is a pretty expensive proposition in a big 1270 * VALUES list, and it's a waste of time if there aren't any DEFAULT 1271 * placeholders. So first scan to see if there are any. 1272 * 1273 * We skip this check if force_nulls is true, because we know that there 1274 * are DEFAULT items present in that case. 1275 */ 1276 if (!force_nulls && !searchForDefault(rte)) 1277 return true; /* nothing to do */ 1278 1279 /* 1280 * Scan the targetlist for entries referring to the VALUES RTE, and note 1281 * the target attributes. As noted above, we should only need to do this 1282 * for targetlist entries containing simple Vars --- nothing else in the 1283 * VALUES RTE should contain DEFAULT items, and we complain if such a 1284 * thing does occur. 1285 */ 1286 numattrs = list_length(linitial(rte->values_lists)); 1287 attrnos = (int *) palloc0(numattrs * sizeof(int)); 1288 1289 foreach(lc, parsetree->targetList) 1290 { 1291 TargetEntry *tle = (TargetEntry *) lfirst(lc); 1292 1293 if (IsA(tle->expr, Var)) 1294 { 1295 Var *var = (Var *) tle->expr; 1296 1297 if (var->varno == rti) 1298 { 1299 int attrno = var->varattno; 1300 1301 Assert(attrno >= 1 && attrno <= numattrs); 1302 attrnos[attrno - 1] = tle->resno; 1303 } 1304 } 1305 } 1306 1307 /* 1308 * Check if the target relation is an auto-updatable view, in which case 1309 * unresolved defaults will be left untouched rather than being set to 1310 * NULL. If force_nulls is true, we always set DEFAULT items to NULL, so 1311 * skip this check in that case --- it isn't an auto-updatable view. 1312 */ 1313 isAutoUpdatableView = false; 1314 if (!force_nulls && 1315 target_relation->rd_rel->relkind == RELKIND_VIEW && 1316 !view_has_instead_trigger(target_relation, CMD_INSERT)) 1317 { 1318 List *locks; 1319 bool hasUpdate; 1320 bool found; 1321 ListCell *l; 1322 1323 /* Look for an unconditional DO INSTEAD rule */ 1324 locks = matchLocks(CMD_INSERT, target_relation->rd_rules, 1325 parsetree->resultRelation, parsetree, &hasUpdate); 1326 1327 found = false; 1328 foreach(l, locks) 1329 { 1330 RewriteRule *rule_lock = (RewriteRule *) lfirst(l); 1331 1332 if (rule_lock->isInstead && 1333 rule_lock->qual == NULL) 1334 { 1335 found = true; 1336 break; 1337 } 1338 } 1339 1340 /* 1341 * If we didn't find an unconditional DO INSTEAD rule, assume that the 1342 * view is auto-updatable. If it isn't, rewriteTargetView() will 1343 * throw an error. 1344 */ 1345 if (!found) 1346 isAutoUpdatableView = true; 1347 } 1348 1349 newValues = NIL; 1350 allReplaced = true; 1351 foreach(lc, rte->values_lists) 1352 { 1353 List *sublist = (List *) lfirst(lc); 1354 List *newList = NIL; 1355 ListCell *lc2; 1356 int i; 1357 1358 Assert(list_length(sublist) == numattrs); 1359 1360 i = 0; 1361 foreach(lc2, sublist) 1362 { 1363 Node *col = (Node *) lfirst(lc2); 1364 int attrno = attrnos[i++]; 1365 1366 if (IsA(col, SetToDefault)) 1367 { 1368 Form_pg_attribute att_tup; 1369 Node *new_expr; 1370 1371 if (attrno == 0) 1372 elog(ERROR, "cannot set value in column %d to DEFAULT", i); 1373 att_tup = TupleDescAttr(target_relation->rd_att, attrno - 1); 1374 1375 if (!force_nulls && !att_tup->attisdropped) 1376 new_expr = build_column_default(target_relation, attrno); 1377 else 1378 new_expr = NULL; /* force a NULL if dropped */ 1379 1380 /* 1381 * If there is no default (ie, default is effectively NULL), 1382 * we've got to explicitly set the column to NULL, unless the 1383 * target relation is an auto-updatable view. 1384 */ 1385 if (!new_expr) 1386 { 1387 if (isAutoUpdatableView) 1388 { 1389 /* Leave the value untouched */ 1390 newList = lappend(newList, col); 1391 allReplaced = false; 1392 continue; 1393 } 1394 1395 new_expr = (Node *) makeConst(att_tup->atttypid, 1396 -1, 1397 att_tup->attcollation, 1398 att_tup->attlen, 1399 (Datum) 0, 1400 true, /* isnull */ 1401 att_tup->attbyval); 1402 /* this is to catch a NOT NULL domain constraint */ 1403 new_expr = coerce_to_domain(new_expr, 1404 InvalidOid, -1, 1405 att_tup->atttypid, 1406 COERCION_IMPLICIT, 1407 COERCE_IMPLICIT_CAST, 1408 -1, 1409 false); 1410 } 1411 newList = lappend(newList, new_expr); 1412 } 1413 else 1414 newList = lappend(newList, col); 1415 } 1416 newValues = lappend(newValues, newList); 1417 } 1418 rte->values_lists = newValues; 1419 1420 pfree(attrnos); 1421 1422 return allReplaced; 1423 } 1424 1425 1426 /* 1427 * rewriteTargetListUD - rewrite UPDATE/DELETE targetlist as needed 1428 * 1429 * This function adds a "junk" TLE that is needed to allow the executor to 1430 * find the original row for the update or delete. When the target relation 1431 * is a regular table, the junk TLE emits the ctid attribute of the original 1432 * row. When the target relation is a foreign table, we let the FDW decide 1433 * what to add. 1434 * 1435 * We used to do this during RewriteQuery(), but now that inheritance trees 1436 * can contain a mix of regular and foreign tables, we must postpone it till 1437 * planning, after the inheritance tree has been expanded. In that way we 1438 * can do the right thing for each child table. 1439 */ 1440 void 1441 rewriteTargetListUD(Query *parsetree, RangeTblEntry *target_rte, 1442 Relation target_relation) 1443 { 1444 Var *var = NULL; 1445 const char *attrname; 1446 TargetEntry *tle; 1447 1448 if (target_relation->rd_rel->relkind == RELKIND_RELATION || 1449 target_relation->rd_rel->relkind == RELKIND_MATVIEW || 1450 target_relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) 1451 { 1452 /* 1453 * Emit CTID so that executor can find the row to update or delete. 1454 */ 1455 var = makeVar(parsetree->resultRelation, 1456 SelfItemPointerAttributeNumber, 1457 TIDOID, 1458 -1, 1459 InvalidOid, 1460 0); 1461 1462 attrname = "ctid"; 1463 } 1464 else if (target_relation->rd_rel->relkind == RELKIND_FOREIGN_TABLE) 1465 { 1466 /* 1467 * Let the foreign table's FDW add whatever junk TLEs it wants. 1468 */ 1469 FdwRoutine *fdwroutine; 1470 1471 fdwroutine = GetFdwRoutineForRelation(target_relation, false); 1472 1473 if (fdwroutine->AddForeignUpdateTargets != NULL) 1474 fdwroutine->AddForeignUpdateTargets(parsetree, target_rte, 1475 target_relation); 1476 1477 /* 1478 * If we have a row-level trigger corresponding to the operation, emit 1479 * a whole-row Var so that executor will have the "old" row to pass to 1480 * the trigger. Alas, this misses system columns. 1481 */ 1482 if (target_relation->trigdesc && 1483 ((parsetree->commandType == CMD_UPDATE && 1484 (target_relation->trigdesc->trig_update_after_row || 1485 target_relation->trigdesc->trig_update_before_row)) || 1486 (parsetree->commandType == CMD_DELETE && 1487 (target_relation->trigdesc->trig_delete_after_row || 1488 target_relation->trigdesc->trig_delete_before_row)))) 1489 { 1490 var = makeWholeRowVar(target_rte, 1491 parsetree->resultRelation, 1492 0, 1493 false); 1494 1495 attrname = "wholerow"; 1496 } 1497 } 1498 1499 if (var != NULL) 1500 { 1501 tle = makeTargetEntry((Expr *) var, 1502 list_length(parsetree->targetList) + 1, 1503 pstrdup(attrname), 1504 true); 1505 1506 parsetree->targetList = lappend(parsetree->targetList, tle); 1507 } 1508 } 1509 1510 1511 /* 1512 * matchLocks - 1513 * match the list of locks and returns the matching rules 1514 */ 1515 static List * 1516 matchLocks(CmdType event, 1517 RuleLock *rulelocks, 1518 int varno, 1519 Query *parsetree, 1520 bool *hasUpdate) 1521 { 1522 List *matching_locks = NIL; 1523 int nlocks; 1524 int i; 1525 1526 if (rulelocks == NULL) 1527 return NIL; 1528 1529 if (parsetree->commandType != CMD_SELECT) 1530 { 1531 if (parsetree->resultRelation != varno) 1532 return NIL; 1533 } 1534 1535 nlocks = rulelocks->numLocks; 1536 1537 for (i = 0; i < nlocks; i++) 1538 { 1539 RewriteRule *oneLock = rulelocks->rules[i]; 1540 1541 if (oneLock->event == CMD_UPDATE) 1542 *hasUpdate = true; 1543 1544 /* 1545 * Suppress ON INSERT/UPDATE/DELETE rules that are disabled or 1546 * configured to not fire during the current sessions replication 1547 * role. ON SELECT rules will always be applied in order to keep views 1548 * working even in LOCAL or REPLICA role. 1549 */ 1550 if (oneLock->event != CMD_SELECT) 1551 { 1552 if (SessionReplicationRole == SESSION_REPLICATION_ROLE_REPLICA) 1553 { 1554 if (oneLock->enabled == RULE_FIRES_ON_ORIGIN || 1555 oneLock->enabled == RULE_DISABLED) 1556 continue; 1557 } 1558 else /* ORIGIN or LOCAL ROLE */ 1559 { 1560 if (oneLock->enabled == RULE_FIRES_ON_REPLICA || 1561 oneLock->enabled == RULE_DISABLED) 1562 continue; 1563 } 1564 } 1565 1566 if (oneLock->event == event) 1567 { 1568 if (parsetree->commandType != CMD_SELECT || 1569 rangeTableEntry_used((Node *) parsetree, varno, 0)) 1570 matching_locks = lappend(matching_locks, oneLock); 1571 } 1572 } 1573 1574 return matching_locks; 1575 } 1576 1577 1578 /* 1579 * ApplyRetrieveRule - expand an ON SELECT rule 1580 */ 1581 static Query * 1582 ApplyRetrieveRule(Query *parsetree, 1583 RewriteRule *rule, 1584 int rt_index, 1585 Relation relation, 1586 List *activeRIRs) 1587 { 1588 Query *rule_action; 1589 RangeTblEntry *rte, 1590 *subrte; 1591 RowMarkClause *rc; 1592 1593 if (list_length(rule->actions) != 1) 1594 elog(ERROR, "expected just one rule action"); 1595 if (rule->qual != NULL) 1596 elog(ERROR, "cannot handle qualified ON SELECT rule"); 1597 1598 if (rt_index == parsetree->resultRelation) 1599 { 1600 /* 1601 * We have a view as the result relation of the query, and it wasn't 1602 * rewritten by any rule. This case is supported if there is an 1603 * INSTEAD OF trigger that will trap attempts to insert/update/delete 1604 * view rows. The executor will check that; for the moment just plow 1605 * ahead. We have two cases: 1606 * 1607 * For INSERT, we needn't do anything. The unmodified RTE will serve 1608 * fine as the result relation. 1609 * 1610 * For UPDATE/DELETE, we need to expand the view so as to have source 1611 * data for the operation. But we also need an unmodified RTE to 1612 * serve as the target. So, copy the RTE and add the copy to the 1613 * rangetable. Note that the copy does not get added to the jointree. 1614 * Also note that there's a hack in fireRIRrules to avoid calling this 1615 * function again when it arrives at the copied RTE. 1616 */ 1617 if (parsetree->commandType == CMD_INSERT) 1618 return parsetree; 1619 else if (parsetree->commandType == CMD_UPDATE || 1620 parsetree->commandType == CMD_DELETE) 1621 { 1622 RangeTblEntry *newrte; 1623 Var *var; 1624 TargetEntry *tle; 1625 1626 rte = rt_fetch(rt_index, parsetree->rtable); 1627 newrte = copyObject(rte); 1628 parsetree->rtable = lappend(parsetree->rtable, newrte); 1629 parsetree->resultRelation = list_length(parsetree->rtable); 1630 1631 /* 1632 * There's no need to do permissions checks twice, so wipe out the 1633 * permissions info for the original RTE (we prefer to keep the 1634 * bits set on the result RTE). 1635 */ 1636 rte->requiredPerms = 0; 1637 rte->checkAsUser = InvalidOid; 1638 rte->selectedCols = NULL; 1639 rte->insertedCols = NULL; 1640 rte->updatedCols = NULL; 1641 1642 /* 1643 * For the most part, Vars referencing the view should remain as 1644 * they are, meaning that they implicitly represent OLD values. 1645 * But in the RETURNING list if any, we want such Vars to 1646 * represent NEW values, so change them to reference the new RTE. 1647 * 1648 * Since ChangeVarNodes scribbles on the tree in-place, copy the 1649 * RETURNING list first for safety. 1650 */ 1651 parsetree->returningList = copyObject(parsetree->returningList); 1652 ChangeVarNodes((Node *) parsetree->returningList, rt_index, 1653 parsetree->resultRelation, 0); 1654 1655 /* 1656 * To allow the executor to compute the original view row to pass 1657 * to the INSTEAD OF trigger, we add a resjunk whole-row Var 1658 * referencing the original RTE. This will later get expanded 1659 * into a RowExpr computing all the OLD values of the view row. 1660 */ 1661 var = makeWholeRowVar(rte, rt_index, 0, false); 1662 tle = makeTargetEntry((Expr *) var, 1663 list_length(parsetree->targetList) + 1, 1664 pstrdup("wholerow"), 1665 true); 1666 1667 parsetree->targetList = lappend(parsetree->targetList, tle); 1668 1669 /* Now, continue with expanding the original view RTE */ 1670 } 1671 else 1672 elog(ERROR, "unrecognized commandType: %d", 1673 (int) parsetree->commandType); 1674 } 1675 1676 /* 1677 * Check if there's a FOR [KEY] UPDATE/SHARE clause applying to this view. 1678 * 1679 * Note: we needn't explicitly consider any such clauses appearing in 1680 * ancestor query levels; their effects have already been pushed down to 1681 * here by markQueryForLocking, and will be reflected in "rc". 1682 */ 1683 rc = get_parse_rowmark(parsetree, rt_index); 1684 1685 /* 1686 * Make a modifiable copy of the view query, and acquire needed locks on 1687 * the relations it mentions. Force at least RowShareLock for all such 1688 * rels if there's a FOR [KEY] UPDATE/SHARE clause affecting this view. 1689 */ 1690 rule_action = copyObject(linitial(rule->actions)); 1691 1692 AcquireRewriteLocks(rule_action, true, (rc != NULL)); 1693 1694 /* 1695 * If FOR [KEY] UPDATE/SHARE of view, mark all the contained tables as 1696 * implicit FOR [KEY] UPDATE/SHARE, the same as the parser would have done 1697 * if the view's subquery had been written out explicitly. 1698 */ 1699 if (rc != NULL) 1700 markQueryForLocking(rule_action, (Node *) rule_action->jointree, 1701 rc->strength, rc->waitPolicy, true); 1702 1703 /* 1704 * Recursively expand any view references inside the view. 1705 * 1706 * Note: this must happen after markQueryForLocking. That way, any UPDATE 1707 * permission bits needed for sub-views are initially applied to their 1708 * RTE_RELATION RTEs by markQueryForLocking, and then transferred to their 1709 * OLD rangetable entries by the action below (in a recursive call of this 1710 * routine). 1711 */ 1712 rule_action = fireRIRrules(rule_action, activeRIRs); 1713 1714 /* 1715 * Now, plug the view query in as a subselect, replacing the relation's 1716 * original RTE. 1717 */ 1718 rte = rt_fetch(rt_index, parsetree->rtable); 1719 1720 rte->rtekind = RTE_SUBQUERY; 1721 rte->relid = InvalidOid; 1722 rte->security_barrier = RelationIsSecurityView(relation); 1723 rte->subquery = rule_action; 1724 rte->inh = false; /* must not be set for a subquery */ 1725 1726 /* 1727 * We move the view's permission check data down to its rangetable. The 1728 * checks will actually be done against the OLD entry therein. 1729 */ 1730 subrte = rt_fetch(PRS2_OLD_VARNO, rule_action->rtable); 1731 Assert(subrte->relid == relation->rd_id); 1732 subrte->requiredPerms = rte->requiredPerms; 1733 subrte->checkAsUser = rte->checkAsUser; 1734 subrte->selectedCols = rte->selectedCols; 1735 subrte->insertedCols = rte->insertedCols; 1736 subrte->updatedCols = rte->updatedCols; 1737 1738 rte->requiredPerms = 0; /* no permission check on subquery itself */ 1739 rte->checkAsUser = InvalidOid; 1740 rte->selectedCols = NULL; 1741 rte->insertedCols = NULL; 1742 rte->updatedCols = NULL; 1743 1744 return parsetree; 1745 } 1746 1747 /* 1748 * Recursively mark all relations used by a view as FOR [KEY] UPDATE/SHARE. 1749 * 1750 * This may generate an invalid query, eg if some sub-query uses an 1751 * aggregate. We leave it to the planner to detect that. 1752 * 1753 * NB: this must agree with the parser's transformLockingClause() routine. 1754 * However, unlike the parser we have to be careful not to mark a view's 1755 * OLD and NEW rels for updating. The best way to handle that seems to be 1756 * to scan the jointree to determine which rels are used. 1757 */ 1758 static void 1759 markQueryForLocking(Query *qry, Node *jtnode, 1760 LockClauseStrength strength, LockWaitPolicy waitPolicy, 1761 bool pushedDown) 1762 { 1763 if (jtnode == NULL) 1764 return; 1765 if (IsA(jtnode, RangeTblRef)) 1766 { 1767 int rti = ((RangeTblRef *) jtnode)->rtindex; 1768 RangeTblEntry *rte = rt_fetch(rti, qry->rtable); 1769 1770 if (rte->rtekind == RTE_RELATION) 1771 { 1772 applyLockingClause(qry, rti, strength, waitPolicy, pushedDown); 1773 rte->requiredPerms |= ACL_SELECT_FOR_UPDATE; 1774 } 1775 else if (rte->rtekind == RTE_SUBQUERY) 1776 { 1777 applyLockingClause(qry, rti, strength, waitPolicy, pushedDown); 1778 /* FOR UPDATE/SHARE of subquery is propagated to subquery's rels */ 1779 markQueryForLocking(rte->subquery, (Node *) rte->subquery->jointree, 1780 strength, waitPolicy, true); 1781 } 1782 /* other RTE types are unaffected by FOR UPDATE */ 1783 } 1784 else if (IsA(jtnode, FromExpr)) 1785 { 1786 FromExpr *f = (FromExpr *) jtnode; 1787 ListCell *l; 1788 1789 foreach(l, f->fromlist) 1790 markQueryForLocking(qry, lfirst(l), strength, waitPolicy, pushedDown); 1791 } 1792 else if (IsA(jtnode, JoinExpr)) 1793 { 1794 JoinExpr *j = (JoinExpr *) jtnode; 1795 1796 markQueryForLocking(qry, j->larg, strength, waitPolicy, pushedDown); 1797 markQueryForLocking(qry, j->rarg, strength, waitPolicy, pushedDown); 1798 } 1799 else 1800 elog(ERROR, "unrecognized node type: %d", 1801 (int) nodeTag(jtnode)); 1802 } 1803 1804 1805 /* 1806 * fireRIRonSubLink - 1807 * Apply fireRIRrules() to each SubLink (subselect in expression) found 1808 * in the given tree. 1809 * 1810 * NOTE: although this has the form of a walker, we cheat and modify the 1811 * SubLink nodes in-place. It is caller's responsibility to ensure that 1812 * no unwanted side-effects occur! 1813 * 1814 * This is unlike most of the other routines that recurse into subselects, 1815 * because we must take control at the SubLink node in order to replace 1816 * the SubLink's subselect link with the possibly-rewritten subquery. 1817 */ 1818 static bool 1819 fireRIRonSubLink(Node *node, List *activeRIRs) 1820 { 1821 if (node == NULL) 1822 return false; 1823 if (IsA(node, SubLink)) 1824 { 1825 SubLink *sub = (SubLink *) node; 1826 1827 /* Do what we came for */ 1828 sub->subselect = (Node *) fireRIRrules((Query *) sub->subselect, 1829 activeRIRs); 1830 /* Fall through to process lefthand args of SubLink */ 1831 } 1832 1833 /* 1834 * Do NOT recurse into Query nodes, because fireRIRrules already processed 1835 * subselects of subselects for us. 1836 */ 1837 return expression_tree_walker(node, fireRIRonSubLink, 1838 (void *) activeRIRs); 1839 } 1840 1841 1842 /* 1843 * fireRIRrules - 1844 * Apply all RIR rules on each rangetable entry in the given query 1845 * 1846 * activeRIRs is a list of the OIDs of views we're already processing RIR 1847 * rules for, used to detect/reject recursion. 1848 */ 1849 static Query * 1850 fireRIRrules(Query *parsetree, List *activeRIRs) 1851 { 1852 int origResultRelation = parsetree->resultRelation; 1853 int rt_index; 1854 ListCell *lc; 1855 1856 /* 1857 * don't try to convert this into a foreach loop, because rtable list can 1858 * get changed each time through... 1859 */ 1860 rt_index = 0; 1861 while (rt_index < list_length(parsetree->rtable)) 1862 { 1863 RangeTblEntry *rte; 1864 Relation rel; 1865 List *locks; 1866 RuleLock *rules; 1867 RewriteRule *rule; 1868 int i; 1869 1870 ++rt_index; 1871 1872 rte = rt_fetch(rt_index, parsetree->rtable); 1873 1874 /* 1875 * A subquery RTE can't have associated rules, so there's nothing to 1876 * do to this level of the query, but we must recurse into the 1877 * subquery to expand any rule references in it. 1878 */ 1879 if (rte->rtekind == RTE_SUBQUERY) 1880 { 1881 rte->subquery = fireRIRrules(rte->subquery, activeRIRs); 1882 continue; 1883 } 1884 1885 /* 1886 * Joins and other non-relation RTEs can be ignored completely. 1887 */ 1888 if (rte->rtekind != RTE_RELATION) 1889 continue; 1890 1891 /* 1892 * Always ignore RIR rules for materialized views referenced in 1893 * queries. (This does not prevent refreshing MVs, since they aren't 1894 * referenced in their own query definitions.) 1895 * 1896 * Note: in the future we might want to allow MVs to be conditionally 1897 * expanded as if they were regular views, if they are not scannable. 1898 * In that case this test would need to be postponed till after we've 1899 * opened the rel, so that we could check its state. 1900 */ 1901 if (rte->relkind == RELKIND_MATVIEW) 1902 continue; 1903 1904 /* 1905 * In INSERT ... ON CONFLICT, ignore the EXCLUDED pseudo-relation; 1906 * even if it points to a view, we needn't expand it, and should not 1907 * because we want the RTE to remain of RTE_RELATION type. Otherwise, 1908 * it would get changed to RTE_SUBQUERY type, which is an 1909 * untested/unsupported situation. 1910 */ 1911 if (parsetree->onConflict && 1912 rt_index == parsetree->onConflict->exclRelIndex) 1913 continue; 1914 1915 /* 1916 * If the table is not referenced in the query, then we ignore it. 1917 * This prevents infinite expansion loop due to new rtable entries 1918 * inserted by expansion of a rule. A table is referenced if it is 1919 * part of the join set (a source table), or is referenced by any Var 1920 * nodes, or is the result table. 1921 */ 1922 if (rt_index != parsetree->resultRelation && 1923 !rangeTableEntry_used((Node *) parsetree, rt_index, 0)) 1924 continue; 1925 1926 /* 1927 * Also, if this is a new result relation introduced by 1928 * ApplyRetrieveRule, we don't want to do anything more with it. 1929 */ 1930 if (rt_index == parsetree->resultRelation && 1931 rt_index != origResultRelation) 1932 continue; 1933 1934 /* 1935 * We can use NoLock here since either the parser or 1936 * AcquireRewriteLocks should have locked the rel already. 1937 */ 1938 rel = heap_open(rte->relid, NoLock); 1939 1940 /* 1941 * Collect the RIR rules that we must apply 1942 */ 1943 rules = rel->rd_rules; 1944 if (rules != NULL) 1945 { 1946 locks = NIL; 1947 for (i = 0; i < rules->numLocks; i++) 1948 { 1949 rule = rules->rules[i]; 1950 if (rule->event != CMD_SELECT) 1951 continue; 1952 1953 locks = lappend(locks, rule); 1954 } 1955 1956 /* 1957 * If we found any, apply them --- but first check for recursion! 1958 */ 1959 if (locks != NIL) 1960 { 1961 ListCell *l; 1962 1963 if (list_member_oid(activeRIRs, RelationGetRelid(rel))) 1964 ereport(ERROR, 1965 (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), 1966 errmsg("infinite recursion detected in rules for relation \"%s\"", 1967 RelationGetRelationName(rel)))); 1968 activeRIRs = lcons_oid(RelationGetRelid(rel), activeRIRs); 1969 1970 foreach(l, locks) 1971 { 1972 rule = lfirst(l); 1973 1974 parsetree = ApplyRetrieveRule(parsetree, 1975 rule, 1976 rt_index, 1977 rel, 1978 activeRIRs); 1979 } 1980 1981 activeRIRs = list_delete_first(activeRIRs); 1982 } 1983 } 1984 1985 heap_close(rel, NoLock); 1986 } 1987 1988 /* Recurse into subqueries in WITH */ 1989 foreach(lc, parsetree->cteList) 1990 { 1991 CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); 1992 1993 cte->ctequery = (Node *) 1994 fireRIRrules((Query *) cte->ctequery, activeRIRs); 1995 } 1996 1997 /* 1998 * Recurse into sublink subqueries, too. But we already did the ones in 1999 * the rtable and cteList. 2000 */ 2001 if (parsetree->hasSubLinks) 2002 query_tree_walker(parsetree, fireRIRonSubLink, (void *) activeRIRs, 2003 QTW_IGNORE_RC_SUBQUERIES); 2004 2005 /* 2006 * Apply any row level security policies. We do this last because it 2007 * requires special recursion detection if the new quals have sublink 2008 * subqueries, and if we did it in the loop above query_tree_walker would 2009 * then recurse into those quals a second time. 2010 */ 2011 rt_index = 0; 2012 foreach(lc, parsetree->rtable) 2013 { 2014 RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); 2015 Relation rel; 2016 List *securityQuals; 2017 List *withCheckOptions; 2018 bool hasRowSecurity; 2019 bool hasSubLinks; 2020 2021 ++rt_index; 2022 2023 /* Only normal relations can have RLS policies */ 2024 if (rte->rtekind != RTE_RELATION || 2025 (rte->relkind != RELKIND_RELATION && 2026 rte->relkind != RELKIND_PARTITIONED_TABLE)) 2027 continue; 2028 2029 rel = heap_open(rte->relid, NoLock); 2030 2031 /* 2032 * Fetch any new security quals that must be applied to this RTE. 2033 */ 2034 get_row_security_policies(parsetree, rte, rt_index, 2035 &securityQuals, &withCheckOptions, 2036 &hasRowSecurity, &hasSubLinks); 2037 2038 if (securityQuals != NIL || withCheckOptions != NIL) 2039 { 2040 if (hasSubLinks) 2041 { 2042 acquireLocksOnSubLinks_context context; 2043 2044 /* 2045 * Recursively process the new quals, checking for infinite 2046 * recursion. 2047 */ 2048 if (list_member_oid(activeRIRs, RelationGetRelid(rel))) 2049 ereport(ERROR, 2050 (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), 2051 errmsg("infinite recursion detected in policy for relation \"%s\"", 2052 RelationGetRelationName(rel)))); 2053 2054 activeRIRs = lcons_oid(RelationGetRelid(rel), activeRIRs); 2055 2056 /* 2057 * get_row_security_policies just passed back securityQuals 2058 * and/or withCheckOptions, and there were SubLinks, make sure 2059 * we lock any relations which are referenced. 2060 * 2061 * These locks would normally be acquired by the parser, but 2062 * securityQuals and withCheckOptions are added post-parsing. 2063 */ 2064 context.for_execute = true; 2065 (void) acquireLocksOnSubLinks((Node *) securityQuals, &context); 2066 (void) acquireLocksOnSubLinks((Node *) withCheckOptions, 2067 &context); 2068 2069 /* 2070 * Now that we have the locks on anything added by 2071 * get_row_security_policies, fire any RIR rules for them. 2072 */ 2073 expression_tree_walker((Node *) securityQuals, 2074 fireRIRonSubLink, (void *) activeRIRs); 2075 2076 expression_tree_walker((Node *) withCheckOptions, 2077 fireRIRonSubLink, (void *) activeRIRs); 2078 2079 activeRIRs = list_delete_first(activeRIRs); 2080 } 2081 2082 /* 2083 * Add the new security barrier quals to the start of the RTE's 2084 * list so that they get applied before any existing barrier quals 2085 * (which would have come from a security-barrier view, and should 2086 * get lower priority than RLS conditions on the table itself). 2087 */ 2088 rte->securityQuals = list_concat(securityQuals, 2089 rte->securityQuals); 2090 2091 parsetree->withCheckOptions = list_concat(withCheckOptions, 2092 parsetree->withCheckOptions); 2093 } 2094 2095 /* 2096 * Make sure the query is marked correctly if row level security 2097 * applies, or if the new quals had sublinks. 2098 */ 2099 if (hasRowSecurity) 2100 parsetree->hasRowSecurity = true; 2101 if (hasSubLinks) 2102 parsetree->hasSubLinks = true; 2103 2104 heap_close(rel, NoLock); 2105 } 2106 2107 return parsetree; 2108 } 2109 2110 2111 /* 2112 * Modify the given query by adding 'AND rule_qual IS NOT TRUE' to its 2113 * qualification. This is used to generate suitable "else clauses" for 2114 * conditional INSTEAD rules. (Unfortunately we must use "x IS NOT TRUE", 2115 * not just "NOT x" which the planner is much smarter about, else we will 2116 * do the wrong thing when the qual evaluates to NULL.) 2117 * 2118 * The rule_qual may contain references to OLD or NEW. OLD references are 2119 * replaced by references to the specified rt_index (the relation that the 2120 * rule applies to). NEW references are only possible for INSERT and UPDATE 2121 * queries on the relation itself, and so they should be replaced by copies 2122 * of the related entries in the query's own targetlist. 2123 */ 2124 static Query * 2125 CopyAndAddInvertedQual(Query *parsetree, 2126 Node *rule_qual, 2127 int rt_index, 2128 CmdType event) 2129 { 2130 /* Don't scribble on the passed qual (it's in the relcache!) */ 2131 Node *new_qual = copyObject(rule_qual); 2132 acquireLocksOnSubLinks_context context; 2133 2134 context.for_execute = true; 2135 2136 /* 2137 * In case there are subqueries in the qual, acquire necessary locks and 2138 * fix any deleted JOIN RTE entries. (This is somewhat redundant with 2139 * rewriteRuleAction, but not entirely ... consider restructuring so that 2140 * we only need to process the qual this way once.) 2141 */ 2142 (void) acquireLocksOnSubLinks(new_qual, &context); 2143 2144 /* Fix references to OLD */ 2145 ChangeVarNodes(new_qual, PRS2_OLD_VARNO, rt_index, 0); 2146 /* Fix references to NEW */ 2147 if (event == CMD_INSERT || event == CMD_UPDATE) 2148 new_qual = ReplaceVarsFromTargetList(new_qual, 2149 PRS2_NEW_VARNO, 2150 0, 2151 rt_fetch(rt_index, 2152 parsetree->rtable), 2153 parsetree->targetList, 2154 (event == CMD_UPDATE) ? 2155 REPLACEVARS_CHANGE_VARNO : 2156 REPLACEVARS_SUBSTITUTE_NULL, 2157 rt_index, 2158 &parsetree->hasSubLinks); 2159 /* And attach the fixed qual */ 2160 AddInvertedQual(parsetree, new_qual); 2161 2162 return parsetree; 2163 } 2164 2165 2166 /* 2167 * fireRules - 2168 * Iterate through rule locks applying rules. 2169 * 2170 * Input arguments: 2171 * parsetree - original query 2172 * rt_index - RT index of result relation in original query 2173 * event - type of rule event 2174 * locks - list of rules to fire 2175 * Output arguments: 2176 * *instead_flag - set true if any unqualified INSTEAD rule is found 2177 * (must be initialized to false) 2178 * *returning_flag - set true if we rewrite RETURNING clause in any rule 2179 * (must be initialized to false) 2180 * *qual_product - filled with modified original query if any qualified 2181 * INSTEAD rule is found (must be initialized to NULL) 2182 * Return value: 2183 * list of rule actions adjusted for use with this query 2184 * 2185 * Qualified INSTEAD rules generate their action with the qualification 2186 * condition added. They also generate a modified version of the original 2187 * query with the negated qualification added, so that it will run only for 2188 * rows that the qualified action doesn't act on. (If there are multiple 2189 * qualified INSTEAD rules, we AND all the negated quals onto a single 2190 * modified original query.) We won't execute the original, unmodified 2191 * query if we find either qualified or unqualified INSTEAD rules. If 2192 * we find both, the modified original query is discarded too. 2193 */ 2194 static List * 2195 fireRules(Query *parsetree, 2196 int rt_index, 2197 CmdType event, 2198 List *locks, 2199 bool *instead_flag, 2200 bool *returning_flag, 2201 Query **qual_product) 2202 { 2203 List *results = NIL; 2204 ListCell *l; 2205 2206 foreach(l, locks) 2207 { 2208 RewriteRule *rule_lock = (RewriteRule *) lfirst(l); 2209 Node *event_qual = rule_lock->qual; 2210 List *actions = rule_lock->actions; 2211 QuerySource qsrc; 2212 ListCell *r; 2213 2214 /* Determine correct QuerySource value for actions */ 2215 if (rule_lock->isInstead) 2216 { 2217 if (event_qual != NULL) 2218 qsrc = QSRC_QUAL_INSTEAD_RULE; 2219 else 2220 { 2221 qsrc = QSRC_INSTEAD_RULE; 2222 *instead_flag = true; /* report unqualified INSTEAD */ 2223 } 2224 } 2225 else 2226 qsrc = QSRC_NON_INSTEAD_RULE; 2227 2228 if (qsrc == QSRC_QUAL_INSTEAD_RULE) 2229 { 2230 /* 2231 * If there are INSTEAD rules with qualifications, the original 2232 * query is still performed. But all the negated rule 2233 * qualifications of the INSTEAD rules are added so it does its 2234 * actions only in cases where the rule quals of all INSTEAD rules 2235 * are false. Think of it as the default action in a case. We save 2236 * this in *qual_product so RewriteQuery() can add it to the query 2237 * list after we mangled it up enough. 2238 * 2239 * If we have already found an unqualified INSTEAD rule, then 2240 * *qual_product won't be used, so don't bother building it. 2241 */ 2242 if (!*instead_flag) 2243 { 2244 if (*qual_product == NULL) 2245 *qual_product = copyObject(parsetree); 2246 *qual_product = CopyAndAddInvertedQual(*qual_product, 2247 event_qual, 2248 rt_index, 2249 event); 2250 } 2251 } 2252 2253 /* Now process the rule's actions and add them to the result list */ 2254 foreach(r, actions) 2255 { 2256 Query *rule_action = lfirst(r); 2257 2258 if (rule_action->commandType == CMD_NOTHING) 2259 continue; 2260 2261 rule_action = rewriteRuleAction(parsetree, rule_action, 2262 event_qual, rt_index, event, 2263 returning_flag); 2264 2265 rule_action->querySource = qsrc; 2266 rule_action->canSetTag = false; /* might change later */ 2267 2268 results = lappend(results, rule_action); 2269 } 2270 } 2271 2272 return results; 2273 } 2274 2275 2276 /* 2277 * get_view_query - get the Query from a view's _RETURN rule. 2278 * 2279 * Caller should have verified that the relation is a view, and therefore 2280 * we should find an ON SELECT action. 2281 * 2282 * Note that the pointer returned is into the relcache and therefore must 2283 * be treated as read-only to the caller and not modified or scribbled on. 2284 */ 2285 Query * 2286 get_view_query(Relation view) 2287 { 2288 int i; 2289 2290 Assert(view->rd_rel->relkind == RELKIND_VIEW); 2291 2292 for (i = 0; i < view->rd_rules->numLocks; i++) 2293 { 2294 RewriteRule *rule = view->rd_rules->rules[i]; 2295 2296 if (rule->event == CMD_SELECT) 2297 { 2298 /* A _RETURN rule should have only one action */ 2299 if (list_length(rule->actions) != 1) 2300 elog(ERROR, "invalid _RETURN rule action specification"); 2301 2302 return (Query *) linitial(rule->actions); 2303 } 2304 } 2305 2306 elog(ERROR, "failed to find _RETURN rule for view"); 2307 return NULL; /* keep compiler quiet */ 2308 } 2309 2310 2311 /* 2312 * view_has_instead_trigger - does view have an INSTEAD OF trigger for event? 2313 * 2314 * If it does, we don't want to treat it as auto-updatable. This test can't 2315 * be folded into view_query_is_auto_updatable because it's not an error 2316 * condition. 2317 */ 2318 static bool 2319 view_has_instead_trigger(Relation view, CmdType event) 2320 { 2321 TriggerDesc *trigDesc = view->trigdesc; 2322 2323 switch (event) 2324 { 2325 case CMD_INSERT: 2326 if (trigDesc && trigDesc->trig_insert_instead_row) 2327 return true; 2328 break; 2329 case CMD_UPDATE: 2330 if (trigDesc && trigDesc->trig_update_instead_row) 2331 return true; 2332 break; 2333 case CMD_DELETE: 2334 if (trigDesc && trigDesc->trig_delete_instead_row) 2335 return true; 2336 break; 2337 default: 2338 elog(ERROR, "unrecognized CmdType: %d", (int) event); 2339 break; 2340 } 2341 return false; 2342 } 2343 2344 2345 /* 2346 * view_col_is_auto_updatable - test whether the specified column of a view 2347 * is auto-updatable. Returns NULL (if the column can be updated) or a message 2348 * string giving the reason that it cannot be. 2349 * 2350 * The returned string has not been translated; if it is shown as an error 2351 * message, the caller should apply _() to translate it. 2352 * 2353 * Note that the checks performed here are local to this view. We do not check 2354 * whether the referenced column of the underlying base relation is updatable. 2355 */ 2356 static const char * 2357 view_col_is_auto_updatable(RangeTblRef *rtr, TargetEntry *tle) 2358 { 2359 Var *var = (Var *) tle->expr; 2360 2361 /* 2362 * For now, the only updatable columns we support are those that are Vars 2363 * referring to user columns of the underlying base relation. 2364 * 2365 * The view targetlist may contain resjunk columns (e.g., a view defined 2366 * like "SELECT * FROM t ORDER BY a+b" is auto-updatable) but such columns 2367 * are not auto-updatable, and in fact should never appear in the outer 2368 * query's targetlist. 2369 */ 2370 if (tle->resjunk) 2371 return gettext_noop("Junk view columns are not updatable."); 2372 2373 if (!IsA(var, Var) || 2374 var->varno != rtr->rtindex || 2375 var->varlevelsup != 0) 2376 return gettext_noop("View columns that are not columns of their base relation are not updatable."); 2377 2378 if (var->varattno < 0) 2379 return gettext_noop("View columns that refer to system columns are not updatable."); 2380 2381 if (var->varattno == 0) 2382 return gettext_noop("View columns that return whole-row references are not updatable."); 2383 2384 return NULL; /* the view column is updatable */ 2385 } 2386 2387 2388 /* 2389 * view_query_is_auto_updatable - test whether the specified view definition 2390 * represents an auto-updatable view. Returns NULL (if the view can be updated) 2391 * or a message string giving the reason that it cannot be. 2392 2393 * The returned string has not been translated; if it is shown as an error 2394 * message, the caller should apply _() to translate it. 2395 * 2396 * If check_cols is true, the view is required to have at least one updatable 2397 * column (necessary for INSERT/UPDATE). Otherwise the view's columns are not 2398 * checked for updatability. See also view_cols_are_auto_updatable. 2399 * 2400 * Note that the checks performed here are only based on the view definition. 2401 * We do not check whether any base relations referred to by the view are 2402 * updatable. 2403 */ 2404 const char * 2405 view_query_is_auto_updatable(Query *viewquery, bool check_cols) 2406 { 2407 RangeTblRef *rtr; 2408 RangeTblEntry *base_rte; 2409 2410 /*---------- 2411 * Check if the view is simply updatable. According to SQL-92 this means: 2412 * - No DISTINCT clause. 2413 * - Each TLE is a column reference, and each column appears at most once. 2414 * - FROM contains exactly one base relation. 2415 * - No GROUP BY or HAVING clauses. 2416 * - No set operations (UNION, INTERSECT or EXCEPT). 2417 * - No sub-queries in the WHERE clause that reference the target table. 2418 * 2419 * We ignore that last restriction since it would be complex to enforce 2420 * and there isn't any actual benefit to disallowing sub-queries. (The 2421 * semantic issues that the standard is presumably concerned about don't 2422 * arise in Postgres, since any such sub-query will not see any updates 2423 * executed by the outer query anyway, thanks to MVCC snapshotting.) 2424 * 2425 * We also relax the second restriction by supporting part of SQL:1999 2426 * feature T111, which allows for a mix of updatable and non-updatable 2427 * columns, provided that an INSERT or UPDATE doesn't attempt to assign to 2428 * a non-updatable column. 2429 * 2430 * In addition we impose these constraints, involving features that are 2431 * not part of SQL-92: 2432 * - No CTEs (WITH clauses). 2433 * - No OFFSET or LIMIT clauses (this matches a SQL:2008 restriction). 2434 * - No system columns (including whole-row references) in the tlist. 2435 * - No window functions in the tlist. 2436 * - No set-returning functions in the tlist. 2437 * 2438 * Note that we do these checks without recursively expanding the view. 2439 * If the base relation is a view, we'll recursively deal with it later. 2440 *---------- 2441 */ 2442 if (viewquery->distinctClause != NIL) 2443 return gettext_noop("Views containing DISTINCT are not automatically updatable."); 2444 2445 if (viewquery->groupClause != NIL || viewquery->groupingSets) 2446 return gettext_noop("Views containing GROUP BY are not automatically updatable."); 2447 2448 if (viewquery->havingQual != NULL) 2449 return gettext_noop("Views containing HAVING are not automatically updatable."); 2450 2451 if (viewquery->setOperations != NULL) 2452 return gettext_noop("Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable."); 2453 2454 if (viewquery->cteList != NIL) 2455 return gettext_noop("Views containing WITH are not automatically updatable."); 2456 2457 if (viewquery->limitOffset != NULL || viewquery->limitCount != NULL) 2458 return gettext_noop("Views containing LIMIT or OFFSET are not automatically updatable."); 2459 2460 /* 2461 * We must not allow window functions or set returning functions in the 2462 * targetlist. Otherwise we might end up inserting them into the quals of 2463 * the main query. We must also check for aggregates in the targetlist in 2464 * case they appear without a GROUP BY. 2465 * 2466 * These restrictions ensure that each row of the view corresponds to a 2467 * unique row in the underlying base relation. 2468 */ 2469 if (viewquery->hasAggs) 2470 return gettext_noop("Views that return aggregate functions are not automatically updatable."); 2471 2472 if (viewquery->hasWindowFuncs) 2473 return gettext_noop("Views that return window functions are not automatically updatable."); 2474 2475 if (viewquery->hasTargetSRFs) 2476 return gettext_noop("Views that return set-returning functions are not automatically updatable."); 2477 2478 /* 2479 * The view query should select from a single base relation, which must be 2480 * a table or another view. 2481 */ 2482 if (list_length(viewquery->jointree->fromlist) != 1) 2483 return gettext_noop("Views that do not select from a single table or view are not automatically updatable."); 2484 2485 rtr = (RangeTblRef *) linitial(viewquery->jointree->fromlist); 2486 if (!IsA(rtr, RangeTblRef)) 2487 return gettext_noop("Views that do not select from a single table or view are not automatically updatable."); 2488 2489 base_rte = rt_fetch(rtr->rtindex, viewquery->rtable); 2490 if (base_rte->rtekind != RTE_RELATION || 2491 (base_rte->relkind != RELKIND_RELATION && 2492 base_rte->relkind != RELKIND_FOREIGN_TABLE && 2493 base_rte->relkind != RELKIND_VIEW && 2494 base_rte->relkind != RELKIND_PARTITIONED_TABLE)) 2495 return gettext_noop("Views that do not select from a single table or view are not automatically updatable."); 2496 2497 if (base_rte->tablesample) 2498 return gettext_noop("Views containing TABLESAMPLE are not automatically updatable."); 2499 2500 /* 2501 * Check that the view has at least one updatable column. This is required 2502 * for INSERT/UPDATE but not for DELETE. 2503 */ 2504 if (check_cols) 2505 { 2506 ListCell *cell; 2507 bool found; 2508 2509 found = false; 2510 foreach(cell, viewquery->targetList) 2511 { 2512 TargetEntry *tle = (TargetEntry *) lfirst(cell); 2513 2514 if (view_col_is_auto_updatable(rtr, tle) == NULL) 2515 { 2516 found = true; 2517 break; 2518 } 2519 } 2520 2521 if (!found) 2522 return gettext_noop("Views that have no updatable columns are not automatically updatable."); 2523 } 2524 2525 return NULL; /* the view is updatable */ 2526 } 2527 2528 2529 /* 2530 * view_cols_are_auto_updatable - test whether all of the required columns of 2531 * an auto-updatable view are actually updatable. Returns NULL (if all the 2532 * required columns can be updated) or a message string giving the reason that 2533 * they cannot be. 2534 * 2535 * The returned string has not been translated; if it is shown as an error 2536 * message, the caller should apply _() to translate it. 2537 * 2538 * This should be used for INSERT/UPDATE to ensure that we don't attempt to 2539 * assign to any non-updatable columns. 2540 * 2541 * Additionally it may be used to retrieve the set of updatable columns in the 2542 * view, or if one or more of the required columns is not updatable, the name 2543 * of the first offending non-updatable column. 2544 * 2545 * The caller must have already verified that this is an auto-updatable view 2546 * using view_query_is_auto_updatable. 2547 * 2548 * Note that the checks performed here are only based on the view definition. 2549 * We do not check whether the referenced columns of the base relation are 2550 * updatable. 2551 */ 2552 static const char * 2553 view_cols_are_auto_updatable(Query *viewquery, 2554 Bitmapset *required_cols, 2555 Bitmapset **updatable_cols, 2556 char **non_updatable_col) 2557 { 2558 RangeTblRef *rtr; 2559 AttrNumber col; 2560 ListCell *cell; 2561 2562 /* 2563 * The caller should have verified that this view is auto-updatable and so 2564 * there should be a single base relation. 2565 */ 2566 Assert(list_length(viewquery->jointree->fromlist) == 1); 2567 rtr = linitial_node(RangeTblRef, viewquery->jointree->fromlist); 2568 2569 /* Initialize the optional return values */ 2570 if (updatable_cols != NULL) 2571 *updatable_cols = NULL; 2572 if (non_updatable_col != NULL) 2573 *non_updatable_col = NULL; 2574 2575 /* Test each view column for updatability */ 2576 col = -FirstLowInvalidHeapAttributeNumber; 2577 foreach(cell, viewquery->targetList) 2578 { 2579 TargetEntry *tle = (TargetEntry *) lfirst(cell); 2580 const char *col_update_detail; 2581 2582 col++; 2583 col_update_detail = view_col_is_auto_updatable(rtr, tle); 2584 2585 if (col_update_detail == NULL) 2586 { 2587 /* The column is updatable */ 2588 if (updatable_cols != NULL) 2589 *updatable_cols = bms_add_member(*updatable_cols, col); 2590 } 2591 else if (bms_is_member(col, required_cols)) 2592 { 2593 /* The required column is not updatable */ 2594 if (non_updatable_col != NULL) 2595 *non_updatable_col = tle->resname; 2596 return col_update_detail; 2597 } 2598 } 2599 2600 return NULL; /* all the required view columns are updatable */ 2601 } 2602 2603 2604 /* 2605 * relation_is_updatable - determine which update events the specified 2606 * relation supports. 2607 * 2608 * Note that views may contain a mix of updatable and non-updatable columns. 2609 * For a view to support INSERT/UPDATE it must have at least one updatable 2610 * column, but there is no such restriction for DELETE. If include_cols is 2611 * non-NULL, then only the specified columns are considered when testing for 2612 * updatability. 2613 * 2614 * Unlike the preceding functions, this does recurse to look at a view's 2615 * base relations, so it needs to detect recursion. To do that, we pass 2616 * a list of currently-considered outer relations. External callers need 2617 * only pass NIL. 2618 * 2619 * This is used for the information_schema views, which have separate concepts 2620 * of "updatable" and "trigger updatable". A relation is "updatable" if it 2621 * can be updated without the need for triggers (either because it has a 2622 * suitable RULE, or because it is simple enough to be automatically updated). 2623 * A relation is "trigger updatable" if it has a suitable INSTEAD OF trigger. 2624 * The SQL standard regards this as not necessarily updatable, presumably 2625 * because there is no way of knowing what the trigger will actually do. 2626 * The information_schema views therefore call this function with 2627 * include_triggers = false. However, other callers might only care whether 2628 * data-modifying SQL will work, so they can pass include_triggers = true 2629 * to have trigger updatability included in the result. 2630 * 2631 * The return value is a bitmask of rule event numbers indicating which of 2632 * the INSERT, UPDATE and DELETE operations are supported. (We do it this way 2633 * so that we can test for UPDATE plus DELETE support in a single call.) 2634 */ 2635 int 2636 relation_is_updatable(Oid reloid, 2637 List *outer_reloids, 2638 bool include_triggers, 2639 Bitmapset *include_cols) 2640 { 2641 int events = 0; 2642 Relation rel; 2643 RuleLock *rulelocks; 2644 2645 #define ALL_EVENTS ((1 << CMD_INSERT) | (1 << CMD_UPDATE) | (1 << CMD_DELETE)) 2646 2647 /* Since this function recurses, it could be driven to stack overflow */ 2648 check_stack_depth(); 2649 2650 rel = try_relation_open(reloid, AccessShareLock); 2651 2652 /* 2653 * If the relation doesn't exist, return zero rather than throwing an 2654 * error. This is helpful since scanning an information_schema view under 2655 * MVCC rules can result in referencing rels that have actually been 2656 * deleted already. 2657 */ 2658 if (rel == NULL) 2659 return 0; 2660 2661 /* If we detect a recursive view, report that it is not updatable */ 2662 if (list_member_oid(outer_reloids, RelationGetRelid(rel))) 2663 { 2664 relation_close(rel, AccessShareLock); 2665 return 0; 2666 } 2667 2668 /* If the relation is a table, it is always updatable */ 2669 if (rel->rd_rel->relkind == RELKIND_RELATION || 2670 rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) 2671 { 2672 relation_close(rel, AccessShareLock); 2673 return ALL_EVENTS; 2674 } 2675 2676 /* Look for unconditional DO INSTEAD rules, and note supported events */ 2677 rulelocks = rel->rd_rules; 2678 if (rulelocks != NULL) 2679 { 2680 int i; 2681 2682 for (i = 0; i < rulelocks->numLocks; i++) 2683 { 2684 if (rulelocks->rules[i]->isInstead && 2685 rulelocks->rules[i]->qual == NULL) 2686 { 2687 events |= ((1 << rulelocks->rules[i]->event) & ALL_EVENTS); 2688 } 2689 } 2690 2691 /* If we have rules for all events, we're done */ 2692 if (events == ALL_EVENTS) 2693 { 2694 relation_close(rel, AccessShareLock); 2695 return events; 2696 } 2697 } 2698 2699 /* Similarly look for INSTEAD OF triggers, if they are to be included */ 2700 if (include_triggers) 2701 { 2702 TriggerDesc *trigDesc = rel->trigdesc; 2703 2704 if (trigDesc) 2705 { 2706 if (trigDesc->trig_insert_instead_row) 2707 events |= (1 << CMD_INSERT); 2708 if (trigDesc->trig_update_instead_row) 2709 events |= (1 << CMD_UPDATE); 2710 if (trigDesc->trig_delete_instead_row) 2711 events |= (1 << CMD_DELETE); 2712 2713 /* If we have triggers for all events, we're done */ 2714 if (events == ALL_EVENTS) 2715 { 2716 relation_close(rel, AccessShareLock); 2717 return events; 2718 } 2719 } 2720 } 2721 2722 /* If this is a foreign table, check which update events it supports */ 2723 if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE) 2724 { 2725 FdwRoutine *fdwroutine = GetFdwRoutineForRelation(rel, false); 2726 2727 if (fdwroutine->IsForeignRelUpdatable != NULL) 2728 events |= fdwroutine->IsForeignRelUpdatable(rel); 2729 else 2730 { 2731 /* Assume presence of executor functions is sufficient */ 2732 if (fdwroutine->ExecForeignInsert != NULL) 2733 events |= (1 << CMD_INSERT); 2734 if (fdwroutine->ExecForeignUpdate != NULL) 2735 events |= (1 << CMD_UPDATE); 2736 if (fdwroutine->ExecForeignDelete != NULL) 2737 events |= (1 << CMD_DELETE); 2738 } 2739 2740 relation_close(rel, AccessShareLock); 2741 return events; 2742 } 2743 2744 /* Check if this is an automatically updatable view */ 2745 if (rel->rd_rel->relkind == RELKIND_VIEW) 2746 { 2747 Query *viewquery = get_view_query(rel); 2748 2749 if (view_query_is_auto_updatable(viewquery, false) == NULL) 2750 { 2751 Bitmapset *updatable_cols; 2752 int auto_events; 2753 RangeTblRef *rtr; 2754 RangeTblEntry *base_rte; 2755 Oid baseoid; 2756 2757 /* 2758 * Determine which of the view's columns are updatable. If there 2759 * are none within the set of columns we are looking at, then the 2760 * view doesn't support INSERT/UPDATE, but it may still support 2761 * DELETE. 2762 */ 2763 view_cols_are_auto_updatable(viewquery, NULL, 2764 &updatable_cols, NULL); 2765 2766 if (include_cols != NULL) 2767 updatable_cols = bms_int_members(updatable_cols, include_cols); 2768 2769 if (bms_is_empty(updatable_cols)) 2770 auto_events = (1 << CMD_DELETE); /* May support DELETE */ 2771 else 2772 auto_events = ALL_EVENTS; /* May support all events */ 2773 2774 /* 2775 * The base relation must also support these update commands. 2776 * Tables are always updatable, but for any other kind of base 2777 * relation we must do a recursive check limited to the columns 2778 * referenced by the locally updatable columns in this view. 2779 */ 2780 rtr = (RangeTblRef *) linitial(viewquery->jointree->fromlist); 2781 base_rte = rt_fetch(rtr->rtindex, viewquery->rtable); 2782 Assert(base_rte->rtekind == RTE_RELATION); 2783 2784 if (base_rte->relkind != RELKIND_RELATION && 2785 base_rte->relkind != RELKIND_PARTITIONED_TABLE) 2786 { 2787 baseoid = base_rte->relid; 2788 outer_reloids = lcons_oid(RelationGetRelid(rel), 2789 outer_reloids); 2790 include_cols = adjust_view_column_set(updatable_cols, 2791 viewquery->targetList); 2792 auto_events &= relation_is_updatable(baseoid, 2793 outer_reloids, 2794 include_triggers, 2795 include_cols); 2796 outer_reloids = list_delete_first(outer_reloids); 2797 } 2798 events |= auto_events; 2799 } 2800 } 2801 2802 /* If we reach here, the relation may support some update commands */ 2803 relation_close(rel, AccessShareLock); 2804 return events; 2805 } 2806 2807 2808 /* 2809 * adjust_view_column_set - map a set of column numbers according to targetlist 2810 * 2811 * This is used with simply-updatable views to map column-permissions sets for 2812 * the view columns onto the matching columns in the underlying base relation. 2813 * The targetlist is expected to be a list of plain Vars of the underlying 2814 * relation (as per the checks above in view_query_is_auto_updatable). 2815 */ 2816 static Bitmapset * 2817 adjust_view_column_set(Bitmapset *cols, List *targetlist) 2818 { 2819 Bitmapset *result = NULL; 2820 int col; 2821 2822 col = -1; 2823 while ((col = bms_next_member(cols, col)) >= 0) 2824 { 2825 /* bit numbers are offset by FirstLowInvalidHeapAttributeNumber */ 2826 AttrNumber attno = col + FirstLowInvalidHeapAttributeNumber; 2827 2828 if (attno == InvalidAttrNumber) 2829 { 2830 /* 2831 * There's a whole-row reference to the view. For permissions 2832 * purposes, treat it as a reference to each column available from 2833 * the view. (We should *not* convert this to a whole-row 2834 * reference to the base relation, since the view may not touch 2835 * all columns of the base relation.) 2836 */ 2837 ListCell *lc; 2838 2839 foreach(lc, targetlist) 2840 { 2841 TargetEntry *tle = lfirst_node(TargetEntry, lc); 2842 Var *var; 2843 2844 if (tle->resjunk) 2845 continue; 2846 var = castNode(Var, tle->expr); 2847 result = bms_add_member(result, 2848 var->varattno - FirstLowInvalidHeapAttributeNumber); 2849 } 2850 } 2851 else 2852 { 2853 /* 2854 * Views do not have system columns, so we do not expect to see 2855 * any other system attnos here. If we do find one, the error 2856 * case will apply. 2857 */ 2858 TargetEntry *tle = get_tle_by_resno(targetlist, attno); 2859 2860 if (tle != NULL && !tle->resjunk && IsA(tle->expr, Var)) 2861 { 2862 Var *var = (Var *) tle->expr; 2863 2864 result = bms_add_member(result, 2865 var->varattno - FirstLowInvalidHeapAttributeNumber); 2866 } 2867 else 2868 elog(ERROR, "attribute number %d not found in view targetlist", 2869 attno); 2870 } 2871 } 2872 2873 return result; 2874 } 2875 2876 2877 /* 2878 * rewriteTargetView - 2879 * Attempt to rewrite a query where the target relation is a view, so that 2880 * the view's base relation becomes the target relation. 2881 * 2882 * Note that the base relation here may itself be a view, which may or may not 2883 * have INSTEAD OF triggers or rules to handle the update. That is handled by 2884 * the recursion in RewriteQuery. 2885 */ 2886 static Query * 2887 rewriteTargetView(Query *parsetree, Relation view) 2888 { 2889 Query *viewquery; 2890 const char *auto_update_detail; 2891 RangeTblRef *rtr; 2892 int base_rt_index; 2893 int new_rt_index; 2894 RangeTblEntry *base_rte; 2895 RangeTblEntry *view_rte; 2896 RangeTblEntry *new_rte; 2897 Relation base_rel; 2898 List *view_targetlist; 2899 ListCell *lc; 2900 2901 /* 2902 * Get the Query from the view's ON SELECT rule. We're going to munge the 2903 * Query to change the view's base relation into the target relation, 2904 * along with various other changes along the way, so we need to make a 2905 * copy of it (get_view_query() returns a pointer into the relcache, so we 2906 * have to treat it as read-only). 2907 */ 2908 viewquery = copyObject(get_view_query(view)); 2909 2910 /* The view must be updatable, else fail */ 2911 auto_update_detail = 2912 view_query_is_auto_updatable(viewquery, 2913 parsetree->commandType != CMD_DELETE); 2914 2915 if (auto_update_detail) 2916 { 2917 /* messages here should match execMain.c's CheckValidResultRel */ 2918 switch (parsetree->commandType) 2919 { 2920 case CMD_INSERT: 2921 ereport(ERROR, 2922 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 2923 errmsg("cannot insert into view \"%s\"", 2924 RelationGetRelationName(view)), 2925 errdetail_internal("%s", _(auto_update_detail)), 2926 errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule."))); 2927 break; 2928 case CMD_UPDATE: 2929 ereport(ERROR, 2930 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 2931 errmsg("cannot update view \"%s\"", 2932 RelationGetRelationName(view)), 2933 errdetail_internal("%s", _(auto_update_detail)), 2934 errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule."))); 2935 break; 2936 case CMD_DELETE: 2937 ereport(ERROR, 2938 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 2939 errmsg("cannot delete from view \"%s\"", 2940 RelationGetRelationName(view)), 2941 errdetail_internal("%s", _(auto_update_detail)), 2942 errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule."))); 2943 break; 2944 default: 2945 elog(ERROR, "unrecognized CmdType: %d", 2946 (int) parsetree->commandType); 2947 break; 2948 } 2949 } 2950 2951 /* 2952 * For INSERT/UPDATE the modified columns must all be updatable. Note that 2953 * we get the modified columns from the query's targetlist, not from the 2954 * result RTE's insertedCols and/or updatedCols set, since 2955 * rewriteTargetListIU may have added additional targetlist entries for 2956 * view defaults, and these must also be updatable. 2957 */ 2958 if (parsetree->commandType != CMD_DELETE) 2959 { 2960 Bitmapset *modified_cols = NULL; 2961 char *non_updatable_col; 2962 2963 foreach(lc, parsetree->targetList) 2964 { 2965 TargetEntry *tle = (TargetEntry *) lfirst(lc); 2966 2967 if (!tle->resjunk) 2968 modified_cols = bms_add_member(modified_cols, 2969 tle->resno - FirstLowInvalidHeapAttributeNumber); 2970 } 2971 2972 if (parsetree->onConflict) 2973 { 2974 foreach(lc, parsetree->onConflict->onConflictSet) 2975 { 2976 TargetEntry *tle = (TargetEntry *) lfirst(lc); 2977 2978 if (!tle->resjunk) 2979 modified_cols = bms_add_member(modified_cols, 2980 tle->resno - FirstLowInvalidHeapAttributeNumber); 2981 } 2982 } 2983 2984 auto_update_detail = view_cols_are_auto_updatable(viewquery, 2985 modified_cols, 2986 NULL, 2987 &non_updatable_col); 2988 if (auto_update_detail) 2989 { 2990 /* 2991 * This is a different error, caused by an attempt to update a 2992 * non-updatable column in an otherwise updatable view. 2993 */ 2994 switch (parsetree->commandType) 2995 { 2996 case CMD_INSERT: 2997 ereport(ERROR, 2998 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 2999 errmsg("cannot insert into column \"%s\" of view \"%s\"", 3000 non_updatable_col, 3001 RelationGetRelationName(view)), 3002 errdetail_internal("%s", _(auto_update_detail)))); 3003 break; 3004 case CMD_UPDATE: 3005 ereport(ERROR, 3006 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3007 errmsg("cannot update column \"%s\" of view \"%s\"", 3008 non_updatable_col, 3009 RelationGetRelationName(view)), 3010 errdetail_internal("%s", _(auto_update_detail)))); 3011 break; 3012 default: 3013 elog(ERROR, "unrecognized CmdType: %d", 3014 (int) parsetree->commandType); 3015 break; 3016 } 3017 } 3018 } 3019 3020 /* Locate RTE describing the view in the outer query */ 3021 view_rte = rt_fetch(parsetree->resultRelation, parsetree->rtable); 3022 3023 /* 3024 * If we get here, view_query_is_auto_updatable() has verified that the 3025 * view contains a single base relation. 3026 */ 3027 Assert(list_length(viewquery->jointree->fromlist) == 1); 3028 rtr = linitial_node(RangeTblRef, viewquery->jointree->fromlist); 3029 3030 base_rt_index = rtr->rtindex; 3031 base_rte = rt_fetch(base_rt_index, viewquery->rtable); 3032 Assert(base_rte->rtekind == RTE_RELATION); 3033 3034 /* 3035 * Up to now, the base relation hasn't been touched at all in our query. 3036 * We need to acquire lock on it before we try to do anything with it. 3037 * (The subsequent recursive call of RewriteQuery will suppose that we 3038 * already have the right lock!) Since it will become the query target 3039 * relation, RowExclusiveLock is always the right thing. 3040 */ 3041 base_rel = heap_open(base_rte->relid, RowExclusiveLock); 3042 3043 /* 3044 * While we have the relation open, update the RTE's relkind, just in case 3045 * it changed since this view was made (cf. AcquireRewriteLocks). 3046 */ 3047 base_rte->relkind = base_rel->rd_rel->relkind; 3048 3049 /* 3050 * If the view query contains any sublink subqueries then we need to also 3051 * acquire locks on any relations they refer to. We know that there won't 3052 * be any subqueries in the range table or CTEs, so we can skip those, as 3053 * in AcquireRewriteLocks. 3054 */ 3055 if (viewquery->hasSubLinks) 3056 { 3057 acquireLocksOnSubLinks_context context; 3058 3059 context.for_execute = true; 3060 query_tree_walker(viewquery, acquireLocksOnSubLinks, &context, 3061 QTW_IGNORE_RC_SUBQUERIES); 3062 } 3063 3064 /* 3065 * Create a new target RTE describing the base relation, and add it to the 3066 * outer query's rangetable. (What's happening in the next few steps is 3067 * very much like what the planner would do to "pull up" the view into the 3068 * outer query. Perhaps someday we should refactor things enough so that 3069 * we can share code with the planner.) 3070 */ 3071 new_rte = (RangeTblEntry *) base_rte; 3072 parsetree->rtable = lappend(parsetree->rtable, new_rte); 3073 new_rt_index = list_length(parsetree->rtable); 3074 3075 /* 3076 * INSERTs never inherit. For UPDATE/DELETE, we use the view query's 3077 * inheritance flag for the base relation. 3078 */ 3079 if (parsetree->commandType == CMD_INSERT) 3080 new_rte->inh = false; 3081 3082 /* 3083 * Adjust the view's targetlist Vars to reference the new target RTE, ie 3084 * make their varnos be new_rt_index instead of base_rt_index. There can 3085 * be no Vars for other rels in the tlist, so this is sufficient to pull 3086 * up the tlist expressions for use in the outer query. The tlist will 3087 * provide the replacement expressions used by ReplaceVarsFromTargetList 3088 * below. 3089 */ 3090 view_targetlist = viewquery->targetList; 3091 3092 ChangeVarNodes((Node *) view_targetlist, 3093 base_rt_index, 3094 new_rt_index, 3095 0); 3096 3097 /* 3098 * Mark the new target RTE for the permissions checks that we want to 3099 * enforce against the view owner, as distinct from the query caller. At 3100 * the relation level, require the same INSERT/UPDATE/DELETE permissions 3101 * that the query caller needs against the view. We drop the ACL_SELECT 3102 * bit that is presumably in new_rte->requiredPerms initially. 3103 * 3104 * Note: the original view RTE remains in the query's rangetable list. 3105 * Although it will be unused in the query plan, we need it there so that 3106 * the executor still performs appropriate permissions checks for the 3107 * query caller's use of the view. 3108 */ 3109 new_rte->checkAsUser = view->rd_rel->relowner; 3110 new_rte->requiredPerms = view_rte->requiredPerms; 3111 3112 /* 3113 * Now for the per-column permissions bits. 3114 * 3115 * Initially, new_rte contains selectedCols permission check bits for all 3116 * base-rel columns referenced by the view, but since the view is a SELECT 3117 * query its insertedCols/updatedCols is empty. We set insertedCols and 3118 * updatedCols to include all the columns the outer query is trying to 3119 * modify, adjusting the column numbers as needed. But we leave 3120 * selectedCols as-is, so the view owner must have read permission for all 3121 * columns used in the view definition, even if some of them are not read 3122 * by the outer query. We could try to limit selectedCols to only columns 3123 * used in the transformed query, but that does not correspond to what 3124 * happens in ordinary SELECT usage of a view: all referenced columns must 3125 * have read permission, even if optimization finds that some of them can 3126 * be discarded during query transformation. The flattening we're doing 3127 * here is an optional optimization, too. (If you are unpersuaded and 3128 * want to change this, note that applying adjust_view_column_set to 3129 * view_rte->selectedCols is clearly *not* the right answer, since that 3130 * neglects base-rel columns used in the view's WHERE quals.) 3131 * 3132 * This step needs the modified view targetlist, so we have to do things 3133 * in this order. 3134 */ 3135 Assert(bms_is_empty(new_rte->insertedCols) && 3136 bms_is_empty(new_rte->updatedCols)); 3137 3138 new_rte->insertedCols = adjust_view_column_set(view_rte->insertedCols, 3139 view_targetlist); 3140 3141 new_rte->updatedCols = adjust_view_column_set(view_rte->updatedCols, 3142 view_targetlist); 3143 3144 /* 3145 * Move any security barrier quals from the view RTE onto the new target 3146 * RTE. Any such quals should now apply to the new target RTE and will 3147 * not reference the original view RTE in the rewritten query. 3148 */ 3149 new_rte->securityQuals = view_rte->securityQuals; 3150 view_rte->securityQuals = NIL; 3151 3152 /* 3153 * Now update all Vars in the outer query that reference the view to 3154 * reference the appropriate column of the base relation instead. 3155 */ 3156 parsetree = (Query *) 3157 ReplaceVarsFromTargetList((Node *) parsetree, 3158 parsetree->resultRelation, 3159 0, 3160 view_rte, 3161 view_targetlist, 3162 REPLACEVARS_REPORT_ERROR, 3163 0, 3164 &parsetree->hasSubLinks); 3165 3166 /* 3167 * Update all other RTI references in the query that point to the view 3168 * (for example, parsetree->resultRelation itself) to point to the new 3169 * base relation instead. Vars will not be affected since none of them 3170 * reference parsetree->resultRelation any longer. 3171 */ 3172 ChangeVarNodes((Node *) parsetree, 3173 parsetree->resultRelation, 3174 new_rt_index, 3175 0); 3176 Assert(parsetree->resultRelation == new_rt_index); 3177 3178 /* 3179 * For INSERT/UPDATE we must also update resnos in the targetlist to refer 3180 * to columns of the base relation, since those indicate the target 3181 * columns to be affected. 3182 * 3183 * Note that this destroys the resno ordering of the targetlist, but that 3184 * will be fixed when we recurse through rewriteQuery, which will invoke 3185 * rewriteTargetListIU again on the updated targetlist. 3186 */ 3187 if (parsetree->commandType != CMD_DELETE) 3188 { 3189 foreach(lc, parsetree->targetList) 3190 { 3191 TargetEntry *tle = (TargetEntry *) lfirst(lc); 3192 TargetEntry *view_tle; 3193 3194 if (tle->resjunk) 3195 continue; 3196 3197 view_tle = get_tle_by_resno(view_targetlist, tle->resno); 3198 if (view_tle != NULL && !view_tle->resjunk && IsA(view_tle->expr, Var)) 3199 tle->resno = ((Var *) view_tle->expr)->varattno; 3200 else 3201 elog(ERROR, "attribute number %d not found in view targetlist", 3202 tle->resno); 3203 } 3204 } 3205 3206 /* 3207 * For INSERT .. ON CONFLICT .. DO UPDATE, we must also update assorted 3208 * stuff in the onConflict data structure. 3209 */ 3210 if (parsetree->onConflict && 3211 parsetree->onConflict->action == ONCONFLICT_UPDATE) 3212 { 3213 Index old_exclRelIndex, 3214 new_exclRelIndex; 3215 RangeTblEntry *new_exclRte; 3216 List *tmp_tlist; 3217 3218 /* 3219 * Like the INSERT/UPDATE code above, update the resnos in the 3220 * auxiliary UPDATE targetlist to refer to columns of the base 3221 * relation. 3222 */ 3223 foreach(lc, parsetree->onConflict->onConflictSet) 3224 { 3225 TargetEntry *tle = (TargetEntry *) lfirst(lc); 3226 TargetEntry *view_tle; 3227 3228 if (tle->resjunk) 3229 continue; 3230 3231 view_tle = get_tle_by_resno(view_targetlist, tle->resno); 3232 if (view_tle != NULL && !view_tle->resjunk && IsA(view_tle->expr, Var)) 3233 tle->resno = ((Var *) view_tle->expr)->varattno; 3234 else 3235 elog(ERROR, "attribute number %d not found in view targetlist", 3236 tle->resno); 3237 } 3238 3239 /* 3240 * Also, create a new RTE for the EXCLUDED pseudo-relation, using the 3241 * query's new base rel (which may well have a different column list 3242 * from the view, hence we need a new column alias list). This should 3243 * match transformOnConflictClause. In particular, note that the 3244 * relkind is set to composite to signal that we're not dealing with 3245 * an actual relation, and no permissions checks are wanted. 3246 */ 3247 old_exclRelIndex = parsetree->onConflict->exclRelIndex; 3248 3249 new_exclRte = addRangeTableEntryForRelation(make_parsestate(NULL), 3250 base_rel, 3251 makeAlias("excluded", 3252 NIL), 3253 false, false); 3254 new_exclRte->relkind = RELKIND_COMPOSITE_TYPE; 3255 new_exclRte->requiredPerms = 0; 3256 /* other permissions fields in new_exclRte are already empty */ 3257 3258 parsetree->rtable = lappend(parsetree->rtable, new_exclRte); 3259 new_exclRelIndex = parsetree->onConflict->exclRelIndex = 3260 list_length(parsetree->rtable); 3261 3262 /* 3263 * Replace the targetlist for the EXCLUDED pseudo-relation with a new 3264 * one, representing the columns from the new base relation. 3265 */ 3266 parsetree->onConflict->exclRelTlist = 3267 BuildOnConflictExcludedTargetlist(base_rel, new_exclRelIndex); 3268 3269 /* 3270 * Update all Vars in the ON CONFLICT clause that refer to the old 3271 * EXCLUDED pseudo-relation. We want to use the column mappings 3272 * defined in the view targetlist, but we need the outputs to refer to 3273 * the new EXCLUDED pseudo-relation rather than the new target RTE. 3274 * Also notice that "EXCLUDED.*" will be expanded using the view's 3275 * rowtype, which seems correct. 3276 */ 3277 tmp_tlist = copyObject(view_targetlist); 3278 3279 ChangeVarNodes((Node *) tmp_tlist, new_rt_index, 3280 new_exclRelIndex, 0); 3281 3282 parsetree->onConflict = (OnConflictExpr *) 3283 ReplaceVarsFromTargetList((Node *) parsetree->onConflict, 3284 old_exclRelIndex, 3285 0, 3286 view_rte, 3287 tmp_tlist, 3288 REPLACEVARS_REPORT_ERROR, 3289 0, 3290 &parsetree->hasSubLinks); 3291 } 3292 3293 /* 3294 * For UPDATE/DELETE, pull up any WHERE quals from the view. We know that 3295 * any Vars in the quals must reference the one base relation, so we need 3296 * only adjust their varnos to reference the new target (just the same as 3297 * we did with the view targetlist). 3298 * 3299 * If it's a security-barrier view, its WHERE quals must be applied before 3300 * quals from the outer query, so we attach them to the RTE as security 3301 * barrier quals rather than adding them to the main WHERE clause. 3302 * 3303 * For INSERT, the view's quals can be ignored in the main query. 3304 */ 3305 if (parsetree->commandType != CMD_INSERT && 3306 viewquery->jointree->quals != NULL) 3307 { 3308 Node *viewqual = (Node *) viewquery->jointree->quals; 3309 3310 /* 3311 * Even though we copied viewquery already at the top of this 3312 * function, we must duplicate the viewqual again here, because we may 3313 * need to use the quals again below for a WithCheckOption clause. 3314 */ 3315 viewqual = copyObject(viewqual); 3316 3317 ChangeVarNodes(viewqual, base_rt_index, new_rt_index, 0); 3318 3319 if (RelationIsSecurityView(view)) 3320 { 3321 /* 3322 * The view's quals go in front of existing barrier quals: those 3323 * would have come from an outer level of security-barrier view, 3324 * and so must get evaluated later. 3325 * 3326 * Note: the parsetree has been mutated, so the new_rte pointer is 3327 * stale and needs to be re-computed. 3328 */ 3329 new_rte = rt_fetch(new_rt_index, parsetree->rtable); 3330 new_rte->securityQuals = lcons(viewqual, new_rte->securityQuals); 3331 3332 /* 3333 * Do not set parsetree->hasRowSecurity, because these aren't RLS 3334 * conditions (they aren't affected by enabling/disabling RLS). 3335 */ 3336 3337 /* 3338 * Make sure that the query is marked correctly if the added qual 3339 * has sublinks. 3340 */ 3341 if (!parsetree->hasSubLinks) 3342 parsetree->hasSubLinks = checkExprHasSubLink(viewqual); 3343 } 3344 else 3345 AddQual(parsetree, (Node *) viewqual); 3346 } 3347 3348 /* 3349 * For INSERT/UPDATE, if the view has the WITH CHECK OPTION, or any parent 3350 * view specified WITH CASCADED CHECK OPTION, add the quals from the view 3351 * to the query's withCheckOptions list. 3352 */ 3353 if (parsetree->commandType != CMD_DELETE) 3354 { 3355 bool has_wco = RelationHasCheckOption(view); 3356 bool cascaded = RelationHasCascadedCheckOption(view); 3357 3358 /* 3359 * If the parent view has a cascaded check option, treat this view as 3360 * if it also had a cascaded check option. 3361 * 3362 * New WithCheckOptions are added to the start of the list, so if 3363 * there is a cascaded check option, it will be the first item in the 3364 * list. 3365 */ 3366 if (parsetree->withCheckOptions != NIL) 3367 { 3368 WithCheckOption *parent_wco = 3369 (WithCheckOption *) linitial(parsetree->withCheckOptions); 3370 3371 if (parent_wco->cascaded) 3372 { 3373 has_wco = true; 3374 cascaded = true; 3375 } 3376 } 3377 3378 /* 3379 * Add the new WithCheckOption to the start of the list, so that 3380 * checks on inner views are run before checks on outer views, as 3381 * required by the SQL standard. 3382 * 3383 * If the new check is CASCADED, we need to add it even if this view 3384 * has no quals, since there may be quals on child views. A LOCAL 3385 * check can be omitted if this view has no quals. 3386 */ 3387 if (has_wco && (cascaded || viewquery->jointree->quals != NULL)) 3388 { 3389 WithCheckOption *wco; 3390 3391 wco = makeNode(WithCheckOption); 3392 wco->kind = WCO_VIEW_CHECK; 3393 wco->relname = pstrdup(RelationGetRelationName(view)); 3394 wco->polname = NULL; 3395 wco->qual = NULL; 3396 wco->cascaded = cascaded; 3397 3398 parsetree->withCheckOptions = lcons(wco, 3399 parsetree->withCheckOptions); 3400 3401 if (viewquery->jointree->quals != NULL) 3402 { 3403 wco->qual = (Node *) viewquery->jointree->quals; 3404 ChangeVarNodes(wco->qual, base_rt_index, new_rt_index, 0); 3405 3406 /* 3407 * Make sure that the query is marked correctly if the added 3408 * qual has sublinks. We can skip this check if the query is 3409 * already marked, or if the command is an UPDATE, in which 3410 * case the same qual will have already been added, and this 3411 * check will already have been done. 3412 */ 3413 if (!parsetree->hasSubLinks && 3414 parsetree->commandType != CMD_UPDATE) 3415 parsetree->hasSubLinks = checkExprHasSubLink(wco->qual); 3416 } 3417 } 3418 } 3419 3420 heap_close(base_rel, NoLock); 3421 3422 return parsetree; 3423 } 3424 3425 3426 /* 3427 * RewriteQuery - 3428 * rewrites the query and apply the rules again on the queries rewritten 3429 * 3430 * rewrite_events is a list of open query-rewrite actions, so we can detect 3431 * infinite recursion. 3432 */ 3433 static List * 3434 RewriteQuery(Query *parsetree, List *rewrite_events) 3435 { 3436 CmdType event = parsetree->commandType; 3437 bool instead = false; 3438 bool returning = false; 3439 bool updatableview = false; 3440 Query *qual_product = NULL; 3441 List *rewritten = NIL; 3442 ListCell *lc1; 3443 3444 /* 3445 * First, recursively process any insert/update/delete statements in WITH 3446 * clauses. (We have to do this first because the WITH clauses may get 3447 * copied into rule actions below.) 3448 */ 3449 foreach(lc1, parsetree->cteList) 3450 { 3451 CommonTableExpr *cte = lfirst_node(CommonTableExpr, lc1); 3452 Query *ctequery = castNode(Query, cte->ctequery); 3453 List *newstuff; 3454 3455 if (ctequery->commandType == CMD_SELECT) 3456 continue; 3457 3458 newstuff = RewriteQuery(ctequery, rewrite_events); 3459 3460 /* 3461 * Currently we can only handle unconditional, single-statement DO 3462 * INSTEAD rules correctly; we have to get exactly one non-utility 3463 * Query out of the rewrite operation to stuff back into the CTE node. 3464 */ 3465 if (list_length(newstuff) == 1) 3466 { 3467 /* Must check it's not a utility command */ 3468 ctequery = linitial_node(Query, newstuff); 3469 if (!(ctequery->commandType == CMD_SELECT || 3470 ctequery->commandType == CMD_UPDATE || 3471 ctequery->commandType == CMD_INSERT || 3472 ctequery->commandType == CMD_DELETE)) 3473 { 3474 /* 3475 * Currently it could only be NOTIFY; this error message will 3476 * need work if we ever allow other utility commands in rules. 3477 */ 3478 ereport(ERROR, 3479 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3480 errmsg("DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH"))); 3481 } 3482 /* WITH queries should never be canSetTag */ 3483 Assert(!ctequery->canSetTag); 3484 /* Push the single Query back into the CTE node */ 3485 cte->ctequery = (Node *) ctequery; 3486 } 3487 else if (newstuff == NIL) 3488 { 3489 ereport(ERROR, 3490 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3491 errmsg("DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH"))); 3492 } 3493 else 3494 { 3495 ListCell *lc2; 3496 3497 /* examine queries to determine which error message to issue */ 3498 foreach(lc2, newstuff) 3499 { 3500 Query *q = (Query *) lfirst(lc2); 3501 3502 if (q->querySource == QSRC_QUAL_INSTEAD_RULE) 3503 ereport(ERROR, 3504 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3505 errmsg("conditional DO INSTEAD rules are not supported for data-modifying statements in WITH"))); 3506 if (q->querySource == QSRC_NON_INSTEAD_RULE) 3507 ereport(ERROR, 3508 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3509 errmsg("DO ALSO rules are not supported for data-modifying statements in WITH"))); 3510 } 3511 3512 ereport(ERROR, 3513 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3514 errmsg("multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH"))); 3515 } 3516 } 3517 3518 /* 3519 * If the statement is an insert, update, or delete, adjust its targetlist 3520 * as needed, and then fire INSERT/UPDATE/DELETE rules on it. 3521 * 3522 * SELECT rules are handled later when we have all the queries that should 3523 * get executed. Also, utilities aren't rewritten at all (do we still 3524 * need that check?) 3525 */ 3526 if (event != CMD_SELECT && event != CMD_UTILITY) 3527 { 3528 int result_relation; 3529 RangeTblEntry *rt_entry; 3530 Relation rt_entry_relation; 3531 List *locks; 3532 List *product_queries; 3533 bool hasUpdate = false; 3534 int values_rte_index = 0; 3535 bool defaults_remaining = false; 3536 3537 result_relation = parsetree->resultRelation; 3538 Assert(result_relation != 0); 3539 rt_entry = rt_fetch(result_relation, parsetree->rtable); 3540 Assert(rt_entry->rtekind == RTE_RELATION); 3541 3542 /* 3543 * We can use NoLock here since either the parser or 3544 * AcquireRewriteLocks should have locked the rel already. 3545 */ 3546 rt_entry_relation = heap_open(rt_entry->relid, NoLock); 3547 3548 /* 3549 * Rewrite the targetlist as needed for the command type. 3550 */ 3551 if (event == CMD_INSERT) 3552 { 3553 RangeTblEntry *values_rte = NULL; 3554 3555 /* 3556 * If it's an INSERT ... VALUES (...), (...), ... there will be a 3557 * single RTE for the VALUES targetlists. 3558 */ 3559 if (list_length(parsetree->jointree->fromlist) == 1) 3560 { 3561 RangeTblRef *rtr = (RangeTblRef *) linitial(parsetree->jointree->fromlist); 3562 3563 if (IsA(rtr, RangeTblRef)) 3564 { 3565 RangeTblEntry *rte = rt_fetch(rtr->rtindex, 3566 parsetree->rtable); 3567 3568 if (rte->rtekind == RTE_VALUES) 3569 { 3570 values_rte = rte; 3571 values_rte_index = rtr->rtindex; 3572 } 3573 } 3574 } 3575 3576 if (values_rte) 3577 { 3578 /* Process the main targetlist ... */ 3579 parsetree->targetList = rewriteTargetListIU(parsetree->targetList, 3580 parsetree->commandType, 3581 parsetree->override, 3582 rt_entry_relation, 3583 parsetree->resultRelation); 3584 /* ... and the VALUES expression lists */ 3585 if (!rewriteValuesRTE(parsetree, values_rte, values_rte_index, 3586 rt_entry_relation, false)) 3587 defaults_remaining = true; 3588 } 3589 else 3590 { 3591 /* Process just the main targetlist */ 3592 parsetree->targetList = 3593 rewriteTargetListIU(parsetree->targetList, 3594 parsetree->commandType, 3595 parsetree->override, 3596 rt_entry_relation, 3597 parsetree->resultRelation); 3598 } 3599 3600 if (parsetree->onConflict && 3601 parsetree->onConflict->action == ONCONFLICT_UPDATE) 3602 { 3603 parsetree->onConflict->onConflictSet = 3604 rewriteTargetListIU(parsetree->onConflict->onConflictSet, 3605 CMD_UPDATE, 3606 parsetree->override, 3607 rt_entry_relation, 3608 parsetree->resultRelation); 3609 } 3610 } 3611 else if (event == CMD_UPDATE) 3612 { 3613 parsetree->targetList = 3614 rewriteTargetListIU(parsetree->targetList, 3615 parsetree->commandType, 3616 parsetree->override, 3617 rt_entry_relation, 3618 parsetree->resultRelation); 3619 } 3620 else if (event == CMD_DELETE) 3621 { 3622 /* Nothing to do here */ 3623 } 3624 else 3625 elog(ERROR, "unrecognized commandType: %d", (int) event); 3626 3627 /* 3628 * Collect and apply the appropriate rules. 3629 */ 3630 locks = matchLocks(event, rt_entry_relation->rd_rules, 3631 result_relation, parsetree, &hasUpdate); 3632 3633 product_queries = fireRules(parsetree, 3634 result_relation, 3635 event, 3636 locks, 3637 &instead, 3638 &returning, 3639 &qual_product); 3640 3641 /* 3642 * If we have a VALUES RTE with any remaining untouched DEFAULT items, 3643 * and we got any product queries, finalize the VALUES RTE for each 3644 * product query (replacing the remaining DEFAULT items with NULLs). 3645 * We don't do this for the original query, because we know that it 3646 * must be an auto-insert on a view, and so should use the base 3647 * relation's defaults for any remaining DEFAULT items. 3648 */ 3649 if (defaults_remaining && product_queries != NIL) 3650 { 3651 ListCell *n; 3652 3653 /* 3654 * Each product query has its own copy of the VALUES RTE at the 3655 * same index in the rangetable, so we must finalize each one. 3656 */ 3657 foreach(n, product_queries) 3658 { 3659 Query *pt = (Query *) lfirst(n); 3660 RangeTblEntry *values_rte = rt_fetch(values_rte_index, 3661 pt->rtable); 3662 3663 rewriteValuesRTE(pt, values_rte, values_rte_index, 3664 rt_entry_relation, 3665 true); /* Force remaining defaults to NULL */ 3666 } 3667 } 3668 3669 /* 3670 * If there was no unqualified INSTEAD rule, and the target relation 3671 * is a view without any INSTEAD OF triggers, see if the view can be 3672 * automatically updated. If so, we perform the necessary query 3673 * transformation here and add the resulting query to the 3674 * product_queries list, so that it gets recursively rewritten if 3675 * necessary. 3676 * 3677 * If the view cannot be automatically updated, we throw an error here 3678 * which is OK since the query would fail at runtime anyway. Throwing 3679 * the error here is preferable to the executor check since we have 3680 * more detailed information available about why the view isn't 3681 * updatable. 3682 */ 3683 if (!instead && 3684 rt_entry_relation->rd_rel->relkind == RELKIND_VIEW && 3685 !view_has_instead_trigger(rt_entry_relation, event)) 3686 { 3687 /* 3688 * If there were any qualified INSTEAD rules, don't allow the view 3689 * to be automatically updated (an unqualified INSTEAD rule or 3690 * INSTEAD OF trigger is required). 3691 * 3692 * The messages here should match execMain.c's CheckValidResultRel 3693 * and in principle make those checks in executor unnecessary, but 3694 * we keep them just in case. 3695 */ 3696 if (qual_product != NULL) 3697 { 3698 switch (parsetree->commandType) 3699 { 3700 case CMD_INSERT: 3701 ereport(ERROR, 3702 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 3703 errmsg("cannot insert into view \"%s\"", 3704 RelationGetRelationName(rt_entry_relation)), 3705 errdetail("Views with conditional DO INSTEAD rules are not automatically updatable."), 3706 errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule."))); 3707 break; 3708 case CMD_UPDATE: 3709 ereport(ERROR, 3710 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 3711 errmsg("cannot update view \"%s\"", 3712 RelationGetRelationName(rt_entry_relation)), 3713 errdetail("Views with conditional DO INSTEAD rules are not automatically updatable."), 3714 errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule."))); 3715 break; 3716 case CMD_DELETE: 3717 ereport(ERROR, 3718 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), 3719 errmsg("cannot delete from view \"%s\"", 3720 RelationGetRelationName(rt_entry_relation)), 3721 errdetail("Views with conditional DO INSTEAD rules are not automatically updatable."), 3722 errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule."))); 3723 break; 3724 default: 3725 elog(ERROR, "unrecognized CmdType: %d", 3726 (int) parsetree->commandType); 3727 break; 3728 } 3729 } 3730 3731 /* 3732 * Attempt to rewrite the query to automatically update the view. 3733 * This throws an error if the view can't be automatically 3734 * updated. 3735 */ 3736 parsetree = rewriteTargetView(parsetree, rt_entry_relation); 3737 3738 /* 3739 * At this point product_queries contains any DO ALSO rule 3740 * actions. Add the rewritten query before or after those. This 3741 * must match the handling the original query would have gotten 3742 * below, if we allowed it to be included again. 3743 */ 3744 if (parsetree->commandType == CMD_INSERT) 3745 product_queries = lcons(parsetree, product_queries); 3746 else 3747 product_queries = lappend(product_queries, parsetree); 3748 3749 /* 3750 * Set the "instead" flag, as if there had been an unqualified 3751 * INSTEAD, to prevent the original query from being included a 3752 * second time below. The transformation will have rewritten any 3753 * RETURNING list, so we can also set "returning" to forestall 3754 * throwing an error below. 3755 */ 3756 instead = true; 3757 returning = true; 3758 updatableview = true; 3759 } 3760 3761 /* 3762 * If we got any product queries, recursively rewrite them --- but 3763 * first check for recursion! 3764 */ 3765 if (product_queries != NIL) 3766 { 3767 ListCell *n; 3768 rewrite_event *rev; 3769 3770 foreach(n, rewrite_events) 3771 { 3772 rev = (rewrite_event *) lfirst(n); 3773 if (rev->relation == RelationGetRelid(rt_entry_relation) && 3774 rev->event == event) 3775 ereport(ERROR, 3776 (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), 3777 errmsg("infinite recursion detected in rules for relation \"%s\"", 3778 RelationGetRelationName(rt_entry_relation)))); 3779 } 3780 3781 rev = (rewrite_event *) palloc(sizeof(rewrite_event)); 3782 rev->relation = RelationGetRelid(rt_entry_relation); 3783 rev->event = event; 3784 rewrite_events = lcons(rev, rewrite_events); 3785 3786 foreach(n, product_queries) 3787 { 3788 Query *pt = (Query *) lfirst(n); 3789 List *newstuff; 3790 3791 newstuff = RewriteQuery(pt, rewrite_events); 3792 rewritten = list_concat(rewritten, newstuff); 3793 } 3794 3795 rewrite_events = list_delete_first(rewrite_events); 3796 } 3797 3798 /* 3799 * If there is an INSTEAD, and the original query has a RETURNING, we 3800 * have to have found a RETURNING in the rule(s), else fail. (Because 3801 * DefineQueryRewrite only allows RETURNING in unconditional INSTEAD 3802 * rules, there's no need to worry whether the substituted RETURNING 3803 * will actually be executed --- it must be.) 3804 */ 3805 if ((instead || qual_product != NULL) && 3806 parsetree->returningList && 3807 !returning) 3808 { 3809 switch (event) 3810 { 3811 case CMD_INSERT: 3812 ereport(ERROR, 3813 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3814 errmsg("cannot perform INSERT RETURNING on relation \"%s\"", 3815 RelationGetRelationName(rt_entry_relation)), 3816 errhint("You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause."))); 3817 break; 3818 case CMD_UPDATE: 3819 ereport(ERROR, 3820 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3821 errmsg("cannot perform UPDATE RETURNING on relation \"%s\"", 3822 RelationGetRelationName(rt_entry_relation)), 3823 errhint("You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause."))); 3824 break; 3825 case CMD_DELETE: 3826 ereport(ERROR, 3827 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3828 errmsg("cannot perform DELETE RETURNING on relation \"%s\"", 3829 RelationGetRelationName(rt_entry_relation)), 3830 errhint("You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause."))); 3831 break; 3832 default: 3833 elog(ERROR, "unrecognized commandType: %d", 3834 (int) event); 3835 break; 3836 } 3837 } 3838 3839 /* 3840 * Updatable views are supported by ON CONFLICT, so don't prevent that 3841 * case from proceeding 3842 */ 3843 if (parsetree->onConflict && 3844 (product_queries != NIL || hasUpdate) && 3845 !updatableview) 3846 ereport(ERROR, 3847 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3848 errmsg("INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules"))); 3849 3850 heap_close(rt_entry_relation, NoLock); 3851 } 3852 3853 /* 3854 * For INSERTs, the original query is done first; for UPDATE/DELETE, it is 3855 * done last. This is needed because update and delete rule actions might 3856 * not do anything if they are invoked after the update or delete is 3857 * performed. The command counter increment between the query executions 3858 * makes the deleted (and maybe the updated) tuples disappear so the scans 3859 * for them in the rule actions cannot find them. 3860 * 3861 * If we found any unqualified INSTEAD, the original query is not done at 3862 * all, in any form. Otherwise, we add the modified form if qualified 3863 * INSTEADs were found, else the unmodified form. 3864 */ 3865 if (!instead) 3866 { 3867 if (parsetree->commandType == CMD_INSERT) 3868 { 3869 if (qual_product != NULL) 3870 rewritten = lcons(qual_product, rewritten); 3871 else 3872 rewritten = lcons(parsetree, rewritten); 3873 } 3874 else 3875 { 3876 if (qual_product != NULL) 3877 rewritten = lappend(rewritten, qual_product); 3878 else 3879 rewritten = lappend(rewritten, parsetree); 3880 } 3881 } 3882 3883 /* 3884 * If the original query has a CTE list, and we generated more than one 3885 * non-utility result query, we have to fail because we'll have copied the 3886 * CTE list into each result query. That would break the expectation of 3887 * single evaluation of CTEs. This could possibly be fixed by 3888 * restructuring so that a CTE list can be shared across multiple Query 3889 * and PlannableStatement nodes. 3890 */ 3891 if (parsetree->cteList != NIL) 3892 { 3893 int qcount = 0; 3894 3895 foreach(lc1, rewritten) 3896 { 3897 Query *q = (Query *) lfirst(lc1); 3898 3899 if (q->commandType != CMD_UTILITY) 3900 qcount++; 3901 } 3902 if (qcount > 1) 3903 ereport(ERROR, 3904 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 3905 errmsg("WITH cannot be used in a query that is rewritten by rules into multiple queries"))); 3906 } 3907 3908 return rewritten; 3909 } 3910 3911 3912 /* 3913 * QueryRewrite - 3914 * Primary entry point to the query rewriter. 3915 * Rewrite one query via query rewrite system, possibly returning 0 3916 * or many queries. 3917 * 3918 * NOTE: the parsetree must either have come straight from the parser, 3919 * or have been scanned by AcquireRewriteLocks to acquire suitable locks. 3920 */ 3921 List * 3922 QueryRewrite(Query *parsetree) 3923 { 3924 uint64 input_query_id = parsetree->queryId; 3925 List *querylist; 3926 List *results; 3927 ListCell *l; 3928 CmdType origCmdType; 3929 bool foundOriginalQuery; 3930 Query *lastInstead; 3931 3932 /* 3933 * This function is only applied to top-level original queries 3934 */ 3935 Assert(parsetree->querySource == QSRC_ORIGINAL); 3936 Assert(parsetree->canSetTag); 3937 3938 /* 3939 * Step 1 3940 * 3941 * Apply all non-SELECT rules possibly getting 0 or many queries 3942 */ 3943 querylist = RewriteQuery(parsetree, NIL); 3944 3945 /* 3946 * Step 2 3947 * 3948 * Apply all the RIR rules on each query 3949 * 3950 * This is also a handy place to mark each query with the original queryId 3951 */ 3952 results = NIL; 3953 foreach(l, querylist) 3954 { 3955 Query *query = (Query *) lfirst(l); 3956 3957 query = fireRIRrules(query, NIL); 3958 3959 query->queryId = input_query_id; 3960 3961 results = lappend(results, query); 3962 } 3963 3964 /* 3965 * Step 3 3966 * 3967 * Determine which, if any, of the resulting queries is supposed to set 3968 * the command-result tag; and update the canSetTag fields accordingly. 3969 * 3970 * If the original query is still in the list, it sets the command tag. 3971 * Otherwise, the last INSTEAD query of the same kind as the original is 3972 * allowed to set the tag. (Note these rules can leave us with no query 3973 * setting the tag. The tcop code has to cope with this by setting up a 3974 * default tag based on the original un-rewritten query.) 3975 * 3976 * The Asserts verify that at most one query in the result list is marked 3977 * canSetTag. If we aren't checking asserts, we can fall out of the loop 3978 * as soon as we find the original query. 3979 */ 3980 origCmdType = parsetree->commandType; 3981 foundOriginalQuery = false; 3982 lastInstead = NULL; 3983 3984 foreach(l, results) 3985 { 3986 Query *query = (Query *) lfirst(l); 3987 3988 if (query->querySource == QSRC_ORIGINAL) 3989 { 3990 Assert(query->canSetTag); 3991 Assert(!foundOriginalQuery); 3992 foundOriginalQuery = true; 3993 #ifndef USE_ASSERT_CHECKING 3994 break; 3995 #endif 3996 } 3997 else 3998 { 3999 Assert(!query->canSetTag); 4000 if (query->commandType == origCmdType && 4001 (query->querySource == QSRC_INSTEAD_RULE || 4002 query->querySource == QSRC_QUAL_INSTEAD_RULE)) 4003 lastInstead = query; 4004 } 4005 } 4006 4007 if (!foundOriginalQuery && lastInstead != NULL) 4008 lastInstead->canSetTag = true; 4009 4010 return results; 4011 } 4012