Back-patch addition of stack overflow and interrupt checks for lquery.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 31 Mar 2020 15:37:44 +0000 (11:37 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 31 Mar 2020 15:37:44 +0000 (11:37 -0400)
Experimentation shows that it's not hard at all to drive the
old implementation of "ltree ~ lquery" match to stack overflow,
so throw in a check_stack_depth() call, as I just did in HEAD.

I wasn't able to make it take a long time, because all the
pathological cases I tried hit stack overflow first; but
I bet there are some others that do take a long time, so add
CHECK_FOR_INTERRUPTS() too.

Discussion: https://postgr.es/m/CAP_rww=waX2Oo6q+MbMSiZ9ktdj6eaJj0cQzNu=Ry2cCDij5fw@mail.gmail.com

contrib/ltree/lquery_op.c

index b6d2deb1af4b9d67cb8f97042502ac31e1b11570..15dab680c8b49d10bd465cd21f31cf4fae5a21a8 100644 (file)
@@ -8,6 +8,7 @@
 #include <ctype.h>
 
 #include "catalog/pg_collation.h"
+#include "miscadmin.h"
 #include "utils/formatting.h"
 #include "ltree.h"
 
@@ -165,6 +166,12 @@ checkCond(lquery_level *curq, int query_numlevel, ltree_level *curt, int tree_nu
    lquery_level *prevq = NULL;
    ltree_level *prevt = NULL;
 
+   /* Since this function recurses, it could be driven to stack overflow */
+   check_stack_depth();
+
+   /* Pathological patterns could take awhile, too */
+   CHECK_FOR_INTERRUPTS();
+
    if (SomeStack.muse)
    {
        high_pos = SomeStack.high_pos;