Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wD1qU-002XE3-2p for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Apr 2026 15:08:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wD1qU-000F0K-0R for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Apr 2026 15:08:02 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wD1qT-000F01-2f for pgsql-hackers@lists.postgresql.org; Wed, 15 Apr 2026 15:08:01 +0000 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wD1qO-00000001Etf-2RhP for pgsql-hackers@lists.postgresql.org; Wed, 15 Apr 2026 15:08:01 +0000 Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-43d7213b6ebso2316720f8f.3 for ; Wed, 15 Apr 2026 08:07:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776265674; cv=none; d=google.com; s=arc-20240605; b=dxwspdVh+Rh0aHH666wKVJw1Hw9ouzVbbeE3Y4vS0VNUA+JUYHb6n67NsaqTIfegdT noTQMRklorQhSAquciuybU5IM4vBz5KvQj0PWdw5UCNbqRzTSd1AVxOZvESfNy17iJ/5 r9t8MEx7si4bom1kksneiPI6B1eq2pbNzTCoObe/UR8TVWAye07McMY36SQlotJhyna0 kDFE5Hvug4r7ORz3+oud9d0NnD4fhRzZ/5CyQ2z2Jh7xh8BbErGpmCmR+qx+7SJE1108 IebchThkOqGk34ONdXMbC6xNIx5XOfrFe8Jc7gNL0AbQFs0hxp7AmJcrNOmbk+HngO5I f72Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=Yvl7mEyQtEOfh+dwRaVqpOdvmQvvFjYQJQoHsJxyStQ=; fh=oVNqw9CRHYoenHXm+qMD6XfHmZCKdpC41i6FwsKLsNA=; b=DG0Cej+2f/N2bXIGekDJMks0pWlVkl5zBPAeFhY5+X95eOX2zD2m81dmyuFCHkaTGV x8qfdpj0j4lQyOaobJXYjkMyfvIeU8GylDAKmq9LN6KcOrOoeYww7NKROuWbceWDKszi taQJQGtxHxLUMuWkYoSokGnJZn0xlRiy3FHsJxwtT1F7J7r2eavsE8cS5famCE7xRBSm QxpvURQ5cCL9WM5sEvAH2a9JXWkEb+R15ToRkBeT7OonjtuVM7mqqXDZ14IL0Blqed0o WKl+9wSQu1fPy0UfNhEH2eX612WEL24Je4XGD77OFV10/IqLNtb3soSRyOT814OdTDK0 KNgQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776265674; x=1776870474; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Yvl7mEyQtEOfh+dwRaVqpOdvmQvvFjYQJQoHsJxyStQ=; b=YIOswA/8nTMQlTlK+Az1w+p7SBrxfi+QBAZ7QghE8H3aPiI2dlLzGowWdg3anpZmNc VlsoPRggEsNrJfk80EwYavCYp6khahxpGTTy7YNTc5V05N6xpeZcXSrZ+nYQaYub+Pga 3OONDz8P0zInLFMpuPi68SIgp4X9wC5BOk5MP9Qq3I8FmEYaSLsufOsycK1d/GkFIaTD +LVuLwtcOvdSvAs8pvKOl7LVCoHlnnjaoRTfOxI0wSCpfDPbEYgNVBTtEeyLPZAaWfvp 5lV4oBE0wQWBD3cWR/AadVt0ern/sTWssS8koMzeSEoOQNS0/M/wDKpKbOjjdanRca+5 Q7ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776265674; x=1776870474; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Yvl7mEyQtEOfh+dwRaVqpOdvmQvvFjYQJQoHsJxyStQ=; b=R1lrMCd8sUR0o3esBbYyY8GjyHTDvwoVRFTk0tGz6Oa70P/eKu8IeiENHGiey0MDi9 gX5DP+uxXse2mgBFy5bLV9HjrvAozBPjGYSa9UilUQPfQ+HXNNmkO6zMcq3vS+nI+jq7 PRMWzT77evt1H/+dh0UcYyhRwjDsdtqkeXxO8ENhG21yfHsG8sGB2Mj0+CGMFRFyb/Qc c1RFO47GQ8IypssLc8sAw7t9/Ror2sh8Ul/XTTgmjy68t1DIvpxNN4Q/I+oWxmrod7KO Nsv+827lZavbjjIRLxKiJG3ph6NJzSf+lfPpkTJynVLE2lYsZOmWRaHW+Cl1VyoLvDXU NT3g== X-Gm-Message-State: AOJu0YzCfoQLEDiObyV/d/1/FZxt5ut8HETqaIz1sib5TBsvlaL9OrlF oazosdJr9v0PLk0fNldn/s4znnB4IFLYQGsp37rfQqIfuF90ycCvrEMVB6ggxbzZ7CwjUU5mUAd k2O9oD62AfsVBDdeJ4SiGDOEzw598O0w= X-Gm-Gg: AeBDiev0OFV9yMMOKi1W6yVGfSV+oAr1QpJyRljPAb9P7hBqkkawZaJRT3WXaVPkS2r OkdPjjNrbRf5m/2ezTLSAyTKIWbawxKCe71l0vRBqhBuXUxrrYwflIq8FxnT0e90FkLwV42JkDB 4x6BwMAr5oNG8FP48Np63DYFIb9FIKZ54Tmay1VZ7e8M4DUFP+Oot211S8Nxtf3JNYPbYmT7YDC 7j0RRVkCT2iJhKvq3XfPUgy+HyqGhANs9M4KOUPRhVhL3mrVtC8yFqiz4LO9b5RCyMw0fzK1d6J 7MDjBN86gAst8s0Zek1Lrm9H5CK7wiocJWyEKkQLmhaezOuPLpFM4Q== X-Received: by 2002:a05:6000:24c2:b0:43d:73de:abd1 with SMTP id ffacd0b85a97d-43d73dead06mr20921797f8f.51.1776265673859; Wed, 15 Apr 2026 08:07:53 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Ashutosh Bapat Date: Wed, 15 Apr 2026 20:37:40 +0530 X-Gm-Features: AQROBzBg0GG1qP40P0ZRGrnmjkQnxFr1Wa11drrdRUKgzHwqzs6JdIHpAjWgT-U Message-ID: Subject: Re: Bug: Missing check_stack_depth() in GRAPH_TABLE rewriter To: SATYANARAYANA NARLAPURAM Cc: PostgreSQL Hackers , Peter Eisentraut Content-Type: multipart/mixed; boundary="00000000000084964c064f811462" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000084964c064f811462 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, Apr 11, 2026 at 9:28=E2=80=AFAM SATYANARAYANA NARLAPURAM wrote: > > Hi Hackers, > > Two recursive functions, generate_setop_from_pathqueries() and > generate_queries_for_path_pattern_recurse() in GRAPH_TABLE rewriter are m= issing check_stack_depth() calls. Consider a property graph with 400 edge = tables with a 2-hop pattern produce 160,000 path queries and therefore 160,= 000 recursion frames in > generate_setop_from_pathqueries(). This can easily exceed the OS stack li= mit for some systems and crashes the backend. > > I am proposing a stop gap fix of checking stack depth by calling check_st= ack_depth for now but in future we may want to reduce the recursion depth (= for example use a balanced tree to reduce depth from O(N) to O(log N). > > Attached a patch for adding the check_stack_depth() check. > > Repro: > > CREATE TABLE sv (id int PRIMARY KEY); > INSERT INTO sv VALUES (1); > > DO $$ > BEGIN > FOR i IN 1..400 LOOP > EXECUTE format( > 'CREATE TABLE se_%s (id int PRIMARY KEY, src int, dst int)', i); > END LOOP; > END$$; > > DO $$ > DECLARE > sql text; > edges text :=3D ''; > BEGIN > FOR i IN 1..400 LOOP > IF i > 1 THEN edges :=3D edges || ', '; END IF; > edges :=3D edges || format( > 'se_%s KEY (id) SOURCE KEY (src) REFERENCES sv (id) ' > 'DESTINATION KEY (dst) REFERENCES sv (id)', i); > END LOOP; > EXECUTE 'CREATE PROPERTY GRAPH g VERTEX TABLES (sv KEY (id)) ' > || 'EDGE TABLES (' || edges || ')'; > END$$; > > SELECT * FROM GRAPH_TABLE(g > MATCH (a)-[e1]->(b)-[e2]->(c) > COLUMNS(a.id AS a_id)) > LIMIT 1; > Thanks for the report. I could reproduce the segfault on my laptop. The attached patch fixes it and gives ERROR: stack depth limit exceeded. generate_queries_for_path_pattern_recurse() - has to work in a linear fashion since the elements need to be processed in an order. Each permutation of elements produces one query. These queries can be arranged in a balanced tree as you suggest OR when constructing the setop tree we could generate it in divide-and-conquer manner. However, the tree will be flattened in the planner anyway (See flatten_simple_union_all() and pull_up_simple_union_all()). Thus the final planning will require a deeper stack anyway. The code complexity doesn't seem to be worth it. I also looked at a few commits that add check_stack_depth() to see if we add tests for these scenarios. But I didn't find any. So no tests added with this commit. -- Best Wishes, Ashutosh Bapat --00000000000084964c064f811462 Content-Type: text/x-patch; charset="US-ASCII"; name="v20260415-0001-Check-for-stack-overflow-when-rewriting-gr.patch" Content-Disposition: attachment; filename="v20260415-0001-Check-for-stack-overflow-when-rewriting-gr.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo06pkyz0 RnJvbSA3MWE4NTFlOWQ3NGUxYzNkNzQ0Mjg3MDBlY2ExZjExNDM3NjAwYmNkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBc2h1dG9zaCBCYXBhdCA8YXNodXRvc2guYmFwYXQub3NzQGdt YWlsLmNvbT4KRGF0ZTogV2VkLCAxNSBBcHIgMjAyNiAxNzozODoyNSArMDUzMApTdWJqZWN0OiBb UEFUQ0ggdjIwMjYwNDE1IDIvM10gQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93IHdoZW4gcmV3cml0 aW5nIGdyYXBoCiBxdWVyaWVzLgoKZ2VuZXJhdGVfcXVlcmllc19mb3JfcGF0aF9wYXR0ZXJuX3Jl Y3Vyc2UoKSBhbmQKZ2VuZXJhdGVfc2V0b3BfZnJvbV9wYXRocXVlcmllcygpIGFyZSByZWN1cnNp dmUgZnVuY3Rpb25zLiBGb3IgYSBwcm9wZXJ0eSBncmFwaAp3aXRoIGh1bmRyZWRzIG9mIHRhYmxl cywgYSBncmFwaCBwYXR0ZXJuIHdpdGggYSBoYW5kZnVsIGVsZW1lbnQgcGF0dGVybnMgY2FuCmNh dXNlIHN0YWNrIG92ZXJmbG93LiBGaXggaXQgYnkgY2FsbGluZyBjaGVja19zdGFja19kZXB0aCgp IGF0IHRoZSBiZWdpbm5pbmcgb2YKdGhlc2UgZnVuY3Rpb25zLgoKUmVwb3J0ZWQtYnk6IFNhdHlh bmFyYXlhbmEgTmFybGFwdXJhbSA8c2F0eWFuYXJsYXB1cmFtQGdtYWlsLmNvbT4KQXV0aG9yOiBT YXR5YW5hcmF5YW5hIE5hcmxhcHVyYW0gPHNhdHlhbmFybGFwdXJhbUBnbWFpbC5jb20+ClJldmll d2VkLWJ5OiBBc2h1dG9zaCBCYXBhdCA8YXNodXRvc2guYmFwYXQub3NzQGdtYWlsLmNvbT4KRGlz Y3Vzc2lvbjogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9DQUhnK1FEZmdL MHhkZEg4ZjNlQWIrVVZuN3NCRE9udjhSdk02T2tQNEh0SEF0NmFEN3dAbWFpbC5nbWFpbC5jb20K LS0tCiBzcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVHcmFwaFRhYmxlLmMgfCA3ICsrKysrKysK IDEgZmlsZSBjaGFuZ2VkLCA3IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9yZXdyaXRlL3Jld3JpdGVHcmFwaFRhYmxlLmMgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3Jp dGVHcmFwaFRhYmxlLmMKaW5kZXggMmMzMTk5ZDMyMzAuLjQyOWVmMWNmMWY0IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVHcmFwaFRhYmxlLmMKKysrIGIvc3JjL2JhY2tl bmQvcmV3cml0ZS9yZXdyaXRlR3JhcGhUYWJsZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVk ZSAiYWNjZXNzL3N5c2F0dHIuaCIKICNpbmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKICNpbmNsdWRl ICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVk ZSAiY2F0YWxvZy9wZ19vcGVyYXRvci5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvcGdyYXBo X2VsZW1lbnQuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX3Byb3BncmFwaF9lbGVtZW50X2xhYmVs LmgiCkBAIC0zNjEsNiArMzYyLDkgQEAgZ2VuZXJhdGVfcXVlcmllc19mb3JfcGF0aF9wYXR0ZXJu X3JlY3Vyc2UoUmFuZ2VUYmxFbnRyeSAqcnRlLCBMaXN0ICpwYXRocXVlcmllcywKIHsKIAlMaXN0 CSAgICpwYXRoX2VsZW1zID0gbGlzdF9udGhfbm9kZShMaXN0LCBwYXRoX2VsZW1fbGlzdHMsIGVs ZW1wb3MpOwogCisJLyogR3VhcmQgYWdhaW5zdCBzdGFjayBvdmVyZmxvdyBkdWUgdG8gY29tcGxl eCBwYXRoIHBhdHRlcm5zLiAqLworCWNoZWNrX3N0YWNrX2RlcHRoKCk7CisKIAlmb3JlYWNoX3B0 cihzdHJ1Y3QgcGF0aF9lbGVtZW50LCBwZSwgcGF0aF9lbGVtcykKIAl7CiAJCS8qIFVwZGF0ZSBj dXJyZW50IHBhdGggYmVpbmcgYnVpbHQgd2l0aCBjdXJyZW50IGVsZW1lbnQuICovCkBAIC02OTgs NiArNzAyLDkgQEAgZ2VuZXJhdGVfc2V0b3BfZnJvbV9wYXRocXVlcmllcyhMaXN0ICpwYXRocXVl cmllcywgTGlzdCAqKnJ0YWJsZSwgTGlzdCAqKnRhcmdldGwKIAlMaXN0CSAgICpydGFyZ2V0bGlz dDsKIAlQYXJzZU5hbWVzcGFjZUl0ZW0gKnBuaTsKIAorCS8qIEd1YXJkIGFnYWluc3Qgc3RhY2sg b3ZlcmZsb3cgZHVlIHRvIG1hbnkgcGF0aCBxdWVyaWVzLiAqLworCWNoZWNrX3N0YWNrX2RlcHRo KCk7CisKIAkvKiBSZWN1cnNpb24gdGVybWluYXRpb24gY29uZGl0aW9uLiAqLwogCWlmIChsaXN0 X2xlbmd0aChwYXRocXVlcmllcykgPT0gMCkKIAl7Ci0tIAoyLjM0LjEKCg== --00000000000084964c064f811462--