1. 16 Aug, 2019 4 commits
  2. 15 Aug, 2019 3 commits
    • Tom Lane's avatar
      Fix plpgsql to re-look-up composite type names at need. · fe9b7b2f
      Tom Lane authored
      Commit 4b93f579 rearranged things in plpgsql to make it cope better with
      composite types changing underneath it intra-session.  However, I failed to
      consider the case of a composite type being dropped and recreated entirely.
      In my defense, the previous coding didn't consider that possibility at all
      either --- but it would accidentally work so long as you didn't change the
      type's field list, because the built-at-compile-time list of component
      variables would then still match the type's new definition.  The new
      coding, however, occasionally tries to re-look-up the type by OID, and
      then fails to find the dropped type.
      
      To fix this, we need to save the TypeName struct, and then redo the type
      OID lookup from that.  Of course that's expensive, so we don't want to do
      it every time we need the type OID.  This can be fixed in the same way that
      4b93f579 dealt with changes to composite types' definitions: keep an eye
      on the type's typcache entry to see if its tupledesc has been invalidated.
      (Perhaps, at some point, this mechanism should be generalized so it can
      work for non-composite types too; but for now, plpgsql only tries to
      cope with intra-session redefinitions of composites.)
      
      I'm slightly hesitant to back-patch this into v11, because it changes
      the contents of struct PLpgSQL_type as well as the signature of
      plpgsql_build_datatype(), so in principle it could break code that is
      poking into the innards of plpgsql.  However, the only popular extension
      of that ilk is pldebugger, and it doesn't seem to be affected.  Since
      this is a regression for people who were relying on the old behavior,
      it seems worth taking the small risk of causing compatibility issues.
      
      Per bug #15913 from Daniel Fiori.  Back-patch to v11 where 4b93f579
      came in.
      
      Discussion: https://postgr.es/m/15913-a7e112e16dedcffc@postgresql.org
      fe9b7b2f
    • Tom Lane's avatar
      Use a hash table to de-duplicate NOTIFY events faster. · bb5ae8f6
      Tom Lane authored
      Previously, async.c got rid of duplicate notifications by scanning
      the list of pending events to compare each one to the proposed new
      event.  This works okay for very small numbers of distinct events,
      but degrades as O(N^2) for many events.  We can improve matters by
      using a hash table to probe for duplicates.  So as not to add a
      lot of overhead for the simple cases that the code did handle well
      before, create the hash table only once a (sub)transaction has
      queued more than 16 distinct notify events.
      
      A downside is that we now have to do per-event work to propagate
      a successful subtransaction's notify events up to its parent.
      (But this isn't significant unless the subtransaction had many
      events, in which case the O(N^2) behavior would have been in
      play already, so we still come out ahead.)
      
      We can make some lemonade out of this lemon, though: since we must
      examine each event anyway, it's now possible to de-duplicate events
      fully, rather than skipping that for events merged up from
      subtransactions.  Hence, remove the old weasel wording in notify.sgml
      about whether de-duplication happens or not, and adjust the test
      case in async-notify.spec that exhibited the old behavior.
      
      While at it, rearrange the definition of struct Notification to make
      it more compact and require just one palloc per event, rather than
      two or three.  This saves space when there are a lot of events,
      in fact more than enough to buy back the space needed for the hash
      table.
      
      Patch by me, based on discussions around a different patch
      submitted by Filip Rembiałkowski.
      
      Discussion: https://postgr.es/m/17822.1564186806@sss.pgh.pa.us
      bb5ae8f6
    • Tom Lane's avatar
      Doc: improve documentation about postgresql.auto.conf. · 45aaaa42
      Tom Lane authored
      Clarify what external tools can do to this file, and add a bit
      of detail about what ALTER SYSTEM itself does.
      
      Discussion: https://postgr.es/m/aed6cc9f-98f3-2693-ac81-52bb0052307e@2ndquadrant.com
      45aaaa42
  3. 14 Aug, 2019 5 commits
  4. 13 Aug, 2019 6 commits
  5. 12 Aug, 2019 5 commits
    • Peter Geoghegan's avatar
      amcheck: Skip unlogged relations during recovery. · 6754fe65
      Peter Geoghegan authored
      contrib/amcheck failed to consider the possibility that unlogged
      relations will not have any main relation fork files when running in hot
      standby mode.  This led to low-level "can't happen" errors that complain
      about the absence of a relfilenode file.
      
      To fix, simply skip verification of unlogged index relations during
      recovery.  In passing, add a direct check for the presence of a main
      fork just before verification proper begins, so that we cleanly verify
      the presence of the main relation fork file.
      
      Author: Andrey Borodin, Peter Geoghegan
      Reported-By: Andrey Borodin
      Diagnosed-By: Andrey Borodin
      Discussion: https://postgr.es/m/DA9B33AC-53CB-4643-96D4-7A0BBC037FA1@yandex-team.ru
      Backpatch: 10-, where amcheck was introduced.
      6754fe65
    • Tom Lane's avatar
      Fix planner's test for case-foldable characters in ILIKE with ICU. · 03c811a4
      Tom Lane authored
      As coded, the ICU-collation path in pattern_char_isalpha() failed
      to consider regular ASCII letters to be case-varying.  This led to
      like_fixed_prefix treating too much of an ILIKE pattern as being a
      fixed prefix, so that indexscans derived from an ILIKE clause might
      miss entries that they should find.
      
      Per bug #15892 from James Inform.  This is an oversight in the original
      ICU patch (commit eccfef81), so back-patch to v10 where that came in.
      
      Discussion: https://postgr.es/m/15892-e5d2bea3e8a04a1b@postgresql.org
      03c811a4
    • Tom Lane's avatar
      Remove EState.es_range_table_array. · 3c926587
      Tom Lane authored
      Now that list_nth is O(1), there's no good reason to maintain a
      separate array of RTE pointers rather than indexing into
      estate->es_range_table.  Deleting the array doesn't save all that
      much either; but just on cleanliness grounds, it's better not to
      have duplicate representations of the identical information.
      
      Discussion: https://postgr.es/m/14960.1565384592@sss.pgh.pa.us
      3c926587
    • Tom Lane's avatar
      Rationalize use of list_concat + list_copy combinations. · 5ee190f8
      Tom Lane authored
      In the wake of commit 1cff1b95, the result of list_concat no longer
      shares the ListCells of the second input.  Therefore, we can replace
      "list_concat(x, list_copy(y))" with just "list_concat(x, y)".
      
      To improve call sites that were list_copy'ing the first argument,
      or both arguments, invent "list_concat_copy()" which produces a new
      list sharing no ListCells with either input.  (This is a bit faster
      than "list_concat(list_copy(x), y)" because it makes the result list
      the right size to start with.)
      
      In call sites that were not list_copy'ing the second argument, the new
      semantics mean that we are usually leaking the second List's storage,
      since typically there is no remaining pointer to it.  We considered
      inventing another list_copy variant that would list_free the second
      input, but concluded that for most call sites it isn't worth worrying
      about, given the relative compactness of the new List representation.
      (Note that in cases where such leakage would happen, the old code
      already leaked the second List's header; so we're only discussing
      the size of the leak not whether there is one.  I did adjust two or
      three places that had been troubling to free that header so that
      they manually free the whole second List.)
      
      Patch by me; thanks to David Rowley for review.
      
      Discussion: https://postgr.es/m/11587.1550975080@sss.pgh.pa.us
      5ee190f8
    • Alexander Korotkov's avatar
      Fix string comparison in jsonpath · 251c8e39
      Alexander Korotkov authored
      Take into account pg_server_to_any() may return input string "as is".
      
      Reported-by: Andrew Dunstan, Thomas Munro
      Discussion: https://postgr.es/m/0ed83a33-d900-466a-880a-70ef456c721f%402ndQuadrant.com
      Author: Alexander Korotkov, Thomas Munro
      Backpatch-through: 12
      251c8e39
  6. 11 Aug, 2019 2 commits
    • Tom Lane's avatar
      Partially revert "Insert temporary debugging output in regression tests." · b43f7c11
      Tom Lane authored
      This reverts much of commit f03a9ca4,
      but leaves the relpages/reltuples probe in select_parallel.sql.
      The pg_stat_all_tables probes are unstable enough to be annoying,
      and it no longer seems likely that they will teach us anything more
      about the underlying problem.  I'd still like some more confirmation
      though that the observed plan instability is caused by VACUUM leaving
      relpages/reltuples as zero for one of these tables.
      
      Discussion: https://postgr.es/m/CA+hUKG+0CxrKRWRMf5ymN3gm+BECHna2B-q1w8onKBep4HasUw@mail.gmail.com
      b43f7c11
    • Alexander Korotkov's avatar
      Adjust string comparison in jsonpath · d54ceb9e
      Alexander Korotkov authored
      We have implemented jsonpath string comparison using default database locale.
      However, standard requires us to compare Unicode codepoints.  This commit
      implements that, but for performance reasons we still use per-byte comparison
      for "==" operator.  Thus, for consistency other comparison operators do per-byte
      comparison if Unicode codepoints appear to be equal.
      
      In some edge cases, when same Unicode codepoints have different binary
      representations in database encoding, we diverge standard to achieve better
      performance of "==" operator.  In future to implement strict standard
      conformance, we can do normalization of input JSON strings.
      
      Original patch was written by Nikita Glukhov, rewritten by me.
      
      Reported-by: Markus Winand
      Discussion: https://postgr.es/m/8B7FA3B4-328D-43D7-95A8-37B8891B8C78%40winand.at
      Author: Nikita Glukhov, Alexander Korotkov
      Backpatch-through: 12
      d54ceb9e
  7. 10 Aug, 2019 2 commits
    • Tom Lane's avatar
      Fix "ANALYZE t, t" inside a transaction block. · cabe0f29
      Tom Lane authored
      This failed with either "tuple already updated by self" or "duplicate
      key value violates unique constraint", depending on whether the table
      had previously been analyzed or not.  The reason is that ANALYZE tried
      to insert or update the same pg_statistic rows twice, and there was no
      CommandCounterIncrement between.  So add one.  The same case works fine
      outside a transaction block, because then there's a whole transaction
      boundary between, as a consequence of the way VACUUM works.
      
      This issue has been latent all along, but the problem was unreachable
      before commit 11d8d72c added the ability to specify multiple tables
      in ANALYZE.  We could, perhaps, alternatively fix it by adding code to
      de-duplicate the list of VacuumRelations --- but that would add a
      lot of overhead to work around dumb commands, so it's not attractive.
      
      Per bug #15946 from Yaroslav Schekin.  Back-patch to v11.
      
      (Note: in v11 I also back-patched the test added by commit 23224563;
      otherwise the problem doesn't manifest in the test I added, because
      "vactst" is empty when the tests for multiple ANALYZE targets are
      reached.  That seems like not a very good thing anyway, so I did this
      rather than rethinking the choice of test case.)
      
      Discussion: https://postgr.es/m/15946-5c7570a2884a26cf@postgresql.org
      cabe0f29
    • Peter Geoghegan's avatar
      Rename tuplesort.c's SortTuple.tupindex field. · d8cd68c8
      Peter Geoghegan authored
      Rename the "tupindex" field from tuplesort.c's SortTuple struct to
      "srctape", since it can only ever be used to store a source/input tape
      number when merging external sort runs.  This has been the case since
      commit 8b304b8b, which removed replacement selection sort from
      tuplesort.c.
      d8cd68c8
  8. 09 Aug, 2019 3 commits
  9. 08 Aug, 2019 4 commits
  10. 07 Aug, 2019 6 commits