aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorPaul Kuruvilla <rohitpaulk@gmail.com>2017-10-24 19:03:37 +0530
committerPaul Kuruvilla <rohitpaulk@gmail.com>2017-10-24 22:39:44 +0530
commit82ae8369925e152d507486f7520558ac09f090e8 (patch)
tree08eccd87dc45e82760eac0d7ee2c0d82efc9265f /activerecord
parent4aac0bf66c1d18c23f2096d9a343dbf9a95cbf23 (diff)
downloadrails-82ae8369925e152d507486f7520558ac09f090e8.tar.gz
rails-82ae8369925e152d507486f7520558ac09f090e8.tar.bz2
rails-82ae8369925e152d507486f7520558ac09f090e8.zip
Save index order :desc to schema.rb (sqlite). Fixes #30902
Although the sqlite adapter supports index sort orders, they weren't being written to db/schema.rb.
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md7
-rw-r--r--activerecord/lib/active_record/connection_adapters/sqlite3/schema_statements.rb11
-rw-r--r--activerecord/test/cases/schema_dumper_test.rb2
3 files changed, 17 insertions, 3 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index ee73004810..3e1b467633 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,10 @@
+* Fixed a bug where column orders for an index weren't written to
+ db/schema.rb when using the sqlite adapter.
+
+ Fixes #30902.
+
+ *Paul Kuruvilla*
+
* Remove deprecated method `#sanitize_conditions`.
*Rafael Mendonça França*
diff --git a/activerecord/lib/active_record/connection_adapters/sqlite3/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/sqlite3/schema_statements.rb
index f0d702136d..3ab9dee370 100644
--- a/activerecord/lib/active_record/connection_adapters/sqlite3/schema_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/sqlite3/schema_statements.rb
@@ -19,8 +19,14 @@ module ActiveRecord
/\sWHERE\s+(?<where>.+)$/i =~ index_sql
- columns = exec_query("PRAGMA index_info(#{quote(row['name'])})", "SCHEMA").map do |col|
- col["name"]
+ columns = []
+ orders = {}
+ exec_query("PRAGMA index_xinfo(#{quote(row['name'])})", "SCHEMA").each do |col|
+ # xinfo also lists non-key columns, let's filter those out
+ next if col["key"] == 0
+
+ columns << col["name"]
+ orders[col["name"]] = :desc if col["desc"] == 1
end
IndexDefinition.new(
@@ -28,6 +34,7 @@ module ActiveRecord
row["name"],
row["unique"] != 0,
columns,
+ orders: orders,
where: where
)
end
diff --git a/activerecord/test/cases/schema_dumper_test.rb b/activerecord/test/cases/schema_dumper_test.rb
index 799a65c61e..b8696b33e4 100644
--- a/activerecord/test/cases/schema_dumper_test.rb
+++ b/activerecord/test/cases/schema_dumper_test.rb
@@ -186,7 +186,7 @@ class SchemaDumperTest < ActiveRecord::TestCase
assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", length: { type: 10 }', index_definition
end
else
- assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index"', index_definition
+ assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", order: { rating: :desc }', index_definition
end
end