1. 24 4月, 2016 1 次提交
  2. 20 4月, 2016 1 次提交
  3. 19 4月, 2016 1 次提交
  4. 16 4月, 2016 1 次提交
  5. 04 4月, 2016 1 次提交
  6. 09 3月, 2016 1 次提交
  7. 06 2月, 2016 1 次提交
  8. 03 2月, 2016 2 次提交
  9. 01 2月, 2016 1 次提交
  10. 31 1月, 2016 2 次提交
  11. 30 1月, 2016 1 次提交
  12. 15 1月, 2016 1 次提交
  13. 13 1月, 2016 1 次提交
  14. 30 12月, 2015 1 次提交
    • D
      Make `postgresql_version` public · 8ad1eeaf
      Derek Prior 提交于
      This is useful to libraries that want to feature gate based on the
      version of PostgreSQL the user is connected to. For instance, I want to
      know if the user is connected to a version of Postgres that supports
      concurrent materialized view refreshes. I could add that as a method on
      the adapter as a PR, but rails has no need for this itself.
      
      Rails is already using the postgresql_version for its own feature gating
      and this makes that possible for other libraries.
      8ad1eeaf
  15. 18 12月, 2015 1 次提交
  16. 30 11月, 2015 1 次提交
  17. 24 11月, 2015 1 次提交
  18. 18 11月, 2015 1 次提交
    • S
      Rename 'key' to 'lock_id' or 'lock_name' for advisory locking · 5ce21d4f
      Sam Davies 提交于
      - key was a poor choice of name. A key implies something that will
        unlock a lock. The concept is actually more like a 'lock identifier'
      - mysql documentation calls this a 'lock name'
      - postgres documentation calls it a 'lock_id'
      - Updated variable names to reflect the preferred terminology for the database in
        question
      5ce21d4f
  19. 16 11月, 2015 1 次提交
  20. 08 11月, 2015 1 次提交
  21. 06 11月, 2015 1 次提交
    • S
      Correctly deallocate prepared statements if we fail inside a transaction · 50c53340
      Sam Davies 提交于
      - Addresses issue #12330
      
      Overview
      ========
      
      Cached postgres prepared statements become invalidated if the schema
      changes in a way that it affects the returned result.
      
      Examples:
      - adding or removing a column then doing a 'SELECT *'
      - removing the foo column  then doing a 'SELECT bar.foo'
      
      In normal operation this isn't a problem, we can rescue the error,
      deallocate the prepared statement and re-issue the command.
      
      However in PostgreSQL transactions, once any command fails, the
      transaction becomes 'poisoned' and any subsequent commands will raise
      InFailedSQLTransaction.
      
      This includes DEALLOCATE statements, so the default deallocation
      strategy instead of removing the cached prepared statement instead
      raises InFailedSQLTransaction.
      
      Why this is bad
      ===============
      
      1. InFailedSQLTransaction is a fairly cryptic error and doesn't
      communicate any useful information about what has actually gone wrong.
      2. In the naive implementation the prepared statement never gets
      deallocated - it stays alive for the length of the session taking up
      memory on the postgres server.
      3. It is unsafe to retry the transaction because the bad prepared
      statement is still in the cache and we would see the exact same failure
      repeated.
      
      Solution
      ========
      
      If we are outside a transaction we can continue to handle these failures
      gracefully in the usual way.
      
      Inside a transaction instead of issuing a DEALLOCATE command that will
      certainly fail, we now raise
      ActiveRecord::PreparedStatementCacheExpired.
      
      This can be handled further up the stack, notably inside
      TransactionManager#within_new_transaction. Here we can make sure to
      first rollback the transaction, then safely issue DEALLOCATE statements
      to invalidate the rest of the cached prepared statements.
      
      This also allows the user (or some gem) the opportunity to catch this error and
      voluntarily retry the transaction if a schema change causes the prepared
      statement cache to become invalidated.
      
      Because the outdated statement has been deallocated, we can expect the
      transaction to succeed on the second try.
      50c53340
  22. 03 11月, 2015 1 次提交
  23. 31 10月, 2015 1 次提交
    • S
      Use advisory locks to prevent concurrent migrations · 2c2a8755
      Sam Davies 提交于
      - Addresses issue #22092
      - Works on Postgres and MySQL
      - Uses advisory locks because of two important properties:
        1. The can be obtained outside of the context of a transaction
        2. They are automatically released when the session ends, so if a
        migration process crashed for whatever reason the lock is not left
        open perpetually
      - Adds get_advisory_lock and release_advisory_lock methods to database
        adapters
      - Attempting to run a migration while another one is in process will
        raise a ConcurrentMigrationError instead of attempting to run in
        parallel with undefined behavior. This could be rescued and
        the migration could exit cleanly instead. Perhaps as a configuration
        option?
      
      Technical Notes
      ==============
      
      The Migrator uses generate_migrator_advisory_lock_key to build the key
      for the lock. In order to be compatible across multiple adapters there
      are some constraints on this key.
      - Postgres limits us to 64 bit signed integers
      - MySQL advisory locks are server-wide so we have to scope to the
        database
      - To fulfil these requirements we use a Migrator salt (a randomly
        chosen signed integer with max length of 31 bits) that identifies
        the Rails migration process as the owner of the lock. We multiply
        this salt with a CRC32 unsigned integer hash of the database name to
        get a signed 64 bit integer that can also be converted to a string
        to act as a lock key in MySQL databases.
      - It is important for subsequent versions of the Migrator to use the
        same salt, otherwise different versions of the Migrator will not see
        each other's locks.
      2c2a8755
  24. 30 10月, 2015 1 次提交
  25. 29 10月, 2015 2 次提交
    • H
      Check standard_conforming_strings is not readonly · d05bfa82
      Harry Marr 提交于
      In Postgres 8.1 the standard_conforming_strings setting was read-only,
      meaning you got an error if you tried to update it. By filtering on
      `context = 'user'` we only try to update the setting if it's
      user-writable[1].
      
      [1]: http://www.postgresql.org/docs/9.4/static/view-pg-settings.html
      d05bfa82
    • H
      Avoid disabling postgres errors · a456acb2
      Harry Marr 提交于
      The standard_conforming_strings setting doesn't exist on all versions of
      Postgres, but if it does exist, Rails turns it on. Previously this was done by
      effectively disabling errors on the Postgres connection, issuing a SET to turn
      the setting on, then re-enabling errors on the connection. However, if you're
      running pgbouncer in transaction-pooling mode, you can't guarantee that
      successive calls to `#execute` will be sent to the same pgbouncer-postgres
      connection, so you can end up disabling errors on a different postgres
      connection, and never re-enabling them. Future queries on that connection that
      result in errors (e.g. violating unique constraints) will leave the connection
      in a bad state where successive queries will fail.
      
      This commit sets standard_conforming_strings by issuing an UPDATE to
      pg_settings, which will update the setting if it exists, and do nothing if it
      doesn't (rather than erroring out like SET would), which means we can remove
      the error-disabling code.
      
      It's also worth noting that Postgres has allowed standard_conforming_strings to
      be updated since 8.2 (which is the oldest version Rails supports), so
      technically we probably don't even need to be defensive here.
      a456acb2
  26. 21 10月, 2015 1 次提交
    • S
      Do not cache prepared statements that are unlikely to have cache hits · cbcdecd2
      Sean Griffin 提交于
      Prior to this commit, Rails makes no differentiation between whether a
      query uses bind parameters, and whether or not we cache that query as a
      prepared statement. This leads to the cache populating extremely fast in
      some cases, with the statements never being reused.
      
      In particular, the two problematic cases are `where(foo: [1, 2, 3])` and
      `where("foo = ?", 1)`. In both cases we'll end up quoting the values
      rather than using a bind param, causing a cache entry for every value
      ever used in that query.
      
      It was noted that we can probably eventually change `where("foo = ?",
      1)` to use a bind param, which would resolve that case. Additionally, on
      PG we can change our generated query to be `WHERE foo = ANY($1)`, and
      pass an array for the bind param. I hope to accomplish both in the
      future.
      
      For SQLite and MySQL, we still end up preparing the statements anyway,
      we just don't cache it. The statement will be cleaned up after it is
      executed. On postgres, we skip the prepare step entirely, as an API is
      provided to execute with bind params without preparing the statement.
      
      I'm not 100% happy on the way this ended up being structured. I was
      hoping to use a decorator on the visitor, rather than mixing a module
      into the object, but the way Arel has it's visitor pattern set up makes
      it very difficult to extend without inheritance. I'd like to remove the
      duplication from the various places that are extending it, but that'll
      require a larger restructuring of that initialization logic. I'm going
      to take another look at the structure of it soon.
      
      This changes the signature of one of the adapter's internals, and will
      require downstream changes from third party adapters. I'm not too
      worried about this, as worst case they can simply add the parameter and
      always ignore it, and just keep their previous behavior.
      
      Fixes #21992.
      cbcdecd2
  27. 14 10月, 2015 1 次提交
    • Y
      applies new doc guidelines to Active Record. · 428d47ad
      Yves Senn 提交于
      The focus of this change is to make the API more accessible.
      References to method and classes should be linked to make it easy to
      navigate around.
      
      This patch makes exzessiv use of `rdoc-ref:` to provide more readable
      docs. This makes it possible to document `ActiveRecord::Base#save` even
      though the method is within a separate module
      `ActiveRecord::Persistence`. The goal here is to bring the API closer to
      the actual code that you would write.
      
      This commit only deals with Active Record. The other gems will be
      updated accordingly but in different commits. The pass through Active
      Record is not completely finished yet. A follow up commit will change
      the spots I haven't yet had the time to update.
      
      /cc @fxn
      428d47ad
  28. 13 10月, 2015 1 次提交
  29. 21 9月, 2015 1 次提交
  30. 20 9月, 2015 1 次提交
  31. 22 8月, 2015 1 次提交
    • S
      JSON is still an adapter specific type. · ffc4710c
      Sean Griffin 提交于
      Several changes were made in #21110 which I am strongly opposed to.
      (this is what I get for going on vacation. :trollface:) No type should
      be introduced into the generic `ActiveRecord::Type` namespace, and
      *certainly* should not be registered into the registry unconstrained
      unless it is supported by *all* adapters (which basically means that it
      was specified in the ANSI SQL standard).
      
      I do not think `# :nodoc:` ing the type is sufficient, as it still makes
      the code of Rails itself very unclear as to what the role of that class
      is. While I would argue that this shouldn't even be a super class, and
      that MySql and PG's JSON types are only superficially duplicated (they
      might look the same but will change for different reasons in the
      future).
      
      However, I don't feel strongly enough about it as a point of contention
      (and the biggest cost of harming the blameability has already occured),
      so I simply moved the superclass into a namespace where its role is
      absolutely clear.
      
      After this change, `attribute :foo, :json` will once again work with
      MySQL and PG, but not with Sqlite3 or any third party adapters.
      
      Unresolved questions
      --------------------
      
      The types that and adapter publishes (at least those are unique to that
      adapter, and not adding additional behavior like `MysqlString` should
      probably be part of the adapter's public API. Should we standardize the
      namespace for these, and document them?
      ffc4710c
  32. 18 8月, 2015 1 次提交
  33. 05 6月, 2015 1 次提交
    • S
      Return a `Point` object from the PG Point type · 9f4a3fd7
      Sean Griffin 提交于
      This introduces a deprecation cycle to change the behavior of the
      default point type in the PostgreSQL adapter. The old behavior will
      continue to be available for the immediate future as `:legacy_point`.
      
      The current behavior of returning an `Array` causes several problems,
      the most significant of which is that we cannot differentiate between an
      array of points, and a point itself in the case of a column with the
      `point[]` type.
      
      The attributes API gives us a reasonable way to have a proper
      deprecation cycle for this change, so let's take advantage of it. If we
      like this change, we can also add proper support for the other geometric
      types (line, lseg, box, path, polygon, and circle), all of which are
      just aliases for string today.
      
      Fixes #20441
      9f4a3fd7
  34. 20 5月, 2015 3 次提交
  35. 05 5月, 2015 1 次提交