From cdfd5f5e83ad86e78d6f9816f14d7139c12af769 Mon Sep 17 00:00:00 2001 From: Aidan Haran Date: Fri, 18 Sep 2026 18:54:43 +0100 Subject: [PATCH] Add JSON schema cache serializer Ref: https://github.com/rails/rails/pull/58769 --- .../sqlserver/json_schema_cache_serializer.rb | 18 ++++++++++++++++++ .../sqlserver/sql_type_metadata.rb | 8 ++++++++ .../connection_adapters/sqlserver_adapter.rb | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 lib/active_record/connection_adapters/sqlserver/json_schema_cache_serializer.rb diff --git a/lib/active_record/connection_adapters/sqlserver/json_schema_cache_serializer.rb b/lib/active_record/connection_adapters/sqlserver/json_schema_cache_serializer.rb new file mode 100644 index 000000000..5960aec49 --- /dev/null +++ b/lib/active_record/connection_adapters/sqlserver/json_schema_cache_serializer.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module ActiveRecord + module ConnectionAdapters + module SQLServer + module JSONSchemaCacheSerializer + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_column", ActiveRecord::ConnectionAdapters::SQLServer::Column) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_unicode_varchar", ActiveRecord::ConnectionAdapters::SQLServer::Type::UnicodeVarchar) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_type_metadata", ActiveRecord::ConnectionAdapters::SQLServer::TypeMetadata) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_datatime2", ActiveRecord::ConnectionAdapters::SQLServer::Type::DateTime2) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_datetime", ActiveRecord::ConnectionAdapters::SQLServer::Type::DateTime) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_time", ActiveRecord::ConnectionAdapters::SQLServer::Type::Time) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_big_interger", ActiveRecord::ConnectionAdapters::SQLServer::Type::BigInteger) + ::ActiveRecord::ConnectionAdapters::JSONSchemaCacheSerializer.register("sqlserver_integer", ActiveRecord::ConnectionAdapters::SQLServer::Type::Integer) + end + end + end +end diff --git a/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb b/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb index b3f1222d2..2fed18843 100644 --- a/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +++ b/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb @@ -32,6 +32,14 @@ def hash [TypeMetadata, __getobj__, is_identity, is_primary, table_name, ordinal_position].hash end + def init_from_schema_json(coder, references) + @sql_type = coder["sql_type"] + @type = coder["type"]&.to_sym + @limit = coder["limit"] + @precision = coder["precision"] + @scale = coder["scale"] + end + private def deduplicated diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index 03f542bd5..5b32e1ea0 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -29,6 +29,7 @@ require "active_record/connection_adapters/sqlserver/quoting" require "active_record/connection_adapters/sqlserver/utils" require "active_record/connection_adapters/sqlserver_column" +require "active_record/connection_adapters/sqlserver/json_schema_cache_serializer" require "active_record/tasks/sqlserver_database_tasks" module ActiveRecord @@ -44,6 +45,7 @@ class SQLServerAdapter < AbstractAdapter include SQLServer::DatabaseStatements include SQLServer::Quoting include SQLServer::Version + include SQLServer::JSONSchemaCacheSerializer ADAPTER_NAME = "SQLServer"