From 45cd731d7bf1513d4c3bc5d8c69e2f68e7f905dd Mon Sep 17 00:00:00 2001 From: wpan Date: Wed, 30 Jun 2021 13:16:08 +0800 Subject: [PATCH] support range merge --- src/client/src/tscSQLParser.c | 57 +- src/common/src/ttypes.c | 62 +++ src/query/inc/qFilter.h | 37 ++ src/query/src/qFilter.c | 195 ++++++- src/query/tests/CMakeLists.txt | 13 +- src/query/tests/astTest.cpp | 635 ---------------------- src/query/tests/histogramTest.cpp | 142 ----- src/query/tests/patternMatchTest.cpp | 86 --- src/query/tests/percentileTest.cpp | 257 --------- src/query/tests/rangeMergeTest.cpp | 163 ++++++ src/query/tests/resultBufferTest.cpp | 163 ------ src/query/tests/tsBufTest.cpp | 515 ------------------ tests/script/general/parser/condition.sim | 170 +++++- tests/script/test.sh | 1 + 14 files changed, 669 insertions(+), 1827 deletions(-) delete mode 100644 src/query/tests/astTest.cpp delete mode 100644 src/query/tests/histogramTest.cpp delete mode 100644 src/query/tests/patternMatchTest.cpp delete mode 100644 src/query/tests/percentileTest.cpp create mode 100644 src/query/tests/rangeMergeTest.cpp delete mode 100644 src/query/tests/resultBufferTest.cpp delete mode 100644 src/query/tests/tsBufTest.cpp diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 830bfa3993..dc441dd280 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -3494,9 +3494,10 @@ enum { TSQL_EXPR_TAG = 2, TSQL_EXPR_COLUMN = 4, TSQL_EXPR_TBNAME = 8, + TSQL_EXPR_JOIN = 16, }; -#define GET_MIXED_TYPE(t) ((t) > TSQL_EXPR_COLUMN || (t) == (TSQL_EXPR_TS|TSQL_EXPR_TAG)) +#define GET_MIXED_TYPE(t) (((t) >= TSQL_EXPR_JOIN) || ((t) > TSQL_EXPR_COLUMN && (t) < TSQL_EXPR_TBNAME) || ((t) == (TSQL_EXPR_TS|TSQL_EXPR_TAG))) static int32_t checkColumnFilterInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SColumnIndex* pIndex, tSqlExpr* pExpr, int32_t sqlOptr) { STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, pIndex->tableIndex); @@ -4216,12 +4217,17 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql * since this expression is used to set the join query type */ tSqlExprDestroy(*pExpr); + if (type) { + *type |= TSQL_EXPR_JOIN; + } } else { ret = setNormalExprToCond(tsExpr, *pExpr, parentOptr); + if (type) { + *type |= TSQL_EXPR_TS; + } } *pExpr = NULL; // remove this expression - *type |= TSQL_EXPR_TS; } else if (index.columnIndex >= tscGetNumOfColumns(pTableMeta) || index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { // query on tags, check for tag query condition if (UTIL_TABLE_IS_NORMAL_TABLE(pTableMetaInfo)) { @@ -4246,7 +4252,9 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg6); } - *type |= TSQL_EXPR_TAG; + if (type) { + *type |= TSQL_EXPR_TAG; + } *pExpr = NULL; } else { if (pRight != NULL && pRight->tokenId == TK_ID) { // join on tag columns for stable query @@ -4257,18 +4265,23 @@ static int32_t handleExprInQueryCond(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSql pQueryInfo->type |= TSDB_QUERY_TYPE_JOIN_QUERY; ret = setExprToCond(&pCondExpr->pJoinExpr, *pExpr, NULL, parentOptr, pQueryInfo->msg); *pExpr = NULL; + if (type) { + *type |= TSQL_EXPR_JOIN; + } } else { // do nothing // ret = setExprToCond(pCmd, &pCondExpr->pTagCond, // *pExpr, NULL, parentOptr); + if (type) { + *type |= TSQL_EXPR_TAG; + } } - - *type |= TSQL_EXPR_TAG; } - } else { // query on other columns - *type |= TSQL_EXPR_COLUMN; - + if (type) { + *type |= TSQL_EXPR_COLUMN; + } + if (pRight->tokenId == TK_ID) { // other column cannot be served as the join column return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg5); } @@ -4293,7 +4306,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr** pExpr int32_t ret = 0; - const char* msg1 = "query condition between columns and tags and timestamp must use 'AND'"; + const char* msg1 = "query condition between columns/tags/timestamp/join fields must use 'AND'"; const char* msg2 = "query condition between tables must use 'AND'"; if ((*pExpr)->flags & (1 << EXPR_FLAG_TS_ERROR)) { @@ -4313,12 +4326,12 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr** pExpr int32_t rightTbIdx = 0; if (!tSqlExprIsParentOfLeaf(*pExpr)) { - ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pLeft, pCondExpr, &leftType, &leftTbIdx, (*pExpr)->tokenId, &columnLeft, &tsLeft); + ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pLeft, pCondExpr, type ? &leftType : NULL, &leftTbIdx, (*pExpr)->tokenId, &columnLeft, &tsLeft); if (ret != TSDB_CODE_SUCCESS) { goto err_ret; } - ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pRight, pCondExpr, &rightType, &rightTbIdx, (*pExpr)->tokenId, &columnRight, &tsRight); + ret = getQueryCondExpr(pCmd, pQueryInfo, &(*pExpr)->pRight, pCondExpr, type ? &rightType : NULL, &rightTbIdx, (*pExpr)->tokenId, &columnRight, &tsRight); if (ret != TSDB_CODE_SUCCESS) { goto err_ret; } @@ -4327,7 +4340,7 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr** pExpr * if left child and right child do not belong to the same group, the sub * expression is not valid for parent node, it must be TK_AND operator. */ - if (((leftType != rightType) || GET_MIXED_TYPE(leftType)) && ((*pExpr)->tokenId == TK_OR)) { + if (type != NULL && ((leftType != rightType) || GET_MIXED_TYPE(leftType)) && ((*pExpr)->tokenId == TK_OR)) { ret = invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); goto err_ret; } @@ -4353,7 +4366,9 @@ int32_t getQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSqlExpr** pExpr *tsExpr = tsLeft ? tsLeft : tsRight; } - *type = leftType|rightType; + if (type) { + *type = leftType|rightType; + } *tbIdx = (leftTbIdx == rightTbIdx) ? leftTbIdx : -1; return TSDB_CODE_SUCCESS; @@ -4956,10 +4971,24 @@ int32_t validateWhereNode(SQueryInfo* pQueryInfo, tSqlExpr** pExpr, SSqlObj* pSq int32_t type = 0; int32_t tbIdx = 0; - if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, &type, &tbIdx, (*pExpr)->tokenId, &condExpr.pColumnCond, &condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) { + int32_t *etype = &type; + +#if 0 + //DISABLE PARENT CONDITION GROUP TYPE CHECK + if (taosArrayGetSize(pQueryInfo->pUpstream) > 0) { + etype = NULL; + } +#endif + + if ((ret = getQueryCondExpr(&pSql->cmd, pQueryInfo, pExpr, &condExpr, etype, &tbIdx, (*pExpr)->tokenId, &condExpr.pColumnCond, &condExpr.pTimewindow)) != TSDB_CODE_SUCCESS) { return ret; } + if (taosArrayGetSize(pQueryInfo->pUpstream) > 0 && condExpr.pTimewindow != NULL) { + setNormalExprToCond(&condExpr.pColumnCond, condExpr.pTimewindow, TK_AND); + condExpr.pTimewindow = NULL; + } + tSqlExprCompact(pExpr); // after expression compact, the expression tree is only include tag query condition diff --git a/src/common/src/ttypes.c b/src/common/src/ttypes.c index 34dda32401..ffbdbd1bbe 100644 --- a/src/common/src/ttypes.c +++ b/src/common/src/ttypes.c @@ -560,6 +560,68 @@ void assignVal(char *val, const char *src, int32_t len, int32_t type) { } } +int8_t getInt8Val(void *s) { + return (int8_t)GET_INT8_VAL(s); +} +uint8_t getUint8Val(void *s) { + return (uint8_t)GET_INT8_VAL(s); +} +int16_t getInt16Val(void *s) { + return (int16_t)GET_INT16_VAL(s); +} +uint16_t getUint16Val(void *s) { + return (uint16_t)GET_INT16_VAL(s); +} +int32_t getInt32Val(void *s) { + return (int32_t)GET_INT32_VAL(s); +} +uint32_t getUint32Val(void *s) { + return (uint32_t)GET_INT32_VAL(s); +} +int64_t getInt64Val(void *s) { + return (int64_t)GET_INT64_VAL(s); +} +uint64_t getUint64Val(void *s) { + return (uint64_t)GET_INT64_VAL(s); +} +float getFloatVal(void *s) { + return GET_FLOAT_VAL(s); +} +double getDoubleVal(void *s) { + return GET_DOUBLE_VAL(s); +} +void setInt8Val(void *d, void *s) { + *((int8_t *)d) = (int8_t)GET_INT8_VAL(s); +} +void setUint8Val(void *d, void *s) { + *((uint8_t *)d) = GET_INT8_VAL(s); +} +void setInt16Val(void *d, void *s) { + *((int16_t *)d) = (int16_t)GET_INT16_VAL(s); +} +void setUint16Val(void *d, void *s) { + *((uint16_t *)d) = GET_INT16_VAL(s); +} +void setInt32Val(void *d, void *s) { + *((int32_t *)d) = GET_INT32_VAL(s); +} +void setUint32Val(void *d, void *s) { + *((uint32_t *)d) = GET_INT32_VAL(s); +} +void setInt64Val(void *d, void *s) { + *((int64_t *)d) = GET_INT64_VAL(s); +} +void setUint64Val(void *d, void *s) { + *((uint64_t *)d) = GET_INT64_VAL(s); +} +void setFloatVal(void *d, void *s) { + SET_FLOAT_VAL(d, GET_FLOAT_VAL(s)); +} +void setDoubleVal(void *d, void *s) { + SET_DOUBLE_VAL(d, GET_DOUBLE_VAL(s)); +} + + void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size, void* buf) { switch (type) { case TSDB_DATA_TYPE_INT: diff --git a/src/query/inc/qFilter.h b/src/query/inc/qFilter.h index 5fd25e40a9..afa8423244 100644 --- a/src/query/inc/qFilter.h +++ b/src/query/inc/qFilter.h @@ -32,11 +32,34 @@ enum { F_FIELD_MAX }; +enum { + MR_ST_START = 1, + MR_ST_FIN = 2, +}; + +enum { + MR_OPT_TS = 1, +}; + typedef struct OptrStr { uint16_t optr; char *str; } OptrStr; +typedef struct SFilterRange { + struct SFilterRange* prev; + struct SFilterRange* next; + int64_t s; + int64_t e; +} SFilterRange; + +typedef struct SFilterRMCtx { + int32_t type; + int32_t options; + int8_t status; + __compar_fn_t pCompareFunc; + SFilterRange *rs; +} SFilterRMCtx ; typedef struct SFilterField { uint16_t type; @@ -83,6 +106,15 @@ typedef struct SFilterInfo { uint8_t *unitFlags; // got result } SFilterInfo; +#define MR_GET_FLAG(st, f) (st & f) +#define MR_SET_FLAG(st, f) st |= (f) + +#define GEN_RANGE(r, t, s, e) do { r = calloc(1, sizeof(SFilterRange)); assignVal((char*)&(r)->s, s, 0, t); assignVal((char*)&(r)->e, e, 0, t); } while (0) +#define FREE_RANGE(rs, r) do { if (r->prev) { r->prev->next = r->next; } else { rs = r->next;} if (r->next) { r->next->prev = r->prev; } free(r); } while (0) +#define FREE_FROM_RANGE(rs, r) do { if (r->prev) { r->prev->next = NULL; } else { rs = NULL;} while (r) {SFilterRange *n = r->next; free(r); r = n; } } while (0) +#define INSERT_RANGE(rs, r, t, s, e) do { SFilterRange *n = calloc(1, sizeof(SFilterRange)); assignVal((char*)&n->s, s, 0, t); assignVal((char*)&n->e, e, 0, t); n->prev = r->prev; r->prev = n; if (r->prev) { r->prev->next = n; } else { rs->next = n; } n->next = r; } while (0) +#define APPEND_RANGE(r, t, s, e) do { SFilterRange *n = calloc(1, sizeof(SFilterRange)); assignVal((char*)&n->s, s, 0, t); assignVal((char*)&n->e, e, 0, t); n->prev = r; r->next = n; } while (0) + #define ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { return _code; } } while (0) #define ERR_LRET(c,...) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { qError(__VA_ARGS__); return _code; } } while (0) #define ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { goto _err_return; } } while (0) @@ -112,6 +144,11 @@ typedef int32_t(*filter_desc_compare_func)(const void *, const void *); extern int32_t filterInitFromTree(tExprNode* tree, SFilterInfo **pinfo); extern bool filterExecute(SFilterInfo *info, int32_t numOfRows, int8_t* p); extern int32_t filterSetColFieldData(SFilterInfo *info, int16_t colId, void *data); +extern void* filterInitMergeRange(int32_t type, int32_t options); +extern int32_t filterAddMergeRange(void* h, void* s, void* e, int32_t optr); +extern int32_t filterGetMergeRangeNum(void* h, int32_t* num); +extern int32_t filterGetMergeRangeRes(void* h, void *s, void* e); +extern int32_t filterFreeMergeRange(void* h); #ifdef __cplusplus } diff --git a/src/query/src/qFilter.c b/src/query/src/qFilter.c index c2d7646636..06f85d4af1 100644 --- a/src/query/src/qFilter.c +++ b/src/query/src/qFilter.c @@ -54,6 +54,199 @@ filter_desc_compare_func gDescCompare [F_FIELD_MAX] = { filterFieldValDescCompare }; +void* filterInitMergeRange(int32_t type, int32_t options) { + if (type > TSDB_DATA_TYPE_UBIGINT || type < TSDB_DATA_TYPE_BOOL || type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) { + qError("not supported range type:%d", type); + return NULL; + } + + SFilterRMCtx *ctx = calloc(1, sizeof(SFilterRMCtx)); + + ctx->type = type; + ctx->pCompareFunc = getComparFunc(type, 0); + + return ctx; +} + +int32_t filterAddMergeRange(void* h, void* s, void* e, int32_t optr) { + SFilterRMCtx *ctx = (SFilterRMCtx *)h; + + if (ctx->rs == NULL) { + if (MR_GET_FLAG(ctx->status, MR_ST_START) == 0 || optr == TSDB_RELATION_OR) { + GEN_RANGE(ctx->rs, ctx->type, s, e); + MR_SET_FLAG(ctx->status, MR_ST_START); + } + + return TSDB_CODE_SUCCESS; + } + + SFilterRange *r = ctx->rs; + SFilterRange *rn = NULL; + + if (optr == TSDB_RELATION_AND) { + while (r != NULL) { + if (ctx->pCompareFunc(&r->s, e) > 0) { + FREE_FROM_RANGE(ctx->rs, r); + break; + } + + if (ctx->pCompareFunc(s, &r->e) > 0) { + rn = r->next; + FREE_RANGE(ctx->rs, r); + r = rn; + continue; + } + + if (ctx->pCompareFunc(s, &r->s) > 0) { + assignVal((char *)&r->s, s, 0, ctx->type); + } + + if (ctx->pCompareFunc(&r->e, e) > 0) { + assignVal((char *)&r->e, e, 0, ctx->type); + break; + } + + r = r->next; + } + + return TSDB_CODE_SUCCESS; + } + + + //TSDB_RELATION_OR + bool smerged = false; + bool emerged = false; + + while (r != NULL) { + if (ctx->pCompareFunc(&r->s, e) > 0) { + if (emerged == false) { + INSERT_RANGE(ctx->rs, r, ctx->type, s, e); + } + + break; + } + + if (ctx->pCompareFunc(s, &r->e) > 0) { + if (r->next) { + r= r->next; + continue; + } + + APPEND_RANGE(r, ctx->type, s, e); + break; + } + + if (smerged == false) { + if (ctx->pCompareFunc(&r->s, s) > 0) { + assignVal((char *)&r->s, s, 0, ctx->type); + } + + smerged = true; + } + + if (emerged == false) { + if (ctx->pCompareFunc(e, &r->e) > 0) { + assignVal((char *)&r->e, e, 0, ctx->type); + emerged = true; + e = &r->e; + r = r->next; + continue; + } + + break; + } + + if (ctx->pCompareFunc(e, &r->e) > 0) { + rn = r->next; + FREE_RANGE(ctx->rs, r); + r = rn; + + continue; + } else { + assignVal(e, (char *)&r->e, 0, ctx->type); + FREE_RANGE(ctx->rs, r); + + break; + } + } + + return TSDB_CODE_SUCCESS; +} + +int32_t filterFinMergeRange(void* h) { + SFilterRMCtx *ctx = (SFilterRMCtx *)h; + + if (MR_GET_FLAG(ctx->status, MR_ST_FIN)) { + return TSDB_CODE_SUCCESS; + } + + if (MR_GET_FLAG(ctx->options, MR_OPT_TS)) { + + } + + MR_SET_FLAG(ctx->status, MR_ST_FIN); + + return TSDB_CODE_SUCCESS; +} + +int32_t filterGetMergeRangeNum(void* h, int32_t* num) { + filterFinMergeRange(h); + + SFilterRMCtx *ctx = (SFilterRMCtx *)h; + + *num = 0; + + SFilterRange *r = ctx->rs; + + while (r) { + ++(*num); + r = r->next; + } + + return TSDB_CODE_SUCCESS; +} + + +int32_t filterGetMergeRangeRes(void* h, void *s, void* e) { + filterFinMergeRange(h); + + SFilterRMCtx *ctx = (SFilterRMCtx *)h; + uint32_t num = 0; + SFilterRange* r = ctx->rs; + + while (r) { + assignVal(s + num * tDataTypes[ctx->type].bytes, (char *)&r->s, 0, ctx->type); + assignVal(e + num * tDataTypes[ctx->type].bytes, (char *)&r->e, 0, ctx->type); + + ++num; + r = r->next; + } + + if (num == 0) { + qError("no range result"); + return TSDB_CODE_QRY_APP_ERROR; + } + + return TSDB_CODE_SUCCESS; +} + +int32_t filterFreeMergeRange(void* h) { + SFilterRMCtx *ctx = (SFilterRMCtx *)h; + SFilterRange *r = ctx->rs; + SFilterRange *rn = NULL; + + while (r) { + rn = r->next; + free(r); + r = rn; + } + + free(ctx); + + return TSDB_CODE_SUCCESS; +} + + int32_t filterMergeGroup(SFilterGroup *gp1, SFilterGroup *gp2, SArray* group) { SFilterGroup gp = {0}; @@ -505,5 +698,3 @@ _err_return: } - - diff --git a/src/query/tests/CMakeLists.txt b/src/query/tests/CMakeLists.txt index 0cfe2ff165..475ade5c2f 100644 --- a/src/query/tests/CMakeLists.txt +++ b/src/query/tests/CMakeLists.txt @@ -20,9 +20,10 @@ IF (HEADER_GTEST_INCLUDE_DIR AND LIB_GTEST_STATIC_DIR) TARGET_LINK_LIBRARIES(queryTest taos query gtest pthread) ENDIF() -SET_SOURCE_FILES_PROPERTIES(./astTest.cpp PROPERTIES COMPILE_FLAGS -w) -SET_SOURCE_FILES_PROPERTIES(./histogramTest.cpp PROPERTIES COMPILE_FLAGS -w) -SET_SOURCE_FILES_PROPERTIES(./percentileTest.cpp PROPERTIES COMPILE_FLAGS -w) -SET_SOURCE_FILES_PROPERTIES(./resultBufferTest.cpp PROPERTIES COMPILE_FLAGS -w) -SET_SOURCE_FILES_PROPERTIES(./tsBufTest.cpp PROPERTIES COMPILE_FLAGS -w) -SET_SOURCE_FILES_PROPERTIES(./unitTest.cpp PROPERTIES COMPILE_FLAGS -w) +#SET_SOURCE_FILES_PROPERTIES(./astTest.cpp PROPERTIES COMPILE_FLAGS -w) +#SET_SOURCE_FILES_PROPERTIES(./histogramTest.cpp PROPERTIES COMPILE_FLAGS -w) +#SET_SOURCE_FILES_PROPERTIES(./percentileTest.cpp PROPERTIES COMPILE_FLAGS -w) +#SET_SOURCE_FILES_PROPERTIES(./resultBufferTest.cpp PROPERTIES COMPILE_FLAGS -w) +#SET_SOURCE_FILES_PROPERTIES(./tsBufTest.cpp PROPERTIES COMPILE_FLAGS -w) +#SET_SOURCE_FILES_PROPERTIES(./unitTest.cpp PROPERTIES COMPILE_FLAGS -w) +SET_SOURCE_FILES_PROPERTIES(./rangeMergeTest.cpp PROPERTIES COMPILE_FLAGS -w) diff --git a/src/query/tests/astTest.cpp b/src/query/tests/astTest.cpp deleted file mode 100644 index 1143d00e8d..0000000000 --- a/src/query/tests/astTest.cpp +++ /dev/null @@ -1,635 +0,0 @@ -#include -#include -#include -#include - -#include "texpr.h" -#include "taosmsg.h" -#include "tsdb.h" -#include "tskiplist.h" - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wwrite-strings" -#pragma GCC diagnostic ignored "-Wunused-function" - -typedef struct ResultObj { - int32_t numOfResult; - char * resultName[64]; -} ResultObj; - -static void initSchema(SSchema *pSchema, int32_t numOfCols); - -static void initSchema_binary(SSchema *schema, int32_t numOfCols); - -static SSkipList *createSkipList(SSchema *pSchema, int32_t numOfTags); -static SSkipList *createSkipList_binary(SSchema *pSchema, int32_t numOfTags); - -static void dropMeter(SSkipList *pSkipList); - -static void Right2LeftTest(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList); - -static void Left2RightTest(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList); - -static void IllegalExprTest(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList); - -static void Left2RightTest_binary(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList); -static void Right2LeftTest_binary(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList); - -void setValue(ResultObj *pResult, int32_t num, char **val) { - pResult->numOfResult = num; - for (int32_t i = 0; i < num; ++i) { - pResult->resultName[i] = val[i]; - } -} - -static void initSchema_binary(SSchema *schema, int32_t numOfCols) { - schema[0].type = TSDB_DATA_TYPE_BINARY; - schema[0].bytes = 8; - strcpy(schema[0].name, "a"); - - schema[1].type = TSDB_DATA_TYPE_DOUBLE; - schema[1].bytes = 8; - strcpy(schema[1].name, "b"); - - schema[2].type = TSDB_DATA_TYPE_INT; - schema[2].bytes = 20; - strcpy(schema[2].name, "c"); - - schema[3].type = TSDB_DATA_TYPE_BIGINT; - schema[3].bytes = 8; - strcpy(schema[3].name, "d"); - - schema[4].type = TSDB_DATA_TYPE_SMALLINT; - schema[4].bytes = 2; - strcpy(schema[4].name, "e"); - - schema[5].type = TSDB_DATA_TYPE_TINYINT; - schema[5].bytes = 1; - strcpy(schema[5].name, "f"); - - schema[6].type = TSDB_DATA_TYPE_FLOAT; - schema[6].bytes = 4; - strcpy(schema[6].name, "g"); - - schema[7].type = TSDB_DATA_TYPE_BOOL; - schema[7].bytes = 1; - strcpy(schema[7].name, "h"); -} - -static void initSchema(SSchema *schema, int32_t numOfCols) { - schema[0].type = TSDB_DATA_TYPE_INT; - schema[0].bytes = 8; - strcpy(schema[0].name, "a"); - - schema[1].type = TSDB_DATA_TYPE_DOUBLE; - schema[1].bytes = 8; - strcpy(schema[1].name, "b"); - - schema[2].type = TSDB_DATA_TYPE_BINARY; - schema[2].bytes = 20; - strcpy(schema[2].name, "c"); - - schema[3].type = TSDB_DATA_TYPE_BIGINT; - schema[3].bytes = 8; - strcpy(schema[3].name, "d"); - - schema[4].type = TSDB_DATA_TYPE_SMALLINT; - schema[4].bytes = 2; - strcpy(schema[4].name, "e"); - - schema[5].type = TSDB_DATA_TYPE_TINYINT; - schema[5].bytes = 1; - strcpy(schema[5].name, "f"); - - schema[6].type = TSDB_DATA_TYPE_FLOAT; - schema[6].bytes = 4; - strcpy(schema[6].name, "g"); - - schema[7].type = TSDB_DATA_TYPE_BOOL; - schema[7].bytes = 1; - strcpy(schema[7].name, "h"); -} - -// static void addOneNode(SSchema *pSchema, int32_t tagsLen, SSkipList *pSkipList, -// char *meterId, int32_t a, double b, char *c, int64_t d, int16_t e, int8_t f, float g, -// bool h, int32_t numOfTags) { -// STabObj *pMeter = calloc(1, sizeof(STabObj)); -// pMeter->numOfTags = numOfTags; -// pMeter->pTagData = calloc(1, tagsLen + TSDB_METER_ID_LEN); -// strcpy(pMeter->meterId, meterId); -// -// char *tags = pMeter->pTagData + TSDB_METER_ID_LEN; -// int32_t offset = 0; -// -// *(int32_t *) tags = a; -// -// offset += pSchema[0].bytes; -// *(double *) (tags + offset) = b; -// -// offset += pSchema[1].bytes; -// memcpy(tags + offset, c, 3); -// -// offset += pSchema[2].bytes; -// *(int64_t *) (tags + offset) = d; -// -// offset += pSchema[3].bytes; -// *(int16_t *) (tags + offset) = e; -// -// offset += pSchema[4].bytes; -// *(int8_t *) (tags + offset) = f; -// -// offset += pSchema[5].bytes; -// *(float *) (tags + offset) = g; -// -// offset += pSchema[6].bytes; -// *(int8_t *) (tags + offset) = h ? 1 : 0; -// -// SSkipListKey pKey = SSkipListCreateKey(pSchema[0].type, tags, pSchema[0].bytes); -// SSkipListPut(pSkipList, pMeter, &pKey, 1); -//} -// -// static void addOneNode_binary(SSchema *pSchema, int32_t tagsLen, SSkipList *pSkipList, -// char *meterId, int32_t a, double b, char *c, int64_t d, int16_t e, int8_t f, float g, -// bool h, int32_t numOfTags) { -// STabObj *pMeter = calloc(1, sizeof(STabObj)); -// pMeter->numOfTags = numOfTags; -// pMeter->pTagData = calloc(1, tagsLen + TSDB_METER_ID_LEN); -// strcpy(pMeter->meterId, meterId); -// -// char *tags = pMeter->pTagData + TSDB_METER_ID_LEN; -// int32_t offset = 0; -// memcpy(tags, c, pSchema[0].bytes); -// -// offset += pSchema[0].bytes; -// *(double *) (tags + offset) = b; -// -// offset += pSchema[1].bytes; -// *(int32_t *) (tags + offset) = a; -// -// offset += pSchema[2].bytes; -// *(int64_t *) (tags + offset) = d; -// -// offset += pSchema[3].bytes; -// *(int16_t *) (tags + offset) = e; -// -// offset += pSchema[4].bytes; -// *(int8_t *) (tags + offset) = f; -// -// offset += pSchema[5].bytes; -// *(float *) (tags + offset) = g; -// -// offset += pSchema[6].bytes; -// *(int8_t *) (tags + offset) = h ? 1 : 0; -// -// SSkipListKey pKey = SSkipListCreateKey(pSchema[0].type, tags, pSchema[0].bytes); -// SSkipListPut(pSkipList, pMeter, &pKey, 1); -// SSkipListDestroyKey(&pKey); -//} - -// static void dropMeter(SSkipList *pSkipList) { -// SSkipListNode **pRes = NULL; -// int32_t num = SSkipListIterateList(pSkipList, &pRes, NULL, NULL); -// for (int32_t i = 0; i < num; ++i) { -// SSkipListNode *pNode = pRes[i]; -// STabObj *pMeter = (STabObj *) pNode->pData; -// free(pMeter->pTagData); -// free(pMeter); -// pNode->pData = NULL; -// } -// free(pRes); -//} - -// static SSkipList *createSkipList(SSchema *pSchema, int32_t numOfTags) { -// int32_t tagsLen = 0; -// for (int32_t i = 0; i < numOfTags; ++i) { -// tagsLen += pSchema[i].bytes; -// } -// -// SSkipList *pSkipList = SSkipListCreate(10, pSchema[0].type, 4); -// -// addOneNode(pSchema, tagsLen, pSkipList, "tm0\0", 0, 10.5, "abc", 1000, -10000, -20, 1.0, true, 8); -// addOneNode(pSchema, tagsLen, pSkipList, "tm1\0", 1, 20.5, "def", 1100, -10500, -30, 2.0, false, 8); -// addOneNode(pSchema, tagsLen, pSkipList, "tm2\0", 2, 30.5, "ghi", 1200, -11000, -40, 3.0, true, 8); -// addOneNode(pSchema, tagsLen, pSkipList, "tm3\0", 3, 40.5, "jkl", 1300, -11500, -50, 4.0, false, 8); -// addOneNode(pSchema, tagsLen, pSkipList, "tm4\0", 4, 50.5, "mno", 1400, -12000, -60, 5.0, true, 8); -// addOneNode(pSchema, tagsLen, pSkipList, "tm5\0", 5, 60.5, "pqr", 1500, -12500, -70, 6.0, false, 8); -// addOneNode(pSchema, tagsLen, pSkipList, "tm6\0", 6, 70.5, "stu", 1600, -13000, -80, 7.0, true, 8); -// -// return pSkipList; -//} -// -// static SSkipList *createSkipList_binary(SSchema *pSchema, int32_t numOfTags) { -// int32_t tagsLen = 0; -// for (int32_t i = 0; i < numOfTags; ++i) { -// tagsLen += pSchema[i].bytes; -// } -// -// SSkipList *pSkipList = SSkipListCreate(10, pSchema[0].type, 4); -// -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm0\0", 0, 10.5, "abc", 1000, -10000, -20, 1.0, true, 8); -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm1\0", 1, 20.5, "def", 1100, -10500, -30, 2.0, false, 8); -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm2\0", 2, 30.5, "ghi", 1200, -11000, -40, 3.0, true, 8); -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm3\0", 3, 40.5, "jkl", 1300, -11500, -50, 4.0, false, 8); -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm4\0", 4, 50.5, "mno", 1400, -12000, -60, 5.0, true, 8); -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm5\0", 5, 60.5, "pqr", 1500, -12500, -70, 6.0, false, 8); -// addOneNode_binary(pSchema, tagsLen, pSkipList, "tm6\0", 6, 70.5, "stu", 1600, -13000, -80, 7.0, true, 8); -// -// return pSkipList; -//} - -//static void testQueryStr(SSchema *schema, int32_t numOfCols, char *sql, SSkipList *pSkipList, ResultObj *pResult) { -// tExprNode *pExpr = NULL; -// tSQLBinaryExprFromString(&pExpr, schema, numOfCols, sql, strlen(sql)); -// -// char str[512] = {0}; -// int32_t len = 0; -// if (pExpr == NULL) { -// printf("-----error in parse syntax:%s\n\n", sql); -// assert(pResult == NULL); -// return; -// } -// -// tSQLBinaryExprToString(pExpr, str, &len); -// printf("expr is: %s\n", str); -// -// SArray *result = NULL; -// // tExprTreeTraverse(pExpr, pSkipList, result, SSkipListNodeFilterCallback, &result); -// // printf("the result is:%lld\n", result.num); -// // -// // bool findResult = false; -// // for (int32_t i = 0; i < result.num; ++i) { -// // STabObj *pm = (STabObj *)result.pRes[i]; -// // printf("meterid:%s,\t", pm->meterId); -// // -// // for (int32_t j = 0; j < pResult->numOfResult; ++j) { -// // if (strcmp(pm->meterId, pResult->resultName[j]) == 0) { -// // findResult = true; -// // break; -// // } -// // } -// // assert(findResult == true); -// // findResult = false; -// // } -// -// printf("\n\n"); -// tExprTreeDestroy(&pExpr, NULL); -//} - -#if 0 -static void Left2RightTest(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList) { - char str[256] = {0}; - - char *t0[1] = {"tm0"}; - char *t1[1] = {"tm1"}; - char *sql = NULL; - - ResultObj res = {1, {"tm1"}}; - testQueryStr(schema, numOfCols, "a=1", pSkipList, &res); - - char *tt[1] = {"tm6"}; - setValue(&res, 1, tt); - testQueryStr(schema, numOfCols, "a>=6", pSkipList, &res); - - setValue(&res, 1, t0); - testQueryStr(schema, numOfCols, "b<=10.6", pSkipList, &res); - - strcpy(str, "c<>'pqr'"); - char *t2[6] = {"tm0", "tm1", "tm2", "tm3", "tm4", "tm6"}; - setValue(&res, 6, t2); - testQueryStr(schema, numOfCols, str, pSkipList, &res); - - strcpy(str, "c='abc'"); - setValue(&res, 1, t0); - testQueryStr(schema, numOfCols, str, pSkipList, &res); - - char *t3[6] = {"tm1", "tm2", "tm3", "tm4", "tm5", "tm6"}; - setValue(&res, 6, t3); - testQueryStr(schema, numOfCols, "d>1050", pSkipList, &res); - - char *t4[3] = {"tm4", "tm5", "tm6"}; - setValue(&res, 3, t4); - testQueryStr(schema, numOfCols, "g>4.5980765", pSkipList, &res); - - char *t5[4] = {"tm0", "tm2", "tm4", "tm6"}; - setValue(&res, 4, t5); - testQueryStr(schema, numOfCols, "h=true", pSkipList, &res); - - char *t6[3] = {"tm1", "tm3", "tm5"}; - setValue(&res, 3, t6); - testQueryStr(schema, numOfCols, "h=0", pSkipList, &res); - - sql = "(((b<40)))\0"; - char *t7[3] = {"tm0", "tm1", "tm2"}; - setValue(&res, 3, t7); - testQueryStr(schema, numOfCols, sql, pSkipList, &res); - - sql = "((a=1) or (a=10)) or ((b=12))"; - setValue(&res, 1, t1); - testQueryStr(schema, numOfCols, sql, pSkipList, &res); - - sql = "((((((a>0 and a<2))) or a=6) or a=3) or (b=50.5)) and h=0"; - char *t8[2] = {"tm1", "tm3"}; - setValue(&res, 2, t8); - testQueryStr(schema, numOfCols, sql, pSkipList, &res); - - char *tf[1] = {"tm6"}; - setValue(&res, 1, tf); - testQueryStr(schema, numOfCols, "e = -13000", pSkipList, &res); - - char *ft[5] = {"tm0", "tm1", "tm2", "tm3", "tm4"}; - setValue(&res, 5, ft); - testQueryStr(schema, numOfCols, "f > -65", pSkipList, &res); -} - -void Right2LeftTest(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList) { - ResultObj res = {1, {"tm1"}}; - testQueryStr(schema, numOfCols, "((1=a))", pSkipList, &res); - - char *t9[2] = {"tm0", "tm1"}; - setValue(&res, 2, t9); - testQueryStr(schema, numOfCols, "1>=a", pSkipList, &res); - - char *t0[1] = {"tm0"}; - setValue(&res, 1, t0); - testQueryStr(schema, numOfCols, "10.6>=b", pSkipList, &res); - - char *t10[3] = {"tm1", "tm3", "tm5"}; - setValue(&res, 3, t10); - testQueryStr(schema, numOfCols, "0=h", pSkipList, &res); -} - -static void IllegalExprTest(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList) { - testQueryStr(schema, numOfCols, "h=", pSkipList, NULL); - testQueryStr(schema, numOfCols, "h<", pSkipList, NULL); - testQueryStr(schema, numOfCols, "a=1 and ", pSkipList, NULL); - testQueryStr(schema, numOfCols, "and or", pSkipList, NULL); - testQueryStr(schema, numOfCols, "and a = 1 or", pSkipList, NULL); - testQueryStr(schema, numOfCols, "(())", pSkipList, NULL); - testQueryStr(schema, numOfCols, "(", pSkipList, NULL); - testQueryStr(schema, numOfCols, "(a", pSkipList, NULL); - testQueryStr(schema, numOfCols, "(a)", pSkipList, NULL); - testQueryStr(schema, numOfCols, "())", pSkipList, NULL); - testQueryStr(schema, numOfCols, "a===1", pSkipList, NULL); - testQueryStr(schema, numOfCols, "a=1 and ", pSkipList, NULL); -} - -static void Left2RightTest_binary(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList) { - char str[256] = {0}; - char *sql = NULL; - - char *t0[1] = {"tm0"}; - char *t1[1] = {"tm1"}; - - ResultObj res = {1, {"tm0"}}; - strcpy(str, "a='abc'"); - testQueryStr(schema, numOfCols, str, pSkipList, &res); - - char *tt[1] = {"tm6"}; - setValue(&res, 1, tt); - testQueryStr(schema, numOfCols, "c>=6", pSkipList, &res); - - setValue(&res, 1, t0); - testQueryStr(schema, numOfCols, "b<=10.6", pSkipList, &res); - - strcpy(str, "a<>'pqr'"); - char *t2[6] = {"tm0", "tm1", "tm2", "tm3", "tm4", "tm6"}; - setValue(&res, 6, t2); - testQueryStr(schema, numOfCols, str, pSkipList, &res); - - strcpy(str, "a='abc'"); - setValue(&res, 1, t0); - testQueryStr(schema, numOfCols, str, pSkipList, &res); - - char *t3[6] = {"tm1", "tm2", "tm3", "tm4", "tm5", "tm6"}; - setValue(&res, 6, t3); - testQueryStr(schema, numOfCols, "d>1050", pSkipList, &res); - - char *t4[3] = {"tm4", "tm5", "tm6"}; - setValue(&res, 3, t4); - testQueryStr(schema, numOfCols, "g>4.5980765", pSkipList, &res); - - char *t5[4] = {"tm0", "tm2", "tm4", "tm6"}; - setValue(&res, 4, t5); - testQueryStr(schema, numOfCols, "h=true", pSkipList, &res); - - char *t6[3] = {"tm1", "tm3", "tm5"}; - setValue(&res, 3, t6); - testQueryStr(schema, numOfCols, "h=0", pSkipList, &res); - - sql = "(((b<40)))\0"; - char *t7[3] = {"tm0", "tm1", "tm2"}; - setValue(&res, 3, t7); - testQueryStr(schema, numOfCols, sql, pSkipList, &res); - - sql = "((c=1) or (c=10)) or ((b=12))\0"; - setValue(&res, 1, t1); - testQueryStr(schema, numOfCols, sql, pSkipList, &res); - - sql = "((((((c>0 and c<2))) or c=6) or c=3) or (b=50.5)) and h=false\0"; - char *t8[2] = {"tm1", "tm3"}; - setValue(&res, 2, t8); - testQueryStr(schema, numOfCols, sql, pSkipList, &res); -} - -static void Right2LeftTest_binary(SSchema *schema, int32_t numOfCols, SSkipList *pSkipList) { - char str[256] = {0}; - char *sql = NULL; - - char *t0[1] = {"tm0"}; - char *t1[1] = {"tm1"}; - - ResultObj res = {1, {"tm0"}}; - strcpy(str, "'abc'=a"); - testQueryStr(schema, numOfCols, str, pSkipList, &res); - - char *tt[1] = {"tm6"}; - setValue(&res, 1, tt); - testQueryStr(schema, numOfCols, "6<=c", pSkipList, &res); - - setValue(&res, 1, t0); - testQueryStr(schema, numOfCols, "10.6>=b", pSkipList, &res); - - strcpy(str, "'pqr'<>a"); - char *t2[6] = {"tm0", "tm1", "tm2", "tm3", "tm4", "tm6"}; - setValue(&res, 6, t2); - testQueryStr(schema, numOfCols, str, pSkipList, &res); -} - -namespace { -// two level expression tree -tExprNode *createExpr1() { - auto *pLeft = (tExprNode*) calloc(1, sizeof(tExprNode)); - pLeft->nodeType = TSQL_NODE_COL; - pLeft->pSchema = (SSchema*) calloc(1, sizeof(SSchema)); - - strcpy(pLeft->pSchema->name, "col_a"); - pLeft->pSchema->type = TSDB_DATA_TYPE_INT; - pLeft->pSchema->bytes = sizeof(int32_t); - pLeft->pSchema->colId = 1; - - auto *pRight = (tExprNode*) calloc(1, sizeof(tExprNode)); - pRight->nodeType = TSQL_NODE_VALUE; - pRight->pVal = (tVariant*) calloc(1, sizeof(tVariant)); - - pRight->pVal->nType = TSDB_DATA_TYPE_INT; - pRight->pVal->i64 = 12; - - auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode)); - pRoot->nodeType = TSQL_NODE_EXPR; - - pRoot->_node.optr = TSDB_RELATION_EQUAL; - pRoot->_node.pLeft = pLeft; - pRoot->_node.pRight = pRight; - pRoot->_node.hasPK = true; - - return pRoot; -} - -// thress level expression tree -tExprNode* createExpr2() { - auto *pLeft2 = (tExprNode*) calloc(1, sizeof(tExprNode)); - pLeft2->nodeType = TSQL_NODE_COL; - pLeft2->pSchema = (SSchema*) calloc(1, sizeof(SSchema)); - - strcpy(pLeft2->pSchema->name, "col_a"); - pLeft2->pSchema->type = TSDB_DATA_TYPE_BINARY; - pLeft2->pSchema->bytes = 20; - pLeft2->pSchema->colId = 1; - - auto *pRight2 = (tExprNode*) calloc(1, sizeof(tExprNode)); - pRight2->nodeType = TSQL_NODE_VALUE; - pRight2->pVal = (tVariant*) calloc(1, sizeof(tVariant)); - - pRight2->pVal->nType = TSDB_DATA_TYPE_BINARY; - const char* v = "hello world!"; - pRight2->pVal->pz = strdup(v); - pRight2->pVal->nLen = strlen(v); - - auto *p1 = (tExprNode*) calloc(1, sizeof(tExprNode)); - p1->nodeType = TSQL_NODE_EXPR; - - p1->_node.optr = TSDB_RELATION_LIKE; - p1->_node.pLeft = pLeft2; - p1->_node.pRight = pRight2; - p1->_node.hasPK = false; - - auto *pLeft1 = (tExprNode*) calloc(1, sizeof(tExprNode)); - pLeft1->nodeType = TSQL_NODE_COL; - pLeft1->pSchema = (SSchema*) calloc(1, sizeof(SSchema)); - - strcpy(pLeft1->pSchema->name, "col_b"); - pLeft1->pSchema->type = TSDB_DATA_TYPE_DOUBLE; - pLeft1->pSchema->bytes = 8; - pLeft1->pSchema->colId = 99; - - auto *pRight1 = (tExprNode*) calloc(1, sizeof(tExprNode)); - pRight1->nodeType = TSQL_NODE_VALUE; - pRight1->pVal = (tVariant*) calloc(1, sizeof(tVariant)); - - pRight1->pVal->nType = TSDB_DATA_TYPE_DOUBLE; - pRight1->pVal->dKey = 91.99; - - auto *p2 = (tExprNode*) calloc(1, sizeof(tExprNode)); - p2->nodeType = TSQL_NODE_EXPR; - - p2->_node.optr = TSDB_RELATION_GREATER_EQUAL; - p2->_node.pLeft = pLeft1; - p2->_node.pRight = pRight1; - p2->_node.hasPK = false; - - auto *pRoot = (tExprNode*) calloc(1, sizeof(tExprNode)); - pRoot->nodeType = TSQL_NODE_EXPR; - - pRoot->_node.optr = TSDB_RELATION_OR; - pRoot->_node.pLeft = p1; - pRoot->_node.pRight = p2; - pRoot->_node.hasPK = true; - return pRoot; -} - -void exprSerializeTest1() { - tExprNode* p1 = createExpr1(); - SBufferWriter bw = tbufInitWriter(NULL, false); - exprTreeToBinary(&bw, p1); - - size_t size = tbufTell(&bw); - ASSERT_TRUE(size > 0); - char* b = tbufGetData(&bw, false); - - tExprNode* p2 = exprTreeFromBinary(b, size); - ASSERT_EQ(p1->nodeType, p2->nodeType); - - ASSERT_EQ(p2->_node.optr, p1->_node.optr); - ASSERT_EQ(p2->_node.pLeft->nodeType, p1->_node.pLeft->nodeType); - ASSERT_EQ(p2->_node.pRight->nodeType, p1->_node.pRight->nodeType); - - SSchema* s1 = p1->_node.pLeft->pSchema; - SSchema* s2 = p2->_node.pLeft->pSchema; - - ASSERT_EQ(s2->colId, s1->colId); - ASSERT_EQ(s2->type, s1->type); - ASSERT_EQ(s2->bytes, s1->bytes); - ASSERT_STRCASEEQ(s2->name, s1->name); - - tVariant* v1 = p1->_node.pRight->pVal; - tVariant* v2 = p2->_node.pRight->pVal; - - ASSERT_EQ(v1->nType, v2->nType); - ASSERT_EQ(v1->i64, v2->i64); - ASSERT_EQ(p1->_node.hasPK, p2->_node.hasPK); - - tExprTreeDestroy(&p1, nullptr); - tExprTreeDestroy(&p2, nullptr); - - // tbufClose(&bw); -} - -void exprSerializeTest2() { - tExprNode* p1 = createExpr2(); - SBufferWriter bw = tbufInitWriter(NULL, false); - exprTreeToBinary(&bw, p1); - - size_t size = tbufTell(&bw); - ASSERT_TRUE(size > 0); - char* b = tbufGetData(&bw, false); - - tExprNode* p2 = exprTreeFromBinary(b, size); - ASSERT_EQ(p1->nodeType, p2->nodeType); - - ASSERT_EQ(p2->_node.optr, p1->_node.optr); - ASSERT_EQ(p2->_node.pLeft->nodeType, p1->_node.pLeft->nodeType); - ASSERT_EQ(p2->_node.pRight->nodeType, p1->_node.pRight->nodeType); - - tExprNode* c1Left = p1->_node.pLeft; - tExprNode* c2Left = p2->_node.pLeft; - - ASSERT_EQ(c1Left->nodeType, c2Left->nodeType); - - ASSERT_EQ(c2Left->nodeType, TSQL_NODE_EXPR); - ASSERT_EQ(c2Left->_node.optr, TSDB_RELATION_LIKE); - - ASSERT_STRCASEEQ(c2Left->_node.pLeft->pSchema->name, "col_a"); - ASSERT_EQ(c2Left->_node.pRight->nodeType, TSQL_NODE_VALUE); - - ASSERT_STRCASEEQ(c2Left->_node.pRight->pVal->pz, "hello world!"); - - tExprNode* c1Right = p1->_node.pRight; - tExprNode* c2Right = p2->_node.pRight; - - ASSERT_EQ(c1Right->nodeType, c2Right->nodeType); - ASSERT_EQ(c2Right->nodeType, TSQL_NODE_EXPR); - ASSERT_EQ(c2Right->_node.optr, TSDB_RELATION_GREATER_EQUAL); - ASSERT_EQ(c2Right->_node.pRight->pVal->dKey, 91.99); - - ASSERT_EQ(p2->_node.hasPK, true); - - tExprTreeDestroy(&p1, nullptr); - tExprTreeDestroy(&p2, nullptr); - - // tbufClose(&bw); -} -} // namespace -TEST(testCase, astTest) { -// exprSerializeTest2(); -} -#endif \ No newline at end of file diff --git a/src/query/tests/histogramTest.cpp b/src/query/tests/histogramTest.cpp deleted file mode 100644 index 0266ecffc1..0000000000 --- a/src/query/tests/histogramTest.cpp +++ /dev/null @@ -1,142 +0,0 @@ -#include -#include -#include -#include - -#include "taos.h" -#include "qHistogram.h" - -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wunused-variable" - -namespace { -void doHistogramAddTest() { - SHistogramInfo* pHisto = NULL; - - /** - * use arrayList, elapsed time is: - * before: - * 10,000,000 45sec, bin:1000 (-O0) / 17sec. bin:1000, (-O3) - * - * after: - * - */ - struct timeval systemTime; - gettimeofday(&systemTime, NULL); - int64_t st = - (int64_t)systemTime.tv_sec * 1000L + (uint64_t)systemTime.tv_usec / 1000; - for (int32_t i = 0; i < 10000; ++i) { - tHistogramAdd(&pHisto, i); - // tHistogramPrint(pHisto); - } - // - gettimeofday(&systemTime, NULL); - int64_t et = - (int64_t)systemTime.tv_sec * 1000L + (uint64_t)systemTime.tv_usec / 1000; - printf("total elapsed time: %ld\n", et - st); - - printf("elements: %d, slot:%d \n", pHisto->numOfElems, pHisto->numOfEntries); - tHistogramPrint(pHisto); - - printf("%ld\n", tHistogramSum(pHisto, 1.5)); - printf("%ld\n", tHistogramSum(pHisto, 2)); - printf("%ld\n", tHistogramSum(pHisto, 3)); - printf("%ld\n", tHistogramSum(pHisto, 4)); - printf("%ld\n", tHistogramSum(pHisto, 5)); - printf("%ld\n", tHistogramSum(pHisto, 6)); - - for (int32_t i = 399; i < 400; ++i) { - printf("val:%d, %ld\n", i, tHistogramSum(pHisto, i)); - } - - double ratio[] = {0 / 100, 20.0 / 100, 88.0 / 100, 100 / 100}; - double* res = tHistogramUniform(pHisto, ratio, 4); - for (int32_t i = 0; i < 4; ++i) { - printf("%f\n", res[i]); - } - - SHistogramInfo* pHisto1 = NULL; - for (int32_t i = (90000 - 1); i >= 80000; --i) { - tHistogramAdd(&pHisto1, i); - } - tHistogramPrint(pHisto1); - - SHistogramInfo* pRes = tHistogramMerge(pHisto1, pHisto, MAX_HISTOGRAM_BIN); - assert(pRes->numOfElems == pHisto->numOfElems + pHisto1->numOfElems); - tHistogramPrint(pRes); - - tHistogramDestroy(&pHisto); - tHistogramDestroy(&pHisto1); - tHistogramDestroy(&pRes); - free(res); -} -void doHistogramRepeatTest() { - SHistogramInfo* pHisto = NULL; - struct timeval systemTime; - - gettimeofday(&systemTime, NULL); - int64_t st = - (int64_t)systemTime.tv_sec * 1000L + (uint64_t)systemTime.tv_usec / 1000; - - for (int32_t i = 0; i < 1000; ++i) { - tHistogramAdd(&pHisto, -24 + i); - // tHistogramPrint(pHisto); - } - - tHistogramDestroy(&pHisto); - -} -} - -/* test validate the names for table/database */ -TEST(testCase, histogram_binary_search) { - SHistogramInfo* pHisto = tHistogramCreate(MAX_HISTOGRAM_BIN); - - pHisto->numOfEntries = 10; - for (int32_t i = 0; i < 10; ++i) { - pHisto->elems[i].num = 1; - pHisto->elems[i].val = i; - } - - int32_t idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 1); - assert(idx == 1); - - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 9); - assert(idx == 9); - - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 20); - assert(idx == 10); - - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, -1); - assert(idx == 0); - - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9); - assert(idx == 4); - - free(pHisto); -} - -TEST(testCase, histogram_add) { - doHistogramAddTest(); - doHistogramRepeatTest(); -} - -TEST(testCase, heapsort) { - // int32_t num = 20; - // - // SHeapEntry* pEntry = tHeapCreate(num); - // - // for(int32_t i=0; i -#include -#include -#include - -#include "qAggMain.h" -#include "tcompare.h" - -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wunused-variable" - -TEST(testCase, patternMatchTest) { - SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; - - const char* str = "abcdef"; - int32_t ret = patternMatch("a%b%", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "tm01"; - ret = patternMatch("tm__", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "tkm1"; - ret = patternMatch("t%m1", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "tkm1"; - ret = patternMatch("%m1", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = ""; - ret = patternMatch("%_", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_NOWILDCARDMATCH); - - str = "1"; - ret = patternMatch("%__", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_NOWILDCARDMATCH); - - str = ""; - ret = patternMatch("%", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = " "; - ret = patternMatch("_", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "!"; - ret = patternMatch("%_", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "abcdefg"; - ret = patternMatch("abc%fg", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "abcdefgabcdeju"; - ret = patternMatch("abc%fg", str, 7, &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "abcdefgabcdeju"; - ret = patternMatch("abc%f_", str, 6, &info); - EXPECT_EQ(ret, TSDB_PATTERN_NOWILDCARDMATCH); - - str = "abcdefgabcdeju"; - ret = patternMatch("abc%f_", str, 1, &info); // pattern string is longe than the size - EXPECT_EQ(ret, TSDB_PATTERN_NOMATCH); - - str = "abcdefgabcdeju"; - ret = patternMatch("ab", str, 2, &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "abcdefgabcdeju"; - ret = patternMatch("a%", str, 2, &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "abcdefgabcdeju"; - ret = patternMatch("a__", str, 2, &info); - EXPECT_EQ(ret, TSDB_PATTERN_NOMATCH); - - str = "carzero"; - ret = patternMatch("%o", str, strlen(str), &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); - - str = "19"; - ret = patternMatch("%9", str, 2, &info); - EXPECT_EQ(ret, TSDB_PATTERN_MATCH); -} diff --git a/src/query/tests/percentileTest.cpp b/src/query/tests/percentileTest.cpp deleted file mode 100644 index 1b6951201a..0000000000 --- a/src/query/tests/percentileTest.cpp +++ /dev/null @@ -1,257 +0,0 @@ -#include -#include - -#include "qResultbuf.h" -#include "taos.h" -#include "taosdef.h" - -#include "qPercentile.h" - -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wunused-variable" - -namespace { -tMemBucket *createBigIntDataBucket(int32_t start, int32_t end) { - tMemBucket *pBucket = tMemBucketCreate(sizeof(int64_t), TSDB_DATA_TYPE_BIGINT, start, end); - for (int32_t i = start; i <= end; ++i) { - int64_t val = i; - tMemBucketPut(pBucket, &val, 1); - } - - return pBucket; -} - -tMemBucket *createIntDataBucket(int32_t start, int32_t end) { - tMemBucket *pBucket = tMemBucketCreate(sizeof(int32_t), TSDB_DATA_TYPE_INT, start, end); - - for (int32_t i = start; i <= end; ++i) { - int32_t val = i; - tMemBucketPut(pBucket, &val, 1); - } - - return pBucket; -} - -tMemBucket *createDoubleDataBucket(int32_t start, int32_t end) { - tMemBucket *pBucket = tMemBucketCreate(sizeof(double), TSDB_DATA_TYPE_DOUBLE, start, end); - for (int32_t i = start; i <= end; ++i) { - double val = i; - int32_t ret = tMemBucketPut(pBucket, &val, 1); - if (ret != 0) { - printf("value out of range:%f", val); - } - } - - return pBucket; -} - -tMemBucket *createUnsignedDataBucket(int32_t start, int32_t end, int32_t type) { - tMemBucket *pBucket = tMemBucketCreate(tDataTypes[type].bytes, type, start, end); - for (int32_t i = start; i <= end; ++i) { - uint64_t k = i; - int32_t ret = tMemBucketPut(pBucket, &k, 1); - if (ret != 0) { - printf("value out of range:%" PRId64, k); - } - } - - return pBucket; -} - -void intDataTest() { - printf("running %s\n", __FUNCTION__); - - tMemBucket *pBucket = NULL; - double result = 0.; - - pBucket = createIntDataBucket(0, 0); - result = getPercentile(pBucket, 0); - ASSERT_DOUBLE_EQ(result, 0); - tMemBucketDestroy(pBucket); - - pBucket = createIntDataBucket(0, 1); - result = getPercentile(pBucket, 100); - ASSERT_DOUBLE_EQ(result, 1); - - result = getPercentile(pBucket, 0); - ASSERT_DOUBLE_EQ(result, 0); - tMemBucketDestroy(pBucket); - - pBucket = createIntDataBucket(-1, 1); - - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 0); - - result = getPercentile(pBucket, 0); - ASSERT_DOUBLE_EQ(result, -1); - - result = getPercentile(pBucket, 75); - ASSERT_DOUBLE_EQ(result, 0.5); - - result = getPercentile(pBucket, 100); - ASSERT_DOUBLE_EQ(result, 1); - tMemBucketDestroy(pBucket); - - pBucket = createIntDataBucket(0, 99999); - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 49999.5); - - tMemBucketDestroy(pBucket); -} - -void bigintDataTest() { - printf("running %s\n", __FUNCTION__); - - tMemBucket *pBucket = NULL; - double result = 0.0; - - pBucket = createBigIntDataBucket(-1000, 1000); - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 0.); - tMemBucketDestroy(pBucket); - - pBucket = createBigIntDataBucket(-10000, 10000); - result = getPercentile(pBucket, 100); - ASSERT_DOUBLE_EQ(result, 10000.0); - tMemBucketDestroy(pBucket); - - pBucket = createBigIntDataBucket(-10000, 10000); - result = getPercentile(pBucket, 75); - ASSERT_DOUBLE_EQ(result, 5000.0); - - tMemBucketDestroy(pBucket); -} - -void doubleDataTest() { - printf("running %s\n", __FUNCTION__); - - tMemBucket *pBucket = NULL; - double result = 0; - - pBucket = createDoubleDataBucket(-10, 10); - result = getPercentile(pBucket, 0); - ASSERT_DOUBLE_EQ(result, -10.0); - - printf("result is: %lf\n", result); - tMemBucketDestroy(pBucket); - - pBucket = createDoubleDataBucket(-100000, 100000); - result = getPercentile(pBucket, 25); - ASSERT_DOUBLE_EQ(result, -50000); - - printf("result is: %lf\n", result); - - tMemBucketDestroy(pBucket); - - pBucket = createDoubleDataBucket(-100000, 100000); - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 0); - - tMemBucketDestroy(pBucket); - - pBucket = createDoubleDataBucket(-100000, 100000); - result = getPercentile(pBucket, 75); - ASSERT_DOUBLE_EQ(result, 50000); - tMemBucketDestroy(pBucket); - - pBucket = createDoubleDataBucket(-100000, 100000); - - result = getPercentile(pBucket, 100); - ASSERT_DOUBLE_EQ(result, 100000.0); - - printf("result is: %lf\n", result); - tMemBucketDestroy(pBucket); -} - -/* - * large data test, we employ 0.1billion double data to calculated the percentile - * which is 800MB data - */ -void largeDataTest() { - printf("running : %s\n", __FUNCTION__); - - tMemBucket *pBucket = NULL; - double result = 0; - - struct timeval tv; - gettimeofday(&tv, NULL); - - int64_t start = tv.tv_sec; - printf("start time: %" PRId64 "\n", tv.tv_sec); - pBucket = createDoubleDataBucket(0, 100000000); - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 50000000); - - gettimeofday(&tv, NULL); - - printf("total elapsed time: %" PRId64 " sec.", -start + tv.tv_sec); - printf("the result of %d is: %lf\n", 50, result); - tMemBucketDestroy(pBucket); -} - -void qsortTest() { - printf("running : %s\n", __FUNCTION__); - - SSchema field[1] = { - {TSDB_DATA_TYPE_INT, "k", sizeof(int32_t)}, - }; - - const int32_t num = 2000; - - int32_t *d = (int32_t *)malloc(sizeof(int32_t) * num); - for (int32_t i = 0; i < num; ++i) { - d[i] = i % 4; - } - - const int32_t numOfOrderCols = 1; - int32_t orderColIdx = 0; - SColumnModel * pModel = createColumnModel(field, 1, 1000); - tOrderDescriptor *pDesc = tOrderDesCreate(&orderColIdx, numOfOrderCols, pModel, 1); - - tColDataQSort(pDesc, num, 0, num - 1, (char *)d, 1); - - for (int32_t i = 0; i < num; ++i) { - printf("%d\t", d[i]); - } - printf("\n"); - - destroyColumnModel(pModel); -} - -void unsignedDataTest() { - printf("running %s\n", __FUNCTION__); - - tMemBucket *pBucket = NULL; - double result = 0.0; - - pBucket = createUnsignedDataBucket(0, 1000, TSDB_DATA_TYPE_UINT); - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 500.0); - tMemBucketDestroy(pBucket); - - pBucket = createUnsignedDataBucket(0, 10000, TSDB_DATA_TYPE_UBIGINT); - result = getPercentile(pBucket, 100); - ASSERT_DOUBLE_EQ(result, 10000.0); - - result = getPercentile(pBucket, 0); - ASSERT_DOUBLE_EQ(result, 0.0); - - result = getPercentile(pBucket, 50); - ASSERT_DOUBLE_EQ(result, 5000); - - result = getPercentile(pBucket, 75); - ASSERT_DOUBLE_EQ(result, 7500); - tMemBucketDestroy(pBucket); - -} - -} // namespace - -TEST(testCase, percentileTest) { -// qsortTest(); - intDataTest(); - bigintDataTest(); - doubleDataTest(); - unsignedDataTest(); - largeDataTest(); -} diff --git a/src/query/tests/rangeMergeTest.cpp b/src/query/tests/rangeMergeTest.cpp new file mode 100644 index 0000000000..b64c1a7494 --- /dev/null +++ b/src/query/tests/rangeMergeTest.cpp @@ -0,0 +1,163 @@ +#include +#include + +#include "qResultbuf.h" +#include "taos.h" +#include "taosdef.h" + +#include "qFilter.h" + +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Wunused-variable" + +namespace { + +void intDataTest() { + printf("running %s\n", __FUNCTION__); + int32_t s0[3] = {-100, 1, 3}; + int32_t e0[3] = {0 , 2, 4}; + int64_t s1[3] = {INT64_MIN, 0 , 3}; + int64_t e1[3] = {100 , 50, 4}; + int64_t s2[5] = {1 , 3 , 10,30,70}; + int64_t e2[5] = {10, 100, 20,50,120}; + int64_t s3[3] = {1 , 20 , 5}; + int64_t e3[3] = {10, 100, 25}; + + int32_t rs0[3]; + int32_t re0[3]; + int64_t rs1[3]; + int64_t re1[3]; + int64_t rs2[5]; + int64_t re2[5]; + int64_t rs3[5]; + int64_t re3[5]; + + int32_t num = 0; + + void *h = filterInitMergeRange(TSDB_DATA_TYPE_INT, 0); + for (int32_t i = 0; i < sizeof(s0)/sizeof(s0[0]); ++i) { + filterAddMergeRange(h, s0 + i, e0 + i, TSDB_RELATION_AND); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 0); + filterFreeMergeRange(h); + + + + h = filterInitMergeRange(TSDB_DATA_TYPE_INT, 0); + for (int32_t i = 0; i < sizeof(s0)/sizeof(s0[0]); ++i) { + filterAddMergeRange(h, s0 + i, e0 + i, TSDB_RELATION_OR); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 3); + filterGetMergeRangeRes(h, rs0, re0); + ASSERT_EQ(rs0[0], -100); + ASSERT_EQ(re0[0], 0); + ASSERT_EQ(rs0[1], 1); + ASSERT_EQ(re0[1], 2); + ASSERT_EQ(rs0[2], 3); + ASSERT_EQ(re0[2], 4); + filterFreeMergeRange(h); + + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s1)/sizeof(s1[0]); ++i) { + filterAddMergeRange(h, s1 + i, e1 + i, TSDB_RELATION_AND); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 1); + filterGetMergeRangeRes(h, rs1, re1); + ASSERT_EQ(rs1[0], 3); + ASSERT_EQ(re1[0], 4); + filterFreeMergeRange(h); + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s1)/sizeof(s1[0]); ++i) { + filterAddMergeRange(h, s1 + i, e1 + i, TSDB_RELATION_OR); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 1); + filterGetMergeRangeRes(h, rs1, re1); + ASSERT_EQ(rs1[0], INT64_MIN); + ASSERT_EQ(re1[0], 100); + filterFreeMergeRange(h); + + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s2)/sizeof(s2[0]); ++i) { + filterAddMergeRange(h, s2 + i, e2 + i, TSDB_RELATION_AND); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 0); + filterFreeMergeRange(h); + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s2)/sizeof(s2[0]); ++i) { + filterAddMergeRange(h, s2 + i, e2 + i, TSDB_RELATION_OR); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 1); + filterGetMergeRangeRes(h, rs2, re2); + ASSERT_EQ(rs2[0], 1); + ASSERT_EQ(re2[0], 120); + filterFreeMergeRange(h); + + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s2)/sizeof(s2[0]); ++i) { + filterAddMergeRange(h, s2 + i, e2 + i, i % 2 ? TSDB_RELATION_OR : TSDB_RELATION_AND); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 0); + filterFreeMergeRange(h); + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s2)/sizeof(s2[0]); ++i) { + filterAddMergeRange(h, s2 + i, e2 + i, i % 2 ? TSDB_RELATION_AND : TSDB_RELATION_OR); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 1); + filterGetMergeRangeRes(h, rs2, re2); + ASSERT_EQ(rs2[0], 70); + ASSERT_EQ(re2[0], 120); + filterFreeMergeRange(h); + + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s3)/sizeof(s3[0]); ++i) { + filterAddMergeRange(h, s3 + i, e3 + i, TSDB_RELATION_AND); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 0); + filterFreeMergeRange(h); + + + h = filterInitMergeRange(TSDB_DATA_TYPE_BIGINT, 0); + for (int32_t i = 0; i < sizeof(s3)/sizeof(s3[0]); ++i) { + filterAddMergeRange(h, s3 + i, e3 + i, TSDB_RELATION_OR); + } + filterGetMergeRangeNum(h, &num); + ASSERT_EQ(num, 1); + filterGetMergeRangeRes(h, rs3, re3); + ASSERT_EQ(rs3[0], 1); + ASSERT_EQ(re3[0], 100); + filterFreeMergeRange(h); + + + +} + + +} // namespace + +TEST(testCase, rangeMergeTest) { + intDataTest(); + +} diff --git a/src/query/tests/resultBufferTest.cpp b/src/query/tests/resultBufferTest.cpp deleted file mode 100644 index 54ac0bf4e5..0000000000 --- a/src/query/tests/resultBufferTest.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include -#include - -#include "qResultbuf.h" -#include "taos.h" -#include "tsdb.h" - -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wunused-variable" - -namespace { -// simple test -void simpleTest() { - SDiskbasedResultBuf* pResultBuf = NULL; - int32_t ret = createDiskbasedResultBuffer(&pResultBuf, 1024, 4096, 1); - - int32_t pageId = 0; - int32_t groupId = 0; - - tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId); - ASSERT_TRUE(pBufPage != NULL); - - ASSERT_EQ(getResBufSize(pResultBuf), 1024); - - SIDList list = getDataBufPagesIdList(pResultBuf, groupId); - ASSERT_EQ(taosArrayGetSize(list), 1); - ASSERT_EQ(getNumOfResultBufGroupId(pResultBuf), 1); - - releaseResBufPage(pResultBuf, pBufPage); - - tFilePage* pBufPage1 = getNewDataBuf(pResultBuf, groupId, &pageId); - - tFilePage* t = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t == pBufPage1); - - tFilePage* pBufPage2 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t1 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t1 == pBufPage2); - - tFilePage* pBufPage3 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t2 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t2 == pBufPage3); - - tFilePage* pBufPage4 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t3 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t3 == pBufPage4); - - tFilePage* pBufPage5 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t4 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t4 == pBufPage5); - - destroyResultBuf(pResultBuf); -} - -void writeDownTest() { - SDiskbasedResultBuf* pResultBuf = NULL; - int32_t ret = createDiskbasedResultBuffer(&pResultBuf, 1024, 4*1024, 1); - - int32_t pageId = 0; - int32_t writePageId = 0; - int32_t groupId = 0; - int32_t nx = 12345; - - tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId); - ASSERT_TRUE(pBufPage != NULL); - - *(int32_t*)(pBufPage->data) = nx; - writePageId = pageId; - releaseResBufPage(pResultBuf, pBufPage); - - tFilePage* pBufPage1 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t1 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t1 == pBufPage1); - ASSERT_TRUE(pageId == 1); - - tFilePage* pBufPage2 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t2 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t2 == pBufPage2); - ASSERT_TRUE(pageId == 2); - - tFilePage* pBufPage3 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t3 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t3 == pBufPage3); - ASSERT_TRUE(pageId == 3); - - tFilePage* pBufPage4 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t4 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t4 == pBufPage4); - ASSERT_TRUE(pageId == 4); - releaseResBufPage(pResultBuf, t4); - - // flush the written page to disk, and read it out again - tFilePage* pBufPagex = getResBufPage(pResultBuf, writePageId); - ASSERT_EQ(*(int32_t*)pBufPagex->data, nx); - - SArray* pa = getDataBufPagesIdList(pResultBuf, groupId); - ASSERT_EQ(taosArrayGetSize(pa), 5); - - destroyResultBuf(pResultBuf); -} - -void recyclePageTest() { - SDiskbasedResultBuf* pResultBuf = NULL; - int32_t ret = createDiskbasedResultBuffer(&pResultBuf, 1024, 4*1024, 1); - - int32_t pageId = 0; - int32_t writePageId = 0; - int32_t groupId = 0; - int32_t nx = 12345; - - tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId); - ASSERT_TRUE(pBufPage != NULL); - releaseResBufPage(pResultBuf, pBufPage); - - tFilePage* pBufPage1 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t1 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t1 == pBufPage1); - ASSERT_TRUE(pageId == 1); - - tFilePage* pBufPage2 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t2 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t2 == pBufPage2); - ASSERT_TRUE(pageId == 2); - - tFilePage* pBufPage3 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t3 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t3 == pBufPage3); - ASSERT_TRUE(pageId == 3); - - tFilePage* pBufPage4 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t4 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t4 == pBufPage4); - ASSERT_TRUE(pageId == 4); - releaseResBufPage(pResultBuf, t4); - - tFilePage* pBufPage5 = getNewDataBuf(pResultBuf, groupId, &pageId); - tFilePage* t5 = getResBufPage(pResultBuf, pageId); - ASSERT_TRUE(t5 == pBufPage5); - ASSERT_TRUE(pageId == 5); - - // flush the written page to disk, and read it out again - tFilePage* pBufPagex = getResBufPage(pResultBuf, writePageId); - *(int32_t*)(pBufPagex->data) = nx; - writePageId = pageId; // update the data - releaseResBufPage(pResultBuf, pBufPagex); - - tFilePage* pBufPagex1 = getResBufPage(pResultBuf, 1); - - SArray* pa = getDataBufPagesIdList(pResultBuf, groupId); - ASSERT_EQ(taosArrayGetSize(pa), 6); - - destroyResultBuf(pResultBuf); -} -} // namespace - - -TEST(testCase, resultBufferTest) { - srand(time(NULL)); - simpleTest(); - writeDownTest(); - recyclePageTest(); -} diff --git a/src/query/tests/tsBufTest.cpp b/src/query/tests/tsBufTest.cpp deleted file mode 100644 index 04c5a15252..0000000000 --- a/src/query/tests/tsBufTest.cpp +++ /dev/null @@ -1,515 +0,0 @@ -#include "os.h" -#include -#include -#include - -#include "qTsbuf.h" -#include "taos.h" -#include "tsdb.h" -#include "ttoken.h" -#include "tutil.h" - -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wunused-variable" -#pragma GCC diagnostic ignored "-Wunused-but-set-variable" - -namespace { -/** - * - * @param num total number - * @param step gap between two consecutive ts - * @return - */ -int64_t* createTsList(int32_t num, int64_t start, int32_t step) { - int64_t* pList = (int64_t*)malloc(num * sizeof(int64_t)); - - for (int64_t i = 0; i < num; ++i) { - pList[i] = start + i * step; - } - - return pList; -} - -// simple test -void simpleTest() { - STSBuf* pTSBuf = tsBufCreate(true, TSDB_ORDER_ASC); - - // write 10 ts points - int32_t num = 10; - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - t.i64 = 1; - - int64_t* list = createTsList(10, 10000000, 30); - tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t)); - EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC); - - EXPECT_EQ(pTSBuf->tsData.len, sizeof(int64_t) * num); - EXPECT_EQ(tVariantCompare(&pTSBuf->block.tag, &t), 0); - EXPECT_EQ(pTSBuf->numOfGroups, 1); - - tsBufFlush(pTSBuf); - EXPECT_EQ(pTSBuf->tsData.len, 0); - EXPECT_EQ(pTSBuf->block.numOfElem, num); - - tsBufDestroy(pTSBuf); - - free(list); -} - -// one large list of ts, the ts list need to be split into several small blocks -void largeTSTest() { - STSBuf* pTSBuf = tsBufCreate(true, TSDB_ORDER_ASC); - - // write 10 ts points - int32_t num = 1000000; - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - t.i64 = 1; - - int64_t* list = createTsList(num, 10000000, 30); - tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t)); - - // the data has been flush to disk, no data in cache - EXPECT_EQ(pTSBuf->tsData.len, 0); - EXPECT_EQ(tVariantCompare(&pTSBuf->block.tag, &t), 0); - EXPECT_EQ(pTSBuf->numOfGroups, 1); - EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC); - - tsBufFlush(pTSBuf); - EXPECT_EQ(pTSBuf->tsData.len, 0); - EXPECT_EQ(pTSBuf->block.numOfElem, num); - - tsBufDestroy(pTSBuf); - free(list); -} - -void multiTagsTest() { - STSBuf* pTSBuf = tsBufCreate(true, TSDB_ORDER_ASC); - - int32_t num = 10000; - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - - int64_t start = 10000000; - int32_t numOfTags = 50; - int32_t step = 30; - - for (int32_t i = 0; i < numOfTags; ++i) { - int64_t* list = createTsList(num, start, step); - t.i64 = i; - - tsBufAppend(pTSBuf, 0, &t, (const char*)list, num * sizeof(int64_t)); - free(list); - - start += step * num; - } - - EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC); - EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t)); - - EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1); - EXPECT_EQ(pTSBuf->numOfGroups, 1); - - tsBufFlush(pTSBuf); - EXPECT_EQ(pTSBuf->tsData.len, 0); - EXPECT_EQ(pTSBuf->block.numOfElem, num); - - tsBufDestroy(pTSBuf); -} - -void multiVnodeTagsTest() { - STSBuf* pTSBuf = tsBufCreate(true, TSDB_ORDER_ASC); - - int32_t num = 10000; - int64_t start = 10000000; - int32_t numOfTags = 50; - int32_t step = 30; - - // 2000 vnodes - for (int32_t j = 0; j < 20; ++j) { - // vnodeId:0 - start = 10000000; - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - - for (int32_t i = 0; i < numOfTags; ++i) { - int64_t* list = createTsList(num, start, step); - t.i64 = i; - - tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t)); - free(list); - - start += step * num; - } - - EXPECT_EQ(pTSBuf->numOfGroups, j + 1); - } - - EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC); - EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t)); - EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1); - - EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t)); - - EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1); - - tsBufFlush(pTSBuf); - EXPECT_EQ(pTSBuf->tsData.len, 0); - EXPECT_EQ(pTSBuf->block.numOfElem, num); - - tsBufDestroy(pTSBuf); -} - -void loadDataTest() { - STSBuf* pTSBuf = tsBufCreate(true, TSDB_ORDER_ASC); - - int32_t num = 10000; - int64_t oldStart = 10000000; - int32_t numOfTags = 50; - int32_t step = 30; - int32_t numOfVnode = 200; - - // 10000 vnodes - for (int32_t j = 0; j < numOfVnode; ++j) { - // vnodeId:0 - int64_t start = 10000000; - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - - for (int32_t i = 0; i < numOfTags; ++i) { - int64_t* list = createTsList(num, start, step); - t.i64 = i; - - tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t)); - printf("%d - %" PRIu64 "\n", i, list[0]); - - free(list); - start += step * num; - } - - EXPECT_EQ(pTSBuf->numOfGroups, j + 1); - } - - EXPECT_EQ(pTSBuf->tsOrder, TSDB_ORDER_ASC); - - EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t)); - EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1); - - EXPECT_EQ(pTSBuf->tsData.len, num * sizeof(int64_t)); - - EXPECT_EQ(pTSBuf->block.tag.i64, numOfTags - 1); - - tsBufFlush(pTSBuf); - EXPECT_EQ(pTSBuf->tsData.len, 0); - EXPECT_EQ(pTSBuf->block.numOfElem, num); - - // create from exists file - STSBuf* pNewBuf = tsBufCreateFromFile(pTSBuf->path, false); - EXPECT_EQ(pNewBuf->tsOrder, pTSBuf->tsOrder); - EXPECT_EQ(pNewBuf->numOfGroups, numOfVnode); - EXPECT_EQ(pNewBuf->fileSize, pTSBuf->fileSize); - - EXPECT_EQ(pNewBuf->pData[0].info.offset, pTSBuf->pData[0].info.offset); - EXPECT_EQ(pNewBuf->pData[0].info.numOfBlocks, pTSBuf->pData[0].info.numOfBlocks); - EXPECT_EQ(pNewBuf->pData[0].info.compLen, pTSBuf->pData[0].info.compLen); - - EXPECT_STREQ(pNewBuf->path, pTSBuf->path); - - tsBufResetPos(pNewBuf); - - int64_t s = taosGetTimestampUs(); - printf("start:%" PRIu64 "\n", s); - - int32_t x = 0; - while (tsBufNextPos(pNewBuf)) { - STSElem elem = tsBufGetElem(pNewBuf); - if (++x == 100000000) { - break; - } - - // printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.vnode, elem.tag, elem.ts); - } - - int64_t e = taosGetTimestampUs(); - printf("end:%" PRIu64 ", elapsed:%" PRIu64 ", total obj:%d\n", e, e - s, x); - tsBufDestroy(pTSBuf); - tsBufDestroy(pNewBuf); -} - -void randomIncTsTest() {} - -void TSTraverse() { - // 10000 vnodes - int32_t num = 200000; - int64_t oldStart = 10000000; - int32_t numOfTags = 3; - int32_t step = 30; - int32_t numOfVnode = 2; - - STSBuf* pTSBuf = tsBufCreate(true, TSDB_ORDER_ASC); - - for (int32_t j = 0; j < numOfVnode; ++j) { - // vnodeId:0 - int64_t start = 10000000; - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - - for (int32_t i = 0; i < numOfTags; ++i) { - int64_t* list = createTsList(num, start, step); - t.i64 = i; - - tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t)); - printf("%d - %d - %" PRIu64 ", %" PRIu64 "\n", j, i, list[0], list[num - 1]); - - free(list); - start += step * num; - - list = createTsList(num, start, step); - tsBufAppend(pTSBuf, j, &t, (const char*)list, num * sizeof(int64_t)); - printf("%d - %d - %" PRIu64 ", %" PRIu64 "\n", j, i, list[0], list[num - 1]); - free(list); - - start += step * num; - } - - EXPECT_EQ(pTSBuf->numOfGroups, j + 1); - } - - tsBufResetPos(pTSBuf); - - //////////////////////////////////////////////////////////////////////////////////////// - // reverse traverse - int64_t s = taosGetTimestampUs(); - printf("start:%" PRIu64 "\n", s); - - pTSBuf->cur.order = TSDB_ORDER_DESC; - - // complete reverse traverse - int32_t x = 0; - while (tsBufNextPos(pTSBuf)) { - STSElem elem = tsBufGetElem(pTSBuf); - // printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.vnode, elem.tag, elem.ts); - } - - // specify the data block with vnode and tags value - tsBufResetPos(pTSBuf); - pTSBuf->cur.order = TSDB_ORDER_DESC; - - int32_t startVnode = 1; - int32_t startTag = 2; - - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - t.i64 = startTag; - - tsBufGetElemStartPos(pTSBuf, startVnode, &t); - - int32_t totalOutput = 10; - while (1) { - STSElem elem = tsBufGetElem(pTSBuf); - printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64, elem.ts); - - if (!tsBufNextPos(pTSBuf)) { - break; - } - - if (--totalOutput <= 0) { - totalOutput = 10; - - startTag -= 1; - t.i64 = startTag; - tsBufGetElemStartPos(pTSBuf, startVnode, &t); - - if (startTag == 0) { - startVnode -= 1; - startTag = 3; - } - - if (startVnode < 0) { - break; - } - } - } - - ///////////////////////////////////////////////////////////////////////////////// - // traverse - pTSBuf->cur.order = TSDB_ORDER_ASC; - tsBufResetPos(pTSBuf); - - // complete forwards traverse - while (tsBufNextPos(pTSBuf)) { - STSElem elem = tsBufGetElem(pTSBuf); - // printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.vnode, elem.tag, elem.ts); - } - - // specify the data block with vnode and tags value - tsBufResetPos(pTSBuf); - pTSBuf->cur.order = TSDB_ORDER_ASC; - - startVnode = 1; - startTag = 2; - t.i64 = startTag; - - tsBufGetElemStartPos(pTSBuf, startVnode, &t); - - totalOutput = 10; - while (1) { - STSElem elem = tsBufGetElem(pTSBuf); - printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64, elem.ts); - - if (!tsBufNextPos(pTSBuf)) { - break; - } - - if (--totalOutput <= 0) { - totalOutput = 10; - - startTag -= 1; - t.i64 = startTag; - tsBufGetElemStartPos(pTSBuf, startVnode, &t); - - if (startTag < 0) { - startVnode -= 1; - startTag = 3; - } - - if (startVnode < 0) { - break; - } - } - } - - tsBufDestroy(pTSBuf); -} - -void performanceTest() {} - -void emptyTagTest() {} - -void invalidFileTest() { - const char* cmd = "touch /tmp/test"; - - // create empty file - system(cmd); - - STSBuf* pNewBuf = tsBufCreateFromFile("/tmp/test", true); - EXPECT_TRUE(pNewBuf == NULL); - tsBufDestroy(pNewBuf); - - pNewBuf = tsBufCreateFromFile("/tmp/911", true); - EXPECT_TRUE(pNewBuf == NULL); - - tsBufDestroy(pNewBuf); -} - -void mergeDiffVnodeBufferTest() { - STSBuf* pTSBuf1 = tsBufCreate(true, TSDB_ORDER_ASC); - STSBuf* pTSBuf2 = tsBufCreate(true, TSDB_ORDER_ASC); - - int32_t step = 30; - int32_t num = 1000; - int32_t numOfTags = 10; - - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - - // vnodeId:0 - int64_t start = 10000000; - for (int32_t i = 0; i < numOfTags; ++i) { - int64_t* list = createTsList(num, start, step); - t.i64 = i; - - tsBufAppend(pTSBuf1, 1, &t, (const char*)list, num * sizeof(int64_t)); - tsBufAppend(pTSBuf2, 9, &t, (const char*)list, num * sizeof(int64_t)); - - free(list); - - start += step * num; - } - - tsBufFlush(pTSBuf2); - - tsBufMerge(pTSBuf1, pTSBuf2); - EXPECT_EQ(pTSBuf1->numOfGroups, 2); - EXPECT_EQ(pTSBuf1->numOfTotal, numOfTags * 2 * num); - - tsBufDisplay(pTSBuf1); - - tsBufDestroy(pTSBuf2); - tsBufDestroy(pTSBuf1); -} - -void mergeIdenticalVnodeBufferTest() { - STSBuf* pTSBuf1 = tsBufCreate(true, TSDB_ORDER_ASC); - STSBuf* pTSBuf2 = tsBufCreate(true, TSDB_ORDER_ASC); - - tVariant t = {0}; - t.nType = TSDB_DATA_TYPE_BIGINT; - - int32_t step = 30; - int32_t num = 1000; - int32_t numOfTags = 10; - - // vnodeId:0 - int64_t start = 10000000; - for (int32_t i = 0; i < numOfTags; ++i) { - int64_t* list = createTsList(num, start, step); - t.i64 = i; - - tsBufAppend(pTSBuf1, 12, &t, (const char*)list, num * sizeof(int64_t)); - free(list); - - start += step * num; - } - - for (int32_t i = numOfTags; i < numOfTags * 2; ++i) { - int64_t* list = createTsList(num, start, step); - - t.i64 = i; - tsBufAppend(pTSBuf2, 77, &t, (const char*)list, num * sizeof(int64_t)); - free(list); - - start += step * num; - } - - tsBufFlush(pTSBuf2); - - tsBufMerge(pTSBuf1, pTSBuf2); - EXPECT_EQ(pTSBuf1->numOfGroups, 2); - EXPECT_EQ(pTSBuf1->numOfTotal, numOfTags * 2 * num); - - tsBufResetPos(pTSBuf1); - - int32_t count = 0; - while (tsBufNextPos(pTSBuf1)) { - STSElem elem = tsBufGetElem(pTSBuf1); - - if (count++ < numOfTags * num) { - EXPECT_EQ(elem.id, 12); - } else { - EXPECT_EQ(elem.id, 77); - } - - printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.id, elem.tag->i64, elem.ts); - } - - tsBufDestroy(pTSBuf1); - tsBufDestroy(pTSBuf2); -} -} // namespace - - -//TODO add binary tag value test case -TEST(testCase, tsBufTest) { - simpleTest(); - largeTSTest(); - multiTagsTest(); - multiVnodeTagsTest(); - loadDataTest(); - invalidFileTest(); -// randomIncTsTest(); - TSTraverse(); - mergeDiffVnodeBufferTest(); - mergeIdenticalVnodeBufferTest(); -} diff --git a/tests/script/general/parser/condition.sim b/tests/script/general/parser/condition.sim index 1da93c8761..62d1fc03fa 100644 --- a/tests/script/general/parser/condition.sim +++ b/tests/script/general/parser/condition.sim @@ -103,6 +103,8 @@ sql_error select * from stb1 where c7 < 'nuLl'; sql_error select * from stb1 where c8 < 'nuLl'; sql_error select * from stb1 where c9 > 'nuLl'; sql_error select * from (select * from stb1 where c7=true) a, (select * from stb1 where c1 > 30) b; +sql_error select a.ts,a.c1,a.c8 from (select * from stb1 where c7=true) a, (select * from stb1 where c1 > 30) b where a.ts=b.ts and a.c1 > 50 or b.c1 < 60; +sql_error select a.ts,a.c1,a.c8 from (select * from stb1 where c7=true) a, (select * from stb1 where c1 > 30) b where a.ts=b.ts and ((a.c1 > 50 and a.c1 < 60) or (b.c2 > 60)); sql select * from stb1 where c2 > 3.0 or c2 < 60; if $rows != 28 then @@ -1487,10 +1489,37 @@ if $data10 != @21-05-05 18:19:21.000@ then return -1 endi -sql_error select a.ts,a.c1,a.c8 from (select * from stb1 where c7=true) a, (select * from stb1 where c1 > 30) b where a.ts=b.ts and a.c1 > 50 or b.c1 < 60; -sql_error select a.ts,a.c1,a.c8 from (select * from stb1 where c7=true) a, (select * from stb1 where c1 > 30) b where a.ts=b.ts and ((a.c1 > 50 and a.c1 < 60) or (b.c2 > 60)); +sql select a.ts,b.ts,a.c1,b.u1,b.u2 from (select * from stb1) a, (select * from stb2) b where a.ts=b.ts and (a.c1 < 10 or a.c1 > 30) and (b.u1 < 5 or b.u1 > 5); +if $rows != 4 then + return -1 +endi +if $data00 != @21-05-05 18:19:00.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:02.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:12.000@ then + return -1 +endi +if $data30 != @21-05-05 18:19:14.000@ then + return -1 +endi + +sql select a.ts,b.ts,a.c1,b.u1,b.u2 from (select * from stb1) a, (select * from stb2) b where a.ts=b.ts and a.c1 < 30 and b.u1 > 1 and a.c1 > 10 and b.u1 < 8 and b.u1<>5; +if $rows != 3 then + return -1 +endi +if $data00 != @21-05-05 18:19:04.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:06.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:10.000@ then + return -1 +endi -#!!!!!!!!!!!select a.* from (select * from tb1) a, (select * from tb2) b where a.ts = b.ts and a.f1 > 0 and b.f1 > 0; print "ts test" @@ -1639,7 +1668,84 @@ if $data10 != @21-05-05 18:19:03.000@ then return -1 endi +sql select a.ts,b.ts,a.c1,b.u1,b.u2 from (select * from stb1) a, (select * from stb2) b where a.ts=b.ts and (a.ts < '2021-05-05 18:19:03.000' or a.ts >= '2021-05-05 18:19:13.000') and (b.ts >= '2021-05-05 18:19:01.000' and b.ts <= '2021-05-05 18:19:14.000'); +if $rows != 4 then + return -1 +endi +if $data00 != @21-05-05 18:19:01.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:02.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:13.000@ then + return -1 +endi +if $data30 != @21-05-05 18:19:14.000@ then + return -1 +endi + +sql select a.ts,c.ts,b.c1,c.u1,c.u2 from (select * from stb1) a, (select * from stb1) b, (select * from stb2) c where a.ts=b.ts and b.ts=c.ts and a.ts <= '2021-05-05 18:19:12.000' and b.ts >= '2021-05-05 18:19:06.000' and c.ts >= '2021-05-05 18:19:08.000' and c.ts <= '2021-05-05 18:19:11.000' and a.ts != '2021-05-05 18:19:10.000'; +if $rows != 3 then + return -1 +endi +if $data00 != @21-05-05 18:19:08.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:09.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:11.000@ then + return -1 +endi + +sql select ts,c1,c2,c8 from (select * from stb1) where (ts <= '2021-05-05 18:19:06.000' or ts >= '2021-05-05 18:19:13.000') and (ts >= '2021-05-05 18:19:02.000' and ts <= '2021-05-05 18:19:14.000') and ts != '2021-05-05 18:19:04.000'; +if $rows != 6 then + return -1 +endi +if $data00 != @21-05-05 18:19:02.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:03.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:05.000@ then + return -1 +endi +if $data30 != @21-05-05 18:19:06.000@ then + return -1 +endi +if $data40 != @21-05-05 18:19:13.000@ then + return -1 +endi +if $data50 != @21-05-05 18:19:14.000@ then + return -1 +endi + print "tbname test" +sql_error select * from stb1 where tbname like '%3' and tbname like '%4'; + +sql select * from stb1 where tbname like 'tb%'; +if $rows != 29 then + return -1 +endi + +sql select * from stb1 where tbname like '%2'; +if $rows != 4 then + return -1 +endi +if $data00 != @21-05-05 18:19:08.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:09.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:10.000@ then + return -1 +endi +if $data30 != @21-05-05 18:19:11.000@ then + return -1 +endi print "tag test" sql select * from stb1 where t1 in (1,2) and t1 in (2,3); @@ -1665,16 +1771,44 @@ if $rows != 0 then endi print "join test" - - +sql_error select * from tb1, tb2_1 where tb1.ts=tb2_1.ts or tb1.ts =tb2_1.ts; +sql select tb1.ts from tb1, tb2_1 where tb1.ts=tb2_1.ts and tb1.ts > '2021-05-05 18:19:03.000' and tb2_1.ts < '2021-05-05 18:19:06.000'; +if $rows != 2 then + return -1 +endi +if $data00 != @21-05-05 18:19:04.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:05.000@ then + return -1 +endi print "column&ts test" sql_error select count(*) from stb1 where ts > 0 or c1 > 0; +sql select * from stb1 where ts > '2021-05-05 18:19:03.000' and ts < '2021-05-05 18:19:20.000' and (c1 > 23 or c1 < 14) and c7 in (true) and c8 like '%2'; +if $rows != 3 then + return -1 +endi +if $data00 != @21-05-05 18:19:05.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:13.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:17.000@ then + return -1 +endi print "column&tbname test" sql_error select count(*) from stb1 where tbname like 'tb%' or c1 > 0; - +sql select * from stb1 where tbname like '%3' and c6 < 34 and c5 != 33 and c4 > 31; +if $rows != 1 then + return -1 +endi +if $data00 != @21-05-05 18:19:13.000@ then + return -1 +endi print "column&tag test" sql_error select * from stb1 where t1 > 0 or c1 > 0 @@ -1687,7 +1821,7 @@ sql_error select * from stb1 where c1 > 0 or t1 > 0 and c1 > 1 sql_error select * from stb1 where t1 > 0 or t1 > 0 and c1 > 1 sql_error select * from stb1 where (c1 > 0 and t1 > 0 ) or (t1 > 1 and c1 > 3) sql_error select * from stb1 where (c1 > 0 and t1 > 0 ) or t1 > 1 - +sql_error select a.ts,b.ts,a.c1,b.u1,b.u2 from (select * from stb1) a, (select * from stb2) b where a.ts=b.ts and a.t1=b.t1; sql select * from stb1 where c1 < 63 and t1 > 5 if $rows != 2 then @@ -1726,6 +1860,8 @@ endi print "column&join test" +sql_error select tb1.ts,tb1.c1,tb2_1.u1 from tb1, tb2_1 where tb1.ts=tb2_1.ts or tb1.c1 > 0; + print "ts&tbname test" sql_error select count(*) from stb1 where ts > 0 or tbname like 'tb%'; @@ -1743,9 +1879,29 @@ endi if $data10 != @21-05-05 18:19:12.000@ then return -1 endi + print "ts&join test" +sql_error select tb1.ts,tb1.c1,tb2_1.u1 from tb1, tb2_1 where tb1.ts=tb2_1.ts or tb1.ts > 0; +sql select tb1.ts,tb1.c1,tb2_1.u1 from tb1, tb2_1 where tb1.ts=tb2_1.ts and (tb1.ts > '2021-05-05 18:19:05.000' or tb1.ts < '2021-05-05 18:19:03.000' or tb1.ts > 0); + print "tbname&tag test" +sql select * from stb1 where tbname like 'tb%' and (t1=1 or t2=2 or t3=3) and t1 > 2; +if $rows != 4 then + return -1 +endi +if $data00 != @21-05-05 18:19:12.000@ then + return -1 +endi +if $data10 != @21-05-05 18:19:13.000@ then + return -1 +endi +if $data20 != @21-05-05 18:19:14.000@ then + return -1 +endi +if $data30 != @21-05-05 18:19:15.000@ then + return -1 +endi print "tbname&join test" diff --git a/tests/script/test.sh b/tests/script/test.sh index a092a38a2d..d580924c63 100755 --- a/tests/script/test.sh +++ b/tests/script/test.sh @@ -113,6 +113,7 @@ echo "rpcDebugFlag 143" >> $TAOS_CFG echo "tmrDebugFlag 131" >> $TAOS_CFG echo "cDebugFlag 143" >> $TAOS_CFG echo "udebugFlag 143" >> $TAOS_CFG +echo "debugFlag 143" >> $TAOS_CFG echo "wal 0" >> $TAOS_CFG echo "asyncLog 0" >> $TAOS_CFG echo "locale en_US.UTF-8" >> $TAOS_CFG