From c287c8d90a3355877806d6cf2998480c130b4291 Mon Sep 17 00:00:00 2001 From: David Hall Date: Mon, 9 Aug 2021 10:14:49 -0500 Subject: [PATCH] MCOL-4771 develop fix crash from rand() The code inserted to handle multiple rand() calls is unneeded and was not thread safe, causing the crash. The code added to make certain function objects use fDynamicFunctor handles the multiple rand() problem. --- utils/funcexp/func_rand.cpp | 52 +--------------------------------- utils/funcexp/functor_export.h | 13 +-------- 2 files changed, 2 insertions(+), 63 deletions(-) diff --git a/utils/funcexp/func_rand.cpp b/utils/funcexp/func_rand.cpp index 94498b011..3c2f2a7f8 100644 --- a/utils/funcexp/func_rand.cpp +++ b/utils/funcexp/func_rand.cpp @@ -53,14 +53,6 @@ double Func_rand::getRand() fSeed1 += 23; fSeed2 = (fSeed1 + fSeed2 + 33) % maxValue; - if (fSeeds.size() > fSeedIndex) - { - fSeeds[fSeedIndex] = std::make_pair(fSeed1, fSeed2); - } - else - { - fSeeds.push_back(std::make_pair(fSeed1, fSeed2)); - } return (((double) fSeed1) / (double)maxValue); } @@ -79,37 +71,6 @@ double Func_rand::getDoubleVal(rowgroup::Row& row, // NOTE: this function needs to use 32bit ints otherwise it will break for negative values uint32_t seedParm = 0; - // Still on first row, multiple rands exist in statement. Need an additional seed. - if(fFirstRow == row.getData()) - { - fSeedSet = false; - fSeedIndex += 1; - } - else if (fFirstRow == nullptr) - { - // Store first row - fFirstRow = row.getData(); - fSeedIndex = 0; - } - else - { - // No longer on first row. Disable additional seeding - if (!fMultipleSeedsSet) - { - fMultipleSeedsSet = true; - fSeedIndex = 0; - } - else - { - fSeedIndex += 1; - - if (fSeedIndex == fSeeds.size()) - { - fSeedIndex = 0; - } - } - } - // rand with parameter. if the parm is constanct, then a column is attached for fetching if (parm.size() == 1 || parm.size() == 2) { @@ -122,28 +83,17 @@ double Func_rand::getDoubleVal(rowgroup::Row& row, fSeed1 = (uint32_t)(seedParm * 0x10001L + 55555555L); fSeed2 = (uint32_t)(seedParm * 0x10000001L); fSeedSet = true; - fSeeds.push_back(std::make_pair(fSeed1, fSeed2)); - } - else - { - const std::pair &seedPair = fSeeds[fSeedIndex]; - fSeed1 = seedPair.first; - fSeed2 = seedPair.second; } } // rand without parameter. thd->rand are passed in. The 3rd is a simple column for fetching else { idbassert(parm.size() == 3); - - if (fSeed1 == 0) + if (fSeedSet) { fSeed1 = parm[0]->data()->getIntVal(row, isNull); fSeed2 = parm[1]->data()->getIntVal(row, isNull); fSeedSet = true; - - // Special case: statement such as select rand(), rand(1) so need to keep rand(1) seeded correctly - fSeeds.push_back(std::make_pair(fSeed1, fSeed2)); } } diff --git a/utils/funcexp/functor_export.h b/utils/funcexp/functor_export.h index e8d69f401..270ecd208 100644 --- a/utils/funcexp/functor_export.h +++ b/utils/funcexp/functor_export.h @@ -38,17 +38,10 @@ namespace funcexp class Func_rand : public Func { public: - Func_rand() : Func("rand"), fSeed1(0), fSeed2(0), fSeedSet(false), fMultipleSeedsSet(false), fFirstRow(NULL), fSeeds(){} + Func_rand() : Func("rand"), fSeed1(0), fSeed2(0), fSeedSet(false) {} virtual ~Func_rand() {} double getRand(); - void seedSet(bool seedSet) - { - fSeedSet = seedSet; - fMultipleSeedsSet = seedSet; - fFirstRow = NULL; - fSeeds.clear(); - } execplan::CalpontSystemCatalog::ColType operationType(FunctionParm& fp, execplan::CalpontSystemCatalog::ColType& resultType); int64_t getIntVal(rowgroup::Row& row, @@ -84,10 +77,6 @@ private: uint64_t fSeed1; uint64_t fSeed2; bool fSeedSet; - bool fMultipleSeedsSet; - uint8_t* fFirstRow; - uint16_t fSeedIndex; - std::vector > fSeeds; };