1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-07 19:06:32 +03:00

Some fine-tuning of xmlpi in corner cases:

- correct error codes
- do syntax checks in correct order
- strip leading spaces of argument
This commit is contained in:
Peter Eisentraut
2007-01-07 22:49:56 +00:00
parent de9aa5a7b4
commit d807c7ef3f
6 changed files with 46 additions and 12 deletions

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.203 2007/01/05 22:19:27 momjian Exp $
* $PostgreSQL: pgsql/src/backend/executor/execQual.c,v 1.204 2007/01/07 22:49:55 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2803,15 +2803,17 @@ ExecEvalXml(XmlExprState *xmlExpr, ExprContext *econtext,
e = (ExprState *) linitial(xmlExpr->args);
value = ExecEvalExpr(e, econtext, &isnull, NULL);
if (isnull)
return (Datum) 0;
arg = DatumGetTextP(value);
arg = NULL;
else
arg = DatumGetTextP(value);
}
else
{
arg = NULL;
isnull = false;
}
*isNull = false;
return PointerGetDatum(xmlpi(xexpr->name, arg));
return PointerGetDatum(xmlpi(xexpr->name, arg, isnull, isNull));
}
break;

View File

@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.12 2007/01/07 00:13:55 petere Exp $
* $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.13 2007/01/07 22:49:56 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -257,7 +257,7 @@ xmlparse(text *data, bool is_document, bool preserve_whitespace)
xmltype *
xmlpi(char *target, text *arg)
xmlpi(char *target, text *arg, bool arg_is_null, bool *result_is_null)
{
#ifdef USE_LIBXML
xmltype *result;
@@ -265,10 +265,18 @@ xmlpi(char *target, text *arg)
if (pg_strncasecmp(target, "xml", 3) == 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION),
(errcode(ERRCODE_SYNTAX_ERROR), /* really */
errmsg("invalid XML processing instruction"),
errdetail("XML processing instruction target name cannot start with \"xml\".")));
/*
* Following the SQL standard, the null check comes after the
* syntax check above.
*/
*result_is_null = arg_is_null;
if (*result_is_null)
return NULL;
initStringInfo(&buf);
appendStringInfo(&buf, "<?%s", target);
@@ -286,7 +294,7 @@ xmlpi(char *target, text *arg)
errdetail("XML processing instruction cannot contain \"?>\".")));
appendStringInfoChar(&buf, ' ');
appendStringInfoString(&buf, string);
appendStringInfoString(&buf, string + strspn(string, " "));
pfree(string);
}
appendStringInfoString(&buf, "?>");