diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index 18926a84b9b7f185ebdc7935220eac486032d36e..327aac22d159875ba644890e4a0fd41e1998ecdf 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -142,7 +142,7 @@ int tsParseTime(SStrToken *pToken, int64_t *time, char **next, char *error, int1 return tscInvalidSQLErrMsg(error, "value expected in timestamp", sToken.z); } - if (getTimestampInUsFromStr(valueToken.z, valueToken.n, &interval) != TSDB_CODE_SUCCESS) { + if (parseAbsoluteDuration(valueToken.z, valueToken.n, &interval) != TSDB_CODE_SUCCESS) { return TSDB_CODE_TSC_INVALID_SQL; } diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 7ed2e7dbde42a2c0907f96098a39751005e987f3..ceb527196233cc351e474fde12c11cb2800c8b60 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -596,7 +596,7 @@ int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQ // interval is not null SStrToken* t = &pQuerySql->interval; - if (parseDuration(t->z, t->n, &pQueryInfo->interval.interval, &pQueryInfo->interval.intervalUnit) != TSDB_CODE_SUCCESS) { + if (parseNatualDuration(t->z, t->n, &pQueryInfo->interval.interval, &pQueryInfo->interval.intervalUnit) != TSDB_CODE_SUCCESS) { return TSDB_CODE_TSC_INVALID_SQL; } @@ -693,7 +693,7 @@ int32_t parseOffsetClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQue return TSDB_CODE_SUCCESS; } - if (parseDuration(t->z, t->n, &pQueryInfo->interval.offset, &pQueryInfo->interval.offsetUnit) != TSDB_CODE_SUCCESS) { + if (parseNatualDuration(t->z, t->n, &pQueryInfo->interval.offset, &pQueryInfo->interval.offsetUnit) != TSDB_CODE_SUCCESS) { return TSDB_CODE_TSC_INVALID_SQL; } @@ -751,7 +751,7 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQu return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3); } - getTimestampInUsFromStr(pSliding->z, pSliding->n, &pQueryInfo->interval.sliding); + parseAbsoluteDuration(pSliding->z, pSliding->n, &pQueryInfo->interval.sliding); if (tinfo.precision == TSDB_TIME_PRECISION_MILLI) { pQueryInfo->interval.sliding /= 1000; } diff --git a/src/os/inc/osTime.h b/src/os/inc/osTime.h index 2bc24caa14bc2b9c2022c37099af658cb0728255..99f7586f721acbc64b1c9e3e70bf2e33a6092fc8 100644 --- a/src/os/inc/osTime.h +++ b/src/os/inc/osTime.h @@ -30,8 +30,6 @@ extern "C" { #define MILLISECOND_PER_HOUR (MILLISECOND_PER_MINUTE * 60) #define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24) #define MILLISECOND_PER_WEEK (MILLISECOND_PER_DAY * 7) -#define MILLISECOND_PER_MONTH (MILLISECOND_PER_DAY * 30) -#define MILLISECOND_PER_YEAR (MILLISECOND_PER_DAY * 365) //@return timestamp in second int32_t taosGetTimestampSec(); @@ -77,8 +75,8 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision); int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precision); int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision); -int32_t getTimestampInUsFromStr(char* token, int32_t tokenlen, int64_t* ts); -int32_t parseDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit); +int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* ts); +int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit); int32_t taosParseTime(char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t dayligth); void deltaToUtcInitOnce(); diff --git a/src/os/src/detail/osTime.c b/src/os/src/detail/osTime.c index 5e6922cd512ed78e7e26de4941f55caf2516dee6..012c1073716fec92455453039be9b6213706e1c3 100644 --- a/src/os/src/detail/osTime.c +++ b/src/os/src/detail/osTime.c @@ -321,7 +321,7 @@ int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec) { } -static int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t* result) { +static int32_t getDurationInUs(int64_t val, char unit, int64_t* result) { *result = val; int64_t factor = 1000L; @@ -342,19 +342,12 @@ static int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t* resu case 'w': (*result) *= MILLISECOND_PER_WEEK*factor; break; - case 'n': - (*result) *= MILLISECOND_PER_MONTH*factor; - break; - case 'y': - (*result) *= MILLISECOND_PER_YEAR*factor; - break; case 'a': (*result) *= factor; break; case 'u': break; default: { - ; return -1; } } @@ -373,7 +366,7 @@ static int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t* resu * n - Months (30 days) * y - Years (365 days) */ -int32_t getTimestampInUsFromStr(char* token, int32_t tokenlen, int64_t* ts) { +int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* duration) { errno = 0; char* endPtr = NULL; @@ -383,10 +376,16 @@ int32_t getTimestampInUsFromStr(char* token, int32_t tokenlen, int64_t* ts) { return -1; } - return getTimestampInUsFromStrImpl(timestamp, token[tokenlen - 1], ts); + /* natual month/year are not allowed in absolute duration */ + char unit = token[tokenlen - 1]; + if (unit == 'n' || unit == 'y') { + return -1; + } + + return getDurationInUs(timestamp, unit, duration); } -int32_t parseDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit) { +int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit) { errno = 0; /* get the basic numeric value */ @@ -400,7 +399,7 @@ int32_t parseDuration(const char* token, int32_t tokenLen, int64_t* duration, ch return 0; } - return getTimestampInUsFromStrImpl(*duration, *unit, duration); + return getDurationInUs(*duration, *unit, duration); } int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) { diff --git a/src/query/src/qParserImpl.c b/src/query/src/qParserImpl.c index f8c60c9e18b4597a857b5935a168be416c01f880..33237a58c2096f7c87b890863723318fe487ff32 100644 --- a/src/query/src/qParserImpl.c +++ b/src/query/src/qParserImpl.c @@ -135,7 +135,7 @@ tSQLExpr *tSQLExprIdValueCreate(SStrToken *pToken, int32_t optrType) { pSQLExpr->val.nType = TSDB_DATA_TYPE_BIGINT; pSQLExpr->nSQLOptr = TK_TIMESTAMP; // TK_TIMESTAMP used to denote the time value is in microsecond } else if (optrType == TK_VARIABLE) { - int32_t ret = getTimestampInUsFromStr(pToken->z, pToken->n, &pSQLExpr->val.i64Key); + int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSQLExpr->val.i64Key); UNUSED(ret); pSQLExpr->val.nType = TSDB_DATA_TYPE_BIGINT; @@ -443,44 +443,6 @@ void setDBName(SStrToken *pCpxName, SStrToken *pDB) { pCpxName->n = pDB->n; } -int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t *result) { - *result = val; - - switch (unit) { - case 's': - (*result) *= MILLISECOND_PER_SECOND; - break; - case 'm': - (*result) *= MILLISECOND_PER_MINUTE; - break; - case 'h': - (*result) *= MILLISECOND_PER_HOUR; - break; - case 'd': - (*result) *= MILLISECOND_PER_DAY; - break; - case 'w': - (*result) *= MILLISECOND_PER_WEEK; - break; - case 'n': - (*result) *= MILLISECOND_PER_MONTH; - break; - case 'y': - (*result) *= MILLISECOND_PER_YEAR; - break; - case 'a': - break; - default: { - ; - return -1; - } - } - - /* get the value in microsecond */ - (*result) *= 1000L; - return 0; -} - void tSQLSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType) { int32_t maxLen = sizeof(pField->name) / sizeof(pField->name[0]);