@@ -297,9 +297,9 @@ typedef struct AggHashEntryData *AggHashEntry;
297297typedef struct AggHashEntryData
298298{
299299 TupleHashEntryData shared ; /* common header for hash table entries */
300- /* per-aggregate transition status array - must be last! */
301- AggStatePerGroupData pergroup [1 ]; /* VARIABLE LENGTH ARRAY */
302- } AggHashEntryData ; /* VARIABLE LENGTH STRUCT */
300+ /* per-aggregate transition status array */
301+ AggStatePerGroupData pergroup [FLEXIBLE_ARRAY_MEMBER ];
302+ } AggHashEntryData ;
303303
304304
305305static void initialize_aggregates (AggState * aggstate ,
@@ -941,8 +941,8 @@ build_hash_table(AggState *aggstate)
941941 Assert (node -> aggstrategy == AGG_HASHED );
942942 Assert (node -> numGroups > 0 );
943943
944- entrysize = sizeof (AggHashEntryData ) +
945- ( aggstate -> numaggs - 1 ) * sizeof (AggStatePerGroupData );
944+ entrysize = offsetof (AggHashEntryData , pergroup ) +
945+ aggstate -> numaggs * sizeof (AggStatePerGroupData );
946946
947947 aggstate -> hashtable = BuildTupleHashTable (node -> numCols ,
948948 node -> grpColIdx ,
@@ -1013,8 +1013,8 @@ hash_agg_entry_size(int numAggs)
10131013 Size entrysize ;
10141014
10151015 /* This must match build_hash_table */
1016- entrysize = sizeof (AggHashEntryData ) +
1017- ( numAggs - 1 ) * sizeof (AggStatePerGroupData );
1016+ entrysize = offsetof (AggHashEntryData , pergroup ) +
1017+ numAggs * sizeof (AggStatePerGroupData );
10181018 entrysize = MAXALIGN (entrysize );
10191019 /* Account for hashtable overhead (assuming fill factor = 1) */
10201020 entrysize += 3 * sizeof (void * );
0 commit comments