Skip to content

Commit 330cafd

Browse files
committed
Remove no-longer-helpful reliance on fixed-size local array.
Coverity complained about this code, apparently because it uses a local array of size FUNC_MAX_ARGS without a guard that the input argument list is no longer than that. (Not sure why it complained today, since this code's been the same for a long time; possibly it re-analyzed everything the List API change touched?) Rather than add a guard, though, let's just get rid of the local array altogether. It was only there to avoid list_nth() calls, and those are no longer expensive.
1 parent 90317ab commit 330cafd

File tree

1 file changed

+23
-37
lines changed

1 file changed

+23
-37
lines changed

src/backend/parser/parse_func.c

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,37 +1734,30 @@ unify_hypothetical_args(ParseState *pstate,
17341734
Oid *actual_arg_types,
17351735
Oid *declared_arg_types)
17361736
{
1737-
Node *args[FUNC_MAX_ARGS];
17381737
int numDirectArgs,
17391738
numNonHypotheticalArgs;
1740-
int i;
1741-
ListCell *lc;
1739+
int hargpos;
17421740

17431741
numDirectArgs = list_length(fargs) - numAggregatedArgs;
17441742
numNonHypotheticalArgs = numDirectArgs - numAggregatedArgs;
17451743
/* safety check (should only trigger with a misdeclared agg) */
17461744
if (numNonHypotheticalArgs < 0)
17471745
elog(ERROR, "incorrect number of arguments to hypothetical-set aggregate");
17481746

1749-
/* Deconstruct fargs into an array for ease of subscripting */
1750-
i = 0;
1751-
foreach(lc, fargs)
1752-
{
1753-
args[i++] = (Node *) lfirst(lc);
1754-
}
1755-
17561747
/* Check each hypothetical arg and corresponding aggregated arg */
1757-
for (i = numNonHypotheticalArgs; i < numDirectArgs; i++)
1748+
for (hargpos = numNonHypotheticalArgs; hargpos < numDirectArgs; hargpos++)
17581749
{
1759-
int aargpos = numDirectArgs + (i - numNonHypotheticalArgs);
1750+
int aargpos = numDirectArgs + (hargpos - numNonHypotheticalArgs);
1751+
ListCell *harg = list_nth_cell(fargs, hargpos);
1752+
ListCell *aarg = list_nth_cell(fargs, aargpos);
17601753
Oid commontype;
17611754

17621755
/* A mismatch means AggregateCreate didn't check properly ... */
1763-
if (declared_arg_types[i] != declared_arg_types[aargpos])
1756+
if (declared_arg_types[hargpos] != declared_arg_types[aargpos])
17641757
elog(ERROR, "hypothetical-set aggregate has inconsistent declared argument types");
17651758

17661759
/* No need to unify if make_fn_arguments will coerce */
1767-
if (declared_arg_types[i] != ANYOID)
1760+
if (declared_arg_types[hargpos] != ANYOID)
17681761
continue;
17691762

17701763
/*
@@ -1773,38 +1766,31 @@ unify_hypothetical_args(ParseState *pstate,
17731766
* the aggregated values).
17741767
*/
17751768
commontype = select_common_type(pstate,
1776-
list_make2(args[aargpos], args[i]),
1769+
list_make2(lfirst(aarg), lfirst(harg)),
17771770
"WITHIN GROUP",
17781771
NULL);
17791772

17801773
/*
17811774
* Perform the coercions. We don't need to worry about NamedArgExprs
17821775
* here because they aren't supported with aggregates.
17831776
*/
1784-
args[i] = coerce_type(pstate,
1785-
args[i],
1786-
actual_arg_types[i],
1787-
commontype, -1,
1788-
COERCION_IMPLICIT,
1789-
COERCE_IMPLICIT_CAST,
1790-
-1);
1791-
actual_arg_types[i] = commontype;
1792-
args[aargpos] = coerce_type(pstate,
1793-
args[aargpos],
1794-
actual_arg_types[aargpos],
1795-
commontype, -1,
1796-
COERCION_IMPLICIT,
1797-
COERCE_IMPLICIT_CAST,
1798-
-1);
1777+
lfirst(harg) = coerce_type(pstate,
1778+
(Node *) lfirst(harg),
1779+
actual_arg_types[hargpos],
1780+
commontype, -1,
1781+
COERCION_IMPLICIT,
1782+
COERCE_IMPLICIT_CAST,
1783+
-1);
1784+
actual_arg_types[hargpos] = commontype;
1785+
lfirst(aarg) = coerce_type(pstate,
1786+
(Node *) lfirst(aarg),
1787+
actual_arg_types[aargpos],
1788+
commontype, -1,
1789+
COERCION_IMPLICIT,
1790+
COERCE_IMPLICIT_CAST,
1791+
-1);
17991792
actual_arg_types[aargpos] = commontype;
18001793
}
1801-
1802-
/* Reconstruct fargs from array */
1803-
i = 0;
1804-
foreach(lc, fargs)
1805-
{
1806-
lfirst(lc) = args[i++];
1807-
}
18081794
}
18091795

18101796

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy