xml2-xpath-list-leak-repro.sql

application/sql

Filename: xml2-xpath-list-leak-repro.sql
Type: application/sql
Part: 0
Message: [PATCH] Fix libxml leaks in contrib/xml2 XPath functions
\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 $$;