diff options
| -rw-r--r-- | contrib/ltree/expected/ltree.out | 2 | ||||
| -rw-r--r-- | contrib/ltree/ltree_op.c | 14 | ||||
| -rw-r--r-- | contrib/ltree/sql/ltree.sql | 1 | 
3 files changed, 6 insertions, 11 deletions
diff --git a/contrib/ltree/expected/ltree.out b/contrib/ltree/expected/ltree.out index c8eac3f6b21..d2a56628475 100644 --- a/contrib/ltree/expected/ltree.out +++ b/contrib/ltree/expected/ltree.out @@ -128,6 +128,8 @@ SELECT subpath('Top.Child1.Child2',1);   Child1.Child2  (1 row) +SELECT subpath('Top.Child1.Child2',-4);  -- error +ERROR:  invalid positions  SELECT index('1.2.3.4.5.6','1.2');   index   ------- diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c index ce9f4caad4f..e3a84db37ff 100644 --- a/contrib/ltree/ltree_op.c +++ b/contrib/ltree/ltree_op.c @@ -316,23 +316,15 @@ subpath(PG_FUNCTION_ARGS)  	int32		end;  	ltree	   *res; -	end = start + len; - -	if (start < 0) -	{ -		start = t->numlevel + start; -		end = start + len; -	}  	if (start < 0) -	{							/* start > t->numlevel */  		start = t->numlevel + start; -		end = start + len; -	}  	if (len < 0)  		end = t->numlevel + len;  	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); diff --git a/contrib/ltree/sql/ltree.sql b/contrib/ltree/sql/ltree.sql index dd705d9d7ca..77e6958c62a 100644 --- a/contrib/ltree/sql/ltree.sql +++ b/contrib/ltree/sql/ltree.sql @@ -34,6 +34,7 @@ SELECT subpath('Top.Child1.Child2',0,0);  SELECT subpath('Top.Child1.Child2',1,0);  SELECT subpath('Top.Child1.Child2',0);  SELECT subpath('Top.Child1.Child2',1); +SELECT subpath('Top.Child1.Child2',-4);  -- error  SELECT index('1.2.3.4.5.6','1.2');  | 
