| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
| |
This also reverts the change to enable prepared statements by default on
MySQL (though I suspect we could enable them and it'd be great). This
change brings back a collector closer to the old `Bind` collector in
Arel. However, this one lives in AR, since this is an AR specific need.
Additionally, we only use it for statement caching, since the new
substitute collector in Arel is higher performance for most cases.
|
|
|
|
|
|
| |
There's an actual bug in 213796fb4936dce1da2f0c097a054e1af5c25c2c around
prepared statements being disabled. I'm looking into it, but in the mean
time this gets the build green so it doesn't block other PRs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A common source of bugs and code bloat within Active Record has been the
need for us to maintain the list of bind values separately from the AST
they're associated with. This makes any sort of AST manipulation
incredibly difficult, as any time we want to potentially insert or
remove an AST node, we need to traverse the entire tree to find where
the associated bind parameters are.
With this change, the bind parameters now live on the AST directly.
Active Record does not need to know or care about them until the final
AST traversal for SQL construction. Rather than returning just the SQL,
the Arel collector will now return both the SQL and the bind parameters.
At this point the connection adapter will have all the values that it
had before.
A bit of this code is janky and something I'd like to refactor later. In
particular, I don't like how we're handling associations in the
predicate builder, the special casing of `StatementCache::Substitute` in
`QueryAttribute`, or generally how we're handling bind value replacement
in the statement cache when prepared statements are disabled.
This also mostly reverts #26378, as it moved all the code into a
location that I wanted to delete.
/cc @metaskills @yahonda, this change will affect the adapters
Fixes #29766.
Fixes #29804.
Fixes #26541.
Close #28539.
Close #24769.
Close #26468.
Close #26202.
There are probably other issues/PRs that can be closed because of this
commit, but that's all I could find on the first few pages.
|
|\
| |
| | |
Use `TRUE` and `FALSE` boolean literals for MySQL
|
| |
| |
| |
| |
| |
| | |
Since #29699, abstract boolean serialization has been changed to use
`TRUE` and `FALSE` literals. MySQL also support the literals.
So we can use the abstract boolean serialization even for MySQL.
|
|\ \
| | |
| | | |
Make `type_map` to private because it is only used in the connection adapter
|
| |/
| |
| |
| |
| |
| |
| | |
`type_map` is an internal API and it is only used in the connection
adapter. And also, some type map initializer methods requires passed
`type_map`, but those instances already has `type_map` in itself.
So we don't need explicit passing `type_map` to the initializers.
|
|/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Context #24542.
Since 8ebe1f2, it has lost stripping date part for a time value. But I
confirmed it is still needed even if MariaDB 10.2.6 GA.
MariaDB 10.2.6, `prepared_statements: true`:
```
% ARCONN=mysql2 be ruby -w -Itest test/cases/time_precision_test.rb -n test_formatting_time_according_to_precision
Using mysql2
Run options: -n test_formatting_time_according_to_precision --seed 37614
F
Failure:
TimePrecisionTest#test_formatting_time_according_to_precision [test/cases/time_precision_test.rb:53]:
Failed assertion, no message given.
bin/rails test test/cases/time_precision_test.rb:46
Finished in 0.040279s, 24.8268 runs/s, 24.8268 assertions/s.
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
```
|
|\
| |
| |
| |
| | |
cswilliams/rescue_postgres_connection_errors_on_dealloc
Catch postgres connection errors when trying to dealloc
|
| |
| |
| |
| |
| |
| | |
connection_active? will sometimes return true when the connection is actually dead/disconnected (see #3392 for a discussion of why this is). When this happens, a query is run on the dead connection which causes various postgres connection errors to be raised. This fix catches any such errors and ignores them.
Closes #29760
|
| |
| |
| |
| |
| |
| |
| |
| | |
Dates are able to be natively handled by the mysql2 gem. libmysql (and
the wire protocol) represent each portion of the date as an integer,
which is significantly faster to encode and decode. By passing the Ruby
date objects through directly, we can save a good bit of time and
memory.
|
| | |
|
|/ |
|
|\
| |
| | |
Change sqlite3 boolean serialization to use 1 and 0
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Abstract boolean serialization has been using 't' and 'f', with MySQL
overriding that to use 1 and 0.
This has the advantage that SQLite natively recognizes 1 and 0 as true
and false, but does not natively recognize 't' and 'f'.
This change in serialization requires a migration of stored boolean data
for SQLite databases, so it's implemented behind a configuration flag
whose default false value is deprecated. The flag itself can be
deprecated in a future version of Rails. While loaded models will give
the correct result for boolean columns without migrating old data,
where() clauses will interact incorrectly with old data.
While working in this area, also change the abstract adapter to use
`"TRUE"` and `"FALSE"` as quoted values and `true` and `false` for
unquoted. These are supported by PostreSQL, and MySQL remains
overriden.
|
|/ |
|
|\
| |
| | |
Prepare AP and AR to be frozen string friendly
|
| | |
|
|\ \
| | |
| | | |
Don't allow uuids with orphan curly braces
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The uuid validation regex was allowing uuids to have a single leading
curly brace or single trailing curly brace. Saving with such a uuid
would cause Postgres to generate an exception even though the record
seemed valid. With this change, the regex requires both a leading *and*
a trailing curly brace or neither to be valid.
|
|\ \ \
| | | |
| | | | |
Don't translate non-database exceptions.
|
| | | |
| | | |
| | | |
| | | | |
The AbstractAdapter will translate all StandardErrors generated during the course of a query into ActiveRecord::StatementInvalids. Unfortunately, it'll also mangle non-database-related errors generated in ActiveSupport::Notification callbacks after the query has successfully completed. This should prevent it from translating errors from ActiveSupport::Notifications.
|
|\ \ \ \
| | | | |
| | | | |
| | | | |
| | | | | |
kamipo/use_information_schema_to_extract_expression
Use `information_schema` to extract `generation_expression` for MariaDB
|
| | |/ /
| |/| |
| | | |
| | | |
| | | |
| | | | |
Since MariaDB 10.2.5, `information_schema` supports Virtual Columns.
Fixes #29670.
|
|/ / /
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Since MariaDB 10.2, `CURRENT_TIMESTAMP` is shown as a function
(`current_timestamp()`). Fix matching column default to address that
case.
Fixes #29698.
|
|/ /
| |
| |
| |
| |
| | |
Currently `version` method always returns `5.5.5` because the
`full_version` is `5.5.5-10.x.y-MariaDB...` since MariaDB 10.x.
It should be ignored if the prefix is `5.5.5-`.
|
|/
|
|
| |
We already have database agnostic `Type::Json` since #29220.
|
|\ |
|
| |
| |
| |
| | |
Because the deprecation message is not yet released.
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Let's say you have a nested transaction and both records are saved.
Before the outer transaction closes, a rollback is performed. Previously
the record in the outer transaction would get marked as not persisted
but the inner transaction would get persisted.
```ruby
Post.transaction do
post_one.save # will get rolled back
Post.transaction(requires_new: true) do
post_two.save # incorrectly remains marked as persisted
end
raise ActiveRecord::Rollback
end
```
To fix this the PR changes transaction handling to have the child
transaction ask the parent how the records should be marked. When
there are child transactions, it will always be a SavpointTransaction
because the stack isn't empty. From there we pass the parent_transaction
to the child SavepointTransaction where we add the children to the parent
so the parent can mark the inner transaction as rolledback and thus mark
the record as not persisted.
`update_attributes_from_transaction_state` uses the `completed?` check to
correctly mark all the transactions as rolledback and the inner record as
not persisted.
```ruby
Post.transaction do
post_one.save # will get rolled back
Post.transaction(requires_new: true) do
post_two.save # with new behavior, correctly marked as not persisted
on rollback
end
raise ActiveRecord::Rollback
end
```
Fixes #29320
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
`set_state` was directly setting the transaction state instance
variable. It's better to set the state via specific methods (`rollback!`
and `commit!` respectively.
While undocumented and untested, it's possible someone is using
`set_state` in their app or gem so I've added a deprecation notice to
it.
No where in the app do we use `nullify!` but I wanted to keep existing
behavior while replacing the method with a better pattern.
|
| |
| |
| |
| |
| | |
This reverts commit 3420a14590c0e6915d8b6c242887f74adb4120f9, reversing
changes made to afb66a5a598ce4ac74ad84b125a5abf046dcf5aa.
|
| |\
| | |
| | |
| | | |
Enforce frozen string in Rubocop
|
| | | |
|
| |\ \
| | | |
| | | |
| | | | |
Make ActiveSupport frozen-string-literal friendly.
|
| | | | |
|
| | |/
| |/|
| | |
| | |
| | |
| | | |
`test_middleware_caches` is sometimes failed since #29454.
The failure is due to schema statements are affected by query caching.
Bypassing query caching for schema statements to avoid the issue.
|
|/ / |
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
`test_cache_is_available_when_using_a_not_connected_connection` is
always failed if running only the test since #29609.
```
% ARCONN=mysql2 be ruby -w -Itest test/cases/query_cache_test.rb -n test_cache_is_available_when_using_a_not_connected_connection
Using mysql2
Run options: -n test_cache_is_available_when_using_a_not_connected_connection --seed 15043
F
Finished in 0.070519s, 14.1806 runs/s, 28.3612 assertions/s.
1) Failure:
QueryCacheTest#test_cache_is_available_when_using_a_not_connected_connection [test/cases/query_cache_test.rb:336]:
2 instead of 1 queries were executed.
Queries:
SELECT `tasks`.* FROM `tasks` WHERE `tasks`.`id` = ? LIMIT ?
SET NAMES utf8 COLLATE utf8_unicode_ci, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483.
Expected: 1
Actual: 2
1 runs, 2 assertions, 1 failures, 0 errors, 0 skips
```
This failure is due to `LogSubscriber` will use not connected
`ActiveRecord::Base.connection` even if `Task.connection` is connected.
I fixed to always pass `type_casted_binds` to log subscriber to avoid
the issue.
|
|\ \
| | |
| | | |
Use `quote` method rather than single quotes to identifiers in SQL
|
| | |
| | |
| | |
| | |
| | |
| | | |
Because identifiers in SQL could include a single quote.
Related #24950, #26784.
|
|\ \ \
| |/ /
|/| | |
`Relation#locked?` should not build arel
|
| | |
| | |
| | |
| | |
| | | |
The delegation was needed since passing `relation` with
`relation.bound_attributes`. It should use `relation.arel` in that case.
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Scalar values like arrays and hashes can't be inserted
directly into table. Previously, the way to determine if
the value is scalar was to try quoting it. If `quote` raised
with an error than the value has to be converted to YAML.
This flow is not very obvious. Ideally we could have
a `quotable?` method in the connection, but I think
that we can avoid begin/rescue block by simply checking
if the value is Array or Hash.
https://github.com/rails/rails/commit/aa31d21f5f4fc4d679e74a60f9df9706da7de373
|
|/ /
| |
| |
| |
| |
| |
| |
| | |
Improves the performance from O(n) to O(1).
Previously it would require 50 queries to
insert 50 fixtures. Now it takes only one query.
Disabled on sqlite which doesn't support multiple inserts.
|
|\ \
| | |
| | | |
Fix `Relation#exists?` queries with query cache
|
| | | |
|
|\ \ \
| |_|/
|/| | |
Refactor #insert_fixtures to use Arel
|
| | | |
|