Skip to content

Commit 2407ac3

Browse files
committed
Support schema dumper
1 parent b855b85 commit 2407ac3

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

activerecord/lib/active_record/connection_adapters/postgresql/column.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,11 @@ def auto_incremented_by_db?
2626
end
2727

2828
def virtual?
29-
# We assume every generated column is virtual, no matter the concrete type
30-
# PostgreSQL 18 supports virtual generated columns that are not stored
31-
@generated.present? # TODO: Consider false positives
29+
@generated == "s" || @generated == "v"
3230
end
3331

3432
def virtual_stored?
35-
virtual? && @generated == "s"
33+
@generated == "s"
3634
end
3735

3836
def has_default?

activerecord/lib/active_record/connection_adapters/postgresql/schema_dumper.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ def prepare_column_options(column)
7676

7777
if @connection.supports_virtual_columns? && column.virtual?
7878
spec[:as] = extract_expression_for_virtual_column(column)
79-
spec[:stored] = true # TODO: Consider virtual one and add tests for it
79+
if column.virtual_stored?
80+
spec[:stored] = true
81+
elsif column.virtual? and !column.virtual_stored?
82+
spec[:stored] = false
83+
end
8084
spec = { type: schema_type(column).inspect }.merge!(spec)
8185
end
8286

activerecord/test/cases/adapters/postgresql/virtual_column_test.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ def setup
1919
t.virtual :name_octet_length, type: :integer, as: "OCTET_LENGTH(name)", stored: true
2020
t.integer :column1
2121
t.virtual :column2, type: :integer, as: "column1 + 1", stored: true
22+
t.virtual :column3, type: :integer, as: "column1 + 2", stored: false # only if PostgreSQL >= 18.0
23+
t.virtual :column4, type: :integer, as: "column1 + 3" # only if PostgreSQL >= 18.0
2224
end
2325
VirtualColumn.create(name: "Rails")
2426
end
@@ -102,6 +104,8 @@ def test_schema_dumping
102104
assert_match(/t\.virtual\s+"name_length",\s+type: :integer,\s+as: "length\(\(name\)::text\)", stored: true$/i, output)
103105
assert_match(/t\.virtual\s+"name_octet_length",\s+type: :integer,\s+as: "octet_length\(\(name\)::text\)", stored: true$/i, output)
104106
assert_match(/t\.virtual\s+"column2",\s+type: :integer,\s+as: "\(column1 \+ 1\)", stored: true$/i, output)
107+
assert_match(/t\.virtual\s+"column3",\s+type: :integer,\s+as: "\(column1 \+ 2\)", stored: false$/i, output)
108+
assert_match(/t\.virtual\s+"column4",\s+type: :integer,\s+as: "\(column1 \+ 3\)", stored: false$/i, output)
105109
end
106110

107111
def test_build_fixture_sql

0 commit comments

Comments
 (0)