diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/adt/xml.c | 13 | ||||
-rw-r--r-- | src/test/regress/expected/xml.out | 35 | ||||
-rw-r--r-- | src/test/regress/expected/xml_1.out | 12 | ||||
-rw-r--r-- | src/test/regress/expected/xml_2.out | 29 | ||||
-rw-r--r-- | src/test/regress/sql/xml.sql | 4 |
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=''<''/>'); 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=''<''/>'); 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=''<''/>'); 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=''<''/>'); 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); |