output branches before infinite recursion using connectby()?

Started by Zhenchang Xingover 21 years ago2 messages
#1Zhenchang Xing
xing@cs.ualberta.ca

hi,

is it possible to output the branches before the detection of infinite
recursion when using connectby()? My work is about software evolution
analysis. One of the questions i am interested in is class usage. For
example, class A uses B, B uses C, C uses D, and finally D uses A. I know
connectby() can detect infinite recursion, but it does not output
anything if such recursion is detected. Furthermore, to avoid infinite
recursion, the depth can be given in advance. But in the real world, I
cannot know in advance the the depth of such usage. It would be very helpful
if connectby() can output the branches before the detection of infinite
recursion. Take the above example, output: A uses B, B uses C, C uses D,
and stop when detecting D uses A.

thanks so much.
zhenchang

#2Joe Conway
mail@joeconway.com
In reply to: Zhenchang Xing (#1)
1 attachment(s)
Re: output branches before infinite recursion using connectby()?

Zhenchang Xing wrote:

is it possible to output the branches before the detection of infinite
recursion when using connectby()?

It is possible if you patch the distributed source ;-)

Not heavily tested, but the attached patch against 7.4 seems to do the
trick for me. I'm not really sure I'd want this in the distribution
though -- anyone else with opinions?

Joe

Attachments:

tablefunc-inf-rec.1.patchtext/x-patch; name=tablefunc-inf-rec.1.patchDownload
Index: tablefunc.c
===================================================================
RCS file: /cvsroot/pgsql-server/contrib/tablefunc/tablefunc.c,v
retrieving revision 1.25.2.2
diff -c -r1.25.2.2 tablefunc.c
*** tablefunc.c	11 Aug 2004 01:02:07 -0000	1.25.2.2
--- tablefunc.c	30 Sep 2004 22:51:42 -0000
***************
*** 1416,1421 ****
--- 1416,1423 ----
  
  		for (i = 0; i < proc; i++)
  		{
+ 			bool	recursion_detected = false;
+ 
  			/* initialize branch for this pass */
  			appendStringInfo(branchstr, "%s", branch);
  			appendStringInfo(chk_branchstr, "%s%s%s", branch_delim, branch, branch_delim);
***************
*** 1433,1439 ****
  
  			/* check to see if this key is also an ancestor */
  			if (strstr(chk_branchstr->data, chk_current_key->data))
! 				elog(ERROR, "infinite recursion detected");
  
  			/* OK, extend the branch */
  			appendStringInfo(branchstr, "%s%s", branch_delim, current_key);
--- 1435,1444 ----
  
  			/* check to see if this key is also an ancestor */
  			if (strstr(chk_branchstr->data, chk_current_key->data))
! 			{
! 				elog(NOTICE, "infinite recursion detected");
! 				recursion_detected = true;
! 			}
  
  			/* OK, extend the branch */
  			appendStringInfo(branchstr, "%s%s", branch_delim, current_key);
***************
*** 1471,1477 ****
  			heap_freetuple(tuple);
  
  			/* recurse using current_key_parent as the new start_with */
! 			tupstore = build_tuplestore_recursively(key_fld,
  													parent_key_fld,
  													relname,
  													orderby_fld,
--- 1476,1483 ----
  			heap_freetuple(tuple);
  
  			/* recurse using current_key_parent as the new start_with */
! 			if (!recursion_detected)
! 				tupstore = build_tuplestore_recursively(key_fld,
  													parent_key_fld,
  													relname,
  													orderby_fld,