1. 21 Feb, 2018 2 commits
    • Tom Lane's avatar
      Repair pg_upgrade's failure to preserve relfrozenxid for matviews. · 38b41f18
      Tom Lane authored
      This oversight led to data corruption in matviews, manifesting as
      "could not access status of transaction" before our most recent releases,
      and "found xmin from before relfrozenxid" errors since then.
      
      The proximate cause of the problem seems to have been confusion between
      the task of preserving dropped-column status and the task of preserving
      frozenxid status.  Those are required for distinct sets of relkinds,
      and the reasoning was entirely undocumented in the source code.  In hopes
      of forestalling future errors of the same kind, try to improve the
      commentary in this area.
      
      In passing, also improve the remarkably unhelpful comments around
      pg_upgrade's set_frozenxids().  That's not actually buggy AFAICS,
      but good luck figuring out what it does from the old comments.
      
      Per report from Claudio Freire.  It appears that bug #14852 from Alexey
      Ermakov is an earlier report of the same issue, and there may be other
      cases that we failed to identify at the time.
      
      Patch by me based on analysis by Andres Freund.  The bug dates back
      to the introduction of matviews, so back-patch to all supported branches.
      
      Discussion: https://postgr.es/m/CAGTBQpbrY9CdRGGhyBZ9yqY4jWaGC85rUF4X+R7d-aim=mBNsw@mail.gmail.com
      Discussion: https://postgr.es/m/20171013115320.28049.86457@wrigleys.postgresql.org
      38b41f18
    • Andres Freund's avatar
      Blindly attempt to adapt sepgsql regression tests. · 29d432e4
      Andres Freund authored
      Commit bf6c614a broke the sepgsql test
      due to a new invocation of the function access hook during grouping
      equal initialization.
      
      The new behaviour seems at least as correct as the old one, so try
      adapt the tests. As I've no working sepgsql setup here, this is just
      going from buildfarm results.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20180217000337.lfsdvro3l6ccsksp@alap3.anarazel.de
      29d432e4
  2. 20 Feb, 2018 6 commits
  3. 19 Feb, 2018 7 commits
  4. 18 Feb, 2018 3 commits
  5. 17 Feb, 2018 3 commits
    • Alvaro Herrera's avatar
      Refactor format_type APIs to be more modular · a26116c6
      Alvaro Herrera authored
      Introduce a new format_type_extended, with a flags bitmask argument that
      can modify the default behavior.  A few compatibility and readability
      wrappers remain:
      	format_type_be
      	format_type_be_qualified
      	format_type_with_typemod
      while format_type_with_typemod_qualified, which had a single caller, is
      removed.
      
      Author: Michael Paquier, some revisions by me
      Discussion: 20180213035107.GA2915@paquier.xyz
      a26116c6
    • Alvaro Herrera's avatar
      Mention trigger name in trigger test · cef60043
      Alvaro Herrera authored
      This makes it more explicit exactly what is going on, for further
      proposed behavior changes.
      
      Discussion: https://postgr.es/m/20180214212624.hm7of76flesodamf@alvherre.pgsql
      cef60043
    • Andres Freund's avatar
      Allow tupleslots to have a fixed tupledesc, use in executor nodes. · ad7dbee3
      Andres Freund authored
      The reason for doing so is that it will allow expression evaluation to
      optimize based on the underlying tupledesc. In particular it will
      allow to JIT tuple deforming together with the expression itself.
      
      For that expression initialization needs to be moved after the
      relevant slots are initialized - mostly unproblematic, except in the
      case of nodeWorktablescan.c.
      
      After doing so there's no need for ExecAssignResultType() and
      ExecAssignResultTypeFromTL() anymore, as all former callers have been
      converted to create a slot with a fixed descriptor.
      
      When creating a slot with a fixed descriptor, tts_values/isnull can be
      allocated together with the main slot, reducing allocation overhead
      and increasing cache density a bit.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/20171206093717.vqdxe5icqttpxs3p@alap3.anarazel.de
      ad7dbee3
  6. 16 Feb, 2018 7 commits
  7. 15 Feb, 2018 4 commits
    • Tom Lane's avatar
      Fix plpgsql to enforce domain checks when returning a NULL domain value. · 51db0d18
      Tom Lane authored
      If a plpgsql function is declared to return a domain type, and the domain's
      constraints forbid a null value, it was nonetheless possible to return
      NULL, because we didn't bother to check the constraints for a null result.
      I'd noticed this while fooling with domains-over-composite, but had not
      gotten around to fixing it immediately.
      
      Add a regression test script exercising this and various other domain
      cases, largely borrowed from the plpython_types test.
      
      Although this is clearly a bug fix, I'm not sure whether anyone would
      thank us for changing the behavior in stable branches, so I'm inclined
      not to back-patch.
      51db0d18
    • Tom Lane's avatar
      Doc: fix minor bug in CREATE TABLE example. · 439c7bc1
      Tom Lane authored
      One example in create_table.sgml claimed to be showing table constraint
      syntax, but it was really column constraint syntax due to the omission
      of a comma.  This is both wrong and confusing, so fix it in all
      supported branches.
      
      Per report from neil@postgrescompare.com.
      
      Discussion: https://postgr.es/m/151871659877.1393.2431103178451978795@wrigleys.postgresql.org
      439c7bc1
    • Tom Lane's avatar
      Cast to void in StaticAssertExpr, not its callers. · 51940f97
      Tom Lane authored
      Seems a bit silly that many (in fact all, as of today) uses of
      StaticAssertExpr would need to cast it to void to avoid warnings from
      pickier compilers.  Let's just do the cast right in the macro, instead.
      
      In passing, change StaticAssertExpr to StaticAssertStmt in one
      place where that seems more apropos.
      
      Discussion: https://postgr.es/m/16161.1518715186@sss.pgh.pa.us
      51940f97
    • Tom Lane's avatar
      Move the extern declaration for ExceptionalCondition into c.h. · 03c5a00e
      Tom Lane authored
      This is the logical conclusion of our decision to support Assert()
      in both frontend and backend code: it should be possible to use that
      after including just c.h.  But as things were arranged before, if
      you wanted to use Assert() in code that might be compiled for either
      environment, you had to include postgres.h for the backend case.
      Let's simplify that.
      
      Per buildfarm, some of whose members started throwing warnings after
      commit 0c62356c added an Assert in src/port/snprintf.c.
      
      It's possible that some other src/port files that use the stanza
      
      #ifndef FRONTEND
      #include "postgres.h"
      #else
      #include "postgres_fe.h"
      #endif
      
      could now be simplified to just say '#include "c.h"'.  I have not
      tested for that, though, and it'd be unlikely to apply for more
      than a small number of them.
      03c5a00e
  8. 14 Feb, 2018 8 commits
    • Tom Lane's avatar
      Revert "Stabilize output of new regression test case". · cbadba8d
      Tom Lane authored
      This effectively reverts commit 9edc97b7 (although the test is now
      in a different place and has different contents).  We don't need that
      hack anymore, because since commit 4b93f579, this test case no longer
      throws an error and so there's no displayed CONTEXT that could vary
      depending on CLOBBER_CACHE_ALWAYS.  The underlying unstable-output
      problem isn't really gone, of course, but it no longer manifests here.
      cbadba8d
    • Tom Lane's avatar
      Stabilize new plpgsql_record regression tests. · feb1cc55
      Tom Lane authored
      The buildfarm's CLOBBER_CACHE_ALWAYS animals aren't happy with some
      of the test cases added in commit 4b93f579.  There are two different
      problems:
      
      * In two places, a different CONTEXT stack is shown because the error
      is detected in a different place, due to recompiling an expression
      from scratch rather than re-using a previously cached plan for it.
      I fixed these via the expedient of hiding the CONTEXT stack altogether.
      
      * In one place, a test expected to fail (because a cached plan hadn't
      been updated) actually succeeds (because the forced recompile makes
      it good).  I couldn't think of a simple workaround for this, so I've
      just commented out that test step altogether.
      
      I have hopes of improving things enough that both of these kluges can
      be reverted eventually.  The first one is the same kind of problem
      previously discussed at
      https://postgr.es/m/31545.1512924904@sss.pgh.pa.us
      but there was insufficient agreement about how to fix it, so we
      just hacked around the output instability (commit 9edc97b7).
      The second issue should be fixed by allowing the plan to be rebuilt
      when a type conflict is detected.  But for today, let's just make the
      buildfarm green again.
      feb1cc55
    • Andres Freund's avatar
      Return implementation defined value if pg_$op_s$bit_overflow overflows. · 6d7dc535
      Andres Freund authored
      Some older compilers otherwise sometimes complain about undefined
      values, even though the return value should not be used in the
      overflow case.  We assume that any decent compiler will optimize away
      the unnecessary assignment in performance critical cases.
      
      We do not want to restrain the returned value to a specific value,
      e.g. 0 or the wrapped-around value, because some fast ways to
      implement overflow detecting math do not easily allow for
      that (e.g. msvc intrinsics).  As the function documentation already
      documents the returned value in case of intrinsics to be
      implementation defined, no documentation has to be updated.
      
      Per complaint from Tom Lane and his buildfarm member prairiedog.
      
      Author: Andres Freund
      Discussion: https://postgr.es/m/18169.1513958454@sss.pgh.pa.us
      6d7dc535
    • Tom Lane's avatar
      Silence assorted "variable may be used uninitialized" warnings. · 9a725f7b
      Tom Lane authored
      All of these are false positives, but in each case a fair amount of
      analysis is needed to see that, and it's not too surprising that not all
      compilers are smart enough.  (In particular, in the logtape.c case, a
      compiler lacking the knowledge provided by the Assert would almost surely
      complain, so that this warning will be seen in any non-assert build.)
      
      Some of these are of long standing while others are pretty recent,
      but it only seems worth fixing them in HEAD.
      
      Jaime Casanova, tweaked a bit by me
      
      Discussion: https://postgr.es/m/CAJGNTeMcYAMJdPAom52dppLMtF-UnEZi0dooj==75OEv1EoBZA@mail.gmail.com
      9a725f7b
    • Tom Lane's avatar
      Add an assertion that we don't pass NULL to snprintf("%s"). · 0c62356c
      Tom Lane authored
      Per commit e748e902, we appear to have little or no coverage in the
      buildfarm of machines that will dump core when asked to printf a
      null string pointer.  Let's try to improve that situation by adding
      an assertion that will make src/port/snprintf.c behave that way.
      Since it's just an assertion, it won't break anything in production
      builds, but it will help developers find this type of oversight.
      
      Note that while our buildfarm coverage of machines that use that
      snprintf implementation is pretty thin on the Unix side (apparently
      amounting only to gaur/pademelon), all of the MSVC critters use it.
      
      Discussion: https://postgr.es/m/156b989dbc6fe7c4d3223cf51da61195@postgrespro.ru
      0c62356c
    • Tom Lane's avatar
      Fix broken logic for reporting PL/Python function names in errcontext. · e748e902
      Tom Lane authored
      plpython_error_callback() reported the name of the function associated
      with the topmost PL/Python execution context.  This was not merely
      wrong if there were nested PL/Python contexts, but it risked a core
      dump if the topmost one is an inline code block rather than a named
      function.  That will have proname = NULL, and so we were passing a NULL
      pointer to snprintf("%s").  It seems that none of the PL/Python-testing
      machines in the buildfarm will dump core for that, but some platforms do,
      as reported by Marina Polyakova.
      
      Investigation finds that there actually is an existing regression test
      that used to prove that the behavior was wrong, though apparently no one
      had noticed that it was printing the wrong function name.  It stopped
      showing the problem in 9.6 when we adjusted psql to not print CONTEXT
      by default for NOTICE messages.  The problem is masked (if your platform
      avoids the core dump) in error cases, because PL/Python will throw away
      the originally generated error info in favor of a new traceback produced
      at the outer level.
      
      Repair by using ErrorContextCallback.arg to pass the correct context to
      the error callback.  Add a regression test illustrating correct behavior.
      
      Back-patch to all supported branches, since they're all broken this way.
      
      Discussion: https://postgr.es/m/156b989dbc6fe7c4d3223cf51da61195@postgrespro.ru
      e748e902
    • Tom Lane's avatar
      Support CONSTANT/NOT NULL/initial value for plpgsql composite variables. · f9263006
      Tom Lane authored
      These features were never implemented previously for composite or record
      variables ... not that the documentation admitted it, so there's no doc
      updates here.
      
      This also fixes some issues concerning enforcing DOMAIN NOT NULL
      constraints against plpgsql variables, although I'm not sure that
      that topic is completely dealt with.
      
      I created a new plpgsql test file for these features, and moved the
      one relevant existing test case into that file.
      
      Tom Lane, reviewed by Daniel Gustafsson
      
      Discussion: https://postgr.es/m/18362.1514605650@sss.pgh.pa.us
      f9263006
    • Tom Lane's avatar
      Speed up plpgsql trigger startup by introducing "promises". · fd333bc7
      Tom Lane authored
      Over the years we've accreted quite a few special variables that are
      predefined in plpgsql trigger functions.  The cost of initializing these
      variables to their defined values turns out to be a significant part of
      the runtime of simple triggers; but, undoubtedly, most real-world triggers
      never examine the values of most of these variables.
      
      To improve matters, invent the notion of a variable that has a "promise"
      attached to it, specifying which of the predetermined values should be
      assigned to the variable if anything ever reads it.  This eliminates all
      the unneeded startup overhead, in return for a small penalty on accesses
      to these variables.
      
      Tom Lane, reviewed by Pavel Stehule
      
      Discussion: https://postgr.es/m/11986.1514407114@sss.pgh.pa.us
      fd333bc7