"Kevin Grittner" <kevin.gritt...@wicourts.gov> writes:
> "Francis" <fmark...@gmail.com> wrote:
>> psql \set does not terminate if a variable is referenced
>> recursively.  For example, the following will hang the psql client
>> in a nasty way:
>> 
>> db=# \set n 1
>> db=# \set n (:n + 1)
 
> It seem to me that the above doesn't hang the psql client, but a
> subsequent reference to :n does.

As near as I can tell, it's actually trying to do a recursive expansion
of the variable, which of course doesn't terminate.  On my machine it
fails after awhile with

out of dynamic memory in yy_scan_buffer()
xmalloc: out of virtual memory

but you could easily endure a lot of swapping before you get to that,
if your machine isn't carefully configured for amount of swap vs real
RAM vs max allowed process size.

I suppose the only fix is to keep track of which variables are being
actively expanded and refuse to attempt a recursive expansion.
However our options as to what to actually *do* when we detect recursion
are a bit limited.  We could print a message and treat the inner
expansion as empty --- is that good enough?

                        regards, tom lane

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to