From fb94d2da92ff9b87881a547a1c72841ad841b8c8 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 24 Mar 2022 19:50:54 +0800 Subject: [PATCH] [td-14266] fix bug. --- source/common/src/ttime.c | 24 +++++++++++++++++---- source/libs/executor/src/executorimpl.c | 2 +- tests/script/tsim/query/interval-offset.sim | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c index 22c10f62b4..da1adf0c59 100644 --- a/source/common/src/ttime.c +++ b/source/common/src/ttime.c @@ -458,16 +458,21 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) { if (duration == 0) { return t; } - if (unit == 'y') { - duration *= 12; - } else if (unit != 'n') { + + if (unit != 'n' && unit != 'y') { return t + duration; } + // The following code handles the y/n time duration + int64_t numOfMonth = duration; + if (unit == 'y') { + numOfMonth *= 12; + } + struct tm tm; time_t tt = (time_t)(t / TSDB_TICK_PER_SECOND(precision)); taosLocalTime(&tt, &tm); - int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)duration; + int32_t mon = tm.tm_year * 12 + tm.tm_mon + (int32_t)numOfMonth; tm.tm_year = mon / 12; tm.tm_mon = mon % 12; @@ -574,12 +579,23 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio } } + ASSERT(pInterval->offset >= 0); + if (pInterval->offset > 0) { start = taosTimeAdd(start, pInterval->offset, pInterval->offsetUnit, precision); if (start > t) { start = taosTimeAdd(start, -pInterval->interval, pInterval->intervalUnit, precision); + } else { + // try to move current window to the left-hande-side, due to the offset effect. + int64_t end = start + pInterval->interval - 1; + ASSERT(end >= t); + end = taosTimeAdd(end, -pInterval->sliding, pInterval->slidingUnit, precision); + if (end >= t) { + start = taosTimeAdd(start, -pInterval->sliding, pInterval->slidingUnit, precision); + } } } + return start; } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index cc0683f344..09ffce2837 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -7576,7 +7576,7 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* } pInfo->order = TSDB_ORDER_ASC; - pInfo->precision = TSDB_TIME_PRECISION_MICRO; + pInfo->precision = TSDB_TIME_PRECISION_MILLI; pInfo->win = pTaskInfo->window; pInfo->interval = *pInterval; diff --git a/tests/script/tsim/query/interval-offset.sim b/tests/script/tsim/query/interval-offset.sim index 9d5466ecbf..b6bdcca68f 100644 --- a/tests/script/tsim/query/interval-offset.sim +++ b/tests/script/tsim/query/interval-offset.sim @@ -88,6 +88,7 @@ print ===> rows5: $data50 $data51 $data52 $data53 $data54 print ===> rows6: $data60 $data61 $data62 $data63 $data64 print ===> rows7: $data70 $data71 $data72 $data73 $data74 if $rows != 8 then + print expect 8, actual $rows return -1 endi if $data00 != 2 then