Out-of-Memory with ROWTYPE assignment in PL/pgSQL FOR loop

From: "Bill Rugolsky Jr(dot)" <brugolsky(at)telemetry-investments(dot)com>
To: pgsql-bugs(at)postgresql(dot)org
Subject: Out-of-Memory with ROWTYPE assignment in PL/pgSQL FOR loop
Date: 2005-06-20 21:23:05
Message-ID: 20050620212305.GF11674@ti64.telemetry-investments.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hello,

The PL/pgSQL FOR loop in the function consume_memory() defined below
will consume VM on each iteration until the process hits its ulimit.
The problem occurs with variables of ROWTYPE; there is no unbounded
allocation when using simple types such as integer or varchar. Before I
delve into the SPI code, perhaps someone familiar with PostgreSQL internals
can spot the resource leak.

Tested with 8.0.1 and CVS head as of 2005-06-20:

-- Start of test code

-- create a table with ten million rows
CREATE TEMPORARY TABLE ten ( n integer DEFAULT 0 ) ;
INSERT INTO ten VALUES (0);
INSERT INTO ten VALUES (1);
INSERT INTO ten VALUES (2);
INSERT INTO ten VALUES (3);
INSERT INTO ten VALUES (4);
INSERT INTO ten VALUES (5);
INSERT INTO ten VALUES (6);
INSERT INTO ten VALUES (7);
INSERT INTO ten VALUES (8);
INSERT INTO ten VALUES (9);
CREATE TEMPORARY TABLE thousand AS
SELECT 100*i.n + 10*j.n + k.n AS n FROM ten AS i, ten as j, ten as k ;
CREATE TEMPORARY TABLE tenmillion AS
SELECT 10000*i.n + 10*j.n + k.n AS n FROM thousand AS i, thousand as j, ten as k ;

-- a function to consume memory
CREATE OR REPLACE FUNCTION consume_memory()
RETURNS void AS $PROC$
DECLARE
rec tenmillion%ROWTYPE ;
prev tenmillion%ROWTYPE ;
BEGIN
FOR rec IN SELECT * FROM tenmillion LOOP
prev := rec ;
END LOOP ;
RETURN ;
END
$PROC$ LANGUAGE plpgsql;

-- Until this point, memory usage is approximately constant.
-- Evaluating the above function will rapidly consume VM.

SELECT consume_memory() ;

-- End of test code

Here's a record of Committed_AS from /proc/meminfo on a Linux 2.6 system,
over the course of the test:

rugolsky(at)ti64: while : ; do grep Committed_AS /proc/meminfo ; sleep 1 ; done
Committed_AS: 225592 kB
Committed_AS: 225592 kB
Committed_AS: 233692 kB <- Started
Committed_AS: 258280 kB
Committed_AS: 282868 kB
Committed_AS: 299260 kB
Committed_AS: 323848 kB
Committed_AS: 340232 kB
Committed_AS: 348436 kB
Committed_AS: 356632 kB
Committed_AS: 381220 kB
Committed_AS: 397612 kB
Committed_AS: 414004 kB
Committed_AS: 422200 kB
Committed_AS: 438592 kB
Committed_AS: 463180 kB
Committed_AS: 487768 kB
Committed_AS: 504160 kB
Committed_AS: 504160 kB
Committed_AS: 520552 kB
Committed_AS: 545140 kB
Committed_AS: 569728 kB
Committed_AS: 586120 kB
Committed_AS: 586120 kB
Committed_AS: 602512 kB
Committed_AS: 225640 kB <- Cancelled

Regards,

Bill Rugolsky

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tatsuo Ishii 2005-06-20 22:37:12 Re: BUG #1721: mutiple bytes character string comaprison
Previous Message Magnus Hagander 2005-06-20 20:01:04 Re: BUG #1721: mutiple bytes character string comaprison error