@@ -362,7 +362,7 @@ defmodule Ecto.Repo.Schema do
362362 struct = struct_from_changeset! ( :insert , changeset )
363363 schema = struct . __struct__
364364 dumper = schema . __schema__ ( :dump )
365- insertable_fields = schema . __schema__ ( :insertable_fields )
365+ { keep_fields , drop_fields } = schema . __schema__ ( :insertable_fields )
366366 assocs = schema . __schema__ ( :associations )
367367 embeds = schema . __schema__ ( :embeds )
368368
@@ -379,7 +379,8 @@ defmodule Ecto.Repo.Schema do
379379 # On insert, we always merge the whole struct into the
380380 # changeset as changes, except the primary key if it is nil.
381381 changeset = put_repo_and_action ( changeset , :insert , repo , tuplet )
382- changeset = Relation . surface_changes ( changeset , struct , insertable_fields ++ assocs )
382+ changeset = Relation . surface_changes ( changeset , struct , keep_fields ++ assocs )
383+ changeset = update_in ( changeset . changes , & Map . drop ( & 1 , drop_fields ) )
383384
384385 wrap_in_transaction ( adapter , adapter_meta , opts , changeset , assocs , embeds , prepare , fn ->
385386 assoc_opts = assoc_opts ( assocs , opts )
@@ -398,7 +399,7 @@ defmodule Ecto.Repo.Schema do
398399 { changes , cast_extra , dump_extra , return_types , return_sources } =
399400 autogenerate_id ( autogen_id , changes , return_types , return_sources , adapter )
400401
401- changes = Map . take ( changes , insertable_fields )
402+ changes = Map . take ( changes , keep_fields )
402403 autogen = autogenerate_changes ( schema , :insert , changes )
403404
404405 dump_changes =
@@ -454,7 +455,7 @@ defmodule Ecto.Repo.Schema do
454455 struct = struct_from_changeset! ( :update , changeset )
455456 schema = struct . __struct__
456457 dumper = schema . __schema__ ( :dump )
457- updatable_fields = schema . __schema__ ( :updatable_fields )
458+ { keep_fields , drop_fields } = schema . __schema__ ( :updatable_fields )
458459 assocs = schema . __schema__ ( :associations )
459460 embeds = schema . __schema__ ( :embeds )
460461
@@ -471,6 +472,7 @@ defmodule Ecto.Repo.Schema do
471472 # fields into the changeset. All changes must be in the
472473 # changeset before hand.
473474 changeset = put_repo_and_action ( changeset , :update , repo , tuplet )
475+ changeset = update_in ( changeset . changes , & Map . drop ( & 1 , drop_fields ) )
474476
475477 if changeset . changes != % { } or force? do
476478 wrap_in_transaction ( adapter , adapter_meta , opts , changeset , assocs , embeds , prepare , fn ->
@@ -483,7 +485,7 @@ defmodule Ecto.Repo.Schema do
483485 if changeset . valid? do
484486 embeds = Ecto.Embedded . prepare ( changeset , embeds , adapter , :update )
485487
486- changes = changeset . changes |> Map . merge ( embeds ) |> Map . take ( updatable_fields )
488+ changes = changeset . changes |> Map . merge ( embeds ) |> Map . take ( keep_fields )
487489 autogen = autogenerate_changes ( schema , :update , changes )
488490 dump_changes = dump_changes! ( :update , changes , autogen , schema , [ ] , dumper , adapter )
489491
@@ -797,7 +799,8 @@ defmodule Ecto.Repo.Schema do
797799 end
798800
799801 defp replace_all_fields! ( _kind , schema , to_remove ) do
800- Enum . map ( schema . __schema__ ( :updatable_fields ) -- to_remove , & field_source! ( schema , & 1 ) )
802+ { updatable_fields , _ } = schema . __schema__ ( :updatable_fields )
803+ Enum . map ( updatable_fields -- to_remove , & field_source! ( schema , & 1 ) )
801804 end
802805
803806 defp field_source! ( nil , field ) do
0 commit comments