1. 12 Mar, 2015 1 commit
    • Tom Lane's avatar
      Improve planner's cost estimation in the presence of semijoins. · b5572269
      Tom Lane authored
      If we have a semijoin, say
      	SELECT * FROM x WHERE x1 IN (SELECT y1 FROM y)
      and we're estimating the cost of a parameterized indexscan on x, the number
      of repetitions of the indexscan should not be taken as the size of y; it'll
      really only be the number of distinct values of y1, because the only valid
      plan with y on the outside of a nestloop would require y to be unique-ified
      before joining it to x.  Most of the time this doesn't make that much
      difference, but sometimes it can lead to drastically underestimating the
      cost of the indexscan and hence choosing a bad plan, as pointed out by
      David Kubečka.
      
      Fixing this is a bit difficult because parameterized indexscans are costed
      out quite early in the planning process, before we have the information
      that would be needed to call estimate_num_groups() and thereby estimate the
      number of distinct values of the join column(s).  However we can move the
      code that extracts a semijoin RHS's unique-ification columns, so that it's
      done in initsplan.c rather than on-the-fly in create_unique_path().  That
      shouldn't make any difference speed-wise and it's really a bit cleaner too.
      
      The other bit of information we need is the size of the semijoin RHS,
      which is easy if it's a single relation (we make those estimates before
      considering indexscan costs) but problematic if it's a join relation.
      The solution adopted here is just to use the product of the sizes of the
      join component rels.  That will generally be an overestimate, but since
      estimate_num_groups() only uses this input as a clamp, an overestimate
      shouldn't hurt us too badly.  In any case we don't allow this new logic
      to produce a value larger than we would have chosen before, so that at
      worst an overestimate leaves us no wiser than we were before.
      b5572269
  2. 11 Mar, 2015 13 commits
    • Peter Eisentraut's avatar
      ff2faeec
    • Alvaro Herrera's avatar
      Support default ACLs in get_object_address · 44643034
      Alvaro Herrera authored
      In the spirit of 890192e9, this time add support for the things
      living in the pg_default_acl catalog.  These are not really "objects",
      but they show up as such in event triggers.
      
      There is no "DROP DEFAULT PRIVILEGES" or similar command, so it doesn't
      look like the new representation given would be useful anywhere else, so
      I didn't try to use it outside objectaddress.c.  (That might be a bug in
      itself, but that would be material for another commit.)
      
      Reviewed by Stephen Frost.
      44643034
    • Alvaro Herrera's avatar
      Fix libpq test expected output file · d4d77775
      Alvaro Herrera authored
      Evidently, this test is not run very frequently ...
      d4d77775
    • Alvaro Herrera's avatar
      Support user mappings in get_object_address · 890192e9
      Alvaro Herrera authored
      Since commit 72dd233d we were trying to obtain object addressing
      information in sql_drop event triggers, but that caused failures when
      the drops involved user mappings.  This addition enables that to work
      again.  Naturally, pg_get_object_address can work with these objects
      now, too.
      
      I toyed with the idea of removing DropUserMappingStmt as a node and
      using DropStmt instead in the DropUserMappingStmt grammar production,
      but that didn't go very well: for one thing the messages thrown by the
      specific code are specialized (you get "server not found" if you specify
      the wrong server, instead of a generic "user mapping for ... not found"
      which you'd get it we were to merge this with RemoveObjects --- unless
      we added even more special cases).  For another thing, it would require
      to pass RoleSpec nodes through the objname/objargs representation used
      by RemoveObjects, which works in isolation, but gets messy when
      pg_get_object_address is involved.  So I dropped this part for now.
      
      Reviewed by Stephen Frost.
      890192e9
    • Peter Eisentraut's avatar
      PL/Python: Avoid lossiness in float conversion · 1ce7a57c
      Peter Eisentraut authored
      PL/Python uses str() to convert Python values back to PostgreSQL, but
      str() is lossy for float values, so use repr() instead in that case.
      
      Author: Marko Kreen <markokr@gmail.com>
      1ce7a57c
    • Robert Haas's avatar
      Require non-NULL pstate for all addRangeTableEntryFor* functions. · bc93ac12
      Robert Haas authored
      Per discussion, it's better to have a consistent coding rule here.
      
      Michael Paquier, per a node from Greg Stark referencing an old post
      from Tom Lane.
      bc93ac12
    • Tom Lane's avatar
      Make operator precedence follow the SQL standard more closely. · c6b3c939
      Tom Lane authored
      While the SQL standard is pretty vague on the overall topic of operator
      precedence (because it never presents a unified BNF for all expressions),
      it does seem reasonable to conclude from the spec for <boolean value
      expression> that OR has the lowest precedence, then AND, then NOT, then IS
      tests, then the six standard comparison operators, then everything else
      (since any non-boolean operator in a WHERE clause would need to be an
      argument of one of these).
      
      We were only sort of on board with that: most notably, while "<" ">" and
      "=" had properly low precedence, "<=" ">=" and "<>" were treated as generic
      operators and so had significantly higher precedence.  And "IS" tests were
      even higher precedence than those, which is very clearly wrong per spec.
      
      Another problem was that "foo NOT SOMETHING bar" constructs, such as
      "x NOT LIKE y", were treated inconsistently because of a bison
      implementation artifact: they had the documented precedence with respect
      to operators to their right, but behaved like NOT (i.e., very low priority)
      with respect to operators to their left.
      
      Fixing the precedence issues is just a small matter of rearranging the
      precedence declarations in gram.y, except for the NOT problem, which
      requires adding an additional lookahead case in base_yylex() so that we
      can attach a different token precedence to NOT LIKE and allied two-word
      operators.
      
      The bulk of this patch is not the bug fix per se, but adding logic to
      parse_expr.c to allow giving warnings if an expression has changed meaning
      because of these precedence changes.  These warnings are off by default
      and are enabled by the new GUC operator_precedence_warning.  It's believed
      that very few applications will be affected by these changes, but it was
      agreed that a warning mechanism is essential to help debug any that are.
      c6b3c939
    • 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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