1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

MCOL-3760 + Fix multiple rands in statement with or without ORDER BY

This commit is contained in:
jmrojas2332
2020-02-13 23:28:28 +00:00
parent 34a0183f21
commit 0057d5fad5
2 changed files with 51 additions and 1 deletions

View File

@ -53,6 +53,7 @@ double Func_rand::getRand()
fSeed1 += 23;
fSeed2 = (fSeed1 + fSeed2 + 33) % maxValue;
fSeeds[fSeedIndex] = std::make_pair(fSeed1, fSeed2);
return (((double) fSeed1) / (double)maxValue);
}
@ -70,6 +71,37 @@ 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 == 0)
{
// 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)
{
@ -82,6 +114,13 @@ 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<uint64_t, uint64_t> &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
@ -94,6 +133,9 @@ double Func_rand::getDoubleVal(rowgroup::Row& row,
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));
}
}