提交 51d333ae 编写于 作者: S Sean Griffin

Merge pull request #20732 from jorihardman/timestamp_precison2

Ensure that microsecond precision is only used for versions of mysql that support it.
...@@ -107,6 +107,18 @@ def initialize(connection, logger = nil, pool = nil) #:nodoc: ...@@ -107,6 +107,18 @@ def initialize(connection, logger = nil, pool = nil) #:nodoc:
@prepared_statements = false @prepared_statements = false
end end
class Version
include Comparable
def initialize(version_string)
@version = version_string.split('.').map(&:to_i)
end
def <=>(version_string)
@version <=> version_string.split('.').map(&:to_i)
end
end
class BindCollector < Arel::Collectors::Bind class BindCollector < Arel::Collectors::Bind
def compile(bvs, conn) def compile(bvs, conn)
casted_binds = conn.prepare_binds_for_database(bvs) casted_binds = conn.prepare_binds_for_database(bvs)
......
...@@ -307,7 +307,7 @@ def supports_index_sort_order? ...@@ -307,7 +307,7 @@ def supports_index_sort_order?
# #
# http://bugs.mysql.com/bug.php?id=39170 # http://bugs.mysql.com/bug.php?id=39170
def supports_transaction_isolation? def supports_transaction_isolation?
version[0] >= 5 version >= '5.0.0'
end end
def supports_indexes_in_create? def supports_indexes_in_create?
...@@ -319,11 +319,11 @@ def supports_foreign_keys? ...@@ -319,11 +319,11 @@ def supports_foreign_keys?
end end
def supports_views? def supports_views?
version[0] >= 5 version >= '5.0.0'
end end
def supports_datetime_with_precision? def supports_datetime_with_precision?
(version[0] == 5 && version[1] >= 6) || version[0] >= 6 version >= '5.6.4'
end end
def native_database_types def native_database_types
...@@ -386,6 +386,14 @@ def unquoted_false ...@@ -386,6 +386,14 @@ def unquoted_false
0 0
end end
def quoted_date(value)
if supports_datetime_with_precision?
super
else
super.sub(/\.\d{6}\z/, '')
end
end
# REFERENTIAL INTEGRITY ==================================== # REFERENTIAL INTEGRITY ====================================
def disable_referential_integrity #:nodoc: def disable_referential_integrity #:nodoc:
...@@ -938,7 +946,7 @@ def subquery_for(key, select) ...@@ -938,7 +946,7 @@ def subquery_for(key, select)
end end
def version def version
@version ||= full_version.scan(/^(\d+)\.(\d+)\.(\d+)/).flatten.map(&:to_i) @version ||= Version.new(full_version.match(/^\d+\.\d+\.\d+/)[0])
end end
def mariadb? def mariadb?
...@@ -946,7 +954,7 @@ def mariadb? ...@@ -946,7 +954,7 @@ def mariadb?
end end
def supports_rename_index? def supports_rename_index?
mariadb? ? false : (version[0] == 5 && version[1] >= 7) || version[0] >= 6 mariadb? ? false : version >= '5.7.6'
end end
def configure_connection def configure_connection
......
...@@ -65,18 +65,6 @@ class SQLite3Adapter < AbstractAdapter ...@@ -65,18 +65,6 @@ class SQLite3Adapter < AbstractAdapter
boolean: { name: "boolean" } boolean: { name: "boolean" }
} }
class Version
include Comparable
def initialize(version_string)
@version = version_string.split('.').map(&:to_i)
end
def <=>(version_string)
@version <=> version_string.split('.').map(&:to_i)
end
end
class StatementPool < ConnectionAdapters::StatementPool class StatementPool < ConnectionAdapters::StatementPool
private private
......
...@@ -12,4 +12,18 @@ def test_type_cast_true ...@@ -12,4 +12,18 @@ def test_type_cast_true
def test_type_cast_false def test_type_cast_false
assert_equal 0, @conn.type_cast(false) assert_equal 0, @conn.type_cast(false)
end end
def test_quoted_date_precision_for_gte_564
@conn.stubs(:full_version).returns('5.6.4')
@conn.remove_instance_variable(:@version)
t = Time.now.change(usec: 1)
assert_match(/\.000001\z/, @conn.quoted_date(t))
end
def test_quoted_date_precision_for_lt_564
@conn.stubs(:full_version).returns('5.6.3')
@conn.remove_instance_variable(:@version)
t = Time.now.change(usec: 1)
refute_match(/\.000001\z/, @conn.quoted_date(t))
end
end end
require "cases/helper"
class Mysql2QuotingTest < ActiveRecord::Mysql2TestCase
setup do
@connection = ActiveRecord::Base.connection
end
test 'quoted date precision for gte 5.6.4' do
@connection.stubs(:full_version).returns('5.6.4')
@connection.remove_instance_variable(:@version)
t = Time.now.change(usec: 1)
assert_match(/\.000001\z/, @connection.quoted_date(t))
end
test 'quoted date precision for lt 5.6.4' do
@connection.stubs(:full_version).returns('5.6.3')
@connection.remove_instance_variable(:@version)
t = Time.now.change(usec: 1)
refute_match(/\.000001\z/, @connection.quoted_date(t))
end
end
...@@ -47,7 +47,8 @@ def in_memory_db? ...@@ -47,7 +47,8 @@ def in_memory_db?
def mysql_56? def mysql_56?
current_adapter?(:MysqlAdapter, :Mysql2Adapter) && current_adapter?(:MysqlAdapter, :Mysql2Adapter) &&
ActiveRecord::Base.connection.send(:version).join(".") >= "5.6.0" ActiveRecord::Base.connection.send(:version) >= '5.6.0' &&
ActiveRecord::Base.connection.send(:version) < '5.7.0'
end end
def mysql_enforcing_gtid_consistency? def mysql_enforcing_gtid_consistency?
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册