| Commit message (Collapse) | Author | Age | Files | Lines |
|\
| |
| | |
No need to extract a limit for a boolean type
|
| | |
|
|\ \
| | |
| | |
| | |
| | | |
Conflicts:
guides/source/association_basics.md
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
As shown below, we should use <tt>...</tt> for string literal
```
$ echo "+'id'+" | rdoc --pipe
<p>+'id'+</p>
$ echo "<tt>'id'</tt>" | rdoc --pipe
<p><code>'id'</code></p>
```
|
| | |
| | |
| | |
| | | |
[ci skip]
|
| | |
| | |
| | |
| | | |
Follow up to #22543.
|
|\ \ \
| | | |
| | | | |
chage `date_time` type ` to `datetime`
|
| | | |
| | | |
| | | |
| | | | |
Since we are using `datetime` in migration, better to use `datetime` is I think that confusion is less.
|
|/ / /
| | |
| | |
| | | |
There is a need to pass the keyword arguments to `attribute` method.
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | | |
Currently use minitest mock, mocha is not used.
|
| | |
| | |
| | |
| | |
| | | |
Introduce a predicate method that doesn't need to build a scope chain,
but also hides the data structure used for representing the scope chain.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
We know a reflection can be considered as `nested?` if the source
reflection or the through reflection are also through reflections (since
the through reflection will also add another join table). This allows
us to avoid traversing the entire reflection tree just to calculate whether or
not there will be more join tables.
|
| | | |
|
| |/
|/|
| |
| |
| |
| |
| |
| |
| |
| | |
Closes #23934.
This is a forward port of ac832a43b4d026dbad28fed196d2de69ec9928ac
Previously the scope of all associations with extensions were wrapped in
an instance dependent proc. This made it impossible to preload such
associations.
|
| |
| |
| |
| |
| |
| |
| |
| | |
See the end of [this] page.
[ci skip]
[this]: http://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-create
|
|\ \
| | |
| | | |
Deprecate `{insert|update|delete}_sql` in `DatabaseStatements`
|
| | |
| | |
| | |
| | |
| | | |
Originally, `{insert|update|delete}_sql` is protected methods.
We can use the `{insert|update|delete}` public methods instead.
|
| | | |
|
| | | |
|
|/ /
| |
| |
| | |
Simply it is sufficient to use the method in the super class.
|
|\ \
| | |
| | | |
Remove load_paths file
|
| | | |
|
| | | |
|
|\ \ \
| | | |
| | | | |
Add a test for primary key should be not null
|
| |/ / |
|
|\ \ \
| | | |
| | | |
| | | |
| | | | |
kamipo/exclude_name_and_type_from_prepare_column_options
Exclude `:name` and `:type` from `prepare_column_options`
|
| |/ /
| | |
| | |
| | | |
Actually `:name` and `:type` are not column options.
|
|\ \ \
| | | |
| | | |
| | | |
| | | | |
kamipo/fix_tests_failure_with_prepared_statements_false
Fix tests failure with `prepared_statements: false`
|
| | | | |
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Some tests does not work for unprepared statements.
Add `if ActiveRecord::Base.connection.prepared_statements` and fix a
regex for fix tests failure with `prepared_statements: false`.
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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'
```
|
|\ \ \
| | | |
| | | | |
Fix `NoMethodError: undefined method `fields' for nil:NilClass`
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
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
```
|
|\ \ \
| | | |
| | | |
| | | | |
Add option to error on ignored order or limit
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
ignored in batches
add some documentation and add 4 tests regarding error vs. warning behavior
fix a typo when referring to the message
go back to default in tests so that ordering is not important. use a constant instead of method. fix assert_nothing_raised call. use self.klass to allow per class configuration
remove logger warn assets as that is tested elsewhere. pass error_on_ignore through find_each and find_in_batches also.
add blocks to the finds so that the code is actually executed
put the setting back to default in an ensure
Add a changelog entry
|
|\ \ \ \
| | | | |
| | | | | |
Publish AS::Executor and AS::Reloader APIs
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
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.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
ActiveRecord #second_to_last tests and finder methods
|
| | | | | | |
|
| | | | | | |
|
| | | | | | |
|
| | | | | | |
|
| | | | | | |
|
| | |_|/ /
| |/| | | |
|
|\ \ \ \ \
| |_|/ / /
|/| | | |
| | | | |
| | | | | |
samphilipd/sam/properly_deallocate_prepared_statements_outside_of_transaction
Correctly deallocate prepared statements if we fail inside a transaction
|
| | | | | |
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
- 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.
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
When the `source_type` option is passed to a has_many through, the
resulting `Reflection` will be an instance of `PolymorphicReflection`
and not `ThroughReflection`, meaning that it will ignore the scopes that
it needs to apply from the through reflections. This adds an additional
delegation call to remedy this. I've been finding the reflection code
completely impenetrable lately, it could use some major love.
Fixes #22726
|