1. 27 4月, 2008 1 次提交
    • T
      Back-patch Heikki's fix to make TransactionIdIsCurrentTransactionId() use · f7288cde
      Tom Lane 提交于
      binary search instead of linear search when checking child-transaction XIDs.
      Per example from Robert Treat, the speed of TransactionIdIsCurrentTransactionId
      is significantly more important in 8.3 than it was in prior releases, so
      this seems worth taking back-patching risk for.
      f7288cde
  2. 25 4月, 2008 1 次提交
    • T
      Fix ALTER TABLE ADD COLUMN ... PRIMARY KEY so that the new column is correctly · 701e71cf
      Tom Lane 提交于
      checked to see if it's been initialized to all non-nulls.  The implicit NOT
      NULL constraint was not being checked during the ALTER (in fact, not even if
      there was an explicit NOT NULL too), because ATExecAddColumn neglected to
      set the flag needed to make the test happen.  This has been broken since
      the capability was first added, in 8.0.
      
      Brendan Jurd, per a report from Kaloyan Iliev.
      701e71cf
  3. 23 4月, 2008 1 次提交
  4. 22 4月, 2008 2 次提交
    • M
      Replace developer FAQ with a reference to the wiki, which is where · cebc3c42
      Magnus Hagander 提交于
      it now lives (per discussion). Leave the other FAQs alone for now.
      cebc3c42
    • T
      Fix convert_IN_to_join to properly handle the case where the subselect's · 5f26db50
      Tom Lane 提交于
      output is not of the same type that's needed for the IN comparison (ie,
      where the parser inserted an implicit coercion above the subselect result).
      We should record the coerced expression, not just a raw Var referencing
      the subselect output, as the quantity that needs to be unique-ified if
      we choose to implement the IN as Unique followed by a plain join.
      
      As of 8.3 this error was causing crashes, as seen in bug #4113 from Javier
      Hernandez, because the executor was being told to hash or sort the raw
      subselect output column using operators appropriate to the coerced type.
      
      In prior versions there was no crash because the executor chose the
      hash or sort operators for itself based on the column type it saw.
      However, that's still not really right, because what's unique for one data
      type might not be unique for another.  In corner cases we could get multiple
      outputs of a row that should appear only once, as demonstrated by the
      regression test case included in this commit.
      
      However, this patch doesn't apply cleanly to 8.2 or before, and the code
      involved has shifted enough over time that I'm hesitant to try to back-patch.
      Given the lack of complaints from the field about such corner cases, I think
      the bug may not be important enough to risk breaking other things with a
      back-patch.
      5f26db50
  5. 21 4月, 2008 3 次提交
  6. 20 4月, 2008 1 次提交
    • T
      Fix broken compare function for tsquery_ops. Per Tom's report. · 254d66e2
      Teodor Sigaev 提交于
      I never understood why initial authors GiST in pgsql choose so
      stgrange signature for 'same' method:
      bool *sameFn(Datum a, Datum b, bool* result)
      instead of simple, logical
      bool sameFn(Datum a, Datum b)
      This change will break any existing GiST extension, so we still live with
      it and will live.
      254d66e2
  7. 19 4月, 2008 1 次提交
  8. 18 4月, 2008 2 次提交
    • H
      Fix two race conditions between the pending unlink mechanism that was put in · b8c58230
      Heikki Linnakangas 提交于
      place to prevent reusing relation OIDs before next checkpoint, and DROP
      DATABASE. First, if a database was dropped, bgwriter would still try to unlink
      the files that the rmtree() call by the DROP DATABASE command has already
      deleted, or is just about to delete. Second, if a database is dropped, and
      another database is created with the same OID, bgwriter would in the worst
      case delete a relation in the new database that happened to get the same OID
      as a dropped relation in the old database.
      
      To fix these race conditions:
      - make rmtree() ignore ENOENT errors. This fixes the 1st race condition.
      - make ForgetDatabaseFsyncRequests forget unlink requests as well.
      - force checkpoint on in dropdb on all platforms
      
      Since ForgetDatabaseFsyncRequests() is asynchronous, the 2nd change isn't
      enough on its own to fix the problem of dropping and creating a database with
      same OID, but forcing a checkpoint on DROP DATABASE makes it sufficient.
      
      Per Tom Lane's bug report and proposal. Backpatch to 8.3.
      b8c58230
    • T
      Fix a couple of oversights associated with the "physical tlist" optimization: · d64a5476
      Tom Lane 提交于
      we had several code paths where a physical tlist could be used for the input
      to a Sort node, which is a dumb idea because any unneeded table columns will
      increase the volume of data the sort has to push around.
      
      (Unfortunately the easy-looking fix of calling disuse_physical_tlist during
      make_sort_xxx doesn't work because in most cases we're already committed to
      the current input tlist --- it's been marked with sort column numbers, or
      we've built grouping column numbers using it, etc.  The tlist has to be
      selected properly at the calling level before we start constructing sort-col
      information.  This is easy enough to do, we were just failing to take the
      point into consideration.)
      
      Back-patch to 8.3.  I believe the problem probably exists clear back to 7.4
      when the physical tlist optimization was added, but I'm afraid to back-patch
      further than 8.3 without a great deal more study than I want to put into it.
      The code in this area has drifted a lot over time.  The real-world importance
      of these code paths is uncertain anyway --- I think in many cases we'd
      probably prefer hash-based methods.
      d64a5476
  9. 17 4月, 2008 2 次提交
    • T
      Repair two places where SIGTERM exit could leave shared memory state · d5249bb4
      Tom Lane 提交于
      corrupted.  (Neither is very important if SIGTERM is used to shut down the
      whole database cluster together, but there's a problem if someone tries to
      SIGTERM individual backends.)  To do this, introduce new infrastructure
      macros PG_ENSURE_ERROR_CLEANUP/PG_END_ENSURE_ERROR_CLEANUP that take care
      of transiently pushing an on_shmem_exit cleanup hook.  Also use this method
      for createdb cleanup --- that wasn't a shared-memory-corruption problem,
      but SIGTERM abort of createdb could leave orphaned files lying around.
      
      Backpatch as far as 8.2.  The shmem corruption cases don't exist in 8.1,
      and the createdb usage doesn't seem important enough to risk backpatching
      further.
      d5249bb4
    • T
      Fix LOAD_CRIT_INDEX() macro to take out AccessShareLock on the system index · 95b7a876
      Tom Lane 提交于
      it is trying to build a relcache entry for.  This is an oversight in my 8.2
      patch that tried to ensure we always took a lock on a relation before trying
      to build its relcache entry.  The implication is that if someone committed a
      reindex of a critical system index at about the same time that some other
      backend were starting up without a valid pg_internal.init file, the second one
      might PANIC due to not seeing any valid version of the index's pg_class row.
      Improbable case, but definitely not impossible.
      95b7a876
  10. 16 4月, 2008 2 次提交
  11. 12 4月, 2008 2 次提交
    • T
      A quick try at un-breaking the Cygwin build. Whether it needs the · 0b7afedb
      Tom Lane 提交于
      pgwin32_safestat remains to be determined, but in any case the current
      code is not tolerable.
      0b7afedb
    • T
      Fix several datatype input functions that were allowing unused bytes in their · 56295419
      Tom Lane 提交于
      results to contain uninitialized, unpredictable values.  While this was okay
      as far as the datatypes themselves were concerned, it's a problem for the
      parser because occurrences of the "same" literal might not be recognized as
      equal by datumIsEqual (and hence not by equal()).  It seems sufficient to fix
      this in the input functions since the only critical use of equal() is in the
      parser's comparisons of ORDER BY and DISTINCT expressions.
      Per a trouble report from Marc Cousin.
      
      Patch all the way back.  Interestingly, array_in did not have the bug before
      8.2, which may explain why the issue went unnoticed for so long.
      56295419
  12. 11 4月, 2008 1 次提交
  13. 10 4月, 2008 1 次提交
  14. 09 4月, 2008 1 次提交
  15. 05 4月, 2008 1 次提交
    • T
      Defend against JOINs having more than 32K columns altogether. We cannot · 5e8146c7
      Tom Lane 提交于
      currently support this because we must be able to build Vars referencing
      join columns, and varattno is only 16 bits wide.  Perhaps this should be
      improved in future, but considering that it never came up before, I'm not
      sure the problem is worth much effort.  Per bug #4070 from Marcello
      Ceschia.
      
      The problem seems largely academic in 8.0 and 7.4, because they have
      (different) O(N^2) performance issues with such wide joins, but
      back-patch all the way anyway.
      5e8146c7
  16. 04 4月, 2008 1 次提交
    • T
      Teach ANALYZE to distinguish dead and in-doubt tuples, which it formerly · affdd52d
      Tom Lane 提交于
      classed all as "dead"; also get it to count DEAD item pointers as dead rows,
      instead of ignoring them as before.  Also improve matters so that tuples
      previously inserted or deleted by our own transaction are handled nicely:
      the stats collector's live-tuple and dead-tuple counts will end up correct
      after our transaction ends, regardless of whether we end in commit or abort.
      
      While there's more work that could be done to improve the counting of in-doubt
      tuples in both VACUUM and ANALYZE, this commit is enough to alleviate some
      known bad behaviors in 8.3; and the other stuff that's been discussed seems
      like research projects anyway.
      
      Pavan Deolasee and Tom Lane
      affdd52d
  17. 03 4月, 2008 2 次提交
    • P
    • T
      Revert my bad decision of about a year ago to make PortalDefineQuery · ab2071b5
      Tom Lane 提交于
      responsible for copying the query string into the new Portal.  Such copying
      is unnecessary in the common code path through exec_simple_query, and in
      this case it can be enormously expensive because the string might contain
      a large number of individual commands; we were copying the entire, long
      string for each command, resulting in O(N^2) behavior for N commands.
      (This is the cause of bug #4079.)  A second problem with it is that
      PortalDefineQuery really can't risk error, because if it elog's before
      having set up the Portal, we will leak the plancache refcount that the
      caller is trying to hand off to the portal.  So go back to the design in
      which the caller is responsible for making sure everything is copied into
      the portal if necessary.
      ab2071b5
  18. 01 4月, 2008 2 次提交
    • T
      Fix an oversight I made in a cleanup patch over a year ago: · e3a47483
      Tom Lane 提交于
      eval_const_expressions needs to be passed the PlannerInfo ("root") structure,
      because in some cases we want it to substitute values for Param nodes.
      (So "constant" is not so constant as all that ...)  This mistake partially
      disabled optimization of unnamed extended-Query statements in 8.3: in
      particular the LIKE-to-indexscan optimization would never be applied if the
      LIKE pattern was passed as a parameter, and constraint exclusion depending
      on a parameter value didn't work either.
      e3a47483
    • T
      Apply my original fix for Taiki Yamaguchi's bug report about DISTINCT MAX(). · f82277c8
      Tom Lane 提交于
      Add some regression tests for plausible failures in this area.
      f82277c8
  19. 31 3月, 2008 1 次提交
    • T
      Fix a number of places that were making file-type tests infelicitously. · 793c5835
      Tom Lane 提交于
      The places that did, eg,
      	(statbuf.st_mode & S_IFMT) == S_IFDIR
      were correct, but there is no good reason not to use S_ISDIR() instead,
      especially when that's what the other 90% of our code does.  The places
      that did, eg,
      	(statbuf.st_mode & S_IFDIR)
      were flat out *wrong* and would fail in various platform-specific ways,
      eg a symlink could be mistaken for a regular file on most Unixen.
      
      The actual impact of this is probably small, since the problem cases
      seem to always involve symlinks or sockets, which are unlikely to be
      found in the directories that PG code might be scanning.  But it's
      clearly trouble waiting to happen, so patch all the way back anyway.
      (There seem to be no occurrences of the mistake in 7.4.)
      793c5835
  20. 29 3月, 2008 1 次提交
  21. 28 3月, 2008 1 次提交
    • T
      When we have successfully optimized a MIN or MAX aggregate into an indexscan, · 707867e9
      Tom Lane 提交于
      the query result must be exactly one row (since we don't do this when there's
      any GROUP BY).  Therefore any ORDER BY or DISTINCT attached to the query is
      useless and can be dropped.  Aside from saving useless cycles, this protects
      us against problems with matching the hacked-up tlist entries to sort clauses,
      as seen in a bug report from Taiki Yamaguchi.  We might need to work harder
      if we ever try to optimize grouped queries with this approach, but this
      solution will do for now.
      707867e9
  22. 26 3月, 2008 2 次提交
  23. 25 3月, 2008 3 次提交
  24. 22 3月, 2008 1 次提交
  25. 21 3月, 2008 2 次提交
  26. 20 3月, 2008 1 次提交
    • H
      Add the missing cyrillic "Yo" characters ('e' and 'E' with two dots) to the · 59c4fc5a
      Heikki Linnakangas 提交于
      ISO_8859-5 <-> MULE_INTERNAL conversion tables.
      
      This was discovered when trying to convert a string containing those characters
      from ISO_8859-5 to Windows-1251, because we use MULE_INTERNAL/KOI8R as an
      intermediate encoding between those two.
      
      While the missing "Yo" was just an omission in the conversion tables, there are
      a few other characters like the "Numero" sign ("No" as a single character) that
      exists in all the other cyrillic encodings (win1251, ISO_8859-5 and cp866), but
      not in KOI8R. Added comments about that.
      
      Patch by Sergey Burladyan. Back-patch to 7.4.
      59c4fc5a
  27. 19 3月, 2008 1 次提交
    • T
      Fix regexp substring matching (substring(string from pattern)) for the corner · 7c5fcbf4
      Tom Lane 提交于
      case where there is a match to the pattern overall but the user has specified
      a parenthesized subexpression and that subexpression hasn't got a match.
      An example is substring('foo' from 'foo(bar)?').  This should return NULL,
      since (bar) isn't matched, but it was mistakenly returning the whole-pattern
      match instead (ie, 'foo').  Per bug #4044 from Rui Martins.
      
      This has been broken since the beginning; patch in all supported versions.
      The old behavior was sufficiently inconsistent that it's impossible to believe
      anyone is depending on it.
      7c5fcbf4