aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/xml.c13
-rw-r--r--src/test/regress/expected/xml.out35
-rw-r--r--src/test/regress/expected/xml_1.out12
-rw-r--r--src/test/regress/expected/xml_2.out29
-rw-r--r--src/test/regress/sql/xml.sql4
5 files changed, 81 insertions, 12 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 8893be56826..447e72b21eb 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -2114,6 +2114,19 @@ xml_errorHandler(void *data, PgXmlErrorPtr error)
switch (domain)
{
case XML_FROM_PARSER:
+
+ /*
+ * XML_ERR_NOT_WELL_BALANCED is typically reported after some
+ * other, more on-point error. Furthermore, libxml2 2.13 reports
+ * it under a completely different set of rules than prior
+ * versions. To avoid cross-version behavioral differences,
+ * suppress it so long as we already logged some error.
+ */
+ if (error->code == XML_ERR_NOT_WELL_BALANCED &&
+ xmlerrcxt->err_occurred)
+ return;
+ /* fall through */
+
case XML_FROM_NONE:
case XML_FROM_MEMORY:
case XML_FROM_IO:
diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out
index 6500cff885d..d6a51f9e38c 100644
--- a/src/test/regress/expected/xml.out
+++ b/src/test/regress/expected/xml.out
@@ -254,17 +254,11 @@ ERROR: invalid XML content
DETAIL: line 1: xmlParseEntityRef: no name
<invalidentity>&</invalidentity>
^
-line 1: chunk is not well balanced
-<invalidentity>&</invalidentity>
- ^
SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>');
ERROR: invalid XML content
DETAIL: line 1: Entity 'idontexist' not defined
<undefinedentity>&idontexist;</undefinedentity>
^
-line 1: chunk is not well balanced
-<undefinedentity>&idontexist;</undefinedentity>
- ^
SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
xmlparse
---------------------------
@@ -285,15 +279,25 @@ DETAIL: line 1: Entity 'idontexist' not defined
line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced
<twoerrors>&idontexist;</unbalanced>
^
-line 1: chunk is not well balanced
-<twoerrors>&idontexist;</unbalanced>
- ^
SELECT xmlparse(content '<nosuchprefix:tag/>');
xmlparse
---------------------
<nosuchprefix:tag/>
(1 row)
+SELECT xmlparse(content '<unclosed>');
+ERROR: invalid XML content
+DETAIL: line 1: Premature end of data in tag unclosed line 1
+<unclosed>
+ ^
+SELECT xmlparse(content '<parent><child></parent></child>');
+ERROR: invalid XML content
+DETAIL: line 1: Opening and ending tag mismatch: child line 1 and parent
+<parent><child></parent></child>
+ ^
+line 1: Opening and ending tag mismatch: parent line 1 and child
+<parent><child></parent></child>
+ ^
SELECT xmlparse(document ' ');
ERROR: invalid XML document
DETAIL: line 1: Start tag expected, '<' not found
@@ -352,6 +356,19 @@ SELECT xmlparse(document '<nosuchprefix:tag/>');
<nosuchprefix:tag/>
(1 row)
+SELECT xmlparse(document '<unclosed>');
+ERROR: invalid XML document
+DETAIL: line 1: Premature end of data in tag unclosed line 1
+<unclosed>
+ ^
+SELECT xmlparse(document '<parent><child></parent></child>');
+ERROR: invalid XML document
+DETAIL: line 1: Opening and ending tag mismatch: child line 1 and parent
+<parent><child></parent></child>
+ ^
+line 1: Opening and ending tag mismatch: parent line 1 and child
+<parent><child></parent></child>
+ ^
SELECT xmlpi(name foo);
xmlpi
---------
diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out
index 9323b84ae21..d3f2bdfc141 100644
--- a/src/test/regress/expected/xml_1.out
+++ b/src/test/regress/expected/xml_1.out
@@ -180,6 +180,12 @@ DETAIL: This functionality requires the server to be built with libxml support.
SELECT xmlparse(content '<nosuchprefix:tag/>');
ERROR: unsupported XML feature
DETAIL: This functionality requires the server to be built with libxml support.
+SELECT xmlparse(content '<unclosed>');
+ERROR: unsupported XML feature
+DETAIL: This functionality requires the server to be built with libxml support.
+SELECT xmlparse(content '<parent><child></parent></child>');
+ERROR: unsupported XML feature
+DETAIL: This functionality requires the server to be built with libxml support.
SELECT xmlparse(document ' ');
ERROR: unsupported XML feature
DETAIL: This functionality requires the server to be built with libxml support.
@@ -207,6 +213,12 @@ DETAIL: This functionality requires the server to be built with libxml support.
SELECT xmlparse(document '<nosuchprefix:tag/>');
ERROR: unsupported XML feature
DETAIL: This functionality requires the server to be built with libxml support.
+SELECT xmlparse(document '<unclosed>');
+ERROR: unsupported XML feature
+DETAIL: This functionality requires the server to be built with libxml support.
+SELECT xmlparse(document '<parent><child></parent></child>');
+ERROR: unsupported XML feature
+DETAIL: This functionality requires the server to be built with libxml support.
SELECT xmlpi(name foo);
ERROR: unsupported XML feature
DETAIL: This functionality requires the server to be built with libxml support.
diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out
index e1d165c6c93..376b7bd015b 100644
--- a/src/test/regress/expected/xml_2.out
+++ b/src/test/regress/expected/xml_2.out
@@ -250,13 +250,11 @@ ERROR: invalid XML content
DETAIL: line 1: xmlParseEntityRef: no name
<invalidentity>&</invalidentity>
^
-line 1: chunk is not well balanced
SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>');
ERROR: invalid XML content
DETAIL: line 1: Entity 'idontexist' not defined
<undefinedentity>&idontexist;</undefinedentity>
^
-line 1: chunk is not well balanced
SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
xmlparse
---------------------------
@@ -275,13 +273,25 @@ DETAIL: line 1: Entity 'idontexist' not defined
<twoerrors>&idontexist;</unbalanced>
^
line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced
-line 1: chunk is not well balanced
SELECT xmlparse(content '<nosuchprefix:tag/>');
xmlparse
---------------------
<nosuchprefix:tag/>
(1 row)
+SELECT xmlparse(content '<unclosed>');
+ERROR: invalid XML content
+DETAIL: line 1: Premature end of data in tag unclosed line 1
+<unclosed>
+ ^
+SELECT xmlparse(content '<parent><child></parent></child>');
+ERROR: invalid XML content
+DETAIL: line 1: Opening and ending tag mismatch: child line 1 and parent
+<parent><child></parent></child>
+ ^
+line 1: Opening and ending tag mismatch: parent line 1 and child
+<parent><child></parent></child>
+ ^
SELECT xmlparse(document ' ');
ERROR: invalid XML document
DETAIL: line 1: Start tag expected, '<' not found
@@ -332,6 +342,19 @@ SELECT xmlparse(document '<nosuchprefix:tag/>');
<nosuchprefix:tag/>
(1 row)
+SELECT xmlparse(document '<unclosed>');
+ERROR: invalid XML document
+DETAIL: line 1: Premature end of data in tag unclosed line 1
+<unclosed>
+ ^
+SELECT xmlparse(document '<parent><child></parent></child>');
+ERROR: invalid XML document
+DETAIL: line 1: Opening and ending tag mismatch: child line 1 and parent
+<parent><child></parent></child>
+ ^
+line 1: Opening and ending tag mismatch: parent line 1 and child
+<parent><child></parent></child>
+ ^
SELECT xmlpi(name foo);
xmlpi
---------
diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql
index 953bac09e45..15ccbe1d35d 100644
--- a/src/test/regress/sql/xml.sql
+++ b/src/test/regress/sql/xml.sql
@@ -77,6 +77,8 @@ SELECT xmlparse(content '<invalidns xmlns=''&lt;''/>');
SELECT xmlparse(content '<relativens xmlns=''relative''/>');
SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>');
SELECT xmlparse(content '<nosuchprefix:tag/>');
+SELECT xmlparse(content '<unclosed>');
+SELECT xmlparse(content '<parent><child></parent></child>');
SELECT xmlparse(document ' ');
SELECT xmlparse(document 'abc');
@@ -87,6 +89,8 @@ SELECT xmlparse(document '<invalidns xmlns=''&lt;''/>');
SELECT xmlparse(document '<relativens xmlns=''relative''/>');
SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>');
SELECT xmlparse(document '<nosuchprefix:tag/>');
+SELECT xmlparse(document '<unclosed>');
+SELECT xmlparse(document '<parent><child></parent></child>');
SELECT xmlpi(name foo);