1. 11 Mar, 2015 6 commits
    • Tom Lane's avatar
      Allocate ParamListInfo once per plpgsql function, not once per expression. · 21dcda27
      Tom Lane authored
      setup_param_list() was allocating a fresh ParamListInfo for each query or
      expression evaluation requested by a plpgsql function.  There was probably
      once good reason to do it like that, but for a long time we've had a
      convention that there's a one-to-one mapping between the function's
      PLpgSQL_datum array and the ParamListInfo slots, which means that a single
      ParamListInfo can serve all the function's evaluation requests: the data
      that would need to be passed is the same anyway.
      
      In this patch, we retain the pattern of zeroing out the ParamListInfo
      contents during each setup_param_list() call, because some of the slots may
      be stale and we don't know exactly which ones.  So this patch only saves a
      palloc/pfree per evaluation cycle and nothing more; still, that seems to be
      good for a couple percent overall speedup on simple-arithmetic type
      statements.  In future, though, we might be able to improve matters still
      more by managing the param array contents more carefully.
      
      Also, unify the former use of estate->cur_expr with that of
      paramLI->parserSetupArg; they both were used to point to the active
      expression, so we can combine the variables into just one.
      21dcda27
    • Robert Haas's avatar
      sepgsql: Improve error message when unsupported object type is labeled. · e96b7c6b
      Robert Haas authored
      KaiGai Kohei, reviewed by Álvaro Herrera and myself
      e96b7c6b
    • Robert Haas's avatar
      Suggest to the user the column they may have meant to reference. · e529cd4f
      Robert Haas authored
      Error messages informing the user that no such column exists can
      sometimes provoke a perplexed response.  This often happens due to
      a subtle typo in the column name or, perhaps less likely, in the
      alias name.  To speed discovery of what the real issue is in such
      cases, we'll now search the range table for approximate matches.
      If there are one or two such matches that are good enough to think
      that they might be what the user intended to type, and better than
      all other approximate matches, we'll issue a hint suggesting that
      the user might have intended to reference those columns.
      
      Peter Geoghegan and Robert Haas
      e529cd4f
    • Andres Freund's avatar
      Add macros wrapping all usage of gcc's __attribute__. · bbfd7eda
      Andres Freund authored
      Until now __attribute__() was defined to be empty for all compilers but
      gcc. That's problematic because it prevents using it in other compilers;
      which is necessary e.g. for atomics portability.  It's also just
      generally dubious to do so in a header as widely included as c.h.
      
      Instead add pg_attribute_format_arg, pg_attribute_printf,
      pg_attribute_noreturn macros which are implemented in the compilers that
      understand them. Also add pg_attribute_noreturn and pg_attribute_packed,
      but don't provide fallbacks, since they can affect functionality.
      
      This means that external code that, possibly unwittingly, relied on
      __attribute__ defined to be empty on !gcc compilers may now run into
      warnings or errors on those compilers. But there shouldn't be many
      occurances of that and it's hard to work around...
      
      Discussion: 54B58BA3.8040302@ohmu.fi
      Author: Oskari Saarenmaa, with some minor changes by me.
      bbfd7eda
    • Alvaro Herrera's avatar
      Refactor Mkvcbuild.pm to facilitate modules migrations · 66ece312
      Alvaro Herrera authored
      This is in preparation to "upgrade" some modules from contrib/ to
      src/bin/, per discussion.
      
      Author: Michael Paquier
      66ece312
    • Fujii Masao's avatar
      Add GUC to enable compression of full page images stored in WAL. · 57aa5b2b
      Fujii Masao authored
      When newly-added GUC parameter, wal_compression, is on, the PostgreSQL server
      compresses a full page image written to WAL when full_page_writes is on or
      during a base backup. A compressed page image will be decompressed during WAL
      replay. Turning this parameter on can reduce the WAL volume without increasing
      the risk of unrecoverable data corruption, but at the cost of some extra CPU
      spent on the compression during WAL logging and on the decompression during
      WAL replay.
      
      This commit changes the WAL format (so bumping WAL version number) so that
      the one-byte flag indicating whether a full page image is compressed or not is
      included in its header information. This means that the commit increases the
      WAL volume one-byte per a full page image even if WAL compression is not used
      at all. We can save that one-byte by borrowing one-bit from the existing field
      like hole_offset in the header and using it as the flag, for example. But which
      would reduce the code readability and the extensibility of the feature.
      Per discussion, it's not worth paying those prices to save only one-byte, so we
      decided to add the one-byte flag to the header.
      
      This commit doesn't introduce any new compression algorithm like lz4.
      Currently a full page image is compressed using the existing PGLZ algorithm.
      Per discussion, we decided to use it at least in the first version of the
      feature because there were no performance reports showing that its compression
      ratio is unacceptably lower than that of other algorithm. Of course,
      in the future, it's worth considering the support of other compression
      algorithm for the better compression.
      
      Rahila Syed and Michael Paquier, reviewed in various versions by myself,
      Andres Freund, Robert Haas, Abhijit Menon-Sen and many others.
      57aa5b2b
  2. 10 Mar, 2015 4 commits
    • Tom Lane's avatar
      Clean up the mess from => patch. · 2fbb2866
      Tom Lane authored
      Commit 865f14a2 was quite a few bricks
      shy of a load: psql, ecpg, and plpgsql were all left out-of-step with
      the core lexer.  Of these only the last was likely to be a fatal
      problem; but still, a minimal amount of grepping, or even just reading
      the comments adjacent to the places that were changed, would have found
      the other places that needed to be changed.
      2fbb2866
    • Alvaro Herrera's avatar
      Fix stray sentence fragment in shared_preload_libraries documentation · bb7b35ca
      Alvaro Herrera authored
      The introduction in the Shared Library Preloading section already
      instructs the user to separate multiple library names with commas, so
      just remove the fragment from here.
      
      Author: Dagfinn Ilmari Mannsåker
      bb7b35ca
    • Alvaro Herrera's avatar
      Move BRIN page type to page's last two bytes · e491bd2e
      Alvaro Herrera authored
      ... which is the usual convention among AMs, so that pg_filedump and
      similar utilities can tell apart pages of different AMs.  It was also
      the intent of the original code, but I failed to realize that alignment
      considerations would move the whole thing to the previous-to-last word
      in the page.
      
      The new definition of the associated macro makes surrounding code a bit
      leaner, too.
      
      Per note from Heikki at
      http://www.postgresql.org/message-id/546A16EF.9070005@vmware.com
      e491bd2e
    • Robert Haas's avatar
      Allow named parameters to be specified using => in addition to := · 865f14a2
      Robert Haas authored
      SQL has standardized on => as the use of to specify named parameters,
      and we've wanted for many years to support the same syntax ourselves,
      but this has been complicated by the possible use of => as an operator
      name.  In PostgreSQL 9.0, we began emitting a warning when an operator
      named => was defined, and in PostgreSQL 9.2, we stopped shipping a
      =>(text, text) operator as part of hstore.  By the time the next major
      version of PostgreSQL is released, => will have been deprecated for a
      full five years, so hopefully there won't be too many people still
      relying on it.  We continue to support := for compatibility with
      previous PostgreSQL releases.
      
      Pavel Stehule, reviewed by Petr Jelinek, with a few documentation
      tweaks by me.
      865f14a2
  3. 09 Mar, 2015 10 commits
    • Alvaro Herrera's avatar
      Keep CommitTs module in sync in standby and master · 4f3924d9
      Alvaro Herrera authored
      We allow this module to be turned off on restarts, so a restart time
      check is enough to activate or deactivate the module; however, if there
      is a standby replaying WAL emitted from a master which is restarted, but
      the standby isn't, the state in the standby becomes inconsistent and can
      easily be crashed.
      
      Fix by activating and deactivating the module during WAL replay on
      parameter change as well as on system start.
      
      Problem reported by Fujii Masao in
      http://www.postgresql.org/message-id/CAHGQGwFhJ3CnHo1CELEfay18yg_RA-XZT-7D8NuWUoYSZ90r4Q@mail.gmail.com
      
      Author: Petr Jelínek
      4f3924d9
    • Alvaro Herrera's avatar
      Fix crasher bugs in previous commit · e3f1c24b
      Alvaro Herrera authored
      ALTER DEFAULT PRIVILEGES was trying to decode the list of roles in the
      FOR clause as a list of names rather than of RoleSpecs; and the IN
      clause in CREATE ROLE was doing the same thing.  This was evidenced by
      crashes on some buildfarm machines, though on my platform this doesn't
      cause a failure by mere chance; I can reproduce the failures only by
      adding some padding in struct RoleSpecs.
      
      Fix by dereferencing those lists as being of RoleSpecs, not string
      Values.
      e3f1c24b
    • Alvaro Herrera's avatar
      Allow CURRENT/SESSION_USER to be used in certain commands · 31eae602
      Alvaro Herrera authored
      Commands such as ALTER USER, ALTER GROUP, ALTER ROLE, GRANT, and the
      various ALTER OBJECT / OWNER TO, as well as ad-hoc clauses related to
      roles such as the AUTHORIZATION clause of CREATE SCHEMA, the FOR clause
      of CREATE USER MAPPING, and the FOR ROLE clause of ALTER DEFAULT
      PRIVILEGES can now take the keywords CURRENT_USER and SESSION_USER as
      user specifiers in place of an explicit user name.
      
      This commit also fixes some quite ugly handling of special standards-
      mandated syntax in CREATE USER MAPPING, which in particular would fail
      to work in presence of a role named "current_user".
      
      The special role specifiers PUBLIC and NONE also have more consistent
      handling now.
      
      Also take the opportunity to add location tracking to user specifiers.
      
      Authors: Kyotaro Horiguchi.  Heavily reworked by Álvaro Herrera.
      Reviewed by: Rushabh Lathia, Adam Brightwell, Marti Raudsepp.
      31eae602
    • Michael Meskes's avatar
    • Michael Meskes's avatar
      2093eb4d
    • Robert Haas's avatar
      Fix handling of sortKeys field in Tuplesortstate. · 2720e96a
      Robert Haas authored
      Commit 5cefbf5a introduced an
      assumption that this field would always be non-NULL when doing a merge
      pass, but that's not true.  Without this fix, you can crash the server
      by building a hash index that is sufficiently large relative to
      maintenance_work_mem, or by triggering a large datum sort.
      
      Commit 5ea86e6e changed the comments
      for that field to say that it would be set in all cases except for the
      hash index case, but that wasn't (and still isn't) true.
      
      The datum-sort failure was spotted by Tomas Vondra; initial analysis
      of that failure was by Peter Geoghegan.  The remaining issues were
      spotted by me during review of the surrounding code, and the patch is
      all my fault.
      2720e96a
    • Heikki Linnakangas's avatar
      Move WAL-related definitions from dbcommands.h to separate header file. · f1fd515b
      Heikki Linnakangas authored
      This makes it easier to write frontend programs that needs to understand
      the WAL record format of CREATE/DROP DATABASE. dbcommands.h cannot easily
      be #included in a frontend program, because it pulls in other header files
      that need backend stuff, but the new dbcommands_xlog.h header file has
      fewer dependencies.
      f1fd515b
    • Michael Meskes's avatar
      Ignore object files generated by ecpg test suite on Windows · b9e538b1
      Michael Meskes authored
      Patch by Michael Paquier
      b9e538b1
    • Fujii Masao's avatar
      Fix typo in comment. · 828599ac
      Fujii Masao authored
      828599ac
    • Fujii Masao's avatar
      Add missing "goto err" statements in xlogreader.c. · c74c04b8
      Fujii Masao authored
      Spotted by Andres Freund.
      c74c04b8
  4. 08 Mar, 2015 6 commits
    • Peter Eisentraut's avatar
      Sort SUBDIRS variable in src/bin/Makefile · 5a2a48f0
      Peter Eisentraut authored
      The previous order appears to have been historically grown randomness.
      5a2a48f0
    • Tom Lane's avatar
      Cast to (void *) rather than (int *) when passing int64's to PQfn(). · ef75508e
      Tom Lane authored
      This is a possibly-vain effort to silence a Coverity warning about
      bogus endianness dependency.  The code's fine, because it takes care
      of endianness issues for itself, but Coverity sees an int64 being
      passed to an int* argument and not unreasonably suspects something's
      wrong.  I'm not sure if putting the void* cast in the way will shut it
      up; but it can't hurt and seems better from a documentation standpoint
      anyway, since the pointer is not used as an int* in this code path.
      
      Just for a bit of additional safety, verify that the result length
      is 8 bytes as expected.
      
      Back-patch to 9.3 where the code in question was added.
      ef75508e
    • Tom Lane's avatar
      Remove struct PQArgBlock from server-side header libpq/libpq.h. · 01cca2c1
      Tom Lane authored
      This struct is purely a client-side artifact.  Perhaps there was once
      reason for the server to know it, but any such reason is lost in the
      mists of time.  We certainly don't need two independent declarations
      of it.
      01cca2c1
    • Tom Lane's avatar
      Fix documentation for libpq's PQfn(). · 1a0bc4c2
      Tom Lane authored
      The SGML docs claimed that 1-byte integers could be sent or received with
      the "isint" options, but no such behavior has ever been implemented in
      pqGetInt() or pqPutInt().  The in-code documentation header for PQfn() was
      even less in tune with reality, and the code itself used parameter names
      matching neither the SGML docs nor its libpq-fe.h declaration.  Do a bit
      of additional wordsmithing on the SGML docs while at it.
      
      Since the business about 1-byte integers is a clear documentation bug,
      back-patch to all supported branches.
      1a0bc4c2
    • Tom Lane's avatar
      Code cleanup for REINDEX DATABASE/SCHEMA/SYSTEM. · 90c35a9e
      Tom Lane authored
      Fix some minor infelicities.  Some of these things were introduced in
      commit fe263d11, and some are older.
      90c35a9e
    • Tom Lane's avatar
      Fix erroneous error message for REINDEX SYSTEM. · ac091428
      Tom Lane authored
      Missed case in commit fe263d11.
      
      Sawada Masahiko
      ac091428
  5. 07 Mar, 2015 3 commits
    • Noah Misch's avatar
      Build fls.o only when AC_REPLACE_FUNCS so dictates via $(LIBOBJS). · 9d265ae7
      Noah Misch authored
      By building it unconditionally, libpgport inadvertently replaced any
      libc version of the function.  This is essentially a code cleanup; any
      effect on performance is almost surely too small to notice.
      9d265ae7
    • Noah Misch's avatar
      Add CHECK_FOR_INTERRUPTS() to the wait_pid() loop. · 93751570
      Noah Misch authored
      Though the one contemporary caller uses it in a limited way, this
      function could loop indefinitely if pointed to an arbitrary PID.
      93751570
    • Peter Eisentraut's avatar
      Remove rolcatupdate · bb8582ab
      Peter Eisentraut authored
      This role attribute is an ancient PostgreSQL feature, but could only be
      set by directly updating the system catalogs, and it doesn't have any
      clearly defined use.
      
      Author: Adam Brightwell <adam.brightwell@crunchydatasolutions.com>
      bb8582ab
  6. 06 Mar, 2015 3 commits
    • Alvaro Herrera's avatar
      Add some more tests on event triggers · 6510c832
      Alvaro Herrera authored
      Fabien Coelho
      Reviewed by Robert Haas
      6510c832
    • Tom Lane's avatar
      Rethink function argument sorting in pg_dump. · e3bfe6d8
      Tom Lane authored
      Commit 7b583b20 created an unnecessary
      dump failure hazard by applying pg_get_function_identity_arguments()
      to every function in the database, even those that won't get dumped.
      This could result in snapshot-related problems if concurrent sessions are,
      for example, creating and dropping temporary functions, as noted by Marko
      Tiikkaja in bug #12832.  While this is by no means pg_dump's only such
      issue with concurrent DDL, it's unfortunate that we added a new failure
      mode for cases that used to work, and even more so that the failure was
      created for basically cosmetic reasons (ie, to sort overloaded functions
      more deterministically).
      
      To fix, revert that patch and instead sort function arguments using
      information that pg_dump has available anyway, namely the names of the
      argument types.  This will produce a slightly different sort ordering for
      overloaded functions than the previous coding; but applying strcmp
      directly to the output of pg_get_function_identity_arguments really was
      a bit odd anyway.  The sorting will still be name-based and hence
      independent of possibly-installation-specific OID assignments.  A small
      additional benefit is that sorting now works regardless of server version.
      
      Back-patch to 9.3, where the previous commit appeared.
      e3bfe6d8
    • Alvaro Herrera's avatar
      Fix contrib/file_fdw's expected file · c6ee39bc
      Alvaro Herrera authored
      I forgot to update it on yesterday's cf34e373.
      c6ee39bc
  7. 05 Mar, 2015 7 commits
    • Alvaro Herrera's avatar
      Fix user mapping object description · cf34e373
      Alvaro Herrera authored
      We were using "user mapping for user XYZ" as description for user mappings, but
      that's ambiguous because users can have mappings on multiple foreign
      servers; therefore change it to "for user XYZ on server UVW" instead.
      Object identities for user mappings are also updated in the same way, in
      branches 9.3 and above.
      
      The incomplete description string was introduced together with the whole
      SQL/MED infrastructure by commit cae565e5 of 8.4 era, so backpatch all
      the way back.
      cf34e373
    • Alvaro Herrera's avatar
      Silence warning in non-assert-enabled build · bf22d270
      Alvaro Herrera authored
      An OID return value was being used only for a (rather pointless) assert.
      Silence by removing the variable and the assert.
      
      Per note from Peter Geoghegan
      bf22d270
    • Tom Lane's avatar
      Remove comment claiming that PARAM_EXTERN Params always have typmod -1. · 3200b15b
      Tom Lane authored
      This hasn't been true in quite some time, cf plpgsql's make_datum_param().
      3200b15b
    • Fujii Masao's avatar
      Fix typo in comment. · 934d1226
      Fujii Masao authored
      934d1226
    • Tom Lane's avatar
      Avoid unused-variable warning in non-assert builds. · a5c29d37
      Tom Lane authored
      Oversight in my commit b9896198.
      a5c29d37
    • Tom Lane's avatar
      Change plpgsql's cast cache to consider source typmod as significant. · 7f3014dc
      Tom Lane authored
      I had thought that there was no need to maintain separate cache entries
      for different source typmods, but further experimentation shows that there
      is an advantage to doing so in some cases.  In particular, if a domain has
      a typmod (say, "CREATE DOMAIN d AS numeric(20,0)"), failing to notice the
      source typmod leads to applying a length-coercion step even when the
      source has the correct typmod.
      7f3014dc
    • Tom Lane's avatar
      Need to special-case RECORD as well as UNKNOWN in plpgsql's casting logic. · 45f2c2fc
      Tom Lane authored
      This is because can_coerce_type thinks that RECORD can be cast to any
      composite type, but coerce_record_to_complex only works for inputs that are
      RowExprs or whole-row Vars, so we get a hard failure on a CaseTestExpr.
      
      Perhaps these corner cases ought to be fixed so that coerce_to_target_type
      actually returns NULL as per its specification, rather than failing ...
      but for the moment an extra check here is the path of least resistance.
      45f2c2fc
  8. 04 Mar, 2015 1 commit
    • Tom Lane's avatar
      Use standard casting mechanism to convert types in plpgsql, when possible. · 1345cc67
      Tom Lane authored
      plpgsql's historical method for converting datatypes during assignments was
      to apply the source type's output function and then the destination type's
      input function.  Aside from being miserably inefficient in most cases, this
      method failed outright in many cases where a user might expect it to work;
      an example is that "declare x int; ... x := 3.9;" would fail, not round the
      value to 4.
      
      Instead, let's convert by applying the appropriate assignment cast whenever
      there is one.  To avoid breaking compatibility unnecessarily, fall back to
      the I/O conversion method if there is no assignment cast.
      
      So far as I can tell, there is just one case where this method produces a
      different result than the old code in a case where the old code would not
      have thrown an error.  That is assignment of a boolean value to a string
      variable (type text, varchar, or bpchar); the old way gave boolean's output
      representation, ie 't'/'f', while the new way follows the behavior of the
      bool-to-text cast and so gives 'true' or 'false'.  This will need to be
      called out as an incompatibility in the 9.5 release notes.
      
      Aside from handling many conversion cases more sanely, this method is
      often significantly faster than the old way.  In part that's because
      of more effective caching of the conversion info.
      1345cc67