From e348dc494d7ad0559767c66282b08cc4cb52f327 Mon Sep 17 00:00:00 2001 From: Gleb Ivanov Date: Tue, 4 Mar 2025 12:08:14 +0300 Subject: [PATCH 1/2] Add ltxtquery support --- lib/postgrex/extensions/ltxtquery.ex | 37 ++++++++++++++++++++++++++++ lib/postgrex/utils.ex | 1 + test/query_test.exs | 12 +++++++++ 3 files changed, 50 insertions(+) create mode 100644 lib/postgrex/extensions/ltxtquery.ex diff --git a/lib/postgrex/extensions/ltxtquery.ex b/lib/postgrex/extensions/ltxtquery.ex new file mode 100644 index 00000000..dcc0ca3b --- /dev/null +++ b/lib/postgrex/extensions/ltxtquery.ex @@ -0,0 +1,37 @@ +defmodule Postgrex.Extensions.Ltxtquery do + @moduledoc false + import Postgrex.BinaryUtils, warn: false + use Postgrex.BinaryExtension, type: "ltxtquery" + + @impl true + def init(opts), do: Keyword.get(opts, :decode_binary, :copy) + + # ltxtquery binary formats are versioned + # https://github.com/postgres/postgres/blob/master/contrib/ltree/ltxtquery_io.c + @impl true + def encode(_state) do + quote location: :keep, generated: true do + bin when is_binary(bin) -> + version = 1 + size = byte_size(bin) + 1 + [<> | bin] + end + end + + @impl true + def decode(:reference) do + quote location: :keep do + <> -> + <<_version::int8(), ltxtquery::binary>> = bin + ltxtquery + end + end + + def decode(:copy) do + quote location: :keep do + <> -> + <<_version::int8(), ltxtquery::binary>> = bin + :binary.copy(ltxtquery) + end + end +end diff --git a/lib/postgrex/utils.ex b/lib/postgrex/utils.ex index e227c346..7923221a 100644 --- a/lib/postgrex/utils.ex +++ b/lib/postgrex/utils.ex @@ -22,6 +22,7 @@ defmodule Postgrex.Utils do Postgrex.Extensions.LineSegment, Postgrex.Extensions.Lquery, Postgrex.Extensions.Ltree, + Postgrex.Extensions.Ltxtquery, Postgrex.Extensions.MACADDR, Postgrex.Extensions.Multirange, Postgrex.Extensions.Name, diff --git a/test/query_test.exs b/test/query_test.exs index d8f8510e..5730204d 100644 --- a/test/query_test.exs +++ b/test/query_test.exs @@ -765,6 +765,12 @@ defmodule QueryTest do assert [[ltree]] == query("SELECT '#{ltree}'::ltree", []) end + @tag min_pg_version: "13.0" + test "decode ltxtquery", context do + ltxtquery = "Europe% & Russia@* & !( Transportation & Test )" + assert [[ltxtquery]] == query("SELECT '#{ltxtquery}'::ltxtquery", []) + end + test "encode oid and its aliases", context do # oid's range is 0 to 4294967295 assert [[0]] = query("select $1::oid;", [0]) @@ -1533,6 +1539,12 @@ defmodule QueryTest do assert [[ltree]] == query("SELECT $1::ltree", [ltree]) end + @tag min_pg_version: "13.0" + test "encode ltxtquery", context do + ltxtquery = "Europe% & Russia@* & !( Transportation & Test )" + assert [[ltxtquery]] == query("SELECT $1::ltxtquery", [ltxtquery]) + end + test "fail on encode arrays", context do assert_raise ArgumentError, "nested lists must have lists with matching lengths", fn -> query("SELECT $1::integer[]", [[[1], [1, 2]]]) From 304c4350323ad65d68f916372d3034943f440c23 Mon Sep 17 00:00:00 2001 From: Gleb Ivanov Date: Tue, 4 Mar 2025 22:42:12 +0300 Subject: [PATCH 2/2] Use actions/cache@v4 in the github workflow --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc391e3a..17c71166 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,7 @@ jobs: otp-version: ${{matrix.pair.otp}} elixir-version: ${{matrix.pair.elixir}} - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: path: | deps