1. 13 9月, 2012 1 次提交
    • T
      Fix case of window function + aggregate + GROUP BY expression. · a2099360
      Tom Lane 提交于
      In commit 1bc16a94 I added a minor
      optimization to drop the component variables of a GROUP BY expression from
      the target list computed at the aggregation level of a query, if those Vars
      weren't referenced elsewhere in the tlist.  However, I overlooked that the
      window-function planning code would deconstruct such expressions and thus
      need to have access to their component variables.  Fix it to not do that.
      
      While at it, I removed the distinction between volatile and nonvolatile
      window partition/order expressions: the code now computes all of them
      at the aggregation level.  This saves a relatively expensive check for
      volatility, and it's unclear that the resulting plan isn't better anyway.
      
      Per bug #7535 from Louis-David Mitterrand.  Back-patch to 9.2.
      a2099360
  2. 15 10月, 2011 1 次提交
    • T
      Measure the number of all-visible pages for use in index-only scan costing. · e6858e66
      Tom Lane 提交于
      Add a column pg_class.relallvisible to remember the number of pages that
      were all-visible according to the visibility map as of the last VACUUM
      (or ANALYZE, or some other operations that update pg_class.relpages).
      Use relallvisible/relpages, instead of an arbitrary constant, to estimate
      how many heap page fetches can be avoided during an index-only scan.
      
      This is pretty primitive and will no doubt see refinements once we've
      acquired more field experience with the index-only scan mechanism, but
      it's way better than using a constant.
      
      Note: I had to adjust an underspecified query in the window.sql regression
      test, because it was changing answers when the plan changed to use an
      index-only scan.  Some of the adjacent tests perhaps should be adjusted
      as well, but I didn't do that here.
      e6858e66
  3. 27 9月, 2011 1 次提交
    • T
      Fix window functions that sort by expressions involving aggregates. · 269c5dd2
      Tom Lane 提交于
      In commit c1d9579d, I changed things so
      that the output of the Agg node that feeds the window functions would not
      list any ungrouped Vars directly.  Formerly, for example, the Agg tlist
      might have included both "x" and "sum(x)", which is not really valid if
      "x" isn't a grouping column.  If we then had a window function ordering on
      something like "sum(x) + 1", prepare_sort_from_pathkeys would find no exact
      match for this in the Agg tlist, and would conclude that it must recompute
      the expression.  But it would break the expression down to just the Var
      "x", which it would find in the tlist, and then rebuild the ORDER BY
      expression using a reference to the subplan's "x" output.  Now, after the
      above-referenced changes, "x" isn't in the Agg tlist if it's not a grouping
      column, so that prepare_sort_from_pathkeys fails with "could not find
      pathkey item to sort", as reported by Bricklen Anderson.
      
      The fix is to not break down Aggrefs into their component parts, but just
      treat them as irreducible expressions to be sought in the subplan tlist.
      This is definitely OK for the use with respect to window functions in
      grouping_planner, since it just built the tlist being used on the same
      basis.  AFAICT it is safe for other uses too; most of the other call sites
      couldn't encounter Aggrefs anyway.
      269c5dd2
  4. 13 7月, 2011 1 次提交
    • T
      Avoid listing ungrouped Vars in the targetlist of Agg-underneath-Window. · c1d9579d
      Tom Lane 提交于
      Regular aggregate functions in combination with, or within the arguments
      of, window functions are OK per spec; they have the semantics that the
      aggregate output rows are computed and then we run the window functions
      over that row set.  (Thus, this combination is not really useful unless
      there's a GROUP BY so that more than one aggregate output row is possible.)
      The case without GROUP BY could fail, as recently reported by Jeff Davis,
      because sloppy construction of the Agg node's targetlist resulted in extra
      references to possibly-ungrouped Vars appearing outside the aggregate
      function calls themselves.  See the added regression test case for an
      example.
      
      Fixing this requires modifying the API of flatten_tlist and its underlying
      function pull_var_clause.  I chose to make pull_var_clause's API for
      aggregates identical to what it was already doing for placeholders, since
      the useful behaviors turn out to be the same (error, report node as-is, or
      recurse into it).  I also tightened the error checking in this area a bit:
      if it was ever valid to see an uplevel Var, Aggref, or PlaceHolderVar here,
      that was a long time ago, so complain instead of ignoring them.
      
      Backpatch into 9.1.  The failure exists in 8.4 and 9.0 as well, but seeing
      that it only occurs in a basically-useless corner case, it doesn't seem
      worth the risks of changing a function API in a minor release.  There might
      be third-party code using pull_var_clause.
      c1d9579d
  5. 24 11月, 2010 1 次提交
  6. 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
  7. 28 8月, 2009 1 次提交
    • T
      Modify the definition of window-function PARTITION BY and ORDER BY clauses · bb16dc49
      Tom Lane 提交于
      so that their elements are always taken as simple expressions over the
      query's input columns.  It originally seemed like a good idea to make them
      act exactly like GROUP BY and ORDER BY, right down to the SQL92-era behavior
      of accepting output column names or numbers.  However, that was not such a
      great idea, for two reasons:
      
      1. It permits circular references, as exhibited in bug #5018: the output
      column could be the one containing the window function itself.  (We actually
      had a regression test case illustrating this, but nobody thought twice about
      how confusing that would be.)
      
      2. It doesn't seem like a good idea for, eg, "lead(foo) OVER (ORDER BY foo)"
      to potentially use two completely different meanings for "foo".
      
      Accordingly, narrow down the behavior of window clauses to use only the
      SQL99-compliant interpretation that the expressions are simple expressions.
      bb16dc49
  8. 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
  9. 29 12月, 2008 2 次提交