49 #include <libxml/chvalid.h>
50 #include <libxml/parser.h>
51 #include <libxml/parserInternals.h>
52 #include <libxml/tree.h>
53 #include <libxml/uri.h>
54 #include <libxml/xmlerror.h>
55 #include <libxml/xmlversion.h>
56 #include <libxml/xmlwriter.h>
57 #include <libxml/xpath.h>
58 #include <libxml/xpathInternals.h>
65 #if LIBXML_VERSION >= 20704
66 #define HAVE_XMLSTRUCTUREDERRORCONTEXT 1
101 #define ERRCXT_MAGIC 68275028
112 xmlStructuredErrorFunc saved_errfunc;
115 xmlExternalEntityLoader saved_entityfunc;
118 static xmlParserInputPtr xmlPgEntityLoader(
const char *URL,
const char *ID,
119 xmlParserCtxtPtr ctxt);
120 static void xml_errorHandler(
void *data, xmlErrorPtr
error);
121 static void xml_ereport_by_code(
int level,
int sqlcode,
123 static void chopStringInfoNewlines(
StringInfo str);
124 static void appendStringInfoLineSeparator(
StringInfo str);
126 #ifdef USE_LIBXMLCONTEXT
130 static void xml_memory_init(
void);
131 static void *xml_palloc(
size_t size);
132 static void *xml_repalloc(
void *ptr,
size_t size);
133 static void xml_pfree(
void *ptr);
134 static char *xml_pstrdup(
const char *
string);
137 static xmlChar *xml_text2xmlChar(
text *in);
138 static int parse_xml_decl(
const xmlChar *str,
size_t *lenp,
139 xmlChar **version, xmlChar **
encoding,
int *standalone);
140 static bool print_xml_decl(
StringInfo buf,
const xmlChar *version,
143 bool preserve_whitespace,
int encoding);
145 static int xml_xpathobjtoxmlarray(xmlXPathObjectPtr xpathobj,
151 const char *xmlschema,
bool nulls,
bool tableforest,
152 const char *targetns,
bool top_level);
154 bool nulls,
bool tableforest,
const char *targetns);
156 List *relid_list,
bool nulls,
157 bool tableforest,
const char *targetns);
159 bool nulls,
bool tableforest,
160 const char *targetns);
165 char *tablename,
bool nulls,
bool tableforest,
166 const char *targetns,
bool top_level);
168 #define NO_XML_SUPPORT() \
170 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \
171 errmsg("unsupported XML feature"), \
172 errdetail("This functionality requires the server to be built with libxml support."), \
173 errhint("You need to rebuild PostgreSQL using --with-libxml.")))
177 #define NAMESPACE_XSD "http://www.w3.org/2001/XMLSchema"
178 #define NAMESPACE_XSI "http://www.w3.org/2001/XMLSchema-instance"
179 #define NAMESPACE_SQLXML "http://standards.iso.org/iso/9075/2003/sqlxml"
185 xmlChar_to_encoding(
const xmlChar *encoding_name)
191 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
192 errmsg(
"invalid encoding name \"%s\"",
193 (
const char *) encoding_name)));
231 #define PG_XML_DEFAULT_VERSION "1.0"
247 size_t len = strlen(str);
252 if ((res_code = parse_xml_decl((xmlChar *) str,
253 &len, &version,
NULL, &standalone)) == 0)
259 if (!print_xml_decl(&buf, version, target_encoding, standalone))
266 if (*(str + len) ==
'\n')
276 xml_ereport_by_code(
WARNING, ERRCODE_INTERNAL_ERROR,
277 "could not parse XML declaration in stored value",
309 xmlChar *encodingStr =
NULL;
327 memcpy(
VARDATA(result), str, nbytes);
331 parse_xml_decl((
const xmlChar *) str,
NULL,
NULL, &encodingStr,
NULL);
339 encoding = encodingStr ? xmlChar_to_encoding(encodingStr) :
PG_UTF8;
345 doc = xml_parse(result,
xmloption,
true, encoding);
411 xmlBuffer_to_xmltype(xmlBufferPtr
buf)
414 xmlBufferLength(buf));
430 for (i = 1; i < len; i++)
432 if (argdata[i] ==
'-' && argdata[i - 1] ==
'-')
434 (
errcode(ERRCODE_INVALID_XML_COMMENT),
435 errmsg(
"invalid XML comment")));
437 if (len > 0 && argdata[len - 1] ==
'-')
439 (
errcode(ERRCODE_INVALID_XML_COMMENT),
440 errmsg(
"invalid XML comment")));
464 int global_standalone = 1;
465 xmlChar *global_version =
NULL;
466 bool global_version_no_value =
false;
482 parse_xml_decl((xmlChar *) str, &len, &version,
NULL, &standalone);
484 if (standalone == 0 && global_standalone == 1)
485 global_standalone = 0;
487 global_standalone = -1;
490 global_version_no_value =
true;
491 else if (!global_version)
492 global_version = version;
493 else if (xmlStrcmp(version, global_version) != 0)
494 global_version_no_value =
true;
500 if (!global_version_no_value || global_standalone >= 0)
506 print_xml_decl(&buf2,
507 (!global_version_no_value) ? global_version :
NULL,
568 (
errcode(ERRCODE_NOT_AN_XML_DOCUMENT),
569 errmsg(
"not an XML document")));
572 return (
text *) data;
582 List *named_arg_strings;
588 volatile xmlBufferPtr buf =
NULL;
589 volatile xmlTextWriterPtr writer =
NULL;
597 named_arg_strings =
NIL;
611 named_arg_strings =
lappend(named_arg_strings, str);
629 arg_strings =
lappend(arg_strings, str);
638 buf = xmlBufferCreate();
639 if (buf ==
NULL || xmlerrcxt->err_occurred)
641 "could not allocate xmlBuffer");
642 writer = xmlNewTextWriterMemory(buf, 0);
643 if (writer ==
NULL || xmlerrcxt->err_occurred)
645 "could not allocate xmlTextWriter");
647 xmlTextWriterStartElement(writer, (xmlChar *) xexpr->
name);
655 xmlTextWriterWriteAttribute(writer,
660 foreach(
arg, arg_strings)
664 xmlTextWriterWriteRaw(writer, (xmlChar *) str);
667 xmlTextWriterEndElement(writer);
670 xmlFreeTextWriter(writer);
673 result = xmlBuffer_to_xmltype(buf);
678 xmlFreeTextWriter(writer);
706 doc = xml_parse(data, xmloption_arg, preserve_whitespace,
727 (
errcode(ERRCODE_SYNTAX_ERROR),
728 errmsg(
"invalid XML processing instruction"),
729 errdetail(
"XML processing instruction target name cannot be \"%s\".", target)));
735 *result_is_null = arg_is_null;
748 if (strstr(
string,
"?>") !=
NULL)
750 (
errcode(ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION),
751 errmsg(
"invalid XML processing instruction"),
752 errdetail(
"XML processing instruction cannot contain \"?>\".")));
776 xmlChar *orig_version;
783 parse_xml_decl((xmlChar *) str, &len, &orig_version,
NULL, &orig_standalone);
786 orig_version = xml_text2xmlChar(version);
799 orig_standalone = -1;
807 print_xml_decl(&buf, orig_version, 0, orig_standalone);
830 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
831 errmsg(
"xmlvalidate is not implemented")));
841 volatile xmlDocPtr doc =
NULL;
858 if (errdata->
sqlerrcode == ERRCODE_INVALID_XML_DOCUMENT)
898 static bool first_time =
true;
908 if (
sizeof(
char) !=
sizeof(xmlChar))
910 (
errmsg(
"could not initialize XML library"),
911 errdetail(
"libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u.",
912 (
int)
sizeof(
char), (
int)
sizeof(xmlChar))));
914 #ifdef USE_LIBXMLCONTEXT
952 errcxt->magic = ERRCXT_MAGIC;
953 errcxt->strictness = strictness;
954 errcxt->err_occurred =
false;
964 errcxt->saved_errfunc = xmlStructuredError;
966 #ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
967 errcxt->saved_errcxt = xmlStructuredErrorContext;
969 errcxt->saved_errcxt = xmlGenericErrorContext;
972 xmlSetStructuredErrorFunc((
void *) errcxt, xml_errorHandler);
988 #ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
989 new_errcxt = xmlStructuredErrorContext;
991 new_errcxt = xmlGenericErrorContext;
994 if (new_errcxt != (
void *) errcxt)
996 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
997 errmsg(
"could not set up XML error handler"),
998 errhint(
"This probably indicates that the version of libxml2"
999 " being used is not compatible with the libxml2"
1000 " header files that PostgreSQL was built with.")));
1006 errcxt->saved_entityfunc = xmlGetExternalEntityLoader();
1007 xmlSetExternalEntityLoader(xmlPgEntityLoader);
1028 Assert(errcxt->magic == ERRCXT_MAGIC);
1035 Assert(!errcxt->err_occurred || isError);
1042 #ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
1043 cur_errcxt = xmlStructuredErrorContext;
1045 cur_errcxt = xmlGenericErrorContext;
1048 if (cur_errcxt != (
void *) errcxt)
1049 elog(
WARNING,
"libxml error handling state is out of sync with xml.c");
1052 xmlSetStructuredErrorFunc(errcxt->saved_errcxt, errcxt->saved_errfunc);
1053 xmlSetExternalEntityLoader(errcxt->saved_entityfunc);
1062 pfree(errcxt->err_buf.data);
1073 return errcxt->err_occurred;
1086 #define CHECK_XML_SPACE(p) \
1088 if (!xmlIsBlank_ch(*(p))) \
1089 return XML_ERR_SPACE_REQUIRED; \
1092 #define SKIP_XML_SPACE(p) \
1093 while (xmlIsBlank_ch(*(p))) (p)++
1097 #define PG_XMLISNAMECHAR(c) \
1098 (xmlIsBaseChar_ch(c) || xmlIsIdeographicQ(c) \
1099 || xmlIsDigit_ch(c) \
1100 || c == '.' || c == '-' || c == '_' || c == ':' \
1101 || xmlIsCombiningQ(c) \
1102 || xmlIsExtender_ch(c))
1106 xml_pnstrdup(
const xmlChar *str,
size_t len)
1110 result = (xmlChar *)
palloc((len + 1) *
sizeof(xmlChar));
1111 memcpy(result, str, len *
sizeof(xmlChar));
1123 parse_xml_decl(
const xmlChar *str,
size_t *lenp,
1124 xmlChar **version, xmlChar **
encoding,
int *standalone)
1127 const xmlChar *save_p;
1150 if (xmlStrncmp(p, (xmlChar *)
"<?xml", 5) != 0)
1154 utf8len = strlen((
const char *) (p + 5));
1155 utf8char = xmlGetUTF8Char(p + 5, &utf8len);
1156 if (PG_XMLISNAMECHAR(utf8char))
1164 if (xmlStrncmp(p, (xmlChar *)
"version", 7) != 0)
1165 return XML_ERR_VERSION_MISSING;
1169 return XML_ERR_VERSION_MISSING;
1173 if (*p ==
'\'' || *p ==
'"')
1177 q = xmlStrchr(p + 1, *p);
1179 return XML_ERR_VERSION_MISSING;
1182 *version = xml_pnstrdup(p + 1, q - p - 1);
1186 return XML_ERR_VERSION_MISSING;
1191 if (xmlStrncmp(p, (xmlChar *)
"encoding", 8) == 0)
1193 CHECK_XML_SPACE(save_p);
1197 return XML_ERR_MISSING_ENCODING;
1201 if (*p ==
'\'' || *p ==
'"')
1205 q = xmlStrchr(p + 1, *p);
1207 return XML_ERR_MISSING_ENCODING;
1210 *encoding = xml_pnstrdup(p + 1, q - p - 1);
1214 return XML_ERR_MISSING_ENCODING;
1224 if (xmlStrncmp(p, (xmlChar *)
"standalone", 10) == 0)
1226 CHECK_XML_SPACE(save_p);
1230 return XML_ERR_STANDALONE_VALUE;
1233 if (xmlStrncmp(p, (xmlChar *)
"'yes'", 5) == 0 ||
1234 xmlStrncmp(p, (xmlChar *)
"\"yes\"", 5) == 0)
1240 else if (xmlStrncmp(p, (xmlChar *)
"'no'", 4) == 0 ||
1241 xmlStrncmp(p, (xmlChar *)
"\"no\"", 4) == 0)
1248 return XML_ERR_STANDALONE_VALUE;
1256 if (xmlStrncmp(p, (xmlChar *)
"?>", 2) != 0)
1257 return XML_ERR_XMLDECL_NOT_FINISHED;
1263 for (p = str; p < str + len; p++)
1265 return XML_ERR_INVALID_CHAR;
1289 print_xml_decl(
StringInfo buf,
const xmlChar *version,
1290 pg_enc encoding,
int standalone)
1293 || (encoding && encoding !=
PG_UTF8)
1294 || standalone != -1)
1303 if (encoding && encoding !=
PG_UTF8)
1313 if (standalone == 1)
1315 else if (standalone == 0)
1341 xmlChar *utf8string;
1343 volatile xmlParserCtxtPtr ctxt =
NULL;
1344 volatile xmlDocPtr doc =
NULL;
1347 string = xml_text2xmlChar(data);
1362 ctxt = xmlNewParserCtxt();
1363 if (ctxt ==
NULL || xmlerrcxt->err_occurred)
1365 "could not allocate parser context");
1376 doc = xmlCtxtReadDoc(ctxt, utf8string,
1379 XML_PARSE_NOENT | XML_PARSE_DTDATTR
1380 | (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS));
1381 if (doc ==
NULL || xmlerrcxt->err_occurred)
1383 "invalid XML document");
1392 res_code = parse_xml_decl(utf8string,
1393 &count, &version,
NULL, &standalone);
1395 xml_ereport_by_code(
ERROR, ERRCODE_INVALID_XML_CONTENT,
1396 "invalid XML content: invalid XML declaration",
1399 doc = xmlNewDoc(version);
1401 doc->encoding = xmlStrdup((
const xmlChar *)
"UTF-8");
1402 doc->standalone = standalone;
1405 if (*(utf8string + count))
1407 res_code = xmlParseBalancedChunkMemory(doc,
NULL,
NULL, 0,
1408 utf8string + count,
NULL);
1409 if (res_code != 0 || xmlerrcxt->err_occurred)
1411 "invalid XML content");
1420 xmlFreeParserCtxt(ctxt);
1428 xmlFreeParserCtxt(ctxt);
1440 xml_text2xmlChar(
text *in)
1446 #ifdef USE_LIBXMLCONTEXT
1453 xml_memory_init(
void)
1456 if (LibxmlContext ==
NULL)
1464 xmlMemSetup(xml_pfree, xml_palloc, xml_repalloc, xml_pstrdup);
1471 xml_palloc(
size_t size)
1478 xml_repalloc(
void *ptr,
size_t size)
1485 xml_pfree(
void *ptr)
1494 xml_pstrdup(
const char *
string)
1512 static xmlParserInputPtr
1513 xmlPgEntityLoader(
const char *URL,
const char *ID,
1514 xmlParserCtxtPtr ctxt)
1516 return xmlNewStringInputStream(ctxt, (
const xmlChar *)
"");
1536 if (errcxt->magic != ERRCXT_MAGIC)
1537 elog(
ERROR,
"xml_ereport called with invalid PgXmlErrorContext");
1540 errcxt->err_occurred =
false;
1543 if (errcxt->err_buf.len > 0)
1544 detail = errcxt->err_buf.data;
1559 xml_errorHandler(
void *data, xmlErrorPtr
error)
1562 xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) error->ctxt;
1563 xmlParserInputPtr input = (ctxt !=
NULL) ? ctxt->input :
NULL;
1564 xmlNodePtr node = error->node;
1565 const xmlChar *
name = (node !=
NULL &&
1566 node->type == XML_ELEMENT_NODE) ? node->name :
NULL;
1567 int domain = error->domain;
1568 int level = error->level;
1577 if (xmlerrcxt->magic != ERRCXT_MAGIC)
1578 elog(
FATAL,
"xml_errorHandler called with invalid PgXmlErrorContext");
1588 switch (error->code)
1590 case XML_WAR_NS_URI:
1591 level = XML_ERR_ERROR;
1592 domain = XML_FROM_NAMESPACE;
1595 case XML_ERR_NS_DECL_ERROR:
1596 case XML_WAR_NS_URI_RELATIVE:
1597 case XML_WAR_NS_COLUMN:
1598 case XML_NS_ERR_XML_NAMESPACE:
1599 case XML_NS_ERR_UNDEFINED_NAMESPACE:
1600 case XML_NS_ERR_QNAME:
1601 case XML_NS_ERR_ATTRIBUTE_REDEFINED:
1602 case XML_NS_ERR_EMPTY:
1603 domain = XML_FROM_NAMESPACE;
1610 case XML_FROM_PARSER:
1612 case XML_FROM_MEMORY:
1619 if (error->code == XML_WAR_UNDECLARED_ENTITY)
1635 if (error->line > 0)
1654 xmlGenericErrorFunc errFuncSaved = xmlGenericError;
1655 void *errCtxSaved = xmlGenericErrorContext;
1657 xmlSetGenericErrorFunc((
void *) errorBuf,
1661 appendStringInfoLineSeparator(errorBuf);
1663 xmlParserPrintFileContext(input);
1666 xmlSetGenericErrorFunc(errCtxSaved, errFuncSaved);
1670 chopStringInfoNewlines(errorBuf);
1682 appendStringInfoLineSeparator(&xmlerrcxt->err_buf);
1685 pfree(errorBuf->data);
1698 if (level >= XML_ERR_ERROR)
1700 appendStringInfoLineSeparator(&xmlerrcxt->err_buf);
1703 xmlerrcxt->err_occurred =
true;
1705 else if (level >= XML_ERR_WARNING)
1716 pfree(errorBuf->data);
1729 xml_ereport_by_code(
int level,
int sqlcode,
1730 const char *msg,
int code)
1736 case XML_ERR_INVALID_CHAR:
1739 case XML_ERR_SPACE_REQUIRED:
1742 case XML_ERR_STANDALONE_VALUE:
1743 det =
gettext_noop(
"standalone accepts only 'yes' or 'no'.");
1745 case XML_ERR_VERSION_MISSING:
1746 det =
gettext_noop(
"Malformed declaration: missing version.");
1748 case XML_ERR_MISSING_ENCODING:
1749 det =
gettext_noop(
"Missing encoding in text declaration.");
1751 case XML_ERR_XMLDECL_NOT_FINISHED:
1752 det =
gettext_noop(
"Parsing XML declaration: '?>' expected.");
1755 det =
gettext_noop(
"Unrecognized libxml error code: %d.");
1772 while (str->
len > 0 && str->
data[str->
len - 1] ==
'\n')
1781 appendStringInfoLineSeparator(
StringInfo str)
1783 chopStringInfoNewlines(str);
1793 sqlchar_to_unicode(
char *s)
1804 if (utf8string != s)
1815 return (xmlIsBaseCharQ(c) || xmlIsIdeographicQ(c)
1816 || c ==
'_' || c ==
':');
1824 return (xmlIsBaseCharQ(c) || xmlIsIdeographicQ(c)
1826 || c ==
'.' || c ==
'-' || c ==
'_' || c ==
':'
1827 || xmlIsCombiningQ(c)
1828 || xmlIsExtenderQ(c));
1848 Assert(fully_escaped || !escape_period);
1852 for (p = ident; *p; p +=
pg_mblen(p))
1854 if (*p ==
':' && (p == ident || fully_escaped))
1856 else if (*p ==
'_' && *(p + 1) ==
'x')
1858 else if (fully_escaped && p == ident &&
1866 else if (escape_period && *p ==
'.')
1870 pg_wchar u = sqlchar_to_unicode(p);
1873 ? !is_valid_xml_namefirst(u)
1874 : !is_valid_xml_namechar(u))
1898 memset(utf8string, 0,
sizeof(utf8string));
1903 if (result == utf8string)
1920 for (p = name; *p; p +=
pg_mblen(p))
1922 if (*p ==
'_' && *(p + 1) ==
'x'
1923 && isxdigit((
unsigned char) *(p + 2))
1924 && isxdigit((
unsigned char) *(p + 3))
1925 && isxdigit((
unsigned char) *(p + 4))
1926 && isxdigit((
unsigned char) *(p + 5))
1931 sscanf(p + 2,
"%X", &u);
1973 elmlen, elmbyval, elmalign,
1974 &elem_values, &elem_nulls,
1979 for (i = 0; i < num_elems; i++)
2028 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2029 errmsg(
"date out of range"),
2030 errdetail(
"XML does not support infinite date values.")));
2050 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2051 errmsg(
"timestamp out of range"),
2052 errdetail(
"XML does not support infinite timestamp values.")));
2057 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2058 errmsg(
"timestamp out of range")));
2069 const char *tzn =
NULL;
2077 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2078 errmsg(
"timestamp out of range"),
2079 errdetail(
"XML does not support infinite timestamp values.")));
2084 (
errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
2085 errmsg(
"timestamp out of range")));
2095 volatile xmlBufferPtr buf =
NULL;
2096 volatile xmlTextWriterPtr writer =
NULL;
2103 buf = xmlBufferCreate();
2104 if (buf ==
NULL || xmlerrcxt->err_occurred)
2106 "could not allocate xmlBuffer");
2107 writer = xmlNewTextWriterMemory(buf, 0);
2108 if (writer ==
NULL || xmlerrcxt->err_occurred)
2110 "could not allocate xmlTextWriter");
2113 xmlTextWriterWriteBase64(writer,
VARDATA_ANY(bstr),
2116 xmlTextWriterWriteBinHex(writer,
VARDATA_ANY(bstr),
2120 xmlFreeTextWriter(writer);
2123 result =
pstrdup((
const char *) xmlBufferContent(buf));
2128 xmlFreeTextWriter(writer);
2155 if (type ==
XMLOID || !xml_escape_strings)
2178 for (p = str; *p; p++)
2206 size_t len = strlen(s) + 1;
2209 memcpy(ret, s, len);
2291 appendStringInfo(&query,
"SELECT oid FROM pg_catalog.pg_class WHERE relnamespace = %u AND relkind IN ('r', 'm', 'v') AND pg_catalog.has_table_privilege (oid, 'SELECT') ORDER BY relname;", nspid);
2301 #define XML_VISIBLE_SCHEMAS_EXCLUDE "(nspname ~ '^pg_' OR nspname = 'information_schema')"
2303 #define XML_VISIBLE_SCHEMAS "SELECT oid FROM pg_catalog.pg_namespace WHERE pg_catalog.has_schema_privilege (oid, 'USAGE') AND NOT " XML_VISIBLE_SCHEMAS_EXCLUDE
2317 return query_to_oid_list(
"SELECT oid FROM pg_catalog.pg_class WHERE relkind IN ('r', 'm', 'v') AND pg_catalog.has_table_privilege (pg_class.oid, 'SELECT') AND relnamespace IN (" XML_VISIBLE_SCHEMAS ");");
2328 const char *xmlschema,
bool nulls,
bool tableforest,
2329 const char *targetns,
bool top_level)
2338 xmlschema, nulls, tableforest,
2339 targetns, top_level);
2366 NULL, nulls, tableforest,
2390 (
errcode(ERRCODE_UNDEFINED_CURSOR),
2391 errmsg(
"cursor \"%s\" does not exist", name)));
2396 tableforest, targetns,
true);
2418 const char *xmlschema,
const char *targetns,
2422 Assert(top_level || !xmlschema);
2428 if (strlen(targetns) > 0)
2434 if (strlen(targetns) > 0)
2452 const char *xmlschema,
bool nulls,
bool tableforest,
2453 const char *targetns,
bool top_level)
2469 (
errcode(ERRCODE_DATA_EXCEPTION),
2470 errmsg(
"invalid query")));
2475 targetns, top_level);
2484 tableforest, targetns, top_level);
2507 tableforest, targetns);
2528 elog(
ERROR,
"SPI_prepare(\"%s\") failed", query);
2531 elog(
ERROR,
"SPI_cursor_open(\"%s\") failed", query);
2535 tableforest, targetns));
2550 const char *xmlschema;
2557 (
errcode(ERRCODE_UNDEFINED_CURSOR),
2558 errmsg(
"cursor \"%s\" does not exist", name)));
2562 tableforest, targetns));
2577 const char *xmlschema;
2581 tableforest, targetns);
2585 xmlschema, nulls, tableforest,
2598 const char *xmlschema;
2605 elog(
ERROR,
"SPI_prepare(\"%s\") failed", query);
2608 elog(
ERROR,
"SPI_cursor_open(\"%s\") failed", query);
2616 xmlschema, nulls, tableforest,
2628 bool tableforest,
const char *targetns,
bool top_level)
2651 foreach(cell, relid_list)
2687 nulls, tableforest, targetns,
true)));
2700 if (strlen(targetns) > 0)
2703 " targetNamespace=\"%s\"\n"
2704 " elementFormDefault=\"qualified\"",
2720 bool tableforest,
const char *targetns)
2739 foreach(cell, relid_list)
2753 nulls, tableforest, targetns));
2772 nulls, tableforest, targetns)));
2791 tableforest, targetns);
2794 xmlschema->
data, nulls,
2795 tableforest, targetns,
true)));
2806 bool tableforest,
const char *targetns)
2829 foreach(cell, nspid_list)
2835 tableforest, targetns,
false);
2858 tableforest, targetns)));
2864 const char *targetns)
2882 foreach(cell, relid_list)
2913 tableforest, targetns)));
2928 nulls, tableforest, targetns)));
2969 bool tableforest,
const char *targetns)
2973 char *tabletypename;
2986 elog(
ERROR,
"cache lookup failed for relation %u", relid);
3011 tabletypename =
"TableType";
3012 rowtypename =
"RowType";
3021 "<xsd:complexType name=\"%s\">\n"
3022 " <xsd:sequence>\n",
3025 for (i = 0; i < tupdesc->
natts; i++)
3027 if (tupdesc->
attrs[i]->attisdropped)
3030 " <xsd:element name=\"%s\" type=\"%s\"%s></xsd:element>\n",
3034 nulls ?
" nillable=\"true\"" :
" minOccurs=\"0\"");
3038 " </xsd:sequence>\n"
3039 "</xsd:complexType>\n\n");
3044 "<xsd:complexType name=\"%s\">\n"
3046 " <xsd:element name=\"row\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
3047 " </xsd:sequence>\n"
3048 "</xsd:complexType>\n\n",
3049 tabletypename, rowtypename);
3052 "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
3053 xmltn, tabletypename);
3057 "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
3058 xmltn, rowtypename);
3072 bool tableforest,
const char *targetns)
3077 char *schematypename;
3094 "<xsd:complexType name=\"%s\">\n", schematypename);
3100 " <xsd:sequence>\n");
3102 foreach(cell, relid_list)
3114 " <xsd:element name=\"%s\" type=\"%s\"/>\n",
3115 xmltn, tabletypename);
3118 " <xsd:element name=\"%s\" type=\"%s\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n",
3119 xmltn, tabletypename);
3127 " </xsd:sequence>\n");
3129 "</xsd:complexType>\n\n");
3132 "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
3133 xmlsn, schematypename);
3145 bool tableforest,
const char *targetns)
3149 char *catalogtypename;
3165 "<xsd:complexType name=\"%s\">\n", catalogtypename);
3169 foreach(cell, nspid_list)
3180 " <xsd:element name=\"%s\" type=\"%s\"/>\n",
3181 xmlsn, schematypename);
3187 "</xsd:complexType>\n\n");
3190 "<xsd:element name=\"%s\" type=\"%s\"/>\n\n",
3191 xmlcn, catalogtypename);
3226 ((typmod -
VARHDRSZ) >> 16) & 0xffff,
3284 elog(
ERROR,
"cache lookup failed for type %u", typeoid);
3314 foreach(cell0, tupdesc_list)
3318 for (i = 0; i < tupdesc->
natts; i++)
3320 if (tupdesc->
attrs[i]->attisdropped)
3323 tupdesc->
attrs[i]->atttypid);
3328 foreach(cell0, uniquetypes)
3333 if (basetypid != typid)
3340 foreach(cell0, uniquetypes)
3370 "<xsd:complexType mixed=\"true\">\n"
3372 " <xsd:any name=\"element\" minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"skip\"/>\n"
3373 " </xsd:sequence>\n"
3374 "</xsd:complexType>\n");
3379 "<xsd:simpleType name=\"%s\">\n",
typename);
3387 " <xsd:restriction base=\"xsd:string\">\n");
3390 " <xsd:maxLength value=\"%d\"/>\n",
3397 " <xsd:restriction base=\"xsd:%s\">\n"
3398 " </xsd:restriction>\n",
3405 " <xsd:restriction base=\"xsd:decimal\">\n"
3406 " <xsd:totalDigits value=\"%d\"/>\n"
3407 " <xsd:fractionDigits value=\"%d\"/>\n"
3408 " </xsd:restriction>\n",
3409 ((typmod -
VARHDRSZ) >> 16) & 0xffff,
3415 " <xsd:restriction base=\"xsd:short\">\n"
3416 " <xsd:maxInclusive value=\"%d\"/>\n"
3417 " <xsd:minInclusive value=\"%d\"/>\n"
3418 " </xsd:restriction>\n",
3419 SHRT_MAX, SHRT_MIN);
3424 " <xsd:restriction base=\"xsd:int\">\n"
3425 " <xsd:maxInclusive value=\"%d\"/>\n"
3426 " <xsd:minInclusive value=\"%d\"/>\n"
3427 " </xsd:restriction>\n",
3433 " <xsd:restriction base=\"xsd:long\">\n"
3436 " </xsd:restriction>\n",
3437 (((uint64) 1) << (
sizeof(int64) * 8 - 1)) - 1,
3438 (((uint64) 1) << (
sizeof(int64) * 8 - 1)));
3443 " <xsd:restriction base=\"xsd:float\"></xsd:restriction>\n");
3448 " <xsd:restriction base=\"xsd:double\"></xsd:restriction>\n");
3453 " <xsd:restriction base=\"xsd:boolean\"></xsd:restriction>\n");
3459 const char *tz = (typeoid ==
TIMETZOID ?
"(+|-)\\p{Nd}{2}:\\p{Nd}{2}" :
"");
3463 " <xsd:restriction base=\"xsd:time\">\n"
3464 " <xsd:pattern value=\"\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}(.\\p{Nd}+)?%s\"/>\n"
3465 " </xsd:restriction>\n", tz);
3466 else if (typmod == 0)
3468 " <xsd:restriction base=\"xsd:time\">\n"
3469 " <xsd:pattern value=\"\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}%s\"/>\n"
3470 " </xsd:restriction>\n", tz);
3473 " <xsd:restriction base=\"xsd:time\">\n"
3474 " <xsd:pattern value=\"\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}.\\p{Nd}{%d}%s\"/>\n"
3475 " </xsd:restriction>\n", typmod -
VARHDRSZ, tz);
3482 const char *tz = (typeoid ==
TIMESTAMPTZOID ?
"(+|-)\\p{Nd}{2}:\\p{Nd}{2}" :
"");
3486 " <xsd:restriction base=\"xsd:dateTime\">\n"
3487 " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}T\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}(.\\p{Nd}+)?%s\"/>\n"
3488 " </xsd:restriction>\n", tz);
3489 else if (typmod == 0)
3491 " <xsd:restriction base=\"xsd:dateTime\">\n"
3492 " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}T\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}%s\"/>\n"
3493 " </xsd:restriction>\n", tz);
3496 " <xsd:restriction base=\"xsd:dateTime\">\n"
3497 " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}T\\p{Nd}{2}:\\p{Nd}{2}:\\p{Nd}{2}.\\p{Nd}{%d}%s\"/>\n"
3498 " </xsd:restriction>\n", typmod -
VARHDRSZ, tz);
3504 " <xsd:restriction base=\"xsd:date\">\n"
3505 " <xsd:pattern value=\"\\p{Nd}{4}-\\p{Nd}{2}-\\p{Nd}{2}\"/>\n"
3506 " </xsd:restriction>\n");
3513 int32 base_typmod = -1;
3518 " <xsd:restriction base=\"%s\"/>\n",
3536 bool nulls,
bool tableforest,
3537 const char *targetns,
bool top_level)
3607 if (cur->type == XML_ELEMENT_NODE)
3610 xmlNodePtr cur_copy;
3612 buf = xmlBufferCreate();
3619 cur_copy = xmlCopyNode(cur, 1);
3621 if (cur_copy ==
NULL)
3623 "could not copy node");
3627 xmlNodeDump(buf,
NULL, cur_copy, 0, 1);
3628 result = xmlBuffer_to_xmltype(buf);
3632 xmlFreeNode(cur_copy);
3637 xmlFreeNode(cur_copy);
3644 str = xmlXPathCastNodeToString(cur);
3678 xml_xpathobjtoxmlarray(xmlXPathObjectPtr xpathobj,
3687 switch (xpathobj->type)
3690 if (xpathobj->nodesetval !=
NULL)
3692 result = xpathobj->nodesetval->nodeNr;
3697 for (i = 0; i < result; i++)
3699 datum =
PointerGetDatum(xml_xmlnodetoxmltype(xpathobj->nodesetval->nodeTab[i],
3730 elog(
ERROR,
"xpath expression result type %d is unsupported",
3760 volatile xmlParserCtxtPtr ctxt =
NULL;
3761 volatile xmlDocPtr doc =
NULL;
3762 volatile xmlXPathContextPtr xpathctx =
NULL;
3763 volatile xmlXPathCompExprPtr xpathcomp =
NULL;
3764 volatile xmlXPathObjectPtr xpathobj =
NULL;
3769 xmlChar *xpath_expr;
3772 Datum *ns_names_uris;
3773 bool *ns_names_uris_nulls;
3785 ndim = namespaces ?
ARR_NDIM(namespaces) : 0;
3792 if (ndim != 2 || dims[1] != 2)
3794 (
errcode(ERRCODE_DATA_EXCEPTION),
3795 errmsg(
"invalid array for XML namespace mapping"),
3796 errdetail(
"The array must be two-dimensional with length of the second axis equal to 2.")));
3801 &ns_names_uris, &ns_names_uris_nulls,
3804 Assert((ns_count % 2) == 0);
3809 ns_names_uris =
NULL;
3810 ns_names_uris_nulls =
NULL;
3819 (
errcode(ERRCODE_DATA_EXCEPTION),
3820 errmsg(
"empty XPath expression")));
3822 string = (xmlChar *)
palloc((len + 1) *
sizeof(xmlChar));
3823 memcpy(
string, datastr, len);
3826 xpath_expr = (xmlChar *)
palloc((xpath_len + 1) *
sizeof(xmlChar));
3827 memcpy(xpath_expr,
VARDATA(xpath_expr_text), xpath_len);
3828 xpath_expr[xpath_len] =
'\0';
3840 ctxt = xmlNewParserCtxt();
3841 if (ctxt ==
NULL || xmlerrcxt->err_occurred)
3843 "could not allocate parser context");
3844 doc = xmlCtxtReadMemory(ctxt, (
char *)
string, len,
NULL,
NULL, 0);
3845 if (doc ==
NULL || xmlerrcxt->err_occurred)
3847 "could not parse XML document");
3848 xpathctx = xmlXPathNewContext(doc);
3849 if (xpathctx ==
NULL || xmlerrcxt->err_occurred)
3851 "could not allocate XPath context");
3852 xpathctx->node = xmlDocGetRootElement(doc);
3853 if (xpathctx->node ==
NULL || xmlerrcxt->err_occurred)
3855 "could not find root XML element");
3860 for (i = 0; i < ns_count; i++)
3865 if (ns_names_uris_nulls[i * 2] ||
3866 ns_names_uris_nulls[i * 2 + 1])
3868 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
3869 errmsg(
"neither namespace name nor URI may be null")));
3872 if (xmlXPathRegisterNs(xpathctx,
3873 (xmlChar *) ns_name,
3874 (xmlChar *) ns_uri) != 0)
3876 (
errmsg(
"could not register XML namespace with name \"%s\" and URI \"%s\"",
3881 xpathcomp = xmlXPathCompile(xpath_expr);
3882 if (xpathcomp ==
NULL || xmlerrcxt->err_occurred)
3884 "invalid XPath expression");
3893 xpathobj = xmlXPathCompiledEval(xpathcomp, xpathctx);
3894 if (xpathobj ==
NULL || xmlerrcxt->err_occurred)
3896 "could not create XPath object");
3901 if (res_nitems !=
NULL)
3902 *res_nitems = xml_xpathobjtoxmlarray(xpathobj, astate, xmlerrcxt);
3904 (
void) xml_xpathobjtoxmlarray(xpathobj, astate, xmlerrcxt);
3909 xmlXPathFreeObject(xpathobj);
3911 xmlXPathFreeCompExpr(xpathcomp);
3913 xmlXPathFreeContext(xpathctx);
3917 xmlFreeParserCtxt(ctxt);
3925 xmlXPathFreeObject(xpathobj);
3926 xmlXPathFreeCompExpr(xpathcomp);
3927 xmlXPathFreeContext(xpathctx);
3929 xmlFreeParserCtxt(ctxt);
3952 xpath_internal(xpath_expr_text, data, namespaces,
3973 xpath_internal(xpath_expr_text, data,
NULL,
3997 xpath_internal(xpath_expr_text, data, namespaces,
4016 volatile xmlDocPtr doc =
NULL;
void EncodeDateOnly(struct pg_tm *tm, int style, char *str)
#define list_make2(x1, x2)
static StringInfo schema_to_xmlschema_internal(const char *schemaname, bool nulls, bool tableforest, const char *targetns)
static void xsd_schema_element_start(StringInfo result, const char *targetns)
#define PG_GETARG_INT32(n)
Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber)
static void xmldata_root_element_start(StringInfo result, const char *eltname, const char *xmlschema, const char *targetns, bool top_level)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
static StringInfo schema_to_xml_internal(Oid nspid, const char *xmlschema, bool nulls, bool tableforest, const char *targetns, bool top_level)
#define DatumGetDateADT(X)
#define type_is_array_domain(typid)
Oid LookupExplicitNamespace(const char *nspname, bool missing_ok)
int errhint(const char *fmt,...)
int pg_char_to_encoding(const char *name)
#define forboth(cell1, list1, cell2, list2)
List * list_append_unique_oid(List *list, Oid datum)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
static List * query_to_oid_list(const char *query)
unsigned char * unicode_to_utf8(pg_wchar c, unsigned char *utf8string)
static List * schema_get_xml_visible_tables(Oid nspid)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
Datum xmlvalidate(PG_FUNCTION_ARGS)
ErrorData * CopyErrorData(void)
int pg_encoding_mb2wchar_with_len(int encoding, const char *from, pg_wchar *to, int len)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
#define PointerGetDatum(X)
#define DatumGetObjectId(X)
char * pstrdup(const char *in)
SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes)
Datum database_to_xmlschema(PG_FUNCTION_ARGS)
int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm *tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone)
StringInfo makeStringInfo(void)
StringInfoData * StringInfo
Form_pg_attribute * attrs
bool pg_xml_error_occurred(PgXmlErrorContext *errcxt)
Datum xml_is_well_formed_content(PG_FUNCTION_ARGS)
Datum query_to_xmlschema(PG_FUNCTION_ARGS)
struct PgXmlErrorContext PgXmlErrorContext
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
xmltype * xmlconcat(List *args)
SPITupleTable * SPI_tuptable
static const char * map_sql_catalog_to_xmlschema_types(List *nspid_list, bool nulls, bool tableforest, const char *targetns)
int errcode(int sqlerrcode)
char get_typtype(Oid typid)
#define DatumGetByteaPP(X)
#define PG_GETARG_POINTER(n)
Portal SPI_cursor_open(const char *name, SPIPlanPtr plan, Datum *Values, const char *Nulls, bool read_only)
#define DirectFunctionCall1(func, arg1)
#define PG_GETARG_BOOL(n)
int pg_strcasecmp(const char *s1, const char *s2)
#define PG_RETURN_BYTEA_P(x)
FormData_pg_type * Form_pg_type
Datum xml_is_well_formed_document(PG_FUNCTION_ARGS)
static char * map_multipart_sql_identifier_to_xml_name(char *a, char *b, char *c, char *d)
unsigned char * pg_do_encoding_conversion(unsigned char *src, int len, int src_encoding, int dest_encoding)
List * lappend_oid(List *list, Oid datum)
#define OidIsValid(objectId)
static StringInfo database_to_xml_internal(const char *xmlschema, bool nulls, bool tableforest, const char *targetns)
void FlushErrorState(void)
#define ALLOCSET_DEFAULT_MINSIZE
#define SearchSysCache1(cacheId, key1)
#define PG_XML_DEFAULT_VERSION
char * pg_server_to_any(const char *s, int len, int encoding)
Datum Float8GetDatum(float8 X)
int errdetail_internal(const char *fmt,...)
#define PG_GETARG_TEXT_PP(n)
Datum xmlcomment(PG_FUNCTION_ARGS)
char * SPI_fname(TupleDesc tupdesc, int fnumber)
Portal SPI_cursor_find(const char *name)
#define XML_VISIBLE_SCHEMAS
static char * relname(char const *dir, char const *base)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
#define PG_GETARG_ARRAYTYPE_P(n)
#define appendStringInfoCharMacro(str, ch)
#define TIMESTAMP_NOT_FINITE(j)
Datum xpath(PG_FUNCTION_ARGS)
char * map_sql_identifier_to_xml_name(char *ident, bool fully_escaped, bool escape_period)
void pfree(void *pointer)
void appendStringInfo(StringInfo str, const char *fmt,...)
#define ObjectIdGetDatum(X)
Datum schema_to_xmlschema(PG_FUNCTION_ARGS)
#define DatumGetCString(X)
text * xmltotext_with_xmloption(xmltype *data, XmlOptionType xmloption_arg)
Datum xml_out(PG_FUNCTION_ARGS)
#define DATE_NOT_FINITE(j)
static char * _SPI_strdup(const char *s)
Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull)
char * get_database_name(Oid dbid)
static void appendStringInfoText(StringInfo str, const text *t)
void appendStringInfoString(StringInfo str, const char *s)
char * get_namespace_name(Oid nspid)
Datum table_to_xml(PG_FUNCTION_ARGS)
text * cstring_to_text_with_len(const char *s, int len)
void pg_xml_init_library(void)
Datum xml_in(PG_FUNCTION_ARGS)
int errdetail(const char *fmt,...)
#define PG_RETURN_XML_P(x)
int pg_encoding_mblen(int encoding, const char *mbstr)
Datum schema_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
#define CStringGetDatum(X)
xmltype * xmlroot(xmltype *data, text *version, int standalone)
void EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str)
MemoryContext CurrentMemoryContext
struct tupleDesc * TupleDesc
static const char * map_sql_table_to_xmlschema(TupleDesc tupdesc, Oid relid, bool nulls, bool tableforest, const char *targetns)
#define PG_RETURN_ARRAYTYPE_P(x)
void pg_xml_done(PgXmlErrorContext *errcxt, bool isError)
#define ereport(elevel, rest)
Datum xml_send(PG_FUNCTION_ARGS)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
void j2date(int jd, int *year, int *month, int *day)
MemoryContext TopMemoryContext
List * lappend(List *list, void *datum)
static const char * map_sql_typecoll_to_xmlschema_types(List *tupdesc_list)
void * SPI_palloc(Size size)
bool xml_is_document(xmltype *arg)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
static const char * map_sql_type_to_xml_name(Oid typeoid, int typmod)
#define PG_GETARG_XML_P(n)
#define TextDatumGetCString(d)
static List * database_get_xml_visible_schemas(void)
MemoryContext AllocSetContextCreate(MemoryContext parent, const char *name, Size minContextSize, Size initBlockSize, Size maxBlockSize)
#define PG_RETURN_BOOL(x)
void ReleaseSysCache(HeapTuple tuple)
Datum xml_recv(PG_FUNCTION_ARGS)
int GetDatabaseEncoding(void)
int pg_get_client_encoding(void)
static void xsd_schema_element_end(StringInfo result)
Relation heap_open(Oid relationId, LOCKMODE lockmode)
Datum xml_is_well_formed(PG_FUNCTION_ARGS)
static char * xml_out_internal(xmltype *x, pg_enc target_encoding)
static StringInfo query_to_xml_internal(const char *query, char *tablename, const char *xmlschema, bool nulls, bool tableforest, const char *targetns, bool top_level)
static StringInfo database_to_xmlschema_internal(bool nulls, bool tableforest, const char *targetns)
static xmltype * cstring_to_xmltype(const char *string)
#define PG_RETURN_TEXT_P(x)
const char * pg_encoding_to_char(int encoding)
int errmsg_internal(const char *fmt,...)
Datum xmlconcat2(PG_FUNCTION_ARGS)
text * cstring_to_text(const char *s)
Datum database_to_xml(PG_FUNCTION_ARGS)
#define HeapTupleIsValid(tuple)
static StringInfo table_to_xml_internal(Oid relid, const char *xmlschema, bool nulls, bool tableforest, const char *targetns, bool top_level)
#define Assert(condition)
Datum schema_to_xml(PG_FUNCTION_ARGS)
Datum regclassout(PG_FUNCTION_ARGS)
char * map_xml_name_to_sql_identifier(char *name)
static const char * map_sql_schema_to_xmlschema_types(Oid nspid, List *relid_list, bool nulls, bool tableforest, const char *targetns)
Datum xmlexists(PG_FUNCTION_ARGS)
#define PG_RETURN_CSTRING(x)
Oid exprType(const Node *expr)
static void xmldata_root_element_end(StringInfo result, const char *eltname)
int pg_mblen(const char *mbstr)
void * repalloc(void *pointer, Size size)
Datum xmltotext(PG_FUNCTION_ARGS)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
void SPI_cursor_close(Portal portal)
FormData_pg_class * Form_pg_class
char * text_to_cstring(const text *t)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
Datum table_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
Datum xpath_exists(PG_FUNCTION_ARGS)
Datum table_to_xmlschema(PG_FUNCTION_ARGS)
char * OidOutputFunctionCall(Oid functionId, Datum val)
#define VARSIZE_ANY_EXHDR(PTR)
int errmsg(const char *fmt,...)
#define PG_GETARG_TEXT_P(n)
char * MemoryContextStrdup(MemoryContext context, const char *string)
static xmltype * stringinfo_to_xmltype(StringInfo buf)
void * MemoryContextAlloc(MemoryContext context, Size size)
Datum texttoxml(PG_FUNCTION_ARGS)
Datum query_to_xml(PG_FUNCTION_ARGS)
#define ALLOCSET_DEFAULT_INITSIZE
xmltype * xmlelement(XmlExprState *xmlExpr, ExprContext *econtext)
xmltype * xmlpi(char *target, text *arg, bool arg_is_null, bool *result_is_null)
void SPI_cursor_fetch(Portal portal, bool forward, long count)
#define PG_GETARG_CSTRING(n)
#define ALLOCSET_DEFAULT_MAXSIZE
#define POSTGRES_EPOCH_JDATE
#define SET_VARSIZE(PTR, len)
Datum cursor_to_xml(PG_FUNCTION_ARGS)
Datum query_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
char * escape_xml(const char *str)
char * pg_any_to_server(const char *s, int len, int encoding)
char * map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings)
Oid getBaseType(Oid typid)
static const char * map_sql_type_to_xmlschema_type(Oid typeoid, int typmod)
char * get_rel_name(Oid relid)
void appendBinaryStringInfo(StringInfo str, const char *data, int datalen)
PgXmlErrorContext * pg_xml_init(PgXmlStrictness strictness)
Datum database_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
xmltype * xmlparse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace)
#define PG_GETARG_NAME(n)
static void SPI_sql_row_to_xmlelement(uint64 rownum, StringInfo result, char *tablename, bool nulls, bool tableforest, const char *targetns, bool top_level)
void xml_ereport(PgXmlErrorContext *errcxt, int level, int sqlcode, const char *msg)
Datum cursor_to_xmlschema(PG_FUNCTION_ARGS)
static char * unicode_to_sqlchar(pg_wchar c)
int SPI_execute(const char *src, bool read_only, long tcount)
#define DatumGetTimestamp(X)
static List * database_get_xml_visible_tables(void)
#define ExecEvalExpr(expr, econtext, isNull, isDone)
#define DatumGetArrayTypeP(X)