From b02219027916e9f55f8564c78f2723f465112943 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Jul 2021 03:27:58 +0800 Subject: [PATCH 01/13] [TD-5664] add more state of compact --- src/inc/tsdb.h | 2 +- src/tsdb/inc/tsdbint.h | 4 ++-- src/tsdb/src/tsdbCompact.c | 8 +++++--- src/tsdb/src/tsdbMain.c | 4 ++-- src/vnode/src/vnodeMgmt.c | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h index 79d9029dbc..7880dc43b2 100644 --- a/src/inc/tsdb.h +++ b/src/inc/tsdb.h @@ -94,7 +94,7 @@ STsdbRepo *tsdbOpenRepo(STsdbCfg *pCfg, STsdbAppH *pAppH); int tsdbCloseRepo(STsdbRepo *repo, int toCommit); int32_t tsdbConfigRepo(STsdbRepo *repo, STsdbCfg *pCfg); int tsdbGetState(STsdbRepo *repo); -bool tsdbInCompact(STsdbRepo *repo); +int8_t tsdbGetCompactState(STsdbRepo *repo); // --------- TSDB TABLE DEFINITION typedef struct { uint64_t uid; // the unique table ID diff --git a/src/tsdb/inc/tsdbint.h b/src/tsdb/inc/tsdbint.h index dd43e39310..84c7ba4e4b 100644 --- a/src/tsdb/inc/tsdbint.h +++ b/src/tsdb/inc/tsdbint.h @@ -92,7 +92,7 @@ struct STsdbRepo { pthread_mutex_t mutex; bool repoLocked; int32_t code; // Commit code - bool inCompact; // is in compact process? + int8_t compactState; // compact state: inCompact/noCompact/waitingCompact? }; #define REPO_ID(r) (r)->config.tsdbId @@ -139,4 +139,4 @@ static FORCE_INLINE int tsdbGetNextMaxTables(int tid) { } #endif -#endif /* _TD_TSDB_INT_H_ */ \ No newline at end of file +#endif /* _TD_TSDB_INT_H_ */ diff --git a/src/tsdb/src/tsdbCompact.c b/src/tsdb/src/tsdbCompact.c index 5211ee3c61..a85fdc25c5 100644 --- a/src/tsdb/src/tsdbCompact.c +++ b/src/tsdb/src/tsdbCompact.c @@ -58,6 +58,7 @@ static int tsdbCompactFSetImpl(SCompactH *pComph); static int tsdbWriteBlockToRightFile(SCompactH *pComph, STable *pTable, SDataCols *pDataCols, void **ppBuf, void **ppCBuf); +enum {TSDB_NO_COMPACT, TSDB_IN_COMPACT, TSDB_WAITING_COMPACT}; int tsdbCompact(STsdbRepo *pRepo) { return tsdbAsyncCompact(pRepo); } void *tsdbCompactImpl(STsdbRepo *pRepo) { @@ -89,16 +90,17 @@ _err: } static int tsdbAsyncCompact(STsdbRepo *pRepo) { + pRepo->compactState = TSDB_WAITING_COMPACT; tsem_wait(&(pRepo->readyToCommit)); return tsdbScheduleCommit(pRepo, COMPACT_REQ); } static void tsdbStartCompact(STsdbRepo *pRepo) { - ASSERT(!pRepo->inCompact); + assert(pRepo->compactState != TSDB_IN_COMPACT); tsdbInfo("vgId:%d start to compact!", REPO_ID(pRepo)); tsdbStartFSTxn(pRepo, 0, 0); pRepo->code = TSDB_CODE_SUCCESS; - pRepo->inCompact = true; + pRepo->compactState = TSDB_IN_COMPACT; } static void tsdbEndCompact(STsdbRepo *pRepo, int eno) { @@ -107,7 +109,7 @@ static void tsdbEndCompact(STsdbRepo *pRepo, int eno) { } else { tsdbEndFSTxn(pRepo); } - pRepo->inCompact = false; + pRepo->compactState = TSDB_NO_COMPACT; tsdbInfo("vgId:%d compact over, %s", REPO_ID(pRepo), (eno == TSDB_CODE_SUCCESS) ? "succeed" : "failed"); tsem_post(&(pRepo->readyToCommit)); } diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c index f3a7c4b7ee..44460a7db3 100644 --- a/src/tsdb/src/tsdbMain.c +++ b/src/tsdb/src/tsdbMain.c @@ -197,7 +197,7 @@ STsdbRepoInfo *tsdbGetStatus(STsdbRepo *pRepo) { return NULL; } int tsdbGetState(STsdbRepo *repo) { return repo->state; } -bool tsdbInCompact(STsdbRepo *repo) { return repo->inCompact; } +int8_t tsdbGetCompactState(STsdbRepo *repo) { return (int8_t)(repo->compactState); } void tsdbReportStat(void *repo, int64_t *totalPoints, int64_t *totalStorage, int64_t *compStorage) { ASSERT(repo != NULL); @@ -537,7 +537,7 @@ static STsdbRepo *tsdbNewRepo(STsdbCfg *pCfg, STsdbAppH *pAppH) { pRepo->state = TSDB_STATE_OK; pRepo->code = TSDB_CODE_SUCCESS; - pRepo->inCompact = false; + pRepo->compactState = 0; pRepo->config = *pCfg; if (pAppH) { pRepo->appH = *pAppH; diff --git a/src/vnode/src/vnodeMgmt.c b/src/vnode/src/vnodeMgmt.c index e14b5a385e..7e427988b5 100644 --- a/src/vnode/src/vnodeMgmt.c +++ b/src/vnode/src/vnodeMgmt.c @@ -160,7 +160,7 @@ static void vnodeBuildVloadMsg(SVnodeObj *pVnode, SStatusMsg *pStatus) { pLoad->status = pVnode->status; pLoad->role = pVnode->role; pLoad->replica = pVnode->syncCfg.replica; - pLoad->compact = (pVnode->tsdb != NULL) && tsdbInCompact(pVnode->tsdb) ? 1 : 0; + pLoad->compact = (pVnode->tsdb != NULL) ? tsdbGetCompactState(pVnode->tsdb) : 0; } int32_t vnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes) { From f25a01f83a2d4277c2adfb37cfa5b6f838d60573 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Jul 2021 05:00:30 +0800 Subject: [PATCH 02/13] [TD-5664] add more state of compact --- src/tsdb/src/tsdbCompact.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tsdb/src/tsdbCompact.c b/src/tsdb/src/tsdbCompact.c index 6ff0693d46..98888924ec 100644 --- a/src/tsdb/src/tsdbCompact.c +++ b/src/tsdb/src/tsdbCompact.c @@ -90,6 +90,10 @@ _err: } static int tsdbAsyncCompact(STsdbRepo *pRepo) { + if (pRepo->compactState != TSDB_NO_COMPACT) { + tsdbInfo("vgId:%d not compact tsdb again", REPO_ID(pRepo)); + return 0; + } pRepo->compactState = TSDB_WAITING_COMPACT; tsem_wait(&(pRepo->readyToCommit)); return tsdbScheduleCommit(pRepo, COMPACT_REQ); From 95f304e4762064d24cb3964c84d86517694f3b69 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 29 Jul 2021 11:49:18 +0800 Subject: [PATCH 03/13] [TD-5664] add more state of compact --- src/tsdb/src/tsdbCompact.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tsdb/src/tsdbCompact.c b/src/tsdb/src/tsdbCompact.c index 98888924ec..62f9e41119 100644 --- a/src/tsdb/src/tsdbCompact.c +++ b/src/tsdb/src/tsdbCompact.c @@ -58,7 +58,7 @@ static int tsdbCompactFSetImpl(SCompactH *pComph); static int tsdbWriteBlockToRightFile(SCompactH *pComph, STable *pTable, SDataCols *pDataCols, void **ppBuf, void **ppCBuf); -enum {TSDB_NO_COMPACT, TSDB_IN_COMPACT, TSDB_WAITING_COMPACT}; +enum { TSDB_NO_COMPACT, TSDB_IN_COMPACT, TSDB_WAITING_COMPACT}; int tsdbCompact(STsdbRepo *pRepo) { return tsdbAsyncCompact(pRepo); } void *tsdbCompactImpl(STsdbRepo *pRepo) { @@ -91,7 +91,7 @@ _err: static int tsdbAsyncCompact(STsdbRepo *pRepo) { if (pRepo->compactState != TSDB_NO_COMPACT) { - tsdbInfo("vgId:%d not compact tsdb again", REPO_ID(pRepo)); + tsdbInfo("vgId:%d not compact tsdb again ", REPO_ID(pRepo)); return 0; } pRepo->compactState = TSDB_WAITING_COMPACT; From 86a6a87666d0437ae774595941a3d4bda2a78983 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Mon, 2 Aug 2021 12:57:20 +0800 Subject: [PATCH 04/13] [TD-5618] fix distinct(tbname) error --- src/query/src/qExecutor.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 3f6df2ec07..93a2535d56 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -6661,19 +6661,20 @@ static SSDataBlock* hashDistinct(void* param, bool* newgroup) { if (isNull(val, type)) { continue; } - + char* p = val; size_t keyLen = 0; if (IS_VAR_DATA_TYPE(pOperator->pExpr->base.colType)) { tstr* var = (tstr*)(val); + p = var->data; keyLen = varDataLen(var); } else { keyLen = bytes; } int dummy; - void* res = taosHashGet(pInfo->pSet, val, keyLen); + void* res = taosHashGet(pInfo->pSet, p, keyLen); if (res == NULL) { - taosHashPut(pInfo->pSet, val, keyLen, &dummy, sizeof(dummy)); + taosHashPut(pInfo->pSet, p, keyLen, &dummy, sizeof(dummy)); char* start = pResultColInfoData->pData + bytes * pInfo->pRes->info.rows; memcpy(start, val, bytes); pRes->info.rows += 1; From 3e50aef50c82aa6df4ca0ccff667b0b60516a804 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 2 Aug 2021 13:02:43 +0800 Subject: [PATCH 05/13] [td-3299]: add logic plan support. --- src/client/src/tscParseInsert.c | 5 +- src/client/src/tscSQLParser.c | 26 +++---- src/client/src/tscServer.c | 6 +- src/client/src/tscSubquery.c | 2 + src/client/src/tscUtil.c | 2 +- src/os/inc/osTime.h | 2 +- src/os/src/detail/osTime.c | 8 +-- src/query/inc/sql.y | 2 +- src/query/src/qPlan.c | 72 ++++++++++--------- src/query/src/qSqlParser.c | 3 +- src/query/src/sql.c | 122 ++++++++++++++++---------------- 11 files changed, 124 insertions(+), 126 deletions(-) diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index f24f7a7ecb..2db4c27886 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -84,8 +84,6 @@ int tsParseTime(SStrToken *pToken, int64_t *time, char **next, char *error, int1 int64_t useconds = 0; char * pTokenEnd = *next; - index = 0; - if (pToken->type == TK_NOW) { useconds = taosGetTimestamp(timePrec); } else if (strncmp(pToken->z, "0", 1) == 0 && pToken->n == 1) { @@ -130,7 +128,8 @@ int tsParseTime(SStrToken *pToken, int64_t *time, char **next, char *error, int1 return tscInvalidOperationMsg(error, "value expected in timestamp", sToken.z); } - if (parseAbsoluteDuration(valueToken.z, valueToken.n, &interval, timePrec) != TSDB_CODE_SUCCESS) { + char unit = 0; + if (parseAbsoluteDuration(valueToken.z, valueToken.n, &interval, &unit, timePrec) != TSDB_CODE_SUCCESS) { return TSDB_CODE_TSC_INVALID_OPERATION; } diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index a55b7ca253..b5c310d0db 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1287,35 +1287,31 @@ int32_t parseSlidingClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SStrToken* pSl STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta); + SInterval* pInterval = &pQueryInfo->interval; if (pSliding->n == 0) { - pQueryInfo->interval.slidingUnit = pQueryInfo->interval.intervalUnit; - pQueryInfo->interval.sliding = pQueryInfo->interval.interval; + pInterval->slidingUnit = pInterval->intervalUnit; + pInterval->sliding = pInterval->interval; return TSDB_CODE_SUCCESS; } - if (pQueryInfo->interval.intervalUnit == 'n' || pQueryInfo->interval.intervalUnit == 'y') { + if (pInterval->intervalUnit == 'n' || pInterval->intervalUnit == 'y') { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg3); } - parseAbsoluteDuration(pSliding->z, pSliding->n, &pQueryInfo->interval.sliding, tinfo.precision); + parseAbsoluteDuration(pSliding->z, pSliding->n, &pInterval->sliding, &pInterval->slidingUnit, tinfo.precision); - if (pQueryInfo->interval.sliding < - convertTimePrecision(tsMinSlidingTime, TSDB_TIME_PRECISION_MILLI, tinfo.precision)) { + if (pInterval->sliding < convertTimePrecision(tsMinSlidingTime, TSDB_TIME_PRECISION_MILLI, tinfo.precision)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg0); } - if (pQueryInfo->interval.sliding > pQueryInfo->interval.interval) { + if (pInterval->sliding > pInterval->interval) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg1); } - if ((pQueryInfo->interval.interval != 0) && (pQueryInfo->interval.interval/pQueryInfo->interval.sliding > INTERVAL_SLIDING_FACTOR)) { + if ((pInterval->interval != 0) && (pInterval->interval/pInterval->sliding > INTERVAL_SLIDING_FACTOR)) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); } -// if (pQueryInfo->interval.sliding != pQueryInfo->interval.interval && pSql->pStream == NULL) { -// return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg4); -// } - return TSDB_CODE_SUCCESS; } @@ -8752,13 +8748,13 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf tfree(p); } -#if 0 +//#if 0 SQueryNode* p = qCreateQueryPlan(pQueryInfo); char* s = queryPlanToString(p); + printf("%s\n", s); tfree(s); - qDestroyQueryPlan(p); -#endif +//#endif return TSDB_CODE_SUCCESS; // Does not build query message here } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 0d23d8af20..e4c5c7346f 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -392,10 +392,8 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet) { // single table query error need to be handled here. if ((cmd == TSDB_SQL_SELECT || cmd == TSDB_SQL_UPDATE_TAGS_VAL) && - (((rpcMsg->code == TSDB_CODE_TDB_INVALID_TABLE_ID || - rpcMsg->code == TSDB_CODE_VND_INVALID_VGROUP_ID)) || - rpcMsg->code == TSDB_CODE_RPC_NETWORK_UNAVAIL || - rpcMsg->code == TSDB_CODE_APP_NOT_READY)) { + (((rpcMsg->code == TSDB_CODE_TDB_INVALID_TABLE_ID || rpcMsg->code == TSDB_CODE_VND_INVALID_VGROUP_ID)) || + rpcMsg->code == TSDB_CODE_RPC_NETWORK_UNAVAIL || rpcMsg->code == TSDB_CODE_APP_NOT_READY)) { // 1. super table subquery // 2. nest queries are all not updated the tablemeta and retry parse the sql after cleanup local tablemeta/vgroup id buffer diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 8c20aed350..083903cf2b 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -1635,6 +1635,8 @@ void tscFetchDatablockForSubquery(SSqlObj* pSql) { continue; } + + SSqlRes* pRes1 = &pSql1->res; if (pRes1->row >= pRes1->numOfRows) { subquerySetState(pSql1, &pSql->subState, i, 0); diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index ba7f86f8bc..c5e1e0184f 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -3654,7 +3654,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, __async_cb_func_t if (pQueryInfo->fillType != TSDB_FILL_NONE) { //just make memory memory sanitizer happy - //refator later + //refactor later pNewQueryInfo->fillVal = calloc(1, pQueryInfo->fieldsInfo.numOfOutput * sizeof(int64_t)); if (pNewQueryInfo->fillVal == NULL) { terrno = TSDB_CODE_TSC_OUT_OF_MEMORY; diff --git a/src/os/inc/osTime.h b/src/os/inc/osTime.h index f013a2f7d1..dcb0e4c9b6 100644 --- a/src/os/inc/osTime.h +++ b/src/os/inc/osTime.h @@ -97,7 +97,7 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision); int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precision); int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision); -int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* ts, int32_t timePrecision); +int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* ts, char* unit, int32_t timePrecision); int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit, int32_t timePrecision); int32_t taosParseTime(char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t dayligth); diff --git a/src/os/src/detail/osTime.c b/src/os/src/detail/osTime.c index 847d484d9e..a95d919a83 100644 --- a/src/os/src/detail/osTime.c +++ b/src/os/src/detail/osTime.c @@ -397,7 +397,7 @@ static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t time * n - Months (30 days) * y - Years (365 days) */ -int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* duration, int32_t timePrecision) { +int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* duration, char* unit, int32_t timePrecision) { errno = 0; char* endPtr = NULL; @@ -408,12 +408,12 @@ int32_t parseAbsoluteDuration(char* token, int32_t tokenlen, int64_t* duration, } /* natual month/year are not allowed in absolute duration */ - char unit = token[tokenlen - 1]; - if (unit == 'n' || unit == 'y') { + *unit = token[tokenlen - 1]; + if (*unit == 'n' || *unit == 'y') { return -1; } - return getDuration(timestamp, unit, duration, timePrecision); + return getDuration(timestamp, *unit, duration, timePrecision); } int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* duration, char* unit, int32_t timePrecision) { diff --git a/src/query/inc/sql.y b/src/query/inc/sql.y index ecdde4f707..96f1e680f1 100644 --- a/src/query/inc/sql.y +++ b/src/query/inc/sql.y @@ -479,7 +479,7 @@ tagitem(A) ::= PLUS(X) FLOAT(Y). { //////////////////////// The SELECT statement ///////////////////////////////// %type select {SSqlNode*} %destructor select {destroySqlNode($$);} -select(A) ::= SELECT(T) selcollist(W) from(X) where_opt(Y) interval_opt(K) session_option(H) windowstate_option(D) fill_opt(F) sliding_opt(S) groupby_opt(P) having_opt(N) orderby_opt(Z) slimit_opt(G) limit_opt(L). { +select(A) ::= SELECT(T) selcollist(W) from(X) where_opt(Y) interval_opt(K) sliding_opt(S) session_option(H) windowstate_option(D) fill_opt(F)groupby_opt(P) having_opt(N) orderby_opt(Z) slimit_opt(G) limit_opt(L). { A = tSetQuerySqlNode(&T, W, X, Y, P, Z, &K, &H, &D, &S, F, &L, &G, N); } diff --git a/src/query/src/qPlan.c b/src/query/src/qPlan.c index a94d015e06..42b99852ce 100644 --- a/src/query/src/qPlan.c +++ b/src/query/src/qPlan.c @@ -32,8 +32,8 @@ typedef struct SJoinCond { SColumn *colCond[2]; } SJoinCond; -static SQueryNode* createQueryNode(int32_t type, const char* name, SQueryNode** prev, - int32_t numOfPrev, SExprInfo** pExpr, int32_t numOfOutput, SQueryTableInfo* pTableInfo, +static SQueryNode* createQueryNode(int32_t type, const char* name, SQueryNode** prev, int32_t numOfPrev, + SExprInfo** pExpr, int32_t numOfOutput, SQueryTableInfo* pTableInfo, void* pExtInfo) { SQueryNode* pNode = calloc(1, sizeof(SQueryNode)); @@ -112,8 +112,8 @@ static SQueryNode* doAddTableColumnNode(SQueryInfo* pQueryInfo, STableMetaInfo* } STimeWindow* window = &pQueryInfo->window; - SQueryNode* pNode = createQueryNode(QNODE_TABLESCAN, "TableScan", NULL, 0, NULL, 0, - info, window); + SQueryNode* pNode = createQueryNode(QNODE_TABLESCAN, "TableScan", NULL, 0, NULL, 0, info, window); + if (pQueryInfo->projectionQuery) { int32_t numOfOutput = (int32_t) taosArrayGetSize(pExprs); pNode = createQueryNode(QNODE_PROJECT, "Projection", &pNode, 1, pExprs->pData, numOfOutput, info, NULL); @@ -146,39 +146,41 @@ static SQueryNode* doAddTableColumnNode(SQueryInfo* pQueryInfo, STableMetaInfo* } static SQueryNode* doCreateQueryPlanForOneTableImpl(SQueryInfo* pQueryInfo, SQueryNode* pNode, SQueryTableInfo* info, - SArray* pExprs) { - // check for aggregation - if (pQueryInfo->interval.interval > 0) { - int32_t numOfOutput = (int32_t) taosArrayGetSize(pExprs); + SArray* pExprs) { + // check for aggregation + if (pQueryInfo->interval.interval > 0) { + int32_t numOfOutput = (int32_t)taosArrayGetSize(pExprs); - pNode = createQueryNode(QNODE_TIMEWINDOW, "TimeWindowAgg", &pNode, 1, pExprs->pData, numOfOutput, info, - &pQueryInfo->interval); - } else if (pQueryInfo->groupbyColumn) { - int32_t numOfOutput = (int32_t) taosArrayGetSize(pExprs); - pNode = createQueryNode(QNODE_GROUPBY, "Groupby", &pNode, 1, pExprs->pData, numOfOutput, info, - &pQueryInfo->groupbyExpr); - } else if (pQueryInfo->sessionWindow.gap > 0) { - pNode = createQueryNode(QNODE_SESSIONWINDOW, "SessionWindowAgg", &pNode, 1, NULL, 0, info, NULL); - } else if (pQueryInfo->simpleAgg) { - int32_t numOfOutput = (int32_t) taosArrayGetSize(pExprs); - pNode = createQueryNode(QNODE_AGGREGATE, "Aggregate", &pNode, 1, pExprs->pData, numOfOutput, info, NULL); + pNode = createQueryNode(QNODE_TIMEWINDOW, "TimeWindowAgg", &pNode, 1, pExprs->pData, numOfOutput, info, + &pQueryInfo->interval); + if (pQueryInfo->groupbyExpr.numOfGroupCols != 0) { + pNode = createQueryNode(QNODE_GROUPBY, "Groupby", &pNode, 1, pExprs->pData, numOfOutput, info, &pQueryInfo->groupbyExpr); } + } else if (pQueryInfo->groupbyColumn) { + int32_t numOfOutput = (int32_t)taosArrayGetSize(pExprs); + pNode = createQueryNode(QNODE_GROUPBY, "Groupby", &pNode, 1, pExprs->pData, numOfOutput, info, + &pQueryInfo->groupbyExpr); + } else if (pQueryInfo->sessionWindow.gap > 0) { + pNode = createQueryNode(QNODE_SESSIONWINDOW, "SessionWindowAgg", &pNode, 1, NULL, 0, info, NULL); + } else if (pQueryInfo->simpleAgg) { + int32_t numOfOutput = (int32_t)taosArrayGetSize(pExprs); + pNode = createQueryNode(QNODE_AGGREGATE, "Aggregate", &pNode, 1, pExprs->pData, numOfOutput, info, NULL); + } - if (pQueryInfo->havingFieldNum > 0 || pQueryInfo->arithmeticOnAgg) { - int32_t numOfExpr = (int32_t) taosArrayGetSize(pQueryInfo->exprList1); - pNode = - createQueryNode(QNODE_PROJECT, "Projection", &pNode, 1, pQueryInfo->exprList1->pData, numOfExpr, info, NULL); - } + if (pQueryInfo->havingFieldNum > 0 || pQueryInfo->arithmeticOnAgg) { + int32_t numOfExpr = (int32_t)taosArrayGetSize(pQueryInfo->exprList1); + pNode = + createQueryNode(QNODE_PROJECT, "Projection", &pNode, 1, pQueryInfo->exprList1->pData, numOfExpr, info, NULL); + } - if (pQueryInfo->fillType != TSDB_FILL_NONE) { - SFillEssInfo* pInfo = calloc(1, sizeof(SFillEssInfo)); - pInfo->fillType = pQueryInfo->fillType; - pInfo->val = calloc(pNode->numOfOutput, sizeof(int64_t)); - memcpy(pInfo->val, pQueryInfo->fillVal, pNode->numOfOutput); - - pNode = createQueryNode(QNODE_FILL, "Fill", &pNode, 1, NULL, 0, info, pInfo); - } + if (pQueryInfo->fillType != TSDB_FILL_NONE) { + SFillEssInfo* pInfo = calloc(1, sizeof(SFillEssInfo)); + pInfo->fillType = pQueryInfo->fillType; + pInfo->val = calloc(pNode->numOfOutput, sizeof(int64_t)); + memcpy(pInfo->val, pQueryInfo->fillVal, pNode->numOfOutput); + pNode = createQueryNode(QNODE_FILL, "Fill", &pNode, 1, NULL, 0, info, pInfo); + } if (pQueryInfo->limit.limit != -1 || pQueryInfo->limit.offset != 0) { pNode = createQueryNode(QNODE_LIMIT, "Limit", &pNode, 1, NULL, 0, info, &pQueryInfo->limit); @@ -326,7 +328,7 @@ static int32_t doPrintPlan(char* buf, SQueryNode* pQueryNode, int32_t level, int switch(pQueryNode->info.type) { case QNODE_TABLESCAN: { STimeWindow* win = (STimeWindow*)pQueryNode->pExtInfo; - len1 = sprintf(buf + len, "%s #0x%" PRIx64 ") time_range: %" PRId64 " - %" PRId64 "\n", + len1 = sprintf(buf + len, "%s #%" PRIu64 ") time_range: %" PRId64 " - %" PRId64 "\n", pQueryNode->tableInfo.tableName, pQueryNode->tableInfo.id.uid, win->skey, win->ekey); len += len1; break; @@ -397,8 +399,8 @@ static int32_t doPrintPlan(char* buf, SQueryNode* pQueryNode, int32_t level, int len += len1; SInterval* pInterval = pQueryNode->pExtInfo; - len1 = sprintf(buf + len, "interval:%" PRId64 "(%c), sliding:%" PRId64 "(%c), offset:%" PRId64 "\n", - pInterval->interval, pInterval->intervalUnit, pInterval->sliding, pInterval->slidingUnit, + len1 = sprintf(buf + len, "interval:%" PRId64 "(%s), sliding:%" PRId64 "(%s), offset:%" PRId64 "\n", + pInterval->interval, TSDB_TIME_PRECISION_MILLI_STR, pInterval->sliding, TSDB_TIME_PRECISION_MILLI_STR, pInterval->offset); len += len1; diff --git a/src/query/src/qSqlParser.c b/src/query/src/qSqlParser.c index eb920b3e17..46ae0f3776 100644 --- a/src/query/src/qSqlParser.c +++ b/src/query/src/qSqlParser.c @@ -162,7 +162,8 @@ tSqlExpr *tSqlExprCreateIdValue(SStrToken *pToken, int32_t optrType) { } else if (optrType == TK_VARIABLE) { // use nanosecond by default // TODO set value after getting database precision - int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSqlExpr->value.i64, TSDB_TIME_PRECISION_NANO); + char unit = 0; + int32_t ret = parseAbsoluteDuration(pToken->z, pToken->n, &pSqlExpr->value.i64, &unit, TSDB_TIME_PRECISION_NANO); if (ret != TSDB_CODE_SUCCESS) { terrno = TSDB_CODE_TSC_SQL_SYNTAX_ERROR; } diff --git a/src/query/src/sql.c b/src/query/src/sql.c index 7a9183ac06..dc5123b7fb 100644 --- a/src/query/src/sql.c +++ b/src/query/src/sql.c @@ -257,27 +257,27 @@ static const YYACTIONTYPE yy_action[] = { /* 480 */ 208, 211, 205, 212, 213, 217, 218, 219, 216, 202, /* 490 */ 1143, 1082, 1135, 236, 267, 1079, 1078, 237, 338, 151, /* 500 */ 1035, 1046, 47, 1065, 1043, 149, 1064, 1025, 1028, 1044, - /* 510 */ 274, 1048, 153, 170, 157, 1009, 278, 283, 171, 1007, + /* 510 */ 274, 1048, 153, 170, 158, 1009, 278, 285, 171, 1007, /* 520 */ 172, 233, 166, 280, 161, 757, 160, 173, 162, 922, - /* 530 */ 163, 299, 300, 301, 304, 305, 287, 292, 45, 290, + /* 530 */ 163, 299, 300, 301, 304, 305, 282, 292, 45, 290, /* 540 */ 75, 200, 288, 813, 272, 41, 72, 49, 316, 164, /* 550 */ 916, 323, 1142, 110, 1141, 1138, 286, 179, 330, 1134, - /* 560 */ 284, 116, 1133, 1130, 180, 282, 942, 42, 39, 46, - /* 570 */ 201, 904, 279, 126, 48, 902, 128, 129, 900, 899, + /* 560 */ 284, 116, 1133, 1130, 180, 281, 942, 42, 39, 46, + /* 570 */ 201, 904, 279, 126, 303, 902, 128, 129, 900, 899, /* 580 */ 259, 191, 897, 896, 895, 894, 893, 892, 891, 194, - /* 590 */ 196, 888, 886, 884, 882, 198, 879, 199, 303, 81, - /* 600 */ 86, 348, 281, 1066, 121, 340, 341, 342, 343, 344, + /* 590 */ 196, 888, 886, 884, 882, 198, 879, 199, 48, 81, + /* 600 */ 86, 348, 283, 1066, 121, 340, 341, 342, 343, 344, /* 610 */ 223, 345, 346, 356, 855, 243, 298, 260, 261, 854, /* 620 */ 263, 220, 221, 264, 853, 836, 104, 921, 920, 105, - /* 630 */ 835, 268, 273, 10, 293, 734, 275, 84, 30, 87, - /* 640 */ 898, 890, 182, 943, 186, 181, 184, 140, 183, 187, - /* 650 */ 185, 141, 142, 889, 4, 143, 980, 881, 880, 944, - /* 660 */ 759, 165, 167, 168, 155, 169, 762, 156, 2, 990, - /* 670 */ 88, 235, 764, 89, 285, 31, 768, 158, 11, 12, - /* 680 */ 13, 32, 27, 295, 28, 96, 98, 101, 35, 100, + /* 630 */ 835, 268, 273, 10, 293, 734, 275, 84, 30, 898, + /* 640 */ 890, 183, 182, 943, 187, 181, 184, 185, 2, 140, + /* 650 */ 186, 141, 142, 889, 4, 143, 980, 881, 87, 944, + /* 660 */ 759, 165, 167, 168, 169, 880, 155, 157, 768, 156, + /* 670 */ 235, 762, 88, 89, 990, 764, 287, 31, 11, 32, + /* 680 */ 12, 13, 27, 295, 28, 96, 98, 101, 35, 100, /* 690 */ 632, 36, 102, 667, 665, 664, 663, 661, 660, 659, - /* 700 */ 656, 314, 622, 106, 7, 320, 812, 814, 8, 321, - /* 710 */ 109, 111, 68, 69, 115, 704, 703, 38, 117, 700, + /* 700 */ 656, 314, 622, 106, 7, 320, 812, 321, 8, 109, + /* 710 */ 814, 111, 68, 69, 115, 704, 703, 38, 117, 700, /* 720 */ 648, 646, 638, 644, 640, 642, 636, 634, 670, 669, /* 730 */ 668, 666, 662, 658, 657, 190, 620, 585, 583, 859, /* 740 */ 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, @@ -338,24 +338,24 @@ static const YYCODETYPE yy_lookahead[] = { /* 510 */ 246, 199, 199, 250, 199, 246, 269, 199, 199, 199, /* 520 */ 199, 269, 254, 269, 259, 124, 260, 199, 258, 199, /* 530 */ 257, 199, 199, 199, 199, 199, 269, 130, 199, 134, - /* 540 */ 136, 199, 129, 117, 200, 199, 138, 135, 199, 256, - /* 550 */ 199, 199, 199, 199, 199, 199, 128, 199, 199, 199, - /* 560 */ 127, 199, 199, 199, 199, 126, 199, 199, 199, 199, - /* 570 */ 199, 199, 125, 199, 140, 199, 199, 199, 199, 199, + /* 540 */ 136, 199, 128, 117, 200, 199, 138, 135, 199, 256, + /* 550 */ 199, 199, 199, 199, 199, 199, 127, 199, 199, 199, + /* 560 */ 126, 199, 199, 199, 199, 129, 199, 199, 199, 199, + /* 570 */ 199, 199, 125, 199, 89, 199, 199, 199, 199, 199, /* 580 */ 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, - /* 590 */ 199, 199, 199, 199, 199, 199, 199, 199, 89, 200, + /* 590 */ 199, 199, 199, 199, 199, 199, 199, 199, 140, 200, /* 600 */ 200, 113, 200, 200, 96, 95, 51, 92, 94, 55, /* 610 */ 200, 93, 91, 84, 5, 200, 200, 153, 5, 5, /* 620 */ 153, 200, 200, 5, 5, 100, 206, 210, 210, 206, - /* 630 */ 99, 142, 120, 82, 115, 83, 97, 121, 82, 97, - /* 640 */ 200, 200, 217, 219, 215, 218, 216, 201, 213, 212, - /* 650 */ 214, 201, 201, 200, 202, 201, 237, 200, 200, 221, - /* 660 */ 83, 255, 253, 252, 82, 251, 83, 97, 207, 237, - /* 670 */ 82, 1, 83, 82, 82, 97, 83, 82, 131, 131, - /* 680 */ 82, 97, 82, 115, 82, 116, 78, 71, 87, 86, + /* 630 */ 99, 142, 120, 82, 115, 83, 97, 121, 82, 200, + /* 640 */ 200, 213, 217, 219, 212, 218, 216, 214, 207, 201, + /* 650 */ 215, 201, 201, 200, 202, 201, 237, 200, 97, 221, + /* 660 */ 83, 255, 253, 252, 251, 200, 82, 97, 83, 82, + /* 670 */ 1, 83, 82, 82, 237, 83, 82, 97, 131, 97, + /* 680 */ 131, 82, 82, 115, 82, 116, 78, 71, 87, 86, /* 690 */ 5, 87, 86, 9, 5, 5, 5, 5, 5, 5, - /* 700 */ 5, 15, 85, 78, 82, 24, 83, 117, 82, 59, - /* 710 */ 147, 147, 16, 16, 147, 5, 5, 97, 147, 83, + /* 700 */ 5, 15, 85, 78, 82, 24, 83, 59, 82, 147, + /* 710 */ 117, 147, 16, 16, 147, 5, 5, 97, 147, 83, /* 720 */ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, /* 730 */ 5, 5, 5, 5, 5, 97, 85, 61, 60, 0, /* 740 */ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, @@ -399,9 +399,9 @@ static const unsigned short int yy_shift_ofst[] = { /* 120 */ 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, /* 130 */ 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, /* 140 */ 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, - /* 150 */ 143, 444, 444, 444, 401, 401, 401, 444, 401, 444, - /* 160 */ 404, 408, 407, 412, 405, 413, 428, 433, 439, 447, - /* 170 */ 434, 444, 444, 444, 509, 509, 488, 12, 12, 444, + /* 150 */ 143, 444, 444, 444, 401, 401, 401, 401, 444, 444, + /* 160 */ 404, 408, 407, 412, 405, 414, 429, 434, 436, 447, + /* 170 */ 458, 444, 444, 444, 485, 485, 488, 12, 12, 444, /* 180 */ 444, 508, 510, 555, 515, 514, 554, 518, 521, 488, /* 190 */ 13, 444, 529, 529, 444, 529, 444, 529, 444, 444, /* 200 */ 753, 753, 54, 81, 81, 108, 81, 134, 188, 205, @@ -411,12 +411,12 @@ static const unsigned short int yy_shift_ofst[] = { /* 240 */ 345, 347, 348, 343, 350, 357, 431, 375, 426, 366, /* 250 */ 118, 308, 314, 459, 460, 324, 327, 361, 331, 373, /* 260 */ 609, 464, 613, 614, 467, 618, 619, 525, 531, 489, - /* 270 */ 512, 519, 551, 516, 552, 556, 539, 542, 577, 582, - /* 280 */ 583, 570, 588, 589, 591, 670, 592, 593, 595, 578, - /* 290 */ 547, 584, 548, 598, 519, 600, 568, 602, 569, 608, + /* 270 */ 512, 519, 551, 516, 552, 556, 539, 561, 577, 584, + /* 280 */ 585, 587, 588, 570, 590, 592, 591, 669, 594, 580, + /* 290 */ 547, 582, 549, 599, 519, 600, 568, 602, 569, 608, /* 300 */ 601, 603, 616, 685, 604, 606, 684, 689, 690, 691, - /* 310 */ 692, 693, 694, 695, 617, 686, 625, 622, 623, 590, - /* 320 */ 626, 681, 650, 696, 563, 564, 620, 620, 620, 620, + /* 310 */ 692, 693, 694, 695, 617, 686, 625, 622, 623, 593, + /* 320 */ 626, 681, 648, 696, 562, 564, 620, 620, 620, 620, /* 330 */ 697, 567, 571, 620, 620, 620, 710, 711, 636, 620, /* 340 */ 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, /* 350 */ 725, 726, 727, 728, 729, 638, 651, 730, 731, 676, @@ -424,7 +424,7 @@ static const unsigned short int yy_shift_ofst[] = { }; #define YY_REDUCE_COUNT (201) #define YY_REDUCE_MIN (-265) -#define YY_REDUCE_MAX (461) +#define YY_REDUCE_MAX (465) static const short yy_reduce_ofst[] = { /* 0 */ -27, -33, -33, -193, -193, -76, -203, -199, -175, -184, /* 10 */ -130, -134, 93, 24, 67, 119, 126, 135, 142, 148, @@ -441,12 +441,12 @@ static const short yy_reduce_ofst[] = { /* 120 */ 365, 367, 368, 369, 370, 371, 372, 374, 376, 377, /* 130 */ 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, /* 140 */ 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - /* 150 */ 398, 344, 399, 400, 247, 252, 254, 402, 267, 403, + /* 150 */ 398, 344, 399, 400, 247, 252, 254, 267, 402, 403, /* 160 */ 246, 266, 265, 270, 273, 293, 406, 268, 409, 411, - /* 170 */ 414, 410, 415, 416, 417, 418, 419, 420, 423, 421, - /* 180 */ 422, 424, 427, 425, 435, 430, 436, 429, 437, 432, - /* 190 */ 438, 440, 446, 450, 441, 451, 453, 454, 457, 458, - /* 200 */ 461, 452, + /* 170 */ 413, 410, 415, 416, 417, 418, 419, 420, 423, 421, + /* 180 */ 422, 424, 427, 425, 428, 430, 433, 435, 432, 437, + /* 190 */ 438, 439, 448, 450, 440, 451, 453, 454, 457, 465, + /* 200 */ 441, 452, }; static const YYACTIONTYPE yy_default[] = { /* 0 */ 856, 979, 918, 989, 905, 915, 1126, 1126, 1126, 856, @@ -464,8 +464,8 @@ static const YYACTIONTYPE yy_default[] = { /* 120 */ 856, 856, 856, 856, 856, 856, 903, 856, 901, 856, /* 130 */ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, /* 140 */ 856, 856, 856, 856, 887, 856, 856, 856, 856, 856, - /* 150 */ 856, 878, 878, 878, 856, 856, 856, 878, 856, 878, - /* 160 */ 1076, 1080, 1062, 1074, 1070, 1061, 1057, 1055, 1053, 1052, + /* 150 */ 856, 878, 878, 878, 856, 856, 856, 856, 878, 878, + /* 160 */ 1076, 1080, 1062, 1074, 1070, 1057, 1055, 1053, 1061, 1052, /* 170 */ 1084, 878, 878, 878, 923, 923, 919, 915, 915, 878, /* 180 */ 878, 941, 939, 937, 929, 935, 931, 933, 927, 906, /* 190 */ 856, 878, 913, 913, 878, 913, 878, 913, 878, 878, @@ -1039,10 +1039,10 @@ static const char *const yyTokenName[] = { /* 250 */ "from", /* 251 */ "where_opt", /* 252 */ "interval_opt", - /* 253 */ "session_option", - /* 254 */ "windowstate_option", - /* 255 */ "fill_opt", - /* 256 */ "sliding_opt", + /* 253 */ "sliding_opt", + /* 254 */ "session_option", + /* 255 */ "windowstate_option", + /* 256 */ "fill_opt", /* 257 */ "groupby_opt", /* 258 */ "having_opt", /* 259 */ "orderby_opt", @@ -1235,7 +1235,7 @@ static const char *const yyRuleName[] = { /* 163 */ "tagitem ::= MINUS FLOAT", /* 164 */ "tagitem ::= PLUS INTEGER", /* 165 */ "tagitem ::= PLUS FLOAT", - /* 166 */ "select ::= SELECT selcollist from where_opt interval_opt session_option windowstate_option fill_opt sliding_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt", + /* 166 */ "select ::= SELECT selcollist from where_opt interval_opt sliding_opt session_option windowstate_option fill_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt", /* 167 */ "select ::= LP select RP", /* 168 */ "union ::= select", /* 169 */ "union ::= union UNION ALL select", @@ -1490,7 +1490,7 @@ tSqlExprListDestroy((yypminor->yy525)); case 243: /* columnlist */ case 244: /* tagitemlist */ case 245: /* tagNamelist */ - case 255: /* fill_opt */ + case 256: /* fill_opt */ case 257: /* groupby_opt */ case 259: /* orderby_opt */ case 270: /* sortlist */ @@ -1991,7 +1991,7 @@ static const struct { { 248, -2 }, /* (163) tagitem ::= MINUS FLOAT */ { 248, -2 }, /* (164) tagitem ::= PLUS INTEGER */ { 248, -2 }, /* (165) tagitem ::= PLUS FLOAT */ - { 246, -14 }, /* (166) select ::= SELECT selcollist from where_opt interval_opt session_option windowstate_option fill_opt sliding_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt */ + { 246, -14 }, /* (166) select ::= SELECT selcollist from where_opt interval_opt sliding_opt session_option windowstate_option fill_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt */ { 246, -3 }, /* (167) select ::= LP select RP */ { 262, -1 }, /* (168) union ::= select */ { 262, -4 }, /* (169) union ::= union UNION ALL select */ @@ -2019,15 +2019,15 @@ static const struct { { 252, -4 }, /* (191) interval_opt ::= INTERVAL LP tmvar RP */ { 252, -6 }, /* (192) interval_opt ::= INTERVAL LP tmvar COMMA tmvar RP */ { 252, 0 }, /* (193) interval_opt ::= */ - { 253, 0 }, /* (194) session_option ::= */ - { 253, -7 }, /* (195) session_option ::= SESSION LP ids cpxName COMMA tmvar RP */ - { 254, 0 }, /* (196) windowstate_option ::= */ - { 254, -4 }, /* (197) windowstate_option ::= STATE_WINDOW LP ids RP */ - { 255, 0 }, /* (198) fill_opt ::= */ - { 255, -6 }, /* (199) fill_opt ::= FILL LP ID COMMA tagitemlist RP */ - { 255, -4 }, /* (200) fill_opt ::= FILL LP ID RP */ - { 256, -4 }, /* (201) sliding_opt ::= SLIDING LP tmvar RP */ - { 256, 0 }, /* (202) sliding_opt ::= */ + { 254, 0 }, /* (194) session_option ::= */ + { 254, -7 }, /* (195) session_option ::= SESSION LP ids cpxName COMMA tmvar RP */ + { 255, 0 }, /* (196) windowstate_option ::= */ + { 255, -4 }, /* (197) windowstate_option ::= STATE_WINDOW LP ids RP */ + { 256, 0 }, /* (198) fill_opt ::= */ + { 256, -6 }, /* (199) fill_opt ::= FILL LP ID COMMA tagitemlist RP */ + { 256, -4 }, /* (200) fill_opt ::= FILL LP ID RP */ + { 253, -4 }, /* (201) sliding_opt ::= SLIDING LP tmvar RP */ + { 253, 0 }, /* (202) sliding_opt ::= */ { 259, 0 }, /* (203) orderby_opt ::= */ { 259, -3 }, /* (204) orderby_opt ::= ORDER BY sortlist */ { 270, -4 }, /* (205) sortlist ::= sortlist COMMA item sortorder */ @@ -2723,9 +2723,9 @@ static void yy_reduce( } yymsp[-1].minor.yy506 = yylhsminor.yy506; break; - case 166: /* select ::= SELECT selcollist from where_opt interval_opt session_option windowstate_option fill_opt sliding_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt */ + case 166: /* select ::= SELECT selcollist from where_opt interval_opt sliding_opt session_option windowstate_option fill_opt groupby_opt having_opt orderby_opt slimit_opt limit_opt */ { - yylhsminor.yy464 = tSetQuerySqlNode(&yymsp[-13].minor.yy0, yymsp[-12].minor.yy525, yymsp[-11].minor.yy412, yymsp[-10].minor.yy370, yymsp[-4].minor.yy525, yymsp[-2].minor.yy525, &yymsp[-9].minor.yy520, &yymsp[-8].minor.yy259, &yymsp[-7].minor.yy144, &yymsp[-5].minor.yy0, yymsp[-6].minor.yy525, &yymsp[0].minor.yy126, &yymsp[-1].minor.yy126, yymsp[-3].minor.yy370); + yylhsminor.yy464 = tSetQuerySqlNode(&yymsp[-13].minor.yy0, yymsp[-12].minor.yy525, yymsp[-11].minor.yy412, yymsp[-10].minor.yy370, yymsp[-4].minor.yy525, yymsp[-2].minor.yy525, &yymsp[-9].minor.yy520, &yymsp[-7].minor.yy259, &yymsp[-6].minor.yy144, &yymsp[-8].minor.yy0, yymsp[-5].minor.yy525, &yymsp[0].minor.yy126, &yymsp[-1].minor.yy126, yymsp[-3].minor.yy370); } yymsp[-13].minor.yy464 = yylhsminor.yy464; break; From 2e050c4714a646a3059596b51dc271048823b5fb Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 2 Aug 2021 13:21:26 +0800 Subject: [PATCH 06/13] [TD-5579] give tips for 3 level'select --- src/client/src/tscSQLParser.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 819f1af4f0..ed7c2eeb19 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -900,6 +900,7 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { SSqlNode* pSqlNode = taosArrayGetP(pInfo->list, i); tscTrace("0x%"PRIx64" start to parse the %dth subclause, total:%"PRIzu, pSql->self, i, size); + // normalizeSqlNode(pSqlNode); // normalize the column name in each function if ((code = validateSqlNode(pSql, pSqlNode, pQueryInfo)) != TSDB_CODE_SUCCESS) { return code; @@ -2028,7 +2029,6 @@ static SUdfInfo* isValidUdf(SArray* pUdfInfo, const char* name, int32_t len) { tscError("udfinfo is null"); return NULL; } - size_t t = taosArrayGetSize(pUdfInfo); for(int32_t i = 0; i < t; ++i) { SUdfInfo* pUdf = taosArrayGet(pUdfInfo, i); @@ -8455,6 +8455,7 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf const char* msg6 = "not support stddev/percentile/interp in the outer query yet"; const char* msg7 = "derivative/twa/irate requires timestamp column exists in subquery"; const char* msg8 = "condition missing for join query"; + const char* msg9 = "not support 3 level select"; int32_t code = TSDB_CODE_SUCCESS; @@ -8485,6 +8486,13 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf // parse the subquery in the first place int32_t numOfSub = (int32_t)taosArrayGetSize(pSqlNode->from->list); for (int32_t i = 0; i < numOfSub; ++i) { + // check if there is 3 level select + SRelElementPair* subInfo = taosArrayGet(pSqlNode->from->list, i); + SSqlNode* p = taosArrayGetP(subInfo->pSubquery, 0); + if (p->from->type == SQL_NODE_FROM_SUBQUERY){ + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg9); + } + code = doValidateSubquery(pSqlNode, i, pSql, pQueryInfo, tscGetErrorMsgPayload(pCmd)); if (code != TSDB_CODE_SUCCESS) { return code; From 06b2f1fd1acfa7b8bd51ea02a622f01c42326ba0 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 2 Aug 2021 14:19:18 +0800 Subject: [PATCH 07/13] [td-5707]: fix the interp query bug. --- src/tsdb/src/tsdbRead.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index d59ede920f..c7429b5fe8 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -1234,7 +1234,6 @@ static int32_t doCopyRowsFromFileBlock(STsdbQueryHandle* pQueryHandle, int32_t c static void moveDataToFront(STsdbQueryHandle* pQueryHandle, int32_t numOfRows, int32_t numOfCols); static void doCheckGeneratedBlockRange(STsdbQueryHandle* pQueryHandle); static void copyAllRemainRowsFromFileBlock(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, SDataBlockInfo* pBlockInfo, int32_t endPos); -static TSKEY extractFirstTraverseKey(STableCheckInfo* pCheckInfo, int32_t order, int32_t update); static int32_t handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SBlock* pBlock, STableCheckInfo* pCheckInfo){ SQueryFilePos* cur = &pQueryHandle->cur; @@ -1244,7 +1243,6 @@ static int32_t handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SBlock* p int32_t code = TSDB_CODE_SUCCESS; /*bool hasData = */ initTableMemIterator(pQueryHandle, pCheckInfo); - assert(cur->pos >= 0 && cur->pos <= binfo.rows); key = extractFirstTraverseKey(pCheckInfo, pQueryHandle->order, pCfg->update); @@ -1255,7 +1253,6 @@ static int32_t handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SBlock* p tsdbDebug("%p no data in mem, 0x%"PRIx64, pQueryHandle, pQueryHandle->qId); } - if ((ASCENDING_TRAVERSE(pQueryHandle->order) && (key != TSKEY_INITIAL_VAL && key <= binfo.window.ekey)) || (!ASCENDING_TRAVERSE(pQueryHandle->order) && (key != TSKEY_INITIAL_VAL && key >= binfo.window.skey))) { @@ -2706,6 +2703,7 @@ static bool loadBlockOfActiveTable(STsdbQueryHandle* pQueryHandle) { } if (exists) { + tsdbRetrieveDataBlock((TsdbQueryHandleT*) pQueryHandle, NULL); if (pQueryHandle->currentLoadExternalRows && pQueryHandle->window.skey == pQueryHandle->window.ekey) { SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, 0); assert(*(int64_t*)pColInfo->pData == pQueryHandle->window.skey); From 3c9b73069c1a33929c2d0e75da413a50233bed76 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 2 Aug 2021 14:51:17 +0800 Subject: [PATCH 08/13] [TD-5650] fix long tag filter conditon error --- src/client/inc/tscUtil.h | 1 + src/client/src/tscServer.c | 6 ++++-- src/client/src/tscUtil.c | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/client/inc/tscUtil.h b/src/client/inc/tscUtil.h index a7c2862f51..687d182bb6 100644 --- a/src/client/inc/tscUtil.h +++ b/src/client/inc/tscUtil.h @@ -344,6 +344,7 @@ int32_t tscCreateTableMetaFromSTableMeta(STableMeta* pChild, const char* name, v STableMeta* tscTableMetaDup(STableMeta* pTableMeta); SVgroupsInfo* tscVgroupsInfoDup(SVgroupsInfo* pVgroupsInfo); +int32_t tscGetTagFilterSerializeLen(SQueryInfo* pQueryInfo); int32_t tscGetColFilterSerializeLen(SQueryInfo* pQueryInfo); int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAttr, void* addr); void* createQInfoFromQueryNode(SQueryInfo* pQueryInfo, STableGroupInfo* pTableGroupInfo, SOperatorInfo* pOperator, char* sql, void* addr, int32_t stage, uint64_t qId); diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index fdb1be9f4e..b9edc52e9b 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -678,6 +678,8 @@ static int32_t tscEstimateQueryMsgSize(SSqlObj *pSql) { int32_t srcColListSize = (int32_t)(taosArrayGetSize(pQueryInfo->colList) * sizeof(SColumnInfo)); int32_t srcColFilterSize = tscGetColFilterSerializeLen(pQueryInfo); + int32_t srcTagFilterSize = tscGetTagFilterSerializeLen(pQueryInfo); + size_t numOfExprs = tscNumOfExprs(pQueryInfo); int32_t exprSize = (int32_t)(sizeof(SSqlExpr) * numOfExprs * 2); @@ -698,8 +700,8 @@ static int32_t tscEstimateQueryMsgSize(SSqlObj *pSql) { tableSerialize = totalTables * sizeof(STableIdInfo); } - return MIN_QUERY_MSG_PKT_SIZE + minMsgSize() + sizeof(SQueryTableMsg) + srcColListSize + srcColFilterSize + exprSize + tsBufSize + - tableSerialize + sqlLen + 4096 + pQueryInfo->bufLen; + return MIN_QUERY_MSG_PKT_SIZE + minMsgSize() + sizeof(SQueryTableMsg) + srcColListSize + srcColFilterSize + srcTagFilterSize + + exprSize + tsBufSize + tableSerialize + sqlLen + 4096 + pQueryInfo->bufLen; } static char *doSerializeTableInfo(SQueryTableMsg *pQueryMsg, SSqlObj *pSql, STableMetaInfo *pTableMetaInfo, char *pMsg, diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 1736fa3259..741b82e124 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -4684,6 +4684,21 @@ int32_t tscGetColFilterSerializeLen(SQueryInfo* pQueryInfo) { return len; } +int32_t tscGetTagFilterSerializeLen(SQueryInfo* pQueryInfo) { + // serialize tag column query condition + if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0) { + STagCond* pTagCond = &pQueryInfo->tagCond; + + STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); + STableMeta * pTableMeta = pTableMetaInfo->pTableMeta; + SCond *pCond = tsGetSTableQueryCond(pTagCond, pTableMeta->id.uid); + if (pCond != NULL && pCond->cond != NULL) { + return pCond->len; + } + } + return 0; +} + int32_t tscCreateQueryFromQueryInfo(SQueryInfo* pQueryInfo, SQueryAttr* pQueryAttr, void* addr) { memset(pQueryAttr, 0, sizeof(SQueryAttr)); From 1e19765ba387b474b5e2bf39af114843a3cb9e54 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 2 Aug 2021 15:38:20 +0800 Subject: [PATCH 09/13] [TD-5650] fix long tag filter conditon error --- src/inc/taosmsg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index fb5bbe6c2d..54ea17657a 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -489,7 +489,7 @@ typedef struct { int16_t numOfCols; // the number of columns will be load from vnode SInterval interval; SSessionWindow sw; // session window - uint16_t tagCondLen; // tag length in current query + uint32_t tagCondLen; // tag length in current query uint32_t tbnameCondLen; // table name filter condition string length int16_t numOfGroupCols; // num of group by columns int16_t orderByIdx; From 4b124f6ac23bb9d11ff7679b6398b778f77c50dc Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 2 Aug 2021 15:45:45 +0800 Subject: [PATCH 10/13] [TD-5650] fix long tag filter conditon error --- src/client/src/tscServer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index b9edc52e9b..c951f24ae9 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1037,7 +1037,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) { SCond *pCond = tsGetSTableQueryCond(pTagCond, pTableMeta->id.uid); if (pCond != NULL && pCond->cond != NULL) { - pQueryMsg->tagCondLen = htons(pCond->len); + pQueryMsg->tagCondLen = htonl(pCond->len); memcpy(pMsg, pCond->cond, pCond->len); pMsg += pCond->len; From 9e6dd46611d62feb811d3c3efc922cec7cfbbcdc Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 2 Aug 2021 15:49:17 +0800 Subject: [PATCH 11/13] [TD-5650] fix long tag filter conditon error --- src/query/src/qExecutor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 3f6df2ec07..36bfb1d442 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -6898,7 +6898,7 @@ int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SQueryParam* param) { pQueryMsg->numOfCols = htons(pQueryMsg->numOfCols); pQueryMsg->numOfOutput = htons(pQueryMsg->numOfOutput); pQueryMsg->numOfGroupCols = htons(pQueryMsg->numOfGroupCols); - pQueryMsg->tagCondLen = htons(pQueryMsg->tagCondLen); + pQueryMsg->tagCondLen = htonl(pQueryMsg->tagCondLen); pQueryMsg->tsBuf.tsOffset = htonl(pQueryMsg->tsBuf.tsOffset); pQueryMsg->tsBuf.tsLen = htonl(pQueryMsg->tsBuf.tsLen); pQueryMsg->tsBuf.tsNumOfBlocks = htonl(pQueryMsg->tsBuf.tsNumOfBlocks); From 35a4c0386e7e6d36420005b7e33b2c9b57cb64c7 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 2 Aug 2021 15:52:58 +0800 Subject: [PATCH 12/13] [td-225]disable query plan. --- src/client/src/tscSQLParser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index af97f6640b..72e74f114b 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -8758,13 +8758,13 @@ int32_t validateSqlNode(SSqlObj* pSql, SSqlNode* pSqlNode, SQueryInfo* pQueryInf tfree(p); } -//#if 0 +#if 0 SQueryNode* p = qCreateQueryPlan(pQueryInfo); char* s = queryPlanToString(p); printf("%s\n", s); tfree(s); qDestroyQueryPlan(p); -//#endif +#endif return TSDB_CODE_SUCCESS; // Does not build query message here } From 4fd1d1f17a187f12404e169db97415a3a8a9be75 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 2 Aug 2021 19:03:29 +0800 Subject: [PATCH 13/13] [td-225]tracking the total number of qhandle in dnode. --- src/vnode/inc/vnodeInt.h | 1 + src/vnode/src/vnodeRead.c | 29 +++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/vnode/inc/vnodeInt.h b/src/vnode/inc/vnodeInt.h index ef05cf4a40..4864b79dc4 100644 --- a/src/vnode/inc/vnodeInt.h +++ b/src/vnode/inc/vnodeInt.h @@ -26,6 +26,7 @@ extern "C" { #include "vnode.h" extern int32_t vDebugFlag; +extern int32_t vNumOfExistedQHandle; // current initialized and existed query handle in current dnode #define vFatal(...) { if (vDebugFlag & DEBUG_FATAL) { taosPrintLog("VND FATAL ", 255, __VA_ARGS__); }} #define vError(...) { if (vDebugFlag & DEBUG_ERROR) { taosPrintLog("VND ERROR ", 255, __VA_ARGS__); }} diff --git a/src/vnode/src/vnodeRead.c b/src/vnode/src/vnodeRead.c index 6bc009209b..64f87ba5ca 100644 --- a/src/vnode/src/vnodeRead.c +++ b/src/vnode/src/vnodeRead.c @@ -21,6 +21,8 @@ #include "query.h" #include "vnodeStatus.h" +int32_t vNumOfExistedQHandle; // current initialized and existed query handle in current dnode + static int32_t (*vnodeProcessReadMsgFp[TSDB_MSG_TYPE_MAX])(SVnodeObj *pVnode, SVReadMsg *pRead); static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead); static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SVReadMsg *pRead); @@ -247,7 +249,8 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { if (handle == NULL) { // failed to register qhandle pRsp->code = terrno; terrno = 0; - vError("vgId:%d, QInfo:0x%"PRIx64 "-%p register qhandle failed, return to app, code:%s", pVnode->vgId, qId, (void *)pQInfo, + + vError("vgId:%d, QInfo:0x%"PRIx64 "-%p register qhandle failed, return to app, code:%s,", pVnode->vgId, qId, (void *)pQInfo, tstrerror(pRsp->code)); qDestroyQueryInfo(pQInfo); // destroy it directly return pRsp->code; @@ -260,10 +263,12 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { vnodeNotifyCurrentQhandle(pRead->rpcHandle, qId, *handle, pVnode->vgId) != TSDB_CODE_SUCCESS) { vError("vgId:%d, QInfo:0x%"PRIx64 "-%p, query discarded since link is broken, %p", pVnode->vgId, qId, *handle, pRead->rpcHandle); + pRsp->code = TSDB_CODE_RPC_NETWORK_UNAVAIL; qReleaseQInfo(pVnode->qMgmt, (void **)&handle, true); return pRsp->code; } + } else { assert(pQInfo == NULL); } @@ -277,6 +282,9 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { return pRsp->code; } } + + int32_t remain = atomic_add_fetch_32(&vNumOfExistedQHandle, 1); + vTrace("vgId:%d, new qhandle created, total qhandle:%d", pVnode->vgId, remain); } else { assert(pCont != NULL); void **qhandle = (void **)pRead->qhandle; @@ -318,8 +326,14 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { // NOTE: if the qhandle is not put into vread queue or query is completed, free the qhandle. // If the building of result is not required, simply free it. Otherwise, mandatorily free the qhandle if (freehandle || (!buildRes)) { + if (freehandle) { + int32_t remain = atomic_sub_fetch_32(&vNumOfExistedQHandle, 1); + vTrace("vgId:%d, QInfo:%p, start to free qhandle, remain qhandle:%d", pVnode->vgId, *qhandle, remain); + } + qReleaseQInfo(pVnode->qMgmt, (void **)&qhandle, freehandle); } + } } @@ -357,7 +371,10 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { // kill current query and free corresponding resources. if (pRetrieve->free == 1) { - vWarn("vgId:%d, QInfo:%"PRIx64 "-%p, retrieve msg received to kill query and free qhandle", pVnode->vgId, pRetrieve->qId, *handle); + int32_t remain = atomic_sub_fetch_32(&vNumOfExistedQHandle, 1); + vWarn("vgId:%d, QInfo:%"PRIx64 "-%p, retrieve msg received to kill query and free qhandle, remain qhandle:%d", pVnode->vgId, pRetrieve->qId, + *handle, remain); + qKillQuery(*handle); qReleaseQInfo(pVnode->qMgmt, (void **)&handle, true); @@ -368,7 +385,10 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { // register the qhandle to connect to quit query immediate if connection is broken if (vnodeNotifyCurrentQhandle(pRead->rpcHandle, pRetrieve->qId, *handle, pVnode->vgId) != TSDB_CODE_SUCCESS) { - vError("vgId:%d, QInfo:%"PRIu64 "-%p, retrieve discarded since link is broken, conn:%p", pVnode->vgId, pRetrieve->qhandle, *handle, pRead->rpcHandle); + int32_t remain = atomic_sub_fetch_32(&vNumOfExistedQHandle, 1); + vError("vgId:%d, QInfo:%"PRIu64 "-%p, retrieve discarded since link is broken, conn:%p, remain qhandle:%d", pVnode->vgId, pRetrieve->qhandle, + *handle, pRead->rpcHandle, remain); + code = TSDB_CODE_RPC_NETWORK_UNAVAIL; qKillQuery(*handle); qReleaseQInfo(pVnode->qMgmt, (void **)&handle, true); @@ -390,7 +410,6 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { if (!tsRetrieveBlockingModel) { if (!buildRes) { assert(pRead->rpcHandle != NULL); - qReleaseQInfo(pVnode->qMgmt, (void **)&handle, false); return TSDB_CODE_QRY_NOT_READY; } @@ -403,6 +422,8 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SVReadMsg *pRead) { // If qhandle is not added into vread queue, the query should be completed already or paused with error. // Here free qhandle immediately if (freeHandle) { + int32_t remain = atomic_sub_fetch_32(&vNumOfExistedQHandle, 1); + vTrace("vgId:%d, QInfo:%p, start to free qhandle, remain qhandle:%d", pVnode->vgId, *handle, remain); qReleaseQInfo(pVnode->qMgmt, (void **)&handle, true); }