1. 19 May, 2019 5 commits
  2. 18 May, 2019 5 commits
  3. 17 May, 2019 3 commits
    • Tom Lane's avatar
      Restructure creation of run-time pruning steps. · 6630ccad
      Tom Lane authored
      Previously, gen_partprune_steps() always built executor pruning steps
      using all suitable clauses, including those containing PARAM_EXEC
      Params.  This meant that the pruning steps were only completely safe
      for executor run-time (scan start) pruning.  To prune at executor
      startup, we had to ignore the steps involving exec Params.  But this
      doesn't really work in general, since there may be logic changes
      needed as well --- for example, pruning according to the last operator's
      btree strategy is the wrong thing if we're not applying that operator.
      The rules embodied in gen_partprune_steps() and its minions are
      sufficiently complicated that tracking their incremental effects in
      other logic seems quite impractical.
      
      Short of a complete redesign, the only safe fix seems to be to run
      gen_partprune_steps() twice, once to create executor startup pruning
      steps and then again for run-time pruning steps.  We can save a few
      cycles however by noting during the first scan whether we rejected
      any clauses because they involved exec Params --- if not, we don't
      need to do the second scan.
      
      In support of this, refactor the internal APIs in partprune.c to make
      more use of passing information in the GeneratePruningStepsContext
      struct, rather than as separate arguments.
      
      This is, I hope, the last piece of our response to a bug report from
      Alan Jackson.  Back-patch to v11 where this code came in.
      
      Discussion: https://postgr.es/m/FAD28A83-AC73-489E-A058-2681FA31D648@tvsquared.com
      6630ccad
    • Bruce Momjian's avatar
    • Michael Paquier's avatar
      Fix regression test outputs · 6ba500ca
      Michael Paquier authored
      75445c15 has caused various failures in tests across the tree after
      updating some error messages, so fix the newly-expected output.
      
      Author: Michael Paquier
      Reviewed-by: Tom Lane
      Discussion: https://postgr.es/m/8332.1558048838@sss.pgh.pa.us
      6ba500ca
  4. 16 May, 2019 5 commits
    • Michael Paquier's avatar
      41998f90
    • Alvaro Herrera's avatar
    • Peter Geoghegan's avatar
      Remove extra nbtree half-dead internal page check. · 3f58cc6d
      Peter Geoghegan authored
      It's not safe for nbtree VACUUM to attempt to delete a target page whose
      right sibling is already half-dead, since that would fail the
      cross-check when VACUUM attempts to re-find a downlink to the right
      sibling in the parent page.  Logic to prevent this from happening was
      added by commit 8da31837, which addressed a bug in the overhaul of
      page deletion that went into PostgreSQL 9.4 (commit efada2b8).
      VACUUM was made to check the right sibling page, and back off when it
      happened to be half-dead already.
      
      However, it is only truly necessary to do the right sibling check on the
      leaf level, since that transitively determines if the deletion target's
      parent's right sibling page is itself undergoing deletion.  Remove the
      internal page level check, and add a comment explaining why the leaf
      level check alone suffices.
      
      The extra check is also unnecessary due to the fact that internal pages
      that are marked half-dead are generally considered corrupt.  Commit
      efada2b8 established the principle that there should never be
      half-dead internal pages (internal pages pending deletion are possible,
      but that status is never directly represented in the internal page).
      VACUUM will complain about corruption when it encounters half-dead
      internal pages, so VACUUM is bound to raise an error one way or another
      when an nbtree index has a half-dead internal page (contrib/amcheck will
      also report that the page is corrupt).
      
      It's possible that a pg_upgrade'd 9.3 database will still have half-dead
      internal pages, so it may seem like there is an argument for leaving the
      check in place to reliably get a cleaner error message that advises the
      user to REINDEX.  However, leaf pages are also deleted in the first
      phase of deletion prior to PostgreSQL 9.4, so I believe we won't even
      attempt to re-find the parent page anyway (we won't have the fully
      deleted leaf page as the right sibling of our target page, so we won't
      even try to find a downlink for it).
      
      Discussion: https://postgr.es/m/CAH2-Wzm_ntmqJjWLRyKzimFmFvk+BnVAvUpaA4s1h9Ja58woaQ@mail.gmail.com
      3f58cc6d
    • Tom Lane's avatar
      Fix bogus logic for combining range-partitioned columns during pruning. · 3922f106
      Tom Lane authored
      gen_prune_steps_from_opexps's notion of how to do this was overly
      complicated and underly correct.
      
      Per discussion of a report from Alan Jackson (though this fixes only one
      aspect of that problem).  Back-patch to v11 where this code came in.
      
      Amit Langote
      
      Discussion: https://postgr.es/m/FAD28A83-AC73-489E-A058-2681FA31D648@tvsquared.com
      3922f106
    • Tom Lane's avatar
      Fix partition pruning to treat stable comparison operators properly. · 4b1fcb43
      Tom Lane authored
      Cross-type comparison operators in a btree or hash opclass might be
      only stable not immutable (this is true of timestamp vs. timestamptz
      for example).  partprune.c ignored this possibility and would perform
      plan-time pruning with them anyway, possibly leading to wrong answers
      if the environment changed between planning and execution.
      
      To fix, teach gen_partprune_steps() to do things differently when
      creating plan-time pruning steps vs. run-time pruning steps.
      analyze_partkey_exprs() also needs an extra check, which is rather
      annoying but now is not the time to restructure things enough to
      avoid that.
      
      While at it, simplify the logic for the plan-time case a little
      by insisting that the comparison value be a Const and nothing else.
      This relies on the assumption that eval_const_expressions will have
      reduced any immutable expression to a Const; which is not quite
      100% true, but certainly any case that comes up often enough to be
      interesting should have simplification logic there.
      
      Also improve a bunch of inadequate/obsolete/wrong comments.
      
      Per discussion of a report from Alan Jackson (though this fixes only one
      aspect of that problem).  Back-patch to v11 where this code came in.
      
      David Rowley, with some further hacking by me
      
      Discussion: https://postgr.es/m/FAD28A83-AC73-489E-A058-2681FA31D648@tvsquared.com
      4b1fcb43
  5. 15 May, 2019 4 commits
    • Peter Geoghegan's avatar
      Remove obsolete nbtree insertion comment. · 489e431b
      Peter Geoghegan authored
      Remove a Berkeley-era comment above _bt_insertonpg() that admonishes the
      reader to grok Lehman and Yao's paper before making any changes.  This
      made a certain amount of sense back when _bt_insertonpg() was
      responsible for most of the things that are now spread across
      _bt_insertonpg(), _bt_findinsertloc(), _bt_insert_parent(), and
      _bt_split(), but it doesn't work like that anymore.
      
      I believe that this comment alludes to the need to "couple" or "crab"
      buffer locks as we ascend the tree as page splits cascade upwards.  The
      nbtree README already explains this in detail, which seems sufficient.
      Besides, the changes to page splits made by commit 40dae7ec altered
      the exact details of how buffer locks are retained during splits; Lehman
      and Yao's original algorithm seems to release the lock on the left child
      page/buffer slightly earlier than _bt_insertonpg()/_bt_insert_parent()
      can.
      489e431b
    • Tom Lane's avatar
      Remove no-longer-used typedef. · 8a0f0ad5
      Tom Lane authored
      struct ClonedConstraint is no longer needed, so delete it.
      
      Discussion: https://postgr.es/m/18102.1557947143@sss.pgh.pa.us
      8a0f0ad5
    • Peter Geoghegan's avatar
      Reverse order of newitem nbtree candidate splits. · 7505da2f
      Peter Geoghegan authored
      Commit fab25024, which taught nbtree to choose candidate split points
      more carefully, had _bt_findsplitloc() record all possible split points
      in an initial pass over a page that is about to be split.  The order
      that candidate split points were processed and stored in was assumed to
      match the offset number order of split points on an imaginary version of
      the page that contains the same items as the original, but also fits
      newitem (the item that provoked the split precisely because it didn't
      fit).
      
      However, the order of split points in the final array was not quite what
      was expected: the split point that makes newitem the firstright item
      came after the split point that makes newitem the lastleft item -- not
      before.  As a result, _bt_findsplitloc() could get confused about the
      leftmost and rightmost tuples among all possible split points recorded
      for the page.  This seems to have no appreciable impact on the quality
      of the final split point chosen by _bt_findsplitloc(), but it's still
      wrong.
      
      To fix, switch the order in which newitem candidate splits are recorded
      in.  This also makes it possible to describe candidate split points in
      terms of which pair of adjoining tuples enclose the split point within
      _bt_findsplitloc(), making it clearer why it's generally safe for
      _bt_split() to expect lastleft and firstright tuples.
      7505da2f
    • Bruce Momjian's avatar
      docs: properly indent PG 12 release notes · a429164e
      Bruce Momjian authored
      a429164e
  6. 14 May, 2019 18 commits
    • Andres Freund's avatar
      Handle table_complete_speculative's succeeded argument as documented. · aa4b8c61
      Andres Freund authored
      For some reason both callsite and the implementation for heapam had
      the meaning inverted (i.e. succeeded == true was passed in case of
      conflict). That's confusing.
      
      I (Andres) briefly pondered whether it'd be better to rename
      table_complete_speculative's argument to 'bool specConflict' or such,
      but decided not to. The 'complete' in the function name for me makes
      `succeeded` sound a bit better.
      
      Reported-By: Ashwin Agrawal, Melanie Plageman, Heikki Linnakangas
      Discussion:
         https://postgr.es/m/CALfoeitk7-TACwYv3hCw45FNPjkA86RfXg4iQ5kAOPhR+F1Y4w@mail.gmail.com
         https://postgr.es/m/97673451-339f-b21e-a781-998d06b1067c@iki.fi
      aa4b8c61
    • Andres Freund's avatar
      Add isolation test for INSERT ON CONFLICT speculative insertion failure. · 08e2edc0
      Andres Freund authored
      This path previously was not reliably covered. There was some
      heuristic coverage via insert-conflict-toast.spec, but that test is
      not deterministic, and only tested for a somewhat specific bug.
      
      Backpatch, as this is a complicated and otherwise untested code
      path. Unfortunately 9.5 cannot handle two waiting sessions, and thus
      cannot execute this test.
      
      Triggered by a conversion with Melanie Plageman.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/CAAKRu_a7hbyrk=wveHYhr4LbcRnRCG=yPUVoQYB9YO1CdUBE9Q@mail.gmail.com
      Backpatch: 9.5-
      08e2edc0
    • Tom Lane's avatar
      Fix "make clean" to clean out junk files left behind after ssl tests. · 6d2fba31
      Tom Lane authored
      We .gitignore'd this junk, but we didn't actually remove it.
      6d2fba31
    • Tom Lane's avatar
      Move logging.h and logging.c from src/fe_utils/ to src/common/. · fc9a62af
      Tom Lane authored
      The original placement of this module in src/fe_utils/ is ill-considered,
      because several src/common/ modules have dependencies on it, meaning that
      libpgcommon and libpgfeutils now have mutual dependencies.  That makes it
      pointless to have distinct libraries at all.  The intended design is that
      libpgcommon is lower-level than libpgfeutils, so only dependencies from
      the latter to the former are acceptable.
      
      We already have the precedent that fe_memutils and a couple of other
      modules in src/common/ are frontend-only, so it's not stretching anything
      out of whack to treat logging.c as a frontend-only module in src/common/.
      To the extent that such modules help provide a common frontend/backend
      environment for the rest of common/ to use, it's a reasonable design.
      (logging.c does not yet provide an ereport() emulation, but one can
      dream.)
      
      Hence, move these files over, and revert basically all of the build-system
      changes made by commit cc8d4151.  There are no places that need to grow
      new dependencies on libpgcommon, further reinforcing the idea that this
      is the right solution.
      
      Discussion: https://postgr.es/m/a912ffff-f6e4-778a-c86a-cf5c47a12933@2ndquadrant.com
      fc9a62af
    • Bruce Momjian's avatar
      b71dad22
    • Tom Lane's avatar
      Remove pg_rewind's private logging.h/logging.c files. · 53ddefba
      Tom Lane authored
      The existence of these files became rather confusing with the
      introduction of a widely-known logging.h header in commit cc8d4151.
      (Indeed, there's already some duplicative #includes here, perhaps
      betraying such confusion.)  The only thing left in them, after that
      commit, is a progress-reporting function that's neither general-purpose
      nor tied in any way to other logging infrastructure.  Hence, let's just
      move that function to pg_rewind.c, and get rid of the separate files.
      
      Discussion: https://postgr.es/m/3971.1557787914@sss.pgh.pa.us
      53ddefba
    • Tom Lane's avatar
      Fix SQL-style substring() to have spec-compliant greediness behavior. · 7c850320
      Tom Lane authored
      SQL's regular-expression substring() function is defined to have a
      pattern argument that's separated into three subpatterns by escape-
      double-quote markers; the function result is the part of the input
      matching the second subpattern.  The standard makes it clear that
      if there is ambiguity about how to match the input to the subpatterns,
      the first and third subpatterns should be taken to match the smallest
      possible amount of text (i.e., they're "non greedy", in the terms of
      our regex code).  We were not doing it that way: the first subpattern
      would eat the largest possible amount of text, causing the function
      result to be shorter than what the spec requires.
      
      Fix that by attaching explicit greediness quantifiers to the
      subpatterns.  (This depends on the regex fix in commit 8a29ed05;
      before that, this didn't reliably change the regex engine's behavior.)
      
      Also, by adding parentheses around each subpattern, we ensure that
      "|" (OR) in the subpatterns behave sanely.  Previously, "|" in the
      first or third subpatterns didn't work.
      
      This patch also makes the function throw error if you write more than
      two escape-double-quote markers, and do something sane if you write
      just one, and document that behavior.  Previously, an odd number of
      markers led to a confusing complaint about unbalanced parentheses,
      while extra pairs of markers were just ignored.  (Note that the spec
      requires exactly two markers, but we've historically allowed there
      to be none, and this patch preserves the old behavior for that case.)
      
      In passing, adjust some substring() test cases that didn't really
      prove what they said they were testing for: they used patterns
      that didn't match the data string, so that the output would be
      NULL whether or not the function was really strict.
      
      Although this is certainly a bug fix, changing the behavior in back
      branches seems undesirable: applications could perhaps be depending on
      the old behavior, since it's not obviously wrong unless you read the
      spec very closely.  Hence, no back-patch.
      
      Discussion: https://postgr.es/m/5bb27a41-350d-37bf-901e-9d26f5592dd0@charter.net
      7c850320
    • Tom Lane's avatar
      In bootstrap mode, use default signal handling for SIGINT etc. · fb489e4b
      Tom Lane authored
      Previously, the code pointed the standard process-termination signals
      to postgres.c's die().  That would typically result in an attempt to
      execute a transaction abort, which is not possible in bootstrap mode,
      leading to PANIC.  This choice seems to be a leftover from an old code
      structure in which the same signal-assignment code was used for many
      sorts of auxiliary processes, including interactive standalone
      backends.  It's not very sensible for bootstrap mode, which has no
      interest in either interactivity or continuing after an error.  We can
      get better behavior with less effort by just letting normal process
      termination happen, after which the parent initdb process will clean up.
      
      This is basically cosmetic in any case, since initdb will react the
      same way whether bootstrap dies on a signal or abort().  Given the
      lack of previous complaints, I don't feel a need to back-patch,
      even though the behavior is old.
      
      Discussion: https://postgr.es/m/3850b11a.5121.16aaf827e4a.Coremail.thunder1@126.com
      fb489e4b
    • Peter Eisentraut's avatar
    • Peter Eisentraut's avatar
      Update information_schema for SQL:2016 · eb3a1376
      Peter Eisentraut authored
      This is mainly a light renumbering to match the sections in the
      standard.
      eb3a1376
    • Peter Eisentraut's avatar
      Update SQL keywords list to SQL:2016 · c29ba981
      Peter Eisentraut authored
      Per previous convention (see
      ace397e9), drop SQL:2008 and only keep
      the latest two standards and SQL-92.
      
      Note: SQL:2016-2 lists a large number of non-reserved keywords that
      are really just information_schema column names related to new
      features.  Those kinds of thing have not previously been listed as
      keywords, and this was apparently done here by mistake, since these
      keywords have been removed again in post-2016 working drafts.  So in
      order to avoid bloating the keywords table unnecessarily, I have
      omitted these erroneous keywords here.
      c29ba981
    • Bruce Momjian's avatar
    • Bruce Momjian's avatar
    • Heikki Linnakangas's avatar
      Detect internal GiST page splits correctly during index build. · 22251686
      Heikki Linnakangas authored
      As we descend the GiST tree during insertion, we modify any downlinks on
      the way down to include the new tuple we're about to insert (if they don't
      cover it already). Modifying an existing downlink might cause an internal
      page to split, if the new downlink tuple is larger than the old one. If
      that happens, we need to back up to the parent and re-choose a page to
      insert to. We used to detect that situation, thanks to the NSN-LSN
      interlock normally used to detect concurrent page splits, but that got
      broken by commit 9155580f. With that commit, we now use a dummy constant
      LSN value for every page during index build, so the LSN-NSN interlock no
      longer works. I thought that was OK because there can't be any other
      backends modifying the index during index build, but missed that the
      insertion itself can modify the page we're inserting to. The consequence
      was that we would sometimes insert the new tuple to an incorrect page, one
      whose downlink doesn't cover the new tuple.
      
      To fix, add a flag to the stack that keeps track of the state while
      descending tree, to indicate that a page was split, and that we need to
      retry the descend from the parent.
      
      Thomas Munro first reported that the contrib/intarray regression test was
      failing occasionally on the buildfarm after commit 9155580f. The failure
      was intermittent, because the gistchoose() function is not deterministic,
      and would only occasionally create the right circumstances for this bug to
      cause the failure.
      
      Patch by Anastasia Lubennikova, with some changes by me to make it work
      correctly also when the internal page split also causes the "grandparent"
      to be split.
      
      Discussion: https://www.postgresql.org/message-id/CA%2BhUKGJRzLo7tZExWfSbwM3XuK7aAK7FhdBV0FLkbUG%2BW0v0zg%40mail.gmail.com
      22251686
    • Heikki Linnakangas's avatar
      Fix comment on when HOT update is possible. · e95d550b
      Heikki Linnakangas authored
      The conditions listed in this comment have changed several times, and at
      some point the thing that the "if so" referred to was negated.
      
      The text was OK up to 9.6. It was differently wrong in v10, v11 and
      master, so fix in all those versions.
      e95d550b
    • Etsuro Fujita's avatar
      Fix typo. · 7d9eca59
      Etsuro Fujita authored
      7d9eca59
    • Bruce Momjian's avatar
      doc: Update OID item in PG 12 release notes · 0b62f0f2
      Bruce Momjian authored
      Reported-by: Justin Pryzby
      
      Discussion: https://postgr.es/m/20190513174759.GE23251@telsasoft.com
      0b62f0f2
    • Bruce Momjian's avatar