Index: src/backend/parser/parse_func.c =================================================================== RCS file: /opt/src/cvs/pgsql-server/src/backend/parser/parse_func.c,v retrieving revision 1.149 diff -c -r1.149 parse_func.c *** src/backend/parser/parse_func.c 6 Jun 2003 15:04:02 -0000 1.149 --- src/backend/parser/parse_func.c 24 Jun 2003 23:33:50 -0000 *************** *** 1075,1124 **** **iter; Oid *oneres; int i, ! j; ! int cur[FUNC_MAX_ARGS]; nanswers = 1; for (i = 0; i < nargs; i++) { ! nanswers *= (arginh[i].nsupers + 2); ! cur[i] = 0; } ! iter = result = (Oid **) palloc(sizeof(Oid *) * nanswers); /* compute the cross product from right to left */ ! for (;;) { oneres = (Oid *) palloc0(FUNC_MAX_ARGS * sizeof(Oid)); ! for (i = nargs - 1; i >= 0 && cur[i] > arginh[i].nsupers; i--) ! continue; ! ! /* if we're done, terminate with NULL pointer */ ! if (i < 0) ! { ! *iter = NULL; ! return result; ! } ! ! /* no, increment this column and zero the ones after it */ ! cur[i] = cur[i] + 1; ! for (j = nargs - 1; j > i; j--) ! cur[j] = 0; ! ! for (i = 0; i < nargs; i++) { ! if (cur[i] == 0) ! oneres[i] = arginh[i].self; ! else if (cur[i] > arginh[i].nsupers) ! oneres[i] = 0; /* wild card */ else ! oneres[i] = arginh[i].supervec[cur[i] - 1]; } ! ! *iter++ = oneres; } } --- 1076,1117 ---- **iter; Oid *oneres; int i, ! j, ! cum; nanswers = 1; for (i = 0; i < nargs; i++) { ! if (arginh[i].nsupers) ! nanswers *= arginh[i].nsupers; } ! /* need room for wildcard vector and null terminator */ ! iter = result = (Oid **) palloc(sizeof(Oid *) * (nanswers + 2)); /* compute the cross product from right to left */ ! for (j = 0; j < nanswers; j++) { oneres = (Oid *) palloc0(FUNC_MAX_ARGS * sizeof(Oid)); + cum = 1; ! for (i = nargs - 1; i >= 0; i--) { ! if (arginh[i].nsupers) ! { ! oneres[i] = arginh[i].supervec[(j / cum) % arginh[i].nsupers]; ! cum *= arginh[i].nsupers; ! } else ! oneres[i] = arginh[i].self; } ! iter[j] = oneres; } + oneres = (Oid *) palloc0(FUNC_MAX_ARGS * sizeof(Oid)); + iter[nanswers] = oneres; + iter[nanswers + 1] = NULL; + + return result; }