mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Fix contrib/ltree's subpath() with negative offset.
subpath(ltree,offset,len) now correctly errors when given an offset less than -n, where n is the number of labels in the given ltree. There was a duplicate block of code that allowed an offset as low as -2n. The documentation says no such thing, so this must have been a copy-and-paste error in the original ltree patch. While here, avoid redundant calculation of "end" and write LTREE_MAX_LEVELS rather than its hard-coded value. Author: Marcus Gartner <m.a.gartner@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/CAAUGV_SvBO9gWYbaejb9nhe-mS9FkNP4QADNTdM3wdRhvLobwA@mail.gmail.com
This commit is contained in:
@@ -128,6 +128,8 @@ SELECT subpath('Top.Child1.Child2',1);
|
|||||||
Child1.Child2
|
Child1.Child2
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT subpath('Top.Child1.Child2',-4); -- error
|
||||||
|
ERROR: invalid positions
|
||||||
SELECT index('1.2.3.4.5.6','1.2');
|
SELECT index('1.2.3.4.5.6','1.2');
|
||||||
index
|
index
|
||||||
-------
|
-------
|
||||||
|
|||||||
@@ -316,23 +316,15 @@ subpath(PG_FUNCTION_ARGS)
|
|||||||
int32 end;
|
int32 end;
|
||||||
ltree *res;
|
ltree *res;
|
||||||
|
|
||||||
end = start + len;
|
|
||||||
|
|
||||||
if (start < 0)
|
if (start < 0)
|
||||||
{
|
|
||||||
start = t->numlevel + start;
|
start = t->numlevel + start;
|
||||||
end = start + len;
|
|
||||||
}
|
|
||||||
if (start < 0)
|
|
||||||
{ /* start > t->numlevel */
|
|
||||||
start = t->numlevel + start;
|
|
||||||
end = start + len;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
end = t->numlevel + len;
|
end = t->numlevel + len;
|
||||||
else if (len == 0)
|
else if (len == 0)
|
||||||
end = (fcinfo->nargs == 3) ? start : 0xffff;
|
end = (fcinfo->nargs == 3) ? start : LTREE_MAX_LEVELS;
|
||||||
|
else
|
||||||
|
end = start + len;
|
||||||
|
|
||||||
res = inner_subltree(t, start, end);
|
res = inner_subltree(t, start, end);
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ SELECT subpath('Top.Child1.Child2',0,0);
|
|||||||
SELECT subpath('Top.Child1.Child2',1,0);
|
SELECT subpath('Top.Child1.Child2',1,0);
|
||||||
SELECT subpath('Top.Child1.Child2',0);
|
SELECT subpath('Top.Child1.Child2',0);
|
||||||
SELECT subpath('Top.Child1.Child2',1);
|
SELECT subpath('Top.Child1.Child2',1);
|
||||||
|
SELECT subpath('Top.Child1.Child2',-4); -- error
|
||||||
|
|
||||||
|
|
||||||
SELECT index('1.2.3.4.5.6','1.2');
|
SELECT index('1.2.3.4.5.6','1.2');
|
||||||
|
|||||||
Reference in New Issue
Block a user