1. 16 Feb, 2018 7 commits
  2. 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
  3. 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
  4. 13 Feb, 2018 7 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
    • Peter Eisentraut's avatar
      Fix typo · ebdb42a0
      Peter Eisentraut authored
      Author: Masahiko Sawada <sawada.mshk@gmail.com>
      ebdb42a0
  5. 12 Feb, 2018 4 commits
  6. 11 Feb, 2018 1 commit
    • Tom Lane's avatar
      Fix assorted errors in pg_dump's handling of extended statistics objects. · 5c9f2564
      Tom Lane authored
      pg_dump supposed that a stats object necessarily shares the same schema
      as its underlying table, and that it doesn't have a separate owner.
      These things may have been true during early development of the feature,
      but they are not true as of v10 release.
      
      Failure to track the object's schema separately turns out to have only
      limited consequences, because pg_get_statisticsobjdef() always schema-
      qualifies the target object name in the generated CREATE STATISTICS command
      (a decision out of step with the rest of ruleutils.c, but I digress).
      Therefore the restored object would be in the right schema, so that the
      only problem is that the TOC entry would be mislabeled as to schema.  That
      could lead to wrong decisions for schema-selective restores, for example.
      
      The ownership issue is a bit more serious: not only was the TOC entry
      potentially mislabeled as to owner, but pg_dump didn't bother to issue an
      ALTER OWNER command at all, so that after restore the stats object would
      continue to be owned by the restoring superuser.
      
      A final point is that decisions as to whether to dump a stats object or
      not were driven by whether the underlying table was dumped or not.  While
      that's not wrong on its face, it won't scale nicely to the planned future
      extension to cross-table statistics.  Moreover, that design decision comes
      out of the view of stats objects as being auxiliary to a particular table,
      like a rule or trigger, which is exactly where the above problems came
      from.  Since we're now treating stats objects more like independent objects
      in their own right, they ought to behave like standalone objects for this
      purpose too.  So change to using the generic selectDumpableObject() logic
      for them (which presently amounts to "dump if containing schema is to be
      dumped").
      
      Along the way to fixing this, restructure so that getExtendedStatistics
      collects the identity info (only) for all extended stats objects in one
      query, and then for each object actually being dumped, we retrieve the
      definition in dumpStatisticsExt.  This is necessary to ensure that
      schema-qualification in the generated CREATE STATISTICS command happens
      with respect to the search path that pg_dump will now be using at restore
      time (ie, the schema the stats object is in, not that of the underlying
      table).  It's probably also significantly faster in the typical scenario
      where only a minority of tables have extended stats.
      
      Back-patch to v10 where extended stats were introduced.
      
      Discussion: https://postgr.es/m/18272.1518328606@sss.pgh.pa.us
      5c9f2564
  7. 10 Feb, 2018 3 commits
    • Tom Lane's avatar
      Avoid premature free of pass-by-reference CALL arguments. · d02d4a6d
      Tom Lane authored
      Prematurely freeing the EState used to evaluate CALL arguments led, in some
      cases, to passing dangling pointers to the procedure.  This was masked in
      trivial cases because the argument pointers would point to Const nodes in
      the original expression tree, and in some other cases because the result
      value would end up in the standalone ExprContext rather than in memory
      belonging to the EState --- but that wasn't exactly high quality
      programming either, because the standalone ExprContext was never
      explicitly freed, breaking assorted API contracts.
      
      In addition, using a separate EState for each argument was just silly.
      
      So let's use just one EState, and one ExprContext, and make the latter
      belong to the former rather than be standalone, and clean up the EState
      (and hence the ExprContext) post-call.
      
      While at it, improve the function's commentary a bit.
      
      Discussion: https://postgr.es/m/29173.1518282748@sss.pgh.pa.us
      d02d4a6d
    • Tom Lane's avatar
      Fix oversight in CALL argument handling, and do some minor cleanup. · 65b1d767
      Tom Lane authored
      CALL statements cannot support sub-SELECTs in the arguments of the called
      procedure, since they just use ExecEvalExpr to evaluate such arguments.
      Teach transformSubLink() to reject the case, as it already does for other
      contexts in which subqueries are not supported.
      
      In passing, s/EXPR_KIND_CALL/EXPR_KIND_CALL_ARGUMENT/ to make that enum
      symbol line up more closely with the phrasing of the error messages it is
      associated with.  And fix someone's weak grasp of English grammar in the
      preceding EXPR_KIND_PARTITION_EXPRESSION addition.  Also update an
      incorrect comment in resolve_unique_index_expr (possibly it was correct
      when written, but nowadays transformExpr definitely does reject SRFs here).
      
      Per report from Pavel Stehule --- but this resolves only one of the bugs
      he mentions.
      
      Discussion: https://postgr.es/m/CAFj8pRDxOwPPzpA8i+AQeDQFj7bhVw-dR2==rfWZ3zMGkm568Q@mail.gmail.com
      65b1d767
    • Alvaro Herrera's avatar
      Mention partitioned indexes in "Data Definition" chapter · fad15f4a
      Alvaro Herrera authored
      We can now create indexes more easily than before, so update this
      chapter to use the simpler instructions.
      
      After an idea of Amit Langote.  I (Álvaro) opted to do more invasive
      surgery and remove the previous suggestion to create per-partition
      indexes, which his patch left in place.
      
      Discussion: https://postgr.es/m/eafaaeb1-f0fd-d010-dd45-07db0300f645@lab.ntt.co.jp
      Author: Amit Langote, Álvaro Herrera
      fad15f4a
  8. 09 Feb, 2018 3 commits
  9. 08 Feb, 2018 2 commits