1. 08 1月, 2014 1 次提交
  2. 06 8月, 2013 1 次提交
    • T
      Simplify query_planner's API by having it return the top-level RelOptInfo. · 3ced8837
      Tom Lane 提交于
      Formerly, query_planner returned one or possibly two Paths for the topmost
      join relation, so that grouping_planner didn't see the join RelOptInfo
      (at least not directly; it didn't have any hesitation about examining
      cheapest_path->parent, though).  However, correct selection of the Paths
      involved a significant amount of coupling between query_planner and
      grouping_planner, a problem which has gotten worse over time.  It seems
      best to give up on this API choice and instead return the topmost
      RelOptInfo explicitly.  Then grouping_planner can pull out the Paths it
      wants from the rel's path list.  In this way we can remove all knowledge
      of grouping behaviors from query_planner.
      
      The only real benefit of the old way is that in the case of an empty
      FROM clause, we never made any RelOptInfos at all, just a Path.  Now
      we have to gin up a dummy RelOptInfo to represent the empty FROM clause.
      That's not a very big deal though.
      
      While at it, simplify query_planner's API a bit more by having the caller
      set up root->tuple_fraction and root->limit_tuples, rather than passing
      those values as separate parameters.  Since query_planner no longer does
      anything with either value, requiring it to fill the PlannerInfo fields
      seemed pretty arbitrary.
      
      This patch just rearranges code; it doesn't (intentionally) change any
      behaviors.  Followup patches will do more interesting things.
      3ced8837
  3. 19 7月, 2013 1 次提交
    • S
      WITH CHECK OPTION support for auto-updatable VIEWs · 4cbe3ac3
      Stephen Frost 提交于
      For simple views which are automatically updatable, this patch allows
      the user to specify what level of checking should be done on records
      being inserted or updated.  For 'LOCAL CHECK', new tuples are validated
      against the conditionals of the view they are being inserted into, while
      for 'CASCADED CHECK' the new tuples are validated against the
      conditionals for all views involved (from the top down).
      
      This option is part of the SQL specification.
      
      Dean Rasheed, reviewed by Pavel Stehule
      4cbe3ac3
  4. 30 4月, 2013 1 次提交
    • T
      Postpone creation of pathkeys lists to fix bug #8049. · db9f0e1d
      Tom Lane 提交于
      This patch gets rid of the concept of, and infrastructure for,
      non-canonical PathKeys; we now only ever create canonical pathkey lists.
      
      The need for non-canonical pathkeys came from the desire to have
      grouping_planner initialize query_pathkeys and related pathkey lists before
      calling query_planner.  However, since query_planner didn't actually *do*
      anything with those lists before they'd been made canonical, we can get rid
      of the whole mess by just not creating the lists at all until the point
      where we formerly canonicalized them.
      
      There are several ways in which we could implement that without making
      query_planner itself deal with grouping/sorting features (which are
      supposed to be the province of grouping_planner).  I chose to add a
      callback function to query_planner's API; other alternatives would have
      required adding more fields to PlannerInfo, which while not bad in itself
      would create an ABI break for planner-related plugins in the 9.2 release
      series.  This still breaks ABI for anything that calls query_planner
      directly, but it seems somewhat unlikely that there are any such plugins.
      
      I had originally conceived of this change as merely a step on the way to
      fixing bug #8049 from Teun Hoogendoorn; but it turns out that this fixes
      that bug all by itself, as per the added regression test.  The reason is
      that now get_eclass_for_sort_expr is adding the ORDER BY expression at the
      end of EquivalenceClass creation not the start, and so anything that is in
      a multi-member EquivalenceClass has already been created with correct
      em_nullable_relids.  I am suspicious that there are related scenarios in
      which we still need to teach get_eclass_for_sort_expr to compute correct
      nullable_relids, but am not eager to risk destabilizing either 9.2 or 9.3
      to fix bugs that are only hypothetical.  So for the moment, do this and
      stop here.
      
      Back-patch to 9.2 but not to earlier branches, since they don't exhibit
      this bug for lack of join-clause-movement logic that depends on
      em_nullable_relids being correct.  (We might have to revisit that choice
      if any related bugs turn up.)  In 9.2, don't change the signature of
      make_pathkeys_for_sortclauses nor remove canonicalize_pathkeys, so as
      not to risk more plugin breakage than we have to.
      db9f0e1d
  5. 11 3月, 2013 1 次提交
    • T
      Support writable foreign tables. · 21734d2f
      Tom Lane 提交于
      This patch adds the core-system infrastructure needed to support updates
      on foreign tables, and extends contrib/postgres_fdw to allow updates
      against remote Postgres servers.  There's still a great deal of room for
      improvement in optimization of remote updates, but at least there's basic
      functionality there now.
      
      KaiGai Kohei, reviewed by Alexander Korotkov and Laurenz Albe, and rather
      heavily revised by Tom Lane.
      21734d2f
  6. 02 1月, 2013 1 次提交
  7. 19 10月, 2012 1 次提交
    • T
      Fix planning of non-strict equivalence clauses above outer joins. · 72a4231f
      Tom Lane 提交于
      If a potential equivalence clause references a variable from the nullable
      side of an outer join, the planner needs to take care that derived clauses
      are not pushed to below the outer join; else they may use the wrong value
      for the variable.  (The problem arises only with non-strict clauses, since
      if an upper clause can be proven strict then the outer join will get
      simplified to a plain join.)  The planner attempted to prevent this type
      of error by checking that potential equivalence clauses aren't
      outerjoin-delayed as a whole, but actually we have to check each side
      separately, since the two sides of the clause will get moved around
      separately if it's treated as an equivalence.  Bugs of this type can be
      demonstrated as far back as 7.4, even though releases before 8.3 had only
      a very ad-hoc notion of equivalence clauses.
      
      In addition, we neglected to account for the possibility that such clauses
      might have nonempty nullable_relids even when not outerjoin-delayed; so the
      equivalence-class machinery lacked logic to compute correct nullable_relids
      values for clauses it constructs.  This oversight was harmless before 9.2
      because we were only using RestrictInfo.nullable_relids for OR clauses;
      but as of 9.2 it could result in pushing constructed equivalence clauses
      to incorrect places.  (This accounts for bug #7604 from Bill MacArthur.)
      
      Fix the first problem by adding a new test check_equivalence_delay() in
      distribute_qual_to_rels, and fix the second one by adding code in
      equivclass.c and called functions to set correct nullable_relids for
      generated clauses.  Although I believe the second part of this is not
      currently necessary before 9.2, I chose to back-patch it anyway, partly to
      keep the logic similar across branches and partly because it seems possible
      we might find other reasons why we need valid values of nullable_relids in
      the older branches.
      
      Add regression tests illustrating these problems.  In 9.0 and up, also
      add test cases checking that we can push constants through outer joins,
      since we've broken that optimization before and I nearly broke it again
      with an overly simplistic patch for this problem.
      72a4231f
  8. 27 8月, 2012 1 次提交
    • T
      Fix up planner infrastructure to support LATERAL properly. · 9ff79b9d
      Tom Lane 提交于
      This patch takes care of a number of problems having to do with failure
      to choose valid join orders and incorrect handling of lateral references
      pulled up from subqueries.  Notable changes:
      
      * Add a LateralJoinInfo data structure similar to SpecialJoinInfo, to
      represent join ordering constraints created by lateral references.
      (I first considered extending the SpecialJoinInfo structure, but the
      semantics are different enough that a separate data structure seems
      better.)  Extend join_is_legal() and related functions to prevent trying
      to form unworkable joins, and to ensure that we will consider joins that
      satisfy lateral references even if the joins would be clauseless.
      
      * Fill in the infrastructure needed for the last few types of relation scan
      paths to support parameterization.  We'd have wanted this eventually
      anyway, but it is necessary now because a relation that gets pulled up out
      of a UNION ALL subquery may acquire a reltargetlist containing lateral
      references, meaning that its paths *have* to be parameterized whether or
      not we have any code that can push join quals down into the scan.
      
      * Compute data about lateral references early in query_planner(), and save
      in RelOptInfo nodes, to avoid repetitive calculations later.
      
      * Assorted corner-case bug fixes.
      
      There's probably still some bugs left, but this is a lot closer to being
      real than it was before.
      9ff79b9d
  9. 26 4月, 2012 1 次提交
    • T
      Fix planner's handling of RETURNING lists in writable CTEs. · 9fa82c98
      Tom Lane 提交于
      setrefs.c failed to do "rtoffset" adjustment of Vars in RETURNING lists,
      which meant they were left with the wrong varnos when the RETURNING list
      was in a subquery.  That was never possible before writable CTEs, of
      course, but now it's broken.  The executor fails to notice any problem
      because ExecEvalVar just references the ecxt_scantuple for any normal
      varno; but EXPLAIN breaks when the varno is wrong, as illustrated in a
      recent complaint from Bartosz Dmytrak.
      
      Since the eventual rtoffset of the subquery is not known at the time
      we are preparing its plan node, the previous scheme of executing
      set_returning_clause_references() at that time cannot handle this
      adjustment.  Fortunately, it turns out that we don't really need to do it
      that way, because all the needed information is available during normal
      setrefs.c execution; we just have to dig it out of the ModifyTable node.
      So, do that, and get rid of the kluge of early setrefs processing of
      RETURNING lists.  (This is a little bit of a cheat in the case of inherited
      UPDATE/DELETE, because we are not passing a "root" struct that corresponds
      exactly to what the subplan was built with.  But that doesn't matter, and
      anyway this is less ugly than early setrefs processing was.)
      
      Back-patch to 9.1, where the problem became possible to hit.
      9fa82c98
  10. 10 3月, 2012 1 次提交
    • T
      Revise FDW planning API, again. · b1495393
      Tom Lane 提交于
      Further reflection shows that a single callback isn't very workable if we
      desire to let FDWs generate multiple Paths, because that forces the FDW to
      do all work necessary to generate a valid Plan node for each Path.  Instead
      split the former PlanForeignScan API into three steps: GetForeignRelSize,
      GetForeignPaths, GetForeignPlan.  We had already bit the bullet of breaking
      the 9.1 FDW API for 9.2, so this shouldn't cause very much additional pain,
      and it's substantially more flexible for complex FDWs.
      
      Add an fdw_private field to RelOptInfo so that the new functions can save
      state there rather than possibly having to recalculate information two or
      three times.
      
      In addition, we'd not thought through what would be needed to allow an FDW
      to set up subexpressions of its choice for runtime execution.  We could
      treat ForeignScan.fdw_private as an executable expression but that seems
      likely to break existing FDWs unnecessarily (in particular, it would
      restrict the set of node types allowable in fdw_private to those supported
      by expression_tree_walker).  Instead, invent a separate field fdw_exprs
      which will receive the postprocessing appropriate for expression trees.
      (One field is enough since it can be a list of expressions; also, we assume
      the corresponding expression state tree(s) will be held within fdw_state,
      so we don't need to add anything to ForeignScanState.)
      
      Per review of Hanada Shigeru's pgsql_fdw patch.  We may need to tweak this
      further as we continue to work on that patch, but to me it feels a lot
      closer to being right now.
      b1495393
  11. 02 1月, 2012 1 次提交
  12. 04 9月, 2011 1 次提交
    • T
      Rearrange planner to save the whole PlannerInfo (subroot) for a subquery. · b3aaf908
      Tom Lane 提交于
      Formerly, set_subquery_pathlist and other creators of plans for subqueries
      saved only the rangetable and rowMarks lists from the lower-level
      PlannerInfo.  But there's no reason not to remember the whole PlannerInfo,
      and indeed this turns out to simplify matters in a number of places.
      
      The immediate reason for doing this was so that the subroot will still be
      accessible when we're trying to extract column statistics out of an
      already-planned subquery.  But now that I've done it, it seems like a good
      code-beautification effort in its own right.
      
      I also chose to get rid of the transient subrtable and subrowmark fields in
      SubqueryScan nodes, in favor of having setrefs.c look up the subquery's
      RelOptInfo.  That required changing all the APIs in setrefs.c to pass
      PlannerInfo not PlannerGlobal, which was a large but quite mechanical
      transformation.
      
      One side-effect not foreseen at the beginning is that this finally broke
      inheritance_planner's assumption that replanning the same subquery RTE N
      times would necessarily give interchangeable results each time.  That
      assumption was always pretty risky, but now we really have to make a
      separate RTE for each instance so that there's a place to carry the
      separate subroots.
      b3aaf908
  13. 09 8月, 2011 1 次提交
    • T
      Fix nested PlaceHolderVar expressions that appear only in targetlists. · 77ba2325
      Tom Lane 提交于
      A PlaceHolderVar's expression might contain another, lower-level
      PlaceHolderVar.  If the outer PlaceHolderVar is used, the inner one
      certainly will be also, and so we have to make sure that both of them get
      into the placeholder_list with correct ph_may_need values during the
      initial pre-scan of the query (before deconstruct_jointree starts).
      We did this correctly for PlaceHolderVars appearing in the query quals,
      but overlooked the issue for those appearing in the top-level targetlist;
      with the result that nested placeholders referenced only in the targetlist
      did not work correctly, as illustrated in bug #6154.
      
      While at it, add some error checking to find_placeholder_info to ensure
      that we don't try to create new placeholders after it's too late to do so;
      they have to all be created before deconstruct_jointree starts.
      
      Back-patch to 8.4 where the PlaceHolderVar mechanism was introduced.
      77ba2325
  14. 25 4月, 2011 1 次提交
    • T
      Improve cost estimation for aggregates and window functions. · e6a30a8c
      Tom Lane 提交于
      The previous coding failed to account properly for the costs of evaluating
      the input expressions of aggregates and window functions, as seen in a
      recent gripe from Claudio Freire.  (I said at the time that it wasn't
      counting these costs at all; but on closer inspection, it was effectively
      charging these costs once per output tuple.  That is completely wrong for
      aggregates, and not exactly right for window functions either.)
      
      There was also a hard-wired assumption that aggregates and window functions
      had procost 1.0, which is now fixed to respect the actual cataloged costs.
      
      The costing of WindowAgg is still pretty bogus, since it doesn't try to
      estimate the effects of spilling data to disk, but that seems like a
      separate issue.
      e6a30a8c
  15. 20 3月, 2011 1 次提交
    • T
      Revise collation derivation method and expression-tree representation. · b310b6e3
      Tom Lane 提交于
      All expression nodes now have an explicit output-collation field, unless
      they are known to only return a noncollatable data type (such as boolean
      or record).  Also, nodes that can invoke collation-aware functions store
      a separate field that is the collation value to pass to the function.
      This avoids confusion that arises when a function has collatable inputs
      and noncollatable output type, or vice versa.
      
      Also, replace the parser's on-the-fly collation assignment method with
      a post-pass over the completed expression tree.  This allows us to use
      a more complex (and hopefully more nearly spec-compliant) assignment
      rule without paying for it in extra storage in every expression node.
      
      Fix assorted bugs in the planner's handling of collations by making
      collation one of the defining properties of an EquivalenceClass and
      by converting CollateExprs into discardable RelabelType nodes during
      expression preprocessing.
      b310b6e3
  16. 26 2月, 2011 1 次提交
    • 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
  17. 02 1月, 2011 1 次提交
  18. 05 11月, 2010 1 次提交
    • T
      Reimplement planner's handling of MIN/MAX aggregate optimization. · 034967bd
      Tom Lane 提交于
      Per my recent proposal, get rid of all the direct inspection of indexes
      and manual generation of paths in planagg.c.  Instead, set up
      EquivalenceClasses for the aggregate argument expressions, and let the
      regular path generation logic deal with creating paths that can satisfy
      those sort orders.  This makes planagg.c a bit more visible to the rest
      of the planner than it was originally, but the approach is basically a lot
      cleaner than before.  A major advantage of doing it this way is that we get
      MIN/MAX optimization on inheritance trees (using MergeAppend of indexscans)
      practically for free, whereas in the old way we'd have had to add a whole
      lot more duplicative logic.
      
      One small disadvantage of this approach is that MIN/MAX aggregates can no
      longer exploit partial indexes having an "x IS NOT NULL" predicate, unless
      that restriction or something that implies it is specified in the query.
      The previous implementation was able to use the added "x IS NOT NULL"
      condition as an extra predicate proof condition, but in this version we
      rely entirely on indexes that are considered usable by the main planning
      process.  That seems a fair tradeoff for the simplicity and functionality
      gained.
      034967bd
  19. 21 9月, 2010 1 次提交
  20. 29 3月, 2010 1 次提交
  21. 26 2月, 2010 1 次提交
  22. 13 2月, 2010 1 次提交
    • T
      Extend the set of frame options supported for window functions. · ec4be2ee
      Tom Lane 提交于
      This patch allows the frame to start from CURRENT ROW (in either RANGE or
      ROWS mode), and it also adds support for ROWS n PRECEDING and ROWS n FOLLOWING
      start and end points.  (RANGE value PRECEDING/FOLLOWING isn't there yet ---
      the grammar works, but that's all.)
      
      Hitoshi Harada, reviewed by Pavel Stehule
      ec4be2ee
  23. 16 1月, 2010 1 次提交
    • T
      Do parse analysis of an EXPLAIN's contained statement during the normal · 08f8d478
      Tom Lane 提交于
      parse analysis phase, rather than at execution time.  This makes parameter
      handling work the same as it does in ordinary plannable queries, and in
      particular fixes the incompatibility that Pavel pointed out with plpgsql's
      new handling of variable references.  plancache.c gets a little bit
      grottier, but the alternatives seem worse.
      08f8d478
  24. 03 1月, 2010 1 次提交
  25. 02 1月, 2010 1 次提交
    • T
      Support "x IS NOT NULL" clauses as indexscan conditions. This turns out · 29c4ad98
      Tom Lane 提交于
      to be just a minor extension of the previous patch that made "x IS NULL"
      indexable, because we can treat the IS NOT NULL condition as if it were
      "x < NULL" or "x > NULL" (depending on the index's NULLS FIRST/LAST option),
      just like IS NULL is treated like "x = NULL".  Aside from any possible
      usefulness in its own right, this is an important improvement for
      index-optimized MAX/MIN aggregates: it is now reliably possible to get
      a column's min or max value cheaply, even when there are a lot of nulls
      cluttering the interesting end of the index.
      29c4ad98
  26. 26 10月, 2009 1 次提交
    • T
      Re-implement EvalPlanQual processing to improve its performance and eliminate · 9f2ee8f2
      Tom Lane 提交于
      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
  27. 13 10月, 2009 1 次提交
    • T
      Move the handling of SELECT FOR UPDATE locking and rechecking out of · 0adaf4cb
      Tom Lane 提交于
      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
  28. 10 10月, 2009 1 次提交
    • T
      Split the processing of INSERT/UPDATE/DELETE operations out of execMain.c. · 8a5849b7
      Tom Lane 提交于
      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
  29. 11 6月, 2009 1 次提交
  30. 02 1月, 2009 1 次提交
  31. 31 12月, 2008 1 次提交
    • T
      Add some basic support for window frame clauses to the window-functions · 8e8854da
      Tom Lane 提交于
      patch.  This includes the ability to force the frame to cover the whole
      partition, and the ability to make the frame end exactly on the current row
      rather than its last ORDER BY peer.  Supporting any more of the full SQL
      frame-clause syntax will require nontrivial hacking on the window aggregate
      code, so it'll have to wait for 8.5 or beyond.
      8e8854da
  32. 29 12月, 2008 1 次提交
  33. 08 10月, 2008 1 次提交
  34. 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
  35. 10 9月, 2008 1 次提交
    • T
      Improve the plan cache invalidation mechanism to make it invalidate plans · ee33b95d
      Tom Lane 提交于
      when user-defined functions used in a plan are modified.  Also invalidate
      plans when schemas, operators, or operator classes are modified; but for these
      cases we just invalidate everything rather than tracking exact dependencies,
      since these types of objects seldom change in a production database.
      
      Tom Lane; loosely based on a patch by Martin Pihlak.
      ee33b95d
  36. 15 8月, 2008 1 次提交
    • T
      Implement SEMI and ANTI joins in the planner and executor. (Semijoins replace · e006a24a
      Tom Lane 提交于
      the old JOIN_IN code, but antijoins are new functionality.)  Teach the planner
      to convert appropriate EXISTS and NOT EXISTS subqueries into semi and anti
      joins respectively.  Also, LEFT JOINs with suitable upper-level IS NULL
      filters are recognized as being anti joins.  Unify the InClauseInfo and
      OuterJoinInfo infrastructure into "SpecialJoinInfo".  With that change,
      it becomes possible to associate a SpecialJoinInfo with every join attempt,
      which permits some cleanup of join selectivity estimation.  That needs to be
      taken much further than this patch does, but the next step is to change the
      API for oprjoin selectivity functions, which seems like material for a
      separate patch.  So for the moment the output size estimates for semi and
      especially anti joins are quite bogus.
      e006a24a
  37. 08 8月, 2008 1 次提交
    • T
      Improve INTERSECT/EXCEPT hashing by realizing that we don't need to make any · af95d7aa
      Tom Lane 提交于
      hashtable entries for tuples that are found only in the second input: they
      can never contribute to the output.  Furthermore, this implies that the
      planner should endeavor to put first the smaller (in number of groups) input
      relation for an INTERSECT.  Implement that, and upgrade prepunion's estimation
      of the number of rows returned by setops so that there's some amount of sanity
      in the estimate of which one is smaller.
      af95d7aa
  38. 07 8月, 2008 1 次提交
    • T
      Support hashing for duplicate-elimination in INTERSECT and EXCEPT queries. · 368df304
      Tom Lane 提交于
      This completes my project of improving usage of hashing for duplicate
      elimination (aggregate functions with DISTINCT remain undone, but that's
      for some other day).
      
      As with the previous patches, this means we can INTERSECT/EXCEPT on datatypes
      that can hash but not sort, and it means that INTERSECT/EXCEPT without ORDER
      BY are no longer certain to produce sorted output.
      368df304
  39. 03 5月, 2008 1 次提交
  40. 18 4月, 2008 1 次提交
    • T
      Fix a couple of oversights associated with the "physical tlist" optimization: · 25e46a50
      Tom Lane 提交于
      we had several code paths where a physical tlist could be used for the input
      to a Sort node, which is a dumb idea because any unneeded table columns will
      increase the volume of data the sort has to push around.
      
      (Unfortunately the easy-looking fix of calling disuse_physical_tlist during
      make_sort_xxx doesn't work because in most cases we're already committed to
      the current input tlist --- it's been marked with sort column numbers, or
      we've built grouping column numbers using it, etc.  The tlist has to be
      selected properly at the calling level before we start constructing sort-col
      information.  This is easy enough to do, we were just failing to take the
      point into consideration.)
      
      Back-patch to 8.3.  I believe the problem probably exists clear back to 7.4
      when the physical tlist optimization was added, but I'm afraid to back-patch
      further than 8.3 without a great deal more study than I want to put into it.
      The code in this area has drifted a lot over time.  The real-world importance
      of these code paths is uncertain anyway --- I think in many cases we'd
      probably prefer hash-based methods.
      25e46a50