Files
oracle/tpt/aot/pga_memleak.sql

52 lines
1.8 KiB
MySQL
Raw Permalink Normal View History

2026-03-12 21:23:47 +01:00
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
-- Bug 16855783 : MEMORY LEAK IN PGA ON INSERT OF XMLTYPE COLUMN
SET sqlblanklines ON;
SET serveroutput ON;
--drop table memleak_test_tab;
--CREATE TABLE memleak_test_tab (my_xmltype XMLTYPE);
DECLARE
l_my_varchar2 VARCHAR2(4001 CHAR); -- change this to CLOB and there will be a reduced memory leak.
--l_my_varchar2 CLOB;
l_pga_used_mb NUMBER;
l_dummy NUMBER;
l_my_xmltype XMLTYPE;
BEGIN
-- build XML string with length of 4001 characters.
l_my_varchar2 := '<abc>';
FOR i IN 1 .. (4000/20) - 10
LOOP
l_my_varchar2 := l_my_varchar2 || '<def>1234567890</def>'; -- reduce string size by removing final 0
END LOOP;
l_my_varchar2 := l_my_varchar2 || '</abc>';
dbms_output.put_line('Input string length: [' || LENGTH(l_my_varchar2) || ']');
-- repeatedly insert the same value in a table (XMLType column)
l_my_xmltype := XMLTYPE(l_my_varchar2);
FOR i IN 1 .. 5000
LOOP
-- l_my_xmltype := XMLTYPE(l_my_varchar2);
INSERT INTO memleak_test_tab (my_xmltype)
VALUES (l_my_xmltype);
-- following insert throws ORA-1461 which I suppose is also a bug
-- ORA-1461: can bind a LONG value only for insert into a LONG column
-- INSERT INTO memleak_test_tab (my_xmltype)
-- VALUES (XMLTYPE(l_my_varchar2));
END LOOP;
ROLLBACK;
-- Check how much memory are we currently using
SELECT round(p.pga_used_mem/1024/1024, 2) INTO l_pga_used_mb
FROM v$session s
JOIN v$process p ON p.addr = s.paddr
WHERE s."SID"=sys_context('userenv', 'sid');
dbms_output.put_line('Currently used PGA: [' || l_pga_used_mb || '] MB');
END;
/