1. 01 Jul, 2016 8 commits
    • Tom Lane's avatar
      Provide and use a makefile target to build all generated headers. · 548af97f
      Tom Lane authored
      As of 9.6, pg_regress doesn't build unless storage/lwlocknames.h has been
      created; but there was nothing forcing that to happen if you just went into
      src/test/regress/ and built there.  We previously had a similar complaint
      about plpython.
      
      To fix in a way that won't break next time we invent a generated header,
      make src/backend/Makefile expose a phony target for updating all the
      include files it builds, and invoke that before building pg_regress or
      plpython.  In principle, maybe we ought to invoke that everywhere; but
      it would add a lot of usually-useless make cycles, so let's just do it
      in the places where people have complained.
      
      I made a couple of cosmetic adjustments in src/backend/Makefile as well,
      to deal with the generated headers in consistent orders.
      
      Michael Paquier and Tom Lane
      
      Report: <31398.1467036827@sss.pgh.pa.us>
      Report: <20150916200959.GB32090@msg.df7cb.de>
      548af97f
    • Alvaro Herrera's avatar
      walreceiver: tweak pg_stat_wal_receiver behavior · 1bdae16f
      Alvaro Herrera authored
      There are two problems in the original coding: one is that if one
      walreceiver process exits, the ready_to_display flag remains set in
      shared memory, exposing the conninfo of the next walreceiver before
      obfuscating.  Fix by having WalRcvDie reset the flag.
      
      Second, the sleep-and-retry behavior that waited until walreceiver had
      set ready_to_display wasn't liked; the preference is to have it return
      no data instead, so let's do that.
      
      Bugs in 9ed551e0 reported by Fujii Masao and Michël Paquier.
      
      Author: Michaël Paquier
      1bdae16f
    • Tom Lane's avatar
      Rethink the GetForeignUpperPaths API (again). · 9e703987
      Tom Lane authored
      In the previous design, the GetForeignUpperPaths FDW callback hook was
      called before we got around to labeling upper relations with the proper
      consider_parallel flag; this meant that any upper paths created by an FDW
      would be marked not-parallel-safe.  While that's probably just as well
      right now, we aren't going to want it to be true forever.  Hence, abandon
      the idea that FDWs should be allowed to inject upper paths before the core
      code has gotten around to creating the relevant upper relation.  (Well,
      actually they still can, but it's on their own heads how well it works.)
      Instead, adopt the same API already designed for create_upper_paths_hook:
      we call GetForeignUpperPaths after each upperrel has been created and
      populated with the paths the core planner knows how to make.
      9e703987
    • Robert Haas's avatar
      Set consider_parallel correctly for upper planner rels. · 5ce5e4a1
      Robert Haas authored
      Commit 3fc6e2d7 introduced new "upper"
      RelOptInfo structures but didn't set consider_parallel for them
      correctly, a point I completely missed when reviewing it.  Later,
      commit e06a3896 made the situation
      worse by doing it incorrectly for the grouping relation.  Try to
      straighten all of that out.  Along the way, get rid of the annoying
      wholePlanParallelSafe flag, which was only necessarily because of
      the fact that upper planning stages didn't use paths at the time
      that code was written.
      
      The most important immediate impact of these changes is that
      force_parallel_mode will provide useful test coverage in quite a few
      more scenarios than it did previously, but it's also necessary
      preparation for fixing some problems related to subqueries.
      
      Patch by me, reviewed by Tom Lane.
      5ce5e4a1
    • Tom Lane's avatar
      Be more paranoid in ruleutils.c's get_variable(). · 0daeba0e
      Tom Lane authored
      We were merely Assert'ing that the Var matched the RTE it's supposedly
      from.  But if the user passes incorrect information to pg_get_expr(),
      the RTE might in fact not match; this led either to Assert failures
      or core dumps, as reported by Chris Hanks in bug #14220.  To fix, just
      convert the Asserts to test-and-elog.  Adjust an existing test-and-elog
      elsewhere in the same function to be consistent in wording.
      
      (If we really felt these were user-facing errors, we might promote them to
      ereport's; but I can't convince myself that they're worth translating.)
      
      Back-patch to 9.3; the problematic code doesn't exist before that, and
      a quick check says that 9.2 doesn't crash on such cases.
      
      Michael Paquier and Thomas Munro
      
      Report: <20160629224349.1407.32667@wrigleys.postgresql.org>
      0daeba0e
    • Robert Haas's avatar
      postgres_fdw: Fix cache lookup failure while creating error context. · 86437ddf
      Robert Haas authored
      This is fallout from join pushdown; get_relid_attribute_name can't
      handle an attribute number of 0, indicating a whole-row reference,
      and shouldn't be called in that case.
      
      Etsuro Fujita, reviewed by Ashutosh Bapat
      86437ddf
    • Robert Haas's avatar
      postgres_fdw: Remove schema-qualification from cast to text. · 5f3499b2
      Robert Haas authored
      As pointed out by Ashutosh Bapat, the header comments for this file
      say that schema-qualification is needed for all and only those types
      outside pg_catalog.  pg_catalog.text is not outside pg_catalog.
      5f3499b2
    • Robert Haas's avatar
      Fix crash bug in RestoreSnapshot. · 4f9f4958
      Robert Haas authored
      If serialized_snapshot->subxcnt > 0 and serialized_snapshot->xcnt == 0,
      the old coding would do the wrong thing and crash.  This can happen
      on standby servers.
      
      Report by Andreas Seltenreich.  Patch by Thomas Munro, reviewed by
      Amit Kapila and tested by Andreas Seltenreich.
      4f9f4958
  2. 30 Jun, 2016 2 commits
    • Robert Haas's avatar
      Fix several mistakes around parallel workers and client_encoding. · 10c0558f
      Robert Haas authored
      Previously, workers sent data to the leader using the client encoding.
      That mostly worked, but the leader the converted the data back to the
      server encoding.  Since not all encoding conversions are reversible,
      that could provoke failures.  Fix by using the database encoding for
      all communication between worker and leader.
      
      Also, while temporary changes to GUC settings, as from the SET clause
      of a function, are in general OK for parallel query, changing
      client_encoding this way inside of a parallel worker is not OK.
      Previously, that would have confused the leader; with these changes,
      it would not confuse the leader, but it wouldn't do anything either.
      So refuse such changes in parallel workers.
      
      Also, the previous code naively assumed that when it received a
      NotifyResonse from the worker, it could pass that directly back to the
      user.  But now that worker-to-leader communication always uses the
      database encoding, that's clearly no longer correct - though,
      actually, the old way was always broken for V2 clients.  So
      disassemble and reconstitute the message instead.
      
      Issues reported by Peter Eisentraut.  Patch by me, reviewed by
      Peter Eisentraut.
      10c0558f
    • Tom Lane's avatar
      Fix typo in ReorderBufferIterTXNInit(). · f8c58554
      Tom Lane authored
      This looks like it would cause changes from subtransactions to be missed
      by the iterator being constructed, if those changes had been spilled to
      disk previously.  This implies that large subtransactions might be lost
      (in whole or in part) by logical replication.  Found and fixed by
      Petru-Florin Mihancea, per bug #14208.
      
      Report: <20160622144830.5791.22512@wrigleys.postgresql.org>
      f8c58554
  3. 29 Jun, 2016 8 commits
    • Tom Lane's avatar
      Dodge compiler bug in Visual Studio 2013. · 3154e167
      Tom Lane authored
      VS2013 apparently has a problem with taking the address of a formal
      parameter in some cases.  We do that elsewhere without trouble, but
      in this case the address is being passed to a subroutine that will
      probably get inlined, so maybe the combination of those things is
      what tickles the bug.  Anyway, introducing an extra copy of the
      parameter value is enough to work around it.  Per trouble report
      from Umair Shahid.
      
      Report: <CAM184AcjqKYZSdQqBHDrnENXHhW=mXbUC46QYPJ=nAh0gUHCGA@mail.gmail.com>
      3154e167
    • Tom Lane's avatar
      Fix some infelicities in EXPLAIN output for parallel query plans. · 8ebb69f8
      Tom Lane authored
      In non-text output formats, parallelized aggregates were reporting
      "Partial" or "Finalize" as a field named "Operation", which might be all
      right in the absence of any context --- but other plan node types use that
      field to report SQL-visible semantics, such as Select/Insert/Update/Delete.
      So that naming choice didn't seem good to me.  I changed it to "Partial
      Mode".
      
      Also, the field did not appear at all for a non-parallelized Agg plan node,
      which is contrary to expectation in non-text formats.  We're notionally
      producing objects that conform to a schema, so the set of fields for a
      given node type and EXPLAIN mode should be well-defined.  I set it up to
      fill in "Simple" in such cases.
      
      Other fields that were added for parallel query, namely "Parallel Aware"
      and Gather's "Single Copy", had not gotten the word on that point either.
      Make them appear always in non-text output.
      
      Also, the latter two fields were nominally producing boolean output, but
      were getting it wrong, because bool values shouldn't be quoted in JSON or
      YAML.  Somehow we'd not needed an ExplainPropertyBool formatting subroutine
      before 9.6; but now we do, so invent it.
      
      Discussion: <16002.1466972724@sss.pgh.pa.us>
      8ebb69f8
    • Tom Lane's avatar
      Update rules.out to match commit 9ed551e0. · 0584df32
      Tom Lane authored
      Per buildfarm.
      0584df32
    • Alvaro Herrera's avatar
      Add conninfo to pg_stat_wal_receiver · 9ed551e0
      Alvaro Herrera authored
      Commit b1a9bad9 introduced a stats view to provide insight into the
      running WAL receiver, but neglected to include the connection string in
      it, as reported by Michaël Paquier.  This commit fixes that omission.
      (Any security-sensitive information is not disclosed).
      
      While at it, close the mild security hole that we were exposing the
      password in the connection string in shared memory.  This isn't
      user-accessible, but it still looks like a good idea to avoid having the
      cleartext password in memory.
      
      Author: Michaël Paquier, Álvaro Herrera
      Review by: Vik Fearing
      
      Discussion: https://www.postgresql.org/message-id/CAB7nPqStg4M561obo7ryZ5G+fUydG4v1Ajs1xZT1ujtu+woRag@mail.gmail.com
      9ed551e0
    • Tom Lane's avatar
      Fix match_foreign_keys_to_quals for FKs linking to unused rtable entries. · b32e6350
      Tom Lane authored
      Since get_relation_foreign_keys doesn't try to determine whether RTEs
      are actually part of the query semantics, it might make FK info records
      linking to RTEs that won't have a RelOptInfo at all.  Cope with that.
      Per bug #14219 from Andrew Gierth.
      
      Report: <20160629183338.1397.43514@wrigleys.postgresql.org>
      b32e6350
    • Tom Lane's avatar
      Adjust text search documentation for recent commits. · 4242a715
      Tom Lane authored
      Fix some now-obsolete statements that were overlooked in commits
      6734a1ca, 3dbbd0f0, 028350f6.  Document the behavior of <0>.
      Also do a little bit of rearranging and copy-editing for clarity.
      4242a715
    • Robert Haas's avatar
      Fix obsolete comment. · 8dee039f
      Robert Haas authored
      Commit 3bd261ca should have updated
      this, but didn't.
      
      Extracted from a larger patch by Piotr Stefaniak.
      8dee039f
    • Teodor Sigaev's avatar
      Document precedence of FTS operators in tsquery · 73e6bea6
      Teodor Sigaev authored
      Oleg Bartunov
      73e6bea6
  4. 28 Jun, 2016 7 commits
    • Bruce Momjian's avatar
      doc: add link for list-of-scalars mention · 8a395e0b
      Bruce Momjian authored
      Reported-by: Manlio Perillo
      
      Bug: 14016
      
      Discussion: 20160311163928.6674.94707@wrigleys.postgresql.org
      
      Reviewed-by: David G. Johnston
      8a395e0b
    • Bruce Momjian's avatar
      doc: update effective_io_concurrency for SSDs · 46eafc88
      Bruce Momjian authored
      SSDs are no longer exotic, so recommend a default in the hundreds for
      them.
      46eafc88
    • Alvaro Herrera's avatar
      Remove unused arguments in two GiST subroutines · b78364df
      Alvaro Herrera authored
      These arguments became unused in commit 2c03216d.  Noticed while
      skimming code for unrelated development.
      
      This is cosmetic, so no backpatch.
      b78364df
    • Bruce Momjian's avatar
      doc: remove GIN vs. GiST performance mention · 8e1ad1b3
      Bruce Momjian authored
      This is a followup to commit 6d8b2aa8.
      8e1ad1b3
    • Bruce Momjian's avatar
      doc: in binary mode mention, say "encoding conversion" · 69769a3a
      Bruce Momjian authored
      Used to say "character set conversion"
      
      Reported-by: Tatsuo Ishii
      
      Discussion: 20160618.210417.343199294611427151.t-ishii@sraoss.co.jp
      69769a3a
    • Bruce Momjian's avatar
      doc: remove mention of UT1 in representing time · 675684fc
      Bruce Momjian authored
      UT1 was incorrectly specified as our time representation.  (UT1 is
      astronomical time.)  We are not actually UTC either because we ignore
      leap seconds.
      
      Reported-by: Thomas Munro
      
      Discussion: CAEepm=3-TW9PLwGZhqjSSiEQ9UzJEKE-HELQDzRE0QUSCp8dgw@mail.gmail.com
      675684fc
    • Tom Lane's avatar
      Don't apply sortgroupref labels to a tlist that might not match. · c12f02ff
      Tom Lane authored
      If we need to use a gating Result node for pseudoconstant quals,
      create_scan_plan() intentionally suppresses use_physical_tlist's checks
      on whether there are matches for sortgroupref labels, on the grounds that
      we don't need matches because we can label the Result's projection output
      properly.  However, it then called apply_pathtarget_labeling_to_tlist
      anyway.  This oversight was harmless when written, but in commit aeb9ae64
      I made that function throw an error if there was no match.  Thus, the
      combination of a table scan, pseudoconstant quals, and a non-simple-Var
      sortgroupref column threw the dreaded "ORDER/GROUP BY expression not found
      in targetlist" error.  To fix, just skip applying the labeling in this
      case.  Per report from Rushabh Lathia.
      
      Report: <CAGPqQf2iLB8t6t-XrL-zR233DFTXxEsfVZ4WSqaYfLupEoDxXA@mail.gmail.com>
      c12f02ff
  5. 27 Jun, 2016 5 commits
    • Robert Haas's avatar
      Fix mistakes in pg_visibility documentation. · 957616db
      Robert Haas authored
      Michael Paquier
      957616db
    • Tom Lane's avatar
      Fix CREATE MATVIEW/CREATE TABLE AS ... WITH NO DATA to not plan the query. · 874fe3ae
      Tom Lane authored
      Previously, these commands always planned the given query and went through
      executor startup before deciding not to actually run the query if WITH NO
      DATA is specified.  This behavior is problematic for pg_dump because it
      may cause errors to be raised that we would rather not see before a
      REFRESH MATERIALIZED VIEW command is issued.  See for example bug #13907
      from Marian Krucina.  This change is not sufficient to fix that particular
      bug, because we also need to tweak pg_dump to issue the REFRESH later,
      but it's a necessary step on the way.
      
      A user-visible side effect of doing things this way is that the returned
      command tag for WITH NO DATA cases will now be "CREATE MATERIALIZED VIEW"
      or "CREATE TABLE AS", not "SELECT 0".  We could preserve the old behavior
      but it would take more code, and arguably that was just an implementation
      artifact not intended behavior anyhow.
      
      In 9.5 and HEAD, also get rid of the static variable CreateAsReladdr, which
      was trouble waiting to happen; there is not any prohibition on nested
      CREATE commands.
      
      Back-patch to 9.3 where CREATE MATERIALIZED VIEW was introduced.
      
      Michael Paquier and Tom Lane
      
      Report: <20160202161407.2778.24659@wrigleys.postgresql.org>
      874fe3ae
    • Teodor Sigaev's avatar
      Change predecence of phrase operator. · 6734a1ca
      Teodor Sigaev authored
      <-> operator now have higher predecence than & (AND) operator. This change
      was motivated by unexpected difference of similar queries:
      'a & b <-> c'::tsquery and 'b <-> c & a'. Before first query means
      (a & b) <-> c and second one - '(b <-> c) & a', now phrase operator evaluates
      first.
      
      Per suggestion from Tom Lane 32260.1465402409@sss.pgh.pa.us
      6734a1ca
    • Teodor Sigaev's avatar
      Do not fallback to AND for FTS phrase operator. · 3dbbd0f0
      Teodor Sigaev authored
      If there is no positional information of lexemes then phrase operator will not
      fallback to AND operator. This change makes needing to modify TS_execute()
      interface, because somewhere (in indexes, for example) positional information
      is unaccesible and in this cases we need to force fallback to AND.
      
      Per discussion c19fcfec308e6ccd952cdde9e648b505@mail.gmail.com
      3dbbd0f0
    • Teodor Sigaev's avatar
      Make exact distance match for FTS phrase operator · 028350f6
      Teodor Sigaev authored
      Phrase operator now requires exact distance betweens lexems instead of
      less-or-equal.
      
      Per discussion c19fcfec308e6ccd952cdde9e648b505@mail.gmail.com
      028350f6
  6. 26 Jun, 2016 3 commits
    • Tom Lane's avatar
      Avoid making a separate pass over the query to check for partializability. · f1993038
      Tom Lane authored
      It's rather silly to make a separate pass over the tlist + HAVING qual,
      and a separate set of visits to the syscache, when get_agg_clause_costs
      already has all the required information in hand.  This nets out as less
      code as well as fewer cycles.
      f1993038
    • Tom Lane's avatar
      Rethink node-level representation of partial-aggregation modes. · 19e972d5
      Tom Lane authored
      The original coding had three separate booleans representing partial
      aggregation behavior, which was confusing, unreadable, and error-prone,
      not least because the booleans weren't always listed in the same order.
      It was also inadequate for the allegedly-desirable future extension to
      support intermediate partial aggregation, because we'd need separate
      markers for serialization and deserialization in such a case.
      
      Merge these bools into an enum "AggSplit" to provide symbolic names for
      the supported operating modes (and document what those are).  By assigning
      the values of the enum constants carefully, we can treat AggSplit values
      as options bitmasks so that tests of what to do aren't noticeably more
      expensive than before.
      
      While at it, get rid of Aggref.aggoutputtype.  That's not needed since
      commit 59a3795c got rid of setrefs.c's special-purpose Aggref comparison
      code, and it likewise seemed more confusing than helpful.
      
      Assorted comment cleanup as well (there's still more that I want to do
      in that line).
      
      catversion bump for change in Aggref node contents.  Should be the last
      one for partial-aggregation changes.
      
      Discussion: <29309.1466699160@sss.pgh.pa.us>
      19e972d5
    • Tom Lane's avatar
      Simplify planner's final setup of Aggrefs for partial aggregation. · 59a3795c
      Tom Lane authored
      Commit e06a3896's original coding for constructing the execution-time
      expression tree for a combining aggregate was rather messy, involving
      duplicating quite a lot of code in setrefs.c so that it could inject
      a nonstandard matching rule for Aggrefs.  Get rid of that in favor of
      explicitly constructing a combining Aggref with a partial Aggref as input,
      then allowing setref's normal matching logic to match the partial Aggref
      to the output of the lower plan node and hence replace it with a Var.
      
      In passing, rename and redocument make_partialgroup_input_target to have
      some connection to what it actually does.
      59a3795c
  7. 24 Jun, 2016 5 commits
    • Alvaro Herrera's avatar
      Fix handling of multixacts predating pg_upgrade · e3ad3ffa
      Alvaro Herrera authored
      After pg_upgrade, it is possible that some tuples' Xmax have multixacts
      corresponding to the old installation; such multixacts cannot have
      running members anymore.  In many code sites we already know not to read
      them and clobber them silently, but at least when VACUUM tries to freeze
      a multixact or determine whether one needs freezing, there's an attempt
      to resolve it to its member transactions by calling GetMultiXactIdMembers,
      and if the multixact value is "in the future" with regards to the
      current valid multixact range, an error like this is raised:
          ERROR:  MultiXactId 123 has not been created yet -- apparent wraparound
      and vacuuming fails.  Per discussion with Andrew Gierth, it is completely
      bogus to try to resolve multixacts coming from before a pg_upgrade,
      regardless of where they stand with regards to the current valid
      multixact range.
      
      It's possible to get from under this problem by doing SELECT FOR UPDATE
      of the problem tuples, but if tables are large, this is slow and
      tedious, so a more thorough solution is desirable.
      
      To fix, we realize that multixacts in xmax created in 9.2 and previous
      have a specific bit pattern that is never used in 9.3 and later (we
      already knew this, per comments and infomask tests sprinkled in various
      places, but we weren't leveraging this knowledge appropriately).
      Whenever the infomask of the tuple matches that bit pattern, we just
      ignore the multixact completely as if Xmax wasn't set; or, in the case
      of tuple freezing, we act as if an unwanted value is set and clobber it
      without decoding.  This guarantees that no errors will be raised, and
      that the values will be progressively removed until all tables are
      clean.  Most callers of GetMultiXactIdMembers are patched to recognize
      directly that the value is a removable "empty" multixact and avoid
      calling GetMultiXactIdMembers altogether.
      
      To avoid changing the signature of GetMultiXactIdMembers() in back
      branches, we keep the "allow_old" boolean flag but rename it to
      "from_pgupgrade"; if the flag is true, we always return an empty set
      instead of looking up the multixact.  (I suppose we could remove the
      argument in the master branch, but I chose not to do so in this commit).
      
      This was broken all along, but the error-facing message appeared first
      because of commit 8e9a16ab8f7f and was partially fixed in a25c2b7c4db3.
      This fix, backpatched all the way back to 9.3, goes approximately in the
      same direction as a25c2b7c4db3 but should cover all cases.
      
      Bug analysis by Andrew Gierth and Álvaro Herrera.
      
      A number of public reports match this bug:
        https://www.postgresql.org/message-id/20140330040029.GY4582@tamriel.snowman.net
        https://www.postgresql.org/message-id/538F3D70.6080902@publicrelay.com
        https://www.postgresql.org/message-id/556439CF.7070109@pscs.co.uk
        https://www.postgresql.org/message-id/SG2PR06MB0760098A111C88E31BD4D96FB3540@SG2PR06MB0760.apcprd06.prod.outlook.com
        https://www.postgresql.org/message-id/20160615203829.5798.4594@wrigleys.postgresql.org
      e3ad3ffa
    • Tom Lane's avatar
      Fix building of large (bigger than shared_buffers) hash indexes. · 8cf739de
      Tom Lane authored
      When the index is predicted to need more than NBuffers buckets,
      CREATE INDEX attempts to sort the index entries by hash key before
      insertion, so as to reduce thrashing.  This code path got broken by
      commit 9f03ca91, which overlooked that _hash_form_tuple() is not
      just an alias for index_form_tuple().  The index got built anyway, but
      with garbage data, so that searches for pre-existing tuples always
      failed.  Fix by refactoring to separate construction of the indexable
      data from calling index_form_tuple().
      
      Per bug #14210 from Daniel Newman.  Back-patch to 9.5 where the
      bug was introduced.
      
      Report: <20160623162507.17237.39471@wrigleys.postgresql.org>
      8cf739de
    • Robert Haas's avatar
      postgres_fdw: Fix incorrect NULL handling in join pushdown. · 9e9c38e1
      Robert Haas authored
      something.* IS NOT NULL means that every attribute of the row is not
      NULL, not that the row itself is non-NULL (e.g. because it's coming
      from below an outer join.  Use (somevar.*)::pg_catalog.text IS NOT
      NULL instead.
      
      Ashutosh Bapat, per a report by Rushabh Lathia.  Reviewed by
      Amit Langote and Etsuro Fujita.  Schema-qualification added by me.
      9e9c38e1
    • Robert Haas's avatar
      postgres_fdw: Remove useless return statement. · 267569b2
      Robert Haas authored
      Etsuro Fujita
      267569b2
    • Peter Eisentraut's avatar
      bd406af1
  8. 23 Jun, 2016 2 commits
    • Andrew Dunstan's avatar
      Add tab completion for pager_min_lines to psql. · 562e4497
      Andrew Dunstan authored
      This was inadvertantly omitted from commit
      7655f4cc. Mea culpa.
      
      Backpatched to 9.5 where pager_min_lines was introduced.
      562e4497
    • Tom Lane's avatar
      Fix small memory leak in partial-aggregate deserialization functions. · bd1693e8
      Tom Lane authored
      A deserialize function's result is short-lived data during partial
      aggregation, since we're just going to pass it to the combine function
      and then it's of no use anymore.  However, the built-in deserialize
      functions allocated their results in the aggregate state context,
      resulting in a query-lifespan memory leak.  It's probably not possible for
      this to amount to anything much at present, since the number of leaked
      results would only be the number of worker processes.  But it might become
      a problem in future.  To fix, don't use the same convenience subroutine for
      setting up results that the aggregate transition functions use.
      
      David Rowley
      
      Report: <10050.1466637736@sss.pgh.pa.us>
      bd1693e8