diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index 69bc4a3e20049aaa520df99393dcb17a80950ab4..4020d201ce4fcb84cf9e27857bfc07e204b4f203 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -46,18 +46,20 @@ static int32_t tscToInteger(SSQLToken *pToken, int64_t *value, char **endPtr) { return TK_ILLEGAL; } - int32_t radix = 10; - - int32_t radixList[3] = {16, 8, 2}; // the integer number with different radix: hex, oct, bin - if (pToken->type == TK_HEX || pToken->type == TK_OCT || pToken->type == TK_BIN) { - radix = radixList[pToken->type - TK_HEX]; - } - errno = 0; - *value = strtoll(pToken->z, endPtr, radix); + *value = strtoll(pToken->z, endPtr, 0); + if (**endPtr == 'e' || **endPtr == 'E' || **endPtr == '.') { + errno = 0; + double v = round(strtod(pToken->z, endPtr)); + if (v > INT64_MAX || v <= INT64_MIN) { + errno = ERANGE; + } else { + *value = v; + } + } // not a valid integer number, return error - if ((pToken->type == TK_STRING || pToken->type == TK_ID) && ((*endPtr - pToken->z) != pToken->n)) { + if (*endPtr - pToken->z != pToken->n) { return TK_ILLEGAL; } @@ -73,11 +75,11 @@ static int32_t tscToDouble(SSQLToken *pToken, double *value, char **endPtr) { *value = strtod(pToken->z, endPtr); // not a valid integer number, return error - if ((pToken->type == TK_STRING || pToken->type == TK_ID) && ((*endPtr - pToken->z) != pToken->n)) { + if ((*endPtr - pToken->z) != pToken->n) { return TK_ILLEGAL; - } else { - return pToken->type; } + + return pToken->type; } int tsParseTime(SSQLToken *pToken, int64_t *time, char **next, char *error, int16_t timePrec) { diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c index ac334e8ed1be576057ee11b8ae8bb65b5080759e..92a5895f21123ff41d2037a91f3f39f5957d8d42 100644 --- a/src/tsdb/src/tsdbMain.c +++ b/src/tsdb/src/tsdbMain.c @@ -213,10 +213,10 @@ uint32_t tsdbGetFileInfo(TSDB_REPO_T *repo, char *name, uint32_t *index, uint32_ SFileGroup *pFGroup = taosbsearch(&fid, pFileH->pFGroup, pFileH->nFGroups, sizeof(SFileGroup), keyFGroupCompFunc, TD_GE); if (pFGroup->fileId == fid) { - strcpy(fname, pFGroup->files[(*index) % 3].fname); + fname = strdup(pFGroup->files[(*index) % 3].fname); } else { if (pFGroup->fileId * 3 + 2 < eindex) { - strcpy(fname, pFGroup->files[0].fname); + fname = strdup(pFGroup->files[0].fname); *index = pFGroup->fileId * 3; } else { tfree(sdup); diff --git a/src/tsdb/src/tsdbMemTable.c b/src/tsdb/src/tsdbMemTable.c index b1de90bc291cc909b51154b3f54e0d59a0278005..7a360c25f9ed75e6858531473c67875f3bc7ec6f 100644 --- a/src/tsdb/src/tsdbMemTable.c +++ b/src/tsdb/src/tsdbMemTable.c @@ -99,6 +99,7 @@ int tsdbInsertRowToMem(STsdbRepo *pRepo, SDataRow row, STable *pTable) { if (tSkipListPut(pTableData->pData, pNode) == NULL) { tsdbFreeBytes(pRepo, (void *)pNode, bytes); } else { + if (TABLE_LASTKEY(pTable) < key) TABLE_LASTKEY(pTable) = key; if (pMemTable->keyFirst > key) pMemTable->keyFirst = key; if (pMemTable->keyLast < key) pMemTable->keyLast = key; pMemTable->numOfRows++;