Skip to content

Commit 8f137f0

Browse files
committed
Fix XMLTABLE() deparsing to quote namespace names if necessary.
When deparsing an XMLTABLE() expression, XML namespace names were not quoted. However, since they are parsed as ColLabel tokens, some names require double quotes to ensure that they are properly interpreted. Fix by using quote_identifier() in the deparsing code. Back-patch to all supported versions. Dean Rasheed, reviewed by Tom Lane. Discussion: https://postgr.es/m/CAEZATCXTpAS%3DncfLNTZ7YS6O5puHeLg_SUYAit%2Bcs7wsrd9Msg%40mail.gmail.com
1 parent 02a38bc commit 8f137f0

File tree

5 files changed

+26
-13
lines changed

5 files changed

+26
-13
lines changed

src/backend/utils/adt/ruleutils.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10039,7 +10039,8 @@ get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit)
1003910039
if (ns_node != NULL)
1004010040
{
1004110041
get_rule_expr(expr, context, showimplicit);
10042-
appendStringInfo(buf, " AS %s", strVal(ns_node));
10042+
appendStringInfo(buf, " AS %s",
10043+
quote_identifier(strVal(ns_node)));
1004310044
}
1004410045
else
1004510046
{

src/test/regress/expected/xml.out

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,16 +1149,20 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
11491149
10
11501150
(1 row)
11511151

1152-
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
1153-
'/zz:rows/zz:row'
1152+
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"),
1153+
'/Zz:rows/Zz:row'
11541154
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
1155-
COLUMNS a int PATH 'zz:a');
1155+
COLUMNS a int PATH 'Zz:a');
11561156
SELECT * FROM xmltableview2;
11571157
a
11581158
----
11591159
10
11601160
(1 row)
11611161

1162+
\sv xmltableview2
1163+
CREATE OR REPLACE VIEW public.xmltableview2 AS
1164+
SELECT "xmltable".a
1165+
FROM XMLTABLE(XMLNAMESPACES ('http://x.y'::text AS "Zz"), ('/Zz:rows/Zz:row'::text) PASSING ('<rows xmlns="http://x.y"><row><a>10</a></row></rows>'::xml) COLUMNS a integer PATH ('Zz:a'::text))
11621166
SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
11631167
'/rows/row'
11641168
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'

src/test/regress/expected/xml_1.out

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,10 +1029,10 @@ LINE 3: PASSING '<rows xmlns="http://x.y"><row...
10291029
^
10301030
DETAIL: This functionality requires the server to be built with libxml support.
10311031
HINT: You need to rebuild PostgreSQL using --with-libxml.
1032-
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
1033-
'/zz:rows/zz:row'
1032+
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"),
1033+
'/Zz:rows/Zz:row'
10341034
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
1035-
COLUMNS a int PATH 'zz:a');
1035+
COLUMNS a int PATH 'Zz:a');
10361036
ERROR: unsupported XML feature
10371037
LINE 3: PASSING '<rows xmlns="http://x.y"><row...
10381038
^
@@ -1042,6 +1042,8 @@ SELECT * FROM xmltableview2;
10421042
ERROR: relation "xmltableview2" does not exist
10431043
LINE 1: SELECT * FROM xmltableview2;
10441044
^
1045+
\sv xmltableview2
1046+
ERROR: relation "xmltableview2" does not exist
10451047
SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
10461048
'/rows/row'
10471049
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'

src/test/regress/expected/xml_2.out

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,16 +1135,20 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
11351135
10
11361136
(1 row)
11371137

1138-
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
1139-
'/zz:rows/zz:row'
1138+
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"),
1139+
'/Zz:rows/Zz:row'
11401140
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
1141-
COLUMNS a int PATH 'zz:a');
1141+
COLUMNS a int PATH 'Zz:a');
11421142
SELECT * FROM xmltableview2;
11431143
a
11441144
----
11451145
10
11461146
(1 row)
11471147

1148+
\sv xmltableview2
1149+
CREATE OR REPLACE VIEW public.xmltableview2 AS
1150+
SELECT "xmltable".a
1151+
FROM XMLTABLE(XMLNAMESPACES ('http://x.y'::text AS "Zz"), ('/Zz:rows/Zz:row'::text) PASSING ('<rows xmlns="http://x.y"><row><a>10</a></row></rows>'::xml) COLUMNS a integer PATH ('Zz:a'::text))
11481152
SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
11491153
'/rows/row'
11501154
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'

src/test/regress/sql/xml.sql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,13 +393,15 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
393393
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
394394
COLUMNS a int PATH 'zz:a');
395395

396-
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz),
397-
'/zz:rows/zz:row'
396+
CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"),
397+
'/Zz:rows/Zz:row'
398398
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'
399-
COLUMNS a int PATH 'zz:a');
399+
COLUMNS a int PATH 'Zz:a');
400400

401401
SELECT * FROM xmltableview2;
402402

403+
\sv xmltableview2
404+
403405
SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'),
404406
'/rows/row'
405407
PASSING '<rows xmlns="http://x.y"><row><a>10</a></row></rows>'

0 commit comments

Comments
 (0)