1
0
Fork 0

Fixed uninitialized value in date subtract/add function. (#4964)

This commit is contained in:
Michael Hackstein 2018-03-26 17:17:53 +02:00 committed by GitHub
parent e798ddf5c4
commit 589f5911cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 9 deletions

View File

@ -232,10 +232,12 @@ static DateSelectionModifier ParseDateModifierFlag(VPackSlice flag) {
AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
tp_sys_clock_ms const& tp,
double durationUnits,
VPackSlice durationUnitsSlice,
VPackSlice durationType,
bool isSubtract) {
std::chrono::duration<double, std::ratio<1l, 1000l>> ms;
bool isInteger = durationUnitsSlice.isInteger();
double durationUnits = durationUnitsSlice.getNumber<double>();
std::chrono::duration<double, std::ratio<1l, 1000l>> ms{};
year_month_day ymd{floor<days>(tp)};
auto day_time = make_time(tp - sys_days(ymd));
@ -258,7 +260,7 @@ AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
} else {
ymd += years{static_cast<int64_t>(intPart)};
}
if (durationUnits == 0.0) {
if (isInteger || durationUnits == 0.0) {
break; // We are done
}
durationUnits *= 12;
@ -270,7 +272,7 @@ AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
} else {
ymd += months{static_cast<int64_t>(intPart)};
}
if (durationUnits == 0.0) {
if (isInteger || durationUnits == 0.0) {
break; // We are done
}
durationUnits *= 30; // 1 Month ~= 30 Days
@ -2829,8 +2831,8 @@ AqlValue Functions::DateAdd(arangodb::aql::Query* query,
return AqlValue(AqlValueHintNull());
}
double doubleUnits = durationUnit.toDouble(trx);
return AddOrSubtractUnitFromTimestamp(query, tp, doubleUnits,
// Numbers and Strings can both be sliced
return AddOrSubtractUnitFromTimestamp(query, tp, durationUnit.slice(),
durationType.slice(), false);
} else { // iso duration
AqlValue isoDuration = ExtractFunctionParameterValue(parameters, 1);
@ -2871,8 +2873,8 @@ AqlValue Functions::DateSubtract(arangodb::aql::Query* query,
return AqlValue(AqlValueHintNull());
}
double doubleUnits = durationUnit.toDouble(trx);
return AddOrSubtractUnitFromTimestamp(query, tp, doubleUnits,
// Numbers and Strings can both be sliced
return AddOrSubtractUnitFromTimestamp(query, tp, durationUnit.slice(),
durationType.slice(), true);
} else { // iso duration
AqlValue isoDuration = ExtractFunctionParameterValue(parameters, 1);

View File

@ -55,7 +55,7 @@ struct Functions {
static AqlValue AddOrSubtractUnitFromTimestamp(arangodb::aql::Query* query,
tp_sys_clock_ms const& tp,
double durationUnits,
arangodb::velocypack::Slice durationUnits,
arangodb::velocypack::Slice durationType,
bool isSubtract);