On Thu, 2004-09-16 at 09:18, Neil Conway wrote: > I'll update the patch and apply it later today.
Applied to HEAD. The version of the patch that I applied is attached. -Neil
Index: src/backend/utils/adt/arrayfuncs.c =================================================================== RCS file: /home/neilc/private-cvsroot/pgsql-server/src/backend/utils/adt/arrayfuncs.c,v retrieving revision 1.111 diff -c -r1.111 arrayfuncs.c *** src/backend/utils/adt/arrayfuncs.c 2 Sep 2004 20:05:40 -0000 1.111 --- src/backend/utils/adt/arrayfuncs.c 16 Sep 2004 03:09:33 -0000 *************** *** 896,902 **** k, indx[MAXDIM]; int ndim, ! *dim, *lb; ArrayMetaState *my_extra; --- 896,902 ---- k, indx[MAXDIM]; int ndim, ! *dims, *lb; ArrayMetaState *my_extra; *************** *** 937,945 **** typioparam = my_extra->typioparam; ndim = ARR_NDIM(v); ! dim = ARR_DIMS(v); lb = ARR_LBOUND(v); ! nitems = ArrayGetNItems(ndim, dim); if (nitems == 0) { --- 937,945 ---- typioparam = my_extra->typioparam; ndim = ARR_NDIM(v); ! dims = ARR_DIMS(v); lb = ARR_LBOUND(v); ! nitems = ArrayGetNItems(ndim, dims); if (nitems == 0) { *************** *** 968,978 **** values = (char **) palloc(nitems * sizeof(char *)); needquotes = (bool *) palloc(nitems * sizeof(bool)); p = ARR_DATA_PTR(v); ! overall_length = 1; /* [TRH] don't forget to count \0 at end. */ for (i = 0; i < nitems; i++) { Datum itemvalue; ! bool nq; itemvalue = fetch_att(p, typbyval, typlen); values[i] = DatumGetCString(FunctionCall3(&my_extra->proc, --- 968,979 ---- values = (char **) palloc(nitems * sizeof(char *)); needquotes = (bool *) palloc(nitems * sizeof(bool)); p = ARR_DATA_PTR(v); ! overall_length = 1; /* don't forget to count \0 at end. */ ! for (i = 0; i < nitems; i++) { Datum itemvalue; ! bool needquote; itemvalue = fetch_att(p, typbyval, typlen); values[i] = DatumGetCString(FunctionCall3(&my_extra->proc, *************** *** 983,1010 **** p = (char *) att_align(p, typalign); /* count data plus backslashes; detect chars needing quotes */ ! nq = (values[i][0] == '\0'); /* force quotes for empty string */ ! for (tmp = values[i]; *tmp; tmp++) { char ch = *tmp; overall_length += 1; if (ch == '"' || ch == '\\') { ! nq = true; #ifndef TCL_ARRAYS overall_length += 1; #endif } else if (ch == '{' || ch == '}' || ch == typdelim || isspace((unsigned char) ch)) ! nq = true; } ! needquotes[i] = nq; /* Count the pair of double quotes, if needed */ ! if (nq) overall_length += 2; /* and the comma */ --- 984,1015 ---- p = (char *) att_align(p, typalign); /* count data plus backslashes; detect chars needing quotes */ ! if (values[i][0] == '\0') ! needquote = true; /* force quotes for empty string */ ! else ! needquote = false; ! ! for (tmp = values[i]; *tmp != '\0'; tmp++) { char ch = *tmp; overall_length += 1; if (ch == '"' || ch == '\\') { ! needquote = true; #ifndef TCL_ARRAYS overall_length += 1; #endif } else if (ch == '{' || ch == '}' || ch == typdelim || isspace((unsigned char) ch)) ! needquote = true; } ! needquotes[i] = needquote; /* Count the pair of double quotes, if needed */ ! if (needquote) overall_length += 2; /* and the comma */ *************** *** 1014,1020 **** /* * count total number of curly braces in output string */ ! for (i = j = 0, k = 1; i < ndim; k *= dim[i++], j += k); /* add explicit dimensions if required */ if (needdims) --- 1019,1028 ---- /* * count total number of curly braces in output string */ ! for (i = j = 0, k = 1; i < ndim; i++) ! k *= dims[i], j += k; ! ! dims_str[0] = '\0'; /* add explicit dimensions if required */ if (needdims) *************** *** 1023,1029 **** for (i = 0; i < ndim; i++) { ! sprintf(ptr, "[%d:%d]", lb[i], lb[i] + dim[i] - 1); ptr += strlen(ptr); } *ptr++ = *ASSGN; --- 1031,1037 ---- for (i = 0; i < ndim; i++) { ! sprintf(ptr, "[%d:%d]", lb[i], lb[i] + dims[i] - 1); ptr += strlen(ptr); } *ptr++ = *ASSGN; *************** *** 1039,1045 **** if (needdims) APPENDSTR(dims_str); APPENDCHAR('{'); ! for (i = 0; i < ndim; indx[i++] = 0); j = 0; k = 0; do --- 1047,1054 ---- if (needdims) APPENDSTR(dims_str); APPENDCHAR('{'); ! for (i = 0; i < ndim; i++) ! indx[i] = 0; j = 0; k = 0; do *************** *** 1071,1077 **** for (i = ndim - 1; i >= 0; i--) { ! indx[i] = (indx[i] + 1) % dim[i]; if (indx[i]) { APPENDCHAR(typdelim); --- 1080,1086 ---- for (i = ndim - 1; i >= 0; i--) { ! indx[i] = (indx[i] + 1) % dims[i]; if (indx[i]) { APPENDCHAR(typdelim); Index: src/backend/utils/adt/arrayutils.c =================================================================== RCS file: /home/neilc/private-cvsroot/pgsql-server/src/backend/utils/adt/arrayutils.c,v retrieving revision 1.16 diff -c -r1.16 arrayutils.c *** src/backend/utils/adt/arrayutils.c 29 Aug 2004 04:12:51 -0000 1.16 --- src/backend/utils/adt/arrayutils.c 16 Sep 2004 03:09:33 -0000 *************** *** 50,65 **** /* Convert array dimensions into number of elements */ int ! ArrayGetNItems(int n, int *a) { int i, ret; ! if (n <= 0) return 0; ret = 1; ! for (i = 0; i < n; i++) ! ret *= a[i]; return ret; } --- 50,65 ---- /* Convert array dimensions into number of elements */ int ! ArrayGetNItems(int ndim, int *dims) { int i, ret; ! if (ndim <= 0) return 0; ret = 1; ! for (i = 0; i < ndim; i++) ! ret *= dims[i]; return ret; } Index: src/include/utils/array.h =================================================================== RCS file: /home/neilc/private-cvsroot/pgsql-server/src/include/utils/array.h,v retrieving revision 1.49 diff -c -r1.49 array.h *** src/include/utils/array.h 29 Aug 2004 04:13:10 -0000 1.49 --- src/include/utils/array.h 16 Sep 2004 03:09:34 -0000 *************** *** 81,88 **** * * ARR_LBOUND returns a pointer to an array of array lower bounds. * ! * That is: if the third axis of an array has elements 5 through 10, then ! * ARR_DIMS(a)[2] == 6 and ARR_LBOUND(a)[2] == 5. * * Unlike C, the default lower bound is 1. */ --- 81,88 ---- * * ARR_LBOUND returns a pointer to an array of array lower bounds. * ! * That is: if the third axis of an array has elements 5 through 8, then ! * ARR_DIMS(a)[2] == 4 and ARR_LBOUND(a)[2] == 5. * * Unlike C, the default lower bound is 1. */ *************** *** 176,182 **** extern int ArrayGetOffset(int n, int *dim, int *lb, int *indx); extern int ArrayGetOffset0(int n, int *tup, int *scale); ! extern int ArrayGetNItems(int n, int *a); extern void mda_get_range(int n, int *span, int *st, int *endp); extern void mda_get_prod(int n, int *range, int *prod); extern void mda_get_offset_values(int n, int *dist, int *prod, int *span); --- 176,182 ---- extern int ArrayGetOffset(int n, int *dim, int *lb, int *indx); extern int ArrayGetOffset0(int n, int *tup, int *scale); ! extern int ArrayGetNItems(int ndims, int *dims); extern void mda_get_range(int n, int *span, int *st, int *endp); extern void mda_get_prod(int n, int *range, int *prod); extern void mda_get_offset_values(int n, int *dist, int *prod, int *span);
---------------------------(end of broadcast)--------------------------- TIP 8: explain analyze is your friend