diff -cpr head/src/backend/executor/execQual.c not-encode-xmlattributes/src/backend/executor/execQual.c *** head/src/backend/executor/execQual.c Fri Apr 10 09:40:51 2009 --- not-encode-xmlattributes/src/backend/executor/execQual.c Thu May 28 19:26:47 2009 *************** ExecEvalXml(XmlExprState *xmlExpr, ExprC *** 3242,3248 **** { appendStringInfo(&buf, "<%s>%s", argname, ! map_sql_value_to_xml_value(value, exprType((Node *) e->expr)), argname); *isNull = false; } --- 3242,3248 ---- { appendStringInfo(&buf, "<%s>%s", argname, ! map_sql_value_to_xml_value(value, exprType((Node *) e->expr), true), argname); *isNull = false; } diff -cpr head/src/backend/utils/adt/xml.c not-encode-xmlattributes/src/backend/utils/adt/xml.c *** head/src/backend/utils/adt/xml.c Mon May 18 12:23:11 2009 --- not-encode-xmlattributes/src/backend/utils/adt/xml.c Thu May 28 19:26:47 2009 *************** xmlelement(XmlExprState *xmlExpr, ExprCo *** 569,575 **** if (isnull) str = NULL; else ! str = map_sql_value_to_xml_value(value, exprType((Node *) e->expr)); named_arg_strings = lappend(named_arg_strings, str); i++; } --- 569,575 ---- if (isnull) str = NULL; else ! str = map_sql_value_to_xml_value(value, exprType((Node *) e->expr), false); named_arg_strings = lappend(named_arg_strings, str); i++; } *************** xmlelement(XmlExprState *xmlExpr, ExprCo *** 587,593 **** if (!isnull) { str = map_sql_value_to_xml_value(value, ! exprType((Node *) e->expr)); arg_strings = lappend(arg_strings, str); } } --- 587,593 ---- if (!isnull) { str = map_sql_value_to_xml_value(value, ! exprType((Node *) e->expr), true); arg_strings = lappend(arg_strings, str); } } *************** map_xml_name_to_sql_identifier(char *nam *** 1582,1588 **** * Map SQL value to XML value; see SQL/XML:2003 section 9.16. */ char * ! map_sql_value_to_xml_value(Datum value, Oid type) { StringInfoData buf; --- 1582,1588 ---- * Map SQL value to XML value; see SQL/XML:2003 section 9.16. */ char * ! map_sql_value_to_xml_value(Datum value, Oid type, bool encode) { StringInfoData buf; *************** map_sql_value_to_xml_value(Datum value, *** 1616,1622 **** appendStringInfoString(&buf, ""); appendStringInfoString(&buf, map_sql_value_to_xml_value(elem_values[i], ! elmtype)); appendStringInfoString(&buf, ""); } --- 1616,1622 ---- appendStringInfoString(&buf, ""); appendStringInfoString(&buf, map_sql_value_to_xml_value(elem_values[i], ! elmtype, true)); appendStringInfoString(&buf, ""); } *************** map_sql_value_to_xml_value(Datum value, *** 1774,1781 **** getTypeOutputInfo(type, &typeOut, &isvarlena); str = OidOutputFunctionCall(typeOut, value); ! /* ... exactly as-is for XML */ ! if (type == XMLOID) return str; /* otherwise, translate special characters as needed */ --- 1774,1781 ---- getTypeOutputInfo(type, &typeOut, &isvarlena); str = OidOutputFunctionCall(typeOut, value); ! /* ... exactly as-is for XML or encode is not required */ ! if (type == XMLOID || !encode) return str; /* otherwise, translate special characters as needed */ *************** SPI_sql_row_to_xmlelement(int rownum, St *** 3179,3185 **** appendStringInfo(result, " <%s>%s\n", colname, map_sql_value_to_xml_value(colval, ! SPI_gettypeid(SPI_tuptable->tupdesc, i)), colname); } --- 3179,3185 ---- appendStringInfo(result, " <%s>%s\n", colname, map_sql_value_to_xml_value(colval, ! SPI_gettypeid(SPI_tuptable->tupdesc, i), true), colname); } diff -cpr head/src/include/utils/xml.h not-encode-xmlattributes/src/include/utils/xml.h *** head/src/include/utils/xml.h Mon May 18 12:23:11 2009 --- not-encode-xmlattributes/src/include/utils/xml.h Thu May 28 19:26:47 2009 *************** extern text *xmltotext_with_xmloption(xm *** 73,79 **** extern char *map_sql_identifier_to_xml_name(char *ident, bool fully_escaped, bool escape_period); extern char *map_xml_name_to_sql_identifier(char *name); ! extern char *map_sql_value_to_xml_value(Datum value, Oid type); typedef enum { --- 73,79 ---- extern char *map_sql_identifier_to_xml_name(char *ident, bool fully_escaped, bool escape_period); extern char *map_xml_name_to_sql_identifier(char *name); ! extern char *map_sql_value_to_xml_value(Datum value, Oid type, bool encode); typedef enum { diff -cpr head/src/test/regress/expected/xml.out not-encode-xmlattributes/src/test/regress/expected/xml.out *** head/src/test/regress/expected/xml.out Fri Apr 10 09:40:51 2009 --- not-encode-xmlattributes/src/test/regress/expected/xml.out Thu May 28 19:26:47 2009 *************** SELECT xmlconcat(NULL, NULL); *** 90,100 **** (1 row) SELECT xmlelement(name element, ! xmlattributes (1 as one, 'deuce' as two), ! 'content'); ! xmlelement ! ------------------------------------------------ ! content (1 row) SELECT xmlelement(name element, --- 90,100 ---- (1 row) SELECT xmlelement(name element, ! xmlattributes (1 as one, 'deuce' as two, '<>&"''' as three), ! 'content', '<>&"'''); ! xmlelement ! -------------------------------------------------------------------------------------------- ! content<>&"' (1 row) SELECT xmlelement(name element, diff -cpr head/src/test/regress/sql/xml.sql not-encode-xmlattributes/src/test/regress/sql/xml.sql *** head/src/test/regress/sql/xml.sql Fri Apr 10 09:40:51 2009 --- not-encode-xmlattributes/src/test/regress/sql/xml.sql Thu May 28 19:26:47 2009 *************** SELECT xmlconcat(NULL, NULL); *** 31,38 **** SELECT xmlelement(name element, ! xmlattributes (1 as one, 'deuce' as two), ! 'content'); SELECT xmlelement(name element, xmlattributes ('unnamed and wrong')); --- 31,38 ---- SELECT xmlelement(name element, ! xmlattributes (1 as one, 'deuce' as two, '<>&"''' as three), ! 'content', '<>&"'''); SELECT xmlelement(name element, xmlattributes ('unnamed and wrong'));