]> granicus.if.org Git - postgresql/commit
Avoid recursion while processing ELSIF lists in plpgsql.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Oct 2011 19:21:51 +0000 (15:21 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Oct 2011 19:21:51 +0000 (15:21 -0400)
commit051d1ba7a02d0e8930adf228d60e8a044b9fcadb
tree1f4a3d9e6da41b802dcb6b1cf5d245fcf34def50
parent756a4ed5ad3e57c26a247234de371a6ca21806cd
Avoid recursion while processing ELSIF lists in plpgsql.

The original implementation of ELSIF in plpgsql converted the construct
into nested simple IF statements.  This was prone to stack overflow with
long ELSIF lists, in two different ways.  First, it's difficult to generate
the parsetree without using right-recursion in the bison grammar, and
that's prone to parser stack overflow since nothing can be reduced until
the whole list has been read.  Second, we'd recurse during execution, thus
creating an unnecessary risk of execution-time stack overflow.  Rewrite
so that the ELSIF list is represented as a flat list, scanned via iteration
not recursion, and generated through left-recursion in the grammar.
Per a gripe from Håvard Kongsgård.
src/pl/plpgsql/src/gram.y
src/pl/plpgsql/src/pl_exec.c
src/pl/plpgsql/src/pl_funcs.c
src/pl/plpgsql/src/plpgsql.h