Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8b231d9

Browse files
committed
Fix optimization hazard in gram.y's makeOrderedSetArgs(), redux.
It appears that commit cf63c64, which intended to prevent misoptimization of the result-building step in makeOrderedSetArgs, didn't go far enough: buildfarm member hornet's version of xlc is now optimizing back to the old, broken behavior in which list_length(directargs) is fetched only after list_concat() has changed that value. I'm not entirely convinced whether that's an undeniable compiler bug or whether it can be justified by a sufficiently aggressive interpretation of C sequence points. So let's just change the code to make it harder to misinterpret. Back-patch to all supported versions, just in case. Discussion: https://postgr.es/m/1830491.1601944935@sss.pgh.pa.us
1 parent d8c2a21 commit 8b231d9

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

src/backend/parser/gram.y

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15817,7 +15817,7 @@ makeOrderedSetArgs(List *directargs, List *orderedargs,
1581715817
core_yyscan_t yyscanner)
1581815818
{
1581915819
FunctionParameter *lastd = (FunctionParameter *) llast(directargs);
15820-
int ndirectargs;
15820+
Value *ndirectargs;
1582115821

1582215822
/* No restriction unless last direct arg is VARIADIC */
1582315823
if (lastd->mode == FUNC_PARAM_VARIADIC)
@@ -15841,10 +15841,10 @@ makeOrderedSetArgs(List *directargs, List *orderedargs,
1584115841
}
1584215842

1584315843
/* don't merge into the next line, as list_concat changes directargs */
15844-
ndirectargs = list_length(directargs);
15844+
ndirectargs = makeInteger(list_length(directargs));
1584515845

1584615846
return list_make2(list_concat(directargs, orderedargs),
15847-
makeInteger(ndirectargs));
15847+
ndirectargs);
1584815848
}
1584915849

1585015850
/* insertSelectOptions()

0 commit comments

Comments
 (0)