diff options
Diffstat (limited to 'src/backend/utils')
-rw-r--r-- | src/backend/utils/adt/xml.c | 67 | ||||
-rw-r--r-- | src/backend/utils/cache/lsyscache.c | 28 | ||||
-rw-r--r-- | src/backend/utils/sort/tuplesort.c | 49 |
3 files changed, 89 insertions, 55 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index b92d41b93c..80e113329c 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.92 2009/06/11 14:49:04 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.93 2009/08/10 05:46:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1593,8 +1593,6 @@ map_xml_name_to_sql_identifier(char *name) char * map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings) { - StringInfoData buf; - if (type_is_array(type)) { ArrayType *array; @@ -1605,6 +1603,7 @@ map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings) int num_elems; Datum *elem_values; bool *elem_nulls; + StringInfoData buf; int i; array = DatumGetArrayTypeP(value); @@ -1638,8 +1637,7 @@ map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings) { Oid typeOut; bool isvarlena; - char *p, - *str; + char *str; /* * Special XSD formatting for some data types @@ -1788,32 +1786,47 @@ map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings) return str; /* otherwise, translate special characters as needed */ - initStringInfo(&buf); + return escape_xml(str); + } +} - for (p = str; *p; p++) + +/* + * Escape characters in text that have special meanings in XML. + * + * Returns a palloc'd string. + * + * NB: this is intentionally not dependent on libxml. + */ +char * +escape_xml(const char *str) +{ + StringInfoData buf; + const char *p; + + initStringInfo(&buf); + for (p = str; *p; p++) + { + switch (*p) { - switch (*p) - { - case '&': - appendStringInfoString(&buf, "&"); - break; - case '<': - appendStringInfoString(&buf, "<"); - break; - case '>': - appendStringInfoString(&buf, ">"); - break; - case '\r': - appendStringInfoString(&buf, "
"); - break; - default: - appendStringInfoCharMacro(&buf, *p); - break; - } + case '&': + appendStringInfoString(&buf, "&"); + break; + case '<': + appendStringInfoString(&buf, "<"); + break; + case '>': + appendStringInfoString(&buf, ">"); + break; + case '\r': + appendStringInfoString(&buf, "
"); + break; + default: + appendStringInfoCharMacro(&buf, *p); + break; } - - return buf.data; } + return buf.data; } diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 8247516bd1..0b50309bf3 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.162 2009/06/11 14:49:05 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.163 2009/08/10 05:46:50 tgl Exp $ * * NOTES * Eventually, the index information should go through here, too. @@ -1299,6 +1299,32 @@ get_func_name(Oid funcid) } /* + * get_func_namespace + * + * Returns the pg_namespace OID associated with a given function. + */ +Oid +get_func_namespace(Oid funcid) +{ + HeapTuple tp; + + tp = SearchSysCache(PROCOID, + ObjectIdGetDatum(funcid), + 0, 0, 0); + if (HeapTupleIsValid(tp)) + { + Form_pg_proc functup = (Form_pg_proc) GETSTRUCT(tp); + Oid result; + + result = functup->pronamespace; + ReleaseSysCache(tp); + return result; + } + else + return InvalidOid; +} + +/* * get_func_rettype * Given procedure id, return the function's result type. */ diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index cb89f65a91..8279a07ec8 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -91,7 +91,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/sort/tuplesort.c,v 1.92 2009/08/01 20:59:17 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/sort/tuplesort.c,v 1.93 2009/08/10 05:46:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2200,21 +2200,20 @@ tuplesort_restorepos(Tuplesortstate *state) } /* - * tuplesort_explain - produce a line of information for EXPLAIN ANALYZE + * tuplesort_get_stats - extract summary statistics * * This can be called after tuplesort_performsort() finishes to obtain * printable summary information about how the sort was performed. - * - * The result is a palloc'd string. + * spaceUsed is measured in kilobytes. */ -char * -tuplesort_explain(Tuplesortstate *state) +void +tuplesort_get_stats(Tuplesortstate *state, + const char **sortMethod, + const char **spaceType, + long *spaceUsed) { - char *result = (char *) palloc(100); - long spaceUsed; - /* - * Note: it might seem we should print both memory and disk usage for a + * Note: it might seem we should provide both memory and disk usage for a * disk-based sort. However, the current code doesn't track memory space * accurately once we have begun to return tuples to the caller (since we * don't account for pfree's the caller is expected to do), so we cannot @@ -2223,38 +2222,34 @@ tuplesort_explain(Tuplesortstate *state) * tell us how much is actually used in sortcontext? */ if (state->tapeset) - spaceUsed = LogicalTapeSetBlocks(state->tapeset) * (BLCKSZ / 1024); + { + *spaceType = "Disk"; + *spaceUsed = LogicalTapeSetBlocks(state->tapeset) * (BLCKSZ / 1024); + } else - spaceUsed = (state->allowedMem - state->availMem + 1023) / 1024; + { + *spaceType = "Memory"; + *spaceUsed = (state->allowedMem - state->availMem + 1023) / 1024; + } switch (state->status) { case TSS_SORTEDINMEM: if (state->boundUsed) - snprintf(result, 100, - "Sort Method: top-N heapsort Memory: %ldkB", - spaceUsed); + *sortMethod = "top-N heapsort"; else - snprintf(result, 100, - "Sort Method: quicksort Memory: %ldkB", - spaceUsed); + *sortMethod = "quicksort"; break; case TSS_SORTEDONTAPE: - snprintf(result, 100, - "Sort Method: external sort Disk: %ldkB", - spaceUsed); + *sortMethod = "external sort"; break; case TSS_FINALMERGE: - snprintf(result, 100, - "Sort Method: external merge Disk: %ldkB", - spaceUsed); + *sortMethod = "external merge"; break; default: - snprintf(result, 100, "sort still in progress"); + *sortMethod = "still in progress"; break; } - - return result; } |