diff --git a/src/client/src/tscLocalMerge.c b/src/client/src/tscLocalMerge.c index 6280cc520a9adf7b2d8686455b1524a8b356af83..8b151a76184255bdce318e18d534928ba1d4b24c 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 64268124da93b30de4109ac5134eb87c759725d2..4b74123f4510d19afd8314960e31a43cb6e79c5c 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 537e81413fdd74f54d74c1bb887f28498b0b7379..631524d198f34ba541baa85ff83f1cccd27e0b5a 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 2622246111894caf39f3c1c37923d1a7207935b6..3ef37039b2e351ef92c18154f1d3e4205936b85c 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 b20ccadadb22a04733d97bd19b919660ee677d0d..4626969921b3adc60f1b0f9812f042c989e5d2df 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 1710c469fb48506f21d914ac586fa8356f044619..c19caa4dcc0b5cbf7757b97d09ef5ce6d0afe337 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 93537ec3da582859ff752faf5521f39985b5728e..bc46a8ec450e52cfcd8d6c0379c81353ce2d0c85 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 110b0d198c1a8cfbed8080aa9df5687b7a79baea..44337e0866b5eecd423f99d9f5bfd2f65167578f 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 65b58467b7e65e20f0de030a5c9bed52543193e5..a675e36e8717af0c416f695546b341e6a1d64573 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));