xml2-xpath-list-leak-repro.sql
application/sql
Filename: xml2-xpath-list-leak-repro.sql
Type: application/sql
Part: 0
\set ON_ERROR_STOP on
CREATE EXTENSION IF NOT EXISTS xml2;
CREATE OR REPLACE FUNCTION pg_temp.vmrss_kb()
RETURNS integer
LANGUAGE sql
AS $$
SELECT ((regexp_match(
pg_read_file('/proc/' || pg_backend_pid() || '/status'),
'VmRSS:[[:space:]]+([0-9]+)[[:space:]]+kB'
))[1])::integer;
$$;
DROP TABLE IF EXISTS pg_temp.xml2_leak_list_doc;
CREATE TEMP TABLE xml2_leak_list_doc AS
SELECT '<doc>' ||
string_agg('<n>' || repeat(md5(g::text), 128) || '</n>', '') ||
'</doc>' AS doc
FROM generate_series(1, 512) AS g;
DO $$
DECLARE
before_rss bigint;
after_rss bigint;
diff bigint;
BEGIN
FOR i IN 1..10 LOOP
before_rss := pg_temp.vmrss_kb();
PERFORM length(xpath_list(doc, '//n/text()', ','))
FROM xml2_leak_list_doc;
after_rss := pg_temp.vmrss_kb();
diff := after_rss - before_rss;
RAISE NOTICE 'xpath_list i=%, total_kb=%, diff_kb=%',
i, after_rss, diff;
END LOOP;
END $$;