jan-mb-me
Ash Postgres: How to detect change when updating nullable column from NULL to non-NULL value without using atomic_update?
Hi,
I stumbled over this snippet of a query generated by an update action:
SET “updated_at” = (CASE WHEN $1::timestamp != r0.“last_query_at”::timestamp THEN $2::timestamp ELSE r0.“updated_at”::timestamp END)
The attribute is defined as below, i.e. the column is nullable:
attribute :last_query_at, :utc_datetime_usec do
public? true
filterable? true
end
When the record/row has NULL in field/column last_query_at and I pass a date-time value for last_query_at to the update action, the operator != prevents the condition to resolve to TRUE, hence updated_at is not changed although the row is changed to a new value for last_query_at (not shown in the snippet above).
That default behavior caught me by surprise.
From what I found so far, I‘d have to use this in the update action to skip the “only update if changed“ optimization:
change atomic_update(:last_query_at, expr(^arg(:last_query_at)))
Am I missing something to make the update of updated_at work without ?atomic_update
I am using ash 3.19.3 and ash-postgres 2.6.32.
Update: Using atomic_update leads to the same snippet being generated.
Marked As Solved
jan-mb-me
Hello @zachdaniel, Upgrading to ash 3.23.0+ and also upgrading ash_sql worked and my workaround became obsolete.
Thank you very much!
Also Liked
zachdaniel
Hey @jan-mb-me thank you for the find! This is fixed in the latest main of ash and will be included in the next release.
![]()
zachdaniel
Popular in Questions
Other popular topics
Latest Ash Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









