1. 25 5月, 2015 1 次提交
    • T
      Manual cleanup of pgindent results. · 2aa0476d
      Tom Lane 提交于
      Fix some places where pgindent did silly stuff, often because project
      style wasn't followed to begin with.  (I've not touched the atomics
      headers, though.)
      2aa0476d
  2. 24 5月, 2015 1 次提交
  3. 23 5月, 2015 1 次提交
    • A
      Remove the new UPSERT command tag and use INSERT instead. · 631d7490
      Andres Freund 提交于
      Previously, INSERT with ON CONFLICT DO UPDATE specified used a new
      command tag -- UPSERT.  It was introduced out of concern that INSERT as
      a command tag would be a misrepresentation for ON CONFLICT DO UPDATE, as
      some affected rows may actually have been updated.
      
      Alvaro Herrera noticed that the implementation of that new command tag
      was incomplete; in subsequent discussion we concluded that having it
      doesn't provide benefits that are in line with the compatibility breaks
      it requires.
      
      Catversion bump due to the removal of PlannedStmt->isUpsert.
      
      Author: Peter Geoghegan
      Discussion: 20150520215816.GI5885@postgresql.org
      631d7490
  4. 16 5月, 2015 2 次提交
    • A
      Support GROUPING SETS, CUBE and ROLLUP. · f3d31185
      Andres Freund 提交于
      This SQL standard functionality allows to aggregate data by different
      GROUP BY clauses at once. Each grouping set returns rows with columns
      grouped by in other sets set to NULL.
      
      This could previously be achieved by doing each grouping as a separate
      query, conjoined by UNION ALLs. Besides being considerably more concise,
      grouping sets will in many cases be faster, requiring only one scan over
      the underlying data.
      
      The current implementation of grouping sets only supports using sorting
      for input. Individual sets that share a sort order are computed in one
      pass. If there are sets that don't share a sort order, additional sort &
      aggregation steps are performed. These additional passes are sourced by
      the previous sort step; thus avoiding repeated scans of the source data.
      
      The code is structured in a way that adding support for purely using
      hash aggregation or a mix of hashing and sorting is possible. Sorting
      was chosen to be supported first, as it is the most generic method of
      implementation.
      
      Instead of, as in an earlier versions of the patch, representing the
      chain of sort and aggregation steps as full blown planner and executor
      nodes, all but the first sort are performed inside the aggregation node
      itself. This avoids the need to do some unusual gymnastics to handle
      having to return aggregated and non-aggregated tuples from underlying
      nodes, as well as having to shut down underlying nodes early to limit
      memory usage.  The optimizer still builds Sort/Agg node to describe each
      phase, but they're not part of the plan tree, but instead additional
      data for the aggregation node. They're a convenient and preexisting way
      to describe aggregation and sorting.  The first (and possibly only) sort
      step is still performed as a separate execution step. That retains
      similarity with existing group by plans, makes rescans fairly simple,
      avoids very deep plans (leading to slow explains) and easily allows to
      avoid the sorting step if the underlying data is sorted by other means.
      
      A somewhat ugly side of this patch is having to deal with a grammar
      ambiguity between the new CUBE keyword and the cube extension/functions
      named cube (and rollup). To avoid breaking existing deployments of the
      cube extension it has not been renamed, neither has cube been made a
      reserved keyword. Instead precedence hacking is used to make GROUP BY
      cube(..) refer to the CUBE grouping sets feature, and not the function
      cube(). To actually group by a function cube(), unlikely as that might
      be, the function name has to be quoted.
      
      Needs a catversion bump because stored rules may change.
      
      Author: Andrew Gierth and Atri Sharma, with contributions from Andres Freund
      Reviewed-By: Andres Freund, Noah Misch, Tom Lane, Svenne Krap, Tomas
          Vondra, Erik Rijkers, Marti Raudsepp, Pavel Stehule
      Discussion: CAOeZVidmVRe2jU6aMk_5qkxnB7dfmPROzM7Ur8JPW5j8Y5X-Lw@mail.gmail.com
      f3d31185
    • S
      TABLESAMPLE, SQL Standard and extensible · f6d208d6
      Simon Riggs 提交于
      Add a TABLESAMPLE clause to SELECT statements that allows
      user to specify random BERNOULLI sampling or block level
      SYSTEM sampling. Implementation allows for extensible
      sampling functions to be written, using a standard API.
      Basic version follows SQLStandard exactly. Usable
      concrete use cases for the sampling API follow in later
      commits.
      
      Petr Jelinek
      
      Reviewed by Michael Paquier and Simon Riggs
      f6d208d6
  5. 13 5月, 2015 1 次提交
    • T
      Add support for doing late row locking in FDWs. · afb9249d
      Tom Lane 提交于
      Previously, FDWs could only do "early row locking", that is lock a row as
      soon as it's fetched, even though local restriction/join conditions might
      discard the row later.  This patch adds callbacks that allow FDWs to do
      late locking in the same way that it's done for regular tables.
      
      To make use of this feature, an FDW must support the "ctid" column as a
      unique row identifier.  Currently, since ctid has to be of type TID,
      the feature is of limited use, though in principle it could be used by
      postgres_fdw.  We may eventually allow FDWs to specify another data type
      for ctid, which would make it possible for more FDWs to use this feature.
      
      This commit does not modify postgres_fdw to use late locking.  We've
      tested some prototype code for that, but it's not in committable shape,
      and besides it's quite unclear whether it actually makes sense to do late
      locking against a remote server.  The extra round trips required are likely
      to outweigh any benefit from improved concurrency.
      
      Etsuro Fujita, reviewed by Ashutosh Bapat, and hacked up a lot by me
      afb9249d
  6. 08 5月, 2015 1 次提交
    • A
      Add support for INSERT ... ON CONFLICT DO NOTHING/UPDATE. · 168d5805
      Andres Freund 提交于
      The newly added ON CONFLICT clause allows to specify an alternative to
      raising a unique or exclusion constraint violation error when inserting.
      ON CONFLICT refers to constraints that can either be specified using a
      inference clause (by specifying the columns of a unique constraint) or
      by naming a unique or exclusion constraint.  DO NOTHING avoids the
      constraint violation, without touching the pre-existing row.  DO UPDATE
      SET ... [WHERE ...] updates the pre-existing tuple, and has access to
      both the tuple proposed for insertion and the existing tuple; the
      optional WHERE clause can be used to prevent an update from being
      executed.  The UPDATE SET and WHERE clauses have access to the tuple
      proposed for insertion using the "magic" EXCLUDED alias, and to the
      pre-existing tuple using the table name or its alias.
      
      This feature is often referred to as upsert.
      
      This is implemented using a new infrastructure called "speculative
      insertion". It is an optimistic variant of regular insertion that first
      does a pre-check for existing tuples and then attempts an insert.  If a
      violating tuple was inserted concurrently, the speculatively inserted
      tuple is deleted and a new attempt is made.  If the pre-check finds a
      matching tuple the alternative DO NOTHING or DO UPDATE action is taken.
      If the insertion succeeds without detecting a conflict, the tuple is
      deemed inserted.
      
      To handle the possible ambiguity between the excluded alias and a table
      named excluded, and for convenience with long relation names, INSERT
      INTO now can alias its target table.
      
      Bumps catversion as stored rules change.
      
      Author: Peter Geoghegan, with significant contributions from Heikki
          Linnakangas and Andres Freund. Testing infrastructure by Jeff Janes.
      Reviewed-By: Heikki Linnakangas, Andres Freund, Robert Haas, Simon Riggs,
          Dean Rasheed, Stephen Frost and many others.
      168d5805
  7. 23 4月, 2015 1 次提交
    • S
      RLS fixes, new hooks, and new test module · 0bf22e0c
      Stephen Frost 提交于
      In prepend_row_security_policies(), defaultDeny was always true, so if
      there were any hook policies, the RLS policies on the table would just
      get discarded.  Fixed to start off with defaultDeny as false and then
      properly set later if we detect that only the default deny policy exists
      for the internal policies.
      
      The infinite recursion detection in fireRIRrules() didn't properly
      manage the activeRIRs list in the case of WCOs, so it would incorrectly
      report infinite recusion if the same relation with RLS appeared more
      than once in the rtable, for example "UPDATE t ... FROM t ...".
      
      Further, the RLS expansion code in fireRIRrules() was handling RLS in
      the main loop through the rtable, which lead to RTEs being visited twice
      if they contained sublink subqueries, which
      prepend_row_security_policies() attempted to handle by exiting early if
      the RTE already had securityQuals.  That doesn't work, however, since
      if the query involved a security barrier view on top of a table with
      RLS, the RTE would already have securityQuals (from the view) by the
      time fireRIRrules() was invoked, and so the table's RLS policies would
      be ignored.  This is fixed in fireRIRrules() by handling RLS in a
      separate loop at the end, after dealing with any other sublink
      subqueries, thus ensuring that each RTE is only visited once for RLS
      expansion.
      
      The inheritance planner code didn't correctly handle non-target
      relations with RLS, which would get turned into subqueries during
      planning. Thus an update of the form "UPDATE t1 ... FROM t2 ..." where
      t1 has inheritance and t2 has RLS quals would fail.  Fix by making sure
      to copy in and update the securityQuals when they exist for non-target
      relations.
      
      process_policies() was adding WCOs to non-target relations, which is
      unnecessary, and could lead to a lot of wasted time in the rewriter and
      the planner. Fix by only adding WCO policies when working on the result
      relation.  Also in process_policies, we should be copying the USING
      policies to the WITH CHECK policies on a per-policy basis, fix by moving
      the copying up into the per-policy loop.
      
      Lastly, as noted by Dean, we were simply adding policies returned by the
      hook provided to the list of quals being AND'd, meaning that they would
      actually restrict records returned and there was no option to have
      internal policies and hook-based policies work together permissively (as
      all internal policies currently work).  Instead, explicitly add support
      for both permissive and restrictive policies by having a hook for each
      and combining the results appropriately.  To ensure this is all done
      correctly, add a new test module (test_rls_hooks) to test the various
      combinations of internal, permissive, and restrictive hook policies.
      
      Largely from Dean Rasheed (thanks!):
      
      CAEZATCVmFUfUOwwhnBTcgi6AquyjQ0-1fyKd0T3xBWJvn+xsFA@mail.gmail.com
      
      Author: Dean Rasheed, though I added the new hooks and test module.
      0bf22e0c
  8. 23 3月, 2015 1 次提交
    • T
      Allow foreign tables to participate in inheritance. · cb1ca4d8
      Tom Lane 提交于
      Foreign tables can now be inheritance children, or parents.  Much of the
      system was already ready for this, but we had to fix a few things of
      course, mostly in the area of planner and executor handling of row locks.
      
      As side effects of this, allow foreign tables to have NOT VALID CHECK
      constraints (and hence to accept ALTER ... VALIDATE CONSTRAINT), and to
      accept ALTER SET STORAGE and ALTER SET WITH/WITHOUT OIDS.  Continuing to
      disallow these things would've required bizarre and inconsistent special
      cases in inheritance behavior.  Since foreign tables don't enforce CHECK
      constraints anyway, a NOT VALID one is a complete no-op, but that doesn't
      mean we shouldn't allow it.  And it's possible that some FDWs might have
      use for SET STORAGE or SET WITH OIDS, though doubtless they will be no-ops
      for most.
      
      An additional change in support of this is that when a ModifyTable node
      has multiple target tables, they will all now be explicitly identified
      in EXPLAIN output, for example:
      
       Update on pt1  (cost=0.00..321.05 rows=3541 width=46)
         Update on pt1
         Foreign Update on ft1
         Foreign Update on ft2
         Update on child3
         ->  Seq Scan on pt1  (cost=0.00..0.00 rows=1 width=46)
         ->  Foreign Scan on ft1  (cost=100.00..148.03 rows=1170 width=46)
         ->  Foreign Scan on ft2  (cost=100.00..148.03 rows=1170 width=46)
         ->  Seq Scan on child3  (cost=0.00..25.00 rows=1200 width=46)
      
      This was done mainly to provide an unambiguous place to attach "Remote SQL"
      fields, but it is useful for inherited updates even when no foreign tables
      are involved.
      
      Shigeru Hanada and Etsuro Fujita, reviewed by Ashutosh Bapat and Kyotaro
      Horiguchi, some additional hacking by me
      cb1ca4d8
  9. 16 3月, 2015 1 次提交
    • T
      Improve representation of PlanRowMark. · 7b8b8a43
      Tom Lane 提交于
      This patch fixes two inadequacies of the PlanRowMark representation.
      
      First, that the original LockingClauseStrength isn't stored (and cannot be
      inferred for foreign tables, which always get ROW_MARK_COPY).  Since some
      PlanRowMarks are created out of whole cloth and don't actually have an
      ancestral RowMarkClause, this requires adding a dummy LCS_NONE value to
      enum LockingClauseStrength, which is fairly annoying but the alternatives
      seem worse.  This fix allows getting rid of the use of get_parse_rowmark()
      in FDWs (as per the discussion around commits 462bd957 and
      8ec8760f), and it simplifies some things elsewhere.
      
      Second, that the representation assumed that all child tables in an
      inheritance hierarchy would use the same RowMarkType.  That's true today
      but will soon not be true.  We add an "allMarkTypes" field that identifies
      the union of mark types used in all a parent table's children, and use
      that where appropriate (currently, only in preprocess_targetlist()).
      
      In passing fix a couple of minor infelicities left over from the SKIP
      LOCKED patch, notably that _outPlanRowMark still thought waitPolicy
      is a bool.
      
      Catversion bump is required because the numeric values of enum
      LockingClauseStrength can appear in on-disk rules.
      
      Extracted from a much larger patch to support foreign table inheritance;
      it seemed worth breaking this out, since it's a separable concern.
      
      Shigeru Hanada and Etsuro Fujita, somewhat modified by me
      7b8b8a43
  10. 12 3月, 2015 1 次提交
    • T
      Support flattening of empty-FROM subqueries and one-row VALUES tables. · f4abd024
      Tom Lane 提交于
      We can't handle this in the general case due to limitations of the
      planner's data representations; but we can allow it in many useful cases,
      by being careful to flatten only when we are pulling a single-row subquery
      up into a FROM (or, equivalently, inner JOIN) node that will still have at
      least one remaining relation child.  Per discussion of an example from
      Kyotaro Horiguchi.
      f4abd024
  11. 22 2月, 2015 1 次提交
  12. 18 2月, 2015 1 次提交
    • T
      Fix EXPLAIN output for cases where parent table is excluded by constraints. · abe45a9b
      Tom Lane 提交于
      The previous coding in EXPLAIN always labeled a ModifyTable node with the
      name of the target table affected by its first child plan.  When originally
      written, this was necessarily the parent table of the inheritance tree,
      so everything was unconfusing.  But when we added NO INHERIT constraints,
      it became possible for the parent table to be deleted from the plan by
      constraint exclusion while still leaving child tables present.  This led to
      the ModifyTable plan node being labeled with the first surviving child,
      which was deemed confusing.  Fix it by retaining the parent table's RT
      index in a new field in ModifyTable.
      
      Etsuro Fujita, reviewed by Ashutosh Bapat and myself
      abe45a9b
  13. 07 1月, 2015 1 次提交
  14. 27 11月, 2014 1 次提交
    • S
      Rename pg_rowsecurity -> pg_policy and other fixes · 143b39c1
      Stephen Frost 提交于
      As pointed out by Robert, we should really have named pg_rowsecurity
      pg_policy, as the objects stored in that catalog are policies.  This
      patch fixes that and updates the column names to start with 'pol' to
      match the new catalog name.
      
      The security consideration for COPY with row level security, also
      pointed out by Robert, has also been addressed by remembering and
      re-checking the OID of the relation initially referenced during COPY
      processing, to make sure it hasn't changed under us by the time we
      finish planning out the query which has been built.
      
      Robert and Alvaro also commented on missing OCLASS and OBJECT entries
      for POLICY (formerly ROWSECURITY or POLICY, depending) in various
      places.  This patch fixes that too, which also happens to add the
      ability to COMMENT on policies.
      
      In passing, attempt to improve the consistency of messages, comments,
      and documentation as well.  This removes various incarnations of
      'row-security', 'row-level security', 'Row-security', etc, in favor
      of 'policy', 'row level security' or 'row_security' as appropriate.
      
      Happy Thanksgiving!
      143b39c1
  15. 08 10月, 2014 1 次提交
    • A
      Implement SKIP LOCKED for row-level locks · df630b0d
      Alvaro Herrera 提交于
      This clause changes the behavior of SELECT locking clauses in the
      presence of locked rows: instead of causing a process to block waiting
      for the locks held by other processes (or raise an error, with NOWAIT),
      SKIP LOCKED makes the new reader skip over such rows.  While this is not
      appropriate behavior for general purposes, there are some cases in which
      it is useful, such as queue-like tables.
      
      Catalog version bumped because this patch changes the representation of
      stored rules.
      
      Reviewed by Craig Ringer (based on a previous attempt at an
      implementation by Simon Riggs, who also provided input on the syntax
      used in the current patch), David Rowley, and Álvaro Herrera.
      
      Author: Thomas Munro
      df630b0d
  16. 19 9月, 2014 1 次提交
    • S
      Row-Level Security Policies (RLS) · 491c029d
      Stephen Frost 提交于
      Building on the updatable security-barrier views work, add the
      ability to define policies on tables to limit the set of rows
      which are returned from a query and which are allowed to be added
      to a table.  Expressions defined by the policy for filtering are
      added to the security barrier quals of the query, while expressions
      defined to check records being added to a table are added to the
      with-check options of the query.
      
      New top-level commands are CREATE/ALTER/DROP POLICY and are
      controlled by the table owner.  Row Security is able to be enabled
      and disabled by the owner on a per-table basis using
      ALTER TABLE .. ENABLE/DISABLE ROW SECURITY.
      
      Per discussion, ROW SECURITY is disabled on tables by default and
      must be enabled for policies on the table to be used.  If no
      policies exist on a table with ROW SECURITY enabled, a default-deny
      policy is used and no records will be visible.
      
      By default, row security is applied at all times except for the
      table owner and the superuser.  A new GUC, row_security, is added
      which can be set to ON, OFF, or FORCE.  When set to FORCE, row
      security will be applied even for the table owner and superusers.
      When set to OFF, row security will be disabled when allowed and an
      error will be thrown if the user does not have rights to bypass row
      security.
      
      Per discussion, pg_dump sets row_security = OFF by default to ensure
      that exports and backups will have all data in the table or will
      error if there are insufficient privileges to bypass row security.
      A new option has been added to pg_dump, --enable-row-security, to
      ask pg_dump to export with row security enabled.
      
      A new role capability, BYPASSRLS, which can only be set by the
      superuser, is added to allow other users to be able to bypass row
      security using row_security = OFF.
      
      Many thanks to the various individuals who have helped with the
      design, particularly Robert Haas for his feedback.
      
      Authors include Craig Ringer, KaiGai Kohei, Adam Brightwell, Dean
      Rasheed, with additional changes and rework by me.
      
      Reviewers have included all of the above, Greg Smith,
      Jeff McCormick, and Robert Haas.
      491c029d
  17. 23 7月, 2014 1 次提交
    • T
      Re-enable error for "SELECT ... OFFSET -1". · 27048980
      Tom Lane 提交于
      The executor has thrown errors for negative OFFSET values since 8.4 (see
      commit bfce56ee), but in a moment of brain
      fade I taught the planner that OFFSET with a constant negative value was a
      no-op (commit 1a1832eb).  Reinstate the
      former behavior by only discarding OFFSET with a value of exactly 0.  In
      passing, adjust a planner comment that referenced the ancient behavior.
      
      Back-patch to 9.3 where the mistake was introduced.
      27048980
  18. 19 6月, 2014 1 次提交
    • T
      Implement UPDATE tab SET (col1,col2,...) = (SELECT ...), ... · 8f889b10
      Tom Lane 提交于
      This SQL-standard feature allows a sub-SELECT yielding multiple columns
      (but only one row) to be used to compute the new values of several columns
      to be updated.  While the same results can be had with an independent
      sub-SELECT per column, such a workaround can require a great deal of
      duplicated computation.
      
      The standard actually says that the source for a multi-column assignment
      could be any row-valued expression.  The implementation used here is
      tightly tied to our existing sub-SELECT support and can't handle other
      cases; the Bison grammar would have some issues with them too.  However,
      I don't feel too bad about this since other cases can be converted into
      sub-SELECTs.  For instance, "SET (a,b,c) = row_valued_function(x)" could
      be written "SET (a,b,c) = (SELECT * FROM row_valued_function(x))".
      8f889b10
  19. 07 5月, 2014 1 次提交
    • B
      pgindent run for 9.4 · 0a783200
      Bruce Momjian 提交于
      This includes removing tabs after periods in C comments, which was
      applied to back branches, so this change should not effect backpatching.
      0a783200
  20. 13 4月, 2014 1 次提交
    • S
      Make security barrier views automatically updatable · 842faa71
      Stephen Frost 提交于
      Views which are marked as security_barrier must have their quals
      applied before any user-defined quals are called, to prevent
      user-defined functions from being able to see rows which the
      security barrier view is intended to prevent them from seeing.
      
      Remove the restriction on security barrier views being automatically
      updatable by adding a new securityQuals list to the RTE structure
      which keeps track of the quals from security barrier views at each
      level, independently of the user-supplied quals.  When RTEs are
      later discovered which have securityQuals populated, they are turned
      into subquery RTEs which are marked as security_barrier to prevent
      any user-supplied quals being pushed down (modulo LEAKPROOF quals).
      
      Dean Rasheed, reviewed by Craig Ringer, Simon Riggs, KaiGai Kohei
      842faa71
  21. 08 1月, 2014 1 次提交
  22. 24 12月, 2013 1 次提交
    • T
      Support ordered-set (WITHIN GROUP) aggregates. · 8d65da1f
      Tom Lane 提交于
      This patch introduces generic support for ordered-set and hypothetical-set
      aggregate functions, as well as implementations of the instances defined in
      SQL:2008 (percentile_cont(), percentile_disc(), rank(), dense_rank(),
      percent_rank(), cume_dist()).  We also added mode() though it is not in the
      spec, as well as versions of percentile_cont() and percentile_disc() that
      can compute multiple percentile values in one pass over the data.
      
      Unlike the original submission, this patch puts full control of the sorting
      process in the hands of the aggregate's support functions.  To allow the
      support functions to find out how they're supposed to sort, a new API
      function AggGetAggref() is added to nodeAgg.c.  This allows retrieval of
      the aggregate call's Aggref node, which may have other uses beyond the
      immediate need.  There is also support for ordered-set aggregates to
      install cleanup callback functions, so that they can be sure that
      infrastructure such as tuplesort objects gets cleaned up.
      
      In passing, make some fixes in the recently-added support for variadic
      aggregates, and make some editorial adjustments in the recent FILTER
      additions for aggregates.  Also, simplify use of IsBinaryCoercible() by
      allowing it to succeed whenever the target type is ANY or ANYELEMENT.
      It was inconsistent that it dealt with other polymorphic target types
      but not these.
      
      Atri Sharma and Andrew Gierth; reviewed by Pavel Stehule and Vik Fearing,
      and rather heavily editorialized upon by Tom Lane
      8d65da1f
  23. 15 12月, 2013 1 次提交
    • T
      Fix inherited UPDATE/DELETE with UNION ALL subqueries. · c03ad560
      Tom Lane 提交于
      Fix an oversight in commit b3aaf908: we do
      indeed need to process the planner's append_rel_list when copying RTE
      subqueries, because if any of them were flattenable UNION ALL subqueries,
      the append_rel_list shows which subquery RTEs were pulled up out of which
      other ones.  Without this, UNION ALL subqueries aren't correctly inserted
      into the update plans for inheritance child tables after the first one,
      typically resulting in no update happening for those child table(s).
      Per report from Victor Yegorov.
      
      Experimentation with this case also exposed a fault in commit
      a7b96538: if an inherited UPDATE/DELETE
      was proven totally dummy by constraint exclusion, we might arrive at
      add_rtes_to_flat_rtable with root->simple_rel_array being NULL.  This
      should be interpreted as not having any RelOptInfos.  I chose to code
      the guard as a check against simple_rel_array_size, so as to also
      provide some protection against indexing off the end of the array.
      
      Back-patch to 9.2 where the faulty code was added.
      c03ad560
  24. 22 11月, 2013 1 次提交
    • T
      Support multi-argument UNNEST(), and TABLE() syntax for multiple functions. · 784e762e
      Tom Lane 提交于
      This patch adds the ability to write TABLE( function1(), function2(), ...)
      as a single FROM-clause entry.  The result is the concatenation of the
      first row from each function, followed by the second row from each
      function, etc; with NULLs inserted if any function produces fewer rows than
      others.  This is believed to be a much more useful behavior than what
      Postgres currently does with multiple SRFs in a SELECT list.
      
      This syntax also provides a reasonable way to combine use of column
      definition lists with WITH ORDINALITY: put the column definition list
      inside TABLE(), where it's clear that it doesn't control the ordinality
      column as well.
      
      Also implement SQL-compliant multiple-argument UNNEST(), by turning
      UNNEST(a,b,c) into TABLE(unnest(a), unnest(b), unnest(c)).
      
      The SQL standard specifies TABLE() with only a single function, not
      multiple functions, and it seems to require an implicit UNNEST() which is
      not what this patch does.  There may be something wrong with that reading
      of the spec, though, because if it's right then the spec's TABLE() is just
      a pointless alternative spelling of UNNEST().  After further review of
      that, we might choose to adopt a different syntax for what this patch does,
      but in any case this functionality seems clearly worthwhile.
      
      Andrew Gierth, reviewed by Zoltán Böszörményi and Heikki Linnakangas, and
      significantly revised by me
      784e762e
  25. 24 8月, 2013 1 次提交
    • T
      In locate_grouping_columns(), don't expect an exact match of Var typmods. · fcf9ecad
      Tom Lane 提交于
      It's possible that inlining of SQL functions (or perhaps other changes?)
      has exposed typmod information not known at parse time.  In such cases,
      Vars generated by query_planner might have valid typmod values while the
      original grouping columns only have typmod -1.  This isn't a semantic
      problem since the behavior of grouping only depends on type not typmod,
      but it breaks locate_grouping_columns' use of tlist_member to locate the
      matching entry in query_planner's result tlist.
      
      We can fix this without an excessive amount of new code or complexity by
      relying on the fact that locate_grouping_columns only gets called when
      make_subplanTargetList has set need_tlist_eval == false, and that can only
      happen if all the grouping columns are simple Vars.  Therefore we only need
      to search the sub_tlist for a matching Var, and we can reasonably define a
      "match" as being a match of the Var identity fields
      varno/varattno/varlevelsup.  The code still Asserts that vartype matches,
      but ignores vartypmod.
      
      Per bug #8393 from Evan Martin.  The added regression test case is
      basically the same as his example.  This has been broken for a very long
      time, so back-patch to all supported branches.
      fcf9ecad
  26. 22 8月, 2013 1 次提交
    • T
      Fix hash table size estimation error in choose_hashed_distinct(). · 34548763
      Tom Lane 提交于
      We should account for the per-group hashtable entry overhead when
      considering whether to use a hash aggregate to implement DISTINCT.  The
      comparable logic in choose_hashed_grouping() gets this right, but I think
      I omitted it here in the mistaken belief that there would be no overhead
      if there were no aggregate functions to be evaluated.  This can result in
      more than 2X underestimate of the hash table size, if the tuples being
      aggregated aren't very wide.  Per report from Tomas Vondra.
      
      This bug is of long standing, but per discussion we'll only back-patch into
      9.3.  Changing the estimation behavior in stable branches seems to carry too
      much risk of destabilizing plan choices for already-tuned applications.
      34548763
  27. 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
  28. 03 8月, 2013 1 次提交
    • A
      Fix crash in error report of invalid tuple lock · 88c55668
      Alvaro Herrera 提交于
      My tweak of these error messages in commit c359a1b0 contained the
      thinko that a query would always have rowMarks set for a query
      containing a locking clause.  Not so: when declaring a cursor, for
      instance, rowMarks isn't set at the point we're checking, so we'd be
      dereferencing a NULL pointer.
      
      The fix is to pass the lock strength to the function raising the error,
      instead of trying to reverse-engineer it.  The result not only is more
      robust, but it also seems cleaner overall.
      
      Per report from Robert Haas.
      88c55668
  29. 24 7月, 2013 1 次提交
    • A
      Tweak FOR UPDATE/SHARE error message wording (again) · c359a1b0
      Alvaro Herrera 提交于
      In commit 0ac5ad51 I changed some error messages from "FOR
      UPDATE/SHARE" to a rather long gobbledygook which nobody liked.  Then,
      in commit cb9b66d3 I changed them again, but the alternative chosen
      there was deemed suboptimal by Peter Eisentraut, who in message
      1373937980.20441.8.camel@vanquo.pezone.net proposed an alternative
      involving a dynamically-constructed string based on the actual locking
      strength specified in the SQL command.  This patch implements that
      suggestion.
      c359a1b0
  30. 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
  31. 30 5月, 2013 1 次提交
  32. 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
  33. 15 3月, 2013 2 次提交
    • T
      Avoid inserting no-op Limit plan nodes. · 1a1832eb
      Tom Lane 提交于
      This was discussed in connection with the patch to avoid inserting no-op
      Result nodes, but not actually implemented therein.
      1a1832eb
    • T
      Avoid inserting Result nodes that only compute identity projections. · 4387cf95
      Tom Lane 提交于
      The planner sometimes inserts Result nodes to perform column projections
      (ie, arbitrary scalar calculations) above plan nodes that lack projection
      logic of their own.  However, we did that even if the lower plan node was
      in fact producing the required column set already; which is a pretty common
      case given the popularity of "SELECT * FROM ...".  Measurements show that
      the useless plan node adds non-negligible overhead, especially when there
      are many columns in the result.  So add a check to avoid inserting a Result
      node unless there's something useful for it to do.
      
      There are a couple of remaining places where unnecessary Result nodes
      could get inserted, but they are (a) much less performance-critical,
      and (b) coded in such a way that it's hard to avoid inserting a Result,
      because the desired tlist is changed on-the-fly in subsequent logic.
      We'll leave those alone for now.
      
      Kyotaro Horiguchi; reviewed and further hacked on by Amit Kapila and
      Tom Lane.
      4387cf95
  34. 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
  35. 04 3月, 2013 1 次提交
    • K
      Add a materialized view relations. · 3bf3ab8c
      Kevin Grittner 提交于
      A materialized view has a rule just like a view and a heap and
      other physical properties like a table.  The rule is only used to
      populate the table, references in queries refer to the
      materialized data.
      
      This is a minimal implementation, but should still be useful in
      many cases.  Currently data is only populated "on demand" by the
      CREATE MATERIALIZED VIEW and REFRESH MATERIALIZED VIEW statements.
      It is expected that future releases will add incremental updates
      with various timings, and that a more refined concept of defining
      what is "fresh" data will be developed.  At some point it may even
      be possible to have queries use a materialized in place of
      references to underlying tables, but that requires the other
      above-mentioned features to be working first.
      
      Much of the documentation work by Robert Haas.
      Review by Noah Misch, Thom Brown, Robert Haas, Marko Tiikkaja
      Security review by KaiGai Kohei, with a decision on how best to
      implement sepgsql still pending.
      3bf3ab8c
  36. 06 2月, 2013 1 次提交
  37. 23 1月, 2013 1 次提交
    • A
      Improve concurrency of foreign key locking · 0ac5ad51
      Alvaro Herrera 提交于
      This patch introduces two additional lock modes for tuples: "SELECT FOR
      KEY SHARE" and "SELECT FOR NO KEY UPDATE".  These don't block each
      other, in contrast with already existing "SELECT FOR SHARE" and "SELECT
      FOR UPDATE".  UPDATE commands that do not modify the values stored in
      the columns that are part of the key of the tuple now grab a SELECT FOR
      NO KEY UPDATE lock on the tuple, allowing them to proceed concurrently
      with tuple locks of the FOR KEY SHARE variety.
      
      Foreign key triggers now use FOR KEY SHARE instead of FOR SHARE; this
      means the concurrency improvement applies to them, which is the whole
      point of this patch.
      
      The added tuple lock semantics require some rejiggering of the multixact
      module, so that the locking level that each transaction is holding can
      be stored alongside its Xid.  Also, multixacts now need to persist
      across server restarts and crashes, because they can now represent not
      only tuple locks, but also tuple updates.  This means we need more
      careful tracking of lifetime of pg_multixact SLRU files; since they now
      persist longer, we require more infrastructure to figure out when they
      can be removed.  pg_upgrade also needs to be careful to copy
      pg_multixact files over from the old server to the new, or at least part
      of multixact.c state, depending on the versions of the old and new
      servers.
      
      Tuple time qualification rules (HeapTupleSatisfies routines) need to be
      careful not to consider tuples with the "is multi" infomask bit set as
      being only locked; they might need to look up MultiXact values (i.e.
      possibly do pg_multixact I/O) to find out the Xid that updated a tuple,
      whereas they previously were assured to only use information readily
      available from the tuple header.  This is considered acceptable, because
      the extra I/O would involve cases that would previously cause some
      commands to block waiting for concurrent transactions to finish.
      
      Another important change is the fact that locking tuples that have
      previously been updated causes the future versions to be marked as
      locked, too; this is essential for correctness of foreign key checks.
      This causes additional WAL-logging, also (there was previously a single
      WAL record for a locked tuple; now there are as many as updated copies
      of the tuple there exist.)
      
      With all this in place, contention related to tuples being checked by
      foreign key rules should be much reduced.
      
      As a bonus, the old behavior that a subtransaction grabbing a stronger
      tuple lock than the parent (sub)transaction held on a given tuple and
      later aborting caused the weaker lock to be lost, has been fixed.
      
      Many new spec files were added for isolation tester framework, to ensure
      overall behavior is sane.  There's probably room for several more tests.
      
      There were several reviewers of this patch; in particular, Noah Misch
      and Andres Freund spent considerable time in it.  Original idea for the
      patch came from Simon Riggs, after a problem report by Joel Jacobson.
      Most code is from me, with contributions from Marti Raudsepp, Alexander
      Shulgin, Noah Misch and Andres Freund.
      
      This patch was discussed in several pgsql-hackers threads; the most
      important start at the following message-ids:
      	AANLkTimo9XVcEzfiBR-ut3KVNDkjm2Vxh+t8kAmWjPuv@mail.gmail.com
      	1290721684-sup-3951@alvh.no-ip.org
      	1294953201-sup-2099@alvh.no-ip.org
      	1320343602-sup-2290@alvh.no-ip.org
      	1339690386-sup-8927@alvh.no-ip.org
      	4FE5FF020200002500048A3D@gw.wicourts.gov
      	4FEAB90A0200002500048B7D@gw.wicourts.gov
      0ac5ad51
  38. 02 1月, 2013 1 次提交