1. 14 May, 2019 18 commits
    • 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
    • Bruce Momjian's avatar
      5d971565
    • Michael Paquier's avatar
      7e19929e
  2. 13 May, 2019 12 commits
  3. 12 May, 2019 3 commits
    • Tom Lane's avatar
      Fix misoptimization of "{1,1}" quantifiers in regular expressions. · 8a29ed05
      Tom Lane authored
      A bounded quantifier with m = n = 1 might be thought a no-op.  But
      according to our documentation (which traces back to Henry Spencer's
      original man page) it still imposes greediness, or non-greediness in the
      case of the non-greedy variant "{1,1}?", on whatever it's attached to.
      
      This turns out not to work though, because parseqatom() optimizes away
      the m = n = 1 case without regard for whether it's supposed to change
      the greediness of the argument RE.
      
      We can fix this by just not applying the optimization when the greediness
      needs to change; the subsequent general cases handle it fine.
      
      The three cases in which we can still apply the optimization are
      (a) no quantifier, or quantifier does not impose a preference;
      (b) atom has no greediness property, implying it cannot match a
      variable amount of text anyway; or
      (c) quantifier's greediness is same as atom's.
      Note that in most cases where one of these applies, we'd have exited
      earlier in the "not a messy case" fast path.  I think it's now only
      possible to get to the optimization when the atom involves capturing
      parentheses or a non-top-level backref.
      
      Back-patch to all supported branches.  I'd ordinarily be hesitant to
      put a subtle behavioral change into back branches, but in this case
      it's very hard to see a reason why somebody would write "{1,1}?" unless
      they're trying to get the documented change-of-greediness behavior.
      
      Discussion: https://postgr.es/m/5bb27a41-350d-37bf-901e-9d26f5592dd0@charter.net
      8a29ed05
    • Noah Misch's avatar
      Fail pgwin32_message_to_UTF16() for SQL_ASCII messages. · d02768dd
      Noah Misch authored
      The function had been interpreting SQL_ASCII messages as UTF8, throwing
      an error when they were invalid UTF8.  The new behavior is consistent
      with pg_do_encoding_conversion().  This affects LOG_DESTINATION_STDERR
      and LOG_DESTINATION_EVENTLOG, which will send untranslated bytes to
      write() and ReportEventA().  On buildfarm member bowerbird, enabling
      log_connections caused an error whenever the role name was not valid
      UTF8.  Back-patch to 9.4 (all supported versions).
      
      Discussion: https://postgr.es/m/20190512015615.GD1124997@rfd.leadboat.com
      d02768dd
    • Tom Lane's avatar
      Rearrange pgstat_bestart() to avoid failures within its critical section. · 85ccb689
      Tom Lane authored
      We long ago decided to design the shared PgBackendStatus data structure to
      minimize the cost of writing status updates, which means that writers just
      have to increment the st_changecount field twice.  That isn't hooked into
      any sort of resource management mechanism, which means that if something
      were to throw error between the two increments, the st_changecount field
      would be left odd indefinitely.  That would cause readers to lock up.
      Now, since it's also a bad idea to leave the field odd for longer than
      absolutely necessary (because readers will spin while we have it set),
      the expectation was that we'd treat these segments like spinlock critical
      sections, with only short, more or less straight-line, code in them.
      
      That was fine as originally designed, but commit 9029f4b3 broke it
      by inserting a significant amount of non-straight-line code into
      pgstat_bestart(), code that is very capable of throwing errors, not to
      mention taking a significant amount of time during which readers will spin.
      We have a report from Neeraj Kumar of readers actually locking up, which
      I suspect was due to an encoding conversion error in X509_NAME_to_cstring,
      though conceivably it was just a garden-variety OOM failure.
      
      Subsequent commits have loaded even more dubious code into pgstat_bestart's
      critical section (and commit fc70a4b0 deserves some kind of booby prize
      for managing to miss the critical section entirely, although the negative
      consequences seem minimal given that the PgBackendStatus entry should be
      seen by readers as inactive at that point).
      
      The right way to fix this mess seems to be to compute all these values
      into a local copy of the process' PgBackendStatus struct, and then just
      copy the data back within the critical section proper.  This plan can't
      be implemented completely cleanly because of the struct's heavy reliance
      on out-of-line strings, which we must initialize separately within the
      critical section.  But still, the critical section is far smaller and
      safer than it was before.
      
      In hopes of forestalling future errors of the same ilk, rename the
      macros for st_changecount management to make it more apparent that
      the writer-side macros create a critical section.  And to prevent
      the worst consequences if we nonetheless manage to mess it up anyway,
      adjust those macros so that they really are a critical section, ie
      they now bump CritSectionCount.  That doesn't add much overhead, and
      it guarantees that if we do somehow throw an error while the counter
      is odd, it will lead to PANIC and a database restart to reset shared
      memory.
      
      Back-patch to 9.5 where the problem was introduced.
      
      In HEAD, also fix an oversight in commit b0b39f72: it failed to teach
      pgstat_read_current_status to copy st_gssstatus data from shared memory to
      local memory.  Hence, subsequent use of that data within the transaction
      would potentially see changing data that it shouldn't see.
      
      Discussion: https://postgr.es/m/CAPR3Wj5Z17=+eeyrn_ZDG3NQGYgMEOY6JV6Y-WRRhGgwc16U3Q@mail.gmail.com
      85ccb689
  4. 11 May, 2019 7 commits