*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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;
* 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 $
*
*-------------------------------------------------------------------------
*/
xmltype *
-xmlpi(char *target, text *arg)
+xmlpi(char *target, text *arg, bool arg_is_null, bool *result_is_null)
{
#ifdef USE_LIBXML
xmltype *result;
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);
errdetail("XML processing instruction cannot contain \"?>\".")));
appendStringInfoChar(&buf, ' ');
- appendStringInfoString(&buf, string);
+ appendStringInfoString(&buf, string + strspn(string, " "));
pfree(string);
}
appendStringInfoString(&buf, "?>");
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/utils/xml.h,v 1.6 2007/01/05 22:20:00 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/xml.h,v 1.7 2007/01/07 22:49:56 petere Exp $
*
*-------------------------------------------------------------------------
*/
extern Datum xmlvalidate(PG_FUNCTION_ARGS);
extern xmltype *xmlparse(text *data, bool is_doc, bool preserve_whitespace);
-extern xmltype *xmlpi(char *target, text *arg);
+extern xmltype *xmlpi(char *target, text *arg, bool arg_is_null, bool *result_is_null);
extern xmltype *xmlroot(xmltype *data, text *version, int standalone);
extern char *map_sql_identifier_to_xml_name(char *ident, bool fully_escaped);
SELECT xmlpi(name foo, 'in?>valid');
ERROR: invalid XML processing instruction
DETAIL: XML processing instruction cannot contain "?>".
+SELECT xmlpi(name foo, null);
+ xmlpi
+-------
+
+(1 row)
+
+SELECT xmlpi(name xmlstuff, null);
+ERROR: invalid XML processing instruction
+DETAIL: XML processing instruction target name cannot start with "xml".
+SELECT xmlpi(name foo, ' bar');
+ xmlpi
+-------------
+ <?foo bar?>
+(1 row)
+
SELECT xmlroot(xml '<foo/>', version no value, standalone no value);
xmlroot
-----------------------
ERROR: no XML support in this installation
SELECT xmlpi(name foo, 'in?>valid');
ERROR: no XML support in this installation
+SELECT xmlpi(name foo, null);
+ERROR: no XML support in this installation
+SELECT xmlpi(name xmlstuff, null);
+ERROR: no XML support in this installation
+SELECT xmlpi(name foo, ' bar');
+ERROR: no XML support in this installation
SELECT xmlroot(xml '<foo/>', version no value, standalone no value);
ERROR: no XML support in this installation
SELECT xmlroot(xml '<foo/>', version '2.0');
SELECT xmlpi(name xmlstuff);
SELECT xmlpi(name foo, 'bar');
SELECT xmlpi(name foo, 'in?>valid');
+SELECT xmlpi(name foo, null);
+SELECT xmlpi(name xmlstuff, null);
+SELECT xmlpi(name foo, ' bar');
SELECT xmlroot(xml '<foo/>', version no value, standalone no value);
SELECT xmlroot(xml '<foo/>', version '2.0');