mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Code review for commit d26888bc4d
.
Mostly, copy-edit the comments; but also fix it to not reject domains over arrays.
This commit is contained in:
parent
42c6236f37
commit
741364bf5c
@ -559,7 +559,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
|
||||
* If it's a variadic function call, transform the last nvargs arguments
|
||||
* into an array --- unless it's an "any" variadic.
|
||||
*/
|
||||
if (nvargs > 0 && declared_arg_types[nargs - 1] != ANYOID)
|
||||
if (nvargs > 0 && vatype != ANYOID)
|
||||
{
|
||||
ArrayExpr *newa = makeNode(ArrayExpr);
|
||||
int non_var_args = nargs - nvargs;
|
||||
@ -587,19 +587,19 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
|
||||
}
|
||||
|
||||
/*
|
||||
* When function is called with an explicit VARIADIC labeled parameter,
|
||||
* and the declared_arg_type is "any", then sanity check the actual
|
||||
* parameter type now - it must be an array.
|
||||
* If an "any" variadic is called with explicit VARIADIC marking, insist
|
||||
* that the variadic parameter be of some array type.
|
||||
*/
|
||||
if (nargs > 0 && vatype == ANYOID && func_variadic)
|
||||
{
|
||||
Oid va_arr_typid = actual_arg_types[nargs - 1];
|
||||
Oid va_arr_typid = actual_arg_types[nargs - 1];
|
||||
|
||||
if (!OidIsValid(get_element_type(va_arr_typid)))
|
||||
if (!OidIsValid(get_base_element_type(va_arr_typid)))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
errmsg("VARIADIC argument must be an array"),
|
||||
parser_errposition(pstate, exprLocation((Node *) llast(fargs)))));
|
||||
parser_errposition(pstate,
|
||||
exprLocation((Node *) llast(fargs)))));
|
||||
}
|
||||
|
||||
/* build the appropriate output structure */
|
||||
@ -1253,6 +1253,7 @@ func_get_detail(List *funcname,
|
||||
*rettype = InvalidOid;
|
||||
*retset = false;
|
||||
*nvargs = 0;
|
||||
*vatype = InvalidOid;
|
||||
*true_typeids = NULL;
|
||||
if (argdefaults)
|
||||
*argdefaults = NIL;
|
||||
@ -1364,6 +1365,7 @@ func_get_detail(List *funcname,
|
||||
*rettype = targetType;
|
||||
*retset = false;
|
||||
*nvargs = 0;
|
||||
*vatype = InvalidOid;
|
||||
*true_typeids = argtypes;
|
||||
return FUNCDETAIL_COERCION;
|
||||
}
|
||||
|
@ -3834,16 +3834,15 @@ concat_internal(const char *sepstr, int argidx,
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Non-null argument had better be an array
|
||||
*
|
||||
* Correct values are ensured by parser check, but this function
|
||||
* can be called directly, bypassing the parser, so we should do
|
||||
* some minimal check too - this form of call requires correctly set
|
||||
* expr argtype in flinfo.
|
||||
* Non-null argument had better be an array. We assume that any call
|
||||
* context that could let get_fn_expr_variadic return true will have
|
||||
* checked that a VARIADIC-labeled parameter actually is an array. So
|
||||
* it should be okay to just Assert that it's an array rather than
|
||||
* doing a full-fledged error check.
|
||||
*/
|
||||
Assert(OidIsValid(get_fn_expr_argtype(fcinfo->flinfo, argidx)));
|
||||
Assert(OidIsValid(get_element_type(get_fn_expr_argtype(fcinfo->flinfo, argidx))));
|
||||
Assert(OidIsValid(get_base_element_type(get_fn_expr_argtype(fcinfo->flinfo, argidx))));
|
||||
|
||||
/* OK, safe to fetch the array value */
|
||||
arr = PG_GETARG_ARRAYTYPE_P(argidx);
|
||||
|
||||
/*
|
||||
@ -4063,16 +4062,15 @@ text_format(PG_FUNCTION_ARGS)
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Non-null argument had better be an array
|
||||
*
|
||||
* Correct values are ensured by parser check, but this function
|
||||
* can be called directly, bypassing the parser, so we should do
|
||||
* some minimal check too - this form of call requires correctly set
|
||||
* expr argtype in flinfo.
|
||||
* Non-null argument had better be an array. We assume that any
|
||||
* call context that could let get_fn_expr_variadic return true
|
||||
* will have checked that a VARIADIC-labeled parameter actually is
|
||||
* an array. So it should be okay to just Assert that it's an
|
||||
* array rather than doing a full-fledged error check.
|
||||
*/
|
||||
Assert(OidIsValid(get_fn_expr_argtype(fcinfo->flinfo, 1)));
|
||||
Assert(OidIsValid(get_element_type(get_fn_expr_argtype(fcinfo->flinfo, 1))));
|
||||
Assert(OidIsValid(get_base_element_type(get_fn_expr_argtype(fcinfo->flinfo, 1))));
|
||||
|
||||
/* OK, safe to fetch the array value */
|
||||
arr = PG_GETARG_ARRAYTYPE_P(1);
|
||||
|
||||
/* Get info about array element type */
|
||||
|
Loading…
Reference in New Issue
Block a user