From e01c18e815d4d3e1067fd3bcf4494c95257ac29b Mon Sep 17 00:00:00 2001 From: Chris Ward Date: Sat, 30 Sep 2023 12:05:19 -0400 Subject: [PATCH] fix for virtual column definition - bring in https://github.com/rails/rails/commit/7fa2720b09e044c79764329e3f0a23aab13ffb89 --- .../postgis/schema_statements.rb | 7 ++++++- test/cases/ddl_test.rb | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/active_record/connection_adapters/postgis/schema_statements.rb b/lib/active_record/connection_adapters/postgis/schema_statements.rb index 4e092997..46c50477 100644 --- a/lib/active_record/connection_adapters/postgis/schema_statements.rb +++ b/lib/active_record/connection_adapters/postgis/schema_statements.rb @@ -11,7 +11,12 @@ def new_column_from_field(table_name, field) column_name, type, default, notnull, oid, fmod, collation, comment, attgenerated = field type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i) default_value = extract_value_from_default(default) - default_function = extract_default_function(default_value, default) + + if attgenerated.present? + default_function = default + else + default_function = extract_default_function(default_value, default) + end if match = default_function&.match(/\Anextval\('"?(?.+_(?seq\d*))"?'::regclass\)\z/) serial = sequence_name_from_parts(table_name, column_name, match[:suffix]) == match[:sequence_name] diff --git a/test/cases/ddl_test.rb b/test/cases/ddl_test.rb index 9cfa9a93..dc501af5 100644 --- a/test/cases/ddl_test.rb +++ b/test/cases/ddl_test.rb @@ -307,6 +307,20 @@ def test_column_defaults assert_equal(-1, klass.new.sample_integer) end + # Ensure virtual column default function works like the Postgres adapter. + def test_virtual_column_default_function + skip "Virtual Columns are not supported in this version of PostGIS" unless SpatialModel.connection.supports_virtual_columns? + klass.connection.create_table(:spatial_models, force: true) do |t| + t.integer :column1 + t.virtual :column2, type: :integer, as: "(column1 + 1)", stored: true + end + klass.reset_column_information + col = klass.columns.last + assert_equal(:integer, col.type) + assert_equal("(column1 + 1)", col.default_function) + assert(col.virtual?) + end + def test_column_types klass.connection.create_table(:spatial_models, force: true) do |t| t.column "sample_integer", :integer @@ -364,6 +378,7 @@ def test_generated_geometry_column end klass.reset_column_information col = klass.columns.last + assert_equal("st_buffer(coordinates, (10)::double precision)", col.default_function) assert_equal(:geometry, col.type) assert(col.virtual?) end