Fix incorrect xmlschema output for types timetz and timestamptz.
authorTom Lane <[email protected]>
Fri, 18 Mar 2022 20:01:42 +0000 (16:01 -0400)
committerTom Lane <[email protected]>
Fri, 18 Mar 2022 20:01:42 +0000 (16:01 -0400)
The output of table_to_xmlschema() and allied functions includes
a regex describing valid values for these types ... but the regex
was itself invalid, as it failed to escape a literal "+" sign.

Report and fix by Renan Soares Lopes.  Back-patch to all
supported branches.

Discussion: https://postgr.es/m/7f6fabaa-3f8f-49ab-89ca-59fbfe633105@me.com

src/backend/utils/adt/xml.c
src/test/regress/expected/xmlmap.out
src/test/regress/expected/xmlmap_1.out
src/test/regress/sql/xmlmap.sql

index a456dca458de5bb413ce6e15119ca7755fb72e0e..ca51db295562fa143dffef12b704d01f7643a320 100644 (file)
@@ -3632,7 +3632,7 @@ map_sql_type_to_xmlschema_type(Oid typeoid, int typmod)
            case TIMEOID:
            case TIMETZOID:
                {
-                   const char *tz = (typeoid == TIMETZOID ? "(+|-)\\p{Nd}{2}:\\p{Nd}{2}" : "");
+                   const char *tz = (typeoid == TIMETZOID ? "(\\+|-)\\p{Nd}{2}:\\p{Nd}{2}" : "");
 
                    if (typmod == -1)
                        appendStringInfo(&result,
@@ -3655,7 +3655,7 @@ map_sql_type_to_xmlschema_type(Oid typeoid, int typmod)
            case TIMESTAMPOID:
            case TIMESTAMPTZOID:
                {
-                   const char *tz = (typeoid == TIMESTAMPTZOID ? "(+|-)\\p{Nd}{2}:\\p{Nd}{2}" : "");
+                   const char *tz = (typeoid == TIMESTAMPTZOID ? "(\\+|-)\\p{Nd}{2}:\\p{Nd}{2}" : "");
 
                    if (typmod == -1)
                        appendStringInfo(&result,
index c08f8a0d9c17a466c63a83150ce2baa49445f971..ccc5460663019bcfe280802567c73f3214b8d561 100644 (file)
@@ -2,9 +2,15 @@ CREATE SCHEMA testxmlschema;
 CREATE TABLE testxmlschema.test1 (a int, b text);
 INSERT INTO testxmlschema.test1 VALUES (1, 'one'), (2, 'two'), (-1, null);
 CREATE DOMAIN testxmldomain AS varchar;
-CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6), w numeric(9,2), v smallint, u bigint, t real, s time, r timestamp, q date, p xml, o testxmldomain, n bool, m bytea, aaa text);
+CREATE TABLE testxmlschema.test2 (z int, y varchar(500), x char(6),
+    w numeric(9,2), v smallint, u bigint, t real,
+    s time, stz timetz, r timestamp, rtz timestamptz, q date,
+    p xml, o testxmldomain, n bool, m bytea, aaa text);
 ALTER TABLE testxmlschema.test2 DROP COLUMN aaa;
-INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def', 98.6, 2, 999, 0, '21:07', '2009-06-08 21:07:30', '2009-06-08', NULL, 'ABC', true, 'XYZ');
+INSERT INTO testxmlschema.test2 VALUES (55, 'abc', 'def',
+    98.6, 2, 999, 0,
+    '21:07', '21:11 +05', '2009-06-08 21:07:30', '2009-06-08 21:07:30 -07', '2009-06-08',
+    NULL, 'ABC', true, 'XYZ');
 SELECT table_to_xml('testxmlschema.test1', false, false, '');
                          table_to_xml                          
 ---------------------------------------------------------------
@@ -107,7 +113,9 @@ SELECT table_to_xml('testxmlschema.test2', false, false, '');
    <u>999</u>                                                 +
    <t>0</t>                                                   +
    <s>21:07:00</s>                                            +
+   <stz>21:11:00+05</stz>                                     +
    <r>2009-06-08T21:07:30</r>                                 +
+   <rtz>2009-06-08T21:07:30-07:00</rtz>                       +
    <q>2009-06-08</q>                                          +
    <o>ABC</o>                                                 +
    <n>true</n>                                                +
@@ -253,113 +261,127 @@ SELECT table_to_xmlschema('testxmlschema.test1', true, true, '');
 (1 row)
 
 SELECT table_to_xmlschema('testxmlschema.test2', false, false, '');
-                                               table_to_xmlschema                                                
------------------------------------------------------------------------------------------------------------------
- <xsd:schema                                                                                                    +
-     xmlns:xsd="http://www.w3.org/2001/XMLSchema">                                                              +
-                                                                                                                +
- <xsd:simpleType name="INTEGER">                                                                                +
-   <xsd:restriction base="xsd:int">                                                                             +
-     <xsd:maxInclusive value="2147483647"/>                                                                     +
-     <xsd:minInclusive value="-2147483648"/>                                                                    +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="VARCHAR">                                                                                +
-   <xsd:restriction base="xsd:string">                                                                          +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="CHAR">                                                                                   +
-   <xsd:restriction base="xsd:string">                                                                          +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="NUMERIC">                                                                                +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="SMALLINT">                                                                               +
-   <xsd:restriction base="xsd:short">                                                                           +
-     <xsd:maxInclusive value="32767"/>                                                                          +
-     <xsd:minInclusive value="-32768"/>                                                                         +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="BIGINT">                                                                                 +
-   <xsd:restriction base="xsd:long">                                                                            +
-     <xsd:maxInclusive value="9223372036854775807"/>                                                            +
-     <xsd:minInclusive value="-9223372036854775808"/>                                                           +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="REAL">                                                                                   +
-   <xsd:restriction base="xsd:float"></xsd:restriction>                                                         +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="TIME">                                                                                   +
-   <xsd:restriction base="xsd:time">                                                                            +
-     <xsd:pattern value="\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}(.\p{Nd}+)?"/>                                            +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="TIMESTAMP">                                                                              +
-   <xsd:restriction base="xsd:dateTime">                                                                        +
-     <xsd:pattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}T\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}(.\p{Nd}+)?"/>              +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="DATE">                                                                                   +
-   <xsd:restriction base="xsd:date">                                                                            +
-     <xsd:pattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}"/>                                                       +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:complexType mixed="true">                                                                                 +
-   <xsd:sequence>                                                                                               +
-     <xsd:any name="element" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>                       +
-   </xsd:sequence>                                                                                              +
- </xsd:complexType>                                                                                             +
-                                                                                                                +
- <xsd:simpleType name="Domain.regression.public.testxmldomain">                                                 +
-   <xsd:restriction base="VARCHAR"/>                                                                            +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="BOOLEAN">                                                                                +
-   <xsd:restriction base="xsd:boolean"></xsd:restriction>                                                       +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:simpleType name="UDT.regression.pg_catalog.bytea">                                                        +
-   <xsd:restriction base="xsd:base64Binary">                                                                    +
-   </xsd:restriction>                                                                                           +
- </xsd:simpleType>                                                                                              +
-                                                                                                                +
- <xsd:complexType name="RowType.regression.testxmlschema.test2">                                                +
-   <xsd:sequence>                                                                                               +
-     <xsd:element name="z" type="INTEGER" minOccurs="0"></xsd:element>                                          +
-     <xsd:element name="y" type="VARCHAR" minOccurs="0"></xsd:element>                                          +
-     <xsd:element name="x" type="CHAR" minOccurs="0"></xsd:element>                                             +
-     <xsd:element name="w" type="NUMERIC" minOccurs="0"></xsd:element>                                          +
-     <xsd:element name="v" type="SMALLINT" minOccurs="0"></xsd:element>                                         +
-     <xsd:element name="u" type="BIGINT" minOccurs="0"></xsd:element>                                           +
-     <xsd:element name="t" type="REAL" minOccurs="0"></xsd:element>                                             +
-     <xsd:element name="s" type="TIME" minOccurs="0"></xsd:element>                                             +
-     <xsd:element name="r" type="TIMESTAMP" minOccurs="0"></xsd:element>                                        +
-     <xsd:element name="q" type="DATE" minOccurs="0"></xsd:element>                                             +
-     <xsd:element name="p" type="XML" minOccurs="0"></xsd:element>                                              +
-     <xsd:element name="o" type="Domain.regression.public.testxmldomain" minOccurs="0"></xsd:element>           +
-     <xsd:element name="n" type="BOOLEAN" minOccurs="0"></xsd:element>                                          +
-     <xsd:element name="m" type="UDT.regression.pg_catalog.bytea" minOccurs="0"></xsd:element>                  +
-   </xsd:sequence>                                                                                              +
- </xsd:complexType>                                                                                             +
-                                                                                                                +
- <xsd:complexType name="TableType.regression.testxmlschema.test2">                                              +
-   <xsd:sequence>                                                                                               +
-     <xsd:element name="row" type="RowType.regression.testxmlschema.test2" minOccurs="0" maxOccurs="unbounded"/>+
-   </xsd:sequence>                                                                                              +
- </xsd:complexType>                                                                                             +
-                                                                                                                +
- <xsd:element name="test2" type="TableType.regression.testxmlschema.test2"/>                                    +
-                                                                                                                +
+                                                     table_to_xmlschema                                                     
+----------------------------------------------------------------------------------------------------------------------------
+ <xsd:schema                                                                                                               +
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema">                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="INTEGER">                                                                                           +
+   <xsd:restriction base="xsd:int">                                                                                        +
+     <xsd:maxInclusive value="2147483647"/>                                                                                +
+     <xsd:minInclusive value="-2147483648"/>                                                                               +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="VARCHAR">                                                                                           +
+   <xsd:restriction base="xsd:string">                                                                                     +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="CHAR">                                                                                              +
+   <xsd:restriction base="xsd:string">                                                                                     +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="NUMERIC">                                                                                           +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="SMALLINT">                                                                                          +
+   <xsd:restriction base="xsd:short">                                                                                      +
+     <xsd:maxInclusive value="32767"/>                                                                                     +
+     <xsd:minInclusive value="-32768"/>                                                                                    +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="BIGINT">                                                                                            +
+   <xsd:restriction base="xsd:long">                                                                                       +
+     <xsd:maxInclusive value="9223372036854775807"/>                                                                       +
+     <xsd:minInclusive value="-9223372036854775808"/>                                                                      +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="REAL">                                                                                              +
+   <xsd:restriction base="xsd:float"></xsd:restriction>                                                                    +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="TIME">                                                                                              +
+   <xsd:restriction base="xsd:time">                                                                                       +
+     <xsd:pattern value="\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}(.\p{Nd}+)?"/>                                                       +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="TIME_WTZ">                                                                                          +
+   <xsd:restriction base="xsd:time">                                                                                       +
+     <xsd:pattern value="\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}(.\p{Nd}+)?(\+|-)\p{Nd}{2}:\p{Nd}{2}"/>                              +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="TIMESTAMP">                                                                                         +
+   <xsd:restriction base="xsd:dateTime">                                                                                   +
+     <xsd:pattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}T\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}(.\p{Nd}+)?"/>                         +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="TIMESTAMP_WTZ">                                                                                     +
+   <xsd:restriction base="xsd:dateTime">                                                                                   +
+     <xsd:pattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}T\p{Nd}{2}:\p{Nd}{2}:\p{Nd}{2}(.\p{Nd}+)?(\+|-)\p{Nd}{2}:\p{Nd}{2}"/>+
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="DATE">                                                                                              +
+   <xsd:restriction base="xsd:date">                                                                                       +
+     <xsd:pattern value="\p{Nd}{4}-\p{Nd}{2}-\p{Nd}{2}"/>                                                                  +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:complexType mixed="true">                                                                                            +
+   <xsd:sequence>                                                                                                          +
+     <xsd:any name="element" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>                                  +
+   </xsd:sequence>                                                                                                         +
+ </xsd:complexType>                                                                                                        +
+                                                                                                                           +
+ <xsd:simpleType name="Domain.regression.public.testxmldomain">                                                            +
+   <xsd:restriction base="VARCHAR"/>                                                                                       +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="BOOLEAN">                                                                                           +
+   <xsd:restriction base="xsd:boolean"></xsd:restriction>                                                                  +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:simpleType name="UDT.regression.pg_catalog.bytea">                                                                   +
+   <xsd:restriction base="xsd:base64Binary">                                                                               +
+   </xsd:restriction>                                                                                                      +
+ </xsd:simpleType>                                                                                                         +
+                                                                                                                           +
+ <xsd:complexType name="RowType.regression.testxmlschema.test2">                                                           +
+   <xsd:sequence>                                                                                                          +
+     <xsd:element name="z" type="INTEGER" minOccurs="0"></xsd:element>                                                     +
+     <xsd:element name="y" type="VARCHAR" minOccurs="0"></xsd:element>                                                     +
+     <xsd:element name="x" type="CHAR" minOccurs="0"></xsd:element>                                                        +
+     <xsd:element name="w" type="NUMERIC" minOccurs="0"></xsd:element>                                                     +
+     <xsd:element name="v" type="SMALLINT" minOccurs="0"></xsd:element>                                                    +
+     <xsd:element name="u" type="BIGINT" minOccurs="0"></xsd:element>                                                      +
+     <xsd:element name="t" type="REAL" minOccurs="0"></xsd:element>                                                        +
+     <xsd:element name="s" type="TIME" minOccurs="0"></xsd:element>                                                        +
+     <xsd:element name="stz" type="TIME_WTZ" minOccurs="0"></xsd:element>                                                  +
+     <xsd:element name="r" type="TIMESTAMP" minOccurs="0"></xsd:element>                                                   +
+     <xsd:element name="rtz" type="TIMESTAMP_WTZ" minOccurs="0"></xsd:element>                                             +
+     <xsd:element name="q" type="DATE" minOccurs="0"></xsd:element>                                                        +
+     <xsd:element name="p" type="XML" minOccurs="0"></xsd:element>                                                         +
+     <xsd:element name="o" type="Domain.regression.public.testxmldomain" minOccurs="0"></xsd:element>                      +
+     <xsd:element name="n" type="BOOLEAN" minOccurs="0"></xsd:element>                                                     +
+     <xsd:element name="m" type="UDT.regression.pg_catalog.bytea" minOccurs="0"></xsd:element>                             +
+   </xsd:sequence>                                                                                                         +
+ </xsd:complexType>                                                                                                        +
+                                                                                                                           +
+ <xsd:complexType name="TableType.regression.testxmlschema.test2">                                                         +
+   <xsd:sequence>                                                                                                          +
+     <xsd:element name="row" type="RowType.regression.testxmlschema.test2" minOccurs="0" maxOccurs="unbounded"/>           +
+   </xsd:sequence>                                                                                                         +
+ </xsd:complexType>                                                                                                        +
+                                                                                                                           +
+ <xsd:element name="test2" type="TableType.regression.testxmlschema.test2"/>                                               +
+                                                                                                                           +
  </xsd:schema>
 (1 row)
 
@@ -816,7 +838,9 @@ SELECT schema_to_xml('testxmlschema', false, true, '');
    <u>999</u>                                                         +
    <t>0</t>                                                           +
    <s>21:07:00</s>                                                    +
+   <stz>21:11:00+05</stz>                                             +
    <r>2009-06-08T21:07:30</r>                                         +
+   <rtz>2009-06-08T21:07:30-07:00</rtz>                               +
    <q>2009-06-08</q>                                                  +
    <o>ABC</o>                                                         +
    <n>true</n>                                                        +
@@ -863,7 +887,9 @@ SELECT schema_to_xml('testxmlschema', true, false, '');
    <u>999</u>                                                         +
    <t>0</t>                                                           +
    <s>21:07:00</s>          &