diff --git a/contrib/ltree/expected/ltree.out b/contrib/ltree/expected/ltree.out
index d856f0dbabc2b06cc12da2328a0e37c050887418..a87738bf35d49ae9524097b633491f157a23ad6c 100644
--- a/contrib/ltree/expected/ltree.out
+++ b/contrib/ltree/expected/ltree.out
@@ -74,15 +74,15 @@ SELECT subpath('Top.Child1.Child2',0,-1);
 (1 row)
 
 SELECT subpath('Top.Child1.Child2',0,0);
-      subpath      
--------------------
- Top.Child1.Child2
+ subpath 
+---------
+ 
 (1 row)
 
 SELECT subpath('Top.Child1.Child2',1,0);
-    subpath    
----------------
- Child1.Child2
+ subpath 
+---------
+ 
 (1 row)
 
 SELECT subpath('Top.Child1.Child2',0);
diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c
index 28fcfb7f7e3bfe4c053311ba54da113fd4e48924..44721bf6d0ed88a834a23dbc5bdccc02304c1e27 100644
--- a/contrib/ltree/ltree_op.c
+++ b/contrib/ltree/ltree_op.c
@@ -196,12 +196,13 @@ inner_subltree(ltree * t, int4 startpos, int4 endpos)
 	ltree	   *res;
 	int			i;
 
-	if (startpos < 0 || endpos < 0 || startpos >= t->numlevel || startpos >= endpos)
+	if (startpos < 0 || endpos < 0 || startpos >= t->numlevel || startpos > endpos)
 		elog(ERROR, "Wrong positions");
 
 	if (endpos > t->numlevel)
 		endpos = t->numlevel;
 
+	start = end = (char *) ptr;
 	for (i = 0; i < endpos; i++)
 	{
 		if (i == startpos)
@@ -258,7 +259,7 @@ subpath(PG_FUNCTION_ARGS)
 	if (len < 0)
 		end = t->numlevel + len;
 	else if (len == 0)
-		end = 0xffff;
+		end = (fcinfo->nargs == 3) ? start : 0xffff;
 
 	res = inner_subltree(t, start, end);