aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #23086 from kamipo/deprecate_insert_update_delete_sqlRafael França2016-03-021-0/+3
|\ | | | | Deprecate `{insert|update|delete}_sql` in `DatabaseStatements`
| * Deprecate `{insert|update|delete}_sql` in `DatabaseStatements`Ryuta Kamizono2016-03-021-0/+3
| | | | | | | | | | Originally, `{insert|update|delete}_sql` is protected methods. We can use the `{insert|update|delete}` public methods instead.
* | remove trailing whitespace.Yves Senn2016-03-021-1/+1
| |
* | Remove not needed `exec_insert` in mysql2 adapterRyuta Kamizono2016-03-021-4/+0
|/ | | | Simply it is sufficient to use the method in the super class.
* Merge pull request #23961 from ↵Rafael França2016-03-013-8/+8
|\ | | | | | | | | kamipo/exclude_name_and_type_from_prepare_column_options Exclude `:name` and `:type` from `prepare_column_options`
| * Exclude `:name` and `:type` from `prepare_column_options`Ryuta Kamizono2016-02-293-8/+8
| | | | | | | | Actually `:name` and `:type` are not column options.
* | Merge pull request #23953 from ↵Rafael França2016-03-011-1/+1
|\ \ | | | | | | | | | | | | kamipo/fix_tests_failure_with_prepared_statements_false Fix tests failure with `prepared_statements: false`
| * | Fix `NoMethodError: undefined method `preparable'`Ryuta Kamizono2016-02-291-1/+1
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The error occurs with `prepared_statements: false`: ``` $ ARCONN=postgresql bundle exec ruby -w -Itest test/cases/associations_test.rb Using postgresql Run options: --seed 27753 ...E.................................... Finished in 0.713115s, 56.0919 runs/s, 91.1494 assertions/s. 1) Error: AssociationsTest#test_force_reload_is_uncached: NoMethodError: undefined method `preparable' for #<Arel::Visitors::PostgreSQL:0x007f8699702570> /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:68:in `block in select_all' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:83:in `cache_sql' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:68:in `select_all' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/querying.rb:39:in `find_by_sql' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/relation.rb:699:in `exec_queries' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/association_relation.rb:32:in `exec_queries' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/relation.rb:580:in `load' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/relation.rb:260:in `records' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/relation.rb:256:in `to_a' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/associations/collection_association.rb:458:in `get_records' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/associations/collection_association.rb:473:in `find_target' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/associations/collection_association.rb:412:in `load_target' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/associations/collection_proxy.rb:45:in `load_target' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/associations/collection_proxy.rb:983:in `records' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/relation/delegation.rb:39:in `each' test/cases/associations_test.rb:116:in `block (2 levels) in test_force_reload_is_uncached' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:32:in `cache' /Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' test/cases/associations_test.rb:115:in `block in test_force_reload_is_uncached' /Users/kamipo/src/github.com/rails/rails/activesupport/lib/active_support/deprecation/reporting.rb:36:in `silence' /Users/kamipo/src/github.com/rails/rails/activesupport/lib/active_support/deprecation/instance_delegator.rb:19:in `silence' test/cases/associations_test.rb:114:in `test_force_reload_is_uncached' ```
* | Merge pull request #23954 from kamipo/fix_undefined_method_fieldsRafael França2016-03-011-1/+1
|\ \ | | | | | | Fix `NoMethodError: undefined method `fields' for nil:NilClass`
| * | Fix `NoMethodError: undefined method `fields' for nil:NilClass`Ryuta Kamizono2016-02-291-1/+1
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently `exec_query` raises `NoMethodError` when executing no result queries (`INSERT`, `UPDATE`, `DELETE`, and all DDL) in mysql2 adapter. ``` irb(main):002:0> conn.execute("create table t(a int)") (43.3ms) create table t(a int) => nil irb(main):003:0> conn.execute("insert into t values (1)") (19.3ms) insert into t values (1) => nil irb(main):004:0> conn.exec_query("insert into t values (1)") SQL (28.6ms) insert into t values (1) NoMethodError: undefined method `fields' for nil:NilClass ```
* | Merge pull request #23807 from matthewd/executorMatthew Draper2016-03-022-20/+0
|\ \ | | | | | | Publish AS::Executor and AS::Reloader APIs
| * | Publish AS::Executor and AS::Reloader APIsMatthew Draper2016-03-022-20/+0
| |/ | | | | | | | | | | These should allow external code to run blocks of user code to do "work", at a similar unit size to a web request, without needing to get intimate with ActionDipatch.
* | Merge pull request #22170 from ↵Matthew Draper2016-03-022-14/+42
|\ \ | |/ |/| | | | | samphilipd/sam/properly_deallocate_prepared_statements_outside_of_transaction Correctly deallocate prepared statements if we fail inside a transaction
| * Correctly deallocate prepared statements if we fail inside a transactionSam Davies2015-11-052-14/+42
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - 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.
* | Merge pull request #22748 from Azzurrio/masterMatthew Draper2016-02-221-1/+1
|\ \ | | | | | | Fix NoMethodError preparable for Arel::Visitors::PostgreSQL
| * | Fix NoMethodError preparable for Arel::Visitors in case prepared statements ↵Azzurrio2016-02-221-1/+1
| | | | | | | | | | | | is falsy
* | | Merge pull request #23769 from kamipo/remove_alias_exec_without_stmt_exec_querySantiago Pastorino2016-02-211-2/+0
|\ \ \ | | | | | | | | Remove `alias exec_without_stmt exec_query`
| * | | Remove `alias exec_without_stmt exec_query`Ryuta Kamizono2016-02-191-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This alias was for compatibility with legacy mysql adapter. But the return value of both methods is already inconsistent. `exec_query` returns `ActiveRecord::Result` instance. But `exec_without_stmt` returns `[result_set, affected_rows]` https://github.com/rails/rails/blob/v4.2.5.1/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L335-L364 Legacy mysql adapter was already removed in Rails 5.0. I think we can remove this inconsistent alias.
* | | | eliminate warnings about multiple primary keys on habtm join tablesAaron Patterson2016-02-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | habtm join tables commonly have two id columns and it's OK to make those two id columns a primary key. This commit eliminates the warnings for join tables that have this setup. ManageIQ/manageiq#6713
* | | | Merge pull request #23525 from kamipo/remove_unused_requireSean Griffin2016-02-181-1/+0
|\ \ \ \ | |/ / / |/| | | Remove unused require
| * | | Remove unused requireRyuta Kamizono2016-02-061-1/+0
| | | | | | | | | | | | | | | | | | | | `require 'active_support/core_ext/benchmark'` was added by 4ecdf24. But currently unused anymore.
* | | | Remove needless `case_insensitive_comparison` in mysql2 adapterRyuta Kamizono2016-02-172-7/+4
| | | | | | | | | | | | | | | | Simply it is sufficient to override `can_perform_case_insensitive_comparison_for?`.
* | | | Let t.foreign_key use the same `to_table` twiceGeorge Millo2016-02-151-2/+2
| |/ / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously if you used `t.foreign_key` twice within the same `create_table` block using the same `to_table`, all statements except the final one would fail silently. For example, the following code: def change create_table :flights do |t| t.integer :from_id, index: true, null: false t.integer :to_id, index: true, null: false t.foreign_key :airports, column: :from_id t.foreign_key :airports, column: :to_id end end Would only create one foreign key, on the column `from_id`. This commit allows multiple foreign keys to the same table to be created within one `create_table` block.
* | | Ensure prepared statement caching still occurs with Adequate RecordSean Griffin2016-02-112-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In Rails 5, we're much more restrictive about when we do or don't cache a prepared statement. In particular, we never cache when we are sending an IN statement or a SQL string literal However, in the case of Adequate Record, we are *always* sending a raw SQL string, and we *always* want to cache the result. Fixes #23507 /cc @tgxworld
* | | Add numeric type in the doc [ci skip]Ryuta Kamizono2016-02-081-3/+3
| | | | | | | | | | | | Follow up to #23508.
* | | Merge pull request #23547 from kamipo/schema_type_returns_symbolSean Griffin2016-02-073-8/+8
|\ \ \ | | | | | | | | `schema_type` returns symbol rather than string
| * | | `schema_type` returns symbol rather than stringRyuta Kamizono2016-02-083-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A return value of `schema_type` is used by: 1. primary key type: using as `symbol.inspect` 2. normal column type: using as `symbol.to_s` It is better to return symbol.
* | | | Merge pull request #23508 from meinac/add_numeric_type_into_migrationsSean Griffin2016-02-071-0/+2
|\ \ \ \ | |/ / / |/| | | Added numeric helper into `SchemaStatements` for MySQL and PostgreSQL
| * | | Added numeric helper into migrations.Mehmet Emin İNAÇ2016-02-071-0/+2
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With this addition, you can add a column into the table like: ``` create_table(:numeric_types) do |t| t.numeric :foo, precision: 10, scale: 2, default: 2.0 end ``` The result of the migration above is same with: ``` create_table(:numeric_types) do |t| t.decimal :foo, precision: 10, scale: 2, default: 2.0 end ```
* / / MariaDB does not support JSON typeRyuta Kamizono2016-02-061-1/+1
|/ / | | | | | | Fixes #22980.
* | Remove the assumption of schema in DATABASE_URLJeremy Baker2016-02-041-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If you set the DATABASE_URL environment variable to `mydatabase` by accident, you end up getting a series of errors that are hard to trace. For example: ``` warning: already initialized constant ActiveRecord::Base::OrmAdapter ``` Turns out the cascade of errors is due to the error raised by `.tr` being called on `nil`. This commit makes sure that `scheme` is set before calling `.tr` on it. My previous iteration used `@uri.scheme.try(:tr, '-', '_')` but using the `&&` logical operator is a fair bit faster: http://stackoverflow.com/questions/26655032/try-vs-performance With this change, the error message becomes much more understandable: ``` FATAL: database "mydatabase" does not exist (ActiveRecord::NoDatabaseError) ```
* | Merge pull request #23460 from ↵Sean Griffin2016-02-031-1/+1
|\ \ | | | | | | | | | | | | kamipo/innodb_supports_fulltext_and_spatial_indexes InnoDB supports FULLTEXT and Spatial Indexes [ci skip]
| * | InnoDB supports FULLTEXT and Spatial Indexes [ci skip]Ryuta Kamizono2016-02-041-1/+1
| | | | | | | | | | | | | | | https://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html https://dev.mysql.com/doc/refman/5.7/en/creating-spatial-indexes.html
* | | Merge pull request #23458 from kamipo/activerecord_supports_mysql_5.0_and_upSean Griffin2016-02-031-10/+7
|\ \ \ | | | | | | | | Active Record supports MySQL >= 5.0
| * | | Active Record supports MySQL >= 5.0Ryuta Kamizono2016-02-041-10/+7
| |/ / | | | | | | | | | | | | Currently some features uses `information_schema` (e.g. foreign key support). `information_schema` introduced since MySQL 5.0.
* / / SQLite 2 support has been dropped [ci skip]Ryuta Kamizono2016-02-042-3/+0
|/ /
* | Mention supported PG version in the error message.Prathamesh Sonpatki2016-02-031-1/+1
| |
* | The minimum supported version of PostgreSQL is now >= 9.1Remo Mueller2016-02-021-3/+2
| |
* | Fix corrupt transaction state caused by `before_commit` exceptionsJeremy Daer2016-02-011-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a `before_commit` callback raises, the database is rolled back but AR's record of the current transaction is not, leaving the connection in a perpetually broken state that affects all future users of the connection: subsequent requests, jobs, etc. They'll think a transaction is active when none is, so they won't BEGIN on their own. This manifests as missing `after_commit` callbacks and broken ROLLBACKs. This happens because `before_commit` callbacks fire before the current transaction is popped from the stack, but the exception-handling path they hit assumes that the current transaction was already popped. So the database ROLLBACK is issued, but the transaction stack is left intact. Common cause: deadlocked `#touch`, which is now implemented with `before_commit` callbacks. What's next: * We shouldn't allow active transaction state when checking in or out from the connection pool. Verify that conns are clean. * Closer review of txn manager sad paths. Are we missing other spots where we'd end up with incorrect txn state? What's the worst that can happen if txn state drifts? How can we guarantee it doesn't and contain the fallout if it does? Thanks for @tomafro for expert diagnosis!
* | Avoid extra `show variables` in migrationRyuta Kamizono2016-02-012-8/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | `initialize_schema_migrations_table` is called in every migrations. https://github.com/rails/rails/blob/v5.0.0.beta1/activerecord/lib/active_record/migration.rb#L1080 https://github.com/rails/rails/blob/v5.0.0.beta1/activerecord/lib/active_record/schema.rb#L51 This means that extra `show variables` is called regardless of the existence of `schema_migrations` table. This change is to avoid extra `show variables` if `schema_migrations` table exists.
* | Extract `ExplainPrettyPrinter` to appropriate filesRyuta Kamizono2016-02-017-119/+137
| |
* | `OID::Money.precision` is unused since #15239Ryuta Kamizono2016-01-312-8/+0
| | | | | | | | | | | | | | | | p PostgreSQLAdapter::OID::Money.precision # => 19 p PostgreSQLAdapter::OID::Money.new.precision # => nil
* | Revert "Merge pull request #23346 from kamipo/refactor_oid_money_precision"Rafael Mendonça França2016-01-302-5/+9
| | | | | | | | | | | | | | This reverts commit ff835f90800a3e4122d64606cb328908c2e0e071, reversing changes made to c4d85dfbc71043e2a746acd310e32f4f04db801a. Reason: This broke the tests. We will add back after investigated.
* | Merge pull request #23345 from ↵Rafael França2016-01-301-0/+6
|\ \ | | | | | | | | | | | | yui-knk/warning_when_composite_primary_key_is_detected Warn if `AR.primary_key` is called for a table who has composite prim…
| * | Warn if `AR.primary_key` is called for a table who has composite primary keyyui-knk2016-01-301-0/+6
| | | | | | | | | | | | | | | | | | | | | | | | If `AR.primary_key` is called for a table who has composite primary key, the method returns `nil`. This behavior sometimes generates invalid SQL. The first time developers notice to invalid SQL is when they execute SQL. This commit enables developers to know they are doing something dangerous as soon as possible.
* | | Merge pull request #23349 from kamipo/refactor_column_existsRafael França2016-01-301-7/+8
|\ \ \ | | | | | | | | Refactor `column_exists?` in `SchemaStatements`
| * | | Refactor `column_exists?` in `SchemaStatements`Ryuta Kamizono2016-01-301-7/+8
| |/ /
* | | Merge pull request #23355 from kamipo/fix_bigint_for_enum_columnsRafael França2016-01-301-1/+1
|\ \ \ | | | | | | | | Fix `bigint?` for Enum columns in MySQL
| * | | Fix `bigint?` for Enum columns in MySQLRyuta Kamizono2016-01-311-1/+1
| |/ / | | | | | | | | | Follow up to #22896.
* | | Merge pull request #23353 from ↵Rafael França2016-01-301-6/+0
|\ \ \ | | | | | | | | | | | | | | | | kamipo/remove_unused_lost_connection_error_messages Remove unused `LOST_CONNECTION_ERROR_MESSAGES`