Skip to content
Snippets Groups Projects
Commit 2bbdf8e2 authored by Tom Lane's avatar Tom Lane
Browse files

Avoid failure when selecting a namespace node in XMLTABLE.

It appears that libxml2 doesn't bother to set the "children" field of
an XML_NAMESPACE_DECL node to null; that field just contains garbage.
In v10 and v11, this can result in a crash in XMLTABLE().  The rewrite
done in commit 251cf2e2 fixed this, somewhat accidentally, in v12.
We're not going to back-patch 251cf2e2, however.  The case apparently
doesn't have wide use, so rather than risk introducing other problems,
just add a safety check to throw an error.

Even though no bug manifests in v12/HEAD, add the relevant test case
there too, to prevent future regressions.

Chapman Flack (per private report)
parent 4a61aa4a
No related branches found
No related tags found
No related merge requests found
......@@ -1170,6 +1170,14 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
COLUMNS a int PATH 'a');
ERROR: DEFAULT namespace is not supported
SELECT * FROM XMLTABLE('.'
PASSING '<foo/>'
COLUMNS a text PATH 'foo/namespace::node()');
a
--------------------------------------
http://www.w3.org/XML/1998/namespace
(1 row)
-- used in prepare statements
PREPARE pp AS
SELECT xmltable.*
......
......@@ -1048,6 +1048,14 @@ LINE 3: PASSING '<rows xmlns="http://x.y"><row...
^
DETAIL: This functionality requires the server to be built with libxml support.
HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT * FROM XMLTABLE('.'
PASSING '<foo/>'
COLUMNS a text PATH 'foo/namespace::node()');
ERROR: unsupported XML feature
LINE 2: PASSING '<foo/>'
^
DETAIL: This functionality requires the server to be built with libxml support.
HINT: You need to rebuild PostgreSQL using --with-libxml.
-- used in prepare statements
PREPARE pp AS
SELECT xmltable.*
......
......@@ -1150,6 +1150,14 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
COLUMNS a int PATH 'a');
ERROR: DEFAULT namespace is not supported
SELECT * FROM XMLTABLE('.'
PASSING '<foo/>'
COLUMNS a text PATH 'foo/namespace::node()');
a
--------------------------------------
http://www.w3.org/XML/1998/namespace
(1 row)
-- used in prepare statements
PREPARE pp AS
SELECT xmltable.*
......
......@@ -402,6 +402,10 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
COLUMNS a int PATH 'a');
SELECT * FROM XMLTABLE('.'
PASSING '<foo/>'
COLUMNS a text PATH 'foo/namespace::node()');
-- used in prepare statements
PREPARE pp AS
SELECT xmltable.*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment