From ee5e9a71c3cb77618f4ff4ad1a7d84936bcaac6b Mon Sep 17 00:00:00 2001 From: dapan1121 <89396746@qq.com> Date: Tue, 19 Jan 2021 11:29:52 +0800 Subject: [PATCH] query interval with client tz --- src/client/src/tscLocalMerge.c | 2 +- src/client/src/tscSQLParser.c | 2 ++ src/client/src/tscServer.c | 1 + src/client/src/tscSubquery.c | 4 ++-- src/os/inc/osTime.h | 2 +- src/os/src/detail/osTime.c | 14 ++++++++++++-- src/query/inc/qFill.h | 2 +- src/query/src/qExecutor.c | 3 ++- src/query/src/qFill.c | 4 +++- 9 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/client/src/tscLocalMerge.c b/src/client/src/tscLocalMerge.c index 6280cc520a..8b151a7618 100644 --- a/src/client/src/tscLocalMerge.c +++ b/src/client/src/tscLocalMerge.c @@ -385,7 +385,7 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd SFillColInfo* pFillCol = createFillColInfo(pQueryInfo); pReducer->pFillInfo = taosInitFillInfo(pQueryInfo->order.order, revisedSTime, pQueryInfo->groupbyExpr.numOfGroupCols, 4096, (int32_t)pQueryInfo->fieldsInfo.numOfOutput, pQueryInfo->interval.sliding, pQueryInfo->interval.slidingUnit, - tinfo.precision, pQueryInfo->fillType, pFillCol, pSql); + tinfo.precision, pQueryInfo->fillType, pFillCol, pSql, timezone); } } diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 64268124da..4b74123f45 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -776,6 +776,8 @@ int32_t parseIntervalClause(SSqlObj* pSql, SQueryInfo* pQueryInfo, SQuerySQL* pQ return TSDB_CODE_TSC_INVALID_SQL; } + pQueryInfo->interval.tz = timezone; + return TSDB_CODE_SUCCESS; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 537e81413f..631524d198 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -728,6 +728,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) { pQueryMsg->limit = htobe64(pQueryInfo->limit.limit); pQueryMsg->offset = htobe64(pQueryInfo->limit.offset); pQueryMsg->numOfCols = htons((int16_t)taosArrayGetSize(pQueryInfo->colList)); + pQueryMsg->interval.tz = htobe64(timezone); pQueryMsg->interval.interval = htobe64(pQueryInfo->interval.interval); pQueryMsg->interval.sliding = htobe64(pQueryInfo->interval.sliding); pQueryMsg->interval.offset = htobe64(pQueryInfo->interval.offset); diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 2622246111..3ef37039b2 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -2292,8 +2292,8 @@ static void multiVnodeInsertFinalize(void* param, TAOS_RES* tres, int numOfRows) } } - tscError("%p Async insertion completed, total inserted:%d rows, numOfFailed:%d, numOfTotal:%d", pParentObj, - pParentObj->res.numOfRows, numOfFailed, numOfSub); + tscError("%p Async insertion completed, total inserted:%d rows, numOfFailed:%d, numOfTotal:%d, code:%d", pParentObj, + pParentObj->res.numOfRows, numOfFailed, numOfSub, pParentObj->res.code); tscDebug("%p cleanup %d tableMeta in hashTable", pParentObj, pParentObj->cmd.numOfTables); for(int32_t i = 0; i < pParentObj->cmd.numOfTables; ++i) { diff --git a/src/os/inc/osTime.h b/src/os/inc/osTime.h index b20ccadadb..4626969921 100644 --- a/src/os/inc/osTime.h +++ b/src/os/inc/osTime.h @@ -63,7 +63,7 @@ static FORCE_INLINE int64_t taosGetTimestamp(int32_t precision) { typedef struct SInterval { - int32_t tz; // query client timezone + int64_t tz; // query client timezone char intervalUnit; char slidingUnit; char offsetUnit; diff --git a/src/os/src/detail/osTime.c b/src/os/src/detail/osTime.c index 1710c469fb..c19caa4dcc 100644 --- a/src/os/src/detail/osTime.c +++ b/src/os/src/detail/osTime.c @@ -479,6 +479,15 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio } start = (int64_t)(mktime(&tm) * TSDB_TICK_PER_SECOND(precision)); + + #if defined(WINDOWS) && _MSC_VER >= 1900 + // see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019 + int64_t timezone = _timezone; + int32_t daylight = _daylight; + char** tzname = _tzname; + #endif + assert(pInterval->tz % 3600 == 0); + start -= (timezone - pInterval->tz) * TSDB_TICK_PER_SECOND(precision); } else { int64_t delta = t - pInterval->interval; int32_t factor = (delta >= 0) ? 1 : -1; @@ -497,8 +506,9 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio int32_t daylight = _daylight; char** tzname = _tzname; #endif - - start += (int64_t)(timezone * TSDB_TICK_PER_SECOND(precision)); + assert(pInterval->tz % 3600 == 0); + + start += (int64_t)(pInterval->tz * TSDB_TICK_PER_SECOND(precision)); } int64_t end = 0; diff --git a/src/query/inc/qFill.h b/src/query/inc/qFill.h index 93537ec3da..bc46a8ec45 100644 --- a/src/query/inc/qFill.h +++ b/src/query/inc/qFill.h @@ -70,7 +70,7 @@ typedef struct SPoint { SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols, int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType, - SFillColInfo* pFillCol, void* handle); + SFillColInfo* pFillCol, void* handle, int64_t tz); void taosResetFillInfo(SFillInfo* pFillInfo, TSKEY startTimestamp); diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 110b0d198c..44337e0866 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -4761,7 +4761,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo int32_t numOfCols = getNumOfFinalResCol(pQuery); pRuntimeEnv->pFillInfo = taosInitFillInfo(pQuery->order.order, w.skey, 0, (int32_t)pQuery->rec.capacity, numOfCols, pQuery->interval.sliding, pQuery->interval.slidingUnit, (int8_t)pQuery->precision, - pQuery->fillType, pColInfo, pQInfo); + pQuery->fillType, pColInfo, pQInfo, pQuery->interval.tz); } setQueryStatus(pQuery, QUERY_NOT_COMPLETED); @@ -5987,6 +5987,7 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList, pQueryMsg->window.skey = htobe64(pQueryMsg->window.skey); pQueryMsg->window.ekey = htobe64(pQueryMsg->window.ekey); + pQueryMsg->interval.tz = htobe64(pQueryMsg->interval.tz); pQueryMsg->interval.interval = htobe64(pQueryMsg->interval.interval); pQueryMsg->interval.sliding = htobe64(pQueryMsg->interval.sliding); pQueryMsg->interval.offset = htobe64(pQueryMsg->interval.offset); diff --git a/src/query/src/qFill.c b/src/query/src/qFill.c index 65b58467b7..a675e36e87 100644 --- a/src/query/src/qFill.c +++ b/src/query/src/qFill.c @@ -323,7 +323,7 @@ static int32_t taosNumOfRemainRows(SFillInfo* pFillInfo) { SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols, int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType, - SFillColInfo* pCol, void* handle) { + SFillColInfo* pCol, void* handle, int64_t tz) { if (fillType == TSDB_FILL_NONE) { return NULL; } @@ -345,6 +345,8 @@ SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_ pFillInfo->interval.sliding = slidingTime; pFillInfo->interval.slidingUnit = slidingUnit; + pFillInfo->interval.tz = tz; + pFillInfo->pData = malloc(POINTER_BYTES * numOfCols); if (numOfTags > 0) { pFillInfo->pTags = calloc(pFillInfo->numOfTags, sizeof(SFillTagColInfo)); -- GitLab