On Mon, Jul 6, 2015 at 10:08 AM, Joe Conway <m...@joeconway.com> wrote:
> -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 07/06/2015 12:39 AM, Michael Paquier wrote: > >> Yeah, particularly the use of first_optarg makes things harder > >> to follow in the code with this patch. A C wrapper has the > >> disadvantage to decentralize the argument checks to many places > >> making the flow harder to follow hence using > >> get_fn_expr_argtype() with PG_NARGS would be the way to go, at > >> least to me. This way, you can easily find how many arguments > >> there are, and which value is assigned to which variable before > >> moving on to the real processing. > > > > Just to be clear I mean that: if (PG_NARGS() == 5) { if > > (get_fn_expr_argtype(fcinfo->flinfo, 1) == TYPEOID) var = > > PG_GETARG_BOOL(1) [...] > > Actually, I had in mind something like: > 8<--------------------- > int i; > int numargs; > int *argtypes; > > numargs = PG_NARGS(); > argtypes = palloc(numargs * sizeof(int)); > for (i = 0; i < numargs; i++) > argtypes[i] = get_fn_expr_argtype(fcinfo->flinfo, i); > > if ((numargs == 4 || numargs == 5) && > argtypes[0] == TEXTOID && > argtypes[1] == TEXTOID && > argtypes[2] == INT4OID && > argtypes[3] == BOOLOID) > { > [...] > } > else if ((numargs == 3 || numargs == 4) && > argtypes[0] == TEXTOID && > argtypes[1] == INT4OID && > argtypes[2] == BOOLOID) > { > [...] > 8<--------------------- > etc. > > If the highest number of arguments is always checked first, the > pattern is not ambiguous even with the extra anyelement. > > Utterly reasonable and do-able. I'll get to work on that soonish, pending resolution of other's concerns.