1. 10 May, 2019 1 commit
  2. 07 May, 2019 1 commit
  3. 01 May, 2019 1 commit
    • Andres Freund's avatar
      Run catalog reindexing test from 3dbb317d serially, to avoid deadlocks. · 809c9b48
      Andres Freund authored
      The tests turn out to cause deadlocks in some circumstances. Fairly
      reproducibly so with -DRELCACHE_FORCE_RELEASE
      -DCATCACHE_FORCE_RELEASE.  Some of the deadlocks may be hard to fix
      without disproportionate measures, but others probably should be fixed
      - but not in 12.
      
      We discussed removing the new tests until we can fix the issues
      underlying the deadlocks, but results from buildfarm animal
      markhor (which runs with CLOBBER_CACHE_ALWAYS) indicates that there
      might be a more severe, as of yet undiagnosed, issue (including on
      stable branches) with reindexing catalogs. The failure is:
      ERROR: could not read block 0 in file "base/16384/28025": read only 0 of 8192 bytes
      Therefore it seems advisable to keep the tests.
      
      It's not certain that running the tests in isolation removes the risk
      of deadlocks. It's possible that additional locks are needed to
      protect against a concurrent auto-analyze or such.
      
      Per discussion with Tom Lane.
      
      Discussion: https://postgr.es/m/28926.1556664156@sss.pgh.pa.us
      Backpatch: 9.4-, like 3dbb317d
      809c9b48
  4. 11 Apr, 2019 2 commits
    • Tom Lane's avatar
      Re-order some regression test scripts for more parallelism. · 798070ec
      Tom Lane authored
      Move the strings, numerology, insert, insert_conflict, select and
      errors tests to be parts of nearby parallel groups, instead of
      executing by themselves.  (Moving "select" required adjusting the
      constraints test, which uses a table named "tmp" as select also
      does.  There don't seem to be any other conflicts.)
      
      Move psql and stats_ext to the next parallel group, where the rules
      test also has a long runtime.  To make it safe to run stats_ext in
      parallel with rules, I adjusted the latter to only dump views/rules
      from the pg_catalog and public schemas, which was what it was doing
      anyway.  stats_ext makes some views in a transient schema, which now
      will not affect rules.
      
      Reorder serial_schedule to match parallel_schedule.
      
      Discussion: https://postgr.es/m/735.1554935715@sss.pgh.pa.us
      798070ec
    • Tom Lane's avatar
      Split up a couple of long-running regression test scripts. · 385d396b
      Tom Lane authored
      The point of this change is to increase the potential for parallelism
      while running the core regression tests.  Most people these days are
      using parallel testing modes on multi-core machines, so we might as
      well try a bit harder to keep multiple cores busy.  Hence, a test that
      runs much longer than others in its parallel group is a candidate to
      be sub-divided.
      
      In this patch, create_index.sql and join.sql are split up.
      I haven't changed the content of the tests in any way, just
      moved them.
      
      I moved create_index.sql's SP-GiST-related tests into a new script
      create_index_spgist, and moved its btree multilevel page deletion test
      over to the existing script btree_index.  (btree_index is a more natural
      home for that test, and it's shorter than others in its parallel group,
      so this doesn't hurt total runtime of that group.)  There might be
      room for more aggressive splitting of create_index, but this is enough
      to improve matters considerably.
      
      Likewise, I moved join.sql's "exercises for the hash join code" into
      a new file join_hash.  Those exercises contributed three-quarters of
      the script's runtime.  Which might well be excessive ... but for the
      moment, I'm satisfied with shoving them into a different parallel
      group, where they can share runtime with the roughly-equally-lengthy
      gist test.
      
      (Note for anybody following along at home: there are interesting
      interactions between the runtimes of create_index and anything running
      in parallel with it, because the tests of CREATE INDEX CONCURRENTLY
      in that file will repeatedly block waiting for concurrent transactions
      to commit.  As committed in this patch, create_index and
      create_index_spgist have roughly equal runtimes, but that's mostly an
      artifact of forced synchronization of the CONCURRENTLY tests; when run
      serially, create_index is much faster.  A followup patch will reduce
      the runtime of create_index_spgist and thereby also create_index.)
      
      Discussion: https://postgr.es/m/735.1554935715@sss.pgh.pa.us
      385d396b
  5. 30 Mar, 2019 1 commit
  6. 25 Mar, 2019 1 commit
  7. 16 Mar, 2019 1 commit
    • Alexander Korotkov's avatar
      Partial implementation of SQL/JSON path language · 72b64603
      Alexander Korotkov authored
      SQL 2016 standards among other things contains set of SQL/JSON features for
      JSON processing inside of relational database.  The core of SQL/JSON is JSON
      path language, allowing access parts of JSON documents and make computations
      over them.  This commit implements partial support JSON path language as
      separate datatype called "jsonpath".  The implementation is partial because
      it's lacking datetime support and suppression of numeric errors.  Missing
      features will be added later by separate commits.
      
      Support of SQL/JSON features requires implementation of separate nodes, and it
      will be considered in subsequent patches.  This commit includes following
      set of plain functions, allowing to execute jsonpath over jsonb values:
      
       * jsonb_path_exists(jsonb, jsonpath[, jsonb, bool]),
       * jsonb_path_match(jsonb, jsonpath[, jsonb, bool]),
       * jsonb_path_query(jsonb, jsonpath[, jsonb, bool]),
       * jsonb_path_query_array(jsonb, jsonpath[, jsonb, bool]).
       * jsonb_path_query_first(jsonb, jsonpath[, jsonb, bool]).
      
      This commit also implements "jsonb @? jsonpath" and "jsonb @@ jsonpath", which
      are wrappers over jsonpath_exists(jsonb, jsonpath) and jsonpath_predicate(jsonb,
      jsonpath) correspondingly.  These operators will have an index support
      (implemented in subsequent patches).
      
      Catversion bumped, to add new functions and operators.
      
      Code was written by Nikita Glukhov and Teodor Sigaev, revised by me.
      Documentation was written by Oleg Bartunov and Liudmila Mantrova.  The work
      was inspired by Oleg Bartunov.
      
      Discussion: https://postgr.es/m/fcc6fc6a-b497-f39a-923d-aa34d0c588e8%402ndQuadrant.com
      Author: Nikita Glukhov, Teodor Sigaev, Alexander Korotkov, Oleg Bartunov, Liudmila Mantrova
      Reviewed-by: Tomas Vondra, Andrew Dunstan, Pavel Stehule, Alexander Korotkov
      72b64603
  8. 14 Mar, 2019 1 commit
    • Peter Eisentraut's avatar
      Reorder identity regression test · 2fadf24e
      Peter Eisentraut authored
      The previous test order had the effect that if something was wrong
      with the identity functionality, the create_table_like test would
      likely fail or crash first, which is confusing.  Reorder so that the
      identity test comes before create_table_like.
      2fadf24e
  9. 12 Mar, 2019 1 commit
  10. 10 Mar, 2019 1 commit
    • Alexander Korotkov's avatar
      Support for INCLUDE attributes in GiST indexes · f2e40380
      Alexander Korotkov authored
      Similarly to B-tree, GiST index access method gets support of INCLUDE
      attributes.  These attributes aren't used for tree navigation and aren't
      present in non-leaf pages.  But they are present in leaf pages and can be
      fetched during index-only scan.
      
      The point of having INCLUDE attributes in GiST indexes is slightly different
      from the point of having them in B-tree.  The main point of INCLUDE attributes
      in B-tree is to define UNIQUE constraint over part of attributes enabled for
      index-only scan.  In GiST the main point of INCLUDE attributes is to use
      index-only scan for attributes, whose data types don't have GiST opclasses.
      
      Discussion: https://postgr.es/m/73A1A452-AD5F-40D4-BD61-978622FF75C1%40yandex-team.ru
      Author: Andrey Borodin, with small changes by me
      Reviewed-by: Andreas Karlsson
      f2e40380
  11. 04 Feb, 2019 1 commit
    • Amit Kapila's avatar
      Avoid creation of the free space map for small heap relations, take 2. · b0eaa4c5
      Amit Kapila authored
      Previously, all heaps had FSMs. For very small tables, this means that the
      FSM took up more space than the heap did. This is wasteful, so now we
      refrain from creating the FSM for heaps with 4 pages or fewer. If the last
      known target block has insufficient space, we still try to insert into some
      other page before giving up and extending the relation, since doing
      otherwise leads to table bloat. Testing showed that trying every page
      penalized performance slightly, so we compromise and try every other page.
      This way, we visit at most two pages. Any pages with wasted free space
      become visible at next relation extension, so we still control table bloat.
      As a bonus, directly attempting one or two pages can even be faster than
      consulting the FSM would have been.
      
      Once the FSM is created for a heap we don't remove it even if somebody
      deletes all the rows from the corresponding relation.  We don't think it is
      a useful optimization as it is quite likely that relation will again grow
      to the same size.
      
      Author: John Naylor, Amit Kapila
      Reviewed-by: Amit Kapila
      Tested-by: Mithun C Y
      Discussion: https://www.postgresql.org/message-id/CAJVSVGWvB13PzpbLEecFuGFc5V2fsO736BsdTakPiPAcdMM5tQ@mail.gmail.com
      b0eaa4c5
  12. 28 Jan, 2019 2 commits
    • Amit Kapila's avatar
      a2367650
    • Amit Kapila's avatar
      Avoid creation of the free space map for small heap relations. · ac88d296
      Amit Kapila authored
      Previously, all heaps had FSMs. For very small tables, this means that the
      FSM took up more space than the heap did. This is wasteful, so now we
      refrain from creating the FSM for heaps with 4 pages or fewer. If the last
      known target block has insufficient space, we still try to insert into some
      other page before giving up and extending the relation, since doing
      otherwise leads to table bloat. Testing showed that trying every page
      penalized performance slightly, so we compromise and try every other page.
      This way, we visit at most two pages. Any pages with wasted free space
      become visible at next relation extension, so we still control table bloat.
      As a bonus, directly attempting one or two pages can even be faster than
      consulting the FSM would have been.
      
      Once the FSM is created for a heap we don't remove it even if somebody
      deletes all the rows from the corresponding relation.  We don't think it is
      a useful optimization as it is quite likely that relation will again grow
      to the same size.
      
      Author: John Naylor with design inputs and some code contribution by Amit Kapila
      Reviewed-by: Amit Kapila
      Tested-by: Mithun C Y
      Discussion: https://www.postgresql.org/message-id/CAJVSVGWvB13PzpbLEecFuGFc5V2fsO736BsdTakPiPAcdMM5tQ@mail.gmail.com
      ac88d296
  13. 21 Nov, 2018 1 commit
    • Andres Freund's avatar
      Remove WITH OIDS support, change oid catalog column visibility. · 578b2297
      Andres Freund authored
      Previously tables declared WITH OIDS, including a significant fraction
      of the catalog tables, stored the oid column not as a normal column,
      but as part of the tuple header.
      
      This special column was not shown by default, which was somewhat odd,
      as it's often (consider e.g. pg_class.oid) one of the more important
      parts of a row.  Neither pg_dump nor COPY included the contents of the
      oid column by default.
      
      The fact that the oid column was not an ordinary column necessitated a
      significant amount of special case code to support oid columns. That
      already was painful for the existing, but upcoming work aiming to make
      table storage pluggable, would have required expanding and duplicating
      that "specialness" significantly.
      
      WITH OIDS has been deprecated since 2005 (commit ff02d0a05280e0).
      Remove it.
      
      Removing includes:
      - CREATE TABLE and ALTER TABLE syntax for declaring the table to be
        WITH OIDS has been removed (WITH (oids[ = true]) will error out)
      - pg_dump does not support dumping tables declared WITH OIDS and will
        issue a warning when dumping one (and ignore the oid column).
      - restoring an pg_dump archive with pg_restore will warn when
        restoring a table with oid contents (and ignore the oid column)
      - COPY will refuse to load binary dump that includes oids.
      - pg_upgrade will error out when encountering tables declared WITH
        OIDS, they have to be altered to remove the oid column first.
      - Functionality to access the oid of the last inserted row (like
        plpgsql's RESULT_OID, spi's SPI_lastoid, ...) has been removed.
      
      The syntax for declaring a table WITHOUT OIDS (or WITH (oids = false)
      for CREATE TABLE) is still supported. While that requires a bit of
      support code, it seems unnecessary to break applications / dumps that
      do not use oids, and are explicit about not using them.
      
      The biggest user of WITH OID columns was postgres' catalog. This
      commit changes all 'magic' oid columns to be columns that are normally
      declared and stored. To reduce unnecessary query breakage all the
      newly added columns are still named 'oid', even if a table's column
      naming scheme would indicate 'reloid' or such.  This obviously
      requires adapting a lot code, mostly replacing oid access via
      HeapTupleGetOid() with access to the underlying Form_pg_*->oid column.
      
      The bootstrap process now assigns oids for all oid columns in
      genbki.pl that do not have an explicit value (starting at the largest
      oid previously used), only oids assigned later by oids will be above
      FirstBootstrapObjectId. As the oid column now is a normal column the
      special bootstrap syntax for oids has been removed.
      
      Oids are not automatically assigned during insertion anymore, all
      backend code explicitly assigns oids with GetNewOidWithIndex(). For
      the rare case that insertions into the catalog via SQL are called for
      the new pg_nextoid() function can be used (which only works on catalog
      tables).
      
      The fact that oid columns on system tables are now normal columns
      means that they will be included in the set of columns expanded
      by * (i.e. SELECT * FROM pg_class will now include the table's oid,
      previously it did not). It'd not technically be hard to hide oid
      column by default, but that'd mean confusing behavior would either
      have to be carried forward forever, or it'd cause breakage down the
      line.
      
      While it's not unlikely that further adjustments are needed, the
      scope/invasiveness of the patch makes it worthwhile to get merge this
      now. It's painful to maintain externally, too complicated to commit
      after the code code freeze, and a dependency of a number of other
      patches.
      
      Catversion bump, for obvious reasons.
      
      Author: Andres Freund, with contributions by John Naylor
      Discussion: https://postgr.es/m/20180930034810.ywp2c7awz7opzcfr@alap3.anarazel.de
      578b2297
  14. 06 Nov, 2018 1 commit
    • Tom Lane's avatar
      Disable recheck_on_update optimization to avoid crashes. · 5d28c9bd
      Tom Lane authored
      The code added by commit c203d6cf causes a crash in at least one case,
      where a potentially-optimizable expression index has a storage type
      different from the input data type.  A cursory code review turned up
      numerous other problems that seem impractical to fix on short notice.
      
      Andres argued for revert of that patch some time ago, and if additional
      senior committers had been paying attention, that's likely what would
      have happened, but we were not :-(
      
      At this point we can't just revert, at least not in v11, because that would
      mean an ABI break for code touching relcache entries.  And we should not
      remove the (also buggy) support for the recheck_on_update index reloption,
      since it might already be used in some databases in the field.  So this
      patch just does the as-little-invasive-as-possible measure of disabling
      the feature as though recheck_on_update were forced off for all indexes.
      I also removed the related regression tests (which would otherwise fail)
      and the user-facing documentation of the reloption.
      
      We should undertake a more thorough code cleanup if the patch can't be
      fixed, but not under the extreme time pressure of being already overdue
      for 11.1 release.
      
      Per report from Ondřej Bouda and subsequent private discussion among
      pgsql-release.
      
      Discussion: https://postgr.es/m/20181106185255.776mstcyehnc63ty@alvherre.pgsql
      5d28c9bd
  15. 30 Oct, 2018 1 commit
    • Michael Paquier's avatar
      Add pg_partition_tree to display information about partitions · d5eec4ee
      Michael Paquier authored
      This new function is useful to display a full tree of partitions with a
      partitioned table given in output, and avoids the need of any complex
      WITH RECURSIVE query when looking at partition trees which are
      deep multiple levels.
      
      It returns a set of records, one for each partition, containing the
      partition's name, its immediate parent's name, a boolean value telling
      if the relation is a leaf in the tree and an integer telling its level
      in the partition tree with given table considered as root, beginning at
      zero for the root, and incrementing by one each time the scan goes one
      level down.
      
      Author: Amit Langote
      Reviewed-by: Jesper Pedersen, Michael Paquier, Robert Haas
      Discussion: https://postgr.es/m/8d00e51a-9a51-ad02-d53e-ba6bf50b2e52@lab.ntt.co.jp
      d5eec4ee
  16. 11 Oct, 2018 1 commit
  17. 20 Apr, 2018 1 commit
    • Tom Lane's avatar
      Don't run fast_default regression test in parallel with other tests. · 676858bc
      Tom Lane authored
      Since it sets up an event trigger that would fire on DDL done by any
      concurrent test script, the original scheduling is just an invitation
      to irreproducible test failures.  (The fact that we found a bug through
      exactly such irreproducible test failures doesn't really change the
      calculus here: this script is a hazard to anything that runs in parallel
      with it today or might be added to that parallel group in future.  No,
      I don't believe that the trigger is protecting itself sufficiently to
      avoid all possible trouble.)
      
      Discussion: https://postgr.es/m/5767.1523995174@sss.pgh.pa.us
      676858bc
  18. 13 Apr, 2018 1 commit
  19. 12 Apr, 2018 1 commit
    • Simon Riggs's avatar
      Revert MERGE patch · 08ea7a22
      Simon Riggs authored
      This reverts commits d204ef63,
      83454e3c and a few more commits thereafter
      (complete list at the end) related to MERGE feature.
      
      While the feature was fully functional, with sufficient test coverage and
      necessary documentation, it was felt that some parts of the executor and
      parse-analyzer can use a different design and it wasn't possible to do that in
      the available time. So it was decided to revert the patch for PG11 and retry
      again in the future.
      
      Thanks again to all reviewers and bug reporters.
      
      List of commits reverted, in reverse chronological order:
      
       f1464c53 Improve parse representation for MERGE
       ddb41585 MERGE syntax diagram correction
       530e69e5 Allow cpluspluscheck to pass by renaming variable
       01b88b4d MERGE minor errata
       3af7b2b0 MERGE fix variable warning in non-assert builds
       a5d86181 MERGE INSERT allows only one VALUES clause
       4b2d4403 MERGE post-commit review
       4923550c Tab completion for MERGE
       aa3faa3c WITH support in MERGE
       83454e3c New files for MERGE
       d204ef63 MERGE SQL Command following SQL:2016
      
      Author: Pavan Deolasee
      Reviewed-by: Michael Paquier
      08ea7a22
  20. 07 Apr, 2018 2 commits
    • Teodor Sigaev's avatar
      Indexes with INCLUDE columns and their support in B-tree · 8224de4f
      Teodor Sigaev authored
      This patch introduces INCLUDE clause to index definition.  This clause
      specifies a list of columns which will be included as a non-key part in
      the index.  The INCLUDE columns exist solely to allow more queries to
      benefit from index-only scans.  Also, such columns don't need to have
      appropriate operator classes.  Expressions are not supported as INCLUDE
      columns since they cannot be used in index-only scans.
      
      Index access methods supporting INCLUDE are indicated by amcaninclude flag
      in IndexAmRoutine.  For now, only B-tree indexes support INCLUDE clause.
      
      In B-tree indexes INCLUDE columns are truncated from pivot index tuples
      (tuples located in non-leaf pages and high keys).  Therefore, B-tree indexes
      now might have variable number of attributes.  This patch also provides
      generic facility to support that: pivot tuples contain number of their
      attributes in t_tid.ip_posid.  Free 13th bit of t_info is used for indicating
      that.  This facility will simplify further support of index suffix truncation.
      The changes of above are backward-compatible, pg_upgrade doesn't need special
      handling of B-tree indexes for that.
      
      Bump catalog version
      
      Author: Anastasia Lubennikova with contribition by Alexander Korotkov and me
      Reviewed by: Peter Geoghegan, Tomas Vondra, Antonin Houska, Jeff Janes,
      			 David Rowley, Alexander Korotkov
      Discussion: https://www.postgresql.org/message-id/flat/56168952.4010101@postgrespro.ru
      8224de4f
    • Andres Freund's avatar
      Attempt to fix endianess issues in new hash partition test. · 40e42e10
      Andres Freund authored
      The tests added as part of 9fdb675f yield differing results
      depending on endianess, causing buildfarm failures. As the differences
      are expected, split the hash partitioning tests into a different file
      and maintain alternative output. The separate file is so the amount of
      duplicated output is reduced.
      
      David produced the alternative output without a machine to test on, so
      it's possible this'll require a buildfarm cycle or two to get right.
      
      Author: David Rowley
      Discussion: https://postgr.es/m/CAKJS1f-6f4c2Qhuipe-GY7BKmFd0FMBobRnLS7hVCoAmTszsBg@mail.gmail.com
      40e42e10
  21. 03 Apr, 2018 1 commit
    • Simon Riggs's avatar
      MERGE SQL Command following SQL:2016 · d204ef63
      Simon Riggs authored
      MERGE performs actions that modify rows in the target table
      using a source table or query. MERGE provides a single SQL
      statement that can conditionally INSERT/UPDATE/DELETE rows
      a task that would other require multiple PL statements.
      e.g.
      
      MERGE INTO target AS t
      USING source AS s
      ON t.tid = s.sid
      WHEN MATCHED AND t.balance > s.delta THEN
        UPDATE SET balance = t.balance - s.delta
      WHEN MATCHED THEN
        DELETE
      WHEN NOT MATCHED AND s.delta > 0 THEN
        INSERT VALUES (s.sid, s.delta)
      WHEN NOT MATCHED THEN
        DO NOTHING;
      
      MERGE works with regular and partitioned tables, including
      column and row security enforcement, as well as support for
      row, statement and transition triggers.
      
      MERGE is optimized for OLTP and is parameterizable, though
      also useful for large scale ETL/ELT. MERGE is not intended
      to be used in preference to existing single SQL commands
      for INSERT, UPDATE or DELETE since there is some overhead.
      MERGE can be used statically from PL/pgSQL.
      
      MERGE does not yet support inheritance, write rules,
      RETURNING clauses, updatable views or foreign tables.
      MERGE follows SQL Standard per the most recent SQL:2016.
      
      Includes full tests and documentation, including full
      isolation tests to demonstrate the concurrent behavior.
      
      This version written from scratch in 2017 by Simon Riggs,
      using docs and tests originally written in 2009. Later work
      from Pavan Deolasee has been both complex and deep, leaving
      the lead author credit now in his hands.
      Extensive discussion of concurrency from Peter Geoghegan,
      with thanks for the time and effort contributed.
      
      Various issues reported via sqlsmith by Andreas Seltenreich
      
      Authors: Pavan Deolasee, Simon Riggs
      Reviewer: Peter Geoghegan, Amit Langote, Tomas Vondra, Simon Riggs
      
      Discussion:
      https://postgr.es/m/CANP8+jKitBSrB7oTgT9CY2i1ObfOt36z0XMraQc+Xrz8QB0nXA@mail.gmail.com
      https://postgr.es/m/CAH2-WzkJdBuxj9PO=2QaO9-3h3xGbQPZ34kJH=HukRekwM-GZg@mail.gmail.com
      d204ef63
  22. 02 Apr, 2018 2 commits
  23. 28 Mar, 2018 1 commit
    • Andrew Dunstan's avatar
      Fast ALTER TABLE ADD COLUMN with a non-NULL default · 16828d5c
      Andrew Dunstan authored
      Currently adding a column to a table with a non-NULL default results in
      a rewrite of the table. For large tables this can be both expensive and
      disruptive. This patch removes the need for the rewrite as long as the
      default value is not volatile. The default expression is evaluated at
      the time of the ALTER TABLE and the result stored in a new column
      (attmissingval) in pg_attribute, and a new column (atthasmissing) is set
      to true. Any existing row when fetched will be supplied with the
      attmissingval. New rows will have the supplied value or the default and
      so will never need the attmissingval.
      
      Any time the table is rewritten all the atthasmissing and attmissingval
      settings for the attributes are cleared, as they are no longer needed.
      
      The most visible code change from this is in heap_attisnull, which
      acquires a third TupleDesc argument, allowing it to detect a missing
      value if there is one. In many cases where it is known that there will
      not be any (e.g.  catalog relations) NULL can be passed for this
      argument.
      
      Andrew Dunstan, heavily modified from an original patch from Serge
      Rielau.
      Reviewed by Tom Lane, Andres Freund, Tomas Vondra and David Rowley.
      
      Discussion: https://postgr.es/m/31e2e921-7002-4c27-59f5-51f08404c858@2ndQuadrant.com
      16828d5c
  24. 27 Mar, 2018 1 commit
    • Simon Riggs's avatar
      Allow HOT updates for some expression indexes · c203d6cf
      Simon Riggs authored
      If the value of an index expression is unchanged after UPDATE,
      allow HOT updates where previously we disallowed them, giving
      a significant performance boost in those cases.
      
      Particularly useful for indexes such as JSON->>field where the
      JSON value changes but the indexed value does not.
      
      Submitted as "surjective indexes" patch, now enabled by use
      of new "recheck_on_update" parameter.
      
      Author: Konstantin Knizhnik
      Reviewer: Simon Riggs, with much wordsmithing and some cleanup
      c203d6cf
  25. 22 Mar, 2018 1 commit
    • Robert Haas's avatar
      Implement partition-wise grouping/aggregation. · e2f1eb0e
      Robert Haas authored
      If the partition keys of input relation are part of the GROUP BY
      clause, all the rows belonging to a given group come from a single
      partition.  This allows aggregation/grouping over a partitioned
      relation to be broken down * into aggregation/grouping on each
      partition.  This should be no worse, and often better, than the normal
      approach.
      
      If the GROUP BY clause does not contain all the partition keys, we can
      still perform partial aggregation for each partition and then finalize
      aggregation after appending the partial results.  This is less certain
      to be a win, but it's still useful.
      
      Jeevan Chalke, Ashutosh Bapat, Robert Haas.  The larger patch series
      of which this patch is a part was also reviewed and tested by Antonin
      Houska, Rajkumar Raghuwanshi, David Rowley, Dilip Kumar, Konstantin
      Knizhnik, Pascal Legrand, and Rafia Sabih.
      
      Discussion: http://postgr.es/m/CAM2+6=V64_xhstVHie0Rz=KPEQnLJMZt_e314P0jaT_oJ9MR8A@mail.gmail.com
      e2f1eb0e
  26. 19 Jan, 2018 1 commit
    • Alvaro Herrera's avatar
      Local partitioned indexes · 8b08f7d4
      Alvaro Herrera authored
      When CREATE INDEX is run on a partitioned table, create catalog entries
      for an index on the partitioned table (which is just a placeholder since
      the table proper has no data of its own), and recurse to create actual
      indexes on the existing partitions; create them in future partitions
      also.
      
      As a convenience gadget, if the new index definition matches some
      existing index in partitions, these are picked up and used instead of
      creating new ones.  Whichever way these indexes come about, they become
      attached to the index on the parent table and are dropped alongside it,
      and cannot be dropped on isolation unless they are detached first.
      
      To support pg_dump'ing these indexes, add commands
          CREATE INDEX ON ONLY <table>
      (which creates the index on the parent partitioned table, without
      recursing) and
          ALTER INDEX ATTACH PARTITION
      (which is used after the indexes have been created individually on each
      partition, to attach them to the parent index).  These reconstruct prior
      database state exactly.
      
      Reviewed-by: (in alphabetical order) Peter Eisentraut, Robert Haas, Amit
      	Langote, Jesper Pedersen, Simon Riggs, David Rowley
      Discussion: https://postgr.es/m/20171113170646.gzweigyrgg6pwsg4@alvherre.pgsql
      8b08f7d4
  27. 30 Nov, 2017 1 commit
    • Peter Eisentraut's avatar
      SQL procedures · e4128ee7
      Peter Eisentraut authored
      This adds a new object type "procedure" that is similar to a function
      but does not have a return type and is invoked by the new CALL statement
      instead of SELECT or similar.  This implementation is aligned with the
      SQL standard and compatible with or similar to other SQL implementations.
      
      This commit adds new commands CALL, CREATE/ALTER/DROP PROCEDURE, as well
      as ALTER/DROP ROUTINE that can refer to either a function or a
      procedure (or an aggregate function, as an extension to SQL).  There is
      also support for procedures in various utility commands such as COMMENT
      and GRANT, as well as support in pg_dump and psql.  Support for defining
      procedures is available in all the languages supplied by the core
      distribution.
      
      While this commit is mainly syntax sugar around existing functionality,
      future features will rely on having procedures as a separate object
      type.
      Reviewed-by: default avatarAndrew Dunstan <andrew.dunstan@2ndquadrant.com>
      e4128ee7
  28. 29 Nov, 2017 1 commit
    • Robert Haas's avatar
      Add extensive tests for partition pruning. · 8d4e70a6
      Robert Haas authored
      Currently, partition pruning happens via constraint exclusion, but
      there are pending places to replace that with a different and
      hopefully faster mechanism.  To be sure that we don't change behavior
      without realizing it, add extensive test coverage.
      
      Note that not all of these behaviors are optimal; in some cases,
      partitions are not pruned even though it would be safe to do so.
      These tests therefore serve to memorialize the current state rather
      than the ideal state.  Patches that improve things can update the test
      results as appropriate.
      
      Amit Langote, adjusted by me.  Review and testing of the larger patch
      set of which this is a part by Ashutosh Bapat, David Rowley, Dilip
      Kumar, Jesper Pedersen, Rajkumar Raghuwanshi, Beena Emerson, Amul Sul,
      and Kyotaro Horiguchi.
      
      Discussion: http://postgr.es/m/098b9c71-1915-1a2a-8d52-1a7a50ce79e8@lab.ntt.co.jp
      8d4e70a6
  29. 21 Nov, 2017 1 commit
    • Robert Haas's avatar
      Fix multiple problems with satisfies_hash_partition. · f3b0897a
      Robert Haas authored
      Fix the function header comment to describe the actual behavior.
      Check that table OID, modulus, and remainder arguments are not NULL
      before accessing them.  Check that the modulus and remainder are
      sensible.  If the table OID doesn't exist, return NULL instead of
      emitting an internal error, similar to what we do elsewhere.  Check
      that the actual argument types match, or at least are binary coercible
      to, the expected argument types.  Correctly handle invocation of this
      function using the VARIADIC syntax.  Add regression tests.
      
      Robert Haas and Amul Sul, per a report by Andreas Seltenreich and
      subsequent followup investigation.
      
      Discussion: http://postgr.es/m/871sl4sdrv.fsf@ansel.ydns.eu
      f3b0897a
  30. 19 Oct, 2017 1 commit
  31. 07 Oct, 2017 1 commit
  32. 06 Oct, 2017 1 commit
    • Robert Haas's avatar
      Basic partition-wise join functionality. · f49842d1
      Robert Haas authored
      Instead of joining two partitioned tables in their entirety we can, if
      it is an equi-join on the partition keys, join the matching partitions
      individually.  This involves teaching the planner about "other join"
      rels, which are related to regular join rels in the same way that
      other member rels are related to baserels.  This can use significantly
      more CPU time and memory than regular join planning, because there may
      now be a set of "other" rels not only for every base relation but also
      for every join relation.  In most practical cases, this probably
      shouldn't be a problem, because (1) it's probably unusual to join many
      tables each with many partitions using the partition keys for all
      joins and (2) if you do that scenario then you probably have a big
      enough machine to handle the increased memory cost of planning and (3)
      the resulting plan is highly likely to be better, so what you spend in
      planning you'll make up on the execution side.  All the same, for now,
      turn this feature off by default.
      
      Currently, we can only perform joins between two tables whose
      partitioning schemes are absolutely identical.  It would be nice to
      cope with other scenarios, such as extra partitions on one side or the
      other with no match on the other side, but that will have to wait for
      a future patch.
      
      Ashutosh Bapat, reviewed and tested by Rajkumar Raghuwanshi, Amit
      Langote, Rafia Sabih, Thomas Munro, Dilip Kumar, Antonin Houska, Amit
      Khandekar, and by me.  A few final adjustments by me.
      
      Discussion: http://postgr.es/m/CAFjFpRfQ8GrQvzp3jA2wnLqrHmaXna-urjm_UY9BqXj=EaDTSA@mail.gmail.com
      Discussion: http://postgr.es/m/CAFjFpRcitjfrULr5jfuKWRPsGUX0LQ0k8-yG0Qw2+1LBGNpMdw@mail.gmail.com
      f49842d1
  33. 05 Oct, 2017 1 commit
  34. 01 Sep, 2017 1 commit
    • Robert Haas's avatar
      Introduce 64-bit hash functions with a 64-bit seed. · 81c5e46c
      Robert Haas authored
      This will be useful for hash partitioning, which needs a way to seed
      the hash functions to avoid problems such as a hash index on a hash
      partitioned table clumping all values into a small portion of the
      bucket space; it's also useful for anything that wants a 64-bit hash
      value rather than a 32-bit hash value.
      
      Just in case somebody wants a 64-bit hash value that is compatible
      with the existing 32-bit hash values, make the low 32-bits of the
      64-bit hash value match the 32-bit hash value when the seed is 0.
      
      Robert Haas and Amul Sul
      
      Discussion: http://postgr.es/m/CA+Tgmoafx2yoJuhCQQOL5CocEi-w_uG4S2xT0EtgiJnPGcHW3g@mail.gmail.com
      81c5e46c
  35. 17 Jul, 2017 1 commit
    • Tom Lane's avatar
      Merge large_object.sql test into largeobject.source. · a570feaf
      Tom Lane authored
      It seems pretty confusing to have tests named both largeobject and
      large_object.  The latter is of very recent vintage (commit ff992c07),
      so get rid of it in favor of merging into the former.
      
      Also, enable the LO comment test that was added by commit 70ad7ed4,
      since the later commit added the then-missing pg_upgrade functionality.
      The large_object.sql test case is almost completely redundant with that,
      but not quite: it seems like creating a user-defined LO with an OID in
      the system range might be an interesting case for pg_upgrade, so let's
      keep it.
      
      Like the earlier patch, back-patch to all supported branches.
      
      Discussion: https://postgr.es/m/18665.1500306372@sss.pgh.pa.us
      a570feaf
  36. 23 Jun, 2017 1 commit
    • Tom Lane's avatar
      Add testing to detect errors of omission in "pin" dependency creation. · 8be8510c
      Tom Lane authored
      It's essential that initdb.c's setup_depend() scan each system catalog
      that could contain objects that need to have "p" (pin) entries in pg_depend
      or pg_shdepend.  Forgetting to add that, either when a catalog is first
      invented or when it first acquires DATA() entries, is an obvious bug
      hazard.  We can detect such omissions at reasonable cost by probing every
      OID-containing system catalog to see whether the lowest-numbered OID in it
      is pinned.  If so, the catalog must have been properly accounted for in
      setup_depend().  If the lowest OID is above FirstNormalObjectId then the
      catalog must have been empty at the end of initdb, so it doesn't matter.
      There are a small number of catalogs whose first entry is made later in
      initdb than setup_depend(), resulting in nonempty expected output of the
      test, but these can be manually inspected to see that they are OK.  Any
      future mistake of this ilk will manifest as a new entry in the test's
      output.
      
      Since pg_conversion is already in the test's output, add it to the set of
      catalogs scanned by setup_depend().  That has no effect today (hence, no
      catversion bump here) but it will protect us if we ever do add pin-worthy
      conversions.
      
      This test is very much like the catalog sanity checks embodied in
      opr_sanity.sql and type_sanity.sql, but testing pg_depend doesn't seem to
      fit naturally into either of those scripts' charters.  Hence, invent a new
      test script misc_sanity.sql, which can be a home for this as well as tests
      on any other catalogs we might want in future.
      
      Discussion: https://postgr.es/m/8068.1498155068@sss.pgh.pa.us
      8be8510c