1. 03 Jul, 2011 1 commit
    • Robert Haas's avatar
      Fix bugs in relpersistence handling during table creation. · 5da79169
      Robert Haas authored
      Unlike the relistemp field which it replaced, relpersistence must be
      set correctly quite early during the table creation process, as we
      rely on it quite early on for a number of purposes, including security
      checks.  Normally, this is set based on whether the user enters CREATE
      TABLE, CREATE UNLOGGED TABLE, or CREATE TEMPORARY TABLE, but a
      relation may also be made implicitly temporary by creating it in
      pg_temp.  This patch fixes the handling of that case, and also
      disables creation of unlogged tables in temporary tablespace (such
      table indeed skip WAL-logging, but we reject an explicit
      specification) and creation of relations in the temporary schemas of
      other sessions (which is not very sensible, and didn't work right
      anyway).
      
      Report by Amit Khandekar.
      5da79169
  2. 20 Jun, 2011 1 commit
    • Alvaro Herrera's avatar
      Remove extra copying of TupleDescs for heap_create_with_catalog · a40a5d94
      Alvaro Herrera authored
      Some callers were creating copies of tuple descriptors to pass to that
      function, stating in code comments that it was necessary because it
      modified the passed descriptor.  Code inspection reveals this not to be
      true, and indeed not all callers are passing copies in the first place.
      So remove the extra ones and the misleading comments about this behavior
      as well.
      a40a5d94
  3. 02 Jun, 2011 1 commit
    • Tom Lane's avatar
      Disallow SELECT FOR UPDATE/SHARE on sequences. · 21538377
      Tom Lane authored
      We can't allow this because such an operation stores its transaction XID
      into the sequence tuple's xmax.  Because VACUUM doesn't process sequences
      (and we don't want it to start doing so), such an xmax value won't get
      frozen, meaning it will eventually refer to nonexistent pg_clog storage,
      and even wrap around completely.  Since the row lock is ignored by nextval
      and setval, the usefulness of the operation is highly debatable anyway.
      Per reports of trouble with pgpool 3.0, which had ill-advisedly started
      using such commands as a form of locking.
      
      In HEAD, also disallow SELECT FOR UPDATE/SHARE on toast tables.  Although
      this does work safely given the current implementation, there seems no
      good reason to allow it.  I refrained from changing that behavior in
      back branches, however.
      21538377
  4. 25 Apr, 2011 1 commit
    • Robert Haas's avatar
      Refactor broken CREATE TABLE IF NOT EXISTS support. · 68ef051f
      Robert Haas authored
      Per bug #5988, reported by Marko Tiikkaja, and further analyzed by Tom
      Lane, the previous coding was broken in several respects: even if the
      target table already existed, a subsequent CREATE TABLE IF NOT EXISTS
      might try to add additional constraints or sequences-for-serial
      specified in the new CREATE TABLE statement.
      
      In passing, this also fixes a minor information leak: it's no longer
      possible to figure out whether a schema to which you don't have CREATE
      access contains a sequence named like "x_y_seq" by attempting to create a
      table in that schema called "x" with a serial column called "y".
      
      Some more refactoring of this code in the future might be warranted,
      but that will need to wait for a later major release.
      68ef051f
  5. 10 Apr, 2011 1 commit
  6. 27 Feb, 2011 1 commit
    • Tom Lane's avatar
      Refactor the executor's API to support data-modifying CTEs better. · a874fe7b
      Tom Lane authored
      The originally committed patch for modifying CTEs didn't interact well
      with EXPLAIN, as noted by myself, and also had corner-case problems with
      triggers, as noted by Dean Rasheed.  Those problems show it is really not
      practical for ExecutorEnd to call any user-defined code; so split the
      cleanup duties out into a new function ExecutorFinish, which must be called
      between the last ExecutorRun call and ExecutorEnd.  Some Asserts have been
      added to these functions to help verify correct usage.
      
      It is no longer necessary for callers of the executor to call
      AfterTriggerBeginQuery/AfterTriggerEndQuery for themselves, as this is now
      done by ExecutorStart/ExecutorFinish respectively.  If you really need to
      suppress that and do it for yourself, pass EXEC_FLAG_SKIP_TRIGGERS to
      ExecutorStart.
      
      Also, refactor portal commit processing to allow for the possibility that
      PortalDrop will invoke user-defined code.  I think this is not actually
      necessary just yet, since the portal-execution-strategy logic forces any
      non-pure-SELECT query to be run to completion before we will consider
      committing.  But it seems like good future-proofing.
      a874fe7b
  7. 25 Feb, 2011 1 commit
    • Tom Lane's avatar
      Support data-modifying commands (INSERT/UPDATE/DELETE) in WITH. · 389af951
      Tom Lane authored
      This patch implements data-modifying WITH queries according to the
      semantics that the updates all happen with the same command counter value,
      and in an unspecified order.  Therefore one WITH clause can't see the
      effects of another, nor can the outer query see the effects other than
      through the RETURNING values.  And attempts to do conflicting updates will
      have unpredictable results.  We'll need to document all that.
      
      This commit just fixes the code; documentation updates are waiting on
      author.
      
      Marko Tiikkaja and Hitoshi Harada
      389af951
  8. 20 Feb, 2011 1 commit
  9. 10 Feb, 2011 1 commit
    • Tom Lane's avatar
      Fix improper matching of resjunk column names for FOR UPDATE in subselect. · e617f0d7
      Tom Lane authored
      Flattening of subquery range tables during setrefs.c could lead to the
      rangetable indexes in PlanRowMark nodes not matching up with the column
      names previously assigned to the corresponding resjunk ctid (resp. tableoid
      or wholerow) columns.  Typical symptom would be either a "cannot extract
      system attribute from virtual tuple" error or an Assert failure.  This
      wasn't a problem before 9.0 because we didn't support FOR UPDATE below the
      top query level, and so the final flattening could never renumber an RTE
      that was relevant to FOR UPDATE.  Fix by using a plan-tree-wide unique
      number for each PlanRowMark to label the associated resjunk columns, so
      that the number need not change during flattening.
      
      Per report from David Johnston (though I'm darned if I can see how this got
      past initial testing of the relevant code).  Back-patch to 9.0.
      e617f0d7
  10. 13 Jan, 2011 1 commit
    • Tom Lane's avatar
      Fix PlanRowMark/ExecRowMark structures to handle inheritance correctly. · d487afbb
      Tom Lane authored
      In an inherited UPDATE/DELETE, each target table has its own subplan,
      because it might have a column set different from other targets.  This
      means that the resjunk columns we add to support EvalPlanQual might be
      at different physical column numbers in each subplan.  The EvalPlanQual
      rewrite I did for 9.0 failed to account for this, resulting in possible
      misbehavior or even crashes during concurrent updates to the same row,
      as seen in a recent report from Gordon Shannon.  Revise the data structure
      so that we track resjunk column numbers separately for each subplan.
      
      I also chose to move responsibility for identifying the physical column
      numbers back to executor startup, instead of assuming that numbers derived
      during preprocess_targetlist would stay valid throughout subsequent
      massaging of the plan.  That's a bit slower, so we might want to consider
      undoing it someday; but it would complicate the patch considerably and
      didn't seem justifiable in a bug fix that has to be back-patched to 9.0.
      d487afbb
  11. 02 Jan, 2011 1 commit
    • Robert Haas's avatar
      Basic foreign table support. · 0d692a0d
      Robert Haas authored
      Foreign tables are a core component of SQL/MED.  This commit does
      not provide a working SQL/MED infrastructure, because foreign tables
      cannot yet be queried.  Support for foreign table scans will need to
      be added in a future patch.  However, this patch creates the necessary
      system catalog structure, syntax support, and support for ancillary
      operations such as COMMENT and SECURITY LABEL.
      
      Shigeru Hanada, heavily revised by Robert Haas
      0d692a0d
  12. 01 Jan, 2011 1 commit
  13. 13 Dec, 2010 1 commit
    • Robert Haas's avatar
      Generalize concept of temporary relations to "relation persistence". · 5f7b58fa
      Robert Haas authored
      This commit replaces pg_class.relistemp with pg_class.relpersistence;
      and also modifies the RangeVar node type to carry relpersistence rather
      than istemp.  It also removes removes rd_istemp from RelationData and
      instead performs the correct computation based on relpersistence.
      
      For clarity, we add three new macros: RelationNeedsWAL(),
      RelationUsesLocalBuffers(), and RelationUsesTempNamespace(), so that we
      can clarify the purpose of each check that previous depended on
      rd_istemp.
      
      This is intended as infrastructure for the upcoming unlogged tables
      patch, as well as for future possible work on global temporary tables.
      5f7b58fa
  14. 10 Oct, 2010 1 commit
    • Tom Lane's avatar
      Support triggers on views. · 2ec993a7
      Tom Lane authored
      This patch adds the SQL-standard concept of an INSTEAD OF trigger, which
      is fired instead of performing a physical insert/update/delete.  The
      trigger function is passed the entire old and/or new rows of the view,
      and must figure out what to do to the underlying tables to implement
      the update.  So this feature can be used to implement updatable views
      using trigger programming style rather than rule hacking.
      
      In passing, this patch corrects the names of some columns in the
      information_schema.triggers view.  It seems the SQL committee renamed
      them somewhere between SQL:99 and SQL:2003.
      
      Dean Rasheed, reviewed by Bernd Helmle; some additional hacking by me.
      2ec993a7
  15. 20 Sep, 2010 1 commit
  16. 11 Sep, 2010 1 commit
    • Joe Conway's avatar
      SERIALIZABLE transactions are actually implemented beneath the covers with · 5eb15c99
      Joe Conway authored
      transaction snapshots, i.e. a snapshot registered at the beginning of
      a transaction. Change variable naming and comments to reflect this reality
      in preparation for a future, truly serializable mode, e.g.
      Serializable Snapshot Isolation (SSI).
      
      For the moment transaction snapshots are still used to implement
      SERIALIZABLE, but hopefully not for too much longer. Patch by Kevin
      Grittner and Dan Ports with review and some minor wording changes by me.
      5eb15c99
  17. 05 Aug, 2010 1 commit
    • Robert Haas's avatar
      Standardize get_whatever_oid functions for object types with · 2a6ef344
      Robert Haas authored
      unqualified names.
      
      - Add a missing_ok parameter to get_tablespace_oid.
      - Avoid duplicating get_tablespace_od guts in objectNamesToOids.
      - Add a missing_ok parameter to get_database_oid.
      - Replace get_roleid and get_role_checked with get_role_oid.
      - Add get_namespace_oid, get_language_oid, get_am_oid.
      - Refactor existing code to use new interfaces.
      
      Thanks to KaiGai Kohei for the review.
      2a6ef344
  18. 25 Jul, 2010 1 commit
  19. 22 Jul, 2010 1 commit
    • Robert Haas's avatar
      Centralize DML permissions-checking logic. · b8c6c71d
      Robert Haas authored
      Remove bespoke code in DoCopy and RI_Initial_Check, which now instead
      fabricate call ExecCheckRTPerms with a manufactured RangeTblEntry.
      This is intended to make it feasible for an enhanced security provider
      to actually make use of ExecutorCheckPerms_hook, but also has the
      advantage that RI_Initial_Check can allow use of the fast-path when
      column-level but not table-level permissions are present.
      
      KaiGai Kohei.  Reviewed (in an earlier version) by Stephen Frost, and by me.
      Some further changes to the comments by me.
      b8c6c71d
  20. 12 Jul, 2010 1 commit
    • Tom Lane's avatar
      Make NestLoop plan nodes pass outer-relation variables into their inner · 53e75768
      Tom Lane authored
      relation using the general PARAM_EXEC executor parameter mechanism, rather
      than the ad-hoc kluge of passing the outer tuple down through ExecReScan.
      The previous method was hard to understand and could never be extended to
      handle parameters coming from multiple join levels.  This patch doesn't
      change the set of possible plans nor have any significant performance effect,
      but it's necessary infrastructure for future generalization of the concept
      of an inner indexscan plan.
      
      ExecReScan's second parameter is now unused, so it's removed.
      53e75768
  21. 09 Jul, 2010 1 commit
  22. 28 Apr, 2010 1 commit
    • Heikki Linnakangas's avatar
      Introduce wal_level GUC to explicitly control if information needed for · 9b8a7332
      Heikki Linnakangas authored
      archival or hot standby should be WAL-logged, instead of deducing that from
      other options like archive_mode. This replaces recovery_connections GUC in
      the primary, where it now has no effect, but it's still used in the standby
      to enable/disable hot standby.
      
      Remove the WAL-logging of "unlogged operations", like creating an index
      without WAL-logging and fsyncing it at the end. Instead, we keep a copy of
      the wal_mode setting and the settings that affect how much shared memory a
      hot standby server needs to track master transactions (max_connections,
      max_prepared_xacts, max_locks_per_xact) in pg_control. Whenever the settings
      change, at server restart, write a WAL record noting the new settings and
      update pg_control. This allows us to notice the change in those settings in
      the standby at the right moment, they used to be included in checkpoint
      records, but that meant that a changed value was not reflected in the
      standby until the first checkpoint after the change.
      
      Bump PG_CONTROL_VERSION and XLOG_PAGE_MAGIC. Whack XLOG_PAGE_MAGIC back to
      the sequence it used to follow, before hot standby and subsequent patches
      changed it to 0x9003.
      9b8a7332
  23. 26 Feb, 2010 1 commit
  24. 20 Feb, 2010 1 commit
    • Tom Lane's avatar
      Clean up handling of XactReadOnly and RecoveryInProgress checks. · 05d8a561
      Tom Lane authored
      Add some checks that seem logically necessary, in particular let's make
      real sure that HS slave sessions cannot create temp tables.  (If they did
      they would think that temp tables belonging to the master's session with
      the same BackendId were theirs.  We *must* not allow myTempNamespace to
      become set in a slave session.)
      
      Change setval() and nextval() so that they are only allowed on temp sequences
      in a read-only transaction.  This seems consistent with what we allow for
      table modifications in read-only transactions.  Since an HS slave can't have a
      temp sequence, this also provides a nicer cure for the setval PANIC reported
      by Erik Rijkers.
      
      Make the error messages more uniform, and have them mention the specific
      command being complained of.  This seems worth the trifling amount of extra
      code, since people are likely to see such messages a lot more than before.
      05d8a561
  25. 09 Feb, 2010 1 commit
    • Tom Lane's avatar
      Fix up rickety handling of relation-truncation interlocks. · cbe9d6be
      Tom Lane authored
      Move rd_targblock, rd_fsm_nblocks, and rd_vm_nblocks from relcache to the smgr
      relation entries, so that they will get reset to InvalidBlockNumber whenever
      an smgr-level flush happens.  Because we now send smgr invalidation messages
      immediately (not at end of transaction) when a relation truncation occurs,
      this ensures that other backends will reset their values before they next
      access the relation.  We no longer need the unreliable assumption that a
      VACUUM that's doing a truncation will hold its AccessExclusive lock until
      commit --- in fact, we can intentionally release that lock as soon as we've
      completed the truncation.  This patch therefore reverts (most of) Alvaro's
      patch of 2009-11-10, as well as my marginal hacking on it yesterday.  We can
      also get rid of assorted no-longer-needed relcache flushes, which are far more
      expensive than an smgr flush because they kill a lot more state.
      
      In passing this patch fixes smgr_redo's failure to perform visibility-map
      truncation, and cleans up some rather dubious assumptions in freespace.c and
      visibilitymap.c about when rd_fsm_nblocks and rd_vm_nblocks can be out of
      date.
      cbe9d6be
  26. 07 Feb, 2010 1 commit
    • Tom Lane's avatar
      Create a "relation mapping" infrastructure to support changing the relfilenodes · b9b8831a
      Tom Lane authored
      of shared or nailed system catalogs.  This has two key benefits:
      
      * The new CLUSTER-based VACUUM FULL can be applied safely to all catalogs.
      
      * We no longer have to use an unsafe reindex-in-place approach for reindexing
        shared catalogs.
      
      CLUSTER on nailed catalogs now works too, although I left it disabled on
      shared catalogs because the resulting pg_index.indisclustered update would
      only be visible in one database.
      
      Since reindexing shared system catalogs is now fully transactional and
      crash-safe, the former special cases in REINDEX behavior have been removed;
      shared catalogs are treated the same as non-shared.
      
      This commit does not do anything about the recently-discussed problem of
      deadlocks between VACUUM FULL/CLUSTER on a system catalog and other
      concurrent queries; will address that in a separate patch.  As a stopgap,
      parallel_schedule has been tweaked to run vacuum.sql by itself, to avoid
      such failures during the regression tests.
      b9b8831a
  27. 03 Feb, 2010 1 commit
  28. 28 Jan, 2010 1 commit
  29. 15 Jan, 2010 1 commit
    • Heikki Linnakangas's avatar
      Introduce Streaming Replication. · 40f908bd
      Heikki Linnakangas authored
      This includes two new kinds of postmaster processes, walsenders and
      walreceiver. Walreceiver is responsible for connecting to the primary server
      and streaming WAL to disk, while walsender runs in the primary server and
      streams WAL from disk to the client.
      
      Documentation still needs work, but the basics are there. We will probably
      pull the replication section to a new chapter later on, as well as the
      sections describing file-based replication. But let's do that as a separate
      patch, so that it's easier to see what has been added/changed. This patch
      also adds a new section to the chapter about FE/BE protocol, documenting the
      protocol used by walsender/walreceivxer.
      
      Bump catalog version because of two new functions,
      pg_last_xlog_receive_location() and pg_last_xlog_replay_location(), for
      monitoring the progress of replication.
      
      Fujii Masao, with additional hacking by me
      40f908bd
  30. 08 Jan, 2010 1 commit
    • Tom Lane's avatar
      Fix oversight in EvalPlanQualFetch: after failing to lock a tuple because · 217dc525
      Tom Lane authored
      someone else has just updated it, we have to set priorXmax to that tuple's
      xmax (ie, the XID of the other xact that updated it) before looping back to
      examine the next tuple.  Obviously, the next tuple in the update chain should
      have that XID as its xmin, not the same xmin as the preceding tuple that we
      had been trying to lock.  The mismatch would cause the EvalPlanQual logic to
      decide that the tuple chain ended in a deletion, when actually there was a
      live tuple that should have been found.
      
      I inserted this error when recently adding logic to EvalPlanQual to make it
      lock tuples before returning them (as opposed to the old method in which the
      lock would occur much later, causing a great deal of work to be wasted if we
      only then discover someone else updated it).  Sigh.  Per today's report from
      Takahiro Itagaki of inconsistent results during pgbench runs.
      217dc525
  31. 06 Jan, 2010 1 commit
    • Bruce Momjian's avatar
      Preserve relfilenodes: · f98fbc78
      Bruce Momjian authored
      Add support to pg_dump --binary-upgrade to preserve all relfilenodes,
      for use by pg_migrator.
      f98fbc78
  32. 02 Jan, 2010 1 commit
  33. 15 Dec, 2009 1 commit
  34. 11 Dec, 2009 1 commit
    • Tom Lane's avatar
      Ensure that the result tuple of an EvalPlanQual cycle gets materialized · d8e511fa
      Tom Lane authored
      before we zap the input tuple.  Otherwise, pass-by-reference columns of
      the result slot are likely to contain just references to the input
      tuple, leading to big trouble if the pfree'd space is reused.  Per
      trouble report from Jaime Casanova.  This is a new bug in the recent
      rewrite of EvalPlanQual, so nothing to back-patch.
      d8e511fa
  35. 09 Dec, 2009 1 commit
    • Tom Lane's avatar
      Prevent indirect security attacks via changing session-local state within · 62aba765
      Tom Lane authored
      an allegedly immutable index function.  It was previously recognized that
      we had to prevent such a function from executing SET/RESET ROLE/SESSION
      AUTHORIZATION, or it could trivially obtain the privileges of the session
      user.  However, since there is in general no privilege checking for changes
      of session-local state, it is also possible for such a function to change
      settings in a way that might subvert later operations in the same session.
      Examples include changing search_path to cause an unexpected function to
      be called, or replacing an existing prepared statement with another one
      that will execute a function of the attacker's choosing.
      
      The present patch secures VACUUM, ANALYZE, and CREATE INDEX/REINDEX against
      these threats, which are the same places previously deemed to need protection
      against the SET ROLE issue.  GUC changes are still allowed, since there are
      many useful cases for that, but we prevent security problems by forcing a
      rollback of any GUC change after completing the operation.  Other cases are
      handled by throwing an error if any change is attempted; these include temp
      table creation, closing a cursor, and creating or deleting a prepared
      statement.  (In 7.4, the infrastructure to roll back GUC changes doesn't
      exist, so we settle for rejecting changes of "search_path" in these contexts.)
      
      Original report and patch by Gurjeet Singh, additional analysis by
      Tom Lane.
      
      Security: CVE-2009-4136
      62aba765
  36. 20 Nov, 2009 1 commit
    • Tom Lane's avatar
      Add a WHEN clause to CREATE TRIGGER, allowing a boolean expression to be · 7fc0f062
      Tom Lane authored
      checked to determine whether the trigger should be fired.
      
      For BEFORE triggers this is mostly a matter of spec compliance; but for AFTER
      triggers it can provide a noticeable performance improvement, since queuing of
      a deferred trigger event and re-fetching of the row(s) at end of statement can
      be short-circuited if the trigger does not need to be fired.
      
      Takahiro Itagaki, reviewed by KaiGai Kohei.
      7fc0f062
  37. 26 Oct, 2009 1 commit
    • Tom Lane's avatar
      Re-implement EvalPlanQual processing to improve its performance and eliminate · 9f2ee8f2
      Tom Lane authored
      a lot of strange behaviors that occurred in join cases.  We now identify the
      "current" row for every joined relation in UPDATE, DELETE, and SELECT FOR
      UPDATE/SHARE queries.  If an EvalPlanQual recheck is necessary, we jam the
      appropriate row into each scan node in the rechecking plan, forcing it to emit
      only that one row.  The former behavior could rescan the whole of each joined
      relation for each recheck, which was terrible for performance, and what's much
      worse could result in duplicated output tuples.
      
      Also, the original implementation of EvalPlanQual could not re-use the recheck
      execution tree --- it had to go through a full executor init and shutdown for
      every row to be tested.  To avoid this overhead, I've associated a special
      runtime Param with each LockRows or ModifyTable plan node, and arranged to
      make every scan node below such a node depend on that Param.  Thus, by
      signaling a change in that Param, the EPQ machinery can just rescan the
      already-built test plan.
      
      This patch also adds a prohibition on set-returning functions in the
      targetlist of SELECT FOR UPDATE/SHARE.  This is needed to avoid the
      duplicate-output-tuple problem.  It seems fairly reasonable since the
      other restrictions on SELECT FOR UPDATE are meant to ensure that there
      is a unique correspondence between source tuples and result tuples,
      which an output SRF destroys as much as anything else does.
      9f2ee8f2
  38. 12 Oct, 2009 1 commit
    • Tom Lane's avatar
      Move the handling of SELECT FOR UPDATE locking and rechecking out of · 0adaf4cb
      Tom Lane authored
      execMain.c and into a new plan node type LockRows.  Like the recent change
      to put table updating into a ModifyTable plan node, this increases planning
      flexibility by allowing the operations to occur below the top level of the
      plan tree.  It's necessary in any case to restore the previous behavior of
      having FOR UPDATE locking occur before ModifyTable does.
      
      This partially refactors EvalPlanQual to allow multiple rows-under-test
      to be inserted into the EPQ machinery before starting an EPQ test query.
      That isn't sufficient to fix EPQ's general bogosity in the face of plans
      that return multiple rows per test row, though.  Since this patch is
      mostly about getting some plan node infrastructure in place and not about
      fixing ten-year-old bugs, I will leave EPQ improvements for another day.
      
      Another behavioral change that we could now think about is doing FOR UPDATE
      before LIMIT, but that too seems like it should be treated as a followon
      patch.
      0adaf4cb
  39. 10 Oct, 2009 1 commit
    • Tom Lane's avatar
      Split the processing of INSERT/UPDATE/DELETE operations out of execMain.c. · 8a5849b7
      Tom Lane authored
      They are now handled by a new plan node type called ModifyTable, which is
      placed at the top of the plan tree.  In itself this change doesn't do much,
      except perhaps make the handling of RETURNING lists and inherited UPDATEs a
      tad less klugy.  But it is necessary preparation for the intended extension of
      allowing RETURNING queries inside WITH.
      
      Marko Tiikkaja
      8a5849b7
  40. 08 Oct, 2009 1 commit
    • Tom Lane's avatar
      Remove very ancient tuple-counting infrastructure (IncrRetrieved() and · c970292a
      Tom Lane authored
      friends).  This code has all been ifdef'd out for many years, and doesn't
      seem to have any prospect of becoming any more useful in the future.
      EXPLAIN ANALYZE is what people use in practice, and I think if we did want
      process-wide counters we'd be more likely to put in dtrace events for that
      than try to resurrect this code.  Get rid of it so as to have one less detail
      to worry about while refactoring execMain.c.
      c970292a