Packages
ash_postgres
2.9.1
2.10.0
2.9.1
2.9.0
2.8.0
2.7.0
2.6.32
2.6.31
2.6.30
2.6.29
2.6.28
2.6.27
2.6.26
2.6.25
2.6.24
2.6.23
2.6.22
2.6.21
2.6.20
2.6.19
2.6.18
2.6.17
2.6.16
2.6.15
2.6.14
2.6.13
2.6.12
2.6.11
2.6.10
2.6.9
2.6.8
2.6.7
2.6.6
2.6.5
2.6.4
2.6.3
2.6.2
2.6.1
2.6.0
2.5.22
2.5.21
2.5.20
2.5.19
2.5.18
2.5.17
2.5.16
2.5.15
2.5.14
2.5.13
2.5.12
2.5.11
2.5.10
2.5.9
2.5.8
2.5.7
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.21
2.4.20
2.4.19
2.4.18
2.4.17
2.4.16
2.4.15
2.4.14
2.4.13
2.4.12
2.4.11
2.4.10
2.4.9
2.4.8
2.4.7
2.4.6
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.1
2.3.0
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.19
2.1.18
2.1.17
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.15
2.0.0-rc.14
2.0.0-rc.13
2.0.0-rc.12
2.0.0-rc.11
2.0.0-rc.10
2.0.0-rc.9
2.0.0-rc.8
2.0.0-rc.7
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.5.30
1.5.29
1.5.28
1.5.27
1.5.26
1.5.25
1.5.24
1.5.23
1.5.22
1.5.21
1.5.20
1.5.19
1.5.18
1.5.17
1.5.16
1.5.15
1.5.14
1.5.13
1.5.12
1.5.11
1.5.10
1.5.9
1.5.8
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.0
1.3.68
1.3.67
1.3.66
1.3.65
1.3.64
1.3.63
1.3.62
1.3.61
1.3.60
1.3.59
1.3.58
1.3.56
1.3.55
1.3.54
1.3.53
1.3.52
1.3.51
1.3.50
1.3.49
1.3.48
1.3.47
1.3.46
1.3.45
1.3.44
1.3.43
1.3.42
1.3.41
1.3.40
1.3.39
1.3.38
1.3.37
1.3.36
1.3.35
1.3.34
1.3.33
1.3.32
1.3.31
1.3.30
1.3.29
1.3.28
1.3.26
1.3.25
1.3.24
1.3.23
1.3.22
1.3.21
1.3.20
1.3.19
1.3.18
1.3.17
1.3.16
1.3.15
1.3.14
1.3.12
1.3.11
1.3.10
1.3.9
1.3.8
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.3.0-rc.4
1.3.0-rc.3
1.3.0-rc.2
1.3.0-rc.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.1
1.2.0-rc.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-rc.9
1.0.0-rc.8
1.0.0-rc.7
1.0.0-rc.6
1.0.0-rc.5
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
1.0.0-pre.3
1.0.0-pre.2
1.0.0-pre.1
1.0.0-pre.0
0.43.0
0.42.0-rc.7
0.42.0-rc.6
0.42.0-rc.5
0.42.0-rc.4
0.42.0-rc.3
0.42.0-rc.1
0.42.0-rc.0
0.41.7
0.41.6
0.41.5
0.41.4
0.41.3
0.41.2
0.41.1
0.41.0-rc0
retired
0.41.0-rc.9
0.41.0-rc.8
0.41.0-rc.7
0.41.0-rc.6
0.41.0-rc.5
0.41.0-rc.4
0.41.0-rc.3
0.41.0-rc.2
0.41.0-rc.1
0.41.0-rc.0
0.40.11
0.40.10
0.40.9
0.40.8
0.40.7
0.40.6
0.40.5
0.40.4
0.40.3
0.40.2
0.40.1
0.40.0-rc5
0.40.0-rc4
0.40.0-rc3
0.40.0-rc2
0.40.0-rc1
0.39.0-rc0
0.38.11
0.38.10
0.38.9
0.38.8
0.38.7
0.38.6
0.38.5
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.8
0.37.7
0.37.6
0.37.5
0.37.4
0.37.3
0.37.2
0.37.1
0.37.0
0.36.5
0.36.4
0.36.3
0.36.2
0.36.1
0.36.0
0.35.5
0.35.4
0.35.3
0.35.1
0.34.5
0.34.4
0.34.3
0.34.2
0.34.1
0.34.0
0.33.1
0.33.0
0.32.2
0.32.1
0.32.0
0.31.1
0.30.1
0.29.6
0.29.5
0.29.4
0.29.3
0.29.2
0.29.1
0.28.1
0.28.0
0.27.0
0.26.2
0.26.1
0.26.0
0.25.5
0.25.4
0.25.3
0.25.2
0.25.1
0.25.0
0.24.0
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.1
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.2
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.1
0.2.0
0.1.4
0.1.3
0.1.2
0.1.1
0.1.1-rc.2
0.1.1-rc.1
0.1.1-rc.0
0.1.0
The PostgreSQL data layer for Ash Framework
Current section
409 Versions
Jump to
Current section
409 Versions
Compare versions
8
files changed
+100
additions
-17
deletions
| @@ -11,6 +11,21 @@ See [Conventional Commits](https://www.conventionalcommits.org) for commit guide | |
| 11 11 | |
| 12 12 | <!-- changelog --> |
| 13 13 | |
| 14 | + ## [v2.9.1](https://github.com/ash-project/ash_postgres/compare/v2.9.0...v2.9.1) (2026-05-01) |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | + |
| 19 | + ### Bug Fixes: |
| 20 | + |
| 21 | + * handle base filter index rewrite detection (#742) by Minsub Kim |
| 22 | + |
| 23 | + * failing test for calculation loading on relationships in policies (#741) by Rutgerdj |
| 24 | + |
| 25 | + * immutable_expr_error support for newly added required expr (#737) by adamtharani |
| 26 | + |
| 27 | + * correct prefix name when loading many_to_many relationships (#736) by gcugnet |
| 28 | + |
| 14 29 | ## [v2.9.0](https://github.com/ash-project/ash_postgres/compare/v2.8.0...v2.9.0) (2026-04-12) |
| @@ -9,7 +9,7 @@ | |
| 9 9 | <<"https://api.reuse.software/info/github.com/ash-project/ash_postgres">>}, |
| 10 10 | {<<"Website">>,<<"https://ash-hq.org">>}]}. |
| 11 11 | {<<"name">>,<<"ash_postgres">>}. |
| 12 | - {<<"version">>,<<"2.9.0">>}. |
| 12 | + {<<"version">>,<<"2.9.1">>}. |
| 13 13 | {<<"description">>,<<"The PostgreSQL data layer for Ash Framework">>}. |
| 14 14 | {<<"elixir">>,<<"~> 1.13">>}. |
| 15 15 | {<<"files">>, |
unknownlib/data_layer.ex
File is too large to be displayed (100 KB limit).
| @@ -179,6 +179,61 @@ defmodule AshPostgres.Extensions.ImmutableRaiseError do | |
| 179 179 | end |
| 180 180 | end |
| 181 181 | |
| 182 | + def immutable_required_expr( |
| 183 | + query, |
| 184 | + %{name: :required!, arguments: [value_expr, attribute]} = required, |
| 185 | + bindings, |
| 186 | + embedded?, |
| 187 | + acc, |
| 188 | + type |
| 189 | + ) do |
| 190 | + pred_embedded? = Map.get(required, :embedded?, false) |
| 191 | + |
| 192 | + {value_dyn, acc} = |
| 193 | + AshSql.Expr.dynamic_expr( |
| 194 | + query, |
| 195 | + value_expr, |
| 196 | + bindings, |
| 197 | + pred_embedded? || embedded?, |
| 198 | + type, |
| 199 | + acc |
| 200 | + ) |
| 201 | + |
| 202 | + resource = |
| 203 | + Map.get(attribute, :resource) || |
| 204 | + raise("attribute must have :resource for ash_required!") |
| 205 | + |
| 206 | + field = |
| 207 | + Map.get(attribute, :name) || |
| 208 | + Map.get(attribute, "name") || |
| 209 | + raise("attribute must have :name for ash_required!") |
| 210 | + |
| 211 | + payload = |
| 212 | + %{ |
| 213 | + exception: inspect(Ash.Error.Changes.Required), |
| 214 | + input: %{field: field, type: :attribute, resource: resource} |
| 215 | + } |
| 216 | + |> Jason.encode!() |
| 217 | + |
| 218 | + case immutable_error_expr_token(query, bindings) do |
| 219 | + nil -> |
| 220 | + :error |
| 221 | + |
| 222 | + row_token -> |
| 223 | + {:ok, |
| 224 | + Ecto.Query.dynamic( |
| 225 | + fragment( |
| 226 | + "CASE WHEN ? IS NULL THEN ash_raise_error_immutable(?::jsonb, ?, ?) ELSE ? END", |
| 227 | + ^value_dyn, |
| 228 | + ^payload, |
| 229 | + ^value_dyn, |
| 230 | + ^row_token, |
| 231 | + ^value_dyn |
| 232 | + ) |
| 233 | + ), acc} |
| 234 | + end |
| 235 | + end |
| 236 | + |
| 182 237 | # Encodes an error payload as jsonb using only IMMUTABLE SQL functions. |
| 183 238 | # |
| 184 239 | # Strategy: |
| @@ -196,27 +196,27 @@ defmodule AshPostgres.MigrationGenerator.AshFunctions do | |
| 196 196 | end |
| 197 197 | |
| 198 198 | def drop(3) do |
| 199 | - "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), timestamp_from_uuid_v7(uuid), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 199 | + "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 200 200 | end |
| 201 201 | |
| 202 202 | def drop(2) do |
| 203 203 | """ |
| 204 204 | #{ash_raise_error()} |
| 205 205 | |
| 206 | - "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), timestamp_from_uuid_v7(uuid), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 206 | + "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 207 207 | """ |
| 208 208 | end |
| 209 209 | |
| 210 210 | def drop(1) do |
| 211 | - "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), timestamp_from_uuid_v7(uuid), ash_raise_error(jsonb), ash_raise_error(jsonb, ANYCOMPATIBLE), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 211 | + "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), ash_raise_error(jsonb), ash_raise_error(jsonb, ANYCOMPATIBLE), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 212 212 | end |
| 213 213 | |
| 214 214 | def drop(0) do |
| 215 | - "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), timestamp_from_uuid_v7(uuid), ash_raise_error(jsonb), ash_raise_error(jsonb, ANYCOMPATIBLE), ash_trim_whitespace(text[]), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 215 | + "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), ash_raise_error(jsonb), ash_raise_error(jsonb, ANYCOMPATIBLE), ash_trim_whitespace(text[]), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 216 216 | end |
| 217 217 | |
| 218 218 | def drop(nil) do |
| 219 | - "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), timestamp_from_uuid_v7(uuid), ash_raise_error(jsonb), ash_raise_error(jsonb, ANYCOMPATIBLE), ash_elixir_and(BOOLEAN, ANYCOMPATIBLE), ash_elixir_and(ANYCOMPATIBLE, ANYCOMPATIBLE), ash_elixir_or(ANYCOMPATIBLE, ANYCOMPATIBLE), ash_elixir_or(BOOLEAN, ANYCOMPATIBLE), ash_trim_whitespace(text[]), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 219 | + "execute(\"DROP FUNCTION IF EXISTS uuid_generate_v7(), ash_raise_error(jsonb), ash_raise_error(jsonb, ANYCOMPATIBLE), ash_elixir_and(BOOLEAN, ANYCOMPATIBLE), ash_elixir_and(ANYCOMPATIBLE, ANYCOMPATIBLE), ash_elixir_or(ANYCOMPATIBLE, ANYCOMPATIBLE), ash_elixir_or(BOOLEAN, ANYCOMPATIBLE), ash_trim_whitespace(text[]), ash_required(ANYCOMPATIBLE, jsonb)\")" |
| 220 220 | end |
| 221 221 | |
| 222 222 | defp ash_required do |
Loading more files…