Skip to content

Commit f7f9a4e

Browse files
Add ltxtquery support (#735)
1 parent 8079890 commit f7f9a4e

File tree

4 files changed

+51
-1
lines changed

4 files changed

+51
-1
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jobs:
6969
otp-version: ${{matrix.pair.otp}}
7070
elixir-version: ${{matrix.pair.elixir}}
7171

72-
- uses: actions/cache@v2
72+
- uses: actions/cache@v4
7373
with:
7474
path: |
7575
deps

lib/postgrex/extensions/ltxtquery.ex

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
defmodule Postgrex.Extensions.Ltxtquery do
2+
@moduledoc false
3+
import Postgrex.BinaryUtils, warn: false
4+
use Postgrex.BinaryExtension, type: "ltxtquery"
5+
6+
@impl true
7+
def init(opts), do: Keyword.get(opts, :decode_binary, :copy)
8+
9+
# ltxtquery binary formats are versioned
10+
# https://github.com/postgres/postgres/blob/master/contrib/ltree/ltxtquery_io.c
11+
@impl true
12+
def encode(_state) do
13+
quote location: :keep, generated: true do
14+
bin when is_binary(bin) ->
15+
version = 1
16+
size = byte_size(bin) + 1
17+
[<<size::int32(), version::int8()>> | bin]
18+
end
19+
end
20+
21+
@impl true
22+
def decode(:reference) do
23+
quote location: :keep do
24+
<<len::int32(), bin::binary-size(len)>> ->
25+
<<_version::int8(), ltxtquery::binary>> = bin
26+
ltxtquery
27+
end
28+
end
29+
30+
def decode(:copy) do
31+
quote location: :keep do
32+
<<len::int32(), bin::binary-size(len)>> ->
33+
<<_version::int8(), ltxtquery::binary>> = bin
34+
:binary.copy(ltxtquery)
35+
end
36+
end
37+
end

lib/postgrex/utils.ex

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ defmodule Postgrex.Utils do
2222
Postgrex.Extensions.LineSegment,
2323
Postgrex.Extensions.Lquery,
2424
Postgrex.Extensions.Ltree,
25+
Postgrex.Extensions.Ltxtquery,
2526
Postgrex.Extensions.MACADDR,
2627
Postgrex.Extensions.Multirange,
2728
Postgrex.Extensions.Name,

test/query_test.exs

+12
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,12 @@ defmodule QueryTest do
765765
assert [[ltree]] == query("SELECT '#{ltree}'::ltree", [])
766766
end
767767

768+
@tag min_pg_version: "13.0"
769+
test "decode ltxtquery", context do
770+
ltxtquery = "Europe% & Russia@* & !( Transportation & Test )"
771+
assert [[ltxtquery]] == query("SELECT '#{ltxtquery}'::ltxtquery", [])
772+
end
773+
768774
test "encode oid and its aliases", context do
769775
# oid's range is 0 to 4294967295
770776
assert [[0]] = query("select $1::oid;", [0])
@@ -1533,6 +1539,12 @@ defmodule QueryTest do
15331539
assert [[ltree]] == query("SELECT $1::ltree", [ltree])
15341540
end
15351541

1542+
@tag min_pg_version: "13.0"
1543+
test "encode ltxtquery", context do
1544+
ltxtquery = "Europe% & Russia@* & !( Transportation & Test )"
1545+
assert [[ltxtquery]] == query("SELECT $1::ltxtquery", [ltxtquery])
1546+
end
1547+
15361548
test "fail on encode arrays", context do
15371549
assert_raise ArgumentError, "nested lists must have lists with matching lengths", fn ->
15381550
query("SELECT $1::integer[]", [[[1], [1, 2]]])

0 commit comments

Comments
 (0)