1. 17 Jan, 2018 1 commit
    • Andrew Dunstan's avatar
      Centralize json and jsonb handling of datetime types · cc4feded
      Andrew Dunstan authored
      The creates a single function JsonEncodeDateTime which will format these
      data types in an efficient and consistent manner. This will be all the
      more important when we come to jsonpath so we don't have to implement yet
      more code doing the same thing in two more places.
      
      This also extends the code to handle time and timetz types which were
      not previously handled specially. This requires exposing the time2tm and
      timetz2tm functions.
      
      Patch from Nikita Glukhov
      cc4feded
  2. 16 Jan, 2018 1 commit
  3. 13 Jan, 2018 1 commit
  4. 12 Jan, 2018 7 commits
    • Bruce Momjian's avatar
      docs: replace dblink() mention with foreign data mention · 255f1418
      Bruce Momjian authored
      Reported-by: steven.winfield@cantabcapital.com
      
      Discussion: https://postgr.es/m/20171031105039.17183.850@wrigleys.postgresql.org
      255f1418
    • Tom Lane's avatar
      Fix postgres_fdw to cope with duplicate GROUP BY entries. · e9f2703a
      Tom Lane authored
      Commit 7012b132, which added the ability to push down aggregates and
      grouping to the remote server, wasn't careful to ensure that the remote
      server would have the same idea we do about which columns are the grouping
      columns, in cases where there are textually identical GROUP BY expressions.
      Such cases typically led to "targetlist item has multiple sortgroupref
      labels" errors.
      
      To fix this reliably, switch over to using "GROUP BY column-number" syntax
      rather than "GROUP BY expression" in transmitted queries, and adjust
      foreign_grouping_ok() to be more careful about duplicating the sortgroupref
      labeling of the local pathtarget.
      
      Per bug #14890 from Sean Johnston.  Back-patch to v10 where the buggy code
      was introduced.
      
      Jeevan Chalke, reviewed by Ashutosh Bapat
      
      Discussion: https://postgr.es/m/20171107134948.1508.94783@wrigleys.postgresql.org
      e9f2703a
    • Tom Lane's avatar
      Avoid unnecessary failure in SELECT concurrent with ALTER NO INHERIT. · 680d5405
      Tom Lane authored
      If a query against an inheritance tree runs concurrently with an ALTER
      TABLE that's disinheriting one of the tree members, it's possible to get
      a "could not find inherited attribute" error because after obtaining lock
      on the removed member, make_inh_translation_list sees that its columns
      have attinhcount=0 and decides they aren't the columns it's looking for.
      
      An ideal fix, perhaps, would avoid including such a just-removed member
      table in the query at all; but there seems no way to accomplish that
      without adding expensive catalog rechecks or creating a likelihood of
      deadlocks.  Instead, let's just drop the check on attinhcount.  In this
      way, a query that's included a just-disinherited child will still
      succeed, which is not a completely unreasonable behavior.
      
      This problem has existed for a long time, so back-patch to all supported
      branches.  Also add an isolation test verifying related behaviors.
      
      Patch by me; the new isolation test is based on Kyotaro Horiguchi's work.
      
      Discussion: https://postgr.es/m/20170626.174612.23936762.horiguchi.kyotaro@lab.ntt.co.jp
      680d5405
    • Tom Lane's avatar
      Fix incorrect handling of subquery pullup in the presence of grouping sets. · 90947674
      Tom Lane authored
      If we flatten a subquery whose target list contains constants or
      expressions, when those output columns are used in GROUPING SET columns,
      the planner was capable of doing the wrong thing by merging a pulled-up
      expression into the surrounding expression during const-simplification.
      Then the late processing that attempts to match subexpressions to grouping
      sets would fail to match those subexpressions to grouping sets, with the
      effect that they'd not go to null when expected.
      
      To fix, wrap such subquery outputs in PlaceHolderVars, ensuring that
      they preserve their separate identity throughout the planner's expression
      processing.  This is a bit of a band-aid, because the wrapper defeats
      const-simplification even in places where it would be safe to allow.
      But a nicer fix would likely be too invasive to back-patch, and the
      consequences of the missed optimizations probably aren't large in most
      cases.
      
      Back-patch to 9.5 where grouping sets were introduced.
      
      Heikki Linnakangas, with small mods and better test cases by me;
      additional review by Andrew Gierth
      
      Discussion: https://postgr.es/m/7dbdcf5c-b5a6-ef89-4958-da212fe10176@iki.fi
      90947674
    • Michael Meskes's avatar
      Fix parsing of compatibility mode argument. · ca4587f3
      Michael Meskes authored
      Patch by Ashutosh Sharma <ashu.coek88@gmail.com>
      ca4587f3
    • Alvaro Herrera's avatar
      Remove hard-coded schema knowledge about pg_attribute from genbki.pl · 49c784ec
      Alvaro Herrera authored
      Add the ability to label a column's default value in the catalog header,
      and implement this for pg_attribute.  A new function in Catalog.pm is
      used to fill in a tuple with defaults.  The build process will complain
      loudly if a catalog entry is incomplete,
      
      Commit 8137f2c3 labeled variable length columns for the C preprocessor.
      Expose that label to genbki.pl so we can exclude those columns from schema
      macros in a general fashion. Also, format schema macro entries according
      to their types.
      
      This means slightly less code maintenance, but more importantly it's a
      proving ground for mechanisms intended to be used in later commits.
      
      While at it, I (Álvaro) couldn't resist making some changes in
      genbki.pl: rename some functions to actually indicate their purpose
      instead of actively misleading onlookers; and don't iterate on the whole
      of pg_type to find the entry for each catalog row, using a hash instead
      of an array.
      
      Author: John Naylor, some changes by Álvaro Herrera
      Discussion: https://postgr.es/m/CAJVSVGVJHwD8sfDfZW9TbCHWKf=C1YDRM-rF=2JenRU_y+VcFg@mail.gmail.com
      49c784ec
    • Bruce Momjian's avatar
      C comment: fix "the the" mentions in C comments · bdb70c12
      Bruce Momjian authored
      Reported-by: Christoph Dreis
      
      Discussion: https://postgr.es/m/007e01d3519e$2734ca10$759e5e30$@freenet.de
      
      Author: Christoph Dreis
      bdb70c12
  5. 11 Jan, 2018 7 commits
  6. 10 Jan, 2018 9 commits
    • Tom Lane's avatar
      Fix sample INSTR() functions in the plpgsql documentation. · 3c1e9fd2
      Tom Lane authored
      These functions are stated to be Oracle-compatible, but they weren't.
      Yugo Nagata noticed that while our code returns zero for a zero or
      negative fourth parameter (occur_index), Oracle throws an error.
      Further testing by me showed that there was also a discrepancy in the
      interpretation of a negative third parameter (beg_index): Oracle thinks
      that a negative beg_index indicates the last place where the target
      substring can *begin*, whereas our code thinks it is the last place
      where the target can *end*.
      
      Adjust the sample code to behave like Oracle in both these respects.
      Also change it to be a CDATA[] section, simplifying copying-and-pasting
      out of the documentation source file.  And fix minor problems in the
      introductory comment, which wasn't very complete or accurate.
      
      Back-patch to all supported branches.  Although this patch only touches
      documentation, we should probably call it out as a bug fix in the next
      minor release notes, since users who have adopted the functions will
      likely want to update their versions.
      
      Yugo Nagata and Tom Lane
      
      Discussion: https://postgr.es/m/20171229191705.c0b43a8c.nagata@sraoss.co.jp
      3c1e9fd2
    • Peter Eisentraut's avatar
      Use portal pinning in PL/Perl and PL/Python · 70d6226e
      Peter Eisentraut authored
      PL/pgSQL "pins" internally generated portals so that user code cannot
      close them by guessing their names.  Add this functionality to PL/Perl
      and PL/Python as well, preventing users from manually closing cursors
      created by spi_query and plpy.cursor, respectively.  (PL/Tcl does not
      currently offer any cursor functionality.)
      70d6226e
    • Peter Eisentraut's avatar
      Add tests for PL/pgSQL returning unnamed portals as refcursor · 51158541
      Peter Eisentraut authored
      Existing tests only covered returning explicitly named portals as
      refcursor.  The unnamed cursor case was recently broken without a test
      failing.
      51158541
    • Peter Eisentraut's avatar
      Revert "Move portal pinning from PL/pgSQL to SPI" · b48b2f87
      Peter Eisentraut authored
      This reverts commit b3617cdf.
      
      This broke returning unnamed cursors from PL/pgSQL functions.
      Apparently, there are no test cases for this.
      b48b2f87
    • Tom Lane's avatar
      Remove dubious micro-optimization in ckpt_buforder_comparator(). · 3afd75ea
      Tom Lane authored
      It seems incorrect to assume that the list of CkptSortItems can never
      contain duplicate page numbers: concurrent activity could result in some
      page getting dropped from a low-numbered buffer and later loaded into a
      high-numbered buffer while BufferSync is scanning the buffer pool.
      If that happened, the comparator would give self-inconsistent results,
      potentially confusing qsort().  Saving one comparison step is not worth
      possibly getting the sort wrong.
      
      So far as I can tell, nothing would actually go wrong given our current
      implementation of qsort().  It might get a bit slower than expected
      if there were a large number of duplicates of one value, but that's
      surely a probability-epsilon case.  Still, the comment is wrong,
      and if we ever switched to another sort implementation it might be
      less forgiving.
      
      In passing, avoid casting away const-ness of the argument pointers;
      I've not seen any compiler complaints from that, but it seems likely
      that some compilers would not like it.
      
      Back-patch to 9.6 where this code came in, just in case I've underestimated
      the possible consequences.
      
      Discussion: https://postgr.es/m/18437.1515607610@sss.pgh.pa.us
      3afd75ea
    • Robert Haas's avatar
      Add missing "return" statement to accumulate_append_subpath. · 2fd58096
      Robert Haas authored
      Without this, Parallel Append can end up with extra children.
      
      Report by Rajkumar Raghuwanshi.  Fix by Amit Khandekar.  Brown
      paper bag bug by me.
      
      Discussion: http://postgr.es/m/CAKcux6mBF-NiddyEe9LwymoUC5+wh8bQJ=uk2gGkOE+L8cv=LA@mail.gmail.com
      2fd58096
    • Peter Eisentraut's avatar
      Move portal pinning from PL/pgSQL to SPI · b3617cdf
      Peter Eisentraut authored
      PL/pgSQL "pins" internally generated (unnamed) portals so that user code
      cannot close them by guessing their names.  This logic is also useful in
      other languages and really for any code.  So move that logic into SPI.
      An unnamed portal obtained through SPI_cursor_open() and related
      functions is now automatically pinned, and SPI_cursor_close()
      automatically unpins a portal that is pinned.
      
      In the core distribution, this affects PL/Perl and PL/Python, preventing
      users from manually closing cursors created by spi_query and
      plpy.cursor, respectively.  (PL/Tcl does not currently offer any cursor
      functionality.)
      Reviewed-by: default avatarAndrew Dunstan <andrew.dunstan@2ndquadrant.com>
      b3617cdf
    • Peter Eisentraut's avatar
      Give more accurate error message for dropping pinned portal · acc67ffd
      Peter Eisentraut authored
      The previous code gave the same error message for attempting to drop
      pinned and active portals, but those are separate states, so give
      separate error messages.
      acc67ffd
    • Teodor Sigaev's avatar
      Fix allowing of leading zero on exponents in pgbench test results · d16c2de6
      Teodor Sigaev authored
      Commit bc7fa0c1 accidentally lost fixes of
      0aa1d489 commit.
      
      Thanks to Thomas Munro
      d16c2de6
  7. 09 Jan, 2018 14 commits
    • Bruce Momjian's avatar
      Remove outdated/removed Win32 URLs in C comments · fccaea45
      Bruce Momjian authored
      Reported-by: Ashutosh Sharma
      fccaea45
    • Andres Freund's avatar
      Expression evaluation based aggregate transition invocation. · 69c3936a
      Andres Freund authored
      Previously aggregate transition and combination functions were invoked
      by special case code in nodeAgg.c, evaluating input and filters
      separately using the expression evaluation machinery. That turns out
      to not be great for performance for several reasons:
      
      - repeated expression evaluations have some cost
      - the transition functions invocations are poorly predicted, as
        commonly there are multiple aggregates in a query, resulting in the
        same call-stack invoking different functions.
      - filter and input computation had to be done separately
      - the special case code made it hard to implement JITing of the whole
        transition function invocation
      
      Address this by building one large expression that computes input,
      evaluates filters, and invokes transition functions.
      
      This leads to moderate speedups in queries bottlenecked by aggregate
      computations, and enables large speedups for similar cases once JITing
      is done.
      
      There's potential for further improvement:
      - It'd be nice if we could simplify the somewhat expensive
        aggstate->all_pergroups lookups.
      - right now there's still an advance_transition_function invocation in
        nodeAgg.c, leading to some code duplication.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
      69c3936a
    • Alvaro Herrera's avatar
      Change some bogus PageGetLSN calls to BufferGetLSNAtomic · 272c2ab9
      Alvaro Herrera authored
      As src/backend/access/transam/README says, PageGetLSN may only be called
      by processes holding either exclusive lock on buffer, or a shared lock
      on buffer plus buffer header lock.  Therefore any place that only holds
      a shared buffer lock must use BufferGetLSNAtomic instead of PageGetLSN,
      which internally obtains buffer header lock prior to reading the LSN.
      
      A few callsites failed to comply with this rule.  This was detected by
      running all tests under a new (not committed) assertion that verifies
      PageGetLSN locking contract.  All but one of the callsites that failed
      the assertion are fixed by this patch.  Remaining callsites were
      inspected manually and determined not to need any change.
      
      The exception (unfixed callsite) is in TestForOldSnapshot, which only
      has a Page argument, making it impossible to access the corresponding
      Buffer from it.  Fixing that seems a much larger patch that will have to
      be done separately; and that's just as well, since it was only
      introduced in 9.6 and other bugs are much older.
      
      Some of these bugs are ancient; backpatch all the way back to 9.3.
      
      Authors: Jacob Champion, Asim Praveen, Ashwin Agrawal
      Reviewed-by: Michaël Paquier
      Discussion: https://postgr.es/m/CABAq_6GXgQDVu3u12mK9O5Xt5abBZWQ0V40LZCE+oUf95XyNFg@mail.gmail.com
      272c2ab9
    • Andrew Dunstan's avatar
      Implement TZH and TZM timestamp format patterns · 11b623dd
      Andrew Dunstan authored
      These are compatible with Oracle and required for the datetime template
      language for jsonpath in an upcoming patch.
      
      Nikita Glukhov and Andrew Dunstan, reviewed by Pavel Stehule.
      11b623dd
    • Peter Eisentraut's avatar
      Remove PortalGetQueryDesc() · a77dd53f
      Peter Eisentraut authored
      After having gotten rid of PortalGetHeapMemory(), there seems little
      reason to keep one Portal access macro around that offers no actual
      abstraction and isn't consistently used anyway.
      Reviewed-by: default avatarAndrew Dunstan <andrew.dunstan@2ndquadrant.com>
      Reviewed-by: default avatarAlvaro Herrera <alvherre@alvh.no-ip.org>
      a77dd53f
    • Peter Eisentraut's avatar
      Update portal-related memory context names and API · 0f7c49e8
      Peter Eisentraut authored
      Rename PortalMemory to TopPortalContext, to avoid confusion with
      PortalContext and align naming with similar top-level memory contexts.
      
      Rename PortalData's "heap" field to portalContext.  The "heap" naming
      seems quite antiquated and confusing.  Also get rid of the
      PortalGetHeapMemory() macro and access the field directly, which we do
      for other portal fields, so this abstraction doesn't buy anything.
      Reviewed-by: default avatarAndrew Dunstan <andrew.dunstan@2ndquadrant.com>
      Reviewed-by: default avatarAlvaro Herrera <alvherre@alvh.no-ip.org>
      0f7c49e8
    • Tom Lane's avatar
      Rewrite list_qsort() to avoid trashing its input list. · 3cb1b2a8
      Tom Lane authored
      The initial implementation of list_qsort(), from commit ab727167,
      re-used the ListCells of the input list while not touching the List
      header.  This meant that anybody who still had a pointer to the
      original header would now be in possession of a corrupted list,
      a problem that seems sure to bite us eventually.
      
      One possible solution is to re-use the original List header as well,
      giving the function the semantics of update-in-place.  However, that
      doesn't seem like a very good idea either given the way that the
      function is used in the planner: create_path functions aren't normally
      supposed to modify their input lists.  It doesn't look like there would
      be a problem today, but it's not hard to foresee a time when modifying
      a list of Paths in-place could have side-effects on some other append
      path.
      
      On the whole, and in view of the likelihood that this function might
      be used in other contexts in the future, it seems best to get rid of
      the micro-optimization of re-using the input list cells.  Just build
      a new list.
      
      Discussion: https://postgr.es/m/16912.1515449066@sss.pgh.pa.us
      3cb1b2a8
    • Tom Lane's avatar
      Improve the heuristic for ordering child paths of a parallel append. · 624e440a
      Tom Lane authored
      Commit ab727167 introduced code that attempts to order the child
      scans of a Parallel Append node in a way that will minimize execution
      time, based on total cost and startup cost.  However, it failed to
      think hard about what to do when estimated costs are exactly equal;
      a case that's particularly likely to occur when comparing on startup
      cost.  In such a case the ordering of the child paths would be left
      to the whims of qsort, an algorithm that isn't even stable.
      
      We can improve matters by applying the rule used elsewhere in the
      planner: if total costs are equal, sort on startup cost, and
      vice versa.  When both cost estimates are exactly equal, rather
      than letting qsort do something unpredictable, sort based on the
      child paths' relids, which should typically result in sorting in
      inheritance order.  (The latter provision requires inventing a
      qsort-style comparator for bitmapsets, but maybe we'll have use
      for that for other reasons in future.)
      
      This results in a few plan changes in the select_parallel test,
      but those all look more reasonable than before, when the actual
      underlying cost numbers are taken into account.
      
      Discussion: https://postgr.es/m/4944.1515446989@sss.pgh.pa.us
      624e440a
    • Tom Lane's avatar
      While waiting for a condition variable, detect postmaster death. · 80259d4d
      Tom Lane authored
      The general assumption for postmaster child processes is that they
      should just exit(1), reasonably promptly, if the postmaster disappears.
      condition_variable.c neglected this consideration and could be left
      waiting forever, if the counterpart process it is waiting for has
      done the right thing and exited.
      
      We had some discussion of adjusting the WaitEventSet API to make it
      harder to make this type of mistake in future; but for the moment,
      and for v10, let's make this narrow fix.
      
      Discussion: https://postgr.es/m/20412.1515456143@sss.pgh.pa.us
      80259d4d
    • Peter Eisentraut's avatar
      Fix ssl tests for when tls-server-end-point is not supported · c3d41ccf
      Peter Eisentraut authored
      Add a function to TestLib that allows us to check pg_config.h and then
      decide the expected test outcome based on that.
      
      Author: Michael Paquier <michael.paquier@gmail.com>
      c3d41ccf
    • Tom Lane's avatar
      Fix race condition during replication origin drop. · 8a906204
      Tom Lane authored
      replorigin_drop() misunderstood the API for condition variables: it
      had ConditionVariablePrepareToSleep and ConditionVariableCancelSleep
      inside its test-and-sleep loop, rather than outside the loop as
      intended.  The net effect is a narrow race-condition window wherein,
      if the process using a replication slot releases it immediately after
      replorigin_drop() releases the ReplicationOriginLock, replorigin_drop()
      would get into the condition variable's wait list too late and then
      wait indefinitely for a signal that won't come.
      
      Because there's a different CV for each replication slot, we can't
      just move the ConditionVariablePrepareToSleep call to above the
      test-and-sleep loop.  What we can do, in the wake of commit 13db3b93,
      is drop the ConditionVariablePrepareToSleep call entirely.  This fix
      depends on that commit because (at least in principle) the slot matching
      the target replication origin might move around, so that once in a blue
      moon successive loop iterations might involve different CVs.  We can now
      cope with such a scenario, at the cost of an extra trip through the
      retry loop.
      
      (There are ways we could fix this bug without depending on that commit,
      but they're all a lot more complicated than this way.)
      
      While at it, upgrade the rather skimpy comments in this function.
      
      Back-patch to v10 where this code came in.
      
      Discussion: https://postgr.es/m/19947.1515455433@sss.pgh.pa.us
      8a906204
    • Tom Lane's avatar
      Allow ConditionVariable[PrepareTo]Sleep to auto-switch between CVs. · 13db3b93
      Tom Lane authored
      The original coding here insisted that callers manually cancel any prepared
      sleep for one condition variable before starting a sleep on another one.
      While that's not a huge burden today, it seems like a gotcha that will bite
      us in future if the use of condition variables increases; anything we can
      do to make the use of this API simpler and more robust is attractive.
      Hence, allow these functions to automatically switch their attention to
      a different CV when required.  This is safe for the same reason it was OK
      for commit aced5a92 to let a broadcast operation cancel any prepared CV
      sleep: whenever we return to the other test-and-sleep loop, we will
      automatically re-prepare that CV, paying at most an extra test of that
      loop's exit condition.
      
      Back-patch to v10 where condition variables were introduced.  Ordinarily
      we would probably not back-patch a change like this, but since it does not
      invalidate any coding pattern that was legal before, it seems safe enough.
      Furthermore, there's an open bug in replorigin_drop() for which the
      simplest fix requires this.  Even if we chose to fix that in some more
      complicated way, the hazard would remain that we might back-patch some
      other bug fix that requires this behavior.
      
      Patch by me, reviewed by Thomas Munro.
      
      Discussion: https://postgr.es/m/2437.1515368316@sss.pgh.pa.us
      13db3b93
    • Robert Haas's avatar
      Don't allow VACUUM VERBOSE ANALYZE VERBOSE. · 921059bd
      Robert Haas authored
      There are plans to extend the syntax for ANALYZE, so we need to break
      the link between VacuumStmt and AnalyzeStmt.  But apart from that, the
      syntax above is undocumented and, if discovered by users, might give
      the impression that the VERBOSE option for VACUUM differs from the
      verbose option from ANALYZE, which it does not.
      
      Nathan Bossart, reviewed by Michael Paquier and Masahiko Sawada
      
      Discussion: http://postgr.es/m/D3FC73E2-9B1A-4DB4-8180-55F57D116B4E@amazon.com
      921059bd
    • Teodor Sigaev's avatar
      Improve scripting language in pgbench · bc7fa0c1
      Teodor Sigaev authored
      Added:
       - variable now might contain integer, double, boolean and null values
       - functions ln, exp
       - logical AND/OR/NOT
       - bitwise AND/OR/NOT/XOR
       - bit right/left shift
       - comparison operators
       - IS [NOT] (NULL|TRUE|FALSE)
       - conditional choice (in form of when/case/then)
      
      New operations and functions allow to implement more complicated test scenario.
      
      Author: Fabien Coelho with minor editorization by me
      Reviewed-By: Pavel Stehule, Jeevan Ladhe, me
      Discussion: https://www.postgresql.org/message-id/flat/alpine.DEB.2.10.1604030742390.31618@sto
      bc7fa0c1