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 1wBPU3-00126X-2D for pgsql-hackers@arkaria.postgresql.org; Sat, 11 Apr 2026 03:58:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wBPU2-00FW2r-06 for pgsql-hackers@arkaria.postgresql.org; Sat, 11 Apr 2026 03:58:10 +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 1wBPU1-00FW2j-2I for pgsql-hackers@lists.postgresql.org; Sat, 11 Apr 2026 03:58:10 +0000 Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wBPTw-00000000Sgw-3KKx for pgsql-hackers@lists.postgresql.org; Sat, 11 Apr 2026 03:58:10 +0000 Received: by mail-vk1-xa2c.google.com with SMTP id 71dfb90a1353d-56a9a7e762bso2230830e0c.3 for ; Fri, 10 Apr 2026 20:58:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775879882; cv=none; d=google.com; s=arc-20240605; b=E0ZC5IWYFGv7QL/BD8O5nNlDOLZJTgH5IXx8JaJ5crtTfZydcVgmz5WIZ5yMtOSoW+ D3X7mPIhtpIcynoiJbxdV2rm1ZmtdrxnGfZVUe//YGhxxe+/l/xsrRgmnGJ/Vfk2Cfk8 EXO5+9Tc8ohzMQgpFi+gO1UpDBjf3LyhHk38fO9FiS0iBSi76IzXN5Cyb7GhXgylBAb2 7jM/RohtkyMv4Gml695K/Fnzobn5qplS7cYUVhGdlDWsso1FS8QRxi7IC7eeDVmOPtmP +R47++aFrarIvHXUkly+HoqneR9rdIAFWyj7riafOEaYx9w7qlQHFJuxM8+rO0akT5VN n6mw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=vF7rKuAm8Z4Vig08MSYmQbmaarbK/audUx9HYJAFOnA=; fh=s8dJ/kk1igS09rYHRqtZMerRAdsGA3wdK0QF8qaRi7E=; b=duE/9XqAxV6PjAaYn9K3fxk3qGayyLI50Fbiebs6I0WpUqEL1b84j12v/Pv8oo27Pw 6SG3TApCyGwRsNjtdWj3lzy16KZnfDzViHAX/S2n6NWpT7t603IN45Zpv/N0y+iPCPYM gnxvCegB3mO4dQPzFN1sVIAtXgQE++SNIswecvjd/G6QRFxSy6sIz+Cw+P5szw9R2qpK iLDg2j9vPELOEQC9NGbguTqyBWIpmU4OFW5zB/oIcSPZdaQZLAMCZ0LJ4ZYKJdaLQJMY o0/fhCne2yRKlL31cZYOWCS84BmTzdFSDTZ3a8Nmcyk5HM7h+uGp9NzuEj7lfKbPNMAx svgQ==; 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=1775879882; x=1776484682; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=vF7rKuAm8Z4Vig08MSYmQbmaarbK/audUx9HYJAFOnA=; b=hark/QcUUMmFuBf3bmUXfUatebDFPWIhZYeOOSyAJ65HA5qwok25v32+zGgALoJiwa HnXlIqhE8ioDGvJTQlzdNga1zR+HeOBQUC4Hs3yksvBpSyfvhDWKZFQ2fDlv94QPcJdM FSHMk6ONA2OLvh0u5oRvMc/P4uxLmuAdOkN+WZAamzwoV1Ndad9WsBH5hI1flD6dmPue 106ajF58LvEx6nzCLuw9tYaoaXnTE/dlVhG/xGWIA20vtEts0wIoDdlOz8DTEeQOSqz7 9m2MYCWB0d9MHFejvrZDPN563ZI/X0eaSX6HZE0uDDE37P4u8u+EW/T351sVe7eeh7o+ 6Neg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775879882; x=1776484682; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vF7rKuAm8Z4Vig08MSYmQbmaarbK/audUx9HYJAFOnA=; b=ZelNSTjCDsUoSWL+zi28EnobaPyBZltqmsN7iyauHC5u6E0mQDwa+xHzgwcav+7hml CyruIJRfh3yz71KVhLaaSvRvjMz+X11rlGgfrXcX5O7uEoAbhXBAVxfa1G/u431jjnGw OsCLaSRI/mRqY8qFmLsRzHBtGOIQLcS9KmvZU3hvP4Sv2TaQeyNolRT1pRiC/vNd8I6K Af9gWd2T7kJlrodvfMhfPmXp8hFNfwX59mbZ1Eg8LbMaRANkBk+HuLsOIm1u76ScXMOY /QU8P4e0v7BEjs5VVySZV5fdynD+2vXr1BdOqYs2uJyDOsee5jOyg+RM2egQD5oslYca 9VMw== X-Gm-Message-State: AOJu0YwBvSSo19m8HrFXaINQ26rQl/jgoyxm5mBSPwu4AhD0uplyCHY7 hpxm4d5WEM4iQEG1m7E3Y1BEH/G09V8n889trn2Bc7zEAb3e1LyuvJyfec/F6IYkdDUM8AGhLUB yVUUYAymq0RC5sidXrvvzSSfXbSMOy+M7VGDu X-Gm-Gg: AeBDieucCyBqqSJeY07B2E3UKMZ0V70S2RiLhGqOx3nwy7KL+J24D0zu2+oksQpRn8y 226kT51yzQUmkrZQ5OnY1kBcSBcepE584/58Hsn8M5oje0s+ElR87RqOc5wQIdBiJhOZ5mNUGk8 +p3jJOAPkZ3qn3AOO32nWx66PeX/XhmXeMnKt6IPppGxuQOi4n2IgYAs+9qMFh5WDDhUiRMTJ4e uFej9QIOdhs7fEV1mXy7Xt8uxszpr9DISMwE+13lypzw95cDjOMDkbAtar/Ut+FQzF58cDWsWs7 ENCtou8= X-Received: by 2002:a05:6122:45a6:b0:56a:ef51:4cae with SMTP id 71dfb90a1353d-56f3bb8a321mr2925672e0c.4.1775879881714; Fri, 10 Apr 2026 20:58:01 -0700 (PDT) MIME-Version: 1.0 From: SATYANARAYANA NARLAPURAM Date: Fri, 10 Apr 2026 20:57:50 -0700 X-Gm-Features: AQROBzBD4jqM5e-wVN4iLKIHGCq3pZ8ex1sMOs0DGWSWbE7knDkesqvMuXrrh3k Message-ID: Subject: Bug: Missing check_stack_depth() in GRAPH_TABLE rewriter To: PostgreSQL Hackers , Ashutosh Bapat , Peter Eisentraut Content-Type: multipart/mixed; boundary="000000000000839cff064f2741e5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000839cff064f2741e5 Content-Type: multipart/alternative; boundary="000000000000839cfe064f2741e3" --000000000000839cfe064f2741e3 Content-Type: text/plain; charset="UTF-8" Hi Hackers, Two recursive functions, generate_setop_from_pathqueries() and generate_queries_for_path_pattern_recurse() in GRAPH_TABLE rewriter are missing 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 limit for some systems and crashes the backend. I am proposing a stop gap fix of checking stack depth by calling check_stack_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 := ''; BEGIN FOR i IN 1..400 LOOP IF i > 1 THEN edges := edges || ', '; END IF; edges := 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, Satya --000000000000839cfe064f2741e3 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Hackers,

Two recursive functions, ge= nerate_setop_from_pathqueries() and
generate_queries_for_path_pattern_re= curse() in GRAPH_TABLE rewriter are missing check_stack_depth() calls. Cons= ider a property graph with=C2=A0 400 edge tables with a 2-hop pattern produ= ce 160,000 path queries and therefore 160,000 recursion frames in
gene= rate_setop_from_pathqueries(). This can easily exceed the OS stack limit fo= r some systems and crashes the backend.

I am proposing a= stop gap fix of checking stack depth by calling check_stack_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=C2=A0check_stack_depth() check.

Repro:

CREATE TABLE sv (id int PR= IMARY KEY);
=C2=A0 INSERT INTO sv VALUES (1);

=C2=A0 DO $$
=C2= =A0 BEGIN
=C2=A0 =C2=A0 FOR i IN 1..400 LOOP
=C2=A0 =C2=A0 =C2=A0 EXE= CUTE format(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 'CREATE TABLE se_%s (id int= PRIMARY KEY, src int, dst int)', i);
=C2=A0 =C2=A0 END LOOP;
=C2= =A0 END$$;

=C2=A0 DO $$
=C2=A0 DECLARE
=C2=A0 =C2=A0 sql text;=
=C2=A0 =C2=A0 edges text :=3D '';
=C2=A0 BEGIN
=C2=A0 =C2= =A0 FOR i IN 1..400 LOOP
=C2=A0 =C2=A0 =C2=A0 IF i > 1 THEN edges := =3D edges || ', '; END IF;
=C2=A0 =C2=A0 =C2=A0 edges :=3D edges= || format(
=C2=A0 =C2=A0 =C2=A0 =C2=A0 'se_%s KEY (id) SOURCE KEY (= src) REFERENCES sv (id) '
=C2=A0 =C2=A0 =C2=A0 =C2=A0 'DESTINATI= ON KEY (dst) REFERENCES sv (id)', i);
=C2=A0 =C2=A0 END LOOP;
=C2= =A0 =C2=A0 EXECUTE 'CREATE PROPERTY GRAPH g VERTEX TABLES (sv KEY (id))= '
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|| 'EDGE TABLES (' || e= dges || ')';
=C2=A0 END$$;

=C2=A0 SELECT * FROM GR= APH_TABLE(g
=C2=A0 =C2=A0 MATCH (a)-[e1]->(b)-[e2]->(c)
=C2=A0 = =C2=A0 COLUMNS(a.id AS a_id))
=C2=A0 LIMIT 1= ;

Thanks,
Satya
--000000000000839cfe064f2741e3-- --000000000000839cff064f2741e5 Content-Type: application/octet-stream; name="0001-graph-table-check-stack-depth.patch" Content-Disposition: attachment; filename="0001-graph-table-check-stack-depth.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mntsyvi30 RnJvbSA3OTIwNTAxYWVhNzg3N2JjZGE3NjJiZjBjZGQxNGIyMGI4MTdlYWRiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTYXR5YSBOYXJsYXB1cmFtIDxzYXR5YW5hcmxhcHVyYW1AZ21h aWwuY29tPgpEYXRlOiBTYXQsIDExIEFwciAyMDI2IDAzOjM1OjA2ICswMDAwClN1YmplY3Q6IFtQ QVRDSF0gQWRkIGNoZWNrX3N0YWNrX2RlcHRoKCkgdG8gR1JBUEhfVEFCTEUgcmV3cml0ZXIgcmVj dXJzaXZlCiBmdW5jdGlvbnMKCmdlbmVyYXRlX3NldG9wX2Zyb21fcGF0aHF1ZXJpZXMoKSBidWls ZHMgYSByaWdodC1yZWN1cnNpdmUgVU5JT04gQUxMIHRyZWUKd2l0aCByZWN1cnNpb24gZGVwdGgg ZXF1YWwgdG8gdGhlIG51bWJlciBvZiB2YWxpZCBwYXRoIHF1ZXJpZXMuIFNpbWlsYXJseSwKZ2Vu ZXJhdGVfcXVlcmllc19mb3JfcGF0aF9wYXR0ZXJuX3JlY3Vyc2UoKSByZWN1cnNlcyBvbmNlIHBl ciBwYXRoIGZhY3Rvcgpwb3NpdGlvbiB0byBlbnVtZXJhdGUgcGF0aCBjb21iaW5hdGlvbnMuIE5l aXRoZXIgZnVuY3Rpb24gY2FsbGVkCmNoZWNrX3N0YWNrX2RlcHRoKCkuCgpBZGQgY2hlY2tfc3Rh Y2tfZGVwdGgoKSB0byBib3RoIGZ1bmN0aW9ucyBzbyB0aGF0IGV4Y2Vzc2l2ZSByZWN1cnNpb24g aXMKY2F1Z2h0IGNsZWFubHkgd2l0aCBhbiBFUlJPUiByYXRoZXIgdGhhbiBhIHNlcnZlciBjcmFz aC4KLS0tCiBzcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVHcmFwaFRhYmxlLmMgfCA3ICsrKysr KysKIDEgZmlsZSBjaGFuZ2VkLCA3IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9yZXdyaXRlL3Jld3JpdGVHcmFwaFRhYmxlLmMgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jl d3JpdGVHcmFwaFRhYmxlLmMKaW5kZXggMmMzMTk5ZDMuLjQyOWVmMWNmIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVHcmFwaFRhYmxlLmMKKysrIGIvc3JjL2JhY2tlbmQv cmV3cml0ZS9yZXdyaXRlR3JhcGhUYWJsZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAi YWNjZXNzL3N5c2F0dHIuaCIKICNpbmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKICNpbmNsdWRlICJh Y2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAi Y2F0YWxvZy9wZ19vcGVyYXRvci5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvcGdyYXBoX2Vs ZW1lbnQuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX3Byb3BncmFwaF9lbGVtZW50X2xhYmVsLmgi CkBAIC0zNjEsNiArMzYyLDkgQEAgZ2VuZXJhdGVfcXVlcmllc19mb3JfcGF0aF9wYXR0ZXJuX3Jl Y3Vyc2UoUmFuZ2VUYmxFbnRyeSAqcnRlLCBMaXN0ICpwYXRocXVlcmllcywKIHsKIAlMaXN0CSAg ICpwYXRoX2VsZW1zID0gbGlzdF9udGhfbm9kZShMaXN0LCBwYXRoX2VsZW1fbGlzdHMsIGVsZW1w b3MpOwogCisJLyogR3VhcmQgYWdhaW5zdCBzdGFjayBvdmVyZmxvdyBkdWUgdG8gY29tcGxleCBw YXRoIHBhdHRlcm5zLiAqLworCWNoZWNrX3N0YWNrX2RlcHRoKCk7CisKIAlmb3JlYWNoX3B0cihz dHJ1Y3QgcGF0aF9lbGVtZW50LCBwZSwgcGF0aF9lbGVtcykKIAl7CiAJCS8qIFVwZGF0ZSBjdXJy ZW50IHBhdGggYmVpbmcgYnVpbHQgd2l0aCBjdXJyZW50IGVsZW1lbnQuICovCkBAIC02OTgsNiAr NzAyLDkgQEAgZ2VuZXJhdGVfc2V0b3BfZnJvbV9wYXRocXVlcmllcyhMaXN0ICpwYXRocXVlcmll cywgTGlzdCAqKnJ0YWJsZSwgTGlzdCAqKnRhcmdldGwKIAlMaXN0CSAgICpydGFyZ2V0bGlzdDsK IAlQYXJzZU5hbWVzcGFjZUl0ZW0gKnBuaTsKIAorCS8qIEd1YXJkIGFnYWluc3Qgc3RhY2sgb3Zl cmZsb3cgZHVlIHRvIG1hbnkgcGF0aCBxdWVyaWVzLiAqLworCWNoZWNrX3N0YWNrX2RlcHRoKCk7 CisKIAkvKiBSZWN1cnNpb24gdGVybWluYXRpb24gY29uZGl0aW9uLiAqLwogCWlmIChsaXN0X2xl bmd0aChwYXRocXVlcmllcykgPT0gMCkKIAl7Ci0tIAoyLjQzLjAKCg== --000000000000839cff064f2741e5--