mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 00:03:00 -04:00
Compare commits
8 Commits
65c5864d7f
...
2f35c14cfb
Author | SHA1 | Date | |
---|---|---|---|
|
2f35c14cfb | ||
|
4b885d01f9 | ||
|
58fbbc9d68 | ||
|
2b53a462cf | ||
|
7cfa154d15 | ||
|
44ad5129ce | ||
|
061cc7eaca | ||
|
2197d06224 |
@ -53,6 +53,7 @@ tests += {
|
|||||||
'bd': meson.current_build_dir(),
|
'bd': meson.current_build_dir(),
|
||||||
'regress': {
|
'regress': {
|
||||||
'sql': [
|
'sql': [
|
||||||
|
'security',
|
||||||
'seg',
|
'seg',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@ -381,7 +381,7 @@ pgxml_xpath(text *document, xmlChar *xpath, xpath_workspace *workspace)
|
|||||||
{
|
{
|
||||||
workspace->doctree = xmlReadMemory((char *) VARDATA_ANY(document),
|
workspace->doctree = xmlReadMemory((char *) VARDATA_ANY(document),
|
||||||
docsize, NULL, NULL,
|
docsize, NULL, NULL,
|
||||||
XML_PARSE_NOENT);
|
XML_PARSE_HUGE | XML_PARSE_NOENT);
|
||||||
if (workspace->doctree != NULL)
|
if (workspace->doctree != NULL)
|
||||||
{
|
{
|
||||||
workspace->ctxt = xmlXPathNewContext(workspace->doctree);
|
workspace->ctxt = xmlXPathNewContext(workspace->doctree);
|
||||||
@ -626,7 +626,7 @@ xpath_table(PG_FUNCTION_ARGS)
|
|||||||
if (xmldoc)
|
if (xmldoc)
|
||||||
doctree = xmlReadMemory(xmldoc, strlen(xmldoc),
|
doctree = xmlReadMemory(xmldoc, strlen(xmldoc),
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
XML_PARSE_NOENT);
|
XML_PARSE_HUGE | XML_PARSE_NOENT);
|
||||||
else /* treat NULL as not well-formed */
|
else /* treat NULL as not well-formed */
|
||||||
doctree = NULL;
|
doctree = NULL;
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ xslt_process(PG_FUNCTION_ARGS)
|
|||||||
/* Parse document */
|
/* Parse document */
|
||||||
doctree = xmlReadMemory((char *) VARDATA_ANY(doct),
|
doctree = xmlReadMemory((char *) VARDATA_ANY(doct),
|
||||||
VARSIZE_ANY_EXHDR(doct), NULL, NULL,
|
VARSIZE_ANY_EXHDR(doct), NULL, NULL,
|
||||||
XML_PARSE_NOENT);
|
XML_PARSE_HUGE | XML_PARSE_NOENT);
|
||||||
|
|
||||||
if (doctree == NULL)
|
if (doctree == NULL)
|
||||||
xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
|
xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
|
||||||
@ -96,7 +96,7 @@ xslt_process(PG_FUNCTION_ARGS)
|
|||||||
/* Same for stylesheet */
|
/* Same for stylesheet */
|
||||||
ssdoc = xmlReadMemory((char *) VARDATA_ANY(ssheet),
|
ssdoc = xmlReadMemory((char *) VARDATA_ANY(ssheet),
|
||||||
VARSIZE_ANY_EXHDR(ssheet), NULL, NULL,
|
VARSIZE_ANY_EXHDR(ssheet), NULL, NULL,
|
||||||
XML_PARSE_NOENT);
|
XML_PARSE_HUGE | XML_PARSE_NOENT);
|
||||||
|
|
||||||
if (ssdoc == NULL)
|
if (ssdoc == NULL)
|
||||||
xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
|
xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION,
|
||||||
|
@ -1310,7 +1310,7 @@ CopyFrom(CopyFromState cstate)
|
|||||||
if (cstate->opts.save_error_to != COPY_SAVE_ERROR_TO_ERROR &&
|
if (cstate->opts.save_error_to != COPY_SAVE_ERROR_TO_ERROR &&
|
||||||
cstate->num_errors > 0)
|
cstate->num_errors > 0)
|
||||||
ereport(NOTICE,
|
ereport(NOTICE,
|
||||||
errmsg_plural("%llu row were skipped due to data type incompatibility",
|
errmsg_plural("%llu row was skipped due to data type incompatibility",
|
||||||
"%llu rows were skipped due to data type incompatibility",
|
"%llu rows were skipped due to data type incompatibility",
|
||||||
(unsigned long long) cstate->num_errors,
|
(unsigned long long) cstate->num_errors,
|
||||||
(unsigned long long) cstate->num_errors));
|
(unsigned long long) cstate->num_errors));
|
||||||
|
@ -303,6 +303,7 @@ pgwin32_socket(int af, int type, int protocol)
|
|||||||
if (ioctlsocket(s, FIONBIO, &on))
|
if (ioctlsocket(s, FIONBIO, &on))
|
||||||
{
|
{
|
||||||
TranslateSocketError();
|
TranslateSocketError();
|
||||||
|
closesocket(s);
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
@ -890,7 +890,7 @@ DecodeAbort(LogicalDecodingContext *ctx, XLogRecordBuffer *buf,
|
|||||||
/*
|
/*
|
||||||
* Parse XLOG_HEAP_INSERT (not MULTI_INSERT!) records into tuplebufs.
|
* Parse XLOG_HEAP_INSERT (not MULTI_INSERT!) records into tuplebufs.
|
||||||
*
|
*
|
||||||
* Deletes can contain the new tuple.
|
* Inserts can contain the new tuple.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
|
DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
|
||||||
|
@ -263,9 +263,9 @@ pgstat_beinit(void)
|
|||||||
* Assign the MyBEEntry for an auxiliary process. Since it doesn't
|
* Assign the MyBEEntry for an auxiliary process. Since it doesn't
|
||||||
* have a BackendId, the slot is statically allocated based on the
|
* have a BackendId, the slot is statically allocated based on the
|
||||||
* auxiliary process type (MyAuxProcType). Backends use slots indexed
|
* auxiliary process type (MyAuxProcType). Backends use slots indexed
|
||||||
* in the range from 1 to MaxBackends (inclusive), so we use
|
* in the range from 0 to MaxBackends (exclusive), so we use
|
||||||
* MaxBackends + AuxBackendType + 1 as the index of the slot for an
|
* MaxBackends + AuxProcType as the index of the slot for an auxiliary
|
||||||
* auxiliary process.
|
* process.
|
||||||
*/
|
*/
|
||||||
MyBEEntry = &BackendStatusArray[MaxBackends + MyAuxProcType];
|
MyBEEntry = &BackendStatusArray[MaxBackends + MyAuxProcType];
|
||||||
}
|
}
|
||||||
|
@ -1688,8 +1688,8 @@ xml_doctype_in_content(const xmlChar *str)
|
|||||||
* xmloption_arg, but a DOCTYPE node in the input can force DOCUMENT mode).
|
* xmloption_arg, but a DOCTYPE node in the input can force DOCUMENT mode).
|
||||||
*
|
*
|
||||||
* If parsed_nodes isn't NULL and the input is not an XML document, the list
|
* If parsed_nodes isn't NULL and the input is not an XML document, the list
|
||||||
* of parsed nodes from the xmlParseBalancedChunkMemory call will be returned
|
* of parsed nodes from the xmlParseInNodeContext call will be returned to
|
||||||
* to *parsed_nodes.
|
* *parsed_nodes.
|
||||||
*
|
*
|
||||||
* Errors normally result in ereport(ERROR), but if escontext is an
|
* Errors normally result in ereport(ERROR), but if escontext is an
|
||||||
* ErrorSaveContext, then "safe" errors are reported there instead, and the
|
* ErrorSaveContext, then "safe" errors are reported there instead, and the
|
||||||
@ -1795,7 +1795,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg,
|
|||||||
doc = xmlCtxtReadDoc(ctxt, utf8string,
|
doc = xmlCtxtReadDoc(ctxt, utf8string,
|
||||||
NULL,
|
NULL,
|
||||||
"UTF-8",
|
"UTF-8",
|
||||||
XML_PARSE_NOENT | XML_PARSE_DTDATTR
|
XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_HUGE
|
||||||
| (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS));
|
| (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS));
|
||||||
if (doc == NULL || xmlerrcxt->err_occurred)
|
if (doc == NULL || xmlerrcxt->err_occurred)
|
||||||
{
|
{
|
||||||
@ -1828,10 +1828,30 @@ xml_parse(text *data, XmlOptionType xmloption_arg,
|
|||||||
/* allow empty content */
|
/* allow empty content */
|
||||||
if (*(utf8string + count))
|
if (*(utf8string + count))
|
||||||
{
|
{
|
||||||
res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0,
|
const char *data;
|
||||||
utf8string + count,
|
xmlNodePtr root;
|
||||||
parsed_nodes);
|
xmlNodePtr lst;
|
||||||
if (res_code != 0 || xmlerrcxt->err_occurred)
|
xmlParserErrors xml_error;
|
||||||
|
|
||||||
|
data = (const char *) (utf8string + count);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a fake root node. The xmlNewDoc() function creates
|
||||||
|
* an XML document without any nodes, and this is required for
|
||||||
|
* xmlParseInNodeContext() that is able to handle
|
||||||
|
* XML_PARSE_HUGE.
|
||||||
|
*/
|
||||||
|
root = xmlNewNode(NULL, (const xmlChar *) "content-root");
|
||||||
|
if (root == NULL || xmlerrcxt->err_occurred)
|
||||||
|
xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
|
||||||
|
"could not allocate xml node");
|
||||||
|
xmlDocSetRootElement(doc, root);
|
||||||
|
|
||||||
|
/* Try to parse string with using root node context. */
|
||||||
|
xml_error = xmlParseInNodeContext(root, data, strlen(data),
|
||||||
|
XML_PARSE_HUGE,
|
||||||
|
parsed_nodes ? parsed_nodes : &lst);
|
||||||
|
if (xml_error != XML_ERR_OK || xmlerrcxt->err_occurred)
|
||||||
{
|
{
|
||||||
xml_errsave(escontext, xmlerrcxt,
|
xml_errsave(escontext, xmlerrcxt,
|
||||||
ERRCODE_INVALID_XML_CONTENT,
|
ERRCODE_INVALID_XML_CONTENT,
|
||||||
@ -4344,7 +4364,7 @@ xpath_internal(text *xpath_expr_text, xmltype *data, ArrayType *namespaces,
|
|||||||
xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
|
xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,
|
||||||
"could not allocate parser context");
|
"could not allocate parser context");
|
||||||
doc = xmlCtxtReadMemory(ctxt, (char *) string + xmldecl_len,
|
doc = xmlCtxtReadMemory(ctxt, (char *) string + xmldecl_len,
|
||||||
len - xmldecl_len, NULL, NULL, 0);
|
len - xmldecl_len, NULL, NULL, XML_PARSE_HUGE);
|
||||||
if (doc == NULL || xmlerrcxt->err_occurred)
|
if (doc == NULL || xmlerrcxt->err_occurred)
|
||||||
xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
|
xml_ereport(xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
|
||||||
"could not parse XML document");
|
"could not parse XML document");
|
||||||
@ -4675,7 +4695,7 @@ XmlTableSetDocument(TableFuncScanState *state, Datum value)
|
|||||||
|
|
||||||
PG_TRY();
|
PG_TRY();
|
||||||
{
|
{
|
||||||
doc = xmlCtxtReadMemory(xtCxt->ctxt, (char *) xstr, length, NULL, NULL, 0);
|
doc = xmlCtxtReadMemory(xtCxt->ctxt, (char *) xstr, length, NULL, NULL, XML_PARSE_HUGE);
|
||||||
if (doc == NULL || xtCxt->xmlerrcxt->err_occurred)
|
if (doc == NULL || xtCxt->xmlerrcxt->err_occurred)
|
||||||
xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
|
xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_INVALID_XML_DOCUMENT,
|
||||||
"could not parse XML document");
|
"could not parse XML document");
|
||||||
|
@ -3247,23 +3247,6 @@ PQsendPipelineSync(PGconn *conn)
|
|||||||
/*
|
/*
|
||||||
* Workhorse function for PQpipelineSync and PQsendPipelineSync.
|
* Workhorse function for PQpipelineSync and PQsendPipelineSync.
|
||||||
*
|
*
|
||||||
* It's legal to start submitting more commands in the pipeline immediately,
|
|
||||||
* without waiting for the results of the current pipeline. There's no need to
|
|
||||||
* end pipeline mode and start it again.
|
|
||||||
*
|
|
||||||
* If a command in a pipeline fails, every subsequent command up to and
|
|
||||||
* including the result to the Sync message sent by pqPipelineSyncInternal
|
|
||||||
* gets set to PGRES_PIPELINE_ABORTED state. If the whole pipeline is
|
|
||||||
* processed without error, a PGresult with PGRES_PIPELINE_SYNC is produced.
|
|
||||||
*
|
|
||||||
* Queries can already have been sent before pqPipelineSyncInternal is called,
|
|
||||||
* but pqPipelineSyncInternal needs to be called before retrieving command
|
|
||||||
* results.
|
|
||||||
*
|
|
||||||
* The connection will remain in pipeline mode and unavailable for new
|
|
||||||
* synchronous command execution functions until all results from the pipeline
|
|
||||||
* are processed by the client.
|
|
||||||
*
|
|
||||||
* immediate_flush controls if the flush happens immediately after sending the
|
* immediate_flush controls if the flush happens immediately after sending the
|
||||||
* Sync message or not.
|
* Sync message or not.
|
||||||
*/
|
*/
|
||||||
|
@ -37,9 +37,3 @@ DROP TABLE user_logins;
|
|||||||
DROP EVENT TRIGGER on_login_trigger;
|
DROP EVENT TRIGGER on_login_trigger;
|
||||||
DROP FUNCTION on_login_proc();
|
DROP FUNCTION on_login_proc();
|
||||||
\c
|
\c
|
||||||
SELECT dathasloginevt FROM pg_database WHERE datname= :'DBNAME';
|
|
||||||
dathasloginevt
|
|
||||||
----------------
|
|
||||||
f
|
|
||||||
(1 row)
|
|
||||||
|
|
||||||
|
@ -22,4 +22,3 @@ DROP TABLE user_logins;
|
|||||||
DROP EVENT TRIGGER on_login_trigger;
|
DROP EVENT TRIGGER on_login_trigger;
|
||||||
DROP FUNCTION on_login_proc();
|
DROP FUNCTION on_login_proc();
|
||||||
\c
|
\c
|
||||||
SELECT dathasloginevt FROM pg_database WHERE datname= :'DBNAME';
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user