From 2371711a168a84a13d2ea0dbcf0c250e62bb5d91 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 5 May 2026 08:21:40 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20correct=20glob=E2=86=92lquery=20conversi?= =?UTF-8?q?on=20in=20to=5Fquery()=20=E2=80=94=20*=20means=20single=20level?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PostgreSQL lquery bare * matches 0+ labels (not single level). Fix: * → *{1} (exactly one label), ** → * (0+ labels via placeholder). This gives standard glob semantics where * = single level, ** = recursive. --- .../schemas/ltree_helpers/procedures/to_query.sql | 14 +++++++++++--- .../sql/pgpm-ltree-helpers--0.21.0.sql | 8 +++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/ltree-helpers/deploy/schemas/ltree_helpers/procedures/to_query.sql b/packages/ltree-helpers/deploy/schemas/ltree_helpers/procedures/to_query.sql index ff75a6e2..782980fd 100644 --- a/packages/ltree-helpers/deploy/schemas/ltree_helpers/procedures/to_query.sql +++ b/packages/ltree-helpers/deploy/schemas/ltree_helpers/procedures/to_query.sql @@ -5,13 +5,21 @@ BEGIN; -- Convert a glob-style path to an lquery value. --- '/projects/*/docs' => 'projects.*.docs' --- '/projects/**' => 'projects.*{1,}' +-- Glob semantics: * = single level, ** = recursive descent +-- '/projects/*/docs' => 'projects.*{1}.docs' +-- '/projects/**' => 'projects.*' +-- '/projects/*' => 'projects.*{1}' CREATE FUNCTION ltree_helpers.to_query( glob text ) RETURNS lquery AS $$ SELECT replace( - replace(ltrim(glob, '/'), '**', '*{1,}'), + replace( + replace( + replace(ltrim(glob, '/'), '**', '__DSTAR__'), + '*', '*{1}' + ), + '__DSTAR__', '*' + ), '/', '.' )::lquery; $$ LANGUAGE sql IMMUTABLE STRICT; diff --git a/packages/ltree-helpers/sql/pgpm-ltree-helpers--0.21.0.sql b/packages/ltree-helpers/sql/pgpm-ltree-helpers--0.21.0.sql index b1265b3e..c8e51fdb 100644 --- a/packages/ltree-helpers/sql/pgpm-ltree-helpers--0.21.0.sql +++ b/packages/ltree-helpers/sql/pgpm-ltree-helpers--0.21.0.sql @@ -16,7 +16,13 @@ $EOFCODE$ LANGUAGE sql IMMUTABLE STRICT; CREATE FUNCTION ltree_helpers.to_query(glob text) RETURNS lquery AS $EOFCODE$ SELECT replace( - replace(ltrim(glob, '/'), '**', '*{1,}'), + replace( + replace( + replace(ltrim(glob, '/'), '**', '__DSTAR__'), + '*', '*{1}' + ), + '__DSTAR__', '*' + ), '/', '.' )::lquery; $EOFCODE$ LANGUAGE sql IMMUTABLE STRICT; \ No newline at end of file