Re: [HACKERS] [PATCH] empty xml values

2014-09-09 Thread Peter Eisentraut
On 8/30/14 12:43 PM, Ali Akbar wrote:
 While looking into this report
 http://www.postgresql.org/message-id/cf48ccfb.65a9d%tim.k...@gmail.com I
 noticed that we don't accept empty values as xml content values, even
 though this should apparently be allowed by the spec.  Attached is a
 patch to fix it (which needs updates to xml_1.out, which I omit here for
 simplicity).
 
 
 The patch works, albeit must be applied with --ignore-whitespace.
 Attached the patch + xml_1.out updates.
 
 I'm marking this ready for commit

Committed, thanks.


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] [PATCH] empty xml values

2014-08-30 Thread Ali Akbar

 While looking into this report
 http://www.postgresql.org/message-id/cf48ccfb.65a9d%tim.k...@gmail.com I
 noticed that we don't accept empty values as xml content values, even
 though this should apparently be allowed by the spec.  Attached is a
 patch to fix it (which needs updates to xml_1.out, which I omit here for
 simplicity).


The patch works, albeit must be applied with --ignore-whitespace. Attached
the patch + xml_1.out updates.

I'm marking this ready for commit
-- 
Ali Akbar
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 422be69..7abe215 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -1400,11 +1400,14 @@ xml_parse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace,
 			doc-encoding = xmlStrdup((const xmlChar *) UTF-8);
 			doc-standalone = standalone;
 
-			res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0,
-   utf8string + count, NULL);
-			if (res_code != 0 || xmlerrcxt-err_occurred)
-xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_CONTENT,
-			invalid XML content);
+			if (*(utf8string + count))
+			{
+res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0,
+	   utf8string + count, NULL);
+if (res_code != 0 || xmlerrcxt-err_occurred)
+	xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_CONTENT,
+invalid XML content);
+			}
 		}
 	}
 	PG_CATCH();
diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out
index 382f9df..6e6c673 100644
--- a/src/test/regress/expected/xml.out
+++ b/src/test/regress/expected/xml.out
@@ -194,6 +194,18 @@ SELECT xmlelement(name foo, xmlattributes( as funny, xml 'ba/r' as fun
  foo funny=lt;gt;amp;quot;' funnier=blt;a/gt;r/
 (1 row)
 
+SELECT xmlparse(content '');
+ xmlparse 
+--
+ 
+(1 row)
+
+SELECT xmlparse(content '  ');
+ xmlparse 
+--
+   
+(1 row)
+
 SELECT xmlparse(content 'abc');
  xmlparse 
 --
@@ -251,6 +263,22 @@ SELECT xmlparse(content 'nosuchprefix:tag/');
  nosuchprefix:tag/
 (1 row)
 
+SELECT xmlparse(document '');
+ERROR:  invalid XML document
+DETAIL:  line 1: switching encoding : no input
+
+^
+line 1: Document is empty
+
+^
+line 1: Start tag expected, '' not found
+
+^
+SELECT xmlparse(document '   ');
+ERROR:  invalid XML document
+DETAIL:  line 1: Start tag expected, '' not found
+   
+   ^
 SELECT xmlparse(document 'abc');
 ERROR:  invalid XML document
 DETAIL:  line 1: Start tag expected, '' not found
diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out
index a34d1f4..b0e0067 100644
--- a/src/test/regress/expected/xml_1.out
+++ b/src/test/regress/expected/xml_1.out
@@ -164,6 +164,14 @@ SELECT xmlelement(name foo, xmlattributes( as funny, xml 'ba/r' as fun
 ERROR:  unsupported XML feature
 DETAIL:  This functionality requires the server to be built with libxml support.
 HINT:  You need to rebuild PostgreSQL using --with-libxml.
+SELECT xmlparse(content '');
+ERROR:  unsupported XML feature
+DETAIL:  This functionality requires the server to be built with libxml support.
+HINT:  You need to rebuild PostgreSQL using --with-libxml.
+SELECT xmlparse(content '  ');
+ERROR:  unsupported XML feature
+DETAIL:  This functionality requires the server to be built with libxml support.
+HINT:  You need to rebuild PostgreSQL using --with-libxml.
 SELECT xmlparse(content 'abc');
 ERROR:  unsupported XML feature
 DETAIL:  This functionality requires the server to be built with libxml support.
@@ -196,6 +204,14 @@ SELECT xmlparse(content 'nosuchprefix:tag/');
 ERROR:  unsupported XML feature
 DETAIL:  This functionality requires the server to be built with libxml support.
 HINT:  You need to rebuild PostgreSQL using --with-libxml.
+SELECT xmlparse(document '');
+ERROR:  unsupported XML feature
+DETAIL:  This functionality requires the server to be built with libxml support.
+HINT:  You need to rebuild PostgreSQL using --with-libxml.
+SELECT xmlparse(document '   ');
+ERROR:  unsupported XML feature
+DETAIL:  This functionality requires the server to be built with libxml support.
+HINT:  You need to rebuild PostgreSQL using --with-libxml.
 SELECT xmlparse(document 'abc');
 ERROR:  unsupported XML feature
 DETAIL:  This functionality requires the server to be built with libxml support.
diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql
index 90d4d67..922ab7a 100644
--- a/src/test/regress/sql/xml.sql
+++ b/src/test/regress/sql/xml.sql
@@ -60,6 +60,8 @@ SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar));
 SELECT xmlelement(name foo, xmlattributes( as funny, xml 'ba/r' as funnier));
 
 
+SELECT xmlparse(content '');
+SELECT xmlparse(content '  ');
 SELECT xmlparse(content 'abc');
 SELECT xmlparse(content 'abcx/abc');
 SELECT xmlparse(content 'invalidentity/invalidentity');
@@ -69,6 +71,8 @@ SELECT xmlparse(content 'relativens xmlns=''relative''/');
 SELECT xmlparse(content 

[HACKERS] [PATCH] empty xml values

2014-05-11 Thread Peter Eisentraut
While looking into this report
http://www.postgresql.org/message-id/cf48ccfb.65a9d%tim.k...@gmail.com I
noticed that we don't accept empty values as xml content values, even
though this should apparently be allowed by the spec.  Attached is a
patch to fix it (which needs updates to xml_1.out, which I omit here for
simplicity).
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index 422be69..7abe215 100644
--- a/src/backend/utils/adt/xml.c
+++ b/src/backend/utils/adt/xml.c
@@ -1400,6 +1400,8 @@ static void SPI_sql_row_to_xmlelement(int rownum, StringInfo result,
 			doc-encoding = xmlStrdup((const xmlChar *) UTF-8);
 			doc-standalone = standalone;
 
+			if (*(utf8string + count))
+			{
 res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0,
 	   utf8string + count, NULL);
 if (res_code != 0 || xmlerrcxt-err_occurred)
@@ -1407,6 +1409,7 @@ static void SPI_sql_row_to_xmlelement(int rownum, StringInfo result,
 invalid XML content);
 			}
 		}
+	}
 	PG_CATCH();
 	{
 		if (doc != NULL)
diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out
index 382f9df..6e6c673 100644
--- a/src/test/regress/expected/xml.out
+++ b/src/test/regress/expected/xml.out
@@ -194,6 +194,18 @@ SELECT xmlelement(name foo, xmlattributes( as funny, xml 'ba/r' as fun
  foo funny=lt;gt;amp;quot;' funnier=blt;a/gt;r/
 (1 row)
 
+SELECT xmlparse(content '');
+ xmlparse 
+--
+ 
+(1 row)
+
+SELECT xmlparse(content '  ');
+ xmlparse 
+--
+   
+(1 row)
+
 SELECT xmlparse(content 'abc');
  xmlparse 
 --
@@ -251,6 +263,22 @@ SELECT xmlparse(content 'nosuchprefix:tag/');
  nosuchprefix:tag/
 (1 row)
 
+SELECT xmlparse(document '');
+ERROR:  invalid XML document
+DETAIL:  line 1: switching encoding : no input
+
+^
+line 1: Document is empty
+
+^
+line 1: Start tag expected, '' not found
+
+^
+SELECT xmlparse(document '   ');
+ERROR:  invalid XML document
+DETAIL:  line 1: Start tag expected, '' not found
+   
+   ^
 SELECT xmlparse(document 'abc');
 ERROR:  invalid XML document
 DETAIL:  line 1: Start tag expected, '' not found
diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql
index 90d4d67..922ab7a 100644
--- a/src/test/regress/sql/xml.sql
+++ b/src/test/regress/sql/xml.sql
@@ -60,6 +60,8 @@ CREATE TABLE xmltest (
 SELECT xmlelement(name foo, xmlattributes( as funny, xml 'ba/r' as funnier));
 
 
+SELECT xmlparse(content '');
+SELECT xmlparse(content '  ');
 SELECT xmlparse(content 'abc');
 SELECT xmlparse(content 'abcx/abc');
 SELECT xmlparse(content 'invalidentity/invalidentity');
@@ -69,6 +71,8 @@ CREATE TABLE xmltest (
 SELECT xmlparse(content 'twoerrorsidontexist;/unbalanced');
 SELECT xmlparse(content 'nosuchprefix:tag/');
 
+SELECT xmlparse(document '');
+SELECT xmlparse(document '   ');
 SELECT xmlparse(document 'abc');
 SELECT xmlparse(document 'abcx/abc');
 SELECT xmlparse(document 'invalidentity/abc');

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers