I found the problem, it looks like nnlength := length(newnode); is not getting reset
create or replace function nnodetestt(text) returns text language plpgsql as $$ DECLARE newnode alias for $1; nnlength integer; t text; nmarker text; BEGIN nnlength := length(newnode); for i in 1..(nnlength-1) loop select into t node from (Values('threeee','N'),('threee',''),('fiveu','N'),('five','')) blast(node,nmarker) where node = substring(newnode,1,i-1)||substring(newnode,i+1,nnlength); end loop; return t; END; $$ select node as node_orig, nmarker, nnodetestt(node), case when nmarker = 'N' then nnodetestt(node) end from (Values('threeee','N'),('threee',''),('fiveu','N'),('five','')) blast(node,nmarker) "threeee";"N";"threee";"threee" "threee";"";"";"" "fiveu";"N";"";"" "five";"";"";""