diff --git a/utils/regr/moda.cpp b/utils/regr/moda.cpp index 7fc15a010..caf6cd1f8 100644 --- a/utils/regr/moda.cpp +++ b/utils/regr/moda.cpp @@ -480,3 +480,83 @@ void ModaData::unserialize(messageqcpp::ByteStream& bs) } } +void ModaData::cleanup() +{ + if (!fMap) + return; + switch ((execplan::CalpontSystemCatalog::ColDataType)fReturnType) + { + case execplan::CalpontSystemCatalog::TINYINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::SMALLINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::MEDINT: + case execplan::CalpontSystemCatalog::INT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::BIGINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::DECIMAL: + case execplan::CalpontSystemCatalog::UDECIMAL: + switch (fColWidth) + { + case 1: + clear(); + deleteMap(); + break; + case 2: + clear(); + deleteMap(); + break; + case 4: + clear(); + deleteMap(); + break; + default: + clear(); + deleteMap(); + break; + } + break; + case execplan::CalpontSystemCatalog::UTINYINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::USMALLINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::UMEDINT: + case execplan::CalpontSystemCatalog::UINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::UBIGINT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::FLOAT: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::DOUBLE: + clear(); + deleteMap(); + break; + case execplan::CalpontSystemCatalog::LONGDOUBLE: + clear(); + deleteMap(); + break; + default: + throw std::runtime_error("ModaData::unserialize with bad data type"); + break; + } +} + diff --git a/utils/regr/moda.h b/utils/regr/moda.h index 2a9e6cbe7..f8c0ef822 100644 --- a/utils/regr/moda.h +++ b/utils/regr/moda.h @@ -63,7 +63,7 @@ struct ModaData : public UserData modaImpl(NULL) {}; - virtual ~ModaData() {} + virtual ~ModaData() {cleanup();} virtual void serialize(messageqcpp::ByteStream& bs) const; virtual void unserialize(messageqcpp::ByteStream& bs); @@ -84,19 +84,26 @@ struct ModaData : public UserData template std::unordered_map* getMap() const { - if (!fMap) - { - throw std::runtime_error("ModaData::serialize with no map"); - } return (std::unordered_map*) fMap; } - + + template + void deleteMap() + { + if (fMap) + { + delete (std::unordered_map*) fMap; + fMap = NULL; + } + } + template void clear() { fSum = 0.0; fCount = 0; - getMap()->clear(); + if (fMap) + getMap()->clear(); } long double fSum; @@ -110,17 +117,26 @@ private: // For now, copy construction is unwanted ModaData(UserData&); + void cleanup(); + // Templated map streamers template void serializeMap(messageqcpp::ByteStream& bs) const { std::unordered_map* map = getMap(); - typename std::unordered_map::const_iterator iter; - bs << (uint64_t)map->size(); - for (iter = map->begin(); iter != map->end(); ++iter) + if (map) { - bs << iter->first; - bs << iter->second; + typename std::unordered_map::const_iterator iter; + bs << (uint64_t)map->size(); + for (iter = map->begin(); iter != map->end(); ++iter) + { + bs << iter->first; + bs << iter->second; + } + } + else + { + bs << (uint64_t)0; } }