2006-12-21 17:05:16 +01:00
|
|
|
CREATE TABLE xmltest (
|
|
|
|
id int,
|
|
|
|
data xml
|
|
|
|
);
|
|
|
|
INSERT INTO xmltest VALUES (1, '<value>one</value>');
|
|
|
|
INSERT INTO xmltest VALUES (2, '<value>two</value>');
|
|
|
|
INSERT INTO xmltest VALUES (3, '<wrong');
|
2006-12-28 04:17:38 +01:00
|
|
|
ERROR: invalid XML content
|
2007-01-24 00:39:16 +01:00
|
|
|
DETAIL: Entity: line 1: parser error : Couldn't find end of Start Tag wrong line 1
|
|
|
|
<wrong
|
|
|
|
^
|
2006-12-21 17:05:16 +01:00
|
|
|
SELECT * FROM xmltest;
|
|
|
|
id | data
|
|
|
|
----+--------------------
|
|
|
|
1 | <value>one</value>
|
|
|
|
2 | <value>two</value>
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
SELECT xmlcomment('test');
|
|
|
|
xmlcomment
|
|
|
|
-------------
|
|
|
|
<!--test-->
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlcomment('-test');
|
|
|
|
xmlcomment
|
|
|
|
--------------
|
|
|
|
<!---test-->
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlcomment('test-');
|
|
|
|
ERROR: invalid XML comment
|
|
|
|
SELECT xmlcomment('--test');
|
|
|
|
ERROR: invalid XML comment
|
|
|
|
SELECT xmlcomment('te st');
|
|
|
|
xmlcomment
|
|
|
|
--------------
|
|
|
|
<!--te st-->
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlconcat(xmlcomment('hello'),
|
|
|
|
xmlelement(NAME qux, 'foo'),
|
|
|
|
xmlcomment('world'));
|
|
|
|
xmlconcat
|
|
|
|
----------------------------------------
|
|
|
|
<!--hello--><qux>foo</qux><!--world-->
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlconcat('hello', 'you');
|
|
|
|
xmlconcat
|
|
|
|
-----------
|
|
|
|
helloyou
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlconcat(1, 2);
|
2007-01-25 12:53:52 +01:00
|
|
|
ERROR: argument of XMLCONCAT must be type "xml", not type integer
|
2006-12-21 17:05:16 +01:00
|
|
|
SELECT xmlconcat('bad', '<syntax');
|
2006-12-28 04:17:38 +01:00
|
|
|
ERROR: invalid XML content
|
2007-01-24 00:39:16 +01:00
|
|
|
DETAIL: Entity: line 1: parser error : Couldn't find end of Start Tag syntax line 1
|
|
|
|
<syntax
|
|
|
|
^
|
2007-01-20 10:27:20 +01:00
|
|
|
SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
|
2007-01-25 12:53:52 +01:00
|
|
|
xmlconcat
|
|
|
|
--------------
|
|
|
|
<foo/><bar/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
|
2007-01-20 12:44:15 +01:00
|
|
|
xmlconcat
|
|
|
|
-----------------------------------
|
|
|
|
<?xml version="1.1"?><foo/><bar/>
|
2007-01-20 10:27:20 +01:00
|
|
|
(1 row)
|
|
|
|
|
2006-12-21 17:05:16 +01:00
|
|
|
SELECT xmlelement(name element,
|
|
|
|
xmlattributes (1 as one, 'deuce' as two),
|
|
|
|
'content');
|
|
|
|
xmlelement
|
|
|
|
------------------------------------------------
|
|
|
|
<element one="1" two="deuce">content</element>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name element,
|
|
|
|
xmlattributes ('unnamed and wrong'));
|
2007-01-09 00:41:57 +01:00
|
|
|
ERROR: unnamed XML attribute value must be a column reference
|
2006-12-21 17:05:16 +01:00
|
|
|
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
|
|
|
|
xmlelement
|
|
|
|
-------------------------------------------
|
|
|
|
<element><nested>stuff</nested></element>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
|
|
|
|
xmlelement
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
<employee><name>sharon</name><age>25</age><pay>1000</pay></employee>
|
|
|
|
<employee><name>sam</name><age>30</age><pay>2000</pay></employee>
|
|
|
|
<employee><name>bill</name><age>20</age><pay>1000</pay></employee>
|
|
|
|
<employee><name>jeff</name><age>23</age><pay>600</pay></employee>
|
|
|
|
<employee><name>cim</name><age>30</age><pay>400</pay></employee>
|
|
|
|
<employee><name>linda</name><age>19</age><pay>100</pay></employee>
|
|
|
|
(6 rows)
|
|
|
|
|
2007-01-09 00:41:57 +01:00
|
|
|
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
|
|
|
|
ERROR: XML attribute name "a" appears more than once
|
2007-01-12 17:29:24 +01:00
|
|
|
SELECT xmlelement(name num, 37);
|
|
|
|
xmlelement
|
|
|
|
---------------
|
|
|
|
<num>37</num>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name foo, text 'bar');
|
|
|
|
xmlelement
|
|
|
|
----------------
|
|
|
|
<foo>bar</foo>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name foo, xml 'bar');
|
|
|
|
xmlelement
|
|
|
|
----------------
|
|
|
|
<foo>bar</foo>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name foo, text 'b<a/>r');
|
|
|
|
xmlelement
|
|
|
|
-------------------------
|
|
|
|
<foo>b<a/>r</foo>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name foo, xml 'b<a/>r');
|
|
|
|
xmlelement
|
|
|
|
-------------------
|
|
|
|
<foo>b<a/>r</foo>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name foo, array[1, 2, 3]);
|
|
|
|
xmlelement
|
|
|
|
-------------------------------------------------------------------------
|
|
|
|
<foo><element>1</element><element>2</element><element>3</element></foo>
|
|
|
|
(1 row)
|
|
|
|
|
2007-01-19 17:58:46 +01:00
|
|
|
SET xmlbinary TO base64;
|
|
|
|
SELECT xmlelement(name foo, bytea 'bar');
|
|
|
|
xmlelement
|
|
|
|
-----------------
|
|
|
|
<foo>YmFy</foo>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SET xmlbinary TO hex;
|
|
|
|
SELECT xmlelement(name foo, bytea 'bar');
|
|
|
|
xmlelement
|
|
|
|
-------------------
|
|
|
|
<foo>626172</foo>
|
|
|
|
(1 row)
|
|
|
|
|
2006-12-28 04:17:38 +01:00
|
|
|
SELECT xmlparse(content 'abc');
|
|
|
|
xmlparse
|
|
|
|
----------
|
|
|
|
abc
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlparse(content '<abc>x</abc>');
|
|
|
|
xmlparse
|
|
|
|
--------------
|
|
|
|
<abc>x</abc>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlparse(document 'abc');
|
|
|
|
ERROR: invalid XML document
|
2007-01-24 00:39:16 +01:00
|
|
|
DETAIL: Entity: line 1: parser error : Start tag expected, '<' not found
|
|
|
|
abc
|
|
|
|
^
|
2006-12-28 04:17:38 +01:00
|
|
|
SELECT xmlparse(document '<abc>x</abc>');
|
|
|
|
xmlparse
|
|
|
|
--------------
|
|
|
|
<abc>x</abc>
|
|
|
|
(1 row)
|
|
|
|
|
2006-12-21 17:05:16 +01:00
|
|
|
SELECT xmlpi(name foo);
|
|
|
|
xmlpi
|
|
|
|
---------
|
|
|
|
<?foo?>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlpi(name xmlstuff);
|
|
|
|
ERROR: invalid XML processing instruction
|
|
|
|
DETAIL: XML processing instruction target name cannot start with "xml".
|
|
|
|
SELECT xmlpi(name foo, 'bar');
|
|
|
|
xmlpi
|
|
|
|
-------------
|
|
|
|
<?foo bar?>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlpi(name foo, 'in?>valid');
|
|
|
|
ERROR: invalid XML processing instruction
|
|
|
|
DETAIL: XML processing instruction cannot contain "?>".
|
2007-01-07 23:49:56 +01:00
|
|
|
SELECT xmlpi(name foo, null);
|
|
|
|
xmlpi
|
|
|
|
-------
|
|
|
|
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlpi(name xmlstuff, null);
|
|
|
|
ERROR: invalid XML processing instruction
|
|
|
|
DETAIL: XML processing instruction target name cannot start with "xml".
|
|
|
|
SELECT xmlpi(name foo, ' bar');
|
|
|
|
xmlpi
|
|
|
|
-------------
|
|
|
|
<?foo bar?>
|
|
|
|
(1 row)
|
|
|
|
|
2007-01-06 20:18:36 +01:00
|
|
|
SELECT xmlroot(xml '<foo/>', version no value, standalone no value);
|
2007-01-20 10:27:20 +01:00
|
|
|
xmlroot
|
2007-01-18 14:59:11 +01:00
|
|
|
---------
|
2007-01-06 20:18:36 +01:00
|
|
|
<foo/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot(xml '<foo/>', version '2.0');
|
2007-01-25 12:53:52 +01:00
|
|
|
xmlroot
|
|
|
|
-----------------------------
|
|
|
|
<?xml version="2.0"?><foo/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
|
|
|
|
xmlroot
|
|
|
|
----------------------------------------------
|
|
|
|
<?xml version="1.0" standalone="yes"?><foo/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes);
|
|
|
|
xmlroot
|
|
|
|
----------------------------------------------
|
|
|
|
<?xml version="1.0" standalone="yes"?><foo/>
|
2007-01-06 20:18:36 +01:00
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no);
|
2007-01-25 12:53:52 +01:00
|
|
|
xmlroot
|
|
|
|
---------------------------------------------
|
|
|
|
<?xml version="1.1" standalone="no"?><foo/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no);
|
|
|
|
xmlroot
|
|
|
|
---------------------------------------------
|
|
|
|
<?xml version="1.0" standalone="no"?><foo/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value);
|
|
|
|
xmlroot
|
|
|
|
---------
|
2007-01-06 20:18:36 +01:00
|
|
|
<foo/>
|
2007-01-25 12:53:52 +01:00
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value);
|
|
|
|
xmlroot
|
|
|
|
----------------------------------------------
|
|
|
|
<?xml version="1.0" standalone="yes"?><foo/>
|
2007-01-06 20:18:36 +01:00
|
|
|
(1 row)
|
|
|
|
|
2006-12-21 17:05:16 +01:00
|
|
|
SELECT xmlroot (
|
|
|
|
xmlelement (
|
|
|
|
name gazonk,
|
|
|
|
xmlattributes (
|
|
|
|
'val' AS name,
|
|
|
|
1 + 1 AS num
|
|
|
|
),
|
|
|
|
xmlelement (
|
|
|
|
NAME qux,
|
|
|
|
'foo'
|
|
|
|
)
|
|
|
|
),
|
|
|
|
version '1.0',
|
|
|
|
standalone yes
|
|
|
|
);
|
2007-01-25 12:53:52 +01:00
|
|
|
xmlroot
|
|
|
|
------------------------------------------------------------------------------------------
|
|
|
|
<?xml version="1.0" standalone="yes"?><gazonk name="val" num="2"><qux>foo</qux></gazonk>
|
2006-12-21 17:05:16 +01:00
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlserialize(content data as character varying) FROM xmltest;
|
|
|
|
data
|
|
|
|
--------------------
|
|
|
|
<value>one</value>
|
|
|
|
<value>two</value>
|
|
|
|
(2 rows)
|
|
|
|
|
2007-01-14 14:11:54 +01:00
|
|
|
SELECT xml '<foo>bar</foo>' IS DOCUMENT;
|
|
|
|
?column?
|
|
|
|
----------
|
|
|
|
t
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT;
|
|
|
|
?column?
|
|
|
|
----------
|
|
|
|
f
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xml '<abc/>' IS NOT DOCUMENT;
|
|
|
|
?column?
|
|
|
|
----------
|
|
|
|
f
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xml 'abc' IS NOT DOCUMENT;
|
|
|
|
?column?
|
|
|
|
----------
|
|
|
|
t
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT '<>' IS NOT DOCUMENT;
|
|
|
|
ERROR: invalid XML content
|
2007-01-24 00:39:16 +01:00
|
|
|
DETAIL: Entity: line 1: parser error : StartTag: invalid element name
|
|
|
|
<>
|
|
|
|
^
|
2007-01-20 10:27:20 +01:00
|
|
|
SELECT xmlagg(data) FROM xmltest;
|
|
|
|
xmlagg
|
|
|
|
--------------------------------------
|
|
|
|
<value>one</value><value>two</value>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlagg(data) FROM xmltest WHERE id > 10;
|
|
|
|
xmlagg
|
|
|
|
--------
|
|
|
|
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp;
|
|
|
|
xmlelement
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
<employees><name>sharon</name><name>sam</name><name>bill</name><name>jeff</name><name>cim</name><name>linda</name></employees>
|
|
|
|
(1 row)
|
|
|
|
|
2006-12-21 17:05:16 +01:00
|
|
|
-- Check mapping SQL identifier to XML name
|
|
|
|
SELECT xmlpi(name ":::_xml_abc135.%-&_");
|
|
|
|
xmlpi
|
|
|
|
-------------------------------------------------
|
|
|
|
<?_x003A_::_x005F_xml_abc135._x0025_-_x0026__?>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
SELECT xmlpi(name "123");
|
|
|
|
xmlpi
|
|
|
|
---------------
|
|
|
|
<?_x0031_23?>
|
|
|
|
(1 row)
|
|
|
|
|
2007-01-25 12:53:52 +01:00
|
|
|
PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1);
|
|
|
|
SET XML OPTION DOCUMENT;
|
|
|
|
EXECUTE foo ('<bar/>');
|
|
|
|
xmlconcat
|
|
|
|
--------------
|
|
|
|
<foo/><bar/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
EXECUTE foo ('bad');
|
|
|
|
ERROR: invalid XML document
|
|
|
|
DETAIL: Entity: line 1: parser error : Start tag expected, '<' not found
|
|
|
|
bad
|
|
|
|
^
|
|
|
|
SET XML OPTION CONTENT;
|
|
|
|
EXECUTE foo ('<bar/>');
|
|
|
|
xmlconcat
|
|
|
|
--------------
|
|
|
|
<foo/><bar/>
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
EXECUTE foo ('good');
|
|
|
|
xmlconcat
|
|
|
|
------------
|
|
|
|
<foo/>good
|
|
|
|
(1 row)
|
|
|
|
|