1. 07 6月, 2011 1 次提交
    • T
      Fix rewriter to cope (more or less) with CTEs in the query being rewritten. · fc1286d3
      Tom Lane 提交于
      Since the original implementation of CTEs only allowed them in SELECT
      queries, the rule rewriter did not expect to find any CTEs in statements
      being rewritten by ON INSERT/UPDATE/DELETE rules.  We had dealt with this
      to some extent but the code was still several bricks shy of a load, as
      illustrated in bug #6051 from Jehan-Guillaume de Rorthais.
      
      In particular, we have to be able to copy CTEs from the original query's
      cteList into that of a rule action, in case the rule action references the
      CTE (which it pretty much always will).  This also implies we were doing
      things in the wrong order in RewriteQuery: we have to recursively rewrite
      the CTE queries before expanding the main query, so that we have the
      rewritten queries available to copy.
      
      There are unpleasant limitations yet to resolve here, but at least we now
      throw understandable FEATURE_NOT_SUPPORTED errors for them instead of just
      failing with bizarre implementation-dependent errors.  In particular, we
      can't handle propagating the same CTE into multiple post-rewrite queries
      (because then the CTE would be evaluated multiple times), and we can't cope
      with conflicts between CTE names in the original query and in the rule
      actions.
      fc1286d3
  2. 28 2月, 2011 1 次提交
    • T
      Refactor the executor's API to support data-modifying CTEs better. · a874fe7b
      Tom Lane 提交于
      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
  3. 26 2月, 2011 2 次提交
    • T
      Fix order of shutdown processing when CTEs contain inter-references. · 000128bc
      Tom Lane 提交于
      We need ExecutorEnd to run the ModifyTable nodes to completion in
      reverse order of initialization, not forward order.  Easily done
      by constructing the list back-to-front.
      000128bc
    • T
      Support data-modifying commands (INSERT/UPDATE/DELETE) in WITH. · 389af951
      Tom Lane 提交于
      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
  4. 16 10月, 2010 1 次提交
    • T
      Allow WITH clauses to be attached to INSERT, UPDATE, DELETE statements. · 07f1264d
      Tom Lane 提交于
      This is not the hoped-for facility of using INSERT/UPDATE/DELETE inside
      a WITH, but rather the other way around.  It seems useful in its own
      right anyway.
      
      Note: catversion bumped because, although the contents of stored rules
      might look compatible, there's actually a subtle semantic change.
      A single Query containing a WITH and INSERT...VALUES now represents
      writing the WITH before the INSERT, not before the VALUES.  While it's
      not clear that that matters to anyone, it seems like a good idea to
      have it cited in the git history for catversion.h.
      
      Original patch by Marko Tiikkaja, with updating and cleanup by
      Hitoshi Harada.
      07f1264d
  5. 22 11月, 2009 1 次提交
    • T
      Improve psql's tabular display of wrapped-around data by inserting markers · 1753337c
      Tom Lane 提交于
      in the formerly-always-blank columns just to left and right of the data.
      Different marking is used for a line break caused by a newline in the data
      than for a straight wraparound.  A newline break is signaled by a "+" in the
      right margin column in ASCII mode, or a carriage return arrow in UNICODE mode.
      Wraparound is signaled by a dot in the right margin as well as the following
      left margin in ASCII mode, or an ellipsis symbol in the same places in UNICODE
      mode.  "\pset linestyle old-ascii" is added to make the previous behavior
      available if anyone really wants it.
      
      In passing, this commit also cleans up a few regression test files that
      had unintended spacing differences from the current actual output.
      
      Roger Leigh, reviewed by Gabrielle Roth and other members of PDXPUG.
      1753337c
  6. 09 9月, 2009 1 次提交
    • T
      Fix bug with WITH RECURSIVE immediately inside WITH RECURSIVE. 99% of the · 255f66ef
      Tom Lane 提交于
      code was already okay with this, but the hack that obtained the output
      column types of a recursive union in advance of doing real parse analysis
      of the recursive union forgot to handle the case where there was an inner
      WITH clause available to the non-recursive term.  Best fix seems to be to
      refactor so that we don't need the "throwaway" parse analysis step at all.
      Instead, teach the transformSetOperationStmt code to set up the CTE's output
      column information after it's processed the non-recursive term normally.
      Per report from David Fetter.
      255f66ef
  7. 06 7月, 2009 1 次提交
    • T
      Fix handling of changed-Param signaling for CteScan plan nodes. We were using · 9298d2ff
      Tom Lane 提交于
      the "cteParam" as a proxy for the possibility that the underlying CTE plan
      depends on outer-level variables or Params, but that doesn't work very well
      because it sometimes causes calling subqueries to be treated as SubPlans when
      they could be InitPlans.  This is inefficient and also causes the outright
      failure exhibited in bug #4902.  Instead, leave the cteParam out of it and
      copy the underlying CTE plan's extParams directly.  Per bug #4902 from
      Marko Tiikkaja.
      9298d2ff
  8. 30 3月, 2009 1 次提交
    • T
      Fix an oversight in the support for storing/retrieving "minimal tuples" in · 793d5662
      Tom Lane 提交于
      TupleTableSlots.  We have functions for retrieving a minimal tuple from a slot
      after storing a regular tuple in it, or vice versa; but these were implemented
      by converting the internal storage from one format to the other.  The problem
      with that is it invalidates any pass-by-reference Datums that were already
      fetched from the slot, since they'll be pointing into the just-freed version
      of the tuple.  The known problem cases involve fetching both a whole-row
      variable and a pass-by-reference value from a slot that is fed from a
      tuplestore or tuplesort object.  The added regression tests illustrate some
      simple cases, but there may be other failure scenarios traceable to the same
      bug.  Note that the added tests probably only fail on unpatched code if it's
      built with --enable-cassert; otherwise the bug leads to fetching from freed
      memory, which will not have been overwritten without additional conditions.
      
      Fix by allowing a slot to contain both formats simultaneously; which turns out
      not to complicate the logic much at all, if anything it seems less contorted
      than before.
      
      Back-patch to 8.2, where minimal tuples were introduced.
      793d5662
  9. 29 12月, 2008 1 次提交
  10. 14 10月, 2008 3 次提交
    • T
      Add docs and regression test about sorting the output of a recursive query in · 06224652
      Tom Lane 提交于
      depth-first search order.  Upon close reading of SQL:2008, it seems that the
      spec's SEARCH DEPTH FIRST and SEARCH BREADTH FIRST options do not actually
      guarantee any particular result order: what they do is provide a constructed
      column that the user can then sort on in the outer query.  So this is actually
      just as much functionality ...
      06224652
    • T
      Eliminate unnecessary array[] decoration in examples of recursive cycle · 1f238e56
      Tom Lane 提交于
      detection.
      1f238e56
    • T
      Implement comparison of generic records (composite types), and invent a · e3b01174
      Tom Lane 提交于
      pseudo-type record[] to represent arrays of possibly-anonymous composite
      types.  Since composite datums carry their own type identification, no
      extra knowledge is needed at the array level.
      
      The main reason for doing this right now is that it is necessary to support
      the general case of detection of cycles in recursive queries: if you need to
      compare more than one column to detect a cycle, you need to compare a ROW()
      to an array built from ROW()s, at least if you want to do it as the spec
      suggests.  Add some documentation and regression tests concerning the cycle
      detection issue.
      e3b01174
  11. 13 10月, 2008 1 次提交
  12. 08 10月, 2008 1 次提交
  13. 06 10月, 2008 2 次提交
  14. 05 10月, 2008 1 次提交
    • T
      Implement SQL-standard WITH clauses, including WITH RECURSIVE. · 44d5be0e
      Tom Lane 提交于
      There are some unimplemented aspects: recursive queries must use UNION ALL
      (should allow UNION too), and we don't have SEARCH or CYCLE clauses.
      These might or might not get done for 8.4, but even without them it's a
      pretty useful feature.
      
      There are also a couple of small loose ends and definitional quibbles,
      which I'll send a memo about to pgsql-hackers shortly.  But let's land
      the patch now so we can get on with other development.
      
      Yoshiyuki Asaba, with lots of help from Tatsuo Ishii and Tom Lane
      44d5be0e