I'll auto-answer ;-) Based on the function "btoptions" from postgres source, which takes aas a first arg a text[] :
ArrayType *array; Datum *dimdatums; int ndim; array = DatumGetArrayTypeP(dimensions); Assert(ARR_ELEMTYPE(array) == TEXTOID); pcinfo("after assert \n"); deconstruct_array(array, TEXTOID, -1, false, 'i', &dimdatums, NULL, &ndim); //construct the array to hold the result : char ** final_dimension_array = (char **) pcalloc(ndim * sizeof(char * ) ); for (i = 0; i < ndim; i++) { text *dimensiontext = DatumGetTextP(dimdatums[i]); char *text_str = VARDATA(dimensiontext); int text_len = VARSIZE(dimensiontext) - VARHDRSZ; char *s; char *p; s = TextDatumGetCString(dimdatums[i]); final_dimension_array[i] = s; } //pcinfo("end of the text retrieval\n"); Cheers, Rémi-C 2014/1/15 Rémi Cura <remi.c...@gmail.com> > Hey, > I'm trying to use an array of text as input in a C function in a custom > extension. > > the prototype of the sql function is : > CREATE OR REPLACE FUNCTION pc_subset( dimensions TEXT[]) > > > it is called like : > pc_subset( ARRAY['X'::text,'Y'::text]) > > and the C function trying to read the text array (converting it to cstring > ) : > > text ** vals; > > char ** cstring_array; > nelems = ARR_DIMS(arrptr)[0]; > vals = (text**) ARR_DATA_PTR(arrptr); > cstring_array = (char **) pcalloc(nelems * sizeof(char * ) ); > for (i3=0;i3<nelems;i3++) > { > cstring_array[i3] = text_to_cstring( vals[i3]); > elog(INFO, "elem %d of dim_array : %s\n",i3,cstring_array[i3]); > } > > I crashes postgres because of a segfault. > > > Any help appreciated =) > > Cheers, > Rémi-C >