diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index 56f0b5099d8de845d4a8c1e1192383fbf8d9b199..059345128e54d252d3265ec51287359c5d7f10df 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -42,35 +42,35 @@ enum { static int32_t tscAllocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int32_t * numOfRows); static int32_t tscToInteger(SSQLToken *pToken, int64_t *value, char **endPtr) { - int32_t numType = isValidNumber(pToken); - if (TK_ILLEGAL == numType) { - return numType; - } +// int32_t numType = isValidNumber(pToken); +// if (TK_ILLEGAL == numType) { +// return numType; +// } int32_t radix = 10; - if (numType == TK_HEX) { + if (pToken->type == TK_HEX) { radix = 16; - } else if (numType == TK_OCT) { + } else if (pToken->type == TK_OCT) { radix = 8; - } else if (numType == TK_BIN) { + } else if (pToken->type == TK_BIN) { radix = 2; } errno = 0; *value = strtoll(pToken->z, endPtr, radix); - return numType; + return pToken->type; } static int32_t tscToDouble(SSQLToken *pToken, double *value, char **endPtr) { - int32_t numType = isValidNumber(pToken); - if (TK_ILLEGAL == numType) { - return numType; - } +// int32_t numType = isValidNumber(pToken); +// if (TK_ILLEGAL == numType) { +// return numType; +// } errno = 0; *value = strtod(pToken->z, endPtr); - return numType; + return pToken->type; } int tsParseTime(SSQLToken *pToken, int64_t *time, char **next, char *error, int16_t timePrec) { diff --git a/src/client/src/tscProfile.c b/src/client/src/tscProfile.c index 61fc1a19c8178459fb30d0cb7effe56db21c8e2b..74294d38e009a6b0c28991e00e032b7be3aba8ab 100644 --- a/src/client/src/tscProfile.c +++ b/src/client/src/tscProfile.c @@ -23,8 +23,6 @@ void tscSaveSlowQueryFp(void *handle, void *tmrId); void *tscSlowQueryConn = NULL; bool tscSlowQueryConnInitialized = false; -TAOS *taos_connect_a(char *ip, char *user, char *pass, char *db, uint16_t port, void (*fp)(void *, TAOS_RES *, int), - void *param, void **taos); void tscInitConnCb(void *param, TAOS_RES *result, int code) { char *sql = param; diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 8e83cb4d4a0b4130acb10916ed91704005b533c1..3e72d75a84adb40662eeb840375027a8334c494b 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -288,8 +288,14 @@ void updateNumOfResult(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOfRes) { for (int32_t j = 0; j < pQuery->numOfOutput; ++j) { SResultInfo *pResInfo = GET_RES_INFO(&pRuntimeEnv->pCtx[j]); - assert(pResInfo->numOfRes > numOfRes); + int16_t functionId = pRuntimeEnv->pCtx[j].functionId; + if (functionId == TSDB_FUNC_TS || functionId == TSDB_FUNC_TAG || functionId == TSDB_FUNC_TAGPRJ || + functionId == TSDB_FUNC_TS_DUMMY) { + continue; + } + + assert(pResInfo->numOfRes > numOfRes); pResInfo->numOfRes = numOfRes; } } @@ -1318,6 +1324,10 @@ static int32_t tableApplyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SDataBl if (numOfRes >= pQuery->rec.threshold) { setQueryStatus(pQuery, QUERY_RESBUF_FULL); } + + if (numOfRes >= pQuery->limit.limit + pQuery->limit.offset) { + setQueryStatus(pQuery, QUERY_COMPLETED); + } } return numOfRes; @@ -3197,7 +3207,7 @@ void skipResults(SQueryRuntimeEnv *pRuntimeEnv) { resetCtxOutputBuf(pRuntimeEnv); - // clear the buffer is full flag if exists + // clear the buffer full flag if exists CLEAR_QUERY_STATUS(pQuery, QUERY_RESBUF_FULL); } else { int64_t numOfSkip = pQuery->limit.offset; @@ -3211,14 +3221,15 @@ void skipResults(SQueryRuntimeEnv *pRuntimeEnv) { int32_t functionId = pQuery->pSelectExpr[i].base.functionId; int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes; - memmove(pQuery->sdata[i]->data, pQuery->sdata[i]->data + bytes * numOfSkip, pQuery->rec.rows * bytes); - pRuntimeEnv->pCtx[i].aOutputBuf = pQuery->sdata[i]->data + pQuery->rec.rows; + memmove(pQuery->sdata[i]->data, (char*) pQuery->sdata[i]->data + bytes * numOfSkip, pQuery->rec.rows * bytes); + pRuntimeEnv->pCtx[i].aOutputBuf = ((char*) pQuery->sdata[i]->data) + pQuery->rec.rows * bytes; if (functionId == TSDB_FUNC_DIFF || functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM) { pRuntimeEnv->pCtx[i].ptsOutputBuf = pRuntimeEnv->pCtx[0].aOutputBuf; } } + updateNumOfResult(pRuntimeEnv, pQuery->rec.rows); } } @@ -4649,10 +4660,8 @@ static void sequentialTableProcess(SQInfo *pQInfo) { copyFromWindowResToSData(pQInfo, pWindowResInfo->pResult); } - pQuery->rec.total += pQuery->rec.rows; - qTrace( - "QInfo %p, numOfTables:%d, index:%d, numOfGroups:%d, %d points returned, total:%"PRId64", offset:%" PRId64, + "QInfo %p numOfTables:%d, index:%d, numOfGroups:%d, %d points returned, total:%"PRId64", offset:%" PRId64, pQInfo, pQInfo->groupInfo.numOfTables, pQInfo->tableIndex, numOfGroups, pQuery->rec.rows, pQuery->rec.total, pQuery->limit.offset); } diff --git a/src/query/src/qtokenizer.c b/src/query/src/qtokenizer.c index fc8e712530464f5cac3536b0c5c8385d3f91d376..a42426621f0d0229492f5883ee6bec9392cd9475 100644 --- a/src/query/src/qtokenizer.c +++ b/src/query/src/qtokenizer.c @@ -282,11 +282,7 @@ int tSQLKeywordCode(const char* z, int n) { } SKeyword** pKey = (SKeyword**)taosHashGet(KeywordHashTable, key, n); - if (pKey != NULL) { - return (*pKey)->type; - } else { - return TK_ID; - } + return (pKey != NULL)? (*pKey)->type:TK_ID; } /* @@ -662,114 +658,4 @@ SSQLToken tStrGetToken(char* str, int32_t* i, bool isPrevOptr, uint32_t numOfIgn return t0; } -FORCE_INLINE bool isKeyWord(const char* z, int32_t len) { return (tSQLKeywordCode((char*)z, len) != TK_ID); } - -FORCE_INLINE bool isNumber(const SSQLToken* pToken) { - return (pToken->type == TK_INTEGER || pToken->type == TK_FLOAT || pToken->type == TK_HEX || pToken->type == TK_BIN); -} - -int32_t isValidNumber(const SSQLToken* pToken) { - const char* z = pToken->z; - int32_t type = TK_ILLEGAL; - - int32_t i = 0; - for(; i < pToken->n; ++i) { - switch (z[i]) { - case '+': - case '-': { - break; - } - case '.': { - /* - * handle the the float number with out integer part - * .123 - * .123e4 - */ - if (!isdigit(z[i+1])) { - return TK_ILLEGAL; - } - - for (i += 2; isdigit(z[i]); i++) { - } - - if ((z[i] == 'e' || z[i] == 'E') && - (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) { - i += 2; - while (isdigit(z[i])) { - i++; - } - } - - type = TK_FLOAT; - goto _end; - } - - case '0': { - char next = z[i + 1]; - if (next == 'b') { // bin number - type = TK_BIN; - for (i += 2; (z[i] == '0' || z[i] == '1'); ++i) { - } - - goto _end; - } else if (next == 'x') { //hex number - type = TK_HEX; - for (i += 2; isdigit(z[i]) || (z[i] >= 'a' && z[i] <= 'f') || (z[i] >= 'A' && z[i] <= 'F'); ++i) { - } - - goto _end; - } - } - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': { - type = TK_INTEGER; - for (; isdigit(z[i]); i++) { - } - - int32_t seg = 0; - while (z[i] == '.' && isdigit(z[i + 1])) { - i += 2; - - while (isdigit(z[i])) { - i++; - } - - seg++; - type = TK_FLOAT; - } - - if (seg > 1) { - return TK_ILLEGAL; - } - - if ((z[i] == 'e' || z[i] == 'E') && - (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) { - i += 2; - while (isdigit(z[i])) { - i++; - } - - type = TK_FLOAT; - } - - goto _end; - } - default: - return TK_ILLEGAL; - } - } - - _end: - if (i < pToken->n) { - return TK_ILLEGAL; - } else { - return type; - } -} \ No newline at end of file +bool isKeyWord(const char* z, int32_t len) { return (tSQLKeywordCode((char*)z, len) != TK_ID); } \ No newline at end of file diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index 9a7c7b88adde0a209b7c215520043dc239ea0edf..115a32567c734ff5182554ce8111a5eaa50e9f41 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -859,6 +859,7 @@ static void mergeDataInDataBlock(STsdbQueryHandle* pQueryHandle, STableCheckInfo } } + pos += (end - start + 1) * step; cur->blockCompleted = (((pos >= endPos || cur->lastKey > pQueryHandle->window.ekey) && ASCENDING_ORDER_TRAVERSE(pQueryHandle->order)) || ((pos <= endPos || cur->lastKey < pQueryHandle->window.ekey) && !ASCENDING_ORDER_TRAVERSE(pQueryHandle->order))); diff --git a/src/util/inc/tstoken.h b/src/util/inc/tstoken.h index 13190e800d91213b630d19832a8fcf8316a7786d..60a79f69afe8b7521e1869eea8ae0e96f4660487 100644 --- a/src/util/inc/tstoken.h +++ b/src/util/inc/tstoken.h @@ -21,6 +21,8 @@ extern "C" { #endif #include "os.h" +#include "tutil.h" +#include "ttokendef.h" #define TK_SPACE 200 #define TK_COMMENT 201 @@ -31,7 +33,7 @@ extern "C" { #define TK_FILE 206 #define TK_QUESTION 207 // denoting the placeholder of "?",when invoking statement bind query -#define TSQL_TBNAME "TBNAME" +#define TSQL_TBNAME "TBNAME" #define TSQL_TBNAME_L "tbname" // used to denote the minimum unite in sql parsing @@ -74,14 +76,117 @@ bool isKeyWord(const char *z, int32_t len); * @param pToken * @return */ -bool isNumber(const SSQLToken *pToken); +#define isNumber(tk) \ +((tk)->type == TK_INTEGER || (tk)->type == TK_FLOAT || (tk)->type == TK_HEX || (tk)->type == TK_BIN) + /** * check if it is a token or not * @param pToken - * @return token type, if it is not a number, TK_ILLEGAL will return + * @return token type, if it is not a number, TK_ILLEGAL will return */ -int32_t isValidNumber(const SSQLToken* pToken); +static FORCE_INLINE int32_t isValidNumber(const SSQLToken* pToken) { + const char* z = pToken->z; + int32_t type = TK_ILLEGAL; + + int32_t i = 0; + for(; i < pToken->n; ++i) { + switch (z[i]) { + case '+': + case '-': { + break; + } + + case '.': { + /* + * handle the the float number with out integer part + * .123 + * .123e4 + */ + if (!isdigit(z[i+1])) { + return TK_ILLEGAL; + } + + for (i += 2; isdigit(z[i]); i++) { + } + + if ((z[i] == 'e' || z[i] == 'E') && + (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) { + i += 2; + while (isdigit(z[i])) { + i++; + } + } + + type = TK_FLOAT; + goto _end; + } + + case '0': { + char next = z[i + 1]; + if (next == 'b') { // bin number + type = TK_BIN; + for (i += 2; (z[i] == '0' || z[i] == '1'); ++i) { + } + + goto _end; + } else if (next == 'x') { //hex number + type = TK_HEX; + for (i += 2; isdigit(z[i]) || (z[i] >= 'a' && z[i] <= 'f') || (z[i] >= 'A' && z[i] <= 'F'); ++i) { + } + + goto _end; + } + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + type = TK_INTEGER; + for (; isdigit(z[i]); i++) { + } + + int32_t seg = 0; + while (z[i] == '.' && isdigit(z[i + 1])) { + i += 2; + + while (isdigit(z[i])) { + i++; + } + + seg++; + type = TK_FLOAT; + } + + if (seg > 1) { + return TK_ILLEGAL; + } + + if ((z[i] == 'e' || z[i] == 'E') && + (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) { + i += 2; + while (isdigit(z[i])) { + i++; + } + + type = TK_FLOAT; + } + + goto _end; + } + default: + return TK_ILLEGAL; + } + } + + _end: + return (i < pToken->n)? TK_ILLEGAL:type; +} #ifdef __cplusplus } diff --git a/src/util/src/hash.c b/src/util/src/hash.c index 12f7b43b7900dab5b6d4e191e91f5db8f1f145cc..f19438159da0a46bf5e6fb7a8447aa40236de126 100644 --- a/src/util/src/hash.c +++ b/src/util/src/hash.c @@ -102,7 +102,32 @@ static void doUpdateHashTable(SHashObj *pHashObj, SHashNode *pNode); * @param hashVal hash value by hash function * @return */ -static SHashNode *doGetNodeFromHashTable(SHashObj *pHashObj, const void *key, uint32_t keyLen, uint32_t *hashVal); +FORCE_INLINE SHashNode *doGetNodeFromHashTable(SHashObj *pHashObj, const void *key, uint32_t keyLen, uint32_t *hashVal) { + uint32_t hash = (*pHashObj->hashFp)(key, keyLen); + + int32_t slot = HASH_INDEX(hash, pHashObj->capacity); + SHashEntry *pEntry = pHashObj->hashList[slot]; + + SHashNode *pNode = pEntry->next; + while (pNode) { + if ((pNode->keyLen == keyLen) && (memcmp(pNode->key, key, keyLen) == 0)) { + break; + } + + pNode = pNode->next; + } + + if (pNode) { + assert(HASH_INDEX(pNode->hashVal, pHashObj->capacity) == slot); + } + + // return the calculated hash value, to avoid calculating it again in other functions + if (hashVal != NULL) { + *hashVal = hash; + } + + return pNode; +} /** * Resize the hash list if the threshold is reached @@ -438,33 +463,6 @@ void doUpdateHashTable(SHashObj *pHashObj, SHashNode *pNode) { } } -SHashNode *doGetNodeFromHashTable(SHashObj *pHashObj, const void *key, uint32_t keyLen, uint32_t *hashVal) { - uint32_t hash = (*pHashObj->hashFp)(key, keyLen); - - int32_t slot = HASH_INDEX(hash, pHashObj->capacity); - SHashEntry *pEntry = pHashObj->hashList[slot]; - - SHashNode *pNode = pEntry->next; - while (pNode) { - if ((pNode->keyLen == keyLen) && (memcmp(pNode->key, key, keyLen) == 0)) { - break; - } - - pNode = pNode->next; - } - - if (pNode) { - assert(HASH_INDEX(pNode->hashVal, pHashObj->capacity) == slot); - } - - // return the calculated hash value, to avoid calculating it again in other functions - if (hashVal != NULL) { - *hashVal = hash; - } - - return pNode; -} - void taosHashTableResize(SHashObj *pHashObj) { if (pHashObj->size < pHashObj->capacity * HASH_DEFAULT_LOAD_FACTOR) { return; diff --git a/src/util/src/thashutil.c b/src/util/src/thashutil.c index f4b4e9faa262c8f5968cb546138feacce4895c38..33f0d6d4302e0a8744bb0bc80e4d231445315cc4 100644 --- a/src/util/src/thashutil.c +++ b/src/util/src/thashutil.c @@ -10,7 +10,7 @@ #include "hashfunc.h" #include "tutil.h" -#define ROTL32(x, r) ((x) << (r) | (x) >> (32 - (r))) +#define ROTL32(x, r) ((x) << (r) | (x) >> (32u - (r))) #define FMIX32(h) \ do { \ @@ -20,12 +20,12 @@ (h) *= 0xc2b2ae35; \ (h) ^= (h) >> 16; \ } while (0) - -static void MurmurHash3_32_s(const void *key, int len, uint32_t seed, void *out) { + +uint32_t MurmurHash3_32(const char *key, uint32_t len) { const uint8_t *data = (const uint8_t *)key; - const int nblocks = len / 4; + const int nblocks = len >> 2u; - uint32_t h1 = seed; + uint32_t h1 = 0x12345678; const uint32_t c1 = 0xcc9e2d51; const uint32_t c2 = 0x1b873593; @@ -36,11 +36,11 @@ static void MurmurHash3_32_s(const void *key, int len, uint32_t seed, void *out) uint32_t k1 = blocks[i]; k1 *= c1; - k1 = ROTL32(k1, 15); + k1 = ROTL32(k1, 15u); k1 *= c2; h1 ^= k1; - h1 = ROTL32(h1, 13); + h1 = ROTL32(h1, 13u); h1 = h1 * 5 + 0xe6546b64; } @@ -48,7 +48,7 @@ static void MurmurHash3_32_s(const void *key, int len, uint32_t seed, void *out) uint32_t k1 = 0; - switch (len & 3) { + switch (len & 3u) { case 3: k1 ^= tail[2] << 16; case 2: @@ -56,7 +56,7 @@ static void MurmurHash3_32_s(const void *key, int len, uint32_t seed, void *out) case 1: k1 ^= tail[0]; k1 *= c1; - k1 = ROTL32(k1, 15); + k1 = ROTL32(k1, 15u); k1 *= c2; h1 ^= k1; }; @@ -65,16 +65,7 @@ static void MurmurHash3_32_s(const void *key, int len, uint32_t seed, void *out) FMIX32(h1); - *(uint32_t *)out = h1; -} - -uint32_t MurmurHash3_32(const char *key, uint32_t len) { - const int32_t hashSeed = 0x12345678; - - uint32_t val = 0; - MurmurHash3_32_s(key, len, hashSeed, &val); - - return val; + return h1; } uint32_t taosIntHash_32(const char *key, uint32_t UNUSED_PARAM(len)) { return *(uint32_t *)key; }