]> granicus.if.org Git - postgresql/blob - src/backend/executor/execMain.c
Implement "WITH / WITHOID OIDS" clause for CREATE TABLE AS. This is
[postgresql] / src / backend / executor / execMain.c
1 /*-------------------------------------------------------------------------
2  *
3  * execMain.c
4  *        top level executor interface routines
5  *
6  * INTERFACE ROUTINES
7  *      ExecutorStart()
8  *      ExecutorRun()
9  *      ExecutorEnd()
10  *
11  *      The old ExecutorMain() has been replaced by ExecutorStart(),
12  *      ExecutorRun() and ExecutorEnd()
13  *
14  *      These three procedures are the external interfaces to the executor.
15  *      In each case, the query descriptor is required as an argument.
16  *
17  *      ExecutorStart() must be called at the beginning of execution of any
18  *      query plan and ExecutorEnd() should always be called at the end of
19  *      execution of a plan.
20  *
21  *      ExecutorRun accepts direction and count arguments that specify whether
22  *      the plan is to be executed forwards, backwards, and for how many tuples.
23  *
24  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
25  * Portions Copyright (c) 1994, Regents of the University of California
26  *
27  *
28  * IDENTIFICATION
29  *        $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.226 2004/01/10 23:28:44 neilc Exp $
30  *
31  *-------------------------------------------------------------------------
32  */
33 #include "postgres.h"
34
35 #include "access/heapam.h"
36 #include "catalog/heap.h"
37 #include "catalog/namespace.h"
38 #include "commands/tablecmds.h"
39 #include "commands/trigger.h"
40 #include "executor/execdebug.h"
41 #include "executor/execdefs.h"
42 #include "miscadmin.h"
43 #include "optimizer/clauses.h"
44 #include "optimizer/var.h"
45 #include "parser/parsetree.h"
46 #include "utils/acl.h"
47 #include "utils/guc.h"
48 #include "utils/lsyscache.h"
49
50
51 typedef struct execRowMark
52 {
53         Relation        relation;
54         Index           rti;
55         char            resname[32];
56 } execRowMark;
57
58 typedef struct evalPlanQual
59 {
60         Index           rti;
61         EState     *estate;
62         PlanState  *planstate;
63         struct evalPlanQual *next;      /* stack of active PlanQual plans */
64         struct evalPlanQual *free;      /* list of free PlanQual plans */
65 } evalPlanQual;
66
67 /* decls for local routines only used within this module */
68 static void InitPlan(QueryDesc *queryDesc, bool explainOnly);
69 static void initResultRelInfo(ResultRelInfo *resultRelInfo,
70                                   Index resultRelationIndex,
71                                   List *rangeTable,
72                                   CmdType operation);
73 static TupleTableSlot *ExecutePlan(EState *estate, PlanState *planstate,
74                         CmdType operation,
75                         long numberTuples,
76                         ScanDirection direction,
77                         DestReceiver *dest);
78 static void ExecSelect(TupleTableSlot *slot,
79                    DestReceiver *dest,
80                    EState *estate);
81 static void ExecInsert(TupleTableSlot *slot, ItemPointer tupleid,
82                    EState *estate);
83 static void ExecDelete(TupleTableSlot *slot, ItemPointer tupleid,
84                    EState *estate);
85 static void ExecUpdate(TupleTableSlot *slot, ItemPointer tupleid,
86                    EState *estate);
87 static TupleTableSlot *EvalPlanQualNext(EState *estate);
88 static void EndEvalPlanQual(EState *estate);
89 static void ExecCheckRTEPerms(RangeTblEntry *rte, CmdType operation);
90 static void ExecCheckXactReadOnly(Query *parsetree, CmdType operation);
91 static void EvalPlanQualStart(evalPlanQual *epq, EState *estate,
92                                   evalPlanQual *priorepq);
93 static void EvalPlanQualStop(evalPlanQual *epq);
94
95 /* end of local decls */
96
97
98 /* ----------------------------------------------------------------
99  *              ExecutorStart
100  *
101  *              This routine must be called at the beginning of any execution of any
102  *              query plan
103  *
104  * Takes a QueryDesc previously created by CreateQueryDesc (it's not real
105  * clear why we bother to separate the two functions, but...).  The tupDesc
106  * field of the QueryDesc is filled in to describe the tuples that will be
107  * returned, and the internal fields (estate and planstate) are set up.
108  *
109  * If useCurrentSnapshot is true, run the query with the latest available
110  * snapshot, instead of the normal QuerySnapshot.  Also, if it's an update
111  * or delete query, check that the rows to be updated or deleted would be
112  * visible to the normal QuerySnapshot.  (This is a special-case behavior
113  * needed for referential integrity updates in serializable transactions.
114  * We must check all currently-committed rows, but we want to throw a
115  * can't-serialize error if any rows that would need updates would not be
116  * visible under the normal serializable snapshot.)
117  *
118  * If explainOnly is true, we are not actually intending to run the plan,
119  * only to set up for EXPLAIN; so skip unwanted side-effects.
120  *
121  * NB: the CurrentMemoryContext when this is called will become the parent
122  * of the per-query context used for this Executor invocation.
123  * ----------------------------------------------------------------
124  */
125 void
126 ExecutorStart(QueryDesc *queryDesc, bool useCurrentSnapshot, bool explainOnly)
127 {
128         EState     *estate;
129         MemoryContext oldcontext;
130
131         /* sanity checks: queryDesc must not be started already */
132         Assert(queryDesc != NULL);
133         Assert(queryDesc->estate == NULL);
134
135         /*
136          * If the transaction is read-only, we need to check if any writes are
137          * planned to non-temporary tables.
138          */
139         if (!explainOnly)
140                 ExecCheckXactReadOnly(queryDesc->parsetree, queryDesc->operation);
141
142         /*
143          * Build EState, switch into per-query memory context for startup.
144          */
145         estate = CreateExecutorState();
146         queryDesc->estate = estate;
147
148         oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
149
150         /*
151          * Fill in parameters, if any, from queryDesc
152          */
153         estate->es_param_list_info = queryDesc->params;
154
155         if (queryDesc->plantree->nParamExec > 0)
156                 estate->es_param_exec_vals = (ParamExecData *)
157                         palloc0(queryDesc->plantree->nParamExec * sizeof(ParamExecData));
158
159         estate->es_instrument = queryDesc->doInstrument;
160
161         /*
162          * Make our own private copy of the current query snapshot data.
163          *
164          * This "freezes" our idea of which tuples are good and which are not for
165          * the life of this query, even if it outlives the current command and
166          * current snapshot.
167          */
168         if (useCurrentSnapshot)
169         {
170                 /* RI update/delete query --- must use an up-to-date snapshot */
171                 estate->es_snapshot = CopyCurrentSnapshot();
172                 /* crosscheck updates/deletes against transaction snapshot */
173                 estate->es_crosscheck_snapshot = CopyQuerySnapshot();
174         }
175         else
176         {
177                 /* normal query --- use query snapshot, no crosscheck */
178                 estate->es_snapshot = CopyQuerySnapshot();
179                 estate->es_crosscheck_snapshot = SnapshotAny;
180         }
181
182         /*
183          * Initialize the plan state tree
184          */
185         InitPlan(queryDesc, explainOnly);
186
187         MemoryContextSwitchTo(oldcontext);
188 }
189
190 /* ----------------------------------------------------------------
191  *              ExecutorRun
192  *
193  *              This is the main routine of the executor module. It accepts
194  *              the query descriptor from the traffic cop and executes the
195  *              query plan.
196  *
197  *              ExecutorStart must have been called already.
198  *
199  *              If direction is NoMovementScanDirection then nothing is done
200  *              except to start up/shut down the destination.  Otherwise,
201  *              we retrieve up to 'count' tuples in the specified direction.
202  *
203  *              Note: count = 0 is interpreted as no portal limit, i.e., run to
204  *              completion.
205  *
206  * ----------------------------------------------------------------
207  */
208 TupleTableSlot *
209 ExecutorRun(QueryDesc *queryDesc,
210                         ScanDirection direction, long count)
211 {
212         EState     *estate;
213         CmdType         operation;
214         DestReceiver *dest;
215         TupleTableSlot *result;
216         MemoryContext oldcontext;
217
218         /* sanity checks */
219         Assert(queryDesc != NULL);
220
221         estate = queryDesc->estate;
222
223         Assert(estate != NULL);
224
225         /*
226          * Switch into per-query memory context
227          */
228         oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
229
230         /*
231          * extract information from the query descriptor and the query
232          * feature.
233          */
234         operation = queryDesc->operation;
235         dest = queryDesc->dest;
236
237         /*
238          * startup tuple receiver
239          */
240         estate->es_processed = 0;
241         estate->es_lastoid = InvalidOid;
242
243         (*dest->rStartup) (dest, operation, queryDesc->tupDesc);
244
245         /*
246          * run plan
247          */
248         if (direction == NoMovementScanDirection)
249                 result = NULL;
250         else
251                 result = ExecutePlan(estate,
252                                                          queryDesc->planstate,
253                                                          operation,
254                                                          count,
255                                                          direction,
256                                                          dest);
257
258         /*
259          * shutdown receiver
260          */
261         (*dest->rShutdown) (dest);
262
263         MemoryContextSwitchTo(oldcontext);
264
265         return result;
266 }
267
268 /* ----------------------------------------------------------------
269  *              ExecutorEnd
270  *
271  *              This routine must be called at the end of execution of any
272  *              query plan
273  * ----------------------------------------------------------------
274  */
275 void
276 ExecutorEnd(QueryDesc *queryDesc)
277 {
278         EState     *estate;
279         MemoryContext oldcontext;
280
281         /* sanity checks */
282         Assert(queryDesc != NULL);
283
284         estate = queryDesc->estate;
285
286         Assert(estate != NULL);
287
288         /*
289          * Switch into per-query memory context to run ExecEndPlan
290          */
291         oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
292
293         ExecEndPlan(queryDesc->planstate, estate);
294
295         /*
296          * Must switch out of context before destroying it
297          */
298         MemoryContextSwitchTo(oldcontext);
299
300         /*
301          * Release EState and per-query memory context.  This should release
302          * everything the executor has allocated.
303          */
304         FreeExecutorState(estate);
305
306         /* Reset queryDesc fields that no longer point to anything */
307         queryDesc->tupDesc = NULL;
308         queryDesc->estate = NULL;
309         queryDesc->planstate = NULL;
310 }
311
312 /* ----------------------------------------------------------------
313  *              ExecutorRewind
314  *
315  *              This routine may be called on an open queryDesc to rewind it
316  *              to the start.
317  * ----------------------------------------------------------------
318  */
319 void
320 ExecutorRewind(QueryDesc *queryDesc)
321 {
322         EState     *estate;
323         MemoryContext oldcontext;
324
325         /* sanity checks */
326         Assert(queryDesc != NULL);
327
328         estate = queryDesc->estate;
329
330         Assert(estate != NULL);
331
332         /* It's probably not sensible to rescan updating queries */
333         Assert(queryDesc->operation == CMD_SELECT);
334
335         /*
336          * Switch into per-query memory context
337          */
338         oldcontext = MemoryContextSwitchTo(estate->es_query_cxt);
339
340         /*
341          * rescan plan
342          */
343         ExecReScan(queryDesc->planstate, NULL);
344
345         MemoryContextSwitchTo(oldcontext);
346 }
347
348
349 /*
350  * ExecCheckRTPerms
351  *              Check access permissions for all relations listed in a range table.
352  */
353 void
354 ExecCheckRTPerms(List *rangeTable, CmdType operation)
355 {
356         List       *lp;
357
358         foreach(lp, rangeTable)
359         {
360                 RangeTblEntry *rte = lfirst(lp);
361
362                 ExecCheckRTEPerms(rte, operation);
363         }
364 }
365
366 /*
367  * ExecCheckRTEPerms
368  *              Check access permissions for a single RTE.
369  */
370 static void
371 ExecCheckRTEPerms(RangeTblEntry *rte, CmdType operation)
372 {
373         Oid                     relOid;
374         AclId           userid;
375         AclResult       aclcheck_result;
376
377         /*
378          * If it's a subquery, recursively examine its rangetable.
379          */
380         if (rte->rtekind == RTE_SUBQUERY)
381         {
382                 ExecCheckRTPerms(rte->subquery->rtable, operation);
383                 return;
384         }
385
386         /*
387          * Otherwise, only plain-relation RTEs need to be checked here.
388          * Function RTEs are checked by init_fcache when the function is
389          * prepared for execution. Join and special RTEs need no checks.
390          */
391         if (rte->rtekind != RTE_RELATION)
392                 return;
393
394         relOid = rte->relid;
395
396         /*
397          * userid to check as: current user unless we have a setuid
398          * indication.
399          *
400          * Note: GetUserId() is presently fast enough that there's no harm in
401          * calling it separately for each RTE.  If that stops being true, we
402          * could call it once in ExecCheckRTPerms and pass the userid down
403          * from there.  But for now, no need for the extra clutter.
404          */
405         userid = rte->checkAsUser ? rte->checkAsUser : GetUserId();
406
407 #define CHECK(MODE)             pg_class_aclcheck(relOid, userid, MODE)
408
409         if (rte->checkForRead)
410         {
411                 aclcheck_result = CHECK(ACL_SELECT);
412                 if (aclcheck_result != ACLCHECK_OK)
413                         aclcheck_error(aclcheck_result, ACL_KIND_CLASS,
414                                                    get_rel_name(relOid));
415         }
416
417         if (rte->checkForWrite)
418         {
419                 /*
420                  * Note: write access in a SELECT context means SELECT FOR UPDATE.
421                  * Right now we don't distinguish that from true update as far as
422                  * permissions checks are concerned.
423                  */
424                 switch (operation)
425                 {
426                         case CMD_INSERT:
427                                 aclcheck_result = CHECK(ACL_INSERT);
428                                 break;
429                         case CMD_SELECT:
430                         case CMD_UPDATE:
431                                 aclcheck_result = CHECK(ACL_UPDATE);
432                                 break;
433                         case CMD_DELETE:
434                                 aclcheck_result = CHECK(ACL_DELETE);
435                                 break;
436                         default:
437                                 elog(ERROR, "unrecognized operation code: %d",
438                                          (int) operation);
439                                 aclcheck_result = ACLCHECK_OK;  /* keep compiler quiet */
440                                 break;
441                 }
442                 if (aclcheck_result != ACLCHECK_OK)
443                         aclcheck_error(aclcheck_result, ACL_KIND_CLASS,
444                                                    get_rel_name(relOid));
445         }
446 }
447
448 static void
449 ExecCheckXactReadOnly(Query *parsetree, CmdType operation)
450 {
451         if (!XactReadOnly)
452                 return;
453
454         /* CREATE TABLE AS or SELECT INTO */
455         if (operation == CMD_SELECT && parsetree->into != NULL)
456                 goto fail;
457
458         if (operation == CMD_DELETE || operation == CMD_INSERT
459                 || operation == CMD_UPDATE)
460         {
461                 List       *lp;
462
463                 foreach(lp, parsetree->rtable)
464                 {
465                         RangeTblEntry *rte = lfirst(lp);
466
467                         if (rte->rtekind != RTE_RELATION)
468                                 continue;
469
470                         if (!rte->checkForWrite)
471                                 continue;
472
473                         if (isTempNamespace(get_rel_namespace(rte->relid)))
474                                 continue;
475
476                         goto fail;
477                 }
478         }
479
480         return;
481
482 fail:
483         ereport(ERROR,
484                         (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
485                          errmsg("transaction is read-only")));
486 }
487
488
489 /* ----------------------------------------------------------------
490  *              InitPlan
491  *
492  *              Initializes the query plan: open files, allocate storage
493  *              and start up the rule manager
494  * ----------------------------------------------------------------
495  */
496 static void
497 InitPlan(QueryDesc *queryDesc, bool explainOnly)
498 {
499         CmdType         operation = queryDesc->operation;
500         Query      *parseTree = queryDesc->parsetree;
501         Plan       *plan = queryDesc->plantree;
502         EState     *estate = queryDesc->estate;
503         PlanState  *planstate;
504         List       *rangeTable;
505         Relation        intoRelationDesc;
506         bool            do_select_into;
507         TupleDesc       tupType;
508
509         /*
510          * Do permissions checks.  It's sufficient to examine the query's top
511          * rangetable here --- subplan RTEs will be checked during
512          * ExecInitSubPlan().
513          */
514         ExecCheckRTPerms(parseTree->rtable, operation);
515
516         /*
517          * get information from query descriptor
518          */
519         rangeTable = parseTree->rtable;
520
521         /*
522          * initialize the node's execution state
523          */
524         estate->es_range_table = rangeTable;
525
526         /*
527          * if there is a result relation, initialize result relation stuff
528          */
529         if (parseTree->resultRelation != 0 && operation != CMD_SELECT)
530         {
531                 List       *resultRelations = parseTree->resultRelations;
532                 int                     numResultRelations;
533                 ResultRelInfo *resultRelInfos;
534
535                 if (resultRelations != NIL)
536                 {
537                         /*
538                          * Multiple result relations (due to inheritance)
539                          * parseTree->resultRelations identifies them all
540                          */
541                         ResultRelInfo *resultRelInfo;
542
543                         numResultRelations = length(resultRelations);
544                         resultRelInfos = (ResultRelInfo *)
545                                 palloc(numResultRelations * sizeof(ResultRelInfo));
546                         resultRelInfo = resultRelInfos;
547                         while (resultRelations != NIL)
548                         {
549                                 initResultRelInfo(resultRelInfo,
550                                                                   lfirsti(resultRelations),
551                                                                   rangeTable,
552                                                                   operation);
553                                 resultRelInfo++;
554                                 resultRelations = lnext(resultRelations);
555                         }
556                 }
557                 else
558                 {
559                         /*
560                          * Single result relation identified by
561                          * parseTree->resultRelation
562                          */
563                         numResultRelations = 1;
564                         resultRelInfos = (ResultRelInfo *) palloc(sizeof(ResultRelInfo));
565                         initResultRelInfo(resultRelInfos,
566                                                           parseTree->resultRelation,
567                                                           rangeTable,
568                                                           operation);
569                 }
570
571                 estate->es_result_relations = resultRelInfos;
572                 estate->es_num_result_relations = numResultRelations;
573                 /* Initialize to first or only result rel */
574                 estate->es_result_relation_info = resultRelInfos;
575         }
576         else
577         {
578                 /*
579                  * if no result relation, then set state appropriately
580                  */
581                 estate->es_result_relations = NULL;
582                 estate->es_num_result_relations = 0;
583                 estate->es_result_relation_info = NULL;
584         }
585
586         /*
587          * Detect whether we're doing SELECT INTO.  If so, set the force_oids
588          * flag appropriately so that the plan tree will be initialized with
589          * the correct tuple descriptors.
590          */
591         do_select_into = false;
592
593         if (operation == CMD_SELECT && parseTree->into != NULL)
594         {
595                 do_select_into = true;
596                 estate->es_force_oids = parseTree->intoHasOids;
597         }
598
599         /*
600          * Have to lock relations selected for update
601          */
602         estate->es_rowMark = NIL;
603         if (parseTree->rowMarks != NIL)
604         {
605                 List       *l;
606
607                 foreach(l, parseTree->rowMarks)
608                 {
609                         Index           rti = lfirsti(l);
610                         Oid                     relid = getrelid(rti, rangeTable);
611                         Relation        relation;
612                         execRowMark *erm;
613
614                         relation = heap_open(relid, RowShareLock);
615                         erm = (execRowMark *) palloc(sizeof(execRowMark));
616                         erm->relation = relation;
617                         erm->rti = rti;
618                         snprintf(erm->resname, sizeof(erm->resname), "ctid%u", rti);
619                         estate->es_rowMark = lappend(estate->es_rowMark, erm);
620                 }
621         }
622
623         /*
624          * initialize the executor "tuple" table.  We need slots for all the
625          * plan nodes, plus possibly output slots for the junkfilter(s). At
626          * this point we aren't sure if we need junkfilters, so just add slots
627          * for them unconditionally.
628          */
629         {
630                 int                     nSlots = ExecCountSlotsNode(plan);
631
632                 if (parseTree->resultRelations != NIL)
633                         nSlots += length(parseTree->resultRelations);
634                 else
635                         nSlots += 1;
636                 estate->es_tupleTable = ExecCreateTupleTable(nSlots);
637         }
638
639         /* mark EvalPlanQual not active */
640         estate->es_topPlan = plan;
641         estate->es_evalPlanQual = NULL;
642         estate->es_evTupleNull = NULL;
643         estate->es_evTuple = NULL;
644         estate->es_useEvalPlan = false;
645
646         /*
647          * initialize the private state information for all the nodes in the
648          * query tree.  This opens files, allocates storage and leaves us
649          * ready to start processing tuples.
650          */
651         planstate = ExecInitNode(plan, estate);
652
653         /*
654          * Get the tuple descriptor describing the type of tuples to return.
655          * (this is especially important if we are creating a relation with
656          * "SELECT INTO")
657          */
658         tupType = ExecGetResultType(planstate);
659
660         /*
661          * Initialize the junk filter if needed.  SELECT and INSERT queries
662          * need a filter if there are any junk attrs in the tlist.      INSERT and
663          * SELECT INTO also need a filter if the top plan node is a scan node
664          * that's not doing projection (else we'll be scribbling on the scan
665          * tuple!)      UPDATE and DELETE always need a filter, since there's
666          * always a junk 'ctid' attribute present --- no need to look first.
667          */
668         {
669                 bool            junk_filter_needed = false;
670                 List       *tlist;
671
672                 switch (operation)
673                 {
674                         case CMD_SELECT:
675                         case CMD_INSERT:
676                                 foreach(tlist, plan->targetlist)
677                                 {
678                                         TargetEntry *tle = (TargetEntry *) lfirst(tlist);
679
680                                         if (tle->resdom->resjunk)
681                                         {
682                                                 junk_filter_needed = true;
683                                                 break;
684                                         }
685                                 }
686                                 if (!junk_filter_needed &&
687                                         (operation == CMD_INSERT || do_select_into))
688                                 {
689                                         if (IsA(planstate, SeqScanState) ||
690                                                 IsA(planstate, IndexScanState) ||
691                                                 IsA(planstate, TidScanState) ||
692                                                 IsA(planstate, SubqueryScanState) ||
693                                                 IsA(planstate, FunctionScanState))
694                                         {
695                                                 if (planstate->ps_ProjInfo == NULL)
696                                                         junk_filter_needed = true;
697                                         }
698                                 }
699                                 break;
700                         case CMD_UPDATE:
701                         case CMD_DELETE:
702                                 junk_filter_needed = true;
703                                 break;
704                         default:
705                                 break;
706                 }
707
708                 if (junk_filter_needed)
709                 {
710                         /*
711                          * If there are multiple result relations, each one needs its
712                          * own junk filter.  Note this is only possible for
713                          * UPDATE/DELETE, so we can't be fooled by some needing a
714                          * filter and some not.
715                          */
716                         if (parseTree->resultRelations != NIL)
717                         {
718                                 PlanState **appendplans;
719                                 int                     as_nplans;
720                                 ResultRelInfo *resultRelInfo;
721                                 int                     i;
722
723                                 /* Top plan had better be an Append here. */
724                                 Assert(IsA(plan, Append));
725                                 Assert(((Append *) plan)->isTarget);
726                                 Assert(IsA(planstate, AppendState));
727                                 appendplans = ((AppendState *) planstate)->appendplans;
728                                 as_nplans = ((AppendState *) planstate)->as_nplans;
729                                 Assert(as_nplans == estate->es_num_result_relations);
730                                 resultRelInfo = estate->es_result_relations;
731                                 for (i = 0; i < as_nplans; i++)
732                                 {
733                                         PlanState  *subplan = appendplans[i];
734                                         JunkFilter *j;
735
736                                         j = ExecInitJunkFilter(subplan->plan->targetlist,
737                                                                                    ExecGetResultType(subplan),
738                                                           ExecAllocTableSlot(estate->es_tupleTable));
739                                         resultRelInfo->ri_junkFilter = j;
740                                         resultRelInfo++;
741                                 }
742
743                                 /*
744                                  * Set active junkfilter too; at this point ExecInitAppend
745                                  * has already selected an active result relation...
746                                  */
747                                 estate->es_junkFilter =
748                                         estate->es_result_relation_info->ri_junkFilter;
749                         }
750                         else
751                         {
752                                 /* Normal case with just one JunkFilter */
753                                 JunkFilter *j;
754
755                                 j = ExecInitJunkFilter(planstate->plan->targetlist,
756                                                                            tupType,
757                                                           ExecAllocTableSlot(estate->es_tupleTable));
758                                 estate->es_junkFilter = j;
759                                 if (estate->es_result_relation_info)
760                                         estate->es_result_relation_info->ri_junkFilter = j;
761
762                                 /* For SELECT, want to return the cleaned tuple type */
763                                 if (operation == CMD_SELECT)
764                                         tupType = j->jf_cleanTupType;
765                         }
766                 }
767                 else
768                         estate->es_junkFilter = NULL;
769         }
770
771         /*
772          * If doing SELECT INTO, initialize the "into" relation.  We must wait
773          * till now so we have the "clean" result tuple type to create the new
774          * table from.
775          *
776          * If EXPLAIN, skip creating the "into" relation.
777          */
778         intoRelationDesc = NULL;
779
780         if (do_select_into && !explainOnly)
781         {
782                 char       *intoName;
783                 Oid                     namespaceId;
784                 AclResult       aclresult;
785                 Oid                     intoRelationId;
786                 TupleDesc       tupdesc;
787
788                 /*
789                  * find namespace to create in, check permissions
790                  */
791                 intoName = parseTree->into->relname;
792                 namespaceId = RangeVarGetCreationNamespace(parseTree->into);
793
794                 aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(),
795                                                                                   ACL_CREATE);
796                 if (aclresult != ACLCHECK_OK)
797                         aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
798                                                    get_namespace_name(namespaceId));
799
800                 /*
801                  * have to copy tupType to get rid of constraints
802                  */
803                 tupdesc = CreateTupleDescCopy(tupType);
804
805                 intoRelationId = heap_create_with_catalog(intoName,
806                                                                                                   namespaceId,
807                                                                                                   tupdesc,
808                                                                                                   RELKIND_RELATION,
809                                                                                                   false,
810                                                                                                   ONCOMMIT_NOOP,
811                                                                                                   allowSystemTableMods);
812
813                 FreeTupleDesc(tupdesc);
814
815                 /*
816                  * Advance command counter so that the newly-created relation's
817                  * catalog tuples will be visible to heap_open.
818                  */
819                 CommandCounterIncrement();
820
821                 /*
822                  * If necessary, create a TOAST table for the into relation. Note
823                  * that AlterTableCreateToastTable ends with
824                  * CommandCounterIncrement(), so that the TOAST table will be
825                  * visible for insertion.
826                  */
827                 AlterTableCreateToastTable(intoRelationId, true);
828
829                 /*
830                  * And open the constructed table for writing.
831                  */
832                 intoRelationDesc = heap_open(intoRelationId, AccessExclusiveLock);
833         }
834
835         estate->es_into_relation_descriptor = intoRelationDesc;
836
837         queryDesc->tupDesc = tupType;
838         queryDesc->planstate = planstate;
839 }
840
841 /*
842  * Initialize ResultRelInfo data for one result relation
843  */
844 static void
845 initResultRelInfo(ResultRelInfo *resultRelInfo,
846                                   Index resultRelationIndex,
847                                   List *rangeTable,
848                                   CmdType operation)
849 {
850         Oid                     resultRelationOid;
851         Relation        resultRelationDesc;
852
853         resultRelationOid = getrelid(resultRelationIndex, rangeTable);
854         resultRelationDesc = heap_open(resultRelationOid, RowExclusiveLock);
855
856         switch (resultRelationDesc->rd_rel->relkind)
857         {
858                 case RELKIND_SEQUENCE:
859                         ereport(ERROR,
860                                         (errcode(ERRCODE_WRONG_OBJECT_TYPE),
861                                          errmsg("cannot change sequence \"%s\"",
862                                                   RelationGetRelationName(resultRelationDesc))));
863                         break;
864                 case RELKIND_TOASTVALUE:
865                         ereport(ERROR,
866                                         (errcode(ERRCODE_WRONG_OBJECT_TYPE),
867                                          errmsg("cannot change TOAST relation \"%s\"",
868                                                   RelationGetRelationName(resultRelationDesc))));
869                         break;
870                 case RELKIND_VIEW:
871                         ereport(ERROR,
872                                         (errcode(ERRCODE_WRONG_OBJECT_TYPE),
873                                          errmsg("cannot change view \"%s\"",
874                                                   RelationGetRelationName(resultRelationDesc))));
875                         break;
876         }
877
878         MemSet(resultRelInfo, 0, sizeof(ResultRelInfo));
879         resultRelInfo->type = T_ResultRelInfo;
880         resultRelInfo->ri_RangeTableIndex = resultRelationIndex;
881         resultRelInfo->ri_RelationDesc = resultRelationDesc;
882         resultRelInfo->ri_NumIndices = 0;
883         resultRelInfo->ri_IndexRelationDescs = NULL;
884         resultRelInfo->ri_IndexRelationInfo = NULL;
885         /* make a copy so as not to depend on relcache info not changing... */
886         resultRelInfo->ri_TrigDesc = CopyTriggerDesc(resultRelationDesc->trigdesc);
887         resultRelInfo->ri_TrigFunctions = NULL;
888         resultRelInfo->ri_ConstraintExprs = NULL;
889         resultRelInfo->ri_junkFilter = NULL;
890
891         /*
892          * If there are indices on the result relation, open them and save
893          * descriptors in the result relation info, so that we can add new
894          * index entries for the tuples we add/update.  We need not do this
895          * for a DELETE, however, since deletion doesn't affect indexes.
896          */
897         if (resultRelationDesc->rd_rel->relhasindex &&
898                 operation != CMD_DELETE)
899                 ExecOpenIndices(resultRelInfo);
900 }
901
902 /* ----------------------------------------------------------------
903  *              ExecEndPlan
904  *
905  *              Cleans up the query plan -- closes files and frees up storage
906  *
907  * NOTE: we are no longer very worried about freeing storage per se
908  * in this code; FreeExecutorState should be guaranteed to release all
909  * memory that needs to be released.  What we are worried about doing
910  * is closing relations and dropping buffer pins.  Thus, for example,
911  * tuple tables must be cleared or dropped to ensure pins are released.
912  * ----------------------------------------------------------------
913  */
914 void
915 ExecEndPlan(PlanState *planstate, EState *estate)
916 {
917         ResultRelInfo *resultRelInfo;
918         int                     i;
919         List       *l;
920
921         /*
922          * shut down any PlanQual processing we were doing
923          */
924         if (estate->es_evalPlanQual != NULL)
925                 EndEvalPlanQual(estate);
926
927         /*
928          * shut down the node-type-specific query processing
929          */
930         ExecEndNode(planstate);
931
932         /*
933          * destroy the executor "tuple" table.
934          */
935         ExecDropTupleTable(estate->es_tupleTable, true);
936         estate->es_tupleTable = NULL;
937
938         /*
939          * close the result relation(s) if any, but hold locks until xact
940          * commit.
941          */
942         resultRelInfo = estate->es_result_relations;
943         for (i = estate->es_num_result_relations; i > 0; i--)
944         {
945                 /* Close indices and then the relation itself */
946                 ExecCloseIndices(resultRelInfo);
947                 heap_close(resultRelInfo->ri_RelationDesc, NoLock);
948                 resultRelInfo++;
949         }
950
951         /*
952          * close the "into" relation if necessary, again keeping lock
953          */
954         if (estate->es_into_relation_descriptor != NULL)
955                 heap_close(estate->es_into_relation_descriptor, NoLock);
956
957         /*
958          * close any relations selected FOR UPDATE, again keeping locks
959          */
960         foreach(l, estate->es_rowMark)
961         {
962                 execRowMark *erm = lfirst(l);
963
964                 heap_close(erm->relation, NoLock);
965         }
966 }
967
968 /* ----------------------------------------------------------------
969  *              ExecutePlan
970  *
971  *              processes the query plan to retrieve 'numberTuples' tuples in the
972  *              direction specified.
973  *
974  *              Retrieves all tuples if numberTuples is 0
975  *
976  *              result is either a slot containing the last tuple in the case
977  *              of a SELECT or NULL otherwise.
978  *
979  * Note: the ctid attribute is a 'junk' attribute that is removed before the
980  * user can see it
981  * ----------------------------------------------------------------
982  */
983 static TupleTableSlot *
984 ExecutePlan(EState *estate,
985                         PlanState *planstate,
986                         CmdType operation,
987                         long numberTuples,
988                         ScanDirection direction,
989                         DestReceiver *dest)
990 {
991         JunkFilter *junkfilter;
992         TupleTableSlot *slot;
993         ItemPointer tupleid = NULL;
994         ItemPointerData tuple_ctid;
995         long            current_tuple_count;
996         TupleTableSlot *result;
997
998         /*
999          * initialize local variables
1000          */
1001         slot = NULL;
1002         current_tuple_count = 0;
1003         result = NULL;
1004
1005         /*
1006          * Set the direction.
1007          */
1008         estate->es_direction = direction;
1009
1010         /*
1011          * Process BEFORE EACH STATEMENT triggers
1012          */
1013         switch (operation)
1014         {
1015                 case CMD_UPDATE:
1016                         ExecBSUpdateTriggers(estate, estate->es_result_relation_info);
1017                         break;
1018                 case CMD_DELETE:
1019                         ExecBSDeleteTriggers(estate, estate->es_result_relation_info);
1020                         break;
1021                 case CMD_INSERT:
1022                         ExecBSInsertTriggers(estate, estate->es_result_relation_info);
1023                         break;
1024                 default:
1025                         /* do nothing */
1026                         break;
1027         }
1028
1029         /*
1030          * Loop until we've processed the proper number of tuples from the
1031          * plan.
1032          */
1033
1034         for (;;)
1035         {
1036                 /* Reset the per-output-tuple exprcontext */
1037                 ResetPerTupleExprContext(estate);
1038
1039                 /*
1040                  * Execute the plan and obtain a tuple
1041                  */
1042 lnext:  ;
1043                 if (estate->es_useEvalPlan)
1044                 {
1045                         slot = EvalPlanQualNext(estate);
1046                         if (TupIsNull(slot))
1047                                 slot = ExecProcNode(planstate);
1048                 }
1049                 else
1050                         slot = ExecProcNode(planstate);
1051
1052                 /*
1053                  * if the tuple is null, then we assume there is nothing more to
1054                  * process so we just return null...
1055                  */
1056                 if (TupIsNull(slot))
1057                 {
1058                         result = NULL;
1059                         break;
1060                 }
1061
1062                 /*
1063                  * if we have a junk filter, then project a new tuple with the
1064                  * junk removed.
1065                  *
1066                  * Store this new "clean" tuple in the junkfilter's resultSlot.
1067                  * (Formerly, we stored it back over the "dirty" tuple, which is
1068                  * WRONG because that tuple slot has the wrong descriptor.)
1069                  *
1070                  * Also, extract all the junk information we need.
1071                  */
1072                 if ((junkfilter = estate->es_junkFilter) != NULL)
1073                 {
1074                         Datum           datum;
1075                         HeapTuple       newTuple;
1076                         bool            isNull;
1077
1078                         /*
1079                          * extract the 'ctid' junk attribute.
1080                          */
1081                         if (operation == CMD_UPDATE || operation == CMD_DELETE)
1082                         {
1083                                 if (!ExecGetJunkAttribute(junkfilter,
1084                                                                                   slot,
1085                                                                                   "ctid",
1086                                                                                   &datum,
1087                                                                                   &isNull))
1088                                         elog(ERROR, "could not find junk ctid column");
1089
1090                                 /* shouldn't ever get a null result... */
1091                                 if (isNull)
1092                                         elog(ERROR, "ctid is NULL");
1093
1094                                 tupleid = (ItemPointer) DatumGetPointer(datum);
1095                                 tuple_ctid = *tupleid;  /* make sure we don't free the
1096                                                                                  * ctid!! */
1097                                 tupleid = &tuple_ctid;
1098                         }
1099                         else if (estate->es_rowMark != NIL)
1100                         {
1101                                 List       *l;
1102
1103                 lmark:  ;
1104                                 foreach(l, estate->es_rowMark)
1105                                 {
1106                                         execRowMark *erm = lfirst(l);
1107                                         Buffer          buffer;
1108                                         HeapTupleData tuple;
1109                                         TupleTableSlot *newSlot;
1110                                         int                     test;
1111
1112                                         if (!ExecGetJunkAttribute(junkfilter,
1113                                                                                           slot,
1114                                                                                           erm->resname,
1115                                                                                           &datum,
1116                                                                                           &isNull))
1117                                                 elog(ERROR, "could not find junk \"%s\" column",
1118                                                          erm->resname);
1119
1120                                         /* shouldn't ever get a null result... */
1121                                         if (isNull)
1122                                                 elog(ERROR, "\"%s\" is NULL", erm->resname);
1123
1124                                         tuple.t_self = *((ItemPointer) DatumGetPointer(datum));
1125                                         test = heap_mark4update(erm->relation, &tuple, &buffer,
1126                                                                                         estate->es_snapshot->curcid);
1127                                         ReleaseBuffer(buffer);
1128                                         switch (test)
1129                                         {
1130                                                 case HeapTupleSelfUpdated:
1131                                                         /* treat it as deleted; do not process */
1132                                                         goto lnext;
1133
1134                                                 case HeapTupleMayBeUpdated:
1135                                                         break;
1136
1137                                                 case HeapTupleUpdated:
1138                                                         if (IsXactIsoLevelSerializable)
1139                                                                 ereport(ERROR,
1140                                                                                 (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1141                                                                                  errmsg("could not serialize access due to concurrent update")));
1142                                                         if (!(ItemPointerEquals(&(tuple.t_self),
1143                                                                   (ItemPointer) DatumGetPointer(datum))))
1144                                                         {
1145                                                                 newSlot = EvalPlanQual(estate, erm->rti, &(tuple.t_self));
1146                                                                 if (!(TupIsNull(newSlot)))
1147                                                                 {
1148                                                                         slot = newSlot;
1149                                                                         estate->es_useEvalPlan = true;
1150                                                                         goto lmark;
1151                                                                 }
1152                                                         }
1153
1154                                                         /*
1155                                                          * if tuple was deleted or PlanQual failed for
1156                                                          * updated tuple - we must not return this
1157                                                          * tuple!
1158                                                          */
1159                                                         goto lnext;
1160
1161                                                 default:
1162                                                         elog(ERROR, "unrecognized heap_mark4update status: %u",
1163                                                                  test);
1164                                                         return (NULL);
1165                                         }
1166                                 }
1167                         }
1168
1169                         /*
1170                          * Finally create a new "clean" tuple with all junk attributes
1171                          * removed
1172                          */
1173                         newTuple = ExecRemoveJunk(junkfilter, slot);
1174
1175                         slot = ExecStoreTuple(newTuple,         /* tuple to store */
1176                                                                   junkfilter->jf_resultSlot,    /* dest slot */
1177                                                                   InvalidBuffer,                /* this tuple has no
1178                                                                                                                  * buffer */
1179                                                                   true);                /* tuple should be pfreed */
1180                 }
1181
1182                 /*
1183                  * now that we have a tuple, do the appropriate thing with it..
1184                  * either return it to the user, add it to a relation someplace,
1185                  * delete it from a relation, or modify some of its attributes.
1186                  */
1187                 switch (operation)
1188                 {
1189                         case CMD_SELECT:
1190                                 ExecSelect(slot,        /* slot containing tuple */
1191                                                    dest,        /* destination's tuple-receiver obj */
1192                                                    estate);
1193                                 result = slot;
1194                                 break;
1195
1196                         case CMD_INSERT:
1197                                 ExecInsert(slot, tupleid, estate);
1198                                 result = NULL;
1199                                 break;
1200
1201                         case CMD_DELETE:
1202                                 ExecDelete(slot, tupleid, estate);
1203                                 result = NULL;
1204                                 break;
1205
1206                         case CMD_UPDATE:
1207                                 ExecUpdate(slot, tupleid, estate);
1208                                 result = NULL;
1209                                 break;
1210
1211                         default:
1212                                 elog(ERROR, "unrecognized operation code: %d",
1213                                          (int) operation);
1214                                 result = NULL;
1215                                 break;
1216                 }
1217
1218                 /*
1219                  * check our tuple count.. if we've processed the proper number
1220                  * then quit, else loop again and process more tuples.  Zero
1221                  * numberTuples means no limit.
1222                  */
1223                 current_tuple_count++;
1224                 if (numberTuples && numberTuples == current_tuple_count)
1225                         break;
1226         }
1227
1228         /*
1229          * Process AFTER EACH STATEMENT triggers
1230          */
1231         switch (operation)
1232         {
1233                 case CMD_UPDATE:
1234                         ExecASUpdateTriggers(estate, estate->es_result_relation_info);
1235                         break;
1236                 case CMD_DELETE:
1237                         ExecASDeleteTriggers(estate, estate->es_result_relation_info);
1238                         break;
1239                 case CMD_INSERT:
1240                         ExecASInsertTriggers(estate, estate->es_result_relation_info);
1241                         break;
1242                 default:
1243                         /* do nothing */
1244                         break;
1245         }
1246
1247         /*
1248          * here, result is either a slot containing a tuple in the case of a
1249          * SELECT or NULL otherwise.
1250          */
1251         return result;
1252 }
1253
1254 /* ----------------------------------------------------------------
1255  *              ExecSelect
1256  *
1257  *              SELECTs are easy.. we just pass the tuple to the appropriate
1258  *              print function.  The only complexity is when we do a
1259  *              "SELECT INTO", in which case we insert the tuple into
1260  *              the appropriate relation (note: this is a newly created relation
1261  *              so we don't need to worry about indices or locks.)
1262  * ----------------------------------------------------------------
1263  */
1264 static void
1265 ExecSelect(TupleTableSlot *slot,
1266                    DestReceiver *dest,
1267                    EState *estate)
1268 {
1269         HeapTuple       tuple;
1270         TupleDesc       attrtype;
1271
1272         /*
1273          * get the heap tuple out of the tuple table slot
1274          */
1275         tuple = slot->val;
1276         attrtype = slot->ttc_tupleDescriptor;
1277
1278         /*
1279          * insert the tuple into the "into relation"
1280          *
1281          * XXX this probably ought to be replaced by a separate destination
1282          */
1283         if (estate->es_into_relation_descriptor != NULL)
1284         {
1285                 heap_insert(estate->es_into_relation_descriptor, tuple,
1286                                         estate->es_snapshot->curcid);
1287                 IncrAppended();
1288         }
1289
1290         /*
1291          * send the tuple to the destination
1292          */
1293         (*dest->receiveTuple) (tuple, attrtype, dest);
1294         IncrRetrieved();
1295         (estate->es_processed)++;
1296 }
1297
1298 /* ----------------------------------------------------------------
1299  *              ExecInsert
1300  *
1301  *              INSERTs are trickier.. we have to insert the tuple into
1302  *              the base relation and insert appropriate tuples into the
1303  *              index relations.
1304  * ----------------------------------------------------------------
1305  */
1306 static void
1307 ExecInsert(TupleTableSlot *slot,
1308                    ItemPointer tupleid,
1309                    EState *estate)
1310 {
1311         HeapTuple       tuple;
1312         ResultRelInfo *resultRelInfo;
1313         Relation        resultRelationDesc;
1314         int                     numIndices;
1315         Oid                     newId;
1316
1317         /*
1318          * get the heap tuple out of the tuple table slot
1319          */
1320         tuple = slot->val;
1321
1322         /*
1323          * get information on the (current) result relation
1324          */
1325         resultRelInfo = estate->es_result_relation_info;
1326         resultRelationDesc = resultRelInfo->ri_RelationDesc;
1327
1328         /* BEFORE ROW INSERT Triggers */
1329         if (resultRelInfo->ri_TrigDesc &&
1330           resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_INSERT] > 0)
1331         {
1332                 HeapTuple       newtuple;
1333
1334                 newtuple = ExecBRInsertTriggers(estate, resultRelInfo, tuple);
1335
1336                 if (newtuple == NULL)   /* "do nothing" */
1337                         return;
1338
1339                 if (newtuple != tuple)  /* modified by Trigger(s) */
1340                 {
1341                         /*
1342                          * Insert modified tuple into tuple table slot, replacing the
1343                          * original.  We assume that it was allocated in per-tuple
1344                          * memory context, and therefore will go away by itself. The
1345                          * tuple table slot should not try to clear it.
1346                          */
1347                         ExecStoreTuple(newtuple, slot, InvalidBuffer, false);
1348                         tuple = newtuple;
1349                 }
1350         }
1351
1352         /*
1353          * Check the constraints of the tuple
1354          */
1355         if (resultRelationDesc->rd_att->constr)
1356                 ExecConstraints(resultRelInfo, slot, estate);
1357
1358         /*
1359          * insert the tuple
1360          */
1361         newId = heap_insert(resultRelationDesc, tuple,
1362                                                 estate->es_snapshot->curcid);
1363
1364         IncrAppended();
1365         (estate->es_processed)++;
1366         estate->es_lastoid = newId;
1367         setLastTid(&(tuple->t_self));
1368
1369         /*
1370          * process indices
1371          *
1372          * Note: heap_insert adds a new tuple to a relation.  As a side effect,
1373          * the tupleid of the new tuple is placed in the new tuple's t_ctid
1374          * field.
1375          */
1376         numIndices = resultRelInfo->ri_NumIndices;
1377         if (numIndices > 0)
1378                 ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false);
1379
1380         /* AFTER ROW INSERT Triggers */
1381         ExecARInsertTriggers(estate, resultRelInfo, tuple);
1382 }
1383
1384 /* ----------------------------------------------------------------
1385  *              ExecDelete
1386  *
1387  *              DELETE is like UPDATE, we delete the tuple and its
1388  *              index tuples.
1389  * ----------------------------------------------------------------
1390  */
1391 static void
1392 ExecDelete(TupleTableSlot *slot,
1393                    ItemPointer tupleid,
1394                    EState *estate)
1395 {
1396         ResultRelInfo *resultRelInfo;
1397         Relation        resultRelationDesc;
1398         ItemPointerData ctid;
1399         int                     result;
1400
1401         /*
1402          * get information on the (current) result relation
1403          */
1404         resultRelInfo = estate->es_result_relation_info;
1405         resultRelationDesc = resultRelInfo->ri_RelationDesc;
1406
1407         /* BEFORE ROW DELETE Triggers */
1408         if (resultRelInfo->ri_TrigDesc &&
1409           resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_DELETE] > 0)
1410         {
1411                 bool            dodelete;
1412
1413                 dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid,
1414                                                                                 estate->es_snapshot->curcid);
1415
1416                 if (!dodelete)                  /* "do nothing" */
1417                         return;
1418         }
1419
1420         /*
1421          * delete the tuple
1422          */
1423 ldelete:;
1424         result = heap_delete(resultRelationDesc, tupleid,
1425                                                  &ctid,
1426                                                  estate->es_snapshot->curcid,
1427                                                  estate->es_crosscheck_snapshot,
1428                                                  true /* wait for commit */);
1429         switch (result)
1430         {
1431                 case HeapTupleSelfUpdated:
1432                         /* already deleted by self; nothing to do */
1433                         return;
1434
1435                 case HeapTupleMayBeUpdated:
1436                         break;
1437
1438                 case HeapTupleUpdated:
1439                         if (IsXactIsoLevelSerializable)
1440                                 ereport(ERROR,
1441                                                 (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1442                                                  errmsg("could not serialize access due to concurrent update")));
1443                         else if (!(ItemPointerEquals(tupleid, &ctid)))
1444                         {
1445                                 TupleTableSlot *epqslot = EvalPlanQual(estate,
1446                                                            resultRelInfo->ri_RangeTableIndex, &ctid);
1447
1448                                 if (!TupIsNull(epqslot))
1449                                 {
1450                                         *tupleid = ctid;
1451                                         goto ldelete;
1452                                 }
1453                         }
1454                         /* tuple already deleted; nothing to do */
1455                         return;
1456
1457                 default:
1458                         elog(ERROR, "unrecognized heap_delete status: %u", result);
1459                         return;
1460         }
1461
1462         IncrDeleted();
1463         (estate->es_processed)++;
1464
1465         /*
1466          * Note: Normally one would think that we have to delete index tuples
1467          * associated with the heap tuple now..
1468          *
1469          * ... but in POSTGRES, we have no need to do this because the vacuum
1470          * daemon automatically opens an index scan and deletes index tuples
1471          * when it finds deleted heap tuples. -cim 9/27/89
1472          */
1473
1474         /* AFTER ROW DELETE Triggers */
1475         ExecARDeleteTriggers(estate, resultRelInfo, tupleid);
1476 }
1477
1478 /* ----------------------------------------------------------------
1479  *              ExecUpdate
1480  *
1481  *              note: we can't run UPDATE queries with transactions
1482  *              off because UPDATEs are actually INSERTs and our
1483  *              scan will mistakenly loop forever, updating the tuple
1484  *              it just inserted..      This should be fixed but until it
1485  *              is, we don't want to get stuck in an infinite loop
1486  *              which corrupts your database..
1487  * ----------------------------------------------------------------
1488  */
1489 static void
1490 ExecUpdate(TupleTableSlot *slot,
1491                    ItemPointer tupleid,
1492                    EState *estate)
1493 {
1494         HeapTuple       tuple;
1495         ResultRelInfo *resultRelInfo;
1496         Relation        resultRelationDesc;
1497         ItemPointerData ctid;
1498         int                     result;
1499         int                     numIndices;
1500
1501         /*
1502          * abort the operation if not running transactions
1503          */
1504         if (IsBootstrapProcessingMode())
1505                 elog(ERROR, "cannot UPDATE during bootstrap");
1506
1507         /*
1508          * get the heap tuple out of the tuple table slot
1509          */
1510         tuple = slot->val;
1511
1512         /*
1513          * get information on the (current) result relation
1514          */
1515         resultRelInfo = estate->es_result_relation_info;
1516         resultRelationDesc = resultRelInfo->ri_RelationDesc;
1517
1518         /* BEFORE ROW UPDATE Triggers */
1519         if (resultRelInfo->ri_TrigDesc &&
1520           resultRelInfo->ri_TrigDesc->n_before_row[TRIGGER_EVENT_UPDATE] > 0)
1521         {
1522                 HeapTuple       newtuple;
1523
1524                 newtuple = ExecBRUpdateTriggers(estate, resultRelInfo,
1525                                                                                 tupleid, tuple,
1526                                                                                 estate->es_snapshot->curcid);
1527
1528                 if (newtuple == NULL)   /* "do nothing" */
1529                         return;
1530
1531                 if (newtuple != tuple)  /* modified by Trigger(s) */
1532                 {
1533                         /*
1534                          * Insert modified tuple into tuple table slot, replacing the
1535                          * original.  We assume that it was allocated in per-tuple
1536                          * memory context, and therefore will go away by itself. The
1537                          * tuple table slot should not try to clear it.
1538                          */
1539                         ExecStoreTuple(newtuple, slot, InvalidBuffer, false);
1540                         tuple = newtuple;
1541                 }
1542         }
1543
1544         /*
1545          * Check the constraints of the tuple
1546          *
1547          * If we generate a new candidate tuple after EvalPlanQual testing, we
1548          * must loop back here and recheck constraints.  (We don't need to
1549          * redo triggers, however.      If there are any BEFORE triggers then
1550          * trigger.c will have done mark4update to lock the correct tuple, so
1551          * there's no need to do them again.)
1552          */
1553 lreplace:;
1554         if (resultRelationDesc->rd_att->constr)
1555                 ExecConstraints(resultRelInfo, slot, estate);
1556
1557         /*
1558          * replace the heap tuple
1559          */
1560         result = heap_update(resultRelationDesc, tupleid, tuple,
1561                                                  &ctid,
1562                                                  estate->es_snapshot->curcid,
1563                                                  estate->es_crosscheck_snapshot,
1564                                                  true /* wait for commit */);
1565         switch (result)
1566         {
1567                 case HeapTupleSelfUpdated:
1568                         /* already deleted by self; nothing to do */
1569                         return;
1570
1571                 case HeapTupleMayBeUpdated:
1572                         break;
1573
1574                 case HeapTupleUpdated:
1575                         if (IsXactIsoLevelSerializable)
1576                                 ereport(ERROR,
1577                                                 (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
1578                                                  errmsg("could not serialize access due to concurrent update")));
1579                         else if (!(ItemPointerEquals(tupleid, &ctid)))
1580                         {
1581                                 TupleTableSlot *epqslot = EvalPlanQual(estate,
1582                                                            resultRelInfo->ri_RangeTableIndex, &ctid);
1583
1584                                 if (!TupIsNull(epqslot))
1585                                 {
1586                                         *tupleid = ctid;
1587                                         tuple = ExecRemoveJunk(estate->es_junkFilter, epqslot);
1588                                         slot = ExecStoreTuple(tuple,
1589                                                                         estate->es_junkFilter->jf_resultSlot,
1590                                                                                   InvalidBuffer, true);
1591                                         goto lreplace;
1592                                 }
1593                         }
1594                         /* tuple already deleted; nothing to do */
1595                         return;
1596
1597                 default:
1598                         elog(ERROR, "unrecognized heap_update status: %u", result);
1599                         return;
1600         }
1601
1602         IncrReplaced();
1603         (estate->es_processed)++;
1604
1605         /*
1606          * Note: instead of having to update the old index tuples associated
1607          * with the heap tuple, all we do is form and insert new index tuples.
1608          * This is because UPDATEs are actually DELETEs and INSERTs and index
1609          * tuple deletion is done automagically by the vacuum daemon. All we
1610          * do is insert new index tuples.  -cim 9/27/89
1611          */
1612
1613         /*
1614          * process indices
1615          *
1616          * heap_update updates a tuple in the base relation by invalidating it
1617          * and then inserting a new tuple to the relation.      As a side effect,
1618          * the tupleid of the new tuple is placed in the new tuple's t_ctid
1619          * field.  So we now insert index tuples using the new tupleid stored
1620          * there.
1621          */
1622
1623         numIndices = resultRelInfo->ri_NumIndices;
1624         if (numIndices > 0)
1625                 ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false);
1626
1627         /* AFTER ROW UPDATE Triggers */
1628         ExecARUpdateTriggers(estate, resultRelInfo, tupleid, tuple);
1629 }
1630
1631 static const char *
1632 ExecRelCheck(ResultRelInfo *resultRelInfo,
1633                          TupleTableSlot *slot, EState *estate)
1634 {
1635         Relation        rel = resultRelInfo->ri_RelationDesc;
1636         int                     ncheck = rel->rd_att->constr->num_check;
1637         ConstrCheck *check = rel->rd_att->constr->check;
1638         ExprContext *econtext;
1639         MemoryContext oldContext;
1640         List       *qual;
1641         int                     i;
1642
1643         /*
1644          * If first time through for this result relation, build expression
1645          * nodetrees for rel's constraint expressions.  Keep them in the
1646          * per-query memory context so they'll survive throughout the query.
1647          */
1648         if (resultRelInfo->ri_ConstraintExprs == NULL)
1649         {
1650                 oldContext = MemoryContextSwitchTo(estate->es_query_cxt);
1651                 resultRelInfo->ri_ConstraintExprs =
1652                         (List **) palloc(ncheck * sizeof(List *));
1653                 for (i = 0; i < ncheck; i++)
1654                 {
1655                         /* ExecQual wants implicit-AND form */
1656                         qual = make_ands_implicit(stringToNode(check[i].ccbin));
1657                         resultRelInfo->ri_ConstraintExprs[i] = (List *)
1658                                 ExecPrepareExpr((Expr *) qual, estate);
1659                 }
1660                 MemoryContextSwitchTo(oldContext);
1661         }
1662
1663         /*
1664          * We will use the EState's per-tuple context for evaluating
1665          * constraint expressions (creating it if it's not already there).
1666          */
1667         econtext = GetPerTupleExprContext(estate);
1668
1669         /* Arrange for econtext's scan tuple to be the tuple under test */
1670         econtext->ecxt_scantuple = slot;
1671
1672         /* And evaluate the constraints */
1673         for (i = 0; i < ncheck; i++)
1674         {
1675                 qual = resultRelInfo->ri_ConstraintExprs[i];
1676
1677                 /*
1678                  * NOTE: SQL92 specifies that a NULL result from a constraint
1679                  * expression is not to be treated as a failure.  Therefore, tell
1680                  * ExecQual to return TRUE for NULL.
1681                  */
1682                 if (!ExecQual(qual, econtext, true))
1683                         return check[i].ccname;
1684         }
1685
1686         /* NULL result means no error */
1687         return NULL;
1688 }
1689
1690 void
1691 ExecConstraints(ResultRelInfo *resultRelInfo,
1692                                 TupleTableSlot *slot, EState *estate)
1693 {
1694         Relation        rel = resultRelInfo->ri_RelationDesc;
1695         HeapTuple       tuple = slot->val;
1696         TupleConstr *constr = rel->rd_att->constr;
1697
1698         Assert(constr);
1699
1700         if (constr->has_not_null)
1701         {
1702                 int                     natts = rel->rd_att->natts;
1703                 int                     attrChk;
1704
1705                 for (attrChk = 1; attrChk <= natts; attrChk++)
1706                 {
1707                         if (rel->rd_att->attrs[attrChk - 1]->attnotnull &&
1708                                 heap_attisnull(tuple, attrChk))
1709                                 ereport(ERROR,
1710                                                 (errcode(ERRCODE_NOT_NULL_VIOLATION),
1711                                                  errmsg("null value in column \"%s\" violates not-null constraint",
1712                                         NameStr(rel->rd_att->attrs[attrChk - 1]->attname))));
1713                 }
1714         }
1715
1716         if (constr->num_check > 0)
1717         {
1718                 const char *failed;
1719
1720                 if ((failed = ExecRelCheck(resultRelInfo, slot, estate)) != NULL)
1721                         ereport(ERROR,
1722                                         (errcode(ERRCODE_CHECK_VIOLATION),
1723                                          errmsg("new row for relation \"%s\" violates check constraint \"%s\"",
1724                                                         RelationGetRelationName(rel), failed)));
1725         }
1726 }
1727
1728 /*
1729  * Check a modified tuple to see if we want to process its updated version
1730  * under READ COMMITTED rules.
1731  *
1732  * See backend/executor/README for some info about how this works.
1733  */
1734 TupleTableSlot *
1735 EvalPlanQual(EState *estate, Index rti, ItemPointer tid)
1736 {
1737         evalPlanQual *epq;
1738         EState     *epqstate;
1739         Relation        relation;
1740         HeapTupleData tuple;
1741         HeapTuple       copyTuple = NULL;
1742         bool            endNode;
1743
1744         Assert(rti != 0);
1745
1746         /*
1747          * find relation containing target tuple
1748          */
1749         if (estate->es_result_relation_info != NULL &&
1750                 estate->es_result_relation_info->ri_RangeTableIndex == rti)
1751                 relation = estate->es_result_relation_info->ri_RelationDesc;
1752         else
1753         {
1754                 List       *l;
1755
1756                 relation = NULL;
1757                 foreach(l, estate->es_rowMark)
1758                 {
1759                         if (((execRowMark *) lfirst(l))->rti == rti)
1760                         {
1761                                 relation = ((execRowMark *) lfirst(l))->relation;
1762                                 break;
1763                         }
1764                 }
1765                 if (relation == NULL)
1766                         elog(ERROR, "could not find RowMark for RT index %u", rti);
1767         }
1768
1769         /*
1770          * fetch tid tuple
1771          *
1772          * Loop here to deal with updated or busy tuples
1773          */
1774         tuple.t_self = *tid;
1775         for (;;)
1776         {
1777                 Buffer          buffer;
1778
1779                 if (heap_fetch(relation, SnapshotDirty, &tuple, &buffer, false, NULL))
1780                 {
1781                         TransactionId xwait = SnapshotDirty->xmax;
1782
1783                         /* xmin should not be dirty... */
1784                         if (TransactionIdIsValid(SnapshotDirty->xmin))
1785                                 elog(ERROR, "t_xmin is uncommitted in tuple to be updated");
1786
1787                         /*
1788                          * If tuple is being updated by other transaction then we have
1789                          * to wait for its commit/abort.
1790                          */
1791                         if (TransactionIdIsValid(xwait))
1792                         {
1793                                 ReleaseBuffer(buffer);
1794                                 XactLockTableWait(xwait);
1795                                 continue;
1796                         }
1797
1798                         /*
1799                          * We got tuple - now copy it for use by recheck query.
1800                          */
1801                         copyTuple = heap_copytuple(&tuple);
1802                         ReleaseBuffer(buffer);
1803                         break;
1804                 }
1805
1806                 /*
1807                  * Oops! Invalid tuple. Have to check is it updated or deleted.
1808                  * Note that it's possible to get invalid SnapshotDirty->tid if
1809                  * tuple updated by this transaction. Have we to check this ?
1810                  */
1811                 if (ItemPointerIsValid(&(SnapshotDirty->tid)) &&
1812                         !(ItemPointerEquals(&(tuple.t_self), &(SnapshotDirty->tid))))
1813                 {
1814                         /* updated, so look at the updated copy */
1815                         tuple.t_self = SnapshotDirty->tid;
1816                         continue;
1817                 }
1818
1819                 /*
1820                  * Deleted or updated by this transaction; forget it.
1821                  */
1822                 return NULL;
1823         }
1824
1825         /*
1826          * For UPDATE/DELETE we have to return tid of actual row we're
1827          * executing PQ for.
1828          */
1829         *tid = tuple.t_self;
1830
1831         /*
1832          * Need to run a recheck subquery.      Find or create a PQ stack entry.
1833          */
1834         epq = estate->es_evalPlanQual;
1835         endNode = true;
1836
1837         if (epq != NULL && epq->rti == 0)
1838         {
1839                 /* Top PQ stack entry is idle, so re-use it */
1840                 Assert(!(estate->es_useEvalPlan) && epq->next == NULL);
1841                 epq->rti = rti;
1842                 endNode = false;
1843         }
1844
1845         /*
1846          * If this is request for another RTE - Ra, - then we have to check
1847          * wasn't PlanQual requested for Ra already and if so then Ra' row was
1848          * updated again and we have to re-start old execution for Ra and
1849          * forget all what we done after Ra was suspended. Cool? -:))
1850          */
1851         if (epq != NULL && epq->rti != rti &&
1852                 epq->estate->es_evTuple[rti - 1] != NULL)
1853         {
1854                 do
1855                 {
1856                         evalPlanQual *oldepq;
1857
1858                         /* stop execution */
1859                         EvalPlanQualStop(epq);
1860                         /* pop previous PlanQual from the stack */
1861                         oldepq = epq->next;
1862                         Assert(oldepq && oldepq->rti != 0);
1863                         /* push current PQ to freePQ stack */
1864                         oldepq->free = epq;
1865                         epq = oldepq;
1866                         estate->es_evalPlanQual = epq;
1867                 } while (epq->rti != rti);
1868         }
1869
1870         /*
1871          * If we are requested for another RTE then we have to suspend
1872          * execution of current PlanQual and start execution for new one.
1873          */
1874         if (epq == NULL || epq->rti != rti)
1875         {
1876                 /* try to reuse plan used previously */
1877                 evalPlanQual *newepq = (epq != NULL) ? epq->free : NULL;
1878
1879                 if (newepq == NULL)             /* first call or freePQ stack is empty */
1880                 {
1881                         newepq = (evalPlanQual *) palloc0(sizeof(evalPlanQual));
1882                         newepq->free = NULL;
1883                         newepq->estate = NULL;
1884                         newepq->planstate = NULL;
1885                 }
1886                 else
1887                 {
1888                         /* recycle previously used PlanQual */
1889                         Assert(newepq->estate == NULL);
1890                         epq->free = NULL;
1891                 }
1892                 /* push current PQ to the stack */
1893                 newepq->next = epq;
1894                 epq = newepq;
1895                 estate->es_evalPlanQual = epq;
1896                 epq->rti = rti;
1897                 endNode = false;
1898         }
1899
1900         Assert(epq->rti == rti);
1901
1902         /*
1903          * Ok - we're requested for the same RTE.  Unfortunately we still have
1904          * to end and restart execution of the plan, because ExecReScan
1905          * wouldn't ensure that upper plan nodes would reset themselves.  We
1906          * could make that work if insertion of the target tuple were
1907          * integrated with the Param mechanism somehow, so that the upper plan
1908          * nodes know that their children's outputs have changed.
1909          *
1910          * Note that the stack of free evalPlanQual nodes is quite useless at the
1911          * moment, since it only saves us from pallocing/releasing the
1912          * evalPlanQual nodes themselves.  But it will be useful once we
1913          * implement ReScan instead of end/restart for re-using PlanQual
1914          * nodes.
1915          */
1916         if (endNode)
1917         {
1918                 /* stop execution */
1919                 EvalPlanQualStop(epq);
1920         }
1921
1922         /*
1923          * Initialize new recheck query.
1924          *
1925          * Note: if we were re-using PlanQual plans via ExecReScan, we'd need to
1926          * instead copy down changeable state from the top plan (including
1927          * es_result_relation_info, es_junkFilter) and reset locally
1928          * changeable state in the epq (including es_param_exec_vals,
1929          * es_evTupleNull).
1930          */
1931         EvalPlanQualStart(epq, estate, epq->next);
1932
1933         /*
1934          * free old RTE' tuple, if any, and store target tuple where
1935          * relation's scan node will see it
1936          */
1937         epqstate = epq->estate;
1938         if (epqstate->es_evTuple[rti - 1] != NULL)
1939                 heap_freetuple(epqstate->es_evTuple[rti - 1]);
1940         epqstate->es_evTuple[rti - 1] = copyTuple;
1941
1942         return EvalPlanQualNext(estate);
1943 }
1944
1945 static TupleTableSlot *
1946 EvalPlanQualNext(EState *estate)
1947 {
1948         evalPlanQual *epq = estate->es_evalPlanQual;
1949         MemoryContext oldcontext;
1950         TupleTableSlot *slot;
1951
1952         Assert(epq->rti != 0);
1953
1954 lpqnext:;
1955         oldcontext = MemoryContextSwitchTo(epq->estate->es_query_cxt);
1956         slot = ExecProcNode(epq->planstate);
1957         MemoryContextSwitchTo(oldcontext);
1958
1959         /*
1960          * No more tuples for this PQ. Continue previous one.
1961          */
1962         if (TupIsNull(slot))
1963         {
1964                 evalPlanQual *oldepq;
1965
1966                 /* stop execution */
1967                 EvalPlanQualStop(epq);
1968                 /* pop old PQ from the stack */
1969                 oldepq = epq->next;
1970                 if (oldepq == NULL)
1971                 {
1972                         /* this is the first (oldest) PQ - mark as free */
1973                         epq->rti = 0;
1974                         estate->es_useEvalPlan = false;
1975                         /* and continue Query execution */
1976                         return (NULL);
1977                 }
1978                 Assert(oldepq->rti != 0);
1979                 /* push current PQ to freePQ stack */
1980                 oldepq->free = epq;
1981                 epq = oldepq;
1982                 estate->es_evalPlanQual = epq;
1983                 goto lpqnext;
1984         }
1985
1986         return (slot);
1987 }
1988
1989 static void
1990 EndEvalPlanQual(EState *estate)
1991 {
1992         evalPlanQual *epq = estate->es_evalPlanQual;
1993
1994         if (epq->rti == 0)                      /* plans already shutdowned */
1995         {
1996                 Assert(epq->next == NULL);
1997                 return;
1998         }
1999
2000         for (;;)
2001         {
2002                 evalPlanQual *oldepq;
2003
2004                 /* stop execution */
2005                 EvalPlanQualStop(epq);
2006                 /* pop old PQ from the stack */
2007                 oldepq = epq->next;
2008                 if (oldepq == NULL)
2009                 {
2010                         /* this is the first (oldest) PQ - mark as free */
2011                         epq->rti = 0;
2012                         estate->es_useEvalPlan = false;
2013                         break;
2014                 }
2015                 Assert(oldepq->rti != 0);
2016                 /* push current PQ to freePQ stack */
2017                 oldepq->free = epq;
2018                 epq = oldepq;
2019                 estate->es_evalPlanQual = epq;
2020         }
2021 }
2022
2023 /*
2024  * Start execution of one level of PlanQual.
2025  *
2026  * This is a cut-down version of ExecutorStart(): we copy some state from
2027  * the top-level estate rather than initializing it fresh.
2028  */
2029 static void
2030 EvalPlanQualStart(evalPlanQual *epq, EState *estate, evalPlanQual *priorepq)
2031 {
2032         EState     *epqstate;
2033         int                     rtsize;
2034         MemoryContext oldcontext;
2035
2036         rtsize = length(estate->es_range_table);
2037
2038         epq->estate = epqstate = CreateExecutorState();
2039
2040         oldcontext = MemoryContextSwitchTo(epqstate->es_query_cxt);
2041
2042         /*
2043          * The epqstates share the top query's copy of unchanging state such
2044          * as the snapshot, rangetable, result-rel info, and external Param
2045          * info. They need their own copies of local state, including a tuple
2046          * table, es_param_exec_vals, etc.
2047          */
2048         epqstate->es_direction = ForwardScanDirection;
2049         epqstate->es_snapshot = estate->es_snapshot;
2050         epqstate->es_crosscheck_snapshot = estate->es_crosscheck_snapshot;
2051         epqstate->es_range_table = estate->es_range_table;
2052         epqstate->es_result_relations = estate->es_result_relations;
2053         epqstate->es_num_result_relations = estate->es_num_result_relations;
2054         epqstate->es_result_relation_info = estate->es_result_relation_info;
2055         epqstate->es_junkFilter = estate->es_junkFilter;
2056         epqstate->es_into_relation_descriptor = estate->es_into_relation_descriptor;
2057         epqstate->es_param_list_info = estate->es_param_list_info;
2058         if (estate->es_topPlan->nParamExec > 0)
2059                 epqstate->es_param_exec_vals = (ParamExecData *)
2060                         palloc0(estate->es_topPlan->nParamExec * sizeof(ParamExecData));
2061         epqstate->es_rowMark = estate->es_rowMark;
2062         epqstate->es_instrument = estate->es_instrument;
2063         epqstate->es_force_oids = estate->es_force_oids;
2064         epqstate->es_topPlan = estate->es_topPlan;
2065
2066         /*
2067          * Each epqstate must have its own es_evTupleNull state, but all the
2068          * stack entries share es_evTuple state.  This allows sub-rechecks to
2069          * inherit the value being examined by an outer recheck.
2070          */
2071         epqstate->es_evTupleNull = (bool *) palloc0(rtsize * sizeof(bool));
2072         if (priorepq == NULL)
2073                 /* first PQ stack entry */
2074                 epqstate->es_evTuple = (HeapTuple *)
2075                         palloc0(rtsize * sizeof(HeapTuple));
2076         else
2077                 /* later stack entries share the same storage */
2078                 epqstate->es_evTuple = priorepq->estate->es_evTuple;
2079
2080         epqstate->es_tupleTable =
2081                 ExecCreateTupleTable(estate->es_tupleTable->size);
2082
2083         epq->planstate = ExecInitNode(estate->es_topPlan, epqstate);
2084
2085         MemoryContextSwitchTo(oldcontext);
2086 }
2087
2088 /*
2089  * End execution of one level of PlanQual.
2090  *
2091  * This is a cut-down version of ExecutorEnd(); basically we want to do most
2092  * of the normal cleanup, but *not* close result relations (which we are
2093  * just sharing from the outer query).
2094  */
2095 static void
2096 EvalPlanQualStop(evalPlanQual *epq)
2097 {
2098         EState     *epqstate = epq->estate;
2099         MemoryContext oldcontext;
2100
2101         oldcontext = MemoryContextSwitchTo(epqstate->es_query_cxt);
2102
2103         ExecEndNode(epq->planstate);
2104
2105         ExecDropTupleTable(epqstate->es_tupleTable, true);
2106         epqstate->es_tupleTable = NULL;
2107
2108         if (epqstate->es_evTuple[epq->rti - 1] != NULL)
2109         {
2110                 heap_freetuple(epqstate->es_evTuple[epq->rti - 1]);
2111                 epqstate->es_evTuple[epq->rti - 1] = NULL;
2112         }
2113
2114         MemoryContextSwitchTo(oldcontext);
2115
2116         FreeExecutorState(epqstate);
2117
2118         epq->estate = NULL;
2119         epq->planstate = NULL;
2120 }