mirror of https://gitee.com/bigwinds/arangodb
Fixed uninitialized value in date subtract/add function. (#4964)
This commit is contained in:
parent
e798ddf5c4
commit
589f5911cb
|
@ -232,10 +232,12 @@ static DateSelectionModifier ParseDateModifierFlag(VPackSlice flag) {
|
||||||
|
|
||||||
AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
|
AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
|
||||||
tp_sys_clock_ms const& tp,
|
tp_sys_clock_ms const& tp,
|
||||||
double durationUnits,
|
VPackSlice durationUnitsSlice,
|
||||||
VPackSlice durationType,
|
VPackSlice durationType,
|
||||||
bool isSubtract) {
|
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)};
|
year_month_day ymd{floor<days>(tp)};
|
||||||
auto day_time = make_time(tp - sys_days(ymd));
|
auto day_time = make_time(tp - sys_days(ymd));
|
||||||
|
|
||||||
|
@ -258,7 +260,7 @@ AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
|
||||||
} else {
|
} else {
|
||||||
ymd += years{static_cast<int64_t>(intPart)};
|
ymd += years{static_cast<int64_t>(intPart)};
|
||||||
}
|
}
|
||||||
if (durationUnits == 0.0) {
|
if (isInteger || durationUnits == 0.0) {
|
||||||
break; // We are done
|
break; // We are done
|
||||||
}
|
}
|
||||||
durationUnits *= 12;
|
durationUnits *= 12;
|
||||||
|
@ -270,7 +272,7 @@ AqlValue Functions::AddOrSubtractUnitFromTimestamp(Query* query,
|
||||||
} else {
|
} else {
|
||||||
ymd += months{static_cast<int64_t>(intPart)};
|
ymd += months{static_cast<int64_t>(intPart)};
|
||||||
}
|
}
|
||||||
if (durationUnits == 0.0) {
|
if (isInteger || durationUnits == 0.0) {
|
||||||
break; // We are done
|
break; // We are done
|
||||||
}
|
}
|
||||||
durationUnits *= 30; // 1 Month ~= 30 Days
|
durationUnits *= 30; // 1 Month ~= 30 Days
|
||||||
|
@ -2829,8 +2831,8 @@ AqlValue Functions::DateAdd(arangodb::aql::Query* query,
|
||||||
return AqlValue(AqlValueHintNull());
|
return AqlValue(AqlValueHintNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
double doubleUnits = durationUnit.toDouble(trx);
|
// Numbers and Strings can both be sliced
|
||||||
return AddOrSubtractUnitFromTimestamp(query, tp, doubleUnits,
|
return AddOrSubtractUnitFromTimestamp(query, tp, durationUnit.slice(),
|
||||||
durationType.slice(), false);
|
durationType.slice(), false);
|
||||||
} else { // iso duration
|
} else { // iso duration
|
||||||
AqlValue isoDuration = ExtractFunctionParameterValue(parameters, 1);
|
AqlValue isoDuration = ExtractFunctionParameterValue(parameters, 1);
|
||||||
|
@ -2871,8 +2873,8 @@ AqlValue Functions::DateSubtract(arangodb::aql::Query* query,
|
||||||
return AqlValue(AqlValueHintNull());
|
return AqlValue(AqlValueHintNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
double doubleUnits = durationUnit.toDouble(trx);
|
// Numbers and Strings can both be sliced
|
||||||
return AddOrSubtractUnitFromTimestamp(query, tp, doubleUnits,
|
return AddOrSubtractUnitFromTimestamp(query, tp, durationUnit.slice(),
|
||||||
durationType.slice(), true);
|
durationType.slice(), true);
|
||||||
} else { // iso duration
|
} else { // iso duration
|
||||||
AqlValue isoDuration = ExtractFunctionParameterValue(parameters, 1);
|
AqlValue isoDuration = ExtractFunctionParameterValue(parameters, 1);
|
||||||
|
|
|
@ -55,7 +55,7 @@ struct Functions {
|
||||||
|
|
||||||
static AqlValue AddOrSubtractUnitFromTimestamp(arangodb::aql::Query* query,
|
static AqlValue AddOrSubtractUnitFromTimestamp(arangodb::aql::Query* query,
|
||||||
tp_sys_clock_ms const& tp,
|
tp_sys_clock_ms const& tp,
|
||||||
double durationUnits,
|
arangodb::velocypack::Slice durationUnits,
|
||||||
arangodb::velocypack::Slice durationType,
|
arangodb::velocypack::Slice durationType,
|
||||||
bool isSubtract);
|
bool isSubtract);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue