diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c
index 3748a9c..0dba2d8 100644
--- a/src/backend/regex/regexec.c
+++ b/src/backend/regex/regexec.c
@@ -488,11 +488,8 @@ cfindloop(struct vars * v,
 					return er;
 				}
 				if ((shorter) ? end == estop : end == begin)
-				{
-					/* no point in trying again */
-					*coldp = cold;
-					return REG_NOMATCH;
-				}
+					break;		/* Restart from begin + 1, so just break out */
+
 				/* go around and try again */
 				if (shorter)
 					estart = end + 1;
diff --git a/src/test/regress/expected/regex.out b/src/test/regress/expected/regex.out
index 757f2a4..9e3bc4e 100644
--- a/src/test/regress/expected/regex.out
+++ b/src/test/regress/expected/regex.out
@@ -173,3 +173,55 @@ select 'a' ~ '((((((a+|)+|)+|)+|)+|)+|)';
  t
 (1 row)
 
+-- Test backrefs with longer match
+select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*\1','i');
+ regexp_split_to_table 
+-----------------------
+ P
+ s
+ nux
+(3 rows)
+
+-- Test backrefs with shorter match
+select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*?\1','i');
+ regexp_split_to_table 
+-----------------------
+ P
+ a
+ ers
+ nux
+(4 rows)
+
+-- Test backrefs with shorter match in REGEXP_* functions
+SELECT REGEXP_SPLIT_TO_TABLE('Programmer','(\w).*?\1');
+ regexp_split_to_table 
+-----------------------
+ P
+ a
+ er
+(3 rows)
+
+SELECT REGEXP_SPLIT_TO_ARRAY('Programmer','(\w).*?\1');
+ regexp_split_to_array 
+-----------------------
+ {P,a,er}
+(1 row)
+
+SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX');
+ regexp_replace 
+----------------
+ PXXammer
+(1 row)
+
+SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX', 'g');
+ regexp_replace 
+----------------
+ PXXaXXer
+(1 row)
+
+SELECT REGEXP_MATCHES('Programmer', '(\w).*?\1');
+ regexp_matches 
+----------------
+ {r}
+(1 row)
+
diff --git a/src/test/regress/sql/regex.sql b/src/test/regress/sql/regex.sql
index 1426562..fc01320 100644
--- a/src/test/regress/sql/regex.sql
+++ b/src/test/regress/sql/regex.sql
@@ -41,3 +41,14 @@ select 'a' ~ '($|^)*';
 -- Test for infinite loop in fixempties() (Tcl bugs 3604074, 3606683)
 select 'a' ~ '((((((a)*)*)*)*)*)*';
 select 'a' ~ '((((((a+|)+|)+|)+|)+|)+|)';
+
+-- Test backrefs with longer match
+select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*\1','i');
+-- Test backrefs with shorter match
+select REGEXP_SPLIT_TO_TABLE('ProgrammersInLinux','(\w).*?\1','i');
+-- Test backrefs with shorter match in REGEXP_* functions
+SELECT REGEXP_SPLIT_TO_TABLE('Programmer','(\w).*?\1');
+SELECT REGEXP_SPLIT_TO_ARRAY('Programmer','(\w).*?\1');
+SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX');
+SELECT REGEXP_REPLACE('Programmer', '(\w).*?\1', 'XX', 'g');
+SELECT REGEXP_MATCHES('Programmer', '(\w).*?\1');
