Skip to content

Commit 6d9f72b

Browse files
committed
Add column types to ActiveRecord::Result for SQLite3
1 parent 61bd6a7 commit 6d9f72b

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

activerecord/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Add column types to `ActiveRecord::Result` for SQLite3.
2+
3+
*Andrew Kane*
4+
15
* Raise `ActiveRecord::ReadOnlyError` when pessimistically locking with a readonly role.
26

37
*Joshua Young*

activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
8787
stmt.step
8888
ActiveRecord::Result.empty
8989
else
90-
ActiveRecord::Result.new(stmt.columns, stmt.to_a)
90+
types = {}
91+
stmt.columns.zip(stmt.types).each_with_index do |(c, t), i|
92+
types[c] = types[i] = type_map.lookup(t)
93+
end
94+
ActiveRecord::Result.new(stmt.columns, stmt.to_a, types.freeze)
9195
end
9296
else
9397
# Don't cache statements if they are not prepared.
@@ -100,7 +104,11 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
100104
stmt.step
101105
ActiveRecord::Result.empty
102106
else
103-
ActiveRecord::Result.new(stmt.columns, stmt.to_a)
107+
types = {}
108+
stmt.columns.zip(stmt.types).each_with_index do |(c, t), i|
109+
types[c] = types[i] = type_map.lookup(t)
110+
end
111+
ActiveRecord::Result.new(stmt.columns, stmt.to_a, types.freeze)
104112
end
105113
ensure
106114
stmt.close

activerecord/test/cases/base_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,18 @@ def test_column_types_on_queries_on_postgresql
16881688
end
16891689
end
16901690

1691+
if current_adapter?(:SQLite3Adapter)
1692+
def test_column_types_on_queries_on_sqlite
1693+
result = ActiveRecord::Base.lease_connection.exec_query("SELECT id, last_read, created_at FROM topics")
1694+
assert_equal ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer, result.column_types["id"].class
1695+
assert_equal ActiveRecord::Type::Date, result.column_types["last_read"].class
1696+
assert_equal ActiveRecord::Type::DateTime, result.column_types["created_at"].class
1697+
assert_equal result.column_types[0], result.column_types["id"]
1698+
assert_equal result.column_types[1], result.column_types["last_read"]
1699+
assert_equal result.column_types[2], result.column_types["created_at"]
1700+
end
1701+
end
1702+
16911703
def test_typecasting_aliases
16921704
assert_equal 10, Topic.select("10 as tenderlove").first.tenderlove
16931705
end

0 commit comments

Comments
 (0)