1. 20 Feb, 2018 1 commit
  2. 19 Feb, 2018 7 commits
  3. 18 Feb, 2018 3 commits
  4. 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
  5. 16 Feb, 2018 7 commits
  6. 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
  7. 14 Feb, 2018 9 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
    • Tom Lane's avatar
      Speed up plpgsql function startup by doing fewer pallocs. · 40301c1c
      Tom Lane authored
      Previously, copy_plpgsql_datum did a separate palloc for each variable
      needing instance-local storage.  In simple benchmarks this made for a
      noticeable fraction of the total runtime.  Improve it by precalculating
      the space needed for all of a function's variables and doing just one
      palloc for all of them.
      
      In passing, remove PLPGSQL_DTYPE_EXPR from the list of plpgsql "datum"
      types, since in fact it has nothing in common with the others, and there
      is noplace that needs to discriminate on the basis of dtype between an
      expression and any type of datum.  And add comments clarifying which
      datum struct fields are generic and which aren't.
      
      Tom Lane, reviewed by Pavel Stehule
      
      Discussion: https://postgr.es/m/11986.1514407114@sss.pgh.pa.us
      40301c1c
  8. 13 Feb, 2018 6 commits
    • Tom Lane's avatar
      Make plpgsql use its DTYPE_REC code paths for composite-type variables. · 4b93f579
      Tom Lane authored
      Formerly, DTYPE_REC was used only for variables declared as "record";
      variables of named composite types used DTYPE_ROW, which is faster for
      some purposes but much less flexible.  In particular, the ROW code paths
      are entirely incapable of dealing with DDL-caused changes to the number
      or data types of the columns of a row variable, once a particular plpgsql
      function has been parsed for the first time in a session.  And, since the
      stored representation of a ROW isn't a tuple, there wasn't any easy way
      to deal with variables of domain-over-composite types, since the domain
      constraint checking code would expect the value to be checked to be a
      tuple.  A lesser, but still real, annoyance is that ROW format cannot
      represent a true NULL composite value, only a row of per-field NULL
      values, which is not exactly the same thing.
      
      Hence, switch to using DTYPE_REC for all composite-typed variables,
      whether "record", named composite type, or domain over named composite
      type.  DTYPE_ROW remains but is used only for its native purpose, to
      represent a fixed-at-compile-time list of variables, for instance the
      targets of an INTO clause.
      
      To accomplish this without taking significant performance losses, introduce
      infrastructure that allows storing composite-type variables as "expanded
      objects", similar to the "expanded array" infrastructure introduced in
      commit 1dc5ebc9.  A composite variable's value is thereby kept (most of
      the time) in the form of separate Datums, so that field accesses and
      updates are not much more expensive than they were in the ROW format.
      This holds the line, more or less, on performance of variables of named
      composite types in field-access-intensive microbenchmarks, and makes
      variables declared "record" perform much better than before in similar
      tests.  In addition, the logic involved with enforcing composite-domain
      constraints against updates of individual fields is in the expanded
      record infrastructure not plpgsql proper, so that it might be reusable
      for other purposes.
      
      In further support of this, introduce a typcache feature for assigning a
      unique-within-process identifier to each distinct tuple descriptor of
      interest; in particular, DDL alterations on composite types result in a new
      identifier for that type.  This allows very cheap detection of the need to
      refresh tupdesc-dependent data.  This improves on the "tupDescSeqNo" idea
      I had in commit 687f096e: that assigned identifying sequence numbers to
      successive versions of individual composite types, but the numbers were not
      unique across different types, nor was there support for assigning numbers
      to registered record types.
      
      In passing, allow plpgsql functions to accept as well as return type
      "record".  There was no good reason for the old restriction, and it
      was out of step with most of the other PLs.
      
      Tom Lane, reviewed by Pavel Stehule
      
      Discussion: https://postgr.es/m/8962.1514399547@sss.pgh.pa.us
      4b93f579
    • Peter Eisentraut's avatar
    • Peter Eisentraut's avatar
      Add procedure support to pg_get_functiondef · 7a32ac8a
      Peter Eisentraut authored
      This also makes procedures work in psql's \ef and \sf commands.
      Reported-by: default avatarPavel Stehule <pavel.stehule@gmail.com>
      7a32ac8a
    • Peter Eisentraut's avatar
      Add tests for pg_get_functiondef · 7cd56f21
      Peter Eisentraut authored
      7cd56f21
    • Peter Eisentraut's avatar
      Fix typo · a7b8f066
      Peter Eisentraut authored
      a7b8f066
    • Peter Eisentraut's avatar
      In LDAP test, restart after pg_hba.conf changes · b4e2ada3
      Peter Eisentraut authored
      Instead of issuing a reload after pg_hba.conf changes between test
      cases, run a full restart.  With a reload, an error in the new
      pg_hba.conf is ignored and the tests will continue to run with the old
      settings, invalidating the subsequent test cases.  With a restart, a
      faulty pg_hba.conf will lead to the test being aborted, which is what
      we'd rather want.
      b4e2ada3