diff --git a/src/backend/commands/analyzeutils.c b/src/backend/commands/analyzeutils.c index c4f9fa5dedb..641ea015ea3 100644 --- a/src/backend/commands/analyzeutils.c +++ b/src/backend/commands/analyzeutils.c @@ -759,17 +759,31 @@ getNdvBySegHeapTuple(AttStatsSlot * *ndvbsSlots, HeapTuple *heaptupleStats, floa (void) get_attstatsslot(ndvbsSlots[i], heaptupleStats[i], STATISTIC_KIND_NDV_BY_SEGMENTS, InvalidOid, ATTSTATSSLOT_VALUES); - if ((InvalidOid != ndvbsSlots[i]->valuetype && // result is not empty - // not empty partition with invalid ndvbs - (relTuples[i] > 0 && DatumGetFloat8(ndvbsSlots[i]->values[0]) == 0)) || - // not empty partition without ndvbs - (InvalidOid == ndvbsSlots[i]->valuetype && relTuples[i] > 0)) { - valid = false; - break; + if (ndvbsSlots[i]->valuetype != FLOAT8OID) + { + /* + * NDV_BY_SEGMENTS slot not found or has unexpected type. + * Non-empty partitions must have valid NDV_BY_SEGMENTS; + * empty partitions (relTuples == 0) can be skipped. + */ + if (relTuples[i] > 0) + { + valid = false; + break; + } + pfree(ndvbsSlots[i]); + ndvbsSlots[i] = NULL; + continue; } - Assert(ndvbsSlots[i]->valuetype == FLOAT8OID); Assert(ndvbsSlots[i]->nvalues == 1); + + /* Non-empty partition with zero NDV is suspicious */ + if (relTuples[i] > 0 && DatumGetFloat8(ndvbsSlots[i]->values[0]) == 0) + { + valid = false; + break; + } } return valid; }