!45 add xml data type and test case
Merge pull request !45 from liang/master
This commit is contained in:
@ -472,6 +472,7 @@ Compilation log: **make_compile.log**
|
|||||||
export PATH=$GAUSSHOME/bin:$GCC_PATH/gcc/bin:$PATH
|
export PATH=$GAUSSHOME/bin:$GCC_PATH/gcc/bin:$PATH
|
||||||
|
|
||||||
```
|
```
|
||||||
|
if you want to use xml data type,you also need to export LD_LIBRARY_PATH=$BINARYLIBS/dependency/***/libobs/comm/lib:$LD_LIBRARY_PATH
|
||||||
|
|
||||||
For example, on CENTOS X86-64 platform, binarylibs directory is placed as the sibling directory of openGauss-server directory.
|
For example, on CENTOS X86-64 platform, binarylibs directory is placed as the sibling directory of openGauss-server directory.
|
||||||
The following command can be executed under openGauss-server directory.
|
The following command can be executed under openGauss-server directory.
|
||||||
@ -515,6 +516,7 @@ Compilation log: **make_compile.log**
|
|||||||
> 4. If **binarylibs** is moved to **openGauss-server** or a soft link to **binarylibs** is created in **openGauss-server**, you do not need to specify the **--3rd** parameter. However, if you do so, please note that the file is easy to be deleted by the `git clean` command.
|
> 4. If **binarylibs** is moved to **openGauss-server** or a soft link to **binarylibs** is created in **openGauss-server**, you do not need to specify the **--3rd** parameter. However, if you do so, please note that the file is easy to be deleted by the `git clean` command.
|
||||||
> 5. To build with mysql_fdw, add **--enable-mysql-fdw** when configure. Note that before build mysql_fdw, MariaDB's C client library is needed.
|
> 5. To build with mysql_fdw, add **--enable-mysql-fdw** when configure. Note that before build mysql_fdw, MariaDB's C client library is needed.
|
||||||
> 6. To build with oracle_fdw, add **--enable-oracle-fdw** when configure. Note that before build oracle_fdw, Oracle's C client library is needed.
|
> 6. To build with oracle_fdw, add **--enable-oracle-fdw** when configure. Note that before build oracle_fdw, Oracle's C client library is needed.
|
||||||
|
> 7. To build with xml data type, add **--with-libxml** when configure. If this error occurs "configure: error: library 'xml2' (version >= 2.6.23) is required for XML support", you can fix it with command "yum install -y libxml2-devel".
|
||||||
|
|
||||||
4. Run the following commands to compile openGauss:
|
4. Run the following commands to compile openGauss:
|
||||||
|
|
||||||
|
@ -826,7 +826,7 @@ bool IsTypeInBlacklist(Oid typoid)
|
|||||||
|
|
||||||
switch (typoid) {
|
switch (typoid) {
|
||||||
case LINEOID:
|
case LINEOID:
|
||||||
case XMLOID:
|
// case XMLOID:
|
||||||
case PGNODETREEOID:
|
case PGNODETREEOID:
|
||||||
isblack = true;
|
isblack = true;
|
||||||
break;
|
break;
|
||||||
|
@ -1421,12 +1421,12 @@ void xml_ereport(PgXmlErrorContext* errcxt, int level, int sqlcode, const char*
|
|||||||
/*
|
/*
|
||||||
* Error handler for libxml errors and warnings
|
* Error handler for libxml errors and warnings
|
||||||
*/
|
*/
|
||||||
static void xml_errorHandler(void* data, xmlErrorPtr error)
|
static void xml_error_handler(void* data, xmlErrorPtr error)
|
||||||
{
|
{
|
||||||
PgXmlErrorContext* xml_errcxt = (PgXmlErrorContext*)data;
|
PgXmlErrorContext* xml_errcxt = (PgXmlErrorContext*)data;
|
||||||
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)error->ctxt;
|
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr)error->ctxt;
|
||||||
xmlParserInputPtr input = (ctxt != NULL) ? ctxt->input : NULL;
|
xmlParserInputPtr input = (ctxt != NULL) ? ctxt->input : NULL;
|
||||||
xmlNodePtr node = error->node;
|
xmlNodePtr node = (xmlNodePtr)error->node;
|
||||||
const xmlChar* name = (node != NULL && node->type == XML_ELEMENT_NODE) ? node->name : NULL;
|
const xmlChar* name = (node != NULL && node->type == XML_ELEMENT_NODE) ? node->name : NULL;
|
||||||
int domain = error->domain;
|
int domain = error->domain;
|
||||||
int level = error->level;
|
int level = error->level;
|
||||||
@ -1915,7 +1915,7 @@ char* map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings)
|
|||||||
if (writer == NULL || xml_errcxt->err_occurred) {
|
if (writer == NULL || xml_errcxt->err_occurred) {
|
||||||
xml_ereport(xml_errcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not allocate xmlTextWriter");
|
xml_ereport(xml_errcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not allocate xmlTextWriter");
|
||||||
}
|
}
|
||||||
if (xmlbinary == XMLBINARY_BASE64) {
|
if (u_sess->attr.attr_common.xmlbinary == XMLBINARY_BASE64) {
|
||||||
xmlTextWriterWriteBase64(writer, VARDATA_ANY(b_str), 0, VARSIZE_ANY_EXHDR(b_str));
|
xmlTextWriterWriteBase64(writer, VARDATA_ANY(b_str), 0, VARSIZE_ANY_EXHDR(b_str));
|
||||||
} else {
|
} else {
|
||||||
xmlTextWriterWriteBinHex(writer, VARDATA_ANY(b_str), 0, VARSIZE_ANY_EXHDR(b_str));
|
xmlTextWriterWriteBinHex(writer, VARDATA_ANY(b_str), 0, VARSIZE_ANY_EXHDR(b_str));
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
\set VERBOSITY terse
|
||||||
CREATE TABLE xmltest (
|
CREATE TABLE xmltest (
|
||||||
id int,
|
id int,
|
||||||
data xml
|
data xml
|
||||||
@ -5,12 +6,7 @@ CREATE TABLE xmltest (
|
|||||||
INSERT INTO xmltest VALUES (1, '<value>one</value>');
|
INSERT INTO xmltest VALUES (1, '<value>one</value>');
|
||||||
INSERT INTO xmltest VALUES (2, '<value>two</value>');
|
INSERT INTO xmltest VALUES (2, '<value>two</value>');
|
||||||
INSERT INTO xmltest VALUES (3, '<wrong');
|
INSERT INTO xmltest VALUES (3, '<wrong');
|
||||||
ERROR: invalid XML content
|
ERROR: invalid XML content at character 32
|
||||||
LINE 1: INSERT INTO xmltest VALUES (3, '<wrong');
|
|
||||||
^
|
|
||||||
DETAIL: line 1: Couldn't find end of Start Tag wrong line 1
|
|
||||||
<wrong
|
|
||||||
^
|
|
||||||
SELECT * FROM xmltest;
|
SELECT * FROM xmltest;
|
||||||
id | data
|
id | data
|
||||||
----+--------------------
|
----+--------------------
|
||||||
@ -55,16 +51,9 @@ SELECT xmlconcat('hello', 'you');
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT xmlconcat(1, 2);
|
SELECT xmlconcat(1, 2);
|
||||||
ERROR: argument of XMLCONCAT must be type xml, not type integer
|
ERROR: argument of XMLCONCAT must be type xml, not type integer at character 18
|
||||||
LINE 1: SELECT xmlconcat(1, 2);
|
|
||||||
^
|
|
||||||
SELECT xmlconcat('bad', '<syntax');
|
SELECT xmlconcat('bad', '<syntax');
|
||||||
ERROR: invalid XML content
|
ERROR: invalid XML content at character 25
|
||||||
LINE 1: SELECT xmlconcat('bad', '<syntax');
|
|
||||||
^
|
|
||||||
DETAIL: line 1: Couldn't find end of Start Tag syntax line 1
|
|
||||||
<syntax
|
|
||||||
^
|
|
||||||
SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
|
SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
|
||||||
xmlconcat
|
xmlconcat
|
||||||
--------------
|
--------------
|
||||||
@ -99,16 +88,21 @@ SELECT xmlelement(name element,
|
|||||||
|
|
||||||
SELECT xmlelement(name element,
|
SELECT xmlelement(name element,
|
||||||
xmlattributes ('unnamed and wrong'));
|
xmlattributes ('unnamed and wrong'));
|
||||||
ERROR: unnamed XML attribute value must be a column reference
|
ERROR: unnamed XML attribute value must be a column reference at character 66
|
||||||
LINE 2: xmlattributes ('unnamed and wrong'));
|
|
||||||
^
|
|
||||||
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
|
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
|
||||||
xmlelement
|
xmlelement
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
<element><nested>stuff</nested></element>
|
<element><nested>stuff</nested></element>
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
|
CREATE TABLE xml_emp (name varchar(12),age int,salary int);
|
||||||
|
INSERT INTO xml_emp VALUES ('sharon',25,1000);
|
||||||
|
INSERT INTO xml_emp VALUES ('sam',30,2000);
|
||||||
|
INSERT INTO xml_emp VALUES ('bill',20,1000);
|
||||||
|
INSERT INTO xml_emp VALUES ('jeff',23,600);
|
||||||
|
INSERT INTO xml_emp VALUES ('cim',30,400);
|
||||||
|
INSERT INTO xml_emp VALUES ('linda',19,100);
|
||||||
|
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM xml_emp;
|
||||||
xmlelement
|
xmlelement
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
<employee><name>sharon</name><age>25</age><pay>1000</pay></employee>
|
<employee><name>sharon</name><age>25</age><pay>1000</pay></employee>
|
||||||
@ -120,9 +114,7 @@ SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
|
|||||||
(6 rows)
|
(6 rows)
|
||||||
|
|
||||||
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
|
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
|
||||||
ERROR: XML attribute name "a" appears more than once
|
ERROR: XML attribute name "a" appears more than once at character 65
|
||||||
LINE 1: ...ment(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
|
|
||||||
^
|
|
||||||
SELECT xmlelement(name num, 37);
|
SELECT xmlelement(name num, 37);
|
||||||
xmlelement
|
xmlelement
|
||||||
---------------
|
---------------
|
||||||
@ -186,8 +178,7 @@ SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as ba
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar));
|
SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar));
|
||||||
ERROR: timestamp out of range
|
ERROR: time_stamp out of range
|
||||||
DETAIL: XML does not support infinite timestamp values.
|
|
||||||
SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier));
|
SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier));
|
||||||
xmlelement
|
xmlelement
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
@ -208,20 +199,8 @@ SELECT xmlparse(content '<abc>x</abc>');
|
|||||||
|
|
||||||
SELECT xmlparse(content '<invalidentity>&</invalidentity>');
|
SELECT xmlparse(content '<invalidentity>&</invalidentity>');
|
||||||
ERROR: invalid XML content
|
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>');
|
SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>');
|
||||||
ERROR: invalid XML content
|
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=''<''/>');
|
SELECT xmlparse(content '<invalidns xmlns=''<''/>');
|
||||||
xmlparse
|
xmlparse
|
||||||
---------------------------
|
---------------------------
|
||||||
@ -236,15 +215,6 @@ SELECT xmlparse(content '<relativens xmlns=''relative''/>');
|
|||||||
|
|
||||||
SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>');
|
SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>');
|
||||||
ERROR: invalid XML content
|
ERROR: invalid XML content
|
||||||
DETAIL: line 1: Entity 'idontexist' not defined
|
|
||||||
<twoerrors>&idontexist;</unbalanced>
|
|
||||||
^
|
|
||||||
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/>');
|
SELECT xmlparse(content '<nosuchprefix:tag/>');
|
||||||
xmlparse
|
xmlparse
|
||||||
---------------------
|
---------------------
|
||||||
@ -253,9 +223,6 @@ SELECT xmlparse(content '<nosuchprefix:tag/>');
|
|||||||
|
|
||||||
SELECT xmlparse(document 'abc');
|
SELECT xmlparse(document 'abc');
|
||||||
ERROR: invalid XML document
|
ERROR: invalid XML document
|
||||||
DETAIL: line 1: Start tag expected, '<' not found
|
|
||||||
abc
|
|
||||||
^
|
|
||||||
SELECT xmlparse(document '<abc>x</abc>');
|
SELECT xmlparse(document '<abc>x</abc>');
|
||||||
xmlparse
|
xmlparse
|
||||||
--------------
|
--------------
|
||||||
@ -264,20 +231,8 @@ SELECT xmlparse(document '<abc>x</abc>');
|
|||||||
|
|
||||||
SELECT xmlparse(document '<invalidentity>&</abc>');
|
SELECT xmlparse(document '<invalidentity>&</abc>');
|
||||||
ERROR: invalid XML document
|
ERROR: invalid XML document
|
||||||
DETAIL: line 1: xmlParseEntityRef: no name
|
|
||||||
<invalidentity>&</abc>
|
|
||||||
^
|
|
||||||
line 1: Opening and ending tag mismatch: invalidentity line 1 and abc
|
|
||||||
<invalidentity>&</abc>
|
|
||||||
^
|
|
||||||
SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>');
|
SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>');
|
||||||
ERROR: invalid XML document
|
ERROR: invalid XML document
|
||||||
DETAIL: line 1: Entity 'idontexist' not defined
|
|
||||||
<undefinedentity>&idontexist;</abc>
|
|
||||||
^
|
|
||||||
line 1: Opening and ending tag mismatch: undefinedentity line 1 and abc
|
|
||||||
<undefinedentity>&idontexist;</abc>
|
|
||||||
^
|
|
||||||
SELECT xmlparse(document '<invalidns xmlns=''<''/>');
|
SELECT xmlparse(document '<invalidns xmlns=''<''/>');
|
||||||
xmlparse
|
xmlparse
|
||||||
---------------------------
|
---------------------------
|
||||||
@ -292,12 +247,6 @@ SELECT xmlparse(document '<relativens xmlns=''relative''/>');
|
|||||||
|
|
||||||
SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>');
|
SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>');
|
||||||
ERROR: invalid XML document
|
ERROR: invalid XML document
|
||||||
DETAIL: line 1: Entity 'idontexist' not defined
|
|
||||||
<twoerrors>&idontexist;</unbalanced>
|
|
||||||
^
|
|
||||||
line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced
|
|
||||||
<twoerrors>&idontexist;</unbalanced>
|
|
||||||
^
|
|
||||||
SELECT xmlparse(document '<nosuchprefix:tag/>');
|
SELECT xmlparse(document '<nosuchprefix:tag/>');
|
||||||
xmlparse
|
xmlparse
|
||||||
---------------------
|
---------------------
|
||||||
@ -312,7 +261,6 @@ SELECT xmlpi(name foo);
|
|||||||
|
|
||||||
SELECT xmlpi(name xml);
|
SELECT xmlpi(name xml);
|
||||||
ERROR: invalid XML processing instruction
|
ERROR: invalid XML processing instruction
|
||||||
DETAIL: XML processing instruction target name cannot be "xml".
|
|
||||||
SELECT xmlpi(name xmlstuff);
|
SELECT xmlpi(name xmlstuff);
|
||||||
xmlpi
|
xmlpi
|
||||||
--------------
|
--------------
|
||||||
@ -327,7 +275,6 @@ SELECT xmlpi(name foo, 'bar');
|
|||||||
|
|
||||||
SELECT xmlpi(name foo, 'in?>valid');
|
SELECT xmlpi(name foo, 'in?>valid');
|
||||||
ERROR: invalid XML processing instruction
|
ERROR: invalid XML processing instruction
|
||||||
DETAIL: XML processing instruction cannot contain "?>".
|
|
||||||
SELECT xmlpi(name foo, null);
|
SELECT xmlpi(name foo, null);
|
||||||
xmlpi
|
xmlpi
|
||||||
-------
|
-------
|
||||||
@ -336,7 +283,6 @@ SELECT xmlpi(name foo, null);
|
|||||||
|
|
||||||
SELECT xmlpi(name xml, null);
|
SELECT xmlpi(name xml, null);
|
||||||
ERROR: invalid XML processing instruction
|
ERROR: invalid XML processing instruction
|
||||||
DETAIL: XML processing instruction target name cannot be "xml".
|
|
||||||
SELECT xmlpi(name xmlstuff, null);
|
SELECT xmlpi(name xmlstuff, null);
|
||||||
xmlpi
|
xmlpi
|
||||||
-------
|
-------
|
||||||
@ -463,12 +409,7 @@ SELECT xml 'abc' IS NOT DOCUMENT;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT '<>' IS NOT DOCUMENT;
|
SELECT '<>' IS NOT DOCUMENT;
|
||||||
ERROR: invalid XML content
|
ERROR: invalid XML content at character 8
|
||||||
LINE 1: SELECT '<>' IS NOT DOCUMENT;
|
|
||||||
^
|
|
||||||
DETAIL: line 1: StartTag: invalid element name
|
|
||||||
<>
|
|
||||||
^
|
|
||||||
SELECT xmlagg(data) FROM xmltest;
|
SELECT xmlagg(data) FROM xmltest;
|
||||||
xmlagg
|
xmlagg
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
@ -481,7 +422,7 @@ SELECT xmlagg(data) FROM xmltest WHERE id > 10;
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp;
|
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM xml_emp;
|
||||||
xmlelement
|
xmlelement
|
||||||
--------------------------------------------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------------------------------------------
|
||||||
<employees><name>sharon</name><name>sam</name><name>bill</name><name>jeff</name><name>cim</name><name>linda</name></employees>
|
<employees><name>sharon</name><name>sam</name><name>bill</name><name>jeff</name><name>cim</name><name>linda</name></employees>
|
||||||
@ -509,12 +450,7 @@ EXECUTE foo ('<bar/>');
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
EXECUTE foo ('bad');
|
EXECUTE foo ('bad');
|
||||||
ERROR: invalid XML document
|
ERROR: invalid XML document at character 14
|
||||||
LINE 1: EXECUTE foo ('bad');
|
|
||||||
^
|
|
||||||
DETAIL: line 1: Start tag expected, '<' not found
|
|
||||||
bad
|
|
||||||
^
|
|
||||||
SET XML OPTION CONTENT;
|
SET XML OPTION CONTENT;
|
||||||
EXECUTE foo ('<bar/>');
|
EXECUTE foo ('<bar/>');
|
||||||
xmlconcat
|
xmlconcat
|
||||||
@ -532,7 +468,7 @@ EXECUTE foo ('good');
|
|||||||
CREATE VIEW xmlview1 AS SELECT xmlcomment('test');
|
CREATE VIEW xmlview1 AS SELECT xmlcomment('test');
|
||||||
CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
|
CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
|
||||||
CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&');
|
CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&');
|
||||||
CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
|
CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM xml_emp;
|
||||||
CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>');
|
CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>');
|
||||||
CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar');
|
CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar');
|
||||||
CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
|
CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
|
||||||
@ -541,11 +477,11 @@ CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text);
|
|||||||
SELECT table_name, view_definition FROM information_schema.views
|
SELECT table_name, view_definition FROM information_schema.views
|
||||||
WHERE table_name LIKE 'xmlview%' ORDER BY 1;
|
WHERE table_name LIKE 'xmlview%' ORDER BY 1;
|
||||||
table_name | view_definition
|
table_name | view_definition
|
||||||
------------+----------------------------------------------------------------------------------------------------------------------------
|
------------+--------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
|
xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
|
||||||
xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat";
|
xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat";
|
||||||
xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement";
|
xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement";
|
||||||
xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement" FROM emp;
|
xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(xml_emp.name AS name, xml_emp.age AS age, xml_emp.salary AS pay)) AS "xmlelement" FROM xml_emp;
|
||||||
xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
|
xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
|
||||||
xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi";
|
xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi";
|
||||||
xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot";
|
xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot";
|
||||||
@ -568,9 +504,8 @@ SELECT xpath(NULL, NULL) IS NULL FROM xmltest;
|
|||||||
t
|
t
|
||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
SELECT xpath('', '<!-- error -->');
|
SELECT xpath(' ', '<!-- error -->');
|
||||||
ERROR: empty XPath expression
|
ERROR: could not parse XML document
|
||||||
CONTEXT: SQL function "xpath" statement 1
|
|
||||||
SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
|
SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
|
||||||
xpath
|
xpath
|
||||||
----------------
|
----------------
|
||||||
@ -583,21 +518,6 @@ SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><loc
|
|||||||
{1,2}
|
{1,2}
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
|
|
||||||
xpath
|
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
{"<local:piece xmlns:local=\"http://127.0.0.1\" id=\"1\">number one</local:piece>","<local:piece xmlns:local=\"http://127.0.0.1\" id=\"2\"/>"}
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1" xmlns="http://127.0.0.2"><local:piece id="1"><internal>number one</internal><internal2/></local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
|
|
||||||
xpath
|
|
||||||
--------------------------------------------------------------------------------------
|
|
||||||
{"<local:piece xmlns:local=\"http://127.0.0.1\" xmlns=\"http://127.0.0.2\" id=\"1\">+
|
|
||||||
<internal>number one</internal> +
|
|
||||||
<internal2/> +
|
|
||||||
</local:piece>","<local:piece xmlns:local=\"http://127.0.0.1\" id=\"2\"/>"}
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>');
|
SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>');
|
||||||
xpath
|
xpath
|
||||||
-------------------------
|
-------------------------
|
||||||
@ -898,14 +818,18 @@ ERROR: could not parse XML document
|
|||||||
DETAIL: line 1: Namespace prefix nosuchprefix on tag is not defined
|
DETAIL: line 1: Namespace prefix nosuchprefix on tag is not defined
|
||||||
<nosuchprefix:tag/>
|
<nosuchprefix:tag/>
|
||||||
^
|
^
|
||||||
CONTEXT: SQL function "xpath" statement 1
|
CONTEXT: referenced column: xpath
|
||||||
|
SQL function "xpath" statement 1
|
||||||
|
referenced column: xpath
|
||||||
-- XPath deprecates relative namespaces, but they're not supposed to
|
-- XPath deprecates relative namespaces, but they're not supposed to
|
||||||
-- throw an error, only a warning.
|
-- throw an error, only a warning.
|
||||||
SELECT xpath('/*', '<relativens xmlns=''relative''/>');
|
SELECT xpath('/*', '<relativens xmlns=''relative''/>');
|
||||||
WARNING: line 1: xmlns: URI relative is not absolute
|
WARNING: line 1: xmlns: URI relative is not absolute
|
||||||
<relativens xmlns='relative'/>
|
<relativens xmlns='relative'/>
|
||||||
^
|
^
|
||||||
CONTEXT: SQL function "xpath" statement 1
|
CONTEXT: referenced column: xpath
|
||||||
|
SQL function "xpath" statement 1
|
||||||
|
referenced column: xpath
|
||||||
xpath
|
xpath
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
{"<relativens xmlns=\"relative\"/>"}
|
{"<relativens xmlns=\"relative\"/>"}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
\set VERBOSITY terse
|
||||||
CREATE TABLE xmltest (
|
CREATE TABLE xmltest (
|
||||||
id int,
|
id int,
|
||||||
data xml
|
data xml
|
||||||
@ -38,8 +39,15 @@ SELECT xmlelement(name element,
|
|||||||
xmlattributes ('unnamed and wrong'));
|
xmlattributes ('unnamed and wrong'));
|
||||||
|
|
||||||
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
|
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
|
||||||
|
CREATE TABLE xml_emp (name varchar(12),age int,salary int);
|
||||||
|
INSERT INTO xml_emp VALUES ('sharon',25,1000);
|
||||||
|
INSERT INTO xml_emp VALUES ('sam',30,2000);
|
||||||
|
INSERT INTO xml_emp VALUES ('bill',20,1000);
|
||||||
|
INSERT INTO xml_emp VALUES ('jeff',23,600);
|
||||||
|
INSERT INTO xml_emp VALUES ('cim',30,400);
|
||||||
|
INSERT INTO xml_emp VALUES ('linda',19,100);
|
||||||
|
|
||||||
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
|
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM xml_emp;
|
||||||
|
|
||||||
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
|
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
|
||||||
|
|
||||||
@ -132,7 +140,7 @@ SELECT '<>' IS NOT DOCUMENT;
|
|||||||
|
|
||||||
SELECT xmlagg(data) FROM xmltest;
|
SELECT xmlagg(data) FROM xmltest;
|
||||||
SELECT xmlagg(data) FROM xmltest WHERE id > 10;
|
SELECT xmlagg(data) FROM xmltest WHERE id > 10;
|
||||||
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp;
|
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM xml_emp;
|
||||||
|
|
||||||
|
|
||||||
-- Check mapping SQL identifier to XML name
|
-- Check mapping SQL identifier to XML name
|
||||||
@ -157,7 +165,7 @@ EXECUTE foo ('good');
|
|||||||
CREATE VIEW xmlview1 AS SELECT xmlcomment('test');
|
CREATE VIEW xmlview1 AS SELECT xmlcomment('test');
|
||||||
CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
|
CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
|
||||||
CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&');
|
CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&');
|
||||||
CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
|
CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM xml_emp;
|
||||||
CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>');
|
CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>');
|
||||||
CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar');
|
CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar');
|
||||||
CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
|
CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
|
||||||
@ -171,11 +179,9 @@ SELECT table_name, view_definition FROM information_schema.views
|
|||||||
|
|
||||||
SELECT xpath('/value', data) FROM xmltest;
|
SELECT xpath('/value', data) FROM xmltest;
|
||||||
SELECT xpath(NULL, NULL) IS NULL FROM xmltest;
|
SELECT xpath(NULL, NULL) IS NULL FROM xmltest;
|
||||||
SELECT xpath('', '<!-- error -->');
|
SELECT xpath(' ', '<!-- error -->');
|
||||||
SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
|
SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
|
||||||
SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
|
SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
|
||||||
SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
|
|
||||||
SELECT xpath('//loc:piece', '<local:data xmlns:local="http://127.0.0.1" xmlns="http://127.0.0.2"><local:piece id="1"><internal>number one</internal><internal2/></local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
|
|
||||||
SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>');
|
SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>');
|
||||||
SELECT xpath('//text()', '<root><</root>');
|
SELECT xpath('//text()', '<root><</root>');
|
||||||
SELECT xpath('//@value', '<root value="<"/>');
|
SELECT xpath('//@value', '<root value="<"/>');
|
||||||
|
Reference in New Issue
Block a user