summaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/varlena.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/varlena.c')
-rw-r--r--src/backend/utils/adt/varlena.c196
1 files changed, 5 insertions, 191 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index aca19d17e8..ce6443647e 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.99 2003/06/24 23:14:46 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.100 2003/06/25 21:30:32 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -19,14 +19,11 @@
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "access/tuptoaster.h"
-#include "catalog/pg_type.h"
#include "lib/stringinfo.h"
#include "libpq/crypt.h"
#include "libpq/pqformat.h"
-#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/pg_locale.h"
-#include "utils/lsyscache.h"
typedef struct varlena unknown;
@@ -1986,7 +1983,8 @@ split_text(PG_FUNCTION_ARGS)
if (fldnum == 1) /* first field - just return the input
* string */
PG_RETURN_TEXT_P(inputstring);
- else /* otherwise return an empty string */
+ else
+/* otherwise return an empty string */
PG_RETURN_TEXT_P(PG_STR_GET_TEXT(""));
}
@@ -2006,7 +2004,8 @@ split_text(PG_FUNCTION_ARGS)
if (fldnum == 1) /* first field - just return the input
* string */
PG_RETURN_TEXT_P(inputstring);
- else /* otherwise return an empty string */
+ else
+/* otherwise return an empty string */
PG_RETURN_TEXT_P(PG_STR_GET_TEXT(""));
}
else if ((start_posn != 0) && (end_posn == 0))
@@ -2029,191 +2028,6 @@ split_text(PG_FUNCTION_ARGS)
}
}
-/*
- * text_to_array
- * parse input string
- * return text array of elements
- * based on provided field separator
- */
-Datum
-text_to_array(PG_FUNCTION_ARGS)
-{
- text *inputstring = PG_GETARG_TEXT_P(0);
- int inputstring_len = TEXTLEN(inputstring);
- text *fldsep = PG_GETARG_TEXT_P(1);
- int fldsep_len = TEXTLEN(fldsep);
- int fldnum;
- int start_posn = 0;
- int end_posn = 0;
- text *result_text = NULL;
- ArrayBuildState *astate = NULL;
- MemoryContext oldcontext = CurrentMemoryContext;
-
- /* return NULL for empty input string */
- if (inputstring_len < 1)
- PG_RETURN_NULL();
-
- /* empty field separator
- * return one element, 1D, array using the input string */
- if (fldsep_len < 1)
- PG_RETURN_ARRAYTYPE_P(create_singleton_array(fcinfo, TEXTOID,
- CStringGetDatum(inputstring), 1));
-
- /* start with end position holding the initial start position */
- end_posn = 0;
- for (fldnum=1;;fldnum++) /* field number is 1 based */
- {
- Datum dvalue;
- bool disnull = false;
-
- start_posn = end_posn;
- end_posn = text_position(PointerGetDatum(inputstring),
- PointerGetDatum(fldsep),
- fldnum);
-
- if ((start_posn == 0) && (end_posn == 0)) /* fldsep not found */
- {
- if (fldnum == 1)
- {
- /* first element
- * return one element, 1D, array using the input string */
- PG_RETURN_ARRAYTYPE_P(create_singleton_array(fcinfo, TEXTOID,
- CStringGetDatum(inputstring), 1));
- }
- else
- {
- /* otherwise create array and exit */
- PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, oldcontext));
- }
- }
- else if ((start_posn != 0) && (end_posn == 0))
- {
- /* last field requested */
- result_text = text_substring(PointerGetDatum(inputstring), start_posn + fldsep_len, -1, true);
- }
- else if ((start_posn == 0) && (end_posn != 0))
- {
- /* first field requested */
- result_text = LEFT(inputstring, fldsep);
- }
- else
- {
- /* prior to last field requested */
- result_text = text_substring(PointerGetDatum(inputstring), start_posn + fldsep_len, end_posn - start_posn - fldsep_len, false);
- }
-
- /* stash away current value */
- dvalue = PointerGetDatum(result_text);
- astate = accumArrayResult(astate, dvalue,
- disnull, TEXTOID, oldcontext);
-
- }
-
- /* never reached -- keep compiler quiet */
- PG_RETURN_NULL();
-}
-
-/*
- * array_to_text
- * concatenate Cstring representation of input array elements
- * using provided field separator
- */
-Datum
-array_to_text(PG_FUNCTION_ARGS)
-{
- ArrayType *v = PG_GETARG_ARRAYTYPE_P(0);
- char *fldsep = PG_TEXTARG_GET_STR(1);
- int nitems, *dims, ndims;
- char *p;
- Oid element_type;
- int typlen;
- bool typbyval;
- char typdelim;
- Oid typoutput,
- typelem;
- FmgrInfo outputproc;
- char typalign;
- StringInfo result_str = makeStringInfo();
- int i;
- ArrayMetaState *my_extra;
-
- p = ARR_DATA_PTR(v);
- ndims = ARR_NDIM(v);
- dims = ARR_DIMS(v);
- nitems = ArrayGetNItems(ndims, dims);
-
- /* if there are no elements, return an empty string */
- if (nitems == 0)
- PG_RETURN_TEXT_P(PG_STR_GET_TEXT(""));
-
- element_type = ARR_ELEMTYPE(v);
-
- /*
- * We arrange to look up info about element type, including its output
- * conversion proc only once per series of calls, assuming the element
- * type doesn't change underneath us.
- */
- my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
- if (my_extra == NULL)
- {
- fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
- sizeof(ArrayMetaState));
- my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
- my_extra->element_type = InvalidOid;
- }
-
- if (my_extra->element_type != element_type)
- {
- /* Get info about element type, including its output conversion proc */
- get_type_metadata(element_type, IOFunc_output,
- &typlen, &typbyval, &typdelim,
- &typelem, &typoutput, &typalign);
- fmgr_info(typoutput, &outputproc);
-
- my_extra->element_type = element_type;
- my_extra->typlen = typlen;
- my_extra->typbyval = typbyval;
- my_extra->typdelim = typdelim;
- my_extra->typelem = typelem;
- my_extra->typiofunc = typoutput;
- my_extra->typalign = typalign;
- my_extra->proc = outputproc;
- }
- else
- {
- typlen = my_extra->typlen;
- typbyval = my_extra->typbyval;
- typdelim = my_extra->typdelim;
- typelem = my_extra->typelem;
- typoutput = my_extra->typiofunc;
- typalign = my_extra->typalign;
- outputproc = my_extra->proc;
- }
-
- for (i = 0; i < nitems; i++)
- {
- Datum itemvalue;
- char *value;
-
- itemvalue = fetch_att(p, typbyval, typlen);
-
- value = DatumGetCString(FunctionCall3(&outputproc,
- itemvalue,
- ObjectIdGetDatum(typelem),
- Int32GetDatum(-1)));
-
- if (i > 0)
- appendStringInfo(result_str, "%s%s", fldsep, value);
- else
- appendStringInfo(result_str, "%s", value);
-
- p = att_addlength(p, typlen, PointerGetDatum(p));
- p = (char *) att_align(p, typalign);
- }
-
- PG_RETURN_TEXT_P(PG_STR_GET_TEXT(result_str->data));
-}
-
#define HEXBASE 16
/*
* Convert a int32 to a string containing a base 16 (hex) representation of