Packages
electric
1.0.19
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/replication/eval/env/implicit_casts.ex
defmodule Electric.Replication.Eval.Env.ImplicitCasts do
@moduledoc """
List of all implicit casts in (raw) PostgreSQL. Does not account for custom casts, which
are discouraged anyway. If needed, this list can be extended in `Electric.Replication.Eval.Env.new/1`
This list of implicit casts functions as-is, meaning that in Elixir land, we can just "relabel" the type,
without doing any actual conversion, and it will work.
Types are always considered implicitly castable to themselves (as in PG code), but three casts are missing
from this list: `time` to `timetz`, `timestamp` to `timestamptz`, and `date` to `timestamptz`. Reason for this is that the implicit
cast appends a timezone of the server to the original type, which is not something that makes a whole
lot of sense to do on Electric.
Duplicated source and target usually mean that there is some property of the type that may be present
(e.g. length of the `bit` type, or precision of `interval`) but shouldn't interfere with casting
## List of implicit casts
| source | targets | function name |
| ----------- | --------------------------------- | ----------------- |
| bit | varbit,bit | |
| bpchar | text,name,varchar,bpchar | |
| char | text | |
| cidr | inet | |
| date | timestamp | date_to_timestamp |
| float4 | float8 | |
| int2 | float8,int8,int4,numeric,float4 | |
| int4 | float4,float8,numeric,int8 | |
| int8 | float8,float4,numeric | |
| interval | interval | |
| macaddr | macaddr8 | |
| macaddr8 | macaddr | |
| name | text | |
| numeric | numeric,float8,float4 | |
| text | bpchar,varchar,name | |
| time | interval | |
| time | time | |
| timestamp | timestamp | |
| timestamptz | timestamptz | |
| timetz | timetz | |
| varbit | varbit,bit | |
| varchar | name,text,bpchar,varchar | |
"""
def date_to_timestamp(date), do: NaiveDateTime.new!(date, ~T[00:00:00])
# Convert the table from moduledoc into a map
@implicit_casts @moduledoc
|> Electric.Utils.parse_md_table(after: "## List of implicit casts")
|> Enum.flat_map(fn [type, targets, fun] ->
fun =
case fun do
"" -> :as_is
fun -> {__MODULE__, String.to_existing_atom(fun)}
end
Enum.map(String.split(targets, ","), fn target ->
{{String.to_atom(type), String.to_atom(target)}, fun}
end)
end)
|> Map.new()
def known, do: @implicit_casts
end