public inbox for [email protected]  
help / color / mirror / Atom feed
From: Shaozhong SHI <[email protected]>
To: Pavel Stehule <[email protected]>
Cc: pgsql-sql <[email protected]>
Subject: Re: Memory allocation error
Date: Fri, 14 Jul 2023 08:36:46 +0100
Message-ID: <CA+i5JwYy-=tbN8P59mxd3rEE6aWo9dy=5PrYM3Fq1f67eA1ytw@mail.gmail.com> (raw)
In-Reply-To: <CAFj8pRCr=Qvsys2FKYscjWw5VR7wOYMFsHRoUwLsTZjgRV5yjQ@mail.gmail.com>
References: <CA+i5JwYtVS9z2E71PcNKAVPbOn4R2wuj-LqbJsYr_XOz73q7dQ@mail.gmail.com>
	<CAFj8pRCr=Qvsys2FKYscjWw5VR7wOYMFsHRoUwLsTZjgRV5yjQ@mail.gmail.com>

On Fri, 14 Jul 2023 at 08:14, Pavel Stehule <[email protected]> wrote:

> Hi
>
> pá 14. 7. 2023 v 8:38 odesílatel Shaozhong SHI <[email protected]>
> napsal:
>
>> A function is being called in a loop.  Sometime, there is an error.
>>
>> sqlstate: XX000
>> NOTICE:  message: invalid memory alloc request size 1073741824
>>
>> What to do to resolve the issue?
>>
>
> It depends what you do. Postgres doesn't allow to allocate bigger blocks
> than 1GB. Maybe you create too big string or too big value of some other
> type. But it can be signal of some cache bloating.
>
> Can you show source code? Can you use gdb, attach to Postgres, place
> breakpoint to this error message, and when you get this error, send stack
> trace?
>
> Regards
>
> Pavel
>

It a recursive query,.

CREATE OR REPLACE FUNCTION public.downstream_start_end_ret3333(integer)
 RETURNS record
 LANGUAGE plpgsql
AS $function$

declare
ret int;
arr int[];
rec last_arr_count;
last int;
max int;
Begin
drop table if exists t;
create temp table t (idlist int[]);
--select count(*) from t into max;
WITH RECURSIVE walk_network(id, startpoint, endpoint, name1_text,
startnode, endnode) AS (
  SELECT id, startpoint, endpoint, name1_text, startnode, endnode
    FROM primarylink1
    WHERE id = $1
  UNION ALL
  SELECT n.id, n.startpoint, n.endpoint, n.name1_text, n.startnode,
n.endnode
    FROM primarylink1 n, walk_network w
    WHERE w.endpoint=n.startpoint and w.startpoint != n.endpoint and
w.endnode =n.startnode and w.startnode != n.endnode
)
insert into t SELECT array_unique_stable(array_agg(id)) as idlist FROM
walk_network;
select idlist from t into rec.arr;
select rec.arr[array_upper(rec.arr, 1)] into rec.last;
---select count(distinct name) from t into rec.count;
drop table t;
return rec;

end;
$function$

Perhaps, it gets into a endless loop.

The original is here.  Network Walking in PostGIS · Paul Ramsey
(cleverelephant.ca)
<http://blog.cleverelephant.ca/2010/07/network-walking-in-postgis.html;

Network Walking in PostGIS · Paul Ramsey (cleverelephant.ca)
<http://blog.cleverelephant.ca/2010/07/network-walking-in-postgis.html;

Regards,

David


view thread (7+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected]
  Subject: Re: Memory allocation error
  In-Reply-To: <CA+i5JwYy-=tbN8P59mxd3rEE6aWo9dy=5PrYM3Fq1f67eA1ytw@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox