Re: BUG #5448: psql \set does not terminate if variable is referenced recursively - Mailing list pgsql-bugs

From Tom Lane
Subject Re: BUG #5448: psql \set does not terminate if variable is referenced recursively
Date
Msg-id 3573.1273076403@sss.pgh.pa.us
Whole thread Raw
In response to Re: BUG #5448: psql \set does not terminate if variable is referenced recursively  ("Kevin Grittner" <Kevin.Grittner@wicourts.gov>)
Responses Re: BUG #5448: psql \set does not terminate if variable is referenced recursively  ("Kevin Grittner" <Kevin.Grittner@wicourts.gov>)
List pgsql-bugs
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> "Francis" <fmarkham@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

pgsql-bugs by date:

Previous
From: "Kevin Grittner"
Date:
Subject: Re: BUG #5448: psql \set does not terminate if variable is referenced recursively
Next
From: "Kevin Grittner"
Date:
Subject: Re: BUG #5448: psql \set does not terminate if variable is referenced recursively