diff --git a/include/libs/nodes/nodes.h b/include/libs/nodes/nodes.h index d0bf2e2dd4..24a062bfa3 100644 --- a/include/libs/nodes/nodes.h +++ b/include/libs/nodes/nodes.h @@ -112,11 +112,11 @@ int64_t nodesMakeAllocatorWeakRef(int64_t allocatorId); int64_t nodesReleaseAllocatorWeakRef(int64_t allocatorId); void nodesDestroyAllocator(int64_t allocatorId); -SNode* nodesMakeNode(ENodeType type); +int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut); void nodesDestroyNode(SNode* pNode); void nodesFree(void* p); -SNodeList* nodesMakeList(); +int32_t nodesMakeList(SNodeList** ppListOut); int32_t nodesListAppend(SNodeList* pList, SNode* pNode); int32_t nodesListStrictAppend(SNodeList* pList, SNode* pNode); int32_t nodesListMakeAppend(SNodeList** pList, SNode* pNode); @@ -156,8 +156,8 @@ bool nodeListNodeEqual(const SNodeList* a, const SNode* b); bool nodesMatchNode(const SNode* pSub, const SNode* pNode); -SNode* nodesCloneNode(const SNode* pNode); -SNodeList* nodesCloneList(const SNodeList* pList); +int32_t nodesCloneNode(const SNode* pNode, SNode** ppNodeOut); +int32_t nodesCloneList(const SNodeList* pList, SNodeList** ppList); const char* nodesNodeName(ENodeType type); int32_t nodesNodeToString(const SNode* pNode, bool format, char** pStr, int32_t* pLen); diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h index 08b4c8fccb..54c8686161 100644 --- a/include/libs/nodes/querynodes.h +++ b/include/libs/nodes/querynodes.h @@ -636,9 +636,9 @@ void* nodesGetValueFromNode(SValueNode* pNode); int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value); char* nodesGetStrValueFromNode(SValueNode* pNode); void nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal); -SValueNode* nodesMakeValueNodeFromString(char* literal); -SValueNode* nodesMakeValueNodeFromBool(bool b); -SNode* nodesMakeValueNodeFromInt32(int32_t value); +int32_t nodesMakeValueNodeFromString(char* literal, SValueNode** ppValNode); +int32_t nodesMakeValueNodeFromBool(bool b, SValueNode** ppValNode); +int32_t nodesMakeValueNodeFromInt32(int32_t value, SNode** ppNode); char* nodesGetFillModeString(EFillMode mode); int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc); diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h index fe0faa28ad..cefce8a9c0 100644 --- a/include/libs/parser/parser.h +++ b/include/libs/parser/parser.h @@ -118,6 +118,7 @@ void qDestroyQuery(SQuery* pQueryNode); int32_t qExtractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pSchema); int32_t qSetSTableIdForRsma(SNode* pStmt, int64_t uid); +int32_t qInitKeywordsTable(); void qCleanupKeywordsTable(); int32_t qAppendStmtTableOutput(SQuery* pQuery, SHashObj* pAllVgHash, STableColsData* pTbData, STableDataCxt* pTbCtx, SStbInterlaceInfo* pBuildInfo); diff --git a/include/os/osDef.h b/include/os/osDef.h index 1052722492..75c6a0dc73 100644 --- a/include/os/osDef.h +++ b/include/os/osDef.h @@ -65,7 +65,7 @@ typedef int (*__compar_fn_t)(const void *, const void *); #endif #define ssize_t int #define _SSIZE_T_ -#define bzero(ptr, size) memset((ptr), 0, (size)) +#define bzero(ptr, size) (void)memset((ptr), 0, (size)) #define strcasecmp _stricmp #define strncasecmp _strnicmp #define wcsncasecmp _wcsnicmp diff --git a/include/os/osFile.h b/include/os/osFile.h index 4c56244278..8bacb1bf7c 100644 --- a/include/os/osFile.h +++ b/include/os/osFile.h @@ -114,8 +114,6 @@ int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, in bool taosValidFile(TdFilePtr pFile); -int32_t taosGetErrorFile(TdFilePtr pFile); - int32_t taosCompressFile(char *srcFileName, char *destFileName); int32_t taosSetFileHandlesLimit(); diff --git a/include/os/osLocale.h b/include/os/osLocale.h index 19627f1c73..5f2a1c35de 100644 --- a/include/os/osLocale.h +++ b/include/os/osLocale.h @@ -30,7 +30,7 @@ extern "C" { char *taosCharsetReplace(char *charsetstr); void taosGetSystemLocale(char *outLocale, char *outCharset); -void taosSetSystemLocale(const char *inLocale, const char *inCharSet); +int32_t taosSetSystemLocale(const char *inLocale, const char *inCharSet); #ifdef __cplusplus } diff --git a/include/os/osSignal.h b/include/os/osSignal.h index 3917c6cefc..71983bd3f2 100644 --- a/include/os/osSignal.h +++ b/include/os/osSignal.h @@ -49,11 +49,14 @@ typedef BOOL (*FSignalHandler)(DWORD fdwCtrlType); #else typedef void (*FSignalHandler)(int32_t signum, void *sigInfo, void *context); #endif -void taosSetSignal(int32_t signum, FSignalHandler sigfp); -void taosIgnSignal(int32_t signum); -void taosDflSignal(int32_t signum); -void taosKillChildOnParentStopped(); +typedef void (*sighandler_t)(int); + +int32_t taosSetSignal(int32_t signum, FSignalHandler sigfp); +int32_t taosIgnSignal(int32_t signum); +int32_t taosDflSignal(int32_t signum); + +int32_t taosKillChildOnParentStopped(); #ifdef __cplusplus } diff --git a/include/os/osSocket.h b/include/os/osSocket.h index 3ba28d8156..0427c6b22f 100644 --- a/include/os/osSocket.h +++ b/include/os/osSocket.h @@ -159,13 +159,12 @@ TdSocketPtr taosAcceptTcpConnectSocket(TdSocketServerPtr pServerSocket, st int32_t taosGetSocketName(TdSocketPtr pSocket, struct sockaddr *destAddr, int *addrLen); -void taosBlockSIGPIPE(); -uint32_t taosGetIpv4FromFqdn(const char *); +int32_t taosBlockSIGPIPE(); +int32_t taosGetIpv4FromFqdn(const char *fqdn, uint32_t* ip); int32_t taosGetFqdn(char *); void tinet_ntoa(char *ipstr, uint32_t ip); uint32_t ip2uint(const char *const ip_addr); -void taosIgnSIGPIPE(); -void taosSetMaskSIGPIPE(); +int32_t taosIgnSIGPIPE(); uint32_t taosInetAddr(const char *ipAddr); const char *taosInetNtoa(struct in_addr ipInt, char *dstStr, int32_t len); diff --git a/include/os/osString.h b/include/os/osString.h index 05492763c2..80755de031 100644 --- a/include/os/osString.h +++ b/include/os/osString.h @@ -75,7 +75,7 @@ int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs); int32_t taosUcs4ToMbsEx(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, iconv_t conv); bool taosMbsToUcs4(const char *mbs, size_t mbs_len, TdUcs4 *ucs4, int32_t ucs4_max_len, int32_t *len); int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes); -TdUcs4 *tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4); +int32_t tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4); bool taosValidateEncodec(const char *encodec); int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len); int32_t taosHexDecode(const char *src, char *dst, int32_t len); diff --git a/include/os/osSystem.h b/include/os/osSystem.h index ba9f137b40..01fad7ad97 100644 --- a/include/os/osSystem.h +++ b/include/os/osSystem.h @@ -44,7 +44,7 @@ int64_t taosGetLineCmd(TdCmdPtr pCmd, char **__restrict ptrBuf); int32_t taosEOFCmd(TdCmdPtr pCmd); -int64_t taosCloseCmd(TdCmdPtr *ppCmd); +void taosCloseCmd(TdCmdPtr *ppCmd); void *taosLoadDll(const char *filename); @@ -54,11 +54,11 @@ void taosCloseDll(void *handle); int32_t taosSetConsoleEcho(bool on); -void taosSetTerminalMode(); +int32_t taosSetTerminalMode(); int32_t taosGetOldTerminalMode(); -void taosResetTerminalMode(); +int32_t taosResetTerminalMode(); #define STACKSIZE 100 diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 9b49c1908d..a52e87bbb3 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -198,7 +198,8 @@ int32_t taosGetErrSize(); #define TSDB_CODE_TSC_ENCODE_PARAM_ERROR TAOS_DEF_ERROR_CODE(0, 0X0231) #define TSDB_CODE_TSC_ENCODE_PARAM_NULL TAOS_DEF_ERROR_CODE(0, 0X0232) #define TSDB_CODE_TSC_COMPRESS_PARAM_ERROR TAOS_DEF_ERROR_CODE(0, 0X0233) -#define TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR TAOS_DEF_ERROR_CODE(0, 0X0234) +#define TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR TAOS_DEF_ERROR_CODE(0, 0X0234) +#define TSDB_CODE_TSC_FAIL_GENERATE_JSON TAOS_DEF_ERROR_CODE(0, 0X0235) #define TSDB_CODE_TSC_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0X02FF) // mnode-common diff --git a/include/util/tpagedbuf.h b/include/util/tpagedbuf.h index 73af65997d..7f3bd29694 100644 --- a/include/util/tpagedbuf.h +++ b/include/util/tpagedbuf.h @@ -156,7 +156,7 @@ void setBufPageCompressOnDisk(SDiskbasedBuf* pBuf, bool comp); * @param pBuf * @param pageId */ -void dBufSetBufPageRecycled(SDiskbasedBuf* pBuf, void* pPage); +int32_t dBufSetBufPageRecycled(SDiskbasedBuf* pBuf, void* pPage); /** * Print the statistics when closing this buffer diff --git a/include/util/tutil.h b/include/util/tutil.h index 72c4f90fd5..25c60f161a 100644 --- a/include/util/tutil.h +++ b/include/util/tutil.h @@ -75,7 +75,7 @@ static FORCE_INLINE void taosEncryptPass_c(uint8_t *inBuf, size_t len, char *tar char buf[TSDB_PASSWORD_LEN + 1]; buf[TSDB_PASSWORD_LEN] = 0; - sprintf(buf, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", context.digest[0], context.digest[1], + (void)sprintf(buf, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", context.digest[0], context.digest[1], context.digest[2], context.digest[3], context.digest[4], context.digest[5], context.digest[6], context.digest[7], context.digest[8], context.digest[9], context.digest[10], context.digest[11], context.digest[12], context.digest[13], context.digest[14], context.digest[15]); @@ -108,10 +108,10 @@ static FORCE_INLINE int32_t taosGetTbHashVal(const char *tbname, int32_t tblen, int32_t offset = 0; if (prefix < 0) { offset = -1 * prefix; - strncpy(tbName, tbname, offset); + (void)strncpy(tbName, tbname, offset); } if (suffix < 0) { - strncpy(tbName + offset, tbname + tblen + suffix, -1 * suffix); + (void)strncpy(tbName + offset, tbname + tblen + suffix, -1 * suffix); offset += -1 * suffix; } return MurmurHash3_32(tbName, offset); diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h index 507738acc9..928afdaecf 100644 --- a/source/client/inc/clientInt.h +++ b/source/client/inc/clientInt.h @@ -310,7 +310,7 @@ void setResPrecision(SReqResultInfo* pResInfo, int32_t precision); int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp, bool convertUcs4); int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows, bool convertUcs4); -void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols); +int32_t setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols); void doFreeReqResultInfo(SReqResultInfo* pResInfo); int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName, SArray** pReq); void syncCatalogFn(SMetaData* pResult, void* param, int32_t code); @@ -348,15 +348,16 @@ __async_send_cb_fn_t getMsgRspHandle(int32_t msgType); SMsgSendInfo* buildMsgInfoImpl(SRequestObj* pReqObj); -void* createTscObj(const char* user, const char* auth, const char* db, int32_t connType, SAppInstInfo* pAppInfo); +int32_t createTscObj(const char *user, const char *auth, const char *db, int32_t connType, SAppInstInfo *pAppInfo, + STscObj **p); void destroyTscObj(void* pObj); STscObj* acquireTscObj(int64_t rid); -int32_t releaseTscObj(int64_t rid); +void releaseTscObj(int64_t rid); void destroyAppInst(void* pAppInfo); uint64_t generateRequestId(); -void* createRequest(uint64_t connId, int32_t type, int64_t reqid); +int32_t createRequest(uint64_t connId, int32_t type, int64_t reqid, SRequestObj **pRequest); void destroyRequest(SRequestObj* pRequest); SRequestObj* acquireRequest(int64_t rid); int32_t releaseRequest(int64_t rid); @@ -370,7 +371,7 @@ void resetConnectDB(STscObj* pTscObj); int taos_options_imp(TSDB_OPTION option, const char* str); -void* openTransporter(const char* user, const char* auth, int32_t numOfThreads); +int32_t openTransporter(const char* user, const char* auth, int32_t numOfThreads, void **pDnodeConn); void tscStopCrashReport(); typedef struct AsyncArg { @@ -381,8 +382,8 @@ typedef struct AsyncArg { bool persistConnForSpecificMsg(void* parenct, tmsg_t msgType); void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet); -STscObj* taos_connect_internal(const char* ip, const char* user, const char* pass, const char* auth, const char* db, - uint16_t port, int connType); +int32_t taos_connect_internal(const char* ip, const char* user, const char* pass, const char* auth, const char* db, + uint16_t port, int connType, STscObj** pObj); int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtCallback* pStmtCb); @@ -395,11 +396,11 @@ void taos_close_internal(void* taos); // --- heartbeat // global, called by mgmt -int hbMgrInit(); -void hbMgrCleanUp(); +int32_t hbMgrInit(); +void hbMgrCleanUp(); // cluster level -SAppHbMgr* appHbMgrInit(SAppInstInfo* pAppInstInfo, char* key); +int32_t appHbMgrInit(SAppInstInfo *pAppInstInfo, char *key, SAppHbMgr **pAppHbMgr); void appHbMgrCleanup(void); void hbRemoveAppHbMrg(SAppHbMgr** pAppHbMgr); void destroyAllRequests(SHashObj* pRequests); @@ -408,7 +409,7 @@ void stopAllRequests(SHashObj* pRequests); //SAppInstInfo* getAppInstInfo(const char* clusterKey); // conn level -int hbRegisterConn(SAppHbMgr* pAppHbMgr, int64_t tscRefId, int64_t clusterId, int8_t connType); +int32_t hbRegisterConn(SAppHbMgr* pAppHbMgr, int64_t tscRefId, int64_t clusterId, int8_t connType); void hbDeregisterConn(STscObj* pTscObj, SClientHbKey connKey); typedef struct SSqlCallbackWrapper { @@ -427,7 +428,7 @@ void doAsyncQuery(SRequestObj* pRequest, bool forceUpdateMeta); int32_t removeMeta(STscObj* pTscObj, SArray* tbList, bool isView); int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog); int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog); -bool qnodeRequired(SRequestObj* pRequest); +int32_t qnodeRequired(SRequestObj* pRequest, bool *required); void continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest); void destorySqlCallbackWrapper(SSqlCallbackWrapper* pWrapper); void handleQueryAnslyseRes(SSqlCallbackWrapper *pWrapper, SMetaData *pResultMeta, int32_t code); @@ -443,6 +444,30 @@ void freeQueryParam(SSyncQueryParam* param); int32_t clientParseSqlImpl(void* param, const char* dbName, const char* sql, bool parseOnly, const char* effeciveUser, SParseSqlRes* pRes); #endif +#define TSC_ERR_RET(c) \ + do { \ + int32_t _code = c; \ + if (_code != TSDB_CODE_SUCCESS) { \ + terrno = _code; \ + return _code; \ + } \ + } while (0) +#define TSC_RET(c) \ + do { \ + int32_t _code = c; \ + if (_code != TSDB_CODE_SUCCESS) { \ + terrno = _code; \ + } \ + return _code; \ + } while (0) +#define TSC_ERR_JRET(c) \ + do { \ + code = c; \ + if (code != TSDB_CODE_SUCCESS) { \ + terrno = code; \ + goto _return; \ + } \ + } while (0) void slowQueryLog(int64_t rid, bool killed, int32_t code, int32_t cost); diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index f640618897..f4ecc6929b 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -44,6 +44,26 @@ #define TSC_VAR_NOT_RELEASE 1 #define TSC_VAR_RELEASED 0 +#define ENV_JSON_FALSE_CHECK(c) \ + do { \ + if (!c) { \ + tscError("faild to add item to JSON object");\ + code = TSDB_CODE_TSC_FAIL_GENERATE_JSON; \ + goto _end; \ + } \ + } while (0) + +#define ENV_ERR_RET(c,info) \ + do { \ + int32_t _code = c; \ + if (_code != TSDB_CODE_SUCCESS) { \ + errno = _code; \ + tscInitRes = _code; \ + tscError(info); \ + return; \ + } \ + } while (0) + STscDbg tscDbg = {0}; SAppInfo appInfo; int64_t lastClusterId = 0; @@ -57,8 +77,14 @@ static TdThreadOnce tscinit = PTHREAD_ONCE_INIT; volatile int32_t tscInitRes = 0; static int32_t registerRequest(SRequestObj *pRequest, STscObj *pTscObj) { + int32_t code = TSDB_CODE_SUCCESS; // connection has been released already, abort creating request. pRequest->self = taosAddRef(clientReqRefPool, pRequest); + if (pRequest->self < 0) { + tscError("failed to add ref to request"); + code = terrno; + return code; + } int32_t num = atomic_add_fetch_32(&pTscObj->numOfReqs, 1); @@ -72,19 +98,23 @@ static int32_t registerRequest(SRequestObj *pRequest, STscObj *pTscObj) { pRequest->self, pRequest->pTscObj->id, num, currentInst, total, pRequest->requestId); } - return TSDB_CODE_SUCCESS; + return code; } static void concatStrings(SArray *list, char* buf, int size){ int len = 0; for(int i = 0; i < taosArrayGetSize(list); i++){ char* db = taosArrayGet(list, i); + if (NULL == db) { + tscError("get dbname failed, buf:%s", buf); + break; + } char* dot = strchr(db, '.'); if (dot != NULL) { db = dot + 1; } if (i != 0){ - strcat(buf, ","); + (void)strcat(buf, ","); len += 1; } int ret = snprintf(buf + len, size - len, "%s", db); @@ -100,61 +130,70 @@ static void concatStrings(SArray *list, char* buf, int size){ } } -static void generateWriteSlowLog(STscObj *pTscObj, SRequestObj *pRequest, int32_t reqType, int64_t duration){ +static int32_t generateWriteSlowLog(STscObj *pTscObj, SRequestObj *pRequest, int32_t reqType, int64_t duration){ cJSON* json = cJSON_CreateObject(); + int32_t code = TSDB_CODE_SUCCESS; if (json == NULL) { tscError("[monitor] cJSON_CreateObject failed"); - return; + return TSDB_CODE_OUT_OF_MEMORY; } char clusterId[32] = {0}; if (snprintf(clusterId, sizeof(clusterId), "%" PRId64, pTscObj->pAppInfo->clusterId) < 0){ tscError("failed to generate clusterId:%" PRId64, pTscObj->pAppInfo->clusterId); + code = TSDB_CODE_FAILED; + goto _end; } char startTs[32] = {0}; if (snprintf(startTs, sizeof(startTs), "%" PRId64, pRequest->metric.start/1000) < 0){ tscError("failed to generate startTs:%" PRId64, pRequest->metric.start/1000); + code = TSDB_CODE_FAILED; + goto _end; } char requestId[32] = {0}; if (snprintf(requestId, sizeof(requestId), "%" PRIu64, pRequest->requestId) < 0){ tscError("failed to generate requestId:%" PRIu64, pRequest->requestId); + code = TSDB_CODE_FAILED; + goto _end; } - cJSON_AddItemToObject(json, "cluster_id", cJSON_CreateString(clusterId)); - cJSON_AddItemToObject(json, "start_ts", cJSON_CreateString(startTs)); - cJSON_AddItemToObject(json, "request_id", cJSON_CreateString(requestId)); - cJSON_AddItemToObject(json, "query_time", cJSON_CreateNumber(duration/1000)); - cJSON_AddItemToObject(json, "code", cJSON_CreateNumber(pRequest->code)); - cJSON_AddItemToObject(json, "error_info", cJSON_CreateString(tstrerror(pRequest->code))); - cJSON_AddItemToObject(json, "type", cJSON_CreateNumber(reqType)); - cJSON_AddItemToObject(json, "rows_num", cJSON_CreateNumber(pRequest->body.resInfo.numOfRows + pRequest->body.resInfo.totalRows)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "cluster_id", cJSON_CreateString(clusterId))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "start_ts", cJSON_CreateString(startTs))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "request_id", cJSON_CreateString(requestId))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "query_time", cJSON_CreateNumber(duration/1000))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "code", cJSON_CreateNumber(pRequest->code))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "error_info", cJSON_CreateString(tstrerror(pRequest->code)))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "type", cJSON_CreateNumber(reqType))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "rows_num", cJSON_CreateNumber(pRequest->body.resInfo.numOfRows + pRequest->body.resInfo.totalRows))); if(pRequest->sqlstr != NULL && strlen(pRequest->sqlstr) > pTscObj->pAppInfo->monitorParas.tsSlowLogMaxLen){ char tmp = pRequest->sqlstr[pTscObj->pAppInfo->monitorParas.tsSlowLogMaxLen]; pRequest->sqlstr[pTscObj->pAppInfo->monitorParas.tsSlowLogMaxLen] = '\0'; - cJSON_AddItemToObject(json, "sql", cJSON_CreateString(pRequest->sqlstr)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "sql", cJSON_CreateString(pRequest->sqlstr))); pRequest->sqlstr[pTscObj->pAppInfo->monitorParas.tsSlowLogMaxLen] = tmp; }else{ - cJSON_AddItemToObject(json, "sql", cJSON_CreateString(pRequest->sqlstr)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "sql", cJSON_CreateString(pRequest->sqlstr))); } - cJSON_AddItemToObject(json, "user", cJSON_CreateString(pTscObj->user)); - cJSON_AddItemToObject(json, "process_name", cJSON_CreateString(appInfo.appName)); - cJSON_AddItemToObject(json, "ip", cJSON_CreateString(tsLocalFqdn)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "user", cJSON_CreateString(pTscObj->user))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "process_name", cJSON_CreateString(appInfo.appName))); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "ip", cJSON_CreateString(tsLocalFqdn))); char pid[32] = {0}; if (snprintf(pid, sizeof(pid), "%d", appInfo.pid) < 0){ tscError("failed to generate pid:%d", appInfo.pid); + code = TSDB_CODE_FAILED; + goto _end; } - cJSON_AddItemToObject(json, "process_id", cJSON_CreateString(pid)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "process_id", cJSON_CreateString(pid))); if(pRequest->dbList != NULL){ char dbList[1024] = {0}; concatStrings(pRequest->dbList, dbList, sizeof(dbList) - 1); - cJSON_AddItemToObject(json, "db", cJSON_CreateString(dbList)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "db", cJSON_CreateString(dbList))); }else if(pRequest->pDb != NULL){ - cJSON_AddItemToObject(json, "db", cJSON_CreateString(pRequest->pDb)); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "db", cJSON_CreateString(pRequest->pDb))); }else{ - cJSON_AddItemToObject(json, "db", cJSON_CreateString("")); + ENV_JSON_FALSE_CHECK(cJSON_AddItemToObject(json, "db", cJSON_CreateString(""))); } char* value = cJSON_PrintUnformatted(json); @@ -162,11 +201,15 @@ static void generateWriteSlowLog(STscObj *pTscObj, SRequestObj *pRequest, int32_ data.clusterId = pTscObj->pAppInfo->clusterId; data.type = SLOW_LOG_WRITE; data.data = value; - if(monitorPutData2MonitorQueue(data) < 0){ + code = monitorPutData2MonitorQueue(data); + if (TSDB_CODE_SUCCESS != code) { taosMemoryFree(value); + goto _end; } +_end: cJSON_Delete(json); + return code; } static bool checkSlowLogExceptDb(SRequestObj *pRequest, char* exceptDb) { @@ -176,6 +219,10 @@ static bool checkSlowLogExceptDb(SRequestObj *pRequest, char* exceptDb) { for (int i = 0; i < taosArrayGetSize(pRequest->dbList); i++) { char *db = taosArrayGet(pRequest->dbList, i); + if (NULL == db) { + tscError("get dbname failed, exceptDb:%s", exceptDb); + return false; + } char *dot = strchr(db, '.'); if (dot != NULL) { db = dot + 1; @@ -215,7 +262,7 @@ static void deregisterRequest(SRequestObj *pRequest) { "us, planCost:%" PRId64 "us, exec:%" PRId64 "us", duration, pRequest->metric.parseCostUs, pRequest->metric.ctgCostUs, pRequest->metric.analyseCostUs, pRequest->metric.planCostUs, pRequest->metric.execCostUs); - atomic_add_fetch_64((int64_t *)&pActivity->insertElapsedTime, duration); + (void)atomic_add_fetch_64((int64_t *)&pActivity->insertElapsedTime, duration); reqType = SLOW_LOG_TYPE_INSERT; } else if (QUERY_NODE_SELECT_STMT == pRequest->stmtType) { tscDebug("query duration %" PRId64 "us: parseCost:%" PRId64 "us, ctgCost:%" PRId64 "us, analyseCost:%" PRId64 @@ -223,11 +270,13 @@ static void deregisterRequest(SRequestObj *pRequest) { duration, pRequest->metric.parseCostUs, pRequest->metric.ctgCostUs, pRequest->metric.analyseCostUs, pRequest->metric.planCostUs, pRequest->metric.execCostUs); - atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); + (void)atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration); reqType = SLOW_LOG_TYPE_QUERY; } - nodesSimReleaseAllocator(pRequest->allocatorRefId); + if (TSDB_CODE_SUCCESS != nodesSimReleaseAllocator(pRequest->allocatorRefId)) { + tscError("failed to release allocator"); + } } if(pTscObj->pAppInfo->monitorParas.tsEnableMonitor){ @@ -242,14 +291,16 @@ static void deregisterRequest(SRequestObj *pRequest) { if ((duration >= pTscObj->pAppInfo->monitorParas.tsSlowLogThreshold * 1000000UL || duration >= pTscObj->pAppInfo->monitorParas.tsSlowLogThresholdTest * 1000000UL) && checkSlowLogExceptDb(pRequest, pTscObj->pAppInfo->monitorParas.tsSlowLogExceptDb)) { - atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1); + (void)atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1); if (pTscObj->pAppInfo->monitorParas.tsSlowLogScope & reqType) { taosPrintSlowLog("PID:%d, Conn:%u, QID:0x%" PRIx64 ", Start:%" PRId64 " us, Duration:%" PRId64 "us, SQL:%s", taosGetPId(), pTscObj->connId, pRequest->requestId, pRequest->metric.start, duration, pRequest->sqlstr); if(pTscObj->pAppInfo->monitorParas.tsEnableMonitor){ slowQueryLog(pTscObj->id, pRequest->killed, pRequest->code, duration); - generateWriteSlowLog(pTscObj, pRequest, reqType, duration); + if (TSDB_CODE_SUCCESS != generateWriteSlowLog(pTscObj, pRequest, reqType, duration)) { + tscError("failed to generate write slow log"); + } } } } @@ -289,9 +340,9 @@ static bool clientRpcTfp(int32_t code, tmsg_t msgType) { } // TODO refactor -void *openTransporter(const char *user, const char *auth, int32_t numOfThread) { +int32_t openTransporter(const char *user, const char *auth, int32_t numOfThread, void **pDnodeConn) { SRpcInit rpcInit; - memset(&rpcInit, 0, sizeof(rpcInit)); + (void)memset(&rpcInit, 0, sizeof(rpcInit)); rpcInit.localPort = 0; rpcInit.label = "TSC"; rpcInit.numOfThreads = tsNumOfRpcThreads; @@ -315,15 +366,19 @@ void *openTransporter(const char *user, const char *auth, int32_t numOfThread) { rpcInit.connLimitNum = connLimitNum; rpcInit.timeToGetConn = tsTimeToGetAvailableConn; - taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); - - void *pDnodeConn = rpcOpen(&rpcInit); - if (pDnodeConn == NULL) { - tscError("failed to init connection to server"); - return NULL; + int32_t code = taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); + if (TSDB_CODE_SUCCESS != code) { + tscError("invalid version string."); + return code; } - return pDnodeConn; + *pDnodeConn = rpcOpen(&rpcInit); + if (*pDnodeConn == NULL) { + tscError("failed to init connection to server."); + code = TSDB_CODE_FAILED; + } + + return code; } void destroyAllRequests(SHashObj *pRequests) { @@ -334,7 +389,7 @@ void destroyAllRequests(SHashObj *pRequests) { SRequestObj *pRequest = acquireRequest(*rid); if (pRequest) { destroyRequest(pRequest); - releaseRequest(*rid); + (void)releaseRequest(*rid); // ignore error } pIter = taosHashIterate(pRequests, pIter); @@ -349,7 +404,7 @@ void stopAllRequests(SHashObj *pRequests) { SRequestObj *pRequest = acquireRequest(*rid); if (pRequest) { taos_stop_query(pRequest); - releaseRequest(*rid); + (void)releaseRequest(*rid); // ignore error } pIter = taosHashIterate(pRequests, pIter); @@ -360,18 +415,31 @@ void destroyAppInst(void *info) { SAppInstInfo* pAppInfo = *(SAppInstInfo**)info; tscDebug("destroy app inst mgr %p", pAppInfo); - taosThreadMutexLock(&appInfo.mutex); + int32_t code = taosThreadMutexLock(&appInfo.mutex); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to lock app info, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } hbRemoveAppHbMrg(&pAppInfo->pAppHbMgr); - taosThreadMutexUnlock(&appInfo.mutex); + code = taosThreadMutexUnlock(&appInfo.mutex); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to unlock app info, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } taosMemoryFreeClear(pAppInfo->instKey); closeTransporter(pAppInfo); - taosThreadMutexLock(&pAppInfo->qnodeMutex); + code = taosThreadMutexLock(&pAppInfo->qnodeMutex); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to lock qnode mutex, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } + taosArrayDestroy(pAppInfo->pQnodeList); - taosThreadMutexUnlock(&pAppInfo->qnodeMutex); + code = taosThreadMutexUnlock(&pAppInfo->qnodeMutex); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to unlock qnode mutex, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } taosMemoryFree(pAppInfo); } @@ -396,97 +464,111 @@ void destroyTscObj(void *pObj) { pTscObj->pAppInfo->numOfConns); // In any cases, we should not free app inst here. Or an race condition rises. - /*int64_t connNum = */ atomic_sub_fetch_64(&pTscObj->pAppInfo->numOfConns, 1); + /*int64_t connNum = */ (void)atomic_sub_fetch_64(&pTscObj->pAppInfo->numOfConns, 1); - taosThreadMutexDestroy(&pTscObj->mutex); + (void)taosThreadMutexDestroy(&pTscObj->mutex); taosMemoryFree(pTscObj); tscTrace("end to destroy tscObj %" PRIx64 " p:%p", tscId, pTscObj); } -void *createTscObj(const char *user, const char *auth, const char *db, int32_t connType, SAppInstInfo *pAppInfo) { - STscObj *pObj = (STscObj *)taosMemoryCalloc(1, sizeof(STscObj)); - if (NULL == pObj) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; +int32_t createTscObj(const char *user, const char *auth, const char *db, int32_t connType, SAppInstInfo *pAppInfo, + STscObj **pObj) { + *pObj = (STscObj *)taosMemoryCalloc(1, sizeof(STscObj)); + if (NULL == *pObj) { + return TSDB_CODE_OUT_OF_MEMORY; } - pObj->pRequests = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); - if (NULL == pObj->pRequests) { - taosMemoryFree(pObj); - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + (*pObj)->pRequests = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK); + if (NULL == (*pObj)->pRequests) { + taosMemoryFree(*pObj); + return terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY; } - pObj->connType = connType; - pObj->pAppInfo = pAppInfo; - pObj->appHbMgrIdx = pAppInfo->pAppHbMgr->idx; - tstrncpy(pObj->user, user, sizeof(pObj->user)); - memcpy(pObj->pass, auth, TSDB_PASSWORD_LEN); + (*pObj)->connType = connType; + (*pObj)->pAppInfo = pAppInfo; + (*pObj)->appHbMgrIdx = pAppInfo->pAppHbMgr->idx; + tstrncpy((*pObj)->user, user, sizeof((*pObj)->user)); + (void)memcpy((*pObj)->pass, auth, TSDB_PASSWORD_LEN); if (db != NULL) { - tstrncpy(pObj->db, db, tListLen(pObj->db)); + tstrncpy((*pObj)->db, db, tListLen((*pObj)->db)); } - taosThreadMutexInit(&pObj->mutex, NULL); - pObj->id = taosAddRef(clientConnRefPool, pObj); + TSC_ERR_RET(taosThreadMutexInit(&(*pObj)->mutex, NULL)); - atomic_add_fetch_64(&pObj->pAppInfo->numOfConns, 1); + int32_t code = TSDB_CODE_SUCCESS; - tscDebug("connObj created, 0x%" PRIx64 ",p:%p", pObj->id, pObj); - return pObj; + (*pObj)->id = taosAddRef(clientConnRefPool, *pObj); + if ((*pObj)->id < 0) { + tscError("failed to add object to clientConnRefPool"); + code = terrno; + taosMemoryFree(*pObj); + return code; + } + + (void)atomic_add_fetch_64(&(*pObj)->pAppInfo->numOfConns, 1); + + tscDebug("connObj created, 0x%" PRIx64 ",p:%p", (*pObj)->id, *pObj); + return code; } STscObj *acquireTscObj(int64_t rid) { return (STscObj *)taosAcquireRef(clientConnRefPool, rid); } -int32_t releaseTscObj(int64_t rid) { return taosReleaseRef(clientConnRefPool, rid); } +void releaseTscObj(int64_t rid) { + int32_t code = taosReleaseRef(clientConnRefPool, rid); + if (TSDB_CODE_SUCCESS != code) { + tscWarn("failed to release TscObj, code:%s", tstrerror(code)); + } +} -void *createRequest(uint64_t connId, int32_t type, int64_t reqid) { - SRequestObj *pRequest = (SRequestObj *)taosMemoryCalloc(1, sizeof(SRequestObj)); - if (NULL == pRequest) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; +int32_t createRequest(uint64_t connId, int32_t type, int64_t reqid, SRequestObj **pRequest) { + int32_t code = TSDB_CODE_SUCCESS; + *pRequest = (SRequestObj *)taosMemoryCalloc(1, sizeof(SRequestObj)); + if (NULL == *pRequest) { + return TSDB_CODE_OUT_OF_MEMORY; } STscObj *pTscObj = acquireTscObj(connId); if (pTscObj == NULL) { - taosMemoryFree(pRequest); - terrno = TSDB_CODE_TSC_DISCONNECTED; - return NULL; + code = TSDB_CODE_TSC_DISCONNECTED; + goto _return; } SSyncQueryParam *interParam = taosMemoryCalloc(1, sizeof(SSyncQueryParam)); if (interParam == NULL) { releaseTscObj(connId); - doDestroyRequest(pRequest); - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + code = TSDB_CODE_OUT_OF_MEMORY; + goto _return; } - tsem_init(&interParam->sem, 0, 0); - interParam->pRequest = pRequest; - pRequest->body.interParam = interParam; + TSC_ERR_JRET(tsem_init(&interParam->sem, 0, 0)); + interParam->pRequest = *pRequest; + (*pRequest)->body.interParam = interParam; - pRequest->resType = RES_TYPE__QUERY; - pRequest->requestId = reqid == 0 ? generateRequestId() : reqid; - pRequest->metric.start = taosGetTimestampUs(); + (*pRequest)->resType = RES_TYPE__QUERY; + (*pRequest)->requestId = reqid == 0 ? generateRequestId() : reqid; + (*pRequest)->metric.start = taosGetTimestampUs(); - pRequest->body.resInfo.convertUcs4 = true; // convert ucs4 by default - pRequest->type = type; - pRequest->allocatorRefId = -1; + (*pRequest)->body.resInfo.convertUcs4 = true; // convert ucs4 by default + (*pRequest)->type = type; + (*pRequest)->allocatorRefId = -1; - pRequest->pDb = getDbOfConnection(pTscObj); - pRequest->pTscObj = pTscObj; - pRequest->inCallback = false; + (*pRequest)->pDb = getDbOfConnection(pTscObj); + (*pRequest)->pTscObj = pTscObj; + (*pRequest)->inCallback = false; - pRequest->msgBuf = taosMemoryCalloc(1, ERROR_MSG_BUF_DEFAULT_SIZE); - pRequest->msgBufLen = ERROR_MSG_BUF_DEFAULT_SIZE; - tsem_init(&pRequest->body.rspSem, 0, 0); - - if (registerRequest(pRequest, pTscObj)) { - doDestroyRequest(pRequest); - return NULL; + (*pRequest)->msgBuf = taosMemoryCalloc(1, ERROR_MSG_BUF_DEFAULT_SIZE); + if (NULL == (*pRequest)->msgBuf) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _return; } + (*pRequest)->msgBufLen = ERROR_MSG_BUF_DEFAULT_SIZE; + TSC_ERR_JRET(tsem_init(&(*pRequest)->body.rspSem, 0, 0)); + TSC_ERR_JRET(registerRequest(*pRequest, pTscObj)); - return pRequest; + return TSDB_CODE_SUCCESS; +_return: + doDestroyRequest(*pRequest); + return code; } void doFreeReqResultInfo(SReqResultInfo *pResInfo) { @@ -521,12 +603,12 @@ int64_t removeFromMostPrevReq(SRequestObj* pRequest) { pTmp = acquireRequest(pTmp->relation.prevRefId); if (pTmp) { mostPrevReqRefId = pTmp->self; - releaseRequest(mostPrevReqRefId); + (void)releaseRequest(mostPrevReqRefId); // ignore error } else { break; } } - removeRequest(mostPrevReqRefId); + (void)removeRequest(mostPrevReqRefId); // ignore error return mostPrevReqRefId; } @@ -534,8 +616,8 @@ void destroyNextReq(int64_t nextRefId) { if (nextRefId) { SRequestObj* pObj = acquireRequest(nextRefId); if (pObj) { - releaseRequest(nextRefId); - releaseRequest(nextRefId); + (void)releaseRequest(nextRefId); // ignore error + (void)releaseRequest(nextRefId); // ignore error } } } @@ -555,7 +637,7 @@ void destroySubRequests(SRequestObj *pRequest) { pTmp = acquireRequest(tmpRefId); if (pTmp) { pReqList[++reqIdx] = pTmp; - releaseRequest(tmpRefId); + (void)releaseRequest(tmpRefId); // ignore error } else { tscError("prev req ref 0x%" PRIx64 " is not there", tmpRefId); break; @@ -563,7 +645,7 @@ void destroySubRequests(SRequestObj *pRequest) { } for (int32_t i = reqIdx; i >= 0; i--) { - removeRequest(pReqList[i]->self); + (void)removeRequest(pReqList[i]->self); // ignore error } tmpRefId = pRequest->relation.nextRefId; @@ -571,8 +653,8 @@ void destroySubRequests(SRequestObj *pRequest) { pTmp = acquireRequest(tmpRefId); if (pTmp) { tmpRefId = pTmp->relation.nextRefId; - removeRequest(pTmp->self); - releaseRequest(pTmp->self); + (void)removeRequest(pTmp->self); // ignore error + (void)releaseRequest(pTmp->self); // ignore error } else { tscError("next req ref 0x%" PRIx64 " is not there", tmpRefId); break; @@ -592,8 +674,10 @@ void doDestroyRequest(void *p) { int64_t nextReqRefId = pRequest->relation.nextRefId; - taosHashRemove(pRequest->pTscObj->pRequests, &pRequest->self, sizeof(pRequest->self)); - + int32_t code = taosHashRemove(pRequest->pTscObj->pRequests, &pRequest->self, sizeof(pRequest->self)); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to remove request from hash, code:%s", tstrerror(code)); + } schedulerFreeJob(&pRequest->body.queryJob, 0); destorySqlCallbackWrapper(pRequest->pWrapper); @@ -601,7 +685,7 @@ void doDestroyRequest(void *p) { taosMemoryFreeClear(pRequest->msgBuf); doFreeReqResultInfo(&pRequest->body.resInfo); - tsem_destroy(&pRequest->body.rspSem); + (void)tsem_destroy(&pRequest->body.rspSem); taosArrayDestroy(pRequest->tableList); taosArrayDestroy(pRequest->targetTableList); @@ -615,13 +699,15 @@ void doDestroyRequest(void *p) { taosMemoryFreeClear(pRequest->pDb); taosArrayDestroy(pRequest->dbList); if (pRequest->body.interParam) { - tsem_destroy(&((SSyncQueryParam *)pRequest->body.interParam)->sem); + (void)tsem_destroy(&((SSyncQueryParam *)pRequest->body.interParam)->sem); } taosMemoryFree(pRequest->body.interParam); if (TSDB_CODE_SUCCESS == nodesSimAcquireAllocator(pRequest->allocatorRefId)) { qDestroyQuery(pRequest->pQuery); - nodesSimReleaseAllocator(pRequest->allocatorRefId); + if (TSDB_CODE_SUCCESS != nodesSimReleaseAllocator(pRequest->allocatorRefId)) { + tscError("failed to release allocator"); + } } nodesDestroyAllocator(pRequest->allocatorRefId); @@ -638,7 +724,7 @@ void destroyRequest(SRequestObj *pRequest) { } taos_stop_query(pRequest); - removeFromMostPrevReq(pRequest); + (void)removeFromMostPrevReq(pRequest); } void taosStopQueryImpl(SRequestObj *pRequest) { @@ -677,7 +763,7 @@ void stopAllQueries(SRequestObj *pRequest) { for (int32_t i = reqIdx; i >= 0; i--) { taosStopQueryImpl(pReqList[i]); - releaseRequest(pReqList[i]->self); + (void)releaseRequest(pReqList[i]->self); // ignore error } taosStopQueryImpl(pRequest); @@ -688,7 +774,7 @@ void stopAllQueries(SRequestObj *pRequest) { if (pTmp) { tmpRefId = pTmp->relation.nextRefId; taosStopQueryImpl(pTmp); - releaseRequest(pTmp->self); + (void)releaseRequest(pTmp->self); // ignore error } else { tscError("next req ref 0x%" PRIx64 " is not there", tmpRefId); break; @@ -701,7 +787,7 @@ void crashReportThreadFuncUnexpectedStopped(void) { atomic_store_32(&clientStop, static void *tscCrashReportThreadFp(void *param) { setThreadName("client-crashReport"); char filepath[PATH_MAX] = {0}; - snprintf(filepath, sizeof(filepath), "%s%s.taosCrashLog", tsLogDir, TD_DIRSEP); + (void)snprintf(filepath, sizeof(filepath), "%s%s.taosCrashLog", tsLogDir, TD_DIRSEP); char *pMsg = NULL; int64_t msgLen = 0; TdFilePtr pFile = NULL; @@ -770,20 +856,27 @@ static void *tscCrashReportThreadFp(void *param) { int32_t tscCrashReportInit() { if (!tsEnableCrashReport) { - return 0; + return TSDB_CODE_SUCCESS; } - + int32_t code = TSDB_CODE_SUCCESS; TdThreadAttr thAttr; - taosThreadAttrInit(&thAttr); - taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE); + TSC_ERR_JRET(taosThreadAttrInit(&thAttr)); + TSC_ERR_JRET(taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE)); TdThread crashReportThread; if (taosThreadCreate(&crashReportThread, &thAttr, tscCrashReportThreadFp, NULL) != 0) { tscError("failed to create crashReport thread since %s", strerror(errno)); - return -1; + terrno = TAOS_SYSTEM_ERROR(errno); + TSC_ERR_RET(errno); } - taosThreadAttrDestroy(&thAttr); - return 0; + (void)taosThreadAttrDestroy(&thAttr); +_return: + if (code) { + terrno = TAOS_SYSTEM_ERROR(errno); + TSC_ERR_RET(terrno); + } + + return TSDB_CODE_SUCCESS; } void tscStopCrashReport() { @@ -842,6 +935,11 @@ void taos_init_imp(void) { appInfo.startTime = taosGetTimestampMs(); appInfo.pInstMap = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); appInfo.pInstMapByClusterId = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_ENTRY_LOCK); + if (NULL == appInfo.pInstMap || NULL == appInfo.pInstMapByClusterId) { + tscError("failed to allocate memory when init appInfo"); + tscInitRes = TSDB_CODE_OUT_OF_MEMORY; + return; + } taosHashSetFreeFp(appInfo.pInstMap, destroyAppInst); deltaToUtcInitOnce(); @@ -849,7 +947,7 @@ void taos_init_imp(void) { #ifdef CUS_PROMPT snprintf(logDirName, 64, "%slog", CUS_PROMPT); #else - snprintf(logDirName, 64, "taoslog"); + (void)snprintf(logDirName, 64, "taoslog"); #endif if (taosCreateLog(logDirName, 10, configDir, NULL, NULL, NULL, NULL, 1) != 0) { printf(" WARING: Create %s failed:%s. configDir=%s\n", logDirName, strerror(errno), configDir); @@ -857,24 +955,12 @@ void taos_init_imp(void) { return; } - if (taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1) != 0) { - tscInitRes = -1; - return; - } + ENV_ERR_RET(taosInitCfg(configDir, NULL, NULL, NULL, NULL, 1), "failed to init cfg"); initQueryModuleMsgHandle(); - - if (taosConvInit() != 0) { - tscInitRes = -1; - tscError("failed to init conv"); - return; - } - if (monitorInit() != 0){ - tscInitRes = -1; - tscError("failed to init monitor"); - return; - } - rpcInit(); + ENV_ERR_RET(taosConvInit(), "failed to init conv"); + ENV_ERR_RET(monitorInit(), "failed to init monitor"); + ENV_ERR_RET(rpcInit(), "failed to init rpc"); if (InitRegexCache() != 0) { tscInitRes = -1; @@ -883,34 +969,26 @@ void taos_init_imp(void) { } SCatalogCfg cfg = {.maxDBCacheNum = 100, .maxTblCacheNum = 100}; - catalogInit(&cfg); + ENV_ERR_RET(catalogInit(&cfg), "failed to init catalog"); + ENV_ERR_RET(schedulerInit(), "failed to init scheduler"); - schedulerInit(); tscDebug("starting to initialize TAOS driver"); #ifndef WINDOWS taosSetCoreDump(true); #endif - if (initTaskQueue() != 0){ - tscInitRes = -1; - tscError("failed to init task queue"); - return; - } - if (fmFuncMgtInit() != TSDB_CODE_SUCCESS) { - tscInitRes = -1; - tscError("failed to init function manager"); - return; - } - nodesInitAllocatorSet(); + ENV_ERR_RET(initTaskQueue(), "failed to init task queue"); + ENV_ERR_RET(fmFuncMgtInit(), "failed to init funcMgt"); + ENV_ERR_RET(nodesInitAllocatorSet(), "failed to init allocator set"); clientConnRefPool = taosOpenRef(200, destroyTscObj); clientReqRefPool = taosOpenRef(40960, doDestroyRequest); - taosGetAppName(appInfo.appName, NULL); - taosThreadMutexInit(&appInfo.mutex, NULL); - - tscCrashReportInit(); + ENV_ERR_RET(taosGetAppName(appInfo.appName, NULL), "failed to get app name"); + ENV_ERR_RET(taosThreadMutexInit(&appInfo.mutex, NULL), "failed to init thread mutex"); + ENV_ERR_RET(tscCrashReportInit(), "failed to init crash report"); + ENV_ERR_RET(qInitKeywordsTable(), "failed to init parser keywords table"); tscDebug("client is initialized successfully"); } @@ -957,7 +1035,7 @@ int taos_options_imp(TSDB_OPTION option, const char *str) { return -1; } newstr[0] = '"'; - memcpy(newstr+1, str, len); + (void)memcpy(newstr+1, str, len); newstr[len + 1] = '"'; newstr[len + 2] = '\0'; str = newstr; diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index e45ca2b872..0b7de322f5 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -44,28 +44,34 @@ static int32_t hbMqHbRspHandle(SAppHbMgr *pAppHbMgr, SClientHbRsp *pRsp) { retur static int32_t hbProcessUserAuthInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog, SAppHbMgr *pAppHbMgr) { - int32_t code = 0; + int32_t code = TSDB_CODE_SUCCESS; SUserAuthBatchRsp batchRsp = {0}; if (tDeserializeSUserAuthBatchRsp(value, valueLen, &batchRsp) != 0) { - terrno = TSDB_CODE_INVALID_MSG; - return -1; + return TSDB_CODE_INVALID_MSG; } int32_t numOfBatchs = taosArrayGetSize(batchRsp.pArray); for (int32_t i = 0; i < numOfBatchs; ++i) { SGetUserAuthRsp *rsp = taosArrayGet(batchRsp.pArray, i); + if (NULL == rsp) { + code = TSDB_CODE_OUT_OF_RANGE; + goto _return; + } tscDebug("hb to update user auth, user:%s, version:%d", rsp->user, rsp->version); - catalogUpdateUserAuthInfo(pCatalog, rsp); + TSC_ERR_JRET(catalogUpdateUserAuthInfo(pCatalog, rsp)); } - if (numOfBatchs > 0) hbUpdateUserAuthInfo(pAppHbMgr, &batchRsp); + if (numOfBatchs > 0) { + TSC_ERR_JRET(hbUpdateUserAuthInfo(pAppHbMgr, &batchRsp)); + } - atomic_val_compare_exchange_8(&pAppHbMgr->connHbFlag, 1, 2); + (void)atomic_val_compare_exchange_8(&pAppHbMgr->connHbFlag, 1, 2); +_return: taosArrayDestroy(batchRsp.pArray); - return TSDB_CODE_SUCCESS; + return code; } static int32_t hbUpdateUserAuthInfo(SAppHbMgr *pAppHbMgr, SUserAuthBatchRsp *batchRsp) { @@ -211,6 +217,10 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog int32_t numOfBatchs = taosArrayGetSize(batchRsp.pArray); for (int32_t i = 0; i < numOfBatchs; ++i) { SDbHbRsp *rsp = taosArrayGet(batchRsp.pArray, i); + if (NULL == rsp) { + code = TSDB_CODE_OUT_OF_RANGE; + goto _return; + } if (rsp->useDbRsp) { tscDebug("hb use db rsp, db:%s, vgVersion:%d, stateTs:%" PRId64 ", uid:%" PRIx64, rsp->useDbRsp->db, rsp->useDbRsp->vgVersion, rsp->useDbRsp->stateTs, rsp->useDbRsp->uid); @@ -227,7 +237,7 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog tscDebug("hb to update db vgInfo, db:%s", rsp->useDbRsp->db); - catalogUpdateDBVgInfo(pCatalog, rsp->useDbRsp->db, rsp->useDbRsp->uid, vgInfo); + TSC_ERR_JRET(catalogUpdateDBVgInfo(pCatalog, rsp->useDbRsp->db, rsp->useDbRsp->uid, vgInfo)); if (IS_SYS_DBNAME(rsp->useDbRsp->db)) { code = hbGenerateVgInfoFromRsp(&vgInfo, rsp->useDbRsp); @@ -235,23 +245,28 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog goto _return; } - catalogUpdateDBVgInfo(pCatalog, - (rsp->useDbRsp->db[0] == 'i') ? TSDB_PERFORMANCE_SCHEMA_DB : TSDB_INFORMATION_SCHEMA_DB, - rsp->useDbRsp->uid, vgInfo); + TSC_ERR_JRET(catalogUpdateDBVgInfo(pCatalog, + (rsp->useDbRsp->db[0] == 'i') ? + TSDB_PERFORMANCE_SCHEMA_DB : + TSDB_INFORMATION_SCHEMA_DB, + rsp->useDbRsp->uid, vgInfo)); } } } if (rsp->cfgRsp) { tscDebug("hb db cfg rsp, db:%s, cfgVersion:%d", rsp->cfgRsp->db, rsp->cfgRsp->cfgVersion); - catalogUpdateDbCfg(pCatalog, rsp->cfgRsp->db, rsp->cfgRsp->dbId, rsp->cfgRsp); + code = catalogUpdateDbCfg(pCatalog, rsp->cfgRsp->db, rsp->cfgRsp->dbId, rsp->cfgRsp); rsp->cfgRsp = NULL; } if (rsp->pTsmaRsp) { if (rsp->pTsmaRsp->pTsmas) { for (int32_t i = 0; i < rsp->pTsmaRsp->pTsmas->size; ++i) { STableTSMAInfo *pTsma = taosArrayGetP(rsp->pTsmaRsp->pTsmas, i); - catalogAsyncUpdateTSMA(pCatalog, &pTsma, rsp->dbTsmaVersion); + if (NULL == pTsma) { + TSC_ERR_JRET(TSDB_CODE_OUT_OF_RANGE); + } + TSC_ERR_JRET(catalogAsyncUpdateTSMA(pCatalog, &pTsma, rsp->dbTsmaVersion)); } taosArrayClear(rsp->pTsmaRsp->pTsmas); } @@ -265,7 +280,7 @@ _return: } static int32_t hbProcessStbInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) { - int32_t code = 0; + int32_t code = TSDB_CODE_SUCCESS; SSTbHbRsp hbRsp = {0}; if (tDeserializeSSTbHbRsp(value, valueLen, &hbRsp) != 0) { @@ -276,10 +291,13 @@ static int32_t hbProcessStbInfoRsp(void *value, int32_t valueLen, struct SCatalo int32_t numOfMeta = taosArrayGetSize(hbRsp.pMetaRsp); for (int32_t i = 0; i < numOfMeta; ++i) { STableMetaRsp *rsp = taosArrayGet(hbRsp.pMetaRsp, i); - + if (NULL == rsp) { + code = TSDB_CODE_OUT_OF_RANGE; + goto _return; + } if (rsp->numOfColumns < 0) { tscDebug("hb to remove stb, db:%s, stb:%s", rsp->dbFName, rsp->stbName); - catalogRemoveStbMeta(pCatalog, rsp->dbFName, rsp->dbId, rsp->stbName, rsp->suid); + TSC_ERR_JRET(catalogRemoveStbMeta(pCatalog, rsp->dbFName, rsp->dbId, rsp->stbName, rsp->suid)); } else { tscDebug("hb to update stb, db:%s, stb:%s", rsp->dbFName, rsp->stbName); if (rsp->pSchemas[0].colId != PRIMARYKEY_TIMESTAMP_COL_ID) { @@ -288,22 +306,26 @@ static int32_t hbProcessStbInfoRsp(void *value, int32_t valueLen, struct SCatalo return TSDB_CODE_TSC_INVALID_VALUE; } - catalogAsyncUpdateTableMeta(pCatalog, rsp); + TSC_ERR_JRET(catalogAsyncUpdateTableMeta(pCatalog, rsp)); } } int32_t numOfIndex = taosArrayGetSize(hbRsp.pIndexRsp); for (int32_t i = 0; i < numOfIndex; ++i) { STableIndexRsp *rsp = taosArrayGet(hbRsp.pIndexRsp, i); - - catalogUpdateTableIndex(pCatalog, rsp); + if (NULL == rsp) { + code = TSDB_CODE_OUT_OF_RANGE; + goto _return; + } + TSC_ERR_JRET(catalogUpdateTableIndex(pCatalog, rsp)); } +_return: taosArrayDestroy(hbRsp.pIndexRsp); hbRsp.pIndexRsp = NULL; tFreeSSTbHbRsp(&hbRsp); - return TSDB_CODE_SUCCESS; + return code; } static int32_t hbProcessDynViewRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) { @@ -320,7 +342,7 @@ static void hbFreeSViewMetaInRsp(void *p) { } static int32_t hbProcessViewInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) { - int32_t code = 0; + int32_t code = TSDB_CODE_SUCCESS; SViewHbRsp hbRsp = {0}; if (tDeserializeSViewHbRsp(value, valueLen, &hbRsp) != 0) { @@ -332,20 +354,25 @@ static int32_t hbProcessViewInfoRsp(void *value, int32_t valueLen, struct SCatal int32_t numOfMeta = taosArrayGetSize(hbRsp.pViewRsp); for (int32_t i = 0; i < numOfMeta; ++i) { SViewMetaRsp *rsp = taosArrayGetP(hbRsp.pViewRsp, i); - + if (NULL == rsp) { + code = TSDB_CODE_OUT_OF_RANGE; + goto _return; + } if (rsp->numOfCols < 0) { tscDebug("hb to remove view, db:%s, view:%s", rsp->dbFName, rsp->name); - catalogRemoveViewMeta(pCatalog, rsp->dbFName, rsp->dbId, rsp->name, rsp->viewId); + code = catalogRemoveViewMeta(pCatalog, rsp->dbFName, rsp->dbId, rsp->name, rsp->viewId); tFreeSViewMetaRsp(rsp); taosMemoryFreeClear(rsp); } else { tscDebug("hb to update view, db:%s, view:%s", rsp->dbFName, rsp->name); - catalogUpdateViewMeta(pCatalog, rsp); + code = catalogUpdateViewMeta(pCatalog, rsp); } + TSC_ERR_JRET(code); } +_return: taosArrayDestroy(hbRsp.pViewRsp); - return TSDB_CODE_SUCCESS; + return code; } static int32_t hbprocessTSMARsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) { @@ -363,30 +390,38 @@ static int32_t hbprocessTSMARsp(void *value, int32_t valueLen, struct SCatalog * if (!pTsmaInfo->pFuncs) { tscDebug("hb to remove tsma: %s.%s", pTsmaInfo->dbFName, pTsmaInfo->name); - catalogRemoveTSMA(pCatalog, pTsmaInfo); + code = catalogRemoveTSMA(pCatalog, pTsmaInfo); tFreeAndClearTableTSMAInfo(pTsmaInfo); } else { tscDebug("hb to update tsma: %s.%s", pTsmaInfo->dbFName, pTsmaInfo->name); - catalogUpdateTSMA(pCatalog, &pTsmaInfo); + code = catalogUpdateTSMA(pCatalog, &pTsmaInfo); tFreeAndClearTableTSMAInfo(pTsmaInfo); } + TSC_ERR_JRET(code); } +_return: taosArrayDestroy(hbRsp.pTsmas); - return TSDB_CODE_SUCCESS; + return code; } static void hbProcessQueryRspKvs(int32_t kvNum, SArray *pKvs, struct SCatalog *pCatalog, SAppHbMgr *pAppHbMgr) { for (int32_t i = 0; i < kvNum; ++i) { SKv *kv = taosArrayGet(pKvs, i); + if (NULL == kv) { + tscError("invalid hb kv, idx:%d", i); + continue; + } switch (kv->key) { case HEARTBEAT_KEY_USER_AUTHINFO: { if (kv->valueLen <= 0 || NULL == kv->value) { tscError("invalid hb user auth info, len:%d, value:%p", kv->valueLen, kv->value); break; } - - hbProcessUserAuthInfoRsp(kv->value, kv->valueLen, pCatalog, pAppHbMgr); + if (TSDB_CODE_SUCCESS != hbProcessUserAuthInfoRsp(kv->value, kv->valueLen, pCatalog, pAppHbMgr)) { + tscError("process user auth info response faild, len:%d, value:%p", kv->valueLen, kv->value); + break; + } break; } case HEARTBEAT_KEY_DBINFO: { @@ -394,8 +429,10 @@ static void hbProcessQueryRspKvs(int32_t kvNum, SArray *pKvs, struct SCatalog *p tscError("invalid hb db info, len:%d, value:%p", kv->valueLen, kv->value); break; } - - hbProcessDBInfoRsp(kv->value, kv->valueLen, pCatalog); + if (TSDB_CODE_SUCCESS != hbProcessDBInfoRsp(kv->value, kv->valueLen, pCatalog)) { + tscError("process db info response faild, len:%d, value:%p", kv->valueLen, kv->value); + break; + } break; } case HEARTBEAT_KEY_STBINFO: { @@ -403,8 +440,10 @@ static void hbProcessQueryRspKvs(int32_t kvNum, SArray *pKvs, struct SCatalog *p tscError("invalid hb stb info, len:%d, value:%p", kv->valueLen, kv->value); break; } - - hbProcessStbInfoRsp(kv->value, kv->valueLen, pCatalog); + if (TSDB_CODE_SUCCESS != hbProcessStbInfoRsp(kv->value, kv->valueLen, pCatalog)) { + tscError("process stb info response faild, len:%d, value:%p", kv->valueLen, kv->value); + break; + } break; } #ifdef TD_ENTERPRISE @@ -413,8 +452,10 @@ static void hbProcessQueryRspKvs(int32_t kvNum, SArray *pKvs, struct SCatalog *p tscError("invalid dyn view info, len:%d, value:%p", kv->valueLen, kv->value); break; } - - hbProcessDynViewRsp(kv->value, kv->valueLen, pCatalog); + if (TSDB_CODE_SUCCESS != hbProcessDynViewRsp(kv->value, kv->valueLen, pCatalog)) { + tscError("Process dyn view response failed, len: %d, value: %p", kv->valueLen, kv->value); + break; + } break; } case HEARTBEAT_KEY_VIEWINFO: { @@ -422,8 +463,10 @@ static void hbProcessQueryRspKvs(int32_t kvNum, SArray *pKvs, struct SCatalog *p tscError("invalid view info, len:%d, value:%p", kv->valueLen, kv->value); break; } - - hbProcessViewInfoRsp(kv->value, kv->valueLen, pCatalog); + if (TSDB_CODE_SUCCESS != hbProcessViewInfoRsp(kv->value, kv->valueLen, pCatalog)) { + tscError("Process view info response failed, len: %d, value: %p", kv->valueLen, kv->value); + break; + } break; } #endif @@ -431,7 +474,9 @@ static void hbProcessQueryRspKvs(int32_t kvNum, SArray *pKvs, struct SCatalog *p if (kv->valueLen <= 0 || !kv->value) { tscError("Invalid tsma info, len: %d, value: %p", kv->valueLen, kv->value); } - hbprocessTSMARsp(kv->value, kv->valueLen, pCatalog); + if (TSDB_CODE_SUCCESS != hbprocessTSMARsp(kv->value, kv->valueLen, pCatalog)) { + tscError("Process tsma info response failed, len: %d, value: %p", kv->valueLen, kv->value); + } break; } default: @@ -478,7 +523,7 @@ static int32_t hbQueryHbRspHandle(SAppHbMgr *pAppHbMgr, SClientHbRsp *pRsp) { tscDebug("request 0x%" PRIx64 " not exist to kill", pRsp->query->killRid); } else { taos_stop_query((TAOS_RES *)pRequest); - releaseRequest(pRsp->query->killRid); + (void)releaseRequest(pRsp->query->killRid); } } @@ -487,7 +532,9 @@ static int32_t hbQueryHbRspHandle(SAppHbMgr *pAppHbMgr, SClientHbRsp *pRsp) { } if (pRsp->query->pQnodeList) { - updateQnodeList(pTscObj->pAppInfo, pRsp->query->pQnodeList); + if (TSDB_CODE_SUCCESS != updateQnodeList(pTscObj->pAppInfo, pRsp->query->pQnodeList)) { + tscWarn("update qnode list failed"); + } } releaseTscObj(pRsp->connKey.tscRid); @@ -508,6 +555,7 @@ static int32_t hbQueryHbRspHandle(SAppHbMgr *pAppHbMgr, SClientHbRsp *pRsp) { } } + taosHashRelease(pAppHbMgr->activeInfo, pReq); return TSDB_CODE_SUCCESS; @@ -522,8 +570,10 @@ static int32_t hbAsyncCallBack(void *param, SDataBuf *pMsg, int32_t code) { int32_t idx = *(int32_t *)param; SClientHbBatchRsp pRsp = {0}; if (TSDB_CODE_SUCCESS == code) { - tDeserializeSClientHbBatchRsp(pMsg->pData, pMsg->len, &pRsp); - + code = tDeserializeSClientHbBatchRsp(pMsg->pData, pMsg->len, &pRsp); + if (TSDB_CODE_SUCCESS != code) { + tscError("deserialize hb rsp failed"); + } int32_t now = taosGetTimestampSec(); int32_t delta = abs(now - pRsp.svrTimestamp); if (delta > timestampDeltaLimit) { @@ -534,27 +584,27 @@ static int32_t hbAsyncCallBack(void *param, SDataBuf *pMsg, int32_t code) { int32_t rspNum = taosArrayGetSize(pRsp.rsps); - taosThreadMutexLock(&clientHbMgr.lock); + (void)taosThreadMutexLock(&clientHbMgr.lock); SAppHbMgr *pAppHbMgr = taosArrayGetP(clientHbMgr.appHbMgrs, idx); if (pAppHbMgr == NULL) { - taosThreadMutexUnlock(&clientHbMgr.lock); + (void)taosThreadMutexUnlock(&clientHbMgr.lock); tscError("appHbMgr not exist, idx:%d", idx); taosMemoryFree(pMsg->pData); taosMemoryFree(pMsg->pEpSet); tFreeClientHbBatchRsp(&pRsp); - return -1; + return TSDB_CODE_OUT_OF_RANGE; } SAppInstInfo *pInst = pAppHbMgr->pAppInstInfo; if (code != 0) { pInst->onlineDnodes = pInst->totalDnodes ? 0 : -1; tscDebug("hb rsp error %s, update server status %d/%d", tstrerror(code), pInst->onlineDnodes, pInst->totalDnodes); - taosThreadMutexUnlock(&clientHbMgr.lock); + (void)taosThreadMutexUnlock(&clientHbMgr.lock); taosMemoryFree(pMsg->pData); taosMemoryFree(pMsg->pEpSet); tFreeClientHbBatchRsp(&pRsp); - return -1; + return code; } pInst->monitorParas = pRsp.monitorParas; @@ -565,7 +615,7 @@ static int32_t hbAsyncCallBack(void *param, SDataBuf *pMsg, int32_t code) { tscDebug("hb got %d rsp, %d empty rsp received before", rspNum, atomic_val_compare_exchange_32(&emptyRspNum, emptyRspNum, 0)); } else { - atomic_add_fetch_32(&emptyRspNum, 1); + (void)atomic_add_fetch_32(&emptyRspNum, 1); } for (int32_t i = 0; i < rspNum; ++i) { @@ -576,7 +626,7 @@ static int32_t hbAsyncCallBack(void *param, SDataBuf *pMsg, int32_t code) { } } - taosThreadMutexUnlock(&clientHbMgr.lock); + (void)taosThreadMutexUnlock(&clientHbMgr.lock); tFreeClientHbBatchRsp(&pRsp); @@ -601,7 +651,7 @@ int32_t hbBuildQueryDesc(SQueryHbReqBasic *hbBasic, STscObj *pObj) { } if (pRequest->killed || 0 == pRequest->body.queryJob) { - releaseRequest(*rid); + (void)releaseRequest(*rid); pIter = taosHashIterate(pObj->pRequests, pIter); continue; } @@ -613,14 +663,19 @@ int32_t hbBuildQueryDesc(SQueryHbReqBasic *hbBasic, STscObj *pObj) { desc.reqRid = pRequest->self; desc.stableQuery = pRequest->stableQuery; desc.isSubQuery = pRequest->isSubReq; - taosGetFqdn(desc.fqdn); + code = taosGetFqdn(desc.fqdn); + if (TSDB_CODE_SUCCESS != code) { + (void)releaseRequest(*rid); + tscError("get fqdn failed"); + return TSDB_CODE_FAILED; + } desc.subPlanNum = pRequest->body.subplanNum; if (desc.subPlanNum) { desc.subDesc = taosArrayInit(desc.subPlanNum, sizeof(SQuerySubDesc)); if (NULL == desc.subDesc) { - releaseRequest(*rid); - return TSDB_CODE_OUT_OF_MEMORY; + (void)releaseRequest(*rid); + return terrno; } code = schedulerGetTasksStatus(pRequest->body.queryJob, desc.subDesc); @@ -633,20 +688,23 @@ int32_t hbBuildQueryDesc(SQueryHbReqBasic *hbBasic, STscObj *pObj) { desc.subDesc = NULL; } - releaseRequest(*rid); - taosArrayPush(hbBasic->queryDesc, &desc); + (void)releaseRequest(*rid); + if (NULL == taosArrayPush(hbBasic->queryDesc, &desc)) { + taosArrayDestroy(desc.subDesc); + return TSDB_CODE_OUT_OF_MEMORY; + } pIter = taosHashIterate(pObj->pRequests, pIter); } - return TSDB_CODE_SUCCESS; + return code; } int32_t hbGetQueryBasicInfo(SClientHbKey *connKey, SClientHbReq *req) { STscObj *pTscObj = (STscObj *)acquireTscObj(connKey->tscRid); if (NULL == pTscObj) { tscWarn("tscObj rid %" PRIx64 " not exist", connKey->tscRid); - return TSDB_CODE_APP_ERROR; + return terrno; } SQueryHbReqBasic *hbBasic = (SQueryHbReqBasic *)taosMemoryCalloc(1, sizeof(SQueryHbReqBasic)); @@ -671,7 +729,7 @@ int32_t hbGetQueryBasicInfo(SClientHbKey *connKey, SClientHbReq *req) { tscWarn("taosArrayInit %d queryDesc failed", numOfQueries); releaseTscObj(connKey->tscRid); taosMemoryFree(hbBasic); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } int32_t code = hbBuildQueryDesc(hbBasic, pTscObj); @@ -694,7 +752,7 @@ static int32_t hbGetUserAuthInfo(SClientHbKey *connKey, SHbParam *param, SClient STscObj *pTscObj = (STscObj *)acquireTscObj(connKey->tscRid); if (!pTscObj) { tscWarn("tscObj rid %" PRIx64 " not exist", connKey->tscRid); - return TSDB_CODE_APP_ERROR; + return terrno; } int32_t code = 0; @@ -716,7 +774,7 @@ static int32_t hbGetUserAuthInfo(SClientHbKey *connKey, SHbParam *param, SClient SUserAuthVersion *qUserAuth = (SUserAuthVersion *)taosMemoryRealloc(pKv->value, (userNum + 1) * sizeof(SUserAuthVersion)); if (qUserAuth) { - strncpy((qUserAuth + userNum)->user, pTscObj->user, TSDB_USER_LEN); + (void)strncpy((qUserAuth + userNum)->user, pTscObj->user, TSDB_USER_LEN); (qUserAuth + userNum)->version = htonl(-1); // force get userAuthInfo pKv->value = qUserAuth; pKv->valueLen += sizeof(SUserAuthVersion); @@ -742,6 +800,10 @@ static int32_t hbGetUserAuthInfo(SClientHbKey *connKey, SHbParam *param, SClient if (!req->info) { req->info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + if (NULL == req->info) { + code = terrno; + goto _return; + } } if (taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)) != 0) { @@ -789,9 +851,17 @@ int32_t hbGetExpiredUserInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, S if (NULL == req->info) { req->info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + if (NULL == req->info) { + taosMemoryFree(users); + return terrno; + } } - taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + code = taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(users); + return code; + } return TSDB_CODE_SUCCESS; } @@ -835,9 +905,17 @@ int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SCl if (NULL == req->info) { req->info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + if (NULL == req->info) { + taosMemoryFree(dbs); + return terrno; + } } - taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + code = taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(dbs); + return code; + } return TSDB_CODE_SUCCESS; } @@ -875,9 +953,17 @@ int32_t hbGetExpiredStbInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SC if (NULL == req->info) { req->info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + if (NULL == req->info) { + taosMemoryFree(stbs); + return terrno; + } } - taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + code = taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(stbs); + return code; + } return TSDB_CODE_SUCCESS; } @@ -888,12 +974,7 @@ int32_t hbGetExpiredViewInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, S int32_t code = 0; SDynViewVersion *pDynViewVer = NULL; - code = catalogGetExpiredViews(pCatalog, &views, &viewNum, &pDynViewVer); - if (TSDB_CODE_SUCCESS != code) { - taosMemoryFree(views); - taosMemoryFree(pDynViewVer); - return code; - } + TSC_ERR_JRET(catalogGetExpiredViews(pCatalog, &views, &viewNum, &pDynViewVer)); if (viewNum <= 0) { taosMemoryFree(views); @@ -912,6 +993,9 @@ int32_t hbGetExpiredViewInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, S if (NULL == req->info) { req->info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + if (NULL == req->info) { + TSC_ERR_JRET(terrno); + } } SKv kv = { @@ -920,15 +1004,18 @@ int32_t hbGetExpiredViewInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, S .value = pDynViewVer, }; - taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + TSC_ERR_JRET(taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv))); kv.key = HEARTBEAT_KEY_VIEWINFO; kv.valueLen = sizeof(SViewVersion) * viewNum; kv.value = views; - taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); - + TSC_ERR_JRET(taosHashPut(req->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv))); return TSDB_CODE_SUCCESS; +_return: + taosMemoryFree(views); + taosMemoryFree(pDynViewVer); + return code; } int32_t hbGetExpiredTSMAInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SClientHbReq *pReq) { @@ -958,22 +1045,30 @@ int32_t hbGetExpiredTSMAInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, S if (!pReq->info) { pReq->info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + if (!pReq->info) { + taosMemoryFree(tsmas); + return terrno; + } } SKv kv = {.key = HEARTBEAT_KEY_TSMA, .valueLen = sizeof(STSMAVersion) * tsmaNum, .value = tsmas}; - taosHashPut(pReq->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + code = taosHashPut(pReq->info, &kv.key, sizeof(kv.key), &kv, sizeof(kv)); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(tsmas); + return code; + } return TSDB_CODE_SUCCESS; } int32_t hbGetAppInfo(int64_t clusterId, SClientHbReq *req) { SAppHbReq *pApp = taosHashGet(clientHbMgr.appSummary, &clusterId, sizeof(clusterId)); if (NULL != pApp) { - memcpy(&req->app, pApp, sizeof(*pApp)); + (void)memcpy(&req->app, pApp, sizeof(*pApp)); } else { - memset(&req->app.summary, 0, sizeof(req->app.summary)); + (void)memset(&req->app.summary, 0, sizeof(req->app.summary)); req->app.pid = taosGetPId(); req->app.appId = clientHbMgr.appId; - taosGetAppName(req->app.name, NULL); + TSC_ERR_RET(taosGetAppName(req->app.name, NULL)); } return TSDB_CODE_SUCCESS; @@ -984,7 +1079,11 @@ int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void *param, SClientHbReq *req SHbParam *hbParam = (SHbParam *)param; SCatalog *pCatalog = NULL; - hbGetQueryBasicInfo(connKey, req); + code = hbGetQueryBasicInfo(connKey, req); + if (code != TSDB_CODE_SUCCESS) { + tscWarn("hbGetQueryBasicInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); + return code; + } if (hbParam->reqCnt == 0) { code = catalogGetHandle(hbParam->clusterId, &pCatalog); @@ -993,20 +1092,32 @@ int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void *param, SClientHbReq *req return code; } - hbGetAppInfo(hbParam->clusterId, req); + code = hbGetAppInfo(hbParam->clusterId, req); + if (TSDB_CODE_SUCCESS != code) { + tscWarn("getAppInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); + return code; + } if (!taosHashGet(clientHbMgr.appHbHash, &hbParam->clusterId, sizeof(hbParam->clusterId))) { code = hbGetExpiredUserInfo(connKey, pCatalog, req); if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetExpiredUserInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); return code; } - taosHashPut(clientHbMgr.appHbHash, &hbParam->clusterId, sizeof(uint64_t), NULL, 0); + if (clientHbMgr.appHbHash) { + code = taosHashPut(clientHbMgr.appHbHash, &hbParam->clusterId, sizeof(uint64_t), NULL, 0); + if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbQueryHbReqHandle put clusterId failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); + return code; + } + } } // invoke after hbGetExpiredUserInfo if (2 != atomic_load_8(&hbParam->pAppHbMgr->connHbFlag)) { code = hbGetUserAuthInfo(connKey, hbParam, req); if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetUserAuthInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); return code; } atomic_store_8(&hbParam->pAppHbMgr->connHbFlag, 1); @@ -1014,23 +1125,34 @@ int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void *param, SClientHbReq *req code = hbGetExpiredDBInfo(connKey, pCatalog, req); if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetExpiredDBInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); return code; } code = hbGetExpiredStbInfo(connKey, pCatalog, req); if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetExpiredStbInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); return code; } #ifdef TD_ENTERPRISE code = hbGetExpiredViewInfo(connKey, pCatalog, req); if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetExpiredViewInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); return code; } #endif code = hbGetExpiredTSMAInfo(connKey, pCatalog, req); + if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetExpiredTSMAInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); + return code; + } } else { - hbGetAppInfo(hbParam->clusterId, req); + code = hbGetAppInfo(hbParam->clusterId, req); + if (TSDB_CODE_SUCCESS != code) { + tscWarn("hbGetAppInfo failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code)); + return code; + } } ++hbParam->reqCnt; // success to get catalog info @@ -1047,17 +1169,16 @@ static FORCE_INLINE void hbMgrInitHandle() { clientHbMgr.rspHandle[CONN_TYPE__TMQ] = hbMqHbRspHandle; } -SClientHbBatchReq *hbGatherAllInfo(SAppHbMgr *pAppHbMgr) { - SClientHbBatchReq *pBatchReq = taosMemoryCalloc(1, sizeof(SClientHbBatchReq)); +int32_t hbGatherAllInfo(SAppHbMgr *pAppHbMgr, SClientHbBatchReq **pBatchReq) { + *pBatchReq = taosMemoryCalloc(1, sizeof(SClientHbBatchReq)); if (pBatchReq == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + return TSDB_CODE_OUT_OF_MEMORY; } int32_t connKeyCnt = atomic_load_32(&pAppHbMgr->connKeyCnt); - pBatchReq->reqs = taosArrayInit(connKeyCnt, sizeof(SClientHbReq)); - if (!pBatchReq->reqs) { - tFreeClientHbBatchReq(pBatchReq); - return NULL; + (*pBatchReq)->reqs = taosArrayInit(connKeyCnt, sizeof(SClientHbReq)); + if (!(*pBatchReq)->reqs) { + tFreeClientHbBatchReq(*pBatchReq); + return terrno; } int64_t maxIpWhiteVer = 0; @@ -1073,7 +1194,11 @@ SClientHbBatchReq *hbGatherAllInfo(SAppHbMgr *pAppHbMgr) { continue; } - pOneReq = taosArrayPush(pBatchReq->reqs, pOneReq); + pOneReq = taosArrayPush((*pBatchReq)->reqs, pOneReq); + if (NULL == pOneReq) { + releaseTscObj(connKey->tscRid); + continue; + } switch (connKey->connType) { case CONN_TYPE__QUERY: { @@ -1100,9 +1225,9 @@ SClientHbBatchReq *hbGatherAllInfo(SAppHbMgr *pAppHbMgr) { maxIpWhiteVer = TMAX(maxIpWhiteVer, ver); releaseTscObj(connKey->tscRid); } - pBatchReq->ipWhiteList = maxIpWhiteVer; + (*pBatchReq)->ipWhiteList = maxIpWhiteVer; - return pBatchReq; + return TSDB_CODE_SUCCESS; } void hbThreadFuncUnexpectedStopped(void) { atomic_store_8(&clientHbMgr.threadStop, 2); } @@ -1121,11 +1246,12 @@ void hbMergeSummary(SAppClusterSummary *dst, SAppClusterSummary *src) { int32_t hbGatherAppInfo(void) { SAppHbReq req = {0}; + int32_t code = TSDB_CODE_SUCCESS; int sz = taosArrayGetSize(clientHbMgr.appHbMgrs); if (sz > 0) { req.pid = taosGetPId(); req.appId = clientHbMgr.appId; - taosGetAppName(req.name, NULL); + TSC_ERR_RET(taosGetAppName(req.name, NULL)); } taosHashClear(clientHbMgr.appSummary); @@ -1137,9 +1263,9 @@ int32_t hbGatherAppInfo(void) { int64_t clusterId = pAppHbMgr->pAppInstInfo->clusterId; SAppHbReq *pApp = taosHashGet(clientHbMgr.appSummary, &clusterId, sizeof(clusterId)); if (NULL == pApp) { - memcpy(&req.summary, &pAppHbMgr->pAppInstInfo->summary, sizeof(req.summary)); + (void)memcpy(&req.summary, &pAppHbMgr->pAppInstInfo->summary, sizeof(req.summary)); req.startTime = pAppHbMgr->startTime; - taosHashPut(clientHbMgr.appSummary, &clusterId, sizeof(clusterId), &req, sizeof(req)); + TSC_ERR_RET(taosHashPut(clientHbMgr.appSummary, &clusterId, sizeof(clusterId), &req, sizeof(req))); } else { if (pAppHbMgr->startTime < pApp->startTime) { pApp->startTime = pAppHbMgr->startTime; @@ -1164,14 +1290,24 @@ static void *hbThreadFunc(void *param) { break; } - taosThreadMutexLock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != taosThreadMutexLock(&clientHbMgr.lock)) { + tscError("taosThreadMutexLock failed"); + return NULL; + } int sz = taosArrayGetSize(clientHbMgr.appHbMgrs); if (sz > 0) { - hbGatherAppInfo(); + if (TSDB_CODE_SUCCESS != hbGatherAppInfo()) { + tscError("hbGatherAppInfo failed"); + return NULL; + } if (sz > 1 && !clientHbMgr.appHbHash) { clientHbMgr.appHbHash = - taosHashInit(0, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); + taosHashInit(0, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), true, HASH_NO_LOCK); + if (NULL == clientHbMgr.appHbHash) { + tscError("taosHashInit failed"); + return NULL; + } } taosHashClear(clientHbMgr.appHbHash); } @@ -1186,8 +1322,10 @@ static void *hbThreadFunc(void *param) { if (connCnt == 0) { continue; } - SClientHbBatchReq *pReq = hbGatherAllInfo(pAppHbMgr); - if (pReq == NULL || taosArrayGetP(clientHbMgr.appHbMgrs, i) == NULL) { + SClientHbBatchReq *pReq = NULL; + int32_t code = hbGatherAllInfo(pAppHbMgr, &pReq); + if (TSDB_CODE_SUCCESS != code || taosArrayGetP(clientHbMgr.appHbMgrs, i) == NULL) { + terrno = code ? code : TSDB_CODE_OUT_OF_RANGE; tFreeClientHbBatchReq(pReq); continue; } @@ -1229,8 +1367,10 @@ static void *hbThreadFunc(void *param) { atomic_add_fetch_32(&pAppHbMgr->reportCnt, 1); } - taosThreadMutexUnlock(&clientHbMgr.lock); - + if (TSDB_CODE_SUCCESS != taosThreadMutexUnlock(&clientHbMgr.lock)) { + tscError("taosThreadMutexLock failed"); + return NULL; + } taosMsleep(HEARTBEAT_INTERVAL); } taosHashCleanup(clientHbMgr.appHbHash); @@ -1238,16 +1378,24 @@ static void *hbThreadFunc(void *param) { } static int32_t hbCreateThread() { + int32_t code = TSDB_CODE_SUCCESS; TdThreadAttr thAttr; - taosThreadAttrInit(&thAttr); - taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE); + TSC_ERR_JRET(taosThreadAttrInit(&thAttr)); + TSC_ERR_JRET(taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE)); if (taosThreadCreate(&clientHbMgr.thread, &thAttr, hbThreadFunc, NULL) != 0) { terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + TSC_ERR_RET(terrno); } - taosThreadAttrDestroy(&thAttr); - return 0; + (void)taosThreadAttrDestroy(&thAttr); +_return: + + if (code) { + terrno = TAOS_SYSTEM_ERROR(errno); + TSC_ERR_RET(terrno); + } + + return TSDB_CODE_SUCCESS; } static void hbStopThread() { @@ -1259,54 +1407,66 @@ static void hbStopThread() { return; } + int32_t code = TSDB_CODE_SUCCESS; // thread quit mode kill or inner exit from self-thread if (clientHbMgr.quitByKill) { - taosThreadKill(clientHbMgr.thread, 0); + code = taosThreadKill(clientHbMgr.thread, 0); + if (TSDB_CODE_SUCCESS != code) { + tscError("taosThreadKill failed since %s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } } else { - taosThreadJoin(clientHbMgr.thread, NULL); + code = taosThreadJoin(clientHbMgr.thread, NULL); + if (TSDB_CODE_SUCCESS != code) { + tscError("taosThreadJoin failed since %s", tstrerror(TAOS_SYSTEM_ERROR(errno))); + } } tscDebug("hb thread stopped"); } -SAppHbMgr *appHbMgrInit(SAppInstInfo *pAppInstInfo, char *key) { - if (hbMgrInit() != 0) { - terrno = TSDB_CODE_TSC_INTERNAL_ERROR; - return NULL; - } - SAppHbMgr *pAppHbMgr = taosMemoryMalloc(sizeof(SAppHbMgr)); - if (pAppHbMgr == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; +int32_t appHbMgrInit(SAppInstInfo *pAppInstInfo, char *key, SAppHbMgr **pAppHbMgr) { + int32_t code = TSDB_CODE_SUCCESS; + TSC_ERR_RET(hbMgrInit()); + *pAppHbMgr = taosMemoryMalloc(sizeof(SAppHbMgr)); + if (*pAppHbMgr == NULL) { + TSC_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); } // init stat - pAppHbMgr->startTime = taosGetTimestampMs(); - pAppHbMgr->connKeyCnt = 0; - pAppHbMgr->connHbFlag = 0; - pAppHbMgr->reportCnt = 0; - pAppHbMgr->reportBytes = 0; - pAppHbMgr->key = taosStrdup(key); + (*pAppHbMgr)->startTime = taosGetTimestampMs(); + (*pAppHbMgr)->connKeyCnt = 0; + (*pAppHbMgr)->connHbFlag = 0; + (*pAppHbMgr)->reportCnt = 0; + (*pAppHbMgr)->reportBytes = 0; + (*pAppHbMgr)->key = taosStrdup(key); + if ((*pAppHbMgr)->key == NULL) { + TSC_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + } // init app info - pAppHbMgr->pAppInstInfo = pAppInstInfo; + (*pAppHbMgr)->pAppInstInfo = pAppInstInfo; // init hash info - pAppHbMgr->activeInfo = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); + (*pAppHbMgr)->activeInfo = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); - if (pAppHbMgr->activeInfo == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - taosMemoryFree(pAppHbMgr); - return NULL; + if ((*pAppHbMgr)->activeInfo == NULL) { + TSC_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); } // taosHashSetFreeFp(pAppHbMgr->activeInfo, tFreeClientHbReq); - taosThreadMutexLock(&clientHbMgr.lock); - taosArrayPush(clientHbMgr.appHbMgrs, &pAppHbMgr); - pAppHbMgr->idx = taosArrayGetSize(clientHbMgr.appHbMgrs) - 1; - taosThreadMutexUnlock(&clientHbMgr.lock); + TSC_ERR_JRET(taosThreadMutexLock(&clientHbMgr.lock)); + if (taosArrayPush(clientHbMgr.appHbMgrs, &(*pAppHbMgr)) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + (void)taosThreadMutexUnlock(&clientHbMgr.lock); + goto _return; + } + (*pAppHbMgr)->idx = taosArrayGetSize(clientHbMgr.appHbMgrs) - 1; + TSC_ERR_JRET(taosThreadMutexUnlock(&clientHbMgr.lock)); - return pAppHbMgr; + return TSDB_CODE_SUCCESS; +_return: + taosMemoryFree(*pAppHbMgr); + return code; } void hbFreeAppHbMgr(SAppHbMgr *pTarget) { @@ -1324,7 +1484,11 @@ void hbFreeAppHbMgr(SAppHbMgr *pTarget) { } void hbRemoveAppHbMrg(SAppHbMgr **pAppHbMgr) { - taosThreadMutexLock(&clientHbMgr.lock); + int32_t code = TSDB_CODE_SUCCESS; + code = taosThreadMutexLock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to lock clientHbMgr, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } int32_t mgrSize = taosArrayGetSize(clientHbMgr.appHbMgrs); for (int32_t i = 0; i < mgrSize; ++i) { SAppHbMgr *pItem = taosArrayGetP(clientHbMgr.appHbMgrs, i); @@ -1335,7 +1499,10 @@ void hbRemoveAppHbMrg(SAppHbMgr **pAppHbMgr) { break; } } - taosThreadMutexUnlock(&clientHbMgr.lock); + code = taosThreadMutexUnlock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to unlock clientHbMgr, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } } void appHbMgrCleanup(void) { @@ -1347,7 +1514,7 @@ void appHbMgrCleanup(void) { } } -int hbMgrInit() { +int32_t hbMgrInit() { // init once int8_t old = atomic_val_compare_exchange_8(&clientHbMgr.inited, 0, 1); if (old == 1) return 0; @@ -1355,9 +1522,14 @@ int hbMgrInit() { clientHbMgr.appId = tGenIdPI64(); tscDebug("app %" PRIx64 " initialized", clientHbMgr.appId); - clientHbMgr.appSummary = taosHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); + clientHbMgr.appSummary = taosHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); + if (NULL == clientHbMgr.appSummary) { + uError("hbMgrInit:taosHashInit error") return terrno; + } clientHbMgr.appHbMgrs = taosArrayInit(0, sizeof(void *)); - + if (NULL == clientHbMgr.appHbMgrs) { + uError("hbMgrInit:taosArrayInit error") return terrno; + } TdThreadMutexAttr attr = {0}; int ret = taosThreadMutexAttrInit(&attr); @@ -1384,7 +1556,10 @@ int hbMgrInit() { hbMgrInitHandle(); // init backgroud thread - hbCreateThread(); + ret = hbCreateThread(); + if (ret != 0) { + uError("hbMgrInit:hbCreateThread error") return ret; + } return 0; } @@ -1396,14 +1571,20 @@ void hbMgrCleanUp() { int8_t old = atomic_val_compare_exchange_8(&clientHbMgr.inited, 1, 0); if (old == 0) return; - taosThreadMutexLock(&clientHbMgr.lock); + int32_t code = taosThreadMutexLock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to lock clientHbMgr, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } appHbMgrCleanup(); taosArrayDestroy(clientHbMgr.appHbMgrs); clientHbMgr.appHbMgrs = NULL; - taosThreadMutexUnlock(&clientHbMgr.lock); + code = taosThreadMutexUnlock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to unlock clientHbMgr, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } } -int hbRegisterConnImpl(SAppHbMgr *pAppHbMgr, SClientHbKey connKey, int64_t clusterId) { +int32_t hbRegisterConnImpl(SAppHbMgr *pAppHbMgr, SClientHbKey connKey, int64_t clusterId) { // init hash in activeinfo void *data = taosHashGet(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); if (data != NULL) { @@ -1414,13 +1595,13 @@ int hbRegisterConnImpl(SAppHbMgr *pAppHbMgr, SClientHbKey connKey, int64_t clust hbReq.clusterId = clusterId; // hbReq.info = taosHashInit(64, hbKeyHashFunc, 1, HASH_ENTRY_LOCK); - taosHashPut(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey), &hbReq, sizeof(SClientHbReq)); + TSC_ERR_RET(taosHashPut(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey), &hbReq, sizeof(SClientHbReq))); - atomic_add_fetch_32(&pAppHbMgr->connKeyCnt, 1); + (void)atomic_add_fetch_32(&pAppHbMgr->connKeyCnt, 1); return 0; } -int hbRegisterConn(SAppHbMgr *pAppHbMgr, int64_t tscRefId, int64_t clusterId, int8_t connType) { +int32_t hbRegisterConn(SAppHbMgr *pAppHbMgr, int64_t tscRefId, int64_t clusterId, int8_t connType) { SClientHbKey connKey = { .tscRid = tscRefId, .connType = connType, @@ -1439,7 +1620,10 @@ int hbRegisterConn(SAppHbMgr *pAppHbMgr, int64_t tscRefId, int64_t clusterId, in } void hbDeregisterConn(STscObj *pTscObj, SClientHbKey connKey) { - taosThreadMutexLock(&clientHbMgr.lock); + int32_t code = taosThreadMutexLock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to lock clientHbMgr, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } SAppHbMgr *pAppHbMgr = taosArrayGetP(clientHbMgr.appHbMgrs, pTscObj->appHbMgrIdx); if (pAppHbMgr) { SClientHbReq *pReq = taosHashAcquire(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); @@ -1447,10 +1631,13 @@ void hbDeregisterConn(STscObj *pTscObj, SClientHbKey connKey) { tFreeClientHbReq(pReq); taosHashRemove(pAppHbMgr->activeInfo, &connKey, sizeof(SClientHbKey)); taosHashRelease(pAppHbMgr->activeInfo, pReq); - atomic_sub_fetch_32(&pAppHbMgr->connKeyCnt, 1); + (void)atomic_sub_fetch_32(&pAppHbMgr->connKeyCnt, 1); } } - taosThreadMutexUnlock(&clientHbMgr.lock); + code = taosThreadMutexUnlock(&clientHbMgr.lock); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to unlock clientHbMgr, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + } } // set heart beat thread quit mode , if quicByKill 1 then kill thread else quit from inner diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 3fb61b6902..112731d39d 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -29,7 +29,7 @@ #include "tsched.h" #include "tversion.h" static int32_t initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet); -static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest); +static int32_t buildConnectMsg(SRequestObj* pRequest, SMsgSendInfo** pMsgSendInfo); static bool stringLengthCheck(const char* str, size_t maxsize) { if (str == NULL) { @@ -52,7 +52,7 @@ static bool validateDbName(const char* db) { return stringLengthCheck(db, TSDB_D static char* getClusterKey(const char* user, const char* auth, const char* ip, int32_t port) { char key[512] = {0}; - snprintf(key, sizeof(key), "%s:%s:%s:%d", user, auth, ip, port); + (void)snprintf(key, sizeof(key), "%s:%s:%s:%d", user, auth, ip, port); return taosStrdup(key); } @@ -63,41 +63,35 @@ bool chkRequestKilled(void* param) { killed = true; } - releaseRequest((int64_t)param); + (void)releaseRequest((int64_t)param); return killed; } -static STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __taos_async_fn_t fp, void* param, - SAppInstInfo* pAppInfo, int connType); - -STscObj* taos_connect_internal(const char* ip, const char* user, const char* pass, const char* auth, const char* db, - uint16_t port, int connType) { - if (taos_init() != TSDB_CODE_SUCCESS) { - return NULL; - } +static int32_t taosConnectImpl(const char* user, const char* auth, const char* db, __taos_async_fn_t fp, void* param, + SAppInstInfo* pAppInfo, int connType, STscObj** pTscObj); +int32_t taos_connect_internal(const char* ip, const char* user, const char* pass, const char* auth, const char* db, + uint16_t port, int connType, STscObj** pObj) { + TSC_ERR_RET(taos_init()); if (!validateUserName(user)) { - terrno = TSDB_CODE_TSC_INVALID_USER_LENGTH; - return NULL; + TSC_ERR_RET(TSDB_CODE_TSC_INVALID_USER_LENGTH); } char localDb[TSDB_DB_NAME_LEN] = {0}; if (db != NULL && strlen(db) > 0) { if (!validateDbName(db)) { - terrno = TSDB_CODE_TSC_INVALID_DB_LENGTH; - return NULL; + TSC_ERR_RET(TSDB_CODE_TSC_INVALID_DB_LENGTH); } tstrncpy(localDb, db, sizeof(localDb)); - strdequote(localDb); + (void)strdequote(localDb); } char secretEncrypt[TSDB_PASSWORD_LEN + 1] = {0}; if (auth == NULL) { if (!validatePassword(pass)) { - terrno = TSDB_CODE_TSC_INVALID_PASS_LENGTH; - return NULL; + TSC_ERR_RET(TSDB_CODE_TSC_INVALID_PASS_LENGTH); } taosEncryptPass_c((uint8_t*)pass, strlen(pass), secretEncrypt); @@ -107,13 +101,9 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas SCorEpSet epSet = {0}; if (ip) { - if (initEpSetFromCfg(ip, NULL, &epSet) < 0) { - return NULL; - } + TSC_ERR_RET(initEpSetFromCfg(ip, NULL, &epSet)); } else { - if (initEpSetFromCfg(tsFirst, tsSecond, &epSet) < 0) { - return NULL; - } + TSC_ERR_RET(initEpSetFromCfg(tsFirst, tsSecond, &epSet)); } if (port) { @@ -122,7 +112,9 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas } char* key = getClusterKey(user, secretEncrypt, ip, port); - + if (NULL == key) { + TSC_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + } tscInfo("connecting to server, numOfEps:%d inUse:%d user:%s db:%s key:%s", epSet.epSet.numOfEps, epSet.epSet.inUse, user, db, key); for (int32_t i = 0; i < epSet.epSet.numOfEps; ++i) { @@ -130,29 +122,40 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas } SAppInstInfo** pInst = NULL; - taosThreadMutexLock(&appInfo.mutex); + int32_t code = taosThreadMutexLock(&appInfo.mutex); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to lock app info, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + TSC_ERR_RET(code); + } pInst = taosHashGet(appInfo.pInstMap, key, strlen(key)); SAppInstInfo* p = NULL; if (pInst == NULL) { p = taosMemoryCalloc(1, sizeof(struct SAppInstInfo)); + if (NULL == p) { + TSC_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + } p->mgmtEp = epSet; - taosThreadMutexInit(&p->qnodeMutex, NULL); - p->pTransporter = openTransporter(user, secretEncrypt, tsNumOfCores / 2); - if (p->pTransporter == NULL) { - taosThreadMutexUnlock(&appInfo.mutex); - taosMemoryFreeClear(key); + code = taosThreadMutexInit(&p->qnodeMutex, NULL); + if (TSDB_CODE_SUCCESS != code) { taosMemoryFree(p); - return NULL; + TSC_ERR_JRET(code); } - p->pAppHbMgr = appHbMgrInit(p, key); - if (NULL == p->pAppHbMgr) { + code = openTransporter(user, secretEncrypt, tsNumOfCores / 2, &p->pTransporter); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(p); + TSC_ERR_JRET(code); + } + code = appHbMgrInit(p, key, &p->pAppHbMgr); + if (TSDB_CODE_SUCCESS != code) { destroyAppInst(&p); - taosThreadMutexUnlock(&appInfo.mutex); - taosMemoryFreeClear(key); - return NULL; + TSC_ERR_JRET(code); + } + code = taosHashPut(appInfo.pInstMap, key, strlen(key), &p, POINTER_BYTES); + if (TSDB_CODE_SUCCESS != code) { + destroyAppInst(&p); + TSC_ERR_JRET(code); } - taosHashPut(appInfo.pInstMap, key, strlen(key), &p, POINTER_BYTES); p->instKey = key; key = NULL; tscDebug("new app inst mgr %p, user:%s, ip:%s, port:%d", p, user, epSet.epSet.eps[0].fqdn, epSet.epSet.eps[0].port); @@ -164,11 +167,17 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas atomic_store_8(&(*pInst)->pAppHbMgr->connHbFlag, 0); } - taosThreadMutexUnlock(&appInfo.mutex); +_return: + + code = taosThreadMutexUnlock(&appInfo.mutex); + if (TSDB_CODE_SUCCESS != code) { + tscError("failed to unlock app info, code:%s", tstrerror(TAOS_SYSTEM_ERROR(code))); + return code; + } taosMemoryFreeClear(key); - return taosConnectImpl(user, &secretEncrypt[0], localDb, NULL, NULL, *pInst, connType); + return taosConnectImpl(user, &secretEncrypt[0], localDb, NULL, NULL, *pInst, connType, pObj); } //SAppInstInfo* getAppInstInfo(const char* clusterKey) { @@ -182,16 +191,16 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas void freeQueryParam(SSyncQueryParam* param) { if (param == NULL) return; - tsem_destroy(¶m->sem); + (void)tsem_destroy(¶m->sem); taosMemoryFree(param); } int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql, SRequestObj** pRequest, int64_t reqid) { - *pRequest = createRequest(connId, TSDB_SQL_SELECT, reqid); - if (*pRequest == NULL) { + int32_t code = createRequest(connId, TSDB_SQL_SELECT, reqid, pRequest); + if (TSDB_CODE_SUCCESS != code) { tscError("failed to malloc sqlObj, %s", sql); - return terrno; + return code; } (*pRequest)->sqlstr = taosMemoryMalloc(sqlLen + 1); @@ -202,7 +211,7 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, return TSDB_CODE_OUT_OF_MEMORY; } - strntolower((*pRequest)->sqlstr, sql, (int32_t)sqlLen); + (void)strntolower((*pRequest)->sqlstr, sql, (int32_t)sqlLen); (*pRequest)->sqlstr[sqlLen] = 0; (*pRequest)->sqlLen = sqlLen; (*pRequest)->validateOnly = validateSql; @@ -279,7 +288,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtC code = qParseSql(&cxt, pQuery); if (TSDB_CODE_SUCCESS == code) { if ((*pQuery)->haveResultSet) { - setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols); + code = setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols); setResPrecision(&pRequest->body.resInfo, (*pQuery)->precision); } } @@ -322,9 +331,9 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) { SMsgSendInfo* pSendMsg = buildMsgInfoImpl(pRequest); int64_t transporterId = 0; - asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pMsgInfo->epSet, &transporterId, pSendMsg); + TSC_ERR_RET(asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pMsgInfo->epSet, &transporterId, pSendMsg)); - tsem_wait(&pRequest->body.rspSem); + (void)tsem_wait(&pRequest->body.rspSem); return TSDB_CODE_SUCCESS; } @@ -399,7 +408,7 @@ int compareQueryNodeLoad(const void* elem1, const void* elem2) { } int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList) { - taosThreadMutexLock(&pInfo->qnodeMutex); + TSC_ERR_RET(taosThreadMutexLock(&pInfo->qnodeMutex)); if (pInfo->pQnodeList) { taosArrayDestroy(pInfo->pQnodeList); pInfo->pQnodeList = NULL; @@ -412,41 +421,44 @@ int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList) { tscDebug("QnodeList updated in cluster 0x%" PRIx64 ", num:%ld", pInfo->clusterId, taosArrayGetSize(pInfo->pQnodeList)); } - taosThreadMutexUnlock(&pInfo->qnodeMutex); + TSC_ERR_RET(taosThreadMutexUnlock(&pInfo->qnodeMutex)); return TSDB_CODE_SUCCESS; } -bool qnodeRequired(SRequestObj* pRequest) { +int32_t qnodeRequired(SRequestObj* pRequest, bool *required) { if (QUERY_POLICY_VNODE == tsQueryPolicy || QUERY_POLICY_CLIENT == tsQueryPolicy) { - return false; + *required = false; + return TSDB_CODE_SUCCESS; } + int32_t code = TSDB_CODE_SUCCESS; SAppInstInfo* pInfo = pRequest->pTscObj->pAppInfo; - bool required = false; + *required = false; - taosThreadMutexLock(&pInfo->qnodeMutex); - required = (NULL == pInfo->pQnodeList); - taosThreadMutexUnlock(&pInfo->qnodeMutex); - - return required; + TSC_ERR_RET(taosThreadMutexLock(&pInfo->qnodeMutex)); + *required = (NULL == pInfo->pQnodeList); + TSC_ERR_RET(taosThreadMutexUnlock(&pInfo->qnodeMutex)); + return TSDB_CODE_SUCCESS; } int32_t getQnodeList(SRequestObj* pRequest, SArray** pNodeList) { SAppInstInfo* pInfo = pRequest->pTscObj->pAppInfo; int32_t code = 0; - taosThreadMutexLock(&pInfo->qnodeMutex); + TSC_ERR_RET(taosThreadMutexLock(&pInfo->qnodeMutex)); if (pInfo->pQnodeList) { *pNodeList = taosArrayDup(pInfo->pQnodeList, NULL); } - taosThreadMutexUnlock(&pInfo->qnodeMutex); - + TSC_ERR_RET(taosThreadMutexUnlock(&pInfo->qnodeMutex)); if (NULL == *pNodeList) { SCatalog* pCatalog = NULL; code = catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog); if (TSDB_CODE_SUCCESS == code) { *pNodeList = taosArrayInit(5, sizeof(SQueryNodeLoad)); + if (NULL == pNodeList) { + TSC_ERR_RET(terrno); + } SRequestConnInfo conn = {.pTrans = pRequest->pTscObj->pAppInfo->pTransporter, .requestId = pRequest->requestId, .requestObjRefId = pRequest->self, @@ -479,10 +491,10 @@ int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArra return qCreateQueryPlan(&cxt, pPlan, pNodeList); } -void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols) { +int32_t setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols) { if (pResInfo == NULL || pSchema == NULL || numOfCols <= 0) { tscError("invalid paras, pResInfo == NULL || pSchema == NULL || numOfCols <= 0"); - return; + return TSDB_CODE_INVALID_PARA; } pResInfo->numOfCols = numOfCols; @@ -494,9 +506,12 @@ void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t } pResInfo->fields = taosMemoryCalloc(numOfCols, sizeof(TAOS_FIELD)); pResInfo->userFields = taosMemoryCalloc(numOfCols, sizeof(TAOS_FIELD)); + if (NULL == pResInfo->fields || NULL == pResInfo->userFields) { + return TSDB_CODE_OUT_OF_MEMORY; + } if (numOfCols != pResInfo->numOfCols) { tscError("numOfCols:%d != pResInfo->numOfCols:%d", numOfCols, pResInfo->numOfCols); - return; + return TSDB_CODE_FAILED; } for (int32_t i = 0; i < pResInfo->numOfCols; ++i) { @@ -516,6 +531,7 @@ void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t tstrncpy(pResInfo->fields[i].name, pSchema[i].name, tListLen(pResInfo->fields[i].name)); tstrncpy(pResInfo->userFields[i].name, pSchema[i].name, tListLen(pResInfo->userFields[i].name)); } + return TSDB_CODE_SUCCESS; } void setResPrecision(SReqResultInfo* pResInfo, int32_t precision) { @@ -529,11 +545,17 @@ void setResPrecision(SReqResultInfo* pResInfo, int32_t precision) { int32_t buildVnodePolicyNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* pMnodeList, SArray* pDbVgList) { SArray* nodeList = taosArrayInit(4, sizeof(SQueryNodeLoad)); + if (NULL == nodeList) { + return terrno; + } char* policy = (tsQueryPolicy == QUERY_POLICY_VNODE) ? "vnode" : "client"; int32_t dbNum = taosArrayGetSize(pDbVgList); for (int32_t i = 0; i < dbNum; ++i) { SArray* pVg = taosArrayGetP(pDbVgList, i); + if (NULL == pVg) { + continue; + } int32_t vgNum = taosArrayGetSize(pVg); if (vgNum <= 0) { continue; @@ -541,11 +563,18 @@ int32_t buildVnodePolicyNodeList(SRequestObj* pRequest, SArray** pNodeList, SArr for (int32_t j = 0; j < vgNum; ++j) { SVgroupInfo* pInfo = taosArrayGet(pVg, j); + if (NULL == pInfo) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_RANGE; + } SQueryNodeLoad load = {0}; load.addr.nodeId = pInfo->vgId; load.addr.epSet = pInfo->epSet; - taosArrayPush(nodeList, &load); + if (NULL == taosArrayPush(nodeList, &load)) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_MEMORY; + } } } @@ -562,7 +591,14 @@ int32_t buildVnodePolicyNodeList(SRequestObj* pRequest, SArray** pNodeList, SArr } void* pData = taosArrayGet(pMnodeList, 0); - taosArrayAddBatch(nodeList, pData, mnodeNum); + if (NULL == pData) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_RANGE; + } + if (NULL == taosArrayAddBatch(nodeList, pData, mnodeNum)) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_MEMORY; + } tscDebug("0x%" PRIx64 " %s policy, use mnode list, num:%d", pRequest->requestId, policy, mnodeNum); @@ -575,11 +611,21 @@ _return: int32_t buildQnodePolicyNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* pMnodeList, SArray* pQnodeList) { SArray* nodeList = taosArrayInit(4, sizeof(SQueryNodeLoad)); + if (NULL == nodeList) { + return terrno; + } int32_t qNodeNum = taosArrayGetSize(pQnodeList); if (qNodeNum > 0) { void* pData = taosArrayGet(pQnodeList, 0); - taosArrayAddBatch(nodeList, pData, qNodeNum); + if (NULL == pData) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_RANGE; + } + if (NULL == taosArrayAddBatch(nodeList, pData, qNodeNum)) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_MEMORY; + } tscDebug("0x%" PRIx64 " qnode policy, use qnode list, num:%d", pRequest->requestId, qNodeNum); goto _return; } @@ -591,7 +637,14 @@ int32_t buildQnodePolicyNodeList(SRequestObj* pRequest, SArray** pNodeList, SArr } void* pData = taosArrayGet(pMnodeList, 0); - taosArrayAddBatch(nodeList, pData, mnodeNum); + if (NULL == pData) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_RANGE; + } + if (NULL == taosArrayAddBatch(nodeList, pData, mnodeNum)) { + taosArrayDestroy(nodeList); + return TSDB_CODE_OUT_OF_MEMORY; + } tscDebug("0x%" PRIx64 " qnode policy, use mnode list, num:%d", pRequest->requestId, mnodeNum); @@ -612,7 +665,10 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray case QUERY_POLICY_CLIENT: { if (pResultMeta) { pDbVgList = taosArrayInit(4, POINTER_BYTES); - + if (NULL == pDbVgList) { + code = terrno; + goto _return; + } int32_t dbNum = taosArrayGetSize(pResultMeta->pDbVgroup); for (int32_t i = 0; i < dbNum; ++i) { SMetaRes* pRes = taosArrayGet(pResultMeta->pDbVgroup, i); @@ -620,7 +676,10 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray continue; } - taosArrayPush(pDbVgList, &pRes->pRes); + if (NULL == taosArrayPush(pDbVgList, &pRes->pRes)) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _return; + } } } @@ -635,14 +694,22 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray pQnodeList = NULL; } else { pQnodeList = taosArrayDup((SArray*)pRes->pRes, NULL); + if (NULL == pQnodeList) { + code = terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY; + goto _return; + } } } else { SAppInstInfo* pInst = pRequest->pTscObj->pAppInfo; - taosThreadMutexLock(&pInst->qnodeMutex); + TSC_ERR_JRET(taosThreadMutexLock(&pInst->qnodeMutex)); if (pInst->pQnodeList) { pQnodeList = taosArrayDup(pInst->pQnodeList, NULL); + if (NULL == pQnodeList) { + code = terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY; + goto _return; + } } - taosThreadMutexUnlock(&pInst->qnodeMutex); + TSC_ERR_JRET(taosThreadMutexUnlock(&pInst->qnodeMutex)); } code = buildQnodePolicyNodeList(pRequest, pNodeList, pMnodeList, pQnodeList); @@ -653,6 +720,7 @@ int32_t buildAsyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray return TSDB_CODE_APP_ERROR; } +_return: taosArrayDestroy(pDbVgList); taosArrayDestroy(pQnodeList); @@ -682,6 +750,10 @@ int32_t buildSyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* } pDbVgList = taosArrayInit(dbNum, POINTER_BYTES); + if (NULL == pDbVgList) { + code = terrno; + goto _return; + } SArray* pVgList = NULL; for (int32_t i = 0; i < dbNum; ++i) { char* dbFName = taosArrayGet(pRequest->dbList, i); @@ -690,12 +762,16 @@ int32_t buildSyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* .requestObjRefId = pRequest->self, .mgmtEps = getEpSet_s(&pInst->mgmtEp)}; + // catalogGetDBVgList will handle dbFName == null. code = catalogGetDBVgList(pCtg, &conn, dbFName, &pVgList); if (code) { goto _return; } - taosArrayPush(pDbVgList, &pVgList); + if (NULL == taosArrayPush(pDbVgList, &pVgList)) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _return; + } } } @@ -704,7 +780,7 @@ int32_t buildSyncExecNodeList(SRequestObj* pRequest, SArray** pNodeList, SArray* } case QUERY_POLICY_HYBRID: case QUERY_POLICY_QNODE: { - getQnodeList(pRequest, &pQnodeList); + TSC_ERR_JRET(getQnodeList(pRequest, &pQnodeList)); code = buildQnodePolicyNodeList(pRequest, pNodeList, pMnodeList, pQnodeList); break; @@ -748,7 +824,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList int32_t code = schedulerExecJob(&req, &pRequest->body.queryJob); destroyQueryExecRes(&pRequest->body.resInfo.execRes); - memcpy(&pRequest->body.resInfo.execRes, &res, sizeof(res)); + (void)memcpy(&pRequest->body.resInfo.execRes, &res, sizeof(res)); if (code != TSDB_CODE_SUCCESS) { schedulerFreeJob(&pRequest->body.queryJob, 0); @@ -764,7 +840,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList if (TDMT_VND_SUBMIT == pRequest->type) { STscObj* pTscObj = pRequest->pTscObj; SAppClusterSummary* pActivity = &pTscObj->pAppInfo->summary; - atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertRows, res.numOfRows); + (void)atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertRows, res.numOfRows); } schedulerFreeJob(&pRequest->body.queryJob, 0); @@ -786,7 +862,7 @@ int32_t handleSubmitExecRes(SRequestObj* pRequest, void* res, SCatalog* pCatalog for (int32_t i = 0; i < tbNum; ++i) { SVCreateTbRsp* pTbRsp = (SVCreateTbRsp*)taosArrayGet(pRsp->aCreateTbRsp, i); if (pTbRsp->pMeta) { - handleCreateTbExecRes(pTbRsp->pMeta, pCatalog); + TSC_ERR_RET(handleCreateTbExecRes(pTbRsp->pMeta, pCatalog)); } } @@ -810,8 +886,15 @@ int32_t handleQueryExecRes(SRequestObj* pRequest, void* res, SCatalog* pCatalog, for (int32_t i = 0; i < tbNum; ++i) { STbVerInfo* tbInfo = taosArrayGet(pTbArray, i); + if (NULL == tbInfo) { + code = TSDB_CODE_OUT_OF_RANGE; + goto _return; + } STbSVersion tbSver = {.tbFName = tbInfo->tbFName, .sver = tbInfo->sversion, .tver = tbInfo->tversion}; - taosArrayPush(pArray, &tbSver); + if (NULL == taosArrayPush(pArray, &tbSver)) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _return; + } } SRequestConnInfo conn = {.pTrans = pRequest->pTscObj->pAppInfo->pTransporter, @@ -862,6 +945,7 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) { int32_t num = taosArrayGetSize(pList); for (int32_t i = 0; i < num; ++i) { void* res = taosArrayGetP(pList, i); + // handleCreateTbExecRes will handle res == null code = handleCreateTbExecRes(res, pCatalog); } break; @@ -871,7 +955,7 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) { break; } case TDMT_VND_SUBMIT: { - atomic_add_fetch_64((int64_t*)&pAppInfo->summary.insertBytes, pRes->numOfBytes); + (void)atomic_add_fetch_64((int64_t*)&pAppInfo->summary.insertBytes, pRes->numOfBytes); code = handleSubmitExecRes(pRequest, pRes->res, pCatalog, &epset); break; @@ -908,7 +992,7 @@ void continuePostSubQuery(SRequestObj* pRequest, SSDataBlock* pBlock) { code = qContinuePlanPostQuery(pRequest->pPostPlan); } - nodesReleaseAllocator(pWrapper->pParseCtx->allocatorId); + code = nodesReleaseAllocator(pWrapper->pParseCtx->allocatorId); handleQueryAnslyseRes(pWrapper, NULL, code); } @@ -924,7 +1008,7 @@ void returnToUser(SRequestObj* pRequest) { pUserReq->code = pRequest->code; // return to client doRequestCallback(pUserReq, pUserReq->code); - releaseRequest(pRequest->relation.userRefId); + (void)releaseRequest(pRequest->relation.userRefId); return; } else { tscError("0x%" PRIx64 ", user ref 0x%" PRIx64 " is not there, reqId:0x%" PRIx64, pRequest->self, @@ -932,20 +1016,32 @@ void returnToUser(SRequestObj* pRequest) { } } -static SSDataBlock* createResultBlock(TAOS_RES* pRes, int32_t numOfRows) { +static int32_t createResultBlock(TAOS_RES* pRes, int32_t numOfRows, SSDataBlock**pBlock) { int64_t lastTs = 0; + int32_t code = TSDB_CODE_SUCCESS; TAOS_FIELD* pResFields = taos_fetch_fields(pRes); int32_t numOfFields = taos_num_fields(pRes); - SSDataBlock* pBlock = createDataBlock(); + *pBlock = createDataBlock(); + if (NULL == *pBlock) { + return terrno; + } for(int32_t i = 0; i < numOfFields; ++i) { SColumnInfoData colInfoData = createColumnInfoData(pResFields[i].type, pResFields[i].bytes, i + 1); - blockDataAppendColInfo(pBlock, &colInfoData); + code = blockDataAppendColInfo(*pBlock, &colInfoData); + if (TSDB_CODE_SUCCESS != code) { + blockDataDestroy(*pBlock); + return code; + } } - blockDataEnsureCapacity(pBlock, numOfRows); + code = blockDataEnsureCapacity(*pBlock, numOfRows); + if (TSDB_CODE_SUCCESS != code) { + blockDataDestroy(*pBlock); + return code; + } for (int32_t i = 0; i < numOfRows; ++i) { TAOS_ROW pRow = taos_fetch_row(pRes); @@ -955,18 +1051,22 @@ static SSDataBlock* createResultBlock(TAOS_RES* pRes, int32_t numOfRows) { } for(int32_t j = 0; j < numOfFields; ++j) { - SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, j); - colDataSetVal(pColInfoData, i, pRow[j], false); + SColumnInfoData* pColInfoData = taosArrayGet((*pBlock)->pDataBlock, j); + code = colDataSetVal(pColInfoData, i, pRow[j], false); + if (TSDB_CODE_SUCCESS != code) { + blockDataDestroy(*pBlock); + return code; + } } tscDebug("lastKey:%" PRId64 " vgId:%d, vgVer:%" PRId64, ts, *(int32_t*)pRow[1], *(int64_t*)pRow[2]); } - pBlock->info.window.ekey = lastTs; - pBlock->info.rows = numOfRows; + (*pBlock)->info.window.ekey = lastTs; + (*pBlock)->info.rows = numOfRows; tscDebug("lastKey:%"PRId64" numOfRows:%d from all vgroups", lastTs, numOfRows); - return pBlock; + return TSDB_CODE_SUCCESS; } void postSubQueryFetchCb(void* param, TAOS_RES* res, int32_t rowNum) { @@ -976,7 +1076,12 @@ void postSubQueryFetchCb(void* param, TAOS_RES* res, int32_t rowNum) { return; } - SSDataBlock* pBlock = createResultBlock(res, rowNum); + SSDataBlock* pBlock = NULL; + if (TSDB_CODE_SUCCESS != createResultBlock(res, rowNum, &pBlock)) { + tscError("0x%" PRIx64 ", create result block failed, reqId:0x%" PRIx64, pRequest->self, pRequest->requestId); + return; + } + SRequestObj* pNextReq = acquireRequest(pRequest->relation.nextRefId); if (pNextReq) { continuePostSubQuery(pNextReq, pBlock); @@ -999,7 +1104,7 @@ void handlePostSubQuery(SSqlCallbackWrapper* pWrapper) { SRequestObj* pNextReq = acquireRequest(pRequest->relation.nextRefId); if (pNextReq) { continuePostSubQuery(pNextReq, NULL); - releaseRequest(pRequest->relation.nextRefId); + (void)releaseRequest(pRequest->relation.nextRefId); } else { tscError("0x%" PRIx64 ", next req ref 0x%" PRIx64 " is not there, reqId:0x%" PRIx64, pRequest->self, pRequest->relation.nextRefId, pRequest->requestId); @@ -1015,7 +1120,7 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { pRequest->code = code; if (pResult) { destroyQueryExecRes(&pRequest->body.resInfo.execRes); - memcpy(&pRequest->body.resInfo.execRes, pResult, sizeof(*pResult)); + (void)memcpy(&pRequest->body.resInfo.execRes, pResult, sizeof(*pResult)); } int32_t type = pRequest->type; @@ -1026,7 +1131,7 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { // record the insert rows if (TDMT_VND_SUBMIT == type) { SAppClusterSummary* pActivity = &pTscObj->pAppInfo->summary; - atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertRows, pResult->numOfRows); + (void)atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertRows, pResult->numOfRows); } } @@ -1040,14 +1145,14 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) { if (code != TSDB_CODE_SUCCESS && NEED_CLIENT_HANDLE_ERROR(code) && pRequest->sqlstr != NULL) { tscDebug("0x%" PRIx64 " client retry to handle the error, code:%s, tryCount:%d, reqId:0x%" PRIx64, pRequest->self, tstrerror(code), pRequest->retry, pRequest->requestId); - removeMeta(pTscObj, pRequest->targetTableList, IS_VIEW_REQUEST(pRequest->type)); + (void)removeMeta(pTscObj, pRequest->targetTableList, IS_VIEW_REQUEST(pRequest->type)); restartAsyncQuery(pRequest, code); return; } tscDebug("schedulerExecCb request type %s", TMSG_INFO(pRequest->type)); if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type) && NULL == pRequest->body.resInfo.execRes.res) { - removeMeta(pTscObj, pRequest->targetTableList, IS_VIEW_REQUEST(pRequest->type)); + (void)removeMeta(pTscObj, pRequest->targetTableList, IS_VIEW_REQUEST(pRequest->type)); } pRequest->metric.execCostUs = taosGetTimestampUs() - pRequest->metric.execStart; @@ -1084,9 +1189,9 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue STscObj* pTscObj = pRequest->pTscObj; SAppClusterSummary* pActivity = &pTscObj->pAppInfo->summary; if (QUERY_NODE_VNODE_MODIFY_STMT == pQuery->pRoot->type) { - atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertsReq, 1); + (void)atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertsReq, 1); } else if (QUERY_NODE_SELECT_STMT == pQuery->pRoot->type) { - atomic_add_fetch_64((int64_t*)&pActivity->numOfQueryReq, 1); + (void)atomic_add_fetch_64((int64_t*)&pActivity->numOfQueryReq, 1); } } @@ -1109,15 +1214,20 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue break; case QUERY_EXEC_MODE_SCHEDULE: { SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad)); + if (NULL == pMnodeList) { + code = terrno; + break; + } SQueryPlan* pDag = NULL; code = getPlan(pRequest, pQuery, &pDag, pMnodeList); if (TSDB_CODE_SUCCESS == code) { pRequest->body.subplanNum = pDag->numOfSubplans; if (!pRequest->validateOnly) { SArray* pNodeList = NULL; - buildSyncExecNodeList(pRequest, &pNodeList, pMnodeList); - - code = scheduleQuery(pRequest, pDag, pNodeList); + code = buildSyncExecNodeList(pRequest, &pNodeList, pMnodeList); + if (TSDB_CODE_SUCCESS == code) { + code = scheduleQuery(pRequest, pDag, pNodeList); + } taosArrayDestroy(pNodeList); } } @@ -1136,10 +1246,12 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue } if (NEED_CLIENT_RM_TBLMETA_REQ(pRequest->type) && NULL == pRequest->body.resInfo.execRes.res) { - removeMeta(pRequest->pTscObj, pRequest->targetTableList, IS_VIEW_REQUEST(pRequest->type)); + (void)removeMeta(pRequest->pTscObj, pRequest->targetTableList, IS_VIEW_REQUEST(pRequest->type)); } - handleQueryExecRsp(pRequest); + if (TSDB_CODE_SUCCESS == code) { + code = handleQueryExecRsp(pRequest); + } if (TSDB_CODE_SUCCESS != code) { pRequest->code = terrno; @@ -1163,7 +1275,9 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat if (!pRequest->parseOnly) { pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad)); - + if (NULL == pMnodeList) { + code = terrno; + } SPlanContext cxt = {.queryId = pRequest->requestId, .acctId = pRequest->pTscObj->acctId, .mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp), @@ -1176,8 +1290,9 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat .pUser = pRequest->pTscObj->user, .sysInfo = pRequest->pTscObj->sysInfo, .allocatorId = pRequest->allocatorRefId}; - - code = qCreateQueryPlan(&cxt, &pDag, pMnodeList); + if (TSDB_CODE_SUCCESS == code) { + code = qCreateQueryPlan(&cxt, &pDag, pMnodeList); + } if (code) { tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code), pRequest->requestId); @@ -1193,7 +1308,7 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) { SArray* pNodeList = NULL; if (QUERY_NODE_VNODE_MODIFY_STMT != nodeType(pQuery->pRoot)) { - buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta); + code = buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta); } SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter, @@ -1215,7 +1330,9 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat .pExecRes = NULL, .source = pRequest->source, }; - code = schedulerExecJob(&req, &pRequest->body.queryJob); + if (TSDB_CODE_SUCCESS == code) { + code = schedulerExecJob(&req, &pRequest->body.queryJob); + } taosArrayDestroy(pNodeList); } else { qDestroyQueryPlan(pDag); @@ -1255,9 +1372,9 @@ void launchAsyncQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaData* pResultM SAppClusterSummary* pActivity = &pTscObj->pAppInfo->summary; if (QUERY_NODE_VNODE_MODIFY_STMT == pQuery->pRoot->type && (0 == ((SVnodeModifyOpStmt*)pQuery->pRoot)->sqlNodeType)) { - atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertsReq, 1); + (void)atomic_add_fetch_64((int64_t*)&pActivity->numOfInsertsReq, 1); } else if (QUERY_NODE_SELECT_STMT == pQuery->pRoot->type) { - atomic_add_fetch_64((int64_t*)&pActivity->numOfQueryReq, 1); + (void)atomic_add_fetch_64((int64_t*)&pActivity->numOfQueryReq, 1); } } @@ -1306,6 +1423,7 @@ int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest) { for (int32_t i = 0; i < dbNum; ++i) { char* dbFName = taosArrayGet(pRequest->dbList, i); + // catalogRefreshDBVgInfo will handle dbFName == null. code = catalogRefreshDBVgInfo(pCatalog, &conn, dbFName); if (code != TSDB_CODE_SUCCESS) { return code; @@ -1315,6 +1433,7 @@ int32_t refreshMeta(STscObj* pTscObj, SRequestObj* pRequest) { for (int32_t i = 0; i < tblNum; ++i) { SName* tableName = taosArrayGet(pRequest->tableList, i); + // catalogRefreshTableMeta will handle tableName == null. code = catalogRefreshTableMeta(pCatalog, &conn, tableName, -1); if (code != TSDB_CODE_SUCCESS) { return code; @@ -1336,20 +1455,23 @@ int32_t removeMeta(STscObj* pTscObj, SArray* tbList, bool isView) { for (int32_t i = 0; i < tbNum; ++i) { SName* pViewName = taosArrayGet(tbList, i); char dbFName[TSDB_DB_FNAME_LEN]; - tNameGetFullDbName(pViewName, dbFName); - catalogRemoveViewMeta(pCatalog, dbFName, 0, pViewName->tname, 0); + if (NULL == pViewName) { + continue; + } + (void)tNameGetFullDbName(pViewName, dbFName); + (void)catalogRemoveViewMeta(pCatalog, dbFName, 0, pViewName->tname, 0); } } else { for (int32_t i = 0; i < tbNum; ++i) { SName* pTbName = taosArrayGet(tbList, i); - catalogRemoveTableMeta(pCatalog, pTbName); + (void)catalogRemoveTableMeta(pCatalog, pTbName); } } return TSDB_CODE_SUCCESS; } -int initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet) { +int32_t initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSet) { pEpSet->version = 0; // init mnode ip set @@ -1368,11 +1490,12 @@ int initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSe terrno = TSDB_CODE_TSC_INVALID_FQDN; return terrno; } - uint32_t addr = taosGetIpv4FromFqdn(mgmtEpSet->eps[mgmtEpSet->numOfEps].fqdn); - if (addr == 0xffffffff) { + uint32_t addr = 0; + code = taosGetIpv4FromFqdn(mgmtEpSet->eps[mgmtEpSet->numOfEps].fqdn, &addr); + if (code) { tscError("failed to resolve firstEp fqdn: %s, code:%s", mgmtEpSet->eps[mgmtEpSet->numOfEps].fqdn, tstrerror(TSDB_CODE_TSC_INVALID_FQDN)); - memset(&(mgmtEpSet->eps[mgmtEpSet->numOfEps]), 0, sizeof(mgmtEpSet->eps[mgmtEpSet->numOfEps])); + (void)memset(&(mgmtEpSet->eps[mgmtEpSet->numOfEps]), 0, sizeof(mgmtEpSet->eps[mgmtEpSet->numOfEps])); } else { mgmtEpSet->numOfEps++; } @@ -1381,15 +1504,19 @@ int initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSe if (secondEp && secondEp[0] != 0) { if (strlen(secondEp) >= TSDB_EP_LEN) { terrno = TSDB_CODE_TSC_INVALID_FQDN; - return -1; + return terrno; } - taosGetFqdnPortFromEp(secondEp, &mgmtEpSet->eps[mgmtEpSet->numOfEps]); - uint32_t addr = taosGetIpv4FromFqdn(mgmtEpSet->eps[mgmtEpSet->numOfEps].fqdn); - if (addr == 0xffffffff) { + int32_t code = taosGetFqdnPortFromEp(secondEp, &mgmtEpSet->eps[mgmtEpSet->numOfEps]); + if (code != TSDB_CODE_SUCCESS) { + return code; + } + uint32_t addr = 0; + code = taosGetIpv4FromFqdn(mgmtEpSet->eps[mgmtEpSet->numOfEps].fqdn, &addr); + if (code) { tscError("failed to resolve secondEp fqdn: %s, code:%s", mgmtEpSet->eps[mgmtEpSet->numOfEps].fqdn, tstrerror(TSDB_CODE_TSC_INVALID_FQDN)); - memset(&(mgmtEpSet->eps[mgmtEpSet->numOfEps]), 0, sizeof(mgmtEpSet->eps[mgmtEpSet->numOfEps])); + (void)memset(&(mgmtEpSet->eps[mgmtEpSet->numOfEps]), 0, sizeof(mgmtEpSet->eps[mgmtEpSet->numOfEps])); } else { mgmtEpSet->numOfEps++; } @@ -1403,18 +1530,19 @@ int initEpSetFromCfg(const char* firstEp, const char* secondEp, SCorEpSet* pEpSe return 0; } -STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __taos_async_fn_t fp, void* param, - SAppInstInfo* pAppInfo, int connType) { - STscObj* pTscObj = createTscObj(user, auth, db, connType, pAppInfo); - if (NULL == pTscObj) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return pTscObj; +int32_t taosConnectImpl(const char* user, const char* auth, const char* db, __taos_async_fn_t fp, void* param, + SAppInstInfo* pAppInfo, int connType, STscObj** pTscObj) { + *pTscObj = NULL; + int32_t code = createTscObj(user, auth, db, connType, pAppInfo, pTscObj); + if (TSDB_CODE_SUCCESS != code) { + return code; } - SRequestObj* pRequest = createRequest(pTscObj->id, TDMT_MND_CONNECT, 0); - if (pRequest == NULL) { - destroyTscObj(pTscObj); - return NULL; + SRequestObj* pRequest = NULL; + code = createRequest((*pTscObj)->id, TDMT_MND_CONNECT, 0, &pRequest); + if (TSDB_CODE_SUCCESS != code) { + destroyTscObj(*pTscObj); + return code; } pRequest->sqlstr = taosStrdup("taos_connect"); @@ -1422,45 +1550,56 @@ STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __t pRequest->sqlLen = strlen(pRequest->sqlstr); } - SMsgSendInfo* body = buildConnectMsg(pRequest); + SMsgSendInfo* body = NULL; + code = buildConnectMsg(pRequest, &body); + if (TSDB_CODE_SUCCESS != code) { + destroyTscObj(*pTscObj); + return code; + } int64_t transporterId = 0; - asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &pTscObj->pAppInfo->mgmtEp.epSet, &transporterId, body); - - tsem_wait(&pRequest->body.rspSem); + code = asyncSendMsgToServer((*pTscObj)->pAppInfo->pTransporter, &(*pTscObj)->pAppInfo->mgmtEp.epSet, &transporterId, body); + if (TSDB_CODE_SUCCESS != code) { + destroyTscObj(*pTscObj); + tscError("failed to send connect msg to server, code:%s", tstrerror(code)); + return code; + } + (void)tsem_wait(&pRequest->body.rspSem); if (pRequest->code != TSDB_CODE_SUCCESS) { - const char* errorMsg = - (pRequest->code == TSDB_CODE_RPC_FQDN_ERROR) ? taos_errstr(pRequest) : tstrerror(pRequest->code); + const char* errorMsg = (code == TSDB_CODE_RPC_FQDN_ERROR) ? taos_errstr(pRequest) : tstrerror(pRequest->code); tscError("failed to connect to server, reason: %s", errorMsg); terrno = pRequest->code; destroyRequest(pRequest); - taos_close_internal(pTscObj); - pTscObj = NULL; + taos_close_internal(*pTscObj); + *pTscObj = NULL; + return terrno; } else { - tscDebug("0x%" PRIx64 " connection is opening, connId:%u, dnodeConn:%p, reqId:0x%" PRIx64, pTscObj->id, - pTscObj->connId, pTscObj->pAppInfo->pTransporter, pRequest->requestId); + tscDebug("0x%" PRIx64 " connection is opening, connId:%u, dnodeConn:%p, reqId:0x%" PRIx64, (*pTscObj)->id, + (*pTscObj)->connId, (*pTscObj)->pAppInfo->pTransporter, pRequest->requestId); destroyRequest(pRequest); } - - return pTscObj; + return code; } -static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest) { - SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo)); - if (pMsgSendInfo == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; +static int32_t buildConnectMsg(SRequestObj* pRequest, SMsgSendInfo** pMsgSendInfo) { + *pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo)); + if (*pMsgSendInfo == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; } - pMsgSendInfo->msgType = TDMT_MND_CONNECT; + (*pMsgSendInfo)->msgType = TDMT_MND_CONNECT; - pMsgSendInfo->requestObjRefId = pRequest->self; - pMsgSendInfo->requestId = pRequest->requestId; - pMsgSendInfo->fp = getMsgRspHandle(pMsgSendInfo->msgType); - pMsgSendInfo->param = taosMemoryCalloc(1, sizeof(pRequest->self)); + (*pMsgSendInfo)->requestObjRefId = pRequest->self; + (*pMsgSendInfo)->requestId = pRequest->requestId; + (*pMsgSendInfo)->fp = getMsgRspHandle((*pMsgSendInfo)->msgType); + (*pMsgSendInfo)->param = taosMemoryCalloc(1, sizeof(pRequest->self)); + if (NULL == (*pMsgSendInfo)->param) { + taosMemoryFree(*pMsgSendInfo); + return TSDB_CODE_OUT_OF_MEMORY; + } - *(int64_t*)pMsgSendInfo->param = pRequest->self; + *(int64_t*)(*pMsgSendInfo)->param = pRequest->self; SConnectReq connectReq = {0}; STscObj* pObj = pRequest->pTscObj; @@ -1482,11 +1621,20 @@ static SMsgSendInfo* buildConnectMsg(SRequestObj* pRequest) { int32_t contLen = tSerializeSConnectReq(NULL, 0, &connectReq); void* pReq = taosMemoryMalloc(contLen); - tSerializeSConnectReq(pReq, contLen, &connectReq); + if (NULL == pReq) { + taosMemoryFree(*pMsgSendInfo); + return TSDB_CODE_OUT_OF_MEMORY; + } - pMsgSendInfo->msgInfo.len = contLen; - pMsgSendInfo->msgInfo.pData = pReq; - return pMsgSendInfo; + if (-1 == tSerializeSConnectReq(pReq, contLen, &connectReq)) { + taosMemoryFree(*pMsgSendInfo); + taosMemoryFree(pReq); + return terrno; + } + + (*pMsgSendInfo)->msgInfo.len = contLen; + (*pMsgSendInfo)->msgInfo.pData = pReq; + return TSDB_CODE_SUCCESS; } void updateTargetEpSet(SMsgSendInfo* pSendInfo, STscObj* pTscObj, SRpcMsg* pMsg, SEpSet* pEpSet) { @@ -1524,7 +1672,12 @@ void updateTargetEpSet(SMsgSendInfo* pSendInfo, STscObj* pTscObj, SRpcMsg* pMsg, return; } - catalogUpdateVgEpSet(pCatalog, pSendInfo->target.dbFName, pSendInfo->target.vgId, pEpSet); + code = catalogUpdateVgEpSet(pCatalog, pSendInfo->target.dbFName, pSendInfo->target.vgId, pEpSet); + if (code != TSDB_CODE_SUCCESS) { + tscError("fail to update catalog vg epset, clusterId:%" PRIx64 ", error %s", pTscObj->pAppInfo->clusterId, + tstrerror(code)); + return; + } taosMemoryFreeClear(pSendInfo->target.dbFName); break; } @@ -1563,7 +1716,7 @@ int32_t doProcessMsgFromServer(void* param) { tscError("doProcessMsgFromServer pRequest->self:%" PRId64 " != pSendInfo->requestObjRefId:%" PRId64, pRequest->self, pSendInfo->requestObjRefId); - taosReleaseRef(clientReqRefPool, pSendInfo->requestObjRefId); + (void)taosReleaseRef(clientReqRefPool, pSendInfo->requestObjRefId); taosMemoryFree(arg->pEpset); rpcFreeCont(pMsg->pCont); destroySendMsgInfo(pSendInfo); @@ -1589,14 +1742,14 @@ int32_t doProcessMsgFromServer(void* param) { terrno = TSDB_CODE_OUT_OF_MEMORY; pMsg->code = TSDB_CODE_OUT_OF_MEMORY; } else { - memcpy(buf.pData, pMsg->pCont, pMsg->contLen); + (void)memcpy(buf.pData, pMsg->pCont, pMsg->contLen); } } - pSendInfo->fp(pSendInfo->param, &buf, pMsg->code); + (void)pSendInfo->fp(pSendInfo->param, &buf, pMsg->code); if (pTscObj) { - taosReleaseRef(clientReqRefPool, pSendInfo->requestObjRefId); + (void)taosReleaseRef(clientReqRefPool, pSendInfo->requestObjRefId); } rpcFreeCont(pMsg->pCont); @@ -1610,7 +1763,13 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { SEpSet* tEpSet = NULL; if (pEpSet != NULL) { tEpSet = taosMemoryCalloc(1, sizeof(SEpSet)); - memcpy((void*)tEpSet, (void*)pEpSet, sizeof(SEpSet)); + if (NULL == tEpSet) { + pMsg->code = TSDB_CODE_OUT_OF_MEMORY; + rpcFreeCont(pMsg->pCont); + destroySendMsgInfo(pMsg->info.ahandle); + return; + } + (void)memcpy((void*)tEpSet, (void*)pEpSet, sizeof(SEpSet)); } // pMsg is response msg @@ -1629,6 +1788,12 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) { } AsyncArg* arg = taosMemoryCalloc(1, sizeof(AsyncArg)); + if (NULL == arg) { + pMsg->code = TSDB_CODE_OUT_OF_MEMORY; + rpcFreeCont(pMsg->pCont); + destroySendMsgInfo(pMsg->info.ahandle); + return; + } arg->msg = *pMsg; arg->pEpset = tEpSet; @@ -1652,9 +1817,13 @@ TAOS* taos_connect_auth(const char* ip, const char* user, const char* auth, cons return NULL; } - STscObj* pObj = taos_connect_internal(ip, user, NULL, auth, db, port, CONN_TYPE__QUERY); - if (pObj) { + STscObj* pObj = NULL; + int32_t code = taos_connect_internal(ip, user, NULL, auth, db, port, CONN_TYPE__QUERY, &pObj); + if (TSDB_CODE_SUCCESS == code) { int64_t* rid = taosMemoryCalloc(1, sizeof(int64_t)); + if (NULL == rid) { + tscError("out of memory when taos connect to %s:%u, user:%s db:%s", ip, port, user, db); + } *rid = pObj->id; return (TAOS*)rid; } @@ -1669,10 +1838,10 @@ TAOS* taos_connect_l(const char* ip, int ipLen, const char* user, int userLen, c char userStr[TSDB_USER_LEN] = {0}; char passStr[TSDB_PASSWORD_LEN] = {0}; - strncpy(ipStr, ip, TMIN(TSDB_EP_LEN - 1, ipLen)); - strncpy(userStr, user, TMIN(TSDB_USER_LEN - 1, userLen)); - strncpy(passStr, pass, TMIN(TSDB_PASSWORD_LEN - 1, passLen)); - strncpy(dbStr, db, TMIN(TSDB_DB_NAME_LEN - 1, dbLen)); + (void)strncpy(ipStr, ip, TMIN(TSDB_EP_LEN - 1, ipLen)); + (void)strncpy(userStr, user, TMIN(TSDB_USER_LEN - 1, userLen)); + (void)strncpy(passStr, pass, TMIN(TSDB_PASSWORD_LEN - 1, passLen)); + (void)strncpy(dbStr, db, TMIN(TSDB_DB_NAME_LEN - 1, dbLen)); return taos_connect(ipStr, userStr, passStr, dbStr, port); } @@ -1739,7 +1908,7 @@ void* doFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) STscObj* pTscObj = pRequest->pTscObj; SAppClusterSummary* pActivity = &pTscObj->pAppInfo->summary; - atomic_add_fetch_64((int64_t*)&pActivity->fetchBytes, pRequest->body.resInfo.payloadLen); + (void)atomic_add_fetch_64((int64_t*)&pActivity->fetchBytes, pRequest->body.resInfo.payloadLen); if (pResultInfo->numOfRows == 0) { return NULL; @@ -1756,7 +1925,7 @@ void* doFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) static void syncFetchFn(void* param, TAOS_RES* res, int32_t numOfRows) { tsem_t* sem = param; - tsem_post(sem); + (void)tsem_post(sem); } void* doAsyncFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertUcs4) { @@ -1775,10 +1944,10 @@ void* doAsyncFetchRows(SRequestObj* pRequest, bool setupOneRowPtr, bool convertU // convert ucs4 to native multi-bytes string pResultInfo->convertUcs4 = convertUcs4; tsem_t sem; - tsem_init(&sem, 0, 0); + (void)tsem_init(&sem, 0, 0); taos_fetch_rows_a(pRequest, syncFetchFn, &sem); - tsem_wait(&sem); - tsem_destroy(&sem); + (void)tsem_wait(&sem); + (void)tsem_destroy(&sem); pRequest->inCallback = false; } @@ -1961,7 +2130,7 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int } int32_t len = getVersion1BlockMetaSize(p, numOfCols); - memcpy(p1, p, len); + (void)memcpy(p1, p, len); p += len; p1 += len; @@ -1970,7 +2139,7 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int len = sizeof(int32_t) * numOfCols; int32_t* colLength = (int32_t*)p; int32_t* colLength1 = (int32_t*)p1; - memcpy(p1, p, len); + (void)memcpy(p1, p, len); p += len; p1 += len; totalLen += len; @@ -1988,7 +2157,7 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int int32_t* offset = (int32_t*)pStart; int32_t* offset1 = (int32_t*)pStart1; len = numOfRows * sizeof(int32_t); - memcpy(pStart1, pStart, len); + (void)memcpy(pStart1, pStart, len); pStart += len; pStart1 += len; totalLen += len; @@ -2004,7 +2173,7 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int char* jsonInnerData = data + CHAR_BYTES; char dst[TSDB_MAX_JSON_TAG_LEN] = {0}; if (jsonInnerType == TSDB_DATA_TYPE_NULL) { - sprintf(varDataVal(dst), "%s", TSDB_DATA_NULL_STR_L); + (void)sprintf(varDataVal(dst), "%s", TSDB_DATA_NULL_STR_L); varDataSetLen(dst, strlen(varDataVal(dst))); } else if (tTagIsJson(data)) { char* jsonString = NULL; @@ -2023,10 +2192,10 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int *(char*)POINTER_SHIFT(varDataVal(dst), length + CHAR_BYTES) = '\"'; } else if (jsonInnerType == TSDB_DATA_TYPE_DOUBLE) { double jsonVd = *(double*)(jsonInnerData); - sprintf(varDataVal(dst), "%.9lf", jsonVd); + (void)sprintf(varDataVal(dst), "%.9lf", jsonVd); varDataSetLen(dst, strlen(varDataVal(dst))); } else if (jsonInnerType == TSDB_DATA_TYPE_BOOL) { - sprintf(varDataVal(dst), "%s", (*((char*)jsonInnerData) == 1) ? "true" : "false"); + (void)sprintf(varDataVal(dst), "%s", (*((char*)jsonInnerData) == 1) ? "true" : "false"); varDataSetLen(dst, strlen(varDataVal(dst))); } else { tscError("doConvertJson error: invalid type:%d", jsonInnerType); @@ -2034,7 +2203,7 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int } offset1[j] = len; - memcpy(pStart1 + len, dst, varDataTLen(dst)); + (void)memcpy(pStart1 + len, dst, varDataTLen(dst)); len += varDataTLen(dst); } colLen1 = len; @@ -2042,20 +2211,20 @@ static int32_t doConvertJson(SReqResultInfo* pResultInfo, int32_t numOfCols, int colLength1[i] = (blockVersion == BLOCK_VERSION_1) ? htonl(len) : len; } else if (IS_VAR_DATA_TYPE(pResultInfo->fields[i].type)) { len = numOfRows * sizeof(int32_t); - memcpy(pStart1, pStart, len); + (void)memcpy(pStart1, pStart, len); pStart += len; pStart1 += len; totalLen += len; totalLen += colLen; - memcpy(pStart1, pStart, colLen); + (void)memcpy(pStart1, pStart, colLen); } else { len = BitmapLen(pResultInfo->numOfRows); - memcpy(pStart1, pStart, len); + (void)memcpy(pStart1, pStart, len); pStart += len; pStart1 += len; totalLen += len; totalLen += colLen; - memcpy(pStart1, pStart, colLen); + (void)memcpy(pStart1, pStart, colLen); } pStart += colLen; pStart1 += colLen1; @@ -2164,13 +2333,13 @@ int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32 char* getDbOfConnection(STscObj* pObj) { char* p = NULL; - taosThreadMutexLock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); size_t len = strlen(pObj->db); if (len > 0) { p = strndup(pObj->db, tListLen(pObj->db)); } - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return p; } @@ -2180,9 +2349,9 @@ void setConnectionDB(STscObj* pTscObj, const char* db) { return; } - taosThreadMutexLock(&pTscObj->mutex); + (void)taosThreadMutexLock(&pTscObj->mutex); tstrncpy(pTscObj->db, db, tListLen(pTscObj->db)); - taosThreadMutexUnlock(&pTscObj->mutex); + (void)taosThreadMutexUnlock(&pTscObj->mutex); } void resetConnectDB(STscObj* pTscObj) { @@ -2190,9 +2359,9 @@ void resetConnectDB(STscObj* pTscObj) { return; } - taosThreadMutexLock(&pTscObj->mutex); + (void)taosThreadMutexLock(&pTscObj->mutex); pTscObj->db[0] = 0; - taosThreadMutexUnlock(&pTscObj->mutex); + (void)taosThreadMutexUnlock(&pTscObj->mutex); } int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp, bool convertUcs4) { @@ -2214,6 +2383,11 @@ int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableR if (pRsp->compressed) { if (pResultInfo->decompBuf == NULL) { pResultInfo->decompBuf = taosMemoryMalloc(payloadLen); + if (pResultInfo->decompBuf == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + tscError("failed to prepare the decompress buffer, size:%d", payloadLen); + return terrno; + } pResultInfo->decompBufSize = payloadLen; } else { if (pResultInfo->decompBufSize < payloadLen) { @@ -2239,6 +2413,10 @@ int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableR if (pRsp->compressed && compLen < rawLen) { int32_t len = tsDecompressString(pStart, compLen, 1, pResultInfo->decompBuf, rawLen, ONE_STAGE_COMP, NULL, 0); ASSERT(len == rawLen); + if (len < 0) { + tscError("tsDecompressString failed"); + return terrno ? terrno : TSDB_CODE_FAILED; + } pResultInfo->pData = pResultInfo->decompBuf; pResultInfo->payloadLen = rawLen; @@ -2281,7 +2459,10 @@ TSDB_SERVER_STATUS taos_check_server_status(const char* fqdn, int port, char* de connLimitNum = TMIN(connLimitNum, 500); rpcInit.connLimitNum = connLimitNum; rpcInit.timeToGetConn = tsTimeToGetAvailableConn; - taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); + if (TSDB_CODE_SUCCESS != taosVersionStrToInt(version, &(rpcInit.compatibilityVer))) { + tscError("faild to convert taos version from str to int, errcode:%s", terrstr()); + goto _OVER; + } clientRpc = rpcOpen(&rpcInit); if (clientRpc == NULL) { @@ -2299,7 +2480,11 @@ TSDB_SERVER_STATUS taos_check_server_status(const char* fqdn, int port, char* de tstrncpy(epSet.eps[0].fqdn, fqdn, TSDB_FQDN_LEN); epSet.eps[0].port = (uint16_t)port; - rpcSendRecv(clientRpc, &epSet, &rpcMsg, &rpcRsp); + int32_t ret = rpcSendRecv(clientRpc, &epSet, &rpcMsg, &rpcRsp); + if (TSDB_CODE_SUCCESS != ret) { + tscError("failed to send recv since %s", tstrerror(ret)); + goto _OVER; + } if (rpcRsp.code != 0 || rpcRsp.contLen <= 0 || rpcRsp.pCont == NULL) { tscError("failed to send server status req since %s", terrstr()); @@ -2366,13 +2551,20 @@ int32_t appendTbToReq(SHashObj* pHash, int32_t pos1, int32_t len1, int32_t pos2, STablesReq* pDb = taosHashGet(pHash, dbFName, strlen(dbFName)); if (pDb) { - taosArrayPush(pDb->pTables, &name); + if (NULL == taosArrayPush(pDb->pTables, &name)) { + return terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY; + } } else { STablesReq db; db.pTables = taosArrayInit(20, sizeof(SName)); - strcpy(db.dbFName, dbFName); - taosArrayPush(db.pTables, &name); - taosHashPut(pHash, dbFName, strlen(dbFName), &db, sizeof(db)); + if (NULL == db.pTables) { + return terrno; + } + (void)strcpy(db.dbFName, dbFName); + if (NULL == taosArrayPush(db.pTables, &name)) { + return terrno; + } + TSC_ERR_RET(taosHashPut(pHash, dbFName, strlen(dbFName), &db, sizeof(db))); } return TSDB_CODE_SUCCESS; @@ -2381,7 +2573,6 @@ int32_t appendTbToReq(SHashObj* pHash, int32_t pos1, int32_t len1, int32_t pos2, int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName, SArray** pReq) { SHashObj* pHash = taosHashInit(3, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); if (NULL == pHash) { - terrno = TSDB_CODE_OUT_OF_MEMORY; return terrno; } @@ -2393,8 +2584,8 @@ int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName, int32_t vPos[2]; int32_t vLen[2]; - memset(vPos, -1, sizeof(vPos)); - memset(vLen, 0, sizeof(vLen)); + (void)memset(vPos, -1, sizeof(vPos)); + (void)memset(vLen, 0, sizeof(vLen)); for (int32_t i = 0;; ++i) { if (0 == *(tbList + i)) { @@ -2457,8 +2648,8 @@ int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName, goto _return; } - memset(vPos, -1, sizeof(vPos)); - memset(vLen, 0, sizeof(vLen)); + (void)memset(vPos, -1, sizeof(vPos)); + (void)memset(vLen, 0, sizeof(vLen)); vIdx = 0; continue; } @@ -2486,10 +2677,15 @@ int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName, int32_t dbNum = taosHashGetSize(pHash); *pReq = taosArrayInit(dbNum, sizeof(STablesReq)); + if (NULL == pReq) { + TSC_ERR_JRET(terrno); + } pIter = taosHashIterate(pHash, NULL); while (pIter) { STablesReq* pDb = (STablesReq*)pIter; - taosArrayPush(*pReq, pDb); + if (NULL == taosArrayPush(*pReq, pDb)) { + TSC_ERR_JRET(terrno); + } pIter = taosHashIterate(pHash, pIter); } @@ -2517,7 +2713,7 @@ void syncCatalogFn(SMetaData* pResult, void* param, int32_t code) { SSyncQueryParam* pParam = param; pParam->pRequest->code = code; - tsem_post(&pParam->sem); + (void)tsem_post(&pParam->sem); } void syncQueryFn(void* param, void* res, int32_t code) { @@ -2528,7 +2724,7 @@ void syncQueryFn(void* param, void* res, int32_t code) { pParam->pRequest->code = code; } - tsem_post(&pParam->sem); + (void)tsem_post(&pParam->sem); } void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly, int8_t source) { @@ -2605,10 +2801,10 @@ TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly, int8_t s terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } - tsem_init(¶m->sem, 0, 0); + (void)tsem_init(¶m->sem, 0, 0); taosAsyncQueryImpl(*(int64_t*)taos, sql, syncQueryFn, param, validateOnly, source); - tsem_wait(¶m->sem); + (void)tsem_wait(¶m->sem); SRequestObj* pRequest = NULL; if (param->pRequest != NULL) { @@ -2634,10 +2830,10 @@ TAOS_RES* taosQueryImplWithReqid(TAOS* taos, const char* sql, bool validateOnly, terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } - tsem_init(¶m->sem, 0, 0); + (void)tsem_init(¶m->sem, 0, 0); taosAsyncQueryImplWithReqid(*(int64_t*)taos, sql, syncQueryFn, param, validateOnly, reqid); - tsem_wait(¶m->sem); + (void)tsem_wait(¶m->sem); SRequestObj* pRequest = NULL; if (param->pRequest != NULL) { param->pRequest->syncQuery = true; @@ -2684,7 +2880,7 @@ static void fetchCallback(void* pResult, void* param, int32_t code) { STscObj* pTscObj = pRequest->pTscObj; SAppClusterSummary* pActivity = &pTscObj->pAppInfo->summary; - atomic_add_fetch_64((int64_t*)&pActivity->fetchBytes, pRequest->body.resInfo.payloadLen); + (void)atomic_add_fetch_64((int64_t*)&pActivity->fetchBytes, pRequest->body.resInfo.payloadLen); } pRequest->body.fetchFp(((SSyncQueryParam*)pRequest->body.interParam)->userParam, pRequest, pResultInfo->numOfRows); @@ -2727,7 +2923,9 @@ void taosAsyncFetchImpl(SRequestObj* pRequest, __taos_async_fn_t fp, void* param .cbParam = pRequest, }; - schedulerFetchRows(pRequest->body.queryJob, &req); + if (TSDB_CODE_SUCCESS != schedulerFetchRows(pRequest->body.queryJob, &req)) { + tscError("0x%" PRIx64 " failed to schedule fetch rows", pRequest->self); + } } void doRequestCallback(SRequestObj* pRequest, int32_t code) { @@ -2737,7 +2935,7 @@ void doRequestCallback(SRequestObj* pRequest, int32_t code) { SRequestObj* pReq = acquireRequest(this); if (pReq != NULL) { pReq->inCallback = false; - releaseRequest(this); + (void)releaseRequest(this); } } diff --git a/source/client/src/clientJniConnector.c b/source/client/src/clientJniConnector.c index edbc06b12b..4a200179f9 100644 --- a/source/client/src/clientJniConnector.c +++ b/source/client/src/clientJniConnector.c @@ -73,7 +73,7 @@ void jniGetGlobalMethod(JNIEnv *env) { } if (g_vm == NULL) { - (*env)->GetJavaVM(env, &g_vm); + (void)(*env)->GetJavaVM(env, &g_vm); } jclass arrayListClass = (*env)->FindClass(env, "java/util/ArrayList"); @@ -582,20 +582,20 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn case TSDB_DATA_TYPE_BINARY: case TSDB_DATA_TYPE_VARBINARY: case TSDB_DATA_TYPE_GEOMETRY: { - memcpy(tmp, row[i], length[i]); // handle the case that terminated does not exist + (void)memcpy(tmp, row[i], length[i]); // handle the case that terminated does not exist (*env)->CallVoidMethod(env, rowobj, g_rowdataSetStringFp, i, (*env)->NewStringUTF(env, tmp)); - memset(tmp, 0, length[i]); + (void)memset(tmp, 0, length[i]); break; } case TSDB_DATA_TYPE_NCHAR: { (*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i, - jniFromNCharToByteArray(env, (char *)row[i], length[i])); + jniFromNCharToByteArray(env, (char *)row[i], length[i])); break; } case TSDB_DATA_TYPE_JSON: { (*env)->CallVoidMethod(env, rowobj, g_rowdataSetByteArrayFp, i, - jniFromNCharToByteArray(env, (char *)row[i], length[i])); + jniFromNCharToByteArray(env, (char *)row[i], length[i])); break; } case TSDB_DATA_TYPE_TIMESTAMP: { @@ -680,6 +680,10 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_validateCreateTab jsize len = (*env)->GetArrayLength(env, jsql); char *str = (char *)taosMemoryCalloc(1, sizeof(char) * (len + 1)); + if (str == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, jsql, 0, len, (jbyte *)str); if ((*env)->ExceptionCheck(env)) { // todo handle error @@ -843,6 +847,10 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI jsize len = (*env)->GetArrayLength(env, tags); char *tagsData = (char *)taosMemoryCalloc(1, len); + if (tagsData == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tsconn); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, tags, 0, len, (jbyte *)tagsData); if ((*env)->ExceptionCheck(env)) { // todo handle error @@ -850,18 +858,30 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI len = (*env)->GetArrayLength(env, lengthList); int32_t *lengthArray = (int32_t *)taosMemoryCalloc(1, len); + if (lengthArray == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tsconn); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, lengthList, 0, len, (jbyte *)lengthArray); if ((*env)->ExceptionCheck(env)) { } len = (*env)->GetArrayLength(env, typeList); char *typeArray = (char *)taosMemoryCalloc(1, len); + if (typeArray == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tsconn); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, typeList, 0, len, (jbyte *)typeArray); if ((*env)->ExceptionCheck(env)) { } len = (*env)->GetArrayLength(env, nullList); char *nullArray = (char *)taosMemoryCalloc(1, len); + if (nullArray == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tsconn); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, nullList, 0, len, (jbyte *)nullArray); if ((*env)->ExceptionCheck(env)) { } @@ -870,6 +890,10 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setTableNameTagsI char *curTags = tagsData; TAOS_MULTI_BIND *tagsBind = taosMemoryCalloc(numOfTags, sizeof(TAOS_MULTI_BIND)); + if (tagsBind == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tsconn); + return JNI_OUT_OF_MEMORY; + } for (int32_t i = 0; i < numOfTags; ++i) { tagsBind[i].buffer_type = typeArray[i]; tagsBind[i].buffer = curTags; @@ -916,6 +940,10 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_bindColDataImp( // todo refactor jsize len = (*env)->GetArrayLength(env, colDataList); char *colBuf = (char *)taosMemoryCalloc(1, len); + if (colBuf == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, colDataList, 0, len, (jbyte *)colBuf); if ((*env)->ExceptionCheck(env)) { // todo handle error @@ -923,18 +951,30 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_bindColDataImp( len = (*env)->GetArrayLength(env, lengthList); char *lengthArray = (char *)taosMemoryCalloc(1, len); + if (lengthArray == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, lengthList, 0, len, (jbyte *)lengthArray); if ((*env)->ExceptionCheck(env)) { } len = (*env)->GetArrayLength(env, nullList); char *nullArray = (char *)taosMemoryCalloc(1, len); + if (nullArray == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon); + return JNI_OUT_OF_MEMORY; + } (*env)->GetByteArrayRegion(env, nullList, 0, len, (jbyte *)nullArray); if ((*env)->ExceptionCheck(env)) { } // bind multi-rows with only one invoke. TAOS_MULTI_BIND *b = taosMemoryCalloc(1, sizeof(TAOS_MULTI_BIND)); + if (b == NULL) { + jniError("jobj:%p, conn:%p, alloc memory failed", jobj, tscon); + return JNI_OUT_OF_MEMORY; + } b->num = numOfRows; b->buffer_type = dataType; // todo check data type @@ -1043,14 +1083,14 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_stmtErrorMsgIm TAOS *tscon = (TAOS *)con; if (tscon == NULL) { jniError("jobj:%p, connection already closed", jobj); - sprintf(errMsg, "jobj:%p, connection already closed", jobj); + (void)sprintf(errMsg, "jobj:%p, connection already closed", jobj); return (*env)->NewStringUTF(env, errMsg); } TAOS_STMT *pStmt = (TAOS_STMT *)stmt; if (pStmt == NULL) { jniError("jobj:%p, conn:%p, invalid stmt", jobj, tscon); - sprintf(errMsg, "jobj:%p, conn:%p, invalid stmt", jobj, tscon); + (void)sprintf(errMsg, "jobj:%p, conn:%p, invalid stmt", jobj, tscon); return (*env)->NewStringUTF(env, errMsg); } diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c index 0618e233a0..ae494301d2 100644 --- a/source/client/src/clientMain.c +++ b/source/client/src/clientMain.c @@ -69,15 +69,21 @@ void taos_cleanup(void) { qCleanupKeywordsTable(); nodesDestroyAllocatorSet(); - cleanupTaskQueue(); + if (TSDB_CODE_SUCCESS != cleanupTaskQueue()) { + tscWarn("failed to cleanup task queue"); + } int32_t id = clientReqRefPool; clientReqRefPool = -1; - taosCloseRef(id); + if (TSDB_CODE_SUCCESS != taosCloseRef(id)) { + tscWarn("failed to close clientReqRefPool"); + } id = clientConnRefPool; clientConnRefPool = -1; - taosCloseRef(id); + if (TSDB_CODE_SUCCESS != taosCloseRef(id)) { + tscWarn("failed to close clientReqRefPool"); + } DestroyRegexCache(); rpcCleanup(); @@ -115,11 +121,19 @@ TAOS *taos_connect(const char *ip, const char *user, const char *pass, const cha pass = TSDB_DEFAULT_PASS; } - STscObj *pObj = taos_connect_internal(ip, user, pass, NULL, db, port, CONN_TYPE__QUERY); - if (pObj) { + STscObj *pObj = NULL; + int32_t code = taos_connect_internal(ip, user, pass, NULL, db, port, CONN_TYPE__QUERY, &pObj); + if (TSDB_CODE_SUCCESS == code) { int64_t *rid = taosMemoryCalloc(1, sizeof(int64_t)); + if (NULL == rid) { + tscError("out of memory when taos connect to %s:%u, user:%s db:%s", ip, port, user, db); + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } *rid = pObj->id; return (TAOS *)rid; + } else { + terrno = code; } return NULL; @@ -140,24 +154,24 @@ int taos_set_notify_cb(TAOS *taos, __taos_notify_fn_t fp, void *param, int type) switch (type) { case TAOS_NOTIFY_PASSVER: { - taosThreadMutexLock(&pObj->mutex); + TSC_ERR_RET(taosThreadMutexLock(&pObj->mutex)); pObj->passInfo.fp = fp; pObj->passInfo.param = param; - taosThreadMutexUnlock(&pObj->mutex); + TSC_ERR_RET(taosThreadMutexUnlock(&pObj->mutex)); break; } case TAOS_NOTIFY_WHITELIST_VER: { - taosThreadMutexLock(&pObj->mutex); + TSC_ERR_RET(taosThreadMutexLock(&pObj->mutex)); pObj->whiteListInfo.fp = fp; pObj->whiteListInfo.param = param; - taosThreadMutexUnlock(&pObj->mutex); + TSC_ERR_RET(taosThreadMutexUnlock(&pObj->mutex)); break; } case TAOS_NOTIFY_USER_DROPPED: { - taosThreadMutexLock(&pObj->mutex); + TSC_ERR_RET(taosThreadMutexLock(&pObj->mutex)); pObj->userDroppedInfo.fp = fp; pObj->userDroppedInfo.param = param; - taosThreadMutexUnlock(&pObj->mutex); + TSC_ERR_RET(taosThreadMutexUnlock(&pObj->mutex)); break; } default: { @@ -189,7 +203,13 @@ int32_t fetchWhiteListCallbackFn(void* param, SDataBuf* pMsg, int32_t code) { } SGetUserWhiteListRsp wlRsp; - tDeserializeSGetUserWhiteListRsp(pMsg->pData, pMsg->len, &wlRsp); + if (TSDB_CODE_SUCCESS != tDeserializeSGetUserWhiteListRsp(pMsg->pData, pMsg->len, &wlRsp)) { + taosMemoryFree(pMsg->pData); + taosMemoryFree(pMsg->pEpSet); + taosMemoryFree(pInfo); + tFreeSGetUserWhiteListRsp(&wlRsp); + return terrno; + } uint64_t* pWhiteLists = taosMemoryMalloc(wlRsp.numWhiteLists * sizeof(uint64_t)); if (pWhiteLists == NULL) { @@ -229,8 +249,14 @@ void taos_fetch_whitelist_a(TAOS *taos, __taos_async_whitelist_fn_t fp, void *pa } SGetUserWhiteListReq req; - memcpy(req.user, pTsc->user, TSDB_USER_LEN); + (void)memcpy(req.user, pTsc->user, TSDB_USER_LEN); int32_t msgLen = tSerializeSGetUserWhiteListReq(NULL, 0, &req); + if (msgLen < 0) { + fp(param, TSDB_CODE_INVALID_PARA, taos, 0, NULL); + releaseTscObj(connId); + return; + } + void* pReq = taosMemoryMalloc(msgLen); if (pReq == NULL) { fp(param, TSDB_CODE_OUT_OF_MEMORY, taos, 0, NULL); @@ -274,7 +300,9 @@ void taos_fetch_whitelist_a(TAOS *taos, __taos_async_whitelist_fn_t fp, void *pa int64_t transportId = 0; SEpSet epSet = getEpSet_s(&pTsc->pAppInfo->mgmtEp); - asyncSendMsgToServer(pTsc->pAppInfo->pTransporter, &epSet, &transportId, pSendInfo); + if (TSDB_CODE_SUCCESS != asyncSendMsgToServer(pTsc->pAppInfo->pTransporter, &epSet, &transportId, pSendInfo)) { + tscWarn("failed to async send msg to server"); + } releaseTscObj(connId); return; } @@ -287,7 +315,7 @@ void taos_close_internal(void *taos) { STscObj *pTscObj = (STscObj *)taos; tscDebug("0x%" PRIx64 " try to close connection, numOfReq:%d", pTscObj->id, pTscObj->numOfReqs); - taosRemoveRef(clientConnRefPool, pTscObj->id); + (void)taosRemoveRef(clientConnRefPool, pTscObj->id); } void taos_close(TAOS *taos) { @@ -453,6 +481,7 @@ TAOS_ROW taos_fetch_row(TAOS_RES *res) { } else { // assert to avoid un-initialization error tscError("invalid result passed to taos_fetch_row"); + terrno = TSDB_CODE_TSC_INTERNAL_ERROR; return NULL; } } @@ -521,7 +550,7 @@ int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) if(taosAscii2Hex(row[i], charLen, &data, &size) < 0){ break; } - memcpy(str + len, data, size); + (void)memcpy(str + len, data, size); len += size; taosMemoryFree(data); }break; @@ -539,7 +568,7 @@ int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) } } - memcpy(str + len, row[i], charLen); + (void)memcpy(str + len, row[i], charLen); len += charLen; } break; @@ -686,7 +715,7 @@ int taos_select_db(TAOS *taos, const char *db) { } char sql[256] = {0}; - snprintf(sql, tListLen(sql), "use %s", db); + (void)snprintf(sql, tListLen(sql), "use %s", db); TAOS_RES *pRequest = taos_query(taos, sql); int32_t code = taos_errno(pRequest); @@ -742,10 +771,10 @@ int taos_fetch_block_s(TAOS_RES *res, int *numOfRows, TAOS_ROW *rows) { if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT || pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) { - return 0; + return pRequest->code; } - doAsyncFetchRows(pRequest, false, true); + (void)doAsyncFetchRows(pRequest, false, true); // TODO refactor SReqResultInfo *pResultInfo = &pRequest->body.resInfo; @@ -795,10 +824,10 @@ int taos_fetch_raw_block(TAOS_RES *res, int *numOfRows, void **pData) { if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT || pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) { - return 0; + return pRequest->code; } - doAsyncFetchRows(pRequest, false, false); + (void)doAsyncFetchRows(pRequest, false, false); SReqResultInfo *pResultInfo = &pRequest->body.resInfo; @@ -806,7 +835,7 @@ int taos_fetch_raw_block(TAOS_RES *res, int *numOfRows, void **pData) { (*numOfRows) = pResultInfo->numOfRows; (*pData) = (void *)pResultInfo->pData; - return 0; + return pRequest->code; } int *taos_get_column_data_offset(TAOS_RES *res, int columnIndex) { @@ -864,26 +893,24 @@ const char *taos_get_server_info(TAOS *taos) { int taos_get_current_db(TAOS *taos, char *database, int len, int *required) { STscObj *pTscObj = acquireTscObj(*(int64_t *)taos); if (pTscObj == NULL) { - terrno = TSDB_CODE_TSC_DISCONNECTED; - return -1; + return TSDB_CODE_TSC_DISCONNECTED; } int code = TSDB_CODE_SUCCESS; - taosThreadMutexLock(&pTscObj->mutex); + (void)taosThreadMutexLock(&pTscObj->mutex); if (database == NULL || len <= 0) { if (required != NULL) *required = strlen(pTscObj->db) + 1; - terrno = TSDB_CODE_INVALID_PARA; - code = -1; + TSC_ERR_JRET(TSDB_CODE_INVALID_PARA); } else if (len < strlen(pTscObj->db) + 1) { tstrncpy(database, pTscObj->db, len); if (required) *required = strlen(pTscObj->db) + 1; - terrno = TSDB_CODE_INVALID_PARA; - code = -1; + TSC_ERR_JRET(TSDB_CODE_INVALID_PARA); } else { - strcpy(database, pTscObj->db); + (void)strcpy(database, pTscObj->db); code = 0; } - taosThreadMutexUnlock(&pTscObj->mutex); +_return: + (void)taosThreadMutexUnlock(&pTscObj->mutex); releaseTscObj(*(int64_t *)taos); return code; } @@ -924,8 +951,8 @@ static void doAsyncQueryFromAnalyse(SMetaData *pResultMeta, void *param, int32_t pRequest->metric.analyseCostUs += taosGetTimestampUs() - analyseStart; if (pRequest->parseOnly) { - memcpy(&pRequest->parseMeta, pResultMeta, sizeof(*pResultMeta)); - memset(pResultMeta, 0, sizeof(*pResultMeta)); + (void)memcpy(&pRequest->parseMeta, pResultMeta, sizeof(*pResultMeta)); + (void)memset(pResultMeta, 0, sizeof(*pResultMeta)); } handleQueryAnslyseRes(pWrapper, pResultMeta, code); @@ -972,10 +999,9 @@ void handleSubQueryFromAnalyse(SSqlCallbackWrapper *pWrapper, SMetaData *pResult return; } - pNewRequest->pQuery = (SQuery *)nodesMakeNode(QUERY_NODE_QUERY); - if (NULL == pNewRequest->pQuery) { - code = TSDB_CODE_OUT_OF_MEMORY; - } else { + pNewRequest->pQuery = NULL; + code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pNewRequest->pQuery); + if (pNewRequest->pQuery) { pNewRequest->pQuery->pRoot = pRoot; pRoot = NULL; pNewRequest->pQuery->execStage = QUERY_EXEC_STAGE_ANALYSE; @@ -1013,10 +1039,12 @@ void handleQueryAnslyseRes(SSqlCallbackWrapper *pWrapper, SMetaData *pResultMeta } if (pQuery->haveResultSet) { - setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols); + code = setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols); setResPrecision(&pRequest->body.resInfo, pQuery->precision); } + } + if (code == TSDB_CODE_SUCCESS) { TSWAP(pRequest->dbList, (pQuery)->pDbList); TSWAP(pRequest->tableList, (pQuery)->pTableList); TSWAP(pRequest->targetTableList, (pQuery)->pTargetTableList); @@ -1201,7 +1229,7 @@ int32_t prepareAndParseSqlSyntax(SSqlCallbackWrapper **ppWrapper, SRequestObj *p code = TSDB_CODE_OUT_OF_MEMORY; } else { pWrapper->pCatalogReq->forceUpdate = updateMetaForce; - pWrapper->pCatalogReq->qNodeRequired = qnodeRequired(pRequest); + TSC_ERR_RET(qnodeRequired(pRequest, &pWrapper->pCatalogReq->qNodeRequired)); code = qParseSqlSyntax(pWrapper->pParseCtx, &pRequest->pQuery, pWrapper->pCatalogReq); } @@ -1244,7 +1272,7 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { if (NEED_CLIENT_HANDLE_ERROR(code)) { tscDebug("0x%" PRIx64 " client retry to handle the error, code:%d - %s, tryCount:%d, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code), pRequest->retry, pRequest->requestId); - refreshMeta(pRequest->pTscObj, pRequest); + (void)refreshMeta(pRequest->pTscObj, pRequest); //ignore return code,try again pRequest->prevCode = code; doAsyncQuery(pRequest, true); return; @@ -1259,13 +1287,13 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) { void restartAsyncQuery(SRequestObj *pRequest, int32_t code) { tscInfo("restart request: %s p: %p", pRequest->sqlstr, pRequest); SRequestObj* pUserReq = pRequest; - acquireRequest(pRequest->self); + (void)acquireRequest(pRequest->self); while (pUserReq) { if (pUserReq->self == pUserReq->relation.userRefId || pUserReq->relation.userRefId == 0) { break; } else { int64_t nextRefId = pUserReq->relation.nextRefId; - releaseRequest(pUserReq->self); + (void)releaseRequest(pUserReq->self); if (nextRefId) { pUserReq = acquireRequest(nextRefId); } @@ -1275,16 +1303,16 @@ void restartAsyncQuery(SRequestObj *pRequest, int32_t code) { if (pUserReq) { destroyCtxInRequest(pUserReq); pUserReq->prevCode = code; - memset(&pUserReq->relation, 0, sizeof(pUserReq->relation)); + (void)memset(&pUserReq->relation, 0, sizeof(pUserReq->relation)); } else { tscError("User req is missing"); - removeFromMostPrevReq(pRequest); + (void)removeFromMostPrevReq(pRequest); return; } if (hasSubRequest) - removeFromMostPrevReq(pRequest); + (void)removeFromMostPrevReq(pRequest); else - releaseRequest(pUserReq->self); + (void)releaseRequest(pUserReq->self); doAsyncQuery(pUserReq, true); } @@ -1374,7 +1402,7 @@ int taos_get_db_route_info(TAOS *taos, const char *db, TAOS_DB_ROUTE_INFO *dbInf conn.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp); char dbFName[TSDB_DB_FNAME_LEN] = {0}; - snprintf(dbFName, sizeof(dbFName), "%d.%s", pTscObj->acctId, db); + (void)snprintf(dbFName, sizeof(dbFName), "%d.%s", pTscObj->acctId, db); code = catalogGetDBVgInfo(pCtg, &conn, dbFName, dbInfo); if (code) { @@ -1424,7 +1452,7 @@ int taos_get_table_vgId(TAOS *taos, const char *db, const char *table, int *vgId conn.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp); SName tableName; - toName(pTscObj->acctId, db, table, &tableName); + (void)toName(pTscObj->acctId, db, table, &tableName); SVgroupInfo vgInfo; code = catalogGetTableHashVgroup(pCtg, &conn, &tableName, &vgInfo); @@ -1545,7 +1573,7 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) { } SSyncQueryParam *pParam = pRequest->body.interParam; - tsem_wait(&pParam->sem); + (void)tsem_wait(&pParam->sem); _return: destoryCatalogReq(&catalogReq); @@ -1562,7 +1590,9 @@ TAOS_STMT *taos_stmt_init(TAOS *taos) { } TAOS_STMT *pStmt = stmtInit(pObj, 0, NULL); - + if (NULL == pStmt) { + tscError("stmt init failed, errcode:%s", terrstr()); + } releaseTscObj(*(int64_t *)taos); return pStmt; @@ -1577,7 +1607,9 @@ TAOS_STMT *taos_stmt_init_with_reqid(TAOS *taos, int64_t reqid) { } TAOS_STMT *pStmt = stmtInit(pObj, reqid, NULL); - + if (NULL == pStmt) { + tscError("stmt init failed, errcode:%s", terrstr()); + } releaseTscObj(*(int64_t *)taos); return pStmt; @@ -1592,7 +1624,9 @@ TAOS_STMT *taos_stmt_init_with_options(TAOS *taos, TAOS_STMT_OPTIONS *options) { } TAOS_STMT *pStmt = stmtInit(pObj, options->reqId, options); - + if (NULL == pStmt) { + tscError("stmt init failed, errcode:%s", terrstr()); + } releaseTscObj(*(int64_t *)taos); return pStmt; @@ -1707,7 +1741,11 @@ int taos_stmt_bind_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) { } int32_t insert = 0; - stmtIsInsert(stmt, &insert); + int32_t code = stmtIsInsert(stmt, &insert); + if (TSDB_CODE_SUCCESS != code) { + tscError("stmt insert failed, errcode:%s", tstrerror(code)); + return code; + } if (0 == insert && bind->num > 1) { tscError("only one row data allowed for query"); terrno = TSDB_CODE_INVALID_PARA; @@ -1731,7 +1769,11 @@ int taos_stmt_bind_single_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, in } int32_t insert = 0; - stmtIsInsert(stmt, &insert); + int32_t code = stmtIsInsert(stmt, &insert); + if (TSDB_CODE_SUCCESS != code) { + tscError("stmt insert failed, errcode:%s", tstrerror(code)); + return code; + } if (0 == insert && bind->num > 1) { tscError("only one row data allowed for query"); terrno = TSDB_CODE_INVALID_PARA; @@ -1858,4 +1900,4 @@ int taos_set_conn_mode(TAOS* taos, int mode, int value) { char* getBuildInfo(){ return buildinfo; -} \ No newline at end of file +} diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c index 9e1ff6e5e5..be33033cf9 100644 --- a/source/client/src/clientRawBlockWrite.c +++ b/source/client/src/clientRawBlockWrite.c @@ -1214,12 +1214,14 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) { } SArray* pBufArray = NULL; RAW_RETURN_CHECK(serializeVgroupsCreateTableBatch(pVgroupHashmap, &pBufArray)); - pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); - RAW_NULL_CHECK(pQuery); + pQuery = NULL; + code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pQuery); + if (TSDB_CODE_SUCCESS != code) goto end; pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE; pQuery->msgType = TDMT_VND_CREATE_TABLE; pQuery->stableQuery = false; - pQuery->pRoot = nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT); + code = nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT, &pQuery->pRoot); + if (TSDB_CODE_SUCCESS != code) goto end; RAW_NULL_CHECK(pQuery->pRoot); RAW_RETURN_CHECK(rewriteToVnodeModifyOpStmt(pQuery, pBufArray)); @@ -1343,13 +1345,14 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) { } SArray* pBufArray = NULL; RAW_RETURN_CHECK(serializeVgroupsDropTableBatch(pVgroupHashmap, &pBufArray)); - pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); - RAW_NULL_CHECK(pQuery); + code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pQuery); + if (TSDB_CODE_SUCCESS != code) goto end; pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE; pQuery->msgType = TDMT_VND_DROP_TABLE; pQuery->stableQuery = false; - pQuery->pRoot = nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT); - RAW_NULL_CHECK(pQuery->pRoot); + pQuery->pRoot = NULL; + code = nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT, &pQuery->pRoot); + if (TSDB_CODE_SUCCESS != code) goto end; RAW_RETURN_CHECK(rewriteToVnodeModifyOpStmt(pQuery, pBufArray)); (void)launchQueryImpl(pRequest, pQuery, true, NULL); @@ -1486,13 +1489,15 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) { pVgData->numOfTables = 1; RAW_NULL_CHECK(taosArrayPush(pArray, &pVgData)); - pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); - RAW_NULL_CHECK(pQuery); + pQuery = NULL; + code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pQuery); + if (NULL == pQuery) goto end; pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE; pQuery->msgType = TDMT_VND_ALTER_TABLE; pQuery->stableQuery = false; - pQuery->pRoot = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - RAW_NULL_CHECK(pQuery->pRoot); + pQuery->pRoot = NULL; + code = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, &pQuery->pRoot); + if (TSDB_CODE_SUCCESS != code) goto end; RAW_RETURN_CHECK(rewriteToVnodeModifyOpStmt(pQuery, pArray)); @@ -1537,8 +1542,8 @@ int taos_write_raw_block_with_fields_with_reqid(TAOS* taos, int rows, char* pDat SQuery* pQuery = NULL; SHashObj* pVgHash = NULL; - SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, reqid); - RAW_NULL_CHECK(pRequest); + SRequestObj* pRequest = NULL; + RAW_RETURN_CHECK(createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, reqid, &pRequest)); uDebug(LOG_ID_TAG " write raw block with field, rows:%d, pData:%p, tbname:%s, fields:%p, numFields:%d", LOG_ID_VALUE, rows, pData, tbname, fields, numFields); @@ -1597,8 +1602,8 @@ int taos_write_raw_block_with_reqid(TAOS* taos, int rows, char* pData, const cha SQuery* pQuery = NULL; SHashObj* pVgHash = NULL; - SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, reqid); - RAW_NULL_CHECK(pRequest); + SRequestObj* pRequest = NULL; + RAW_RETURN_CHECK(createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, reqid, &pRequest)); uDebug(LOG_ID_TAG " write raw block, rows:%d, pData:%p, tbname:%s", LOG_ID_VALUE, rows, pData, tbname); @@ -1667,8 +1672,8 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) { SDecoder decoder = {0}; STableMeta* pTableMeta = NULL; - SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0); - RAW_NULL_CHECK(pRequest); + SRequestObj* pRequest = NULL; + RAW_RETURN_CHECK(createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0, &pRequest)); uDebug(LOG_ID_TAG " write raw data, data:%p, dataLen:%d", LOG_ID_VALUE, data, dataLen); pRequest->syncQuery = true; @@ -1778,8 +1783,8 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen) STableMeta* pTableMeta = NULL; SVCreateTbReq* pCreateReqDst = NULL; - SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0); - RAW_NULL_CHECK(pRequest); + SRequestObj* pRequest = NULL; + RAW_RETURN_CHECK(createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0, &pRequest)); uDebug(LOG_ID_TAG " write raw metadata, data:%p, dataLen:%d", LOG_ID_VALUE, data, dataLen); pRequest->syncQuery = true; diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 00445b4d12..11c0bd6d6f 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -2137,8 +2137,8 @@ TAOS_RES *taos_schemaless_insert_inner(TAOS *taos, char *lines[], char *rawLine, SSmlHandle *info = NULL; int cnt = 0; while (1) { - request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid); - if (request == NULL) { + code = createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid, &request); + if (TSDB_CODE_SUCCESS != code) { uError("SML:taos_schemaless_insert error request is null"); return NULL; } diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c index 650d262870..6d9956122c 100644 --- a/source/client/src/clientTmq.c +++ b/source/client/src/clientTmq.c @@ -1237,8 +1237,9 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) { } // init connection - pTmq->pTscObj = taos_connect_internal(conf->ip, user, pass, NULL, NULL, conf->port, CONN_TYPE__TMQ); - if (pTmq->pTscObj == NULL) { + code = taos_connect_internal(conf->ip, user, pass, NULL, NULL, conf->port, CONN_TYPE__TMQ, &pTmq->pTscObj); + if (code) { + terrno = code; tscError("consumer:0x%" PRIx64 " setup failed since %s, groupId:%s", pTmq->consumerId, terrstr(), pTmq->groupId); (void)tsem2_destroy(&pTmq->rspSem); SET_ERROR_MSG_TMQ("init tscObj failed") diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index 3007214ae8..8ed5191c82 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -1354,8 +1354,9 @@ int32_t taosReadDataFolder(const char *cfgDir, const char **envCmd, const char * } static int32_t taosCheckGlobalCfg() { - uint32_t ipv4 = taosGetIpv4FromFqdn(tsLocalFqdn); - if (ipv4 == 0xffffffff) { + uint32_t ipv4 = 0; + int32_t code = taosGetIpv4FromFqdn(tsLocalFqdn, &ipv4); + if (code) { terrno = TSDB_CODE_RPC_FQDN_ERROR; uError("failed to get ip from fqdn:%s since %s, dnode can not be initialized", tsLocalFqdn, terrstr()); return -1; diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index fb87a77be5..a3759272dd 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -12763,7 +12763,7 @@ int32_t tCloneTbTSMAInfo(STableTSMAInfo *pInfo, STableTSMAInfo **pRes) { if (!pRet->ast) code = TSDB_CODE_OUT_OF_MEMORY; } if (code) { - tFreeTableTSMAInfo(pRet); + tFreeAndClearTableTSMAInfo(pRet); pRet = NULL; } *pRes = pRet; diff --git a/source/common/src/trow.c b/source/common/src/trow.c index 7234e5c5f6..1dc4a6f9ba 100644 --- a/source/common/src/trow.c +++ b/source/common/src/trow.c @@ -138,7 +138,7 @@ int32_t tdGetBitmapValTypeII(const void *pBitmap, int16_t colIdx, TDRowValT *pVa int32_t tdGetBitmapValType(const void *pBitmap, int16_t colIdx, TDRowValT *pValType, int8_t bitmapMode) { switch (bitmapMode) { case 0: - tdGetBitmapValTypeII(pBitmap, colIdx, pValType); + (void)tdGetBitmapValTypeII(pBitmap, colIdx, pValType); break; #if 0 case -1: @@ -354,8 +354,8 @@ bool tdSKvRowGetVal(STSRow *pRow, col_id_t colId, col_id_t colIdx, SCellVal *pVa } void *pBitmap = tdGetBitmapAddrKv(pRow, tdRowGetNCols(pRow)); - tdGetKvRowValOfCol(pVal, pRow, pBitmap, pColIdx->offset, - POINTER_DISTANCE(pColIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx)); + (void)tdGetKvRowValOfCol(pVal, pRow, pBitmap, pColIdx->offset, + POINTER_DISTANCE(pColIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx)); return true; } @@ -366,7 +366,7 @@ bool tdSTpRowGetVal(STSRow *pRow, col_id_t colId, col_type_t colType, int32_t fl return true; } void *pBitmap = tdGetBitmapAddrTp(pRow, flen); - tdGetTpRowValOfCol(pVal, pRow, pBitmap, colType, offset, colIdx); + (void)tdGetTpRowValOfCol(pVal, pRow, pBitmap, colType, offset, colIdx); return true; } @@ -385,9 +385,9 @@ bool tdSTSRowIterNext(STSRowIter *pIter, SCellVal *pVal) { } if (TD_IS_TP_ROW(pIter->pRow)) { - tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset, pVal); + (void)tdSTSRowIterGetTpVal(pIter, pCol->type, pCol->offset, pVal); } else if (TD_IS_KV_ROW(pIter->pRow)) { - tdSTSRowIterGetKvVal(pIter, pCol->colId, &pIter->kvIdx, pVal); + (void)tdSTSRowIterGetKvVal(pIter, pCol->colId, &pIter->kvIdx, pVal); } else { ASSERT(0); } @@ -486,8 +486,8 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t r SRowBuilder rb = {.rowType = rowType}; tdSRowInit(&rb, pTSchema->version); - tdSRowSetInfo(&rb, pTSchema->numOfCols, nBound, pTSchema->flen); - tdSRowResetBuf(&rb, *ppRow); + (void)tdSRowSetInfo(&rb, pTSchema->numOfCols, nBound, pTSchema->flen); + (void)tdSRowResetBuf(&rb, *ppRow); int32_t iBound = 0; iColVal = 0; @@ -506,7 +506,7 @@ int32_t tdSTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow **ppRow, int8_t r } else if (IS_VAR_DATA_TYPE(pTColumn->type)) { varDataSetLen(varBuf, pColVal->value.nData); if (pColVal->value.nData != 0) { - memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData); + (void)memcpy(varDataVal(varBuf), pColVal->value.pData, pColVal->value.nData); } val = varBuf; ++iBound; @@ -578,7 +578,7 @@ bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCell #ifdef TD_SUPPORT_BITMAP colIdx = POINTER_DISTANCE(pCol, pSchema->columns) / sizeof(STColumn); #endif - tdGetTpRowValOfCol(pVal, pRow, pIter->pBitmap, pCol->type, pCol->offset, colIdx - 1); + (void)tdGetTpRowValOfCol(pVal, pRow, pIter->pBitmap, pCol->type, pCol->offset, colIdx - 1); } else if (TD_IS_KV_ROW(pRow)) { SKvRowIdx *pIdx = (SKvRowIdx *)taosbsearch(&colId, TD_ROW_COL_IDX(pRow), tdRowGetNCols(pRow), sizeof(SKvRowIdx), compareKvRowColId, TD_EQ); @@ -587,7 +587,7 @@ bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCell colIdx = POINTER_DISTANCE(pIdx, TD_ROW_COL_IDX(pRow)) / sizeof(SKvRowIdx); } #endif - tdGetKvRowValOfCol(pVal, pRow, pIter->pBitmap, pIdx ? pIdx->offset : -1, colIdx); + (void)tdGetKvRowValOfCol(pVal, pRow, pIter->pBitmap, pIdx ? pIdx->offset : -1, colIdx); } else { if (COL_REACH_END(colId, pIter->maxColId)) return false; pVal->valType = TD_VTYPE_NONE; @@ -689,9 +689,9 @@ int32_t tdAppendColValToRow(SRowBuilder *pBuilder, col_id_t colId, int8_t colTyp } if (TD_IS_TP_ROW(pRow)) { - tdAppendColValToTpRow(pBuilder, valType, val, isCopyVarData, colType, colIdx, offset); + (void)tdAppendColValToTpRow(pBuilder, valType, val, isCopyVarData, colType, colIdx, offset); } else { - tdAppendColValToKvRow(pBuilder, valType, val, isCopyVarData, colType, colIdx, offset, colId); + (void)tdAppendColValToKvRow(pBuilder, valType, val, isCopyVarData, colType, colIdx, offset, colId); } TAOS_RETURN(TSDB_CODE_SUCCESS); } @@ -718,11 +718,11 @@ int32_t tdAppendColValToKvRow(SRowBuilder *pBuilder, TDRowValT valType, const vo char *ptr = (char *)POINTER_SHIFT(row, TD_ROW_LEN(row)); if (IS_VAR_DATA_TYPE(colType)) { if (isCopyVarData) { - memcpy(ptr, val, varDataTLen(val)); + (void)memcpy(ptr, val, varDataTLen(val)); } TD_ROW_LEN(row) += varDataTLen(val); } else { - memcpy(ptr, val, TYPE_BYTES[colType]); + (void)memcpy(ptr, val, TYPE_BYTES[colType]); TD_ROW_LEN(row) += TYPE_BYTES[colType]; } } @@ -752,11 +752,11 @@ int32_t tdAppendColValToTpRow(SRowBuilder *pBuilder, TDRowValT valType, const vo // ts key stored in STSRow.ts *(VarDataOffsetT *)POINTER_SHIFT(TD_ROW_DATA(row), offset) = TD_ROW_LEN(row); if (isCopyVarData) { - memcpy(POINTER_SHIFT(row, TD_ROW_LEN(row)), val, varDataTLen(val)); + (void)memcpy(POINTER_SHIFT(row, TD_ROW_LEN(row)), val, varDataTLen(val)); } TD_ROW_LEN(row) += varDataTLen(val); } else { - memcpy(POINTER_SHIFT(TD_ROW_DATA(row), offset), val, TYPE_BYTES[colType]); + (void)memcpy(POINTER_SHIFT(TD_ROW_DATA(row), offset), val, TYPE_BYTES[colType]); } } @@ -782,7 +782,7 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) { case TD_ROW_TP: #ifdef TD_SUPPORT_BITMAP pBuilder->pBitmap = tdGetBitmapAddrTp(pBuilder->pBuf, pBuilder->flen); - memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBitmaps); + (void)memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBitmaps); #endif // the primary TS key is stored separatedly len = TD_ROW_HEAD_LEN + pBuilder->flen + pBuilder->nBitmaps; @@ -792,7 +792,7 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) { case TD_ROW_KV: #ifdef TD_SUPPORT_BITMAP pBuilder->pBitmap = tdGetBitmapAddrKv(pBuilder->pBuf, pBuilder->nBoundCols); - memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBoundBitmaps); + (void)memset(pBuilder->pBitmap, TD_VTYPE_NONE_BYTE_II, pBuilder->nBoundBitmaps); #endif len = TD_ROW_HEAD_LEN + TD_ROW_NCOLS_LEN + (pBuilder->nBoundCols - 1) * sizeof(SKvRowIdx) + pBuilder->nBoundBitmaps; // add @@ -937,9 +937,9 @@ void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColV ASSERT((pTColumn->colId == PRIMARYKEY_TIMESTAMP_COL_ID) || (iCol > 0)); if (TD_IS_TP_ROW(pRow)) { - tdSTpRowGetVal(pRow, pTColumn->colId, pTColumn->type, pTSchema->flen, pTColumn->offset, iCol - 1, &cv); + (void)tdSTpRowGetVal(pRow, pTColumn->colId, pTColumn->type, pTSchema->flen, pTColumn->offset, iCol - 1, &cv); } else if (TD_IS_KV_ROW(pRow)) { - tdSKvRowGetVal(pRow, pTColumn->colId, iCol - 1, &cv); + (void)tdSKvRowGetVal(pRow, pTColumn->colId, iCol - 1, &cv); } else { ASSERT(0); } @@ -957,7 +957,7 @@ void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColV pColVal->value.nData = varDataLen(cv.val); pColVal->value.pData = varDataVal(cv.val); } else { - memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes); + (void)memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes); } } } \ No newline at end of file diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index ecd64ff475..e63ff8b931 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -298,12 +298,7 @@ void mndReleaseSma(SMnode *pMnode, SSmaObj *pSma) { sdbRelease(pSdb, pSma); } -SDbObj *mndAcquireDbBySma(SMnode *pMnode, const char *smaName) { - SName name = {0}; - tNameFromString(&name, smaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - - char db[TSDB_TABLE_FNAME_LEN] = {0}; - tNameGetFullDbName(&name, db); +SDbObj *mndAcquireDbBySma(SMnode *pMnode, const char *db) { return mndAcquireDb(pMnode, db); } @@ -312,7 +307,10 @@ static void *mndBuildVCreateSmaReq(SMnode *pMnode, SVgObj *pVgroup, SSmaObj *pSm SEncoder encoder = {0}; int32_t contLen = 0; SName name = {0}; - tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + int32_t code = tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + return NULL; + } SVCreateTSmaReq req = {0}; req.version = 0; @@ -370,7 +368,7 @@ static void *mndBuildVDropSmaReq(SMnode *pMnode, SVgObj *pVgroup, SSmaObj *pSma, SEncoder encoder = {0}; int32_t contLen; SName name = {0}; - tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + (void)tNameFromString(&name, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); SVDropTSmaReq req = {0}; req.indexUid = pSma->uid; @@ -782,10 +780,14 @@ static int32_t mndCheckCreateSmaReq(SMCreateSmaReq *pCreate) { TAOS_RETURN(code); } -static void mndGetStreamNameFromSmaName(char *streamName, char *smaName) { +static int32_t mndGetStreamNameFromSmaName(char *streamName, char *smaName) { SName n; - tNameFromString(&n, smaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + int32_t code = tNameFromString(&n, smaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + return code; + } sprintf(streamName, "%d.%s", n.acctId, n.tname); + return TSDB_CODE_SUCCESS; } static int32_t mndProcessCreateSmaReq(SRpcMsg *pReq) { @@ -817,7 +819,10 @@ static int32_t mndProcessCreateSmaReq(SRpcMsg *pReq) { } char streamName[TSDB_TABLE_FNAME_LEN] = {0}; - mndGetStreamNameFromSmaName(streamName, createReq.name); + code = mndGetStreamNameFromSmaName(streamName, createReq.name); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } code = mndAcquireStream(pMnode, streamName, &pStream); if (pStream != NULL || code == 0) { @@ -843,7 +848,15 @@ static int32_t mndProcessCreateSmaReq(SRpcMsg *pReq) { } } - pDb = mndAcquireDbBySma(pMnode, createReq.name); + SName name = {0}; + code = tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } + char db[TSDB_TABLE_FNAME_LEN] = {0}; + (void)tNameGetFullDbName(&name, db); + + pDb = mndAcquireDb(pMnode, db); if (pDb == NULL) { code = TSDB_CODE_MND_DB_NOT_SELECTED; goto _OVER; @@ -964,6 +977,7 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p SVgObj *pVgroup = NULL; SStbObj *pStb = NULL; STrans *pTrans = NULL; + SStreamObj *pStream = NULL; pVgroup = mndAcquireVgroup(pMnode, pSma->dstVgId); if (pVgroup == NULL) { @@ -993,9 +1007,11 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p mndTransSetSerial(pTrans); char streamName[TSDB_TABLE_FNAME_LEN] = {0}; - mndGetStreamNameFromSmaName(streamName, pSma->name); + code = mndGetStreamNameFromSmaName(streamName, pSma->name); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } - SStreamObj *pStream = NULL; code = mndAcquireStream(pMnode, streamName, &pStream); if (pStream == NULL || pStream->smaId != pSma->uid || code != 0) { @@ -1054,7 +1070,10 @@ int32_t mndDropSmasByStb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *p } char streamName[TSDB_TABLE_FNAME_LEN] = {0}; - mndGetStreamNameFromSmaName(streamName, pSma->name); + code = mndGetStreamNameFromSmaName(streamName, pSma->name); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } SStreamObj *pStream = NULL; code = mndAcquireStream(pMnode, streamName, &pStream); @@ -1144,7 +1163,15 @@ static int32_t mndProcessDropSmaReq(SRpcMsg *pReq) { } } - pDb = mndAcquireDbBySma(pMnode, dropReq.name); + SName name = {0}; + code = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } + char db[TSDB_TABLE_FNAME_LEN] = {0}; + (void)tNameGetFullDbName(&name, db); + + pDb = mndAcquireDb(pMnode, db); if (pDb == NULL) { code = TSDB_CODE_MND_DB_NOT_SELECTED; goto _OVER; @@ -1303,7 +1330,11 @@ static int32_t mndProcessGetSmaReq(SRpcMsg *pReq) { goto _OVER; } - tSerializeSUserIndexRsp(pRsp, contLen, &rsp); + contLen = tSerializeSUserIndexRsp(pRsp, contLen, &rsp); + if (contLen < 0) { + code = terrno; + goto _OVER; + } pReq->info.rsp = pRsp; pReq->info.rspLen = contLen; @@ -1349,7 +1380,11 @@ static int32_t mndProcessGetTbSmaReq(SRpcMsg *pReq) { goto _OVER; } - tSerializeSTableIndexRsp(pRsp, contLen, &rsp); + contLen = tSerializeSTableIndexRsp(pRsp, contLen, &rsp); + if (contLen < 0) { + code = terrno; + goto _OVER; + } pReq->info.rsp = pRsp; pReq->info.rspLen = contLen; @@ -1372,6 +1407,7 @@ static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc int32_t numOfRows = 0; SSmaObj *pSma = NULL; int32_t cols = 0; + int32_t code = 0; SDbObj *pDb = NULL; if (strlen(pShow->db) > 0) { @@ -1391,47 +1427,63 @@ static int32_t mndRetrieveSma(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc cols = 0; SName smaName = {0}; - tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - char n1[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(n1, (char *)tNameGetTableName(&smaName)); - - char n2[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(n2, (char *)mndGetDbStr(pSma->db)); - SName stbName = {0}; - tNameFromString(&stbName, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + char n2[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; char n3[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(n3, (char *)tNameGetTableName(&stbName)); + code = tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + char n1[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; + if (TSDB_CODE_SUCCESS == code) { + STR_TO_VARSTR(n1, (char *)tNameGetTableName(&smaName)); + STR_TO_VARSTR(n2, (char *)mndGetDbStr(pSma->db)); + code = tNameFromString(&stbName, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + } + SColumnInfoData* pColInfo = NULL; + if (TSDB_CODE_SUCCESS == code) { + STR_TO_VARSTR(n3, (char *)tNameGetTableName(&stbName)); - SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)n1, false); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)n2, false); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)n3, false); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)&pSma->dstVgId, false); - - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)&pSma->createdTime, false); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)n1, false); + } + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)n2, false); + } + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)n3, false); + } + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)&pSma->dstVgId, false); + } + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)&pSma->createdTime, false); + } char col[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; STR_TO_VARSTR(col, (char *)""); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)col, false); + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)col, false); + } - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - char tag[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(tag, (char *)"sma_index"); - colDataSetVal(pColInfo, numOfRows, (const char *)tag, false); + char tag[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_TO_VARSTR(tag, (char *)"sma_index"); + code = colDataSetVal(pColInfo, numOfRows, (const char *)tag, false); + } numOfRows++; sdbRelease(pSdb, pSma); + if (TSDB_CODE_SUCCESS != code) { + sdbCancelFetch(pMnode->pSdb, pIter->pSmaIter); + numOfRows = -1; + break; + } } mndReleaseDb(pMnode, pDb); @@ -1520,7 +1572,7 @@ static void initStreamObj(SStreamObj *pStream, const char *streamName, const SMC pStream->ast = taosStrdup(pSma->ast); } -static void mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) { +static int32_t mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) { tstrncpy(pCxt->pCreateStreamReq->name, pCxt->streamName, TSDB_STREAM_FNAME_LEN); tstrncpy(pCxt->pCreateStreamReq->sourceDB, pCxt->pDb->name, TSDB_DB_FNAME_LEN); tstrncpy(pCxt->pCreateStreamReq->targetStbFullName, pCxt->targetStbFullName, TSDB_TABLE_FNAME_LEN); @@ -1540,11 +1592,21 @@ static void mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) { pCxt->pCreateStreamReq->lastTs = pCxt->pCreateSmaReq->lastTs; pCxt->pCreateStreamReq->smaId = pCxt->pSma->uid; pCxt->pCreateStreamReq->ast = taosStrdup(pCxt->pCreateSmaReq->ast); + if (!pCxt->pCreateStreamReq->ast) { + return terrno; + } pCxt->pCreateStreamReq->sql = taosStrdup(pCxt->pCreateSmaReq->sql); + if (!pCxt->pCreateStreamReq->sql) { + return terrno; + } // construct tags pCxt->pCreateStreamReq->pTags = taosArrayInit(pCxt->pCreateStreamReq->numOfTags, sizeof(SField)); + if (!pCxt->pCreateStreamReq->pTags) { + return terrno; + } SField f = {0}; + int32_t code = 0; if (pCxt->pSrcStb) { for (int32_t idx = 0; idx < pCxt->pCreateStreamReq->numOfTags - 1; ++idx) { SSchema *pSchema = &pCxt->pSrcStb->pTags[idx]; @@ -1552,25 +1614,39 @@ static void mndCreateTSMABuildCreateStreamReq(SCreateTSMACxt *pCxt) { f.type = pSchema->type; f.flags = pSchema->flags; tstrncpy(f.name, pSchema->name, TSDB_COL_NAME_LEN); - taosArrayPush(pCxt->pCreateStreamReq->pTags, &f); + if (NULL == taosArrayPush(pCxt->pCreateStreamReq->pTags, &f)) { + code = terrno; + break; + } } } - f.bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE; - f.flags = COL_SMA_ON; - f.type = TSDB_DATA_TYPE_BINARY; - tstrncpy(f.name, "tbname", strlen("tbname") + 1); - taosArrayPush(pCxt->pCreateStreamReq->pTags, &f); - // construct output cols - SNode* pNode; - FOREACH(pNode, pCxt->pProjects) { - SExprNode* pExprNode = (SExprNode*)pNode; - f.bytes = pExprNode->resType.bytes; - f.type = pExprNode->resType.type; + if (TSDB_CODE_SUCCESS == code) { + f.bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE; f.flags = COL_SMA_ON; - strcpy(f.name, pExprNode->userAlias); - taosArrayPush(pCxt->pCreateStreamReq->pCols, &f); + f.type = TSDB_DATA_TYPE_BINARY; + tstrncpy(f.name, "tbname", strlen("tbname") + 1); + if (NULL == taosArrayPush(pCxt->pCreateStreamReq->pTags, &f)) { + code = terrno; + } } + + if (TSDB_CODE_SUCCESS == code) { + // construct output cols + SNode* pNode; + FOREACH(pNode, pCxt->pProjects) { + SExprNode* pExprNode = (SExprNode*)pNode; + f.bytes = pExprNode->resType.bytes; + f.type = pExprNode->resType.type; + f.flags = COL_SMA_ON; + strcpy(f.name, pExprNode->userAlias); + if (NULL == taosArrayPush(pCxt->pCreateStreamReq->pCols, &f)) { + code = terrno; + break; + } + } + } + return code; } static void mndCreateTSMABuildDropStreamReq(SCreateTSMACxt* pCxt) { @@ -1733,7 +1809,10 @@ static int32_t mndCreateTSMA(SCreateTSMACxt *pCxt) { } } pCxt->pDropStreamReq = &dropStreamReq; - mndCreateTSMABuildCreateStreamReq(pCxt); + code = mndCreateTSMABuildCreateStreamReq(pCxt); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } mndCreateTSMABuildDropStreamReq(pCxt); if (TSDB_CODE_SUCCESS != (code = mndCreateTSMATxnPrepare(pCxt))) { @@ -1753,11 +1832,15 @@ _OVER: TAOS_RETURN(code); } -static void mndTSMAGenerateOutputName(const char* tsmaName, char* streamName, char* targetStbName) { +static int32_t mndTSMAGenerateOutputName(const char* tsmaName, char* streamName, char* targetStbName) { SName smaName; - tNameFromString(&smaName, tsmaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + int32_t code = tNameFromString(&smaName, tsmaName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + return code; + } sprintf(streamName, "%d.%s", smaName.acctId, smaName.tname); snprintf(targetStbName, TSDB_TABLE_FNAME_LEN, "%s"TSMA_RES_STB_POSTFIX, tsmaName); + return TSDB_CODE_SUCCESS; } static int32_t mndProcessCreateTSMAReq(SRpcMsg* pReq) { @@ -1799,7 +1882,11 @@ static int32_t mndProcessCreateTSMAReq(SRpcMsg* pReq) { char streamName[TSDB_TABLE_FNAME_LEN] = {0}; char streamTargetStbFullName[TSDB_TABLE_FNAME_LEN] = {0}; - mndTSMAGenerateOutputName(createReq.name, streamName, streamTargetStbFullName); + code = mndTSMAGenerateOutputName(createReq.name, streamName, streamTargetStbFullName); + if (TSDB_CODE_SUCCESS != code) { + mInfo("tsma:%s, faield to generate name", createReq.name); + goto _OVER; + } pSma = sdbAcquire(pMnode->pSdb, SDB_SMA, createReq.name); if (pSma && createReq.igExists) { @@ -1828,7 +1915,15 @@ static int32_t mndProcessCreateTSMAReq(SRpcMsg* pReq) { goto _OVER; } - pDb = mndAcquireDbBySma(pMnode, createReq.name); + SName name = {0}; + code = tNameFromString(&name, createReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } + char db[TSDB_TABLE_FNAME_LEN] = {0}; + (void)tNameGetFullDbName(&name, db); + + pDb = mndAcquireDb(pMnode, db); if (pDb == NULL) { code = TSDB_CODE_MND_DB_NOT_SELECTED; goto _OVER; @@ -1978,7 +2073,10 @@ static int32_t mndProcessDropTSMAReq(SRpcMsg* pReq) { char streamName[TSDB_TABLE_FNAME_LEN] = {0}; char streamTargetStbFullName[TSDB_TABLE_FNAME_LEN] = {0}; - mndTSMAGenerateOutputName(dropReq.name, streamName, streamTargetStbFullName); + code = mndTSMAGenerateOutputName(dropReq.name, streamName, streamTargetStbFullName); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } SStbObj* pStb = mndAcquireStb(pMnode, streamTargetStbFullName); @@ -1991,7 +2089,15 @@ static int32_t mndProcessDropTSMAReq(SRpcMsg* pReq) { code = TSDB_CODE_MND_SMA_NOT_EXIST; goto _OVER; } - pDb = mndAcquireDbBySma(pMnode, dropReq.name); + SName name = {0}; + code = tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + goto _OVER; + } + char db[TSDB_TABLE_FNAME_LEN] = {0}; + (void)tNameGetFullDbName(&name, db); + + pDb = mndAcquireDb(pMnode, db); if (!pDb) { code = TSDB_CODE_MND_DB_NOT_EXIST; goto _OVER; @@ -2032,6 +2138,7 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo int32_t numOfRows = 0; SSmaObj * pSma = NULL; SMnode * pMnode = pReq->info.node; + int32_t code = 0; SColumnInfoData *pColInfo; if (pShow->db[0]) { pDb = mndAcquireDb(pMnode, pShow->db); @@ -2054,65 +2161,90 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo int32_t cols = 0; SName n = {0}; - tNameFromString(&n, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + code = tNameFromString(&n, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); char smaName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(smaName, (char *)tNameGetTableName(&n)); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char *)smaName, false); + if (TSDB_CODE_SUCCESS == code) { + STR_TO_VARSTR(smaName, (char *)tNameGetTableName(&n)); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char *)smaName, false); + } char db[TSDB_DB_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(db, (char *)mndGetDbStr(pSma->db)); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char*)db, false); + if (TSDB_CODE_SUCCESS == code) { + STR_TO_VARSTR(db, (char *)mndGetDbStr(pSma->db)); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char*)db, false); + } - tNameFromString(&n, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS == code) { + code = tNameFromString(&n, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + } char srcTb[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(srcTb, (char *)tNameGetTableName(&n)); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char*)srcTb, false); + if (TSDB_CODE_SUCCESS == code) { + STR_TO_VARSTR(srcTb, (char *)tNameGetTableName(&n)); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char*)srcTb, false); + } - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char*)db, false); + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char*)db, false); + } - tNameFromString(&n, pSma->dstTbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - char targetTb[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; - STR_TO_VARSTR(targetTb, (char*)tNameGetTableName(&n)); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char*)targetTb, false); + if (TSDB_CODE_SUCCESS == code) { + code = tNameFromString(&n, pSma->dstTbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + } - // stream name - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char*)smaName, false); + if (TSDB_CODE_SUCCESS == code) { + char targetTb[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0}; + STR_TO_VARSTR(targetTb, (char*)tNameGetTableName(&n)); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char*)targetTb, false); + } - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, (const char*)(&pSma->createdTime), false); + if (TSDB_CODE_SUCCESS == code) { + // stream name + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char*)smaName, false); + } + + if (TSDB_CODE_SUCCESS == code) { + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, (const char*)(&pSma->createdTime), false); + } // interval char interval[64 + VARSTR_HEADER_SIZE] = {0}; int32_t len = 0; - if (!IS_CALENDAR_TIME_DURATION(pSma->intervalUnit)) { - len = snprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval, - getPrecisionUnit(pSrcDb->cfg.precision)); - } else { - len = snprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval, pSma->intervalUnit); + if (TSDB_CODE_SUCCESS == code) { + if (!IS_CALENDAR_TIME_DURATION(pSma->intervalUnit)) { + len = snprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval, + getPrecisionUnit(pSrcDb->cfg.precision)); + } else { + len = snprintf(interval + VARSTR_HEADER_SIZE, 64, "%" PRId64 "%c", pSma->interval, pSma->intervalUnit); + } + varDataSetLen(interval, len); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, interval, false); } - varDataSetLen(interval, len); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, interval, false); - // create sql - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); char buf[TSDB_MAX_SAVED_SQL_LEN + VARSTR_HEADER_SIZE] = {0}; - len = snprintf(buf + VARSTR_HEADER_SIZE, TSDB_MAX_SAVED_SQL_LEN, "%s", pSma->sql); - varDataSetLen(buf, TMIN(len, TSDB_MAX_SAVED_SQL_LEN)); - colDataSetVal(pColInfo, numOfRows, buf, false); + if (TSDB_CODE_SUCCESS == code) { + // create sql + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + len = snprintf(buf + VARSTR_HEADER_SIZE, TSDB_MAX_SAVED_SQL_LEN, "%s", pSma->sql); + varDataSetLen(buf, TMIN(len, TSDB_MAX_SAVED_SQL_LEN)); + code = colDataSetVal(pColInfo, numOfRows, buf, false); + } // func list len = 0; - char * start = buf + VARSTR_HEADER_SIZE; SNode *pNode = NULL, *pFunc = NULL; - nodesStringToNode(pSma->ast, &pNode); - if (pNode) { + if (TSDB_CODE_SUCCESS == code) { + code = nodesStringToNode(pSma->ast, &pNode); + } + if (TSDB_CODE_SUCCESS == code) { + char * start = buf + VARSTR_HEADER_SIZE; FOREACH(pFunc, ((SSelectStmt *)pNode)->pProjectionList) { if (nodeType(pFunc) == QUERY_NODE_FUNCTION) { SFunctionNode *pFuncNode = (SFunctionNode *)pFunc; @@ -2128,13 +2260,21 @@ static int32_t mndRetrieveTSMA(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlo } nodesDestroyNode(pNode); } - varDataSetLen(buf, len); - pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); - colDataSetVal(pColInfo, numOfRows, buf, false); + + if (TSDB_CODE_SUCCESS == code) { + varDataSetLen(buf, len); + pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); + code = colDataSetVal(pColInfo, numOfRows, buf, false); + } numOfRows++; mndReleaseSma(pMnode, pSma); mndReleaseDb(pMnode, pSrcDb); + if (TSDB_CODE_SUCCESS != code) { + sdbCancelFetch(pMnode->pSdb, pIter->pSmaIter); + numOfRows = -1; + break; + } } mndReleaseDb(pMnode, pDb); pShow->numOfRows += numOfRows; @@ -2163,13 +2303,22 @@ int32_t dumpTSMAInfoFromSmaObj(const SSmaObj* pSma, const SStbObj* pDestStb, STa pInfo->tsmaId = pSma->uid; pInfo->destTbUid = pDestStb->uid; SName sName = {0}; - tNameFromString(&sName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + code = tNameFromString(&sName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + return code; + } tstrncpy(pInfo->name, sName.tname, TSDB_TABLE_NAME_LEN); tstrncpy(pInfo->targetDbFName, pSma->db, TSDB_DB_FNAME_LEN); - tNameFromString(&sName, pSma->dstTbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + code = tNameFromString(&sName, pSma->dstTbName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + return code; + } tstrncpy(pInfo->targetTb, sName.tname, TSDB_TABLE_NAME_LEN); tstrncpy(pInfo->dbFName, pSma->db, TSDB_DB_FNAME_LEN); - tNameFromString(&sName, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + code = tNameFromString(&sName, pSma->stb, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + return code; + } tstrncpy(pInfo->tb, sName.tname, TSDB_TABLE_NAME_LEN); pInfo->pFuncs = taosArrayInit(8, sizeof(STableTSMAFuncInfo)); if (!pInfo->pFuncs) return TSDB_CODE_OUT_OF_MEMORY; @@ -2206,7 +2355,10 @@ int32_t dumpTSMAInfoFromSmaObj(const SSmaObj* pSma, const SStbObj* pDestStb, STa code = TSDB_CODE_OUT_OF_MEMORY; } else { for (int32_t i = 0; i < pDestStb->numOfTags; ++i) { - taosArrayPush(pInfo->pTags, &pDestStb->pTags[i]); + if (NULL == taosArrayPush(pInfo->pTags, &pDestStb->pTags[i])) { + code = terrno; + break; + } } } } @@ -2217,7 +2369,10 @@ int32_t dumpTSMAInfoFromSmaObj(const SSmaObj* pSma, const SStbObj* pDestStb, STa else { // skip _wstart, _wend, _duration for (int32_t i = 1; i < pDestStb->numOfColumns - 2; ++i) { - taosArrayPush(pInfo->pUsedCols, &pDestStb->pColumns[i]); + if (NULL == taosArrayPush(pInfo->pUsedCols, &pDestStb->pColumns[i])) { + code = terrno; + break; + } } } } @@ -2280,12 +2435,12 @@ static int32_t mndGetTSMA(SMnode *pMnode, char *tsmaFName, STableTSMAInfoRsp *rs sdbRelease(pMnode->pSdb, pSma); if (pBaseTsma) mndReleaseSma(pMnode, pBaseTsma); if (terrno) { - tFreeTableTSMAInfo(pTsma); + tFreeAndClearTableTSMAInfo(pTsma); TAOS_RETURN(code); } if (NULL == taosArrayPush(rsp->pTsmas, &pTsma)) { code = TSDB_CODE_OUT_OF_MEMORY; - tFreeTableTSMAInfo(pTsma); + tFreeAndClearTableTSMAInfo(pTsma); } *exist = true; } @@ -2320,7 +2475,11 @@ static int32_t mndGetSomeTsmas(SMnode* pMnode, STableTSMAInfoRsp* pRsp, tsmaFilt SName smaName; char streamName[TSDB_TABLE_FNAME_LEN] = {0}; - tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + code = tNameFromString(&smaName, pSma->name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS != code) { + sdbRelease(pSdb, pSma); + TAOS_RETURN(code); + } sprintf(streamName, "%d.%s", smaName.acctId, smaName.tname); pStream = NULL; @@ -2351,13 +2510,13 @@ static int32_t mndGetSomeTsmas(SMnode* pMnode, STableTSMAInfoRsp* pRsp, tsmaFilt sdbRelease(pSdb, pSma); if (pBaseTsma) mndReleaseSma(pMnode, pBaseTsma); if (terrno) { - tFreeTableTSMAInfo(pTsma); + tFreeAndClearTableTSMAInfo(pTsma); sdbCancelFetch(pSdb, pIter); TAOS_RETURN(code); } if (NULL == taosArrayPush(pRsp->pTsmas, &pTsma)) { code = TSDB_CODE_OUT_OF_MEMORY; - tFreeTableTSMAInfo(pTsma); + tFreeAndClearTableTSMAInfo(pTsma); sdbCancelFetch(pSdb, pIter); TAOS_RETURN(code); } @@ -2418,7 +2577,11 @@ static int32_t mndProcessGetTbTSMAReq(SRpcMsg *pReq) { goto _OVER; } - tSerializeTableTSMAInfoRsp(pRsp, contLen, &rsp); + int32_t len = tSerializeTableTSMAInfoRsp(pRsp, contLen, &rsp); + if (len < 0) { + code = terrno; + goto _OVER; + } pReq->info.rsp = pRsp; pReq->info.rspLen = contLen; @@ -2434,7 +2597,7 @@ _OVER: static int32_t mkNonExistTSMAInfo(const STSMAVersion *pTsmaVer, STableTSMAInfo **ppTsma) { STableTSMAInfo *pInfo = taosMemoryCalloc(1, sizeof(STableTSMAInfo)); if (!pInfo) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pInfo->pFuncs = NULL; pInfo->tsmaId = pTsmaVer->tsmaId; @@ -2443,6 +2606,10 @@ static int32_t mkNonExistTSMAInfo(const STSMAVersion *pTsmaVer, STableTSMAInfo * tstrncpy(pInfo->name, pTsmaVer->name, TSDB_TABLE_NAME_LEN); pInfo->dbId = pTsmaVer->dbId; pInfo->ast = taosMemoryCalloc(1, 1); + if (!pInfo->ast) { + taosMemoryFree(pInfo); + return terrno; + } *ppTsma = pInfo; return TSDB_CODE_SUCCESS; } @@ -2458,7 +2625,7 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t hbRsp.pTsmas = taosArrayInit(numOfTsmas, POINTER_BYTES); if (!hbRsp.pTsmas) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = terrno; TAOS_RETURN(code); } @@ -2473,7 +2640,11 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t if (!pSma) { code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo); if (code) goto _OVER; - taosArrayPush(hbRsp.pTsmas, &pTsmaInfo); + if (NULL == taosArrayPush(hbRsp.pTsmas, &pTsmaInfo)) { + code = terrno; + tFreeAndClearTableTSMAInfo(pTsmaInfo); + goto _OVER; + } continue; } @@ -2482,7 +2653,11 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo); mndReleaseSma(pMnode, pSma); if (code) goto _OVER; - taosArrayPush(hbRsp.pTsmas, &pTsmaInfo); + if (NULL == taosArrayPush(hbRsp.pTsmas, &pTsmaInfo)) { + code = terrno; + tFreeAndClearTableTSMAInfo(pTsmaInfo); + goto _OVER; + } continue; } else if (pSma->version == pTsmaVer->version) { mndReleaseSma(pMnode, pSma); @@ -2495,7 +2670,11 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t code = mkNonExistTSMAInfo(pTsmaVer, &pTsmaInfo); mndReleaseSma(pMnode, pSma); if (code) goto _OVER; - taosArrayPush(hbRsp.pTsmas, &pTsmaInfo); + if (NULL == taosArrayPush(hbRsp.pTsmas, &pTsmaInfo)) { + code = terrno; + tFreeAndClearTableTSMAInfo(pTsmaInfo); + goto _OVER; + } continue; } @@ -2503,7 +2682,7 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t STableTSMAInfo * pInfo = NULL; pInfo = taosMemoryCalloc(1, sizeof(STableTSMAInfo)); if (!pInfo) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = terrno; mndReleaseSma(pMnode, pSma); mndReleaseStb(pMnode, pDestStb); goto _OVER; @@ -2517,27 +2696,35 @@ int32_t mndValidateTSMAInfo(SMnode *pMnode, STSMAVersion *pTsmaVersions, int32_t mndReleaseSma(pMnode, pSma); if (pBaseSma) mndReleaseSma(pMnode, pBaseSma); if (terrno) { - tFreeTableTSMAInfo(pInfo); + tFreeAndClearTableTSMAInfo(pInfo); goto _OVER; } - taosArrayPush(hbRsp.pTsmas, pInfo); + if (NULL == taosArrayPush(hbRsp.pTsmas, pInfo)) { + code = terrno; + tFreeAndClearTableTSMAInfo(pInfo); + goto _OVER; + } } rspLen = tSerializeTSMAHbRsp(NULL, 0, &hbRsp); if (rspLen < 0) { - code = TSDB_CODE_INVALID_MSG; + code = terrno; goto _OVER; } pRsp = taosMemoryMalloc(rspLen); if (!pRsp) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = terrno; rspLen = 0; goto _OVER; } - tSerializeTSMAHbRsp(pRsp, rspLen, &hbRsp); + rspLen = tSerializeTSMAHbRsp(pRsp, rspLen, &hbRsp); + if (rspLen < 0) { + code = terrno; + goto _OVER; + } code = 0; _OVER: tFreeTSMAHbRsp(&hbRsp); diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 9f37885d6d..2095f80f0f 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -142,12 +142,12 @@ static int32_t ipWhiteMgtInit() { TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } ipWhiteMgt.ver = 0; - taosThreadRwlockInit(&ipWhiteMgt.rw, NULL); + (void)taosThreadRwlockInit(&ipWhiteMgt.rw, NULL); TAOS_RETURN(0); } void ipWhiteMgtCleanup() { destroyIpWhiteTab(ipWhiteMgt.pIpWhiteTab); - taosThreadRwlockDestroy(&ipWhiteMgt.rw); + (void)taosThreadRwlockDestroy(&ipWhiteMgt.rw); } int32_t ipWhiteMgtUpdate(SMnode *pMnode, char *user, SIpWhiteList *pNew) { @@ -155,7 +155,7 @@ int32_t ipWhiteMgtUpdate(SMnode *pMnode, char *user, SIpWhiteList *pNew) { int32_t lino = 0; bool update = true; SArray *fqdns = NULL; - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); SIpWhiteList **ppList = taosHashGet(ipWhiteMgt.pIpWhiteTab, user, strlen(user)); if (ppList == NULL || *ppList == NULL) { @@ -212,7 +212,7 @@ int32_t ipWhiteMgtUpdate(SMnode *pMnode, char *user, SIpWhiteList *pNew) { if (update) ipWhiteMgt.ver++; _OVER: - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); taosArrayDestroyP(fqdns, (FDelete)taosMemoryFree); if (code < 0) { mError("failed to update ip white list for user: %s at line %d since %s", user, lino, tstrerror(code)); @@ -221,17 +221,17 @@ _OVER: } int32_t ipWhiteMgtRemove(char *user) { bool update = true; - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); SIpWhiteList **ppList = taosHashGet(ipWhiteMgt.pIpWhiteTab, user, strlen(user)); if (ppList == NULL || *ppList == NULL) { update = false; } else { taosMemoryFree(*ppList); - taosHashRemove(ipWhiteMgt.pIpWhiteTab, user, strlen(user)); + (void)taosHashRemove(ipWhiteMgt.pIpWhiteTab, user, strlen(user)); } if (update) ipWhiteMgt.ver++; - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); return 0; } @@ -245,7 +245,7 @@ bool isRangeInWhiteList(SIpWhiteList *pList, SIpV4Range *range) { } #if 0 int32_t ipWhiteUpdateForAllUser(SIpWhiteList *pList) { - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); SHashObj *pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK); void *pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, NULL); @@ -267,8 +267,8 @@ int32_t ipWhiteUpdateForAllUser(SIpWhiteList *pList) { if (clone->num != 0) { int32_t sz = clone->num + p->num; val = taosMemoryCalloc(1, sizeof(SIpWhiteList) + sz * sizeof(SIpV4Range)); - memcpy(val->pIpRange, p->pIpRange, sizeof(SIpV4Range) * p->num); - memcpy(((char *)val->pIpRange) + sizeof(SIpV4Range) * p->num, (char *)clone->pIpRange, + (void)memcpy(val->pIpRange, p->pIpRange, sizeof(SIpV4Range) * p->num); + (void)memcpy(((char *)val->pIpRange) + sizeof(SIpV4Range) * p->num, (char *)clone->pIpRange, sizeof(SIpV4Range) * clone->num); } else { @@ -285,7 +285,7 @@ int32_t ipWhiteUpdateForAllUser(SIpWhiteList *pList) { ipWhiteMgt.pIpWhiteTab = pIpWhiteTab; ipWhiteMgt.ver++; - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); return 0; } #endif @@ -305,29 +305,29 @@ static int32_t ipWhiteMgtUpdateAll(SMnode *pMnode) { #if 0 void ipWhiteMgtUpdate2(SMnode *pMnode) { - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); ipWhiteMgtUpdateAll(pMnode); - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); } #endif int64_t mndGetIpWhiteVer(SMnode *pMnode) { int64_t ver = 0; int32_t code = 0; - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); if (ipWhiteMgt.ver == 0) { // get user and dnode ip white list if ((code = ipWhiteMgtUpdateAll(pMnode)) != 0) { - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); mError("%s failed to update ip white list since %s", __func__, tstrerror(code)); return ver; } ipWhiteMgt.ver = taosGetTimestampMs(); } ver = ipWhiteMgt.ver; - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); if (mndEnableIpWhiteList(pMnode) == 0 || tsEnableWhiteList == false) { ver = 0; @@ -337,10 +337,13 @@ int64_t mndGetIpWhiteVer(SMnode *pMnode) { } int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8_t type, bool *pUpdate) { - int32_t code = 0; int32_t lino = 0; bool update = false; - SIpV4Range range = {.ip = taosGetIpv4FromFqdn(fqdn), .mask = 32}; + SIpV4Range range = {.ip = 0, .mask = 32}; + int32_t code = taosGetIpv4FromFqdn(fqdn, &range.ip); + if (code) { + //TODO + } mDebug("ip-white-list may update for user: %s, fqdn: %s", user, fqdn); SIpWhiteList **ppList = taosHashGet(pIpWhiteTab, user, strlen(user)); SIpWhiteList *pList = NULL; @@ -354,7 +357,7 @@ int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8 if (pNewList == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memcpy(pNewList->pIpRange, &range, sizeof(SIpV4Range)); + (void)memcpy(pNewList->pIpRange, &range, sizeof(SIpV4Range)); pNewList->num = 1; if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *))) != 0) { @@ -369,7 +372,7 @@ int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8 if (pNewList == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memcpy(pNewList->pIpRange, pList->pIpRange, sizeof(SIpV4Range) * (pList->num)); + (void)memcpy(pNewList->pIpRange, pList->pIpRange, sizeof(SIpV4Range) * (pList->num)); pNewList->pIpRange[pList->num].ip = range.ip; pNewList->pIpRange[pList->num].mask = range.mask; @@ -387,7 +390,7 @@ int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8 if (pList != NULL) { if (isRangeInWhiteList(pList, &range)) { if (pList->num == 1) { - taosHashRemove(pIpWhiteTab, user, strlen(user)); + (void)taosHashRemove(pIpWhiteTab, user, strlen(user)); taosMemoryFree(pList); } else { int32_t idx = 0; @@ -430,14 +433,14 @@ _OVER: int32_t mndRefreshUserIpWhiteList(SMnode *pMnode) { int32_t code = 0; - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); if ((code = ipWhiteMgtUpdateAll(pMnode)) != 0) { - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); TAOS_RETURN(code); } ipWhiteMgt.ver = taosGetTimestampMs(); - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); TAOS_RETURN(code); } @@ -448,7 +451,7 @@ int32_t mndUpdateIpWhiteForAllUser(SMnode *pMnode, char *user, char *fqdn, int8_ bool update = false; if (lock) { - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); if (ipWhiteMgt.ver == 0) { TAOS_CHECK_GOTO(ipWhiteMgtUpdateAll(pMnode), &lino, _OVER); ipWhiteMgt.ver = taosGetTimestampMs(); @@ -467,7 +470,7 @@ int32_t mndUpdateIpWhiteForAllUser(SMnode *pMnode, char *user, char *fqdn, int8_ if (keyDup == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memcpy(keyDup, key, klen); + (void)memcpy(keyDup, key, klen); bool upd = false; code = mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, keyDup, fqdn, type, &upd); update |= upd; @@ -482,7 +485,7 @@ int32_t mndUpdateIpWhiteForAllUser(SMnode *pMnode, char *user, char *fqdn, int8_ _OVER: if (update) ipWhiteMgt.ver++; - if (lock) taosThreadRwlockUnlock(&ipWhiteMgt.rw); + if (lock) (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); if (code < 0) { mError("failed to update ip-white-list for user: %s, fqdn: %s at line %d since %s", user, fqdn, lino, tstrerror(code)); @@ -493,13 +496,13 @@ _OVER: static int64_t ipWhiteMgtFillMsg(SUpdateIpWhite *pUpdate) { int64_t ver = 0; - taosThreadRwlockWrlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw); ver = ipWhiteMgt.ver; int32_t num = taosHashGetSize(ipWhiteMgt.pIpWhiteTab); pUpdate->pUserIpWhite = taosMemoryCalloc(1, num * sizeof(SUpdateUserIpWhite)); if (pUpdate->pUserIpWhite == NULL) { - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } @@ -513,14 +516,14 @@ static int64_t ipWhiteMgtFillMsg(SUpdateIpWhite *pUpdate) { char *key = taosHashGetKey(pIter, &klen); if (list->num != 0) { pUser->ver = ver; - memcpy(pUser->user, key, klen); + (void)memcpy(pUser->user, key, klen); pUser->numOfRange = list->num; pUser->pIpRanges = taosMemoryCalloc(1, list->num * sizeof(SIpV4Range)); if (pUser->pIpRanges == NULL) { - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } - memcpy(pUser->pIpRanges, list->pIpRange, list->num * sizeof(SIpV4Range)); + (void)memcpy(pUser->pIpRanges, list->pIpRange, list->num * sizeof(SIpV4Range)); i++; } pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, pIter); @@ -528,7 +531,7 @@ static int64_t ipWhiteMgtFillMsg(SUpdateIpWhite *pUpdate) { pUpdate->numOfUser = i; pUpdate->ver = ver; - taosThreadRwlockUnlock(&ipWhiteMgt.rw); + (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw); TAOS_RETURN(0); } @@ -681,7 +684,7 @@ static void ipRangeToStr(SIpV4Range *range, char *buf) { uv_inet_ntop(AF_INET, &addr, buf, 32); if (range->mask != 32) { - sprintf(buf + strlen(buf), "/%d", range->mask); + (void)sprintf(buf + strlen(buf), "/%d", range->mask); } return; } @@ -1311,7 +1314,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t valuelen = 0; @@ -1320,7 +1323,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (value == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(value, 0, valuelen); + (void)memset(value, 0, valuelen); SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER) TAOS_CHECK_GOTO(taosHashPut(pUser->readTbs, key, keyLen, value, valuelen), &lino, _OVER); @@ -1334,7 +1337,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t valuelen = 0; @@ -1343,7 +1346,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (value == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(value, 0, valuelen); + (void)memset(value, 0, valuelen); SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER) TAOS_CHECK_GOTO(taosHashPut(pUser->writeTbs, key, keyLen, value, valuelen), &lino, _OVER); @@ -1358,7 +1361,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t valuelen = 0; @@ -1367,7 +1370,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (value == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(value, 0, valuelen); + (void)memset(value, 0, valuelen); SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER) TAOS_CHECK_GOTO(taosHashPut(pUser->alterTbs, key, keyLen, value, valuelen), &lino, _OVER); @@ -1381,7 +1384,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t valuelen = 0; @@ -1390,7 +1393,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (value == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(value, 0, valuelen); + (void)memset(value, 0, valuelen); SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER) TAOS_CHECK_GOTO(taosHashPut(pUser->readViews, key, keyLen, value, valuelen), &lino, _OVER); @@ -1404,7 +1407,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t valuelen = 0; @@ -1413,7 +1416,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (value == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(value, 0, valuelen); + (void)memset(value, 0, valuelen); SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER) TAOS_CHECK_GOTO(taosHashPut(pUser->writeViews, key, keyLen, value, valuelen), &lino, _OVER); @@ -1427,7 +1430,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t valuelen = 0; @@ -1436,7 +1439,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (value == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(value, 0, valuelen); + (void)memset(value, 0, valuelen); SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER) TAOS_CHECK_GOTO(taosHashPut(pUser->alterViews, key, keyLen, value, valuelen), &lino, _OVER); @@ -1451,7 +1454,7 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { if (key == NULL) { TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } - memset(key, 0, keyLen); + (void)memset(key, 0, keyLen); SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER); int32_t ref = 0; @@ -1642,7 +1645,7 @@ static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) { pOld->sysInfo = pNew->sysInfo; pOld->enable = pNew->enable; pOld->flag = pNew->flag; - memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN); + (void)memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN); TSWAP(pOld->readDbs, pNew->readDbs); TSWAP(pOld->writeDbs, pNew->writeDbs); TSWAP(pOld->topics, pNew->topics); @@ -1660,7 +1663,7 @@ static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) { taosWUnLockLatch(&pOld->lock); return TSDB_CODE_OUT_OF_MEMORY; } - memcpy(pOld->pIpWhiteList, pNew->pIpWhiteList, sz); + (void)memcpy(pOld->pIpWhiteList, pNew->pIpWhiteList, sz); pOld->ipWhiteListVer = pNew->ipWhiteListVer; taosWUnLockLatch(&pOld->lock); @@ -1851,13 +1854,13 @@ static int32_t mndProcessCreateUserReq(SRpcMsg *pReq) { if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS; char detail[1000] = {0}; - sprintf(detail, "enable:%d, superUser:%d, sysInfo:%d, password:xxx", createReq.enable, createReq.superUser, - createReq.sysInfo); + (void)sprintf(detail, "enable:%d, superUser:%d, sysInfo:%d, password:xxx", createReq.enable, createReq.superUser, + createReq.sysInfo); char operation[15] = {0}; if (createReq.isImport == 1) { - strcpy(operation, "importUser"); + (void)strcpy(operation, "importUser"); } else { - strcpy(operation, "createUser"); + (void)strcpy(operation, "createUser"); } auditRecord(pReq, pMnode->clusterId, operation, "", createReq.user, detail, strlen(detail)); @@ -2034,7 +2037,7 @@ static int32_t mndTablePriviledge(SMnode *pMnode, SHashObj *hash, SHashObj *useD void *pIter = NULL; char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName); + (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName); int32_t len = strlen(tbFName) + 1; if (alterReq->tagCond != NULL && alterReq->tagCondLen != 0) { @@ -2064,7 +2067,7 @@ static int32_t mndRemoveTablePriviledge(SMnode *pMnode, SHashObj *hash, SHashObj SSdb *pSdb) { void *pIter = NULL; char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName); + (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName); int32_t len = strlen(tbFName) + 1; if (taosHashRemove(hash, tbFName, len) != 0) { @@ -2320,7 +2323,7 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) { char pass[TSDB_PASSWORD_LEN + 1] = {0}; taosEncryptPass_c((uint8_t *)alterReq.pass, strlen(alterReq.pass), pass); - memcpy(newUser.pass, pass, TSDB_PASSWORD_LEN); + (void)memcpy(newUser.pass, pass, TSDB_PASSWORD_LEN); if (0 != strncmp(pUser->pass, pass, TSDB_PASSWORD_LEN)) { ++newUser.passVersion; } @@ -2358,12 +2361,12 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } bool exist = false; - memcpy(pNew->pIpRange, pUser->pIpWhiteList->pIpRange, sizeof(SIpV4Range) * idx); + (void)memcpy(pNew->pIpRange, pUser->pIpWhiteList->pIpRange, sizeof(SIpV4Range) * idx); for (int i = 0; i < alterReq.numIpRanges; i++) { SIpV4Range *range = &(alterReq.pIpRanges[i]); if (!isRangeInIpWhiteList(pUser->pIpWhiteList, range)) { // already exist, just ignore; - memcpy(&pNew->pIpRange[idx], range, sizeof(SIpV4Range)); + (void)memcpy(&pNew->pIpRange[idx], range, sizeof(SIpV4Range)); idx++; continue; } else { @@ -2413,7 +2416,7 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { if (localHost) break; if (found == false) { - memcpy(&pNew->pIpRange[idx], oldRange, sizeof(SIpV4Range)); + (void)memcpy(&pNew->pIpRange[idx], oldRange, sizeof(SIpV4Range)); idx++; } else { noexist = false; @@ -2442,9 +2445,9 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) { char detail[1000] = {0}; - sprintf(detail, "alterType:%s, enable:%d, superUser:%d, sysInfo:%d, createdb:%d, tabName:%s, password:xxx", - mndUserAuditTypeStr(alterReq.alterType), alterReq.enable, alterReq.superUser, alterReq.sysInfo, - alterReq.createdb ? 1 : 0, alterReq.tabName); + (void)sprintf(detail, "alterType:%s, enable:%d, superUser:%d, sysInfo:%d, createdb:%d, tabName:%s, password:xxx", + mndUserAuditTypeStr(alterReq.alterType), alterReq.enable, alterReq.superUser, alterReq.sysInfo, + alterReq.createdb ? 1 : 0, alterReq.tabName); auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, detail, strlen(detail)); } else if (alterReq.alterType == TSDB_ALTER_USER_SUPERUSER || alterReq.alterType == TSDB_ALTER_USER_ENABLE || alterReq.alterType == TSDB_ALTER_USER_SYSINFO || alterReq.alterType == TSDB_ALTER_USER_CREATEDB) { @@ -2457,7 +2460,7 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { ALTER_USER_ADD_ALL_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName)) { if (strcmp(alterReq.objname, "1.*") != 0) { SName name = {0}; - tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB); + (void)tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB); auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", name.dbname, alterReq.user, alterReq.sql, alterReq.sqlLen); } else { @@ -2472,7 +2475,7 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } else { if (strcmp(alterReq.objname, "1.*") != 0) { SName name = {0}; - tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB); + (void)tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB); auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", name.dbname, alterReq.user, alterReq.sql, alterReq.sqlLen); } else { @@ -2655,7 +2658,7 @@ static int32_t mndRetrieveUsers(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit); } varDataSetLen(varstr, tlen); - memcpy(varDataVal(varstr), buf, tlen); + (void)memcpy(varDataVal(varstr), buf, tlen); pColInfo = taosArrayGet(pBlock->pDataBlock, cols); COL_DATA_SET_VAL_GOTO((const char *)varstr, false, pUser, _exit); @@ -2740,7 +2743,7 @@ static int32_t mndRetrieveUsersFull(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit); } varDataSetLen(varstr, tlen); - memcpy(varDataVal(varstr), buf, tlen); + (void)memcpy(varDataVal(varstr), buf, tlen); pColInfo = taosArrayGet(pBlock->pDataBlock, cols); COL_DATA_SET_VAL_GOTO((const char *)varstr, false, pUser, _exit); @@ -2831,7 +2834,7 @@ static int32_t mndLoopHash(SHashObj *hash, char *priType, SSDataBlock *pBlock, i nodesDestroyNode(pAst); } else { sqlLen = 5; - sprintf(*sql, "error"); + (void)sprintf(*sql, "error"); } STR_WITH_MAXSIZE_TO_VARSTR((*condition), (*sql), pShow->pMeta->pSchemas[cols].bytes); @@ -2975,8 +2978,8 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock SName name = {0}; char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB); - tNameGetDbName(&name, varDataVal(objName)); + (void)tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB); + (void)tNameGetDbName(&name, varDataVal(objName)); varDataSetLen(objName, strlen(varDataVal(objName))); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, _exit); @@ -3019,8 +3022,8 @@ static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock SName name = {0}; char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0}; - tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB); - tNameGetDbName(&name, varDataVal(objName)); + (void)tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB); + (void)tNameGetDbName(&name, varDataVal(objName)); varDataSetLen(objName, strlen(varDataVal(objName))); pColInfo = taosArrayGet(pBlock->pDataBlock, cols++); COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, _exit); @@ -3140,7 +3143,7 @@ int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_ if (pUser == NULL) { if (TSDB_CODE_MND_USER_NOT_EXIST == code) { SGetUserAuthRsp rsp = {.dropped = 1}; - memcpy(rsp.user, pUsers[i].user, TSDB_USER_LEN); + (void)memcpy(rsp.user, pUsers[i].user, TSDB_USER_LEN); (void)taosArrayPush(batchRsp.pArray, &rsp); } mError("user:%s, failed to auth user since %s", pUsers[i].user, terrstr()); diff --git a/source/dnode/vnode/src/sma/smaEnv.c b/source/dnode/vnode/src/sma/smaEnv.c index b3e072f823..e7a8de17a0 100644 --- a/source/dnode/vnode/src/sma/smaEnv.c +++ b/source/dnode/vnode/src/sma/smaEnv.c @@ -103,7 +103,7 @@ void smaCleanUp() { } if (old == 1) { - taosCloseRef(smaMgmt.rsetId); + (void)taosCloseRef(smaMgmt.rsetId); taosHashCleanup(smaMgmt.refHash); smaMgmt.refHash = NULL; taosTmrCleanUp(smaMgmt.tmrHandle); @@ -174,10 +174,10 @@ static void tRSmaInfoHashFreeNode(void *data) { if ((pRSmaInfo = *(SRSmaInfo **)data)) { if ((pItem = RSMA_INFO_ITEM((SRSmaInfo *)pRSmaInfo, 0)) && pItem->level) { - taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES); + (void)taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES); } if ((pItem = RSMA_INFO_ITEM((SRSmaInfo *)pRSmaInfo, 1)) && pItem->level) { - taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES); + (void)taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES); } tdFreeRSmaInfo(pRSmaInfo->pSma, pRSmaInfo); } @@ -378,16 +378,16 @@ int32_t tdCheckAndInitSmaEnv(SSma *pSma, int8_t smaType) { } // init sma env - tdLockSma(pSma); + (void)tdLockSma(pSma); pEnv = (smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_load_ptr(&SMA_TSMA_ENV(pSma)) : atomic_load_ptr(&SMA_RSMA_ENV(pSma)); if (!pEnv) { if ((code = tdInitSmaEnv(pSma, smaType, &pEnv)) < 0) { - tdUnLockSma(pSma); + (void)tdUnLockSma(pSma); TAOS_RETURN(code); } } - tdUnLockSma(pSma); + (void)tdUnLockSma(pSma); TAOS_RETURN(TSDB_CODE_SUCCESS); } @@ -395,15 +395,15 @@ int32_t tdCheckAndInitSmaEnv(SSma *pSma, int8_t smaType) { void *tdRSmaExecutorFunc(void *param) { setThreadName("vnode-rsma"); - tdRSmaProcessExecImpl((SSma *)param, RSMA_EXEC_OVERFLOW); + (void)tdRSmaProcessExecImpl((SSma *)param, RSMA_EXEC_OVERFLOW); return NULL; } static int32_t tdRsmaStartExecutor(const SSma *pSma) { int32_t code = 0; TdThreadAttr thAttr = {0}; - taosThreadAttrInit(&thAttr); - taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE); + (void)taosThreadAttrInit(&thAttr); + (void)taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE); SSmaEnv *pEnv = SMA_RSMA_ENV(pSma); SSmaStat *pStat = SMA_ENV_STAT(pEnv); @@ -418,7 +418,7 @@ static int32_t tdRsmaStartExecutor(const SSma *pSma) { smaDebug("vgId:%d, success to create pthread for rsma", SMA_VID(pSma)); } - taosThreadAttrDestroy(&thAttr); + (void)taosThreadAttrDestroy(&thAttr); TAOS_RETURN(code); } @@ -444,7 +444,7 @@ static int32_t tdRsmaStopExecutor(const SSma *pSma) { for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) { if (taosCheckPthreadValid(pthread[i])) { smaDebug("vgId:%d, start to join pthread for rsma:%" PRId64 "", SMA_VID(pSma), taosGetPthreadId(pthread[i])); - taosThreadJoin(pthread[i], NULL); + (void)taosThreadJoin(pthread[i], NULL); } } diff --git a/source/dnode/vnode/src/sma/smaOpen.c b/source/dnode/vnode/src/sma/smaOpen.c index 19f0c4a964..41d4c8994f 100644 --- a/source/dnode/vnode/src/sma/smaOpen.c +++ b/source/dnode/vnode/src/sma/smaOpen.c @@ -145,7 +145,7 @@ int32_t smaOpen(SVnode *pVnode, int8_t rollback, bool force) { pVnode->pSma = pSma; pSma->pVnode = pVnode; - taosThreadMutexInit(&pSma->mutex, NULL); + (void)taosThreadMutexInit(&pSma->mutex, NULL); pSma->locked = false; if (VND_IS_RSMA(pVnode)) { @@ -173,8 +173,8 @@ _exit: int32_t smaClose(SSma *pSma) { if (pSma) { - smaPreClose(pSma); - taosThreadMutexDestroy(&pSma->mutex); + (void)smaPreClose(pSma); + (void)taosThreadMutexDestroy(&pSma->mutex); SMA_TSMA_ENV(pSma) = tdFreeSmaEnv(SMA_TSMA_ENV(pSma)); SMA_RSMA_ENV(pSma) = tdFreeSmaEnv(SMA_RSMA_ENV(pSma)); if SMA_RSMA_TSDB0 (pSma) tsdbClose(&SMA_RSMA_TSDB0(pSma)); diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c index 8c12f80f2b..d5409cf268 100644 --- a/source/dnode/vnode/src/sma/smaRollup.c +++ b/source/dnode/vnode/src/sma/smaRollup.c @@ -89,7 +89,7 @@ void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo) { if (pItem->tmrId) { smaDebug("vgId:%d, stop fetch timer %p for table %" PRIi64 " level %d", SMA_VID(pSma), pItem->tmrId, pInfo->suid, i + 1); - taosTmrStopA(&pItem->tmrId); + (void)taosTmrStopA(&pItem->tmrId); } if (pItem->pStreamState) { @@ -246,7 +246,7 @@ static void tdRSmaTaskInit(SStreamMeta *pMeta, SRSmaInfoItem *pItem, SStreamTask } static void tdRSmaTaskRemove(SStreamMeta *pMeta, int64_t streamId, int32_t taskId) { - streamMetaUnregisterTask(pMeta, streamId, taskId); + (void)streamMetaUnregisterTask(pMeta, streamId, taskId); streamMetaWLock(pMeta); int32_t numOfTasks = streamMetaGetNumOfTasks(pMeta); if (streamMetaCommit(pMeta) < 0) { @@ -296,7 +296,7 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat if (!pStreamTask->exec.qmsg) { TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } - sprintf(pStreamTask->exec.qmsg, "%s", RSMA_EXEC_TASK_FLAG); + (void)sprintf(pStreamTask->exec.qmsg, "%s", RSMA_EXEC_TASK_FLAG); pStreamTask->chkInfo.checkpointId = streamMetaGetLatestCheckpointId(pStreamTask->pMeta); tdRSmaTaskInit(pStreamTask->pMeta, pItem, &pStreamTask->id); @@ -347,7 +347,7 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } - taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId); + (void)taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId); smaInfo("vgId:%d, open rsma task:%p table:%" PRIi64 " level:%" PRIi8 ", checkpointId:%" PRIi64 ", submitReqVer:%" PRIi64 ", fetchResultVer:%" PRIi64 ", maxdelay:%" PRIi64 " watermark:%" PRIi64 @@ -799,7 +799,7 @@ static int32_t tdExecuteRSmaImplAsync(SSma *pSma, int64_t version, const void *p *(int32_t *)pItem = len; pItem = POINTER_SHIFT(pItem, sizeof(int32_t)); *(int64_t *)pItem = version; - memcpy(POINTER_SHIFT(pItem, sizeof(int64_t)), pMsg, len); + (void)memcpy(POINTER_SHIFT(pItem, sizeof(int64_t)), pMsg, len); TAOS_CHECK_RETURN(taosWriteQitem(pInfo->queue, qItem)); @@ -810,7 +810,7 @@ static int32_t tdExecuteRSmaImplAsync(SSma *pSma, int64_t version, const void *p int64_t nItems = atomic_fetch_add_64(&pRSmaStat->nBufItems, 1); if (atomic_load_8(&pInfo->assigned) == 0) { - tsem_post(&(pRSmaStat->notEmpty)); + (void)tsem_post(&(pRSmaStat->notEmpty)); } // smoothing consume @@ -1339,7 +1339,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { if (!(pStat = (SRSmaStat *)tdAcquireSmaRef(smaMgmt.rsetId, pRSmaRef->refId))) { smaWarn("rsma fetch task not start since rsma stat already destroyed, rsetId:%d refId:%" PRIi64 ")", smaMgmt.rsetId, pRSmaRef->refId); // pRSmaRef freed in taosHashRemove - taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); + (void)taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); return; } @@ -1348,8 +1348,8 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { if ((code = tdAcquireRSmaInfoBySuid(pSma, pRSmaRef->suid, &pRSmaInfo)) != 0) { smaDebug("rsma fetch task not start since rsma info not exist, rsetId:%d refId:%" PRIi64 ")", smaMgmt.rsetId, pRSmaRef->refId); // pRSmaRef freed in taosHashRemove - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); - taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); + (void)tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); + (void)taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); return; } @@ -1357,8 +1357,8 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { smaDebug("rsma fetch task not start since rsma info already deleted, rsetId:%d refId:%" PRIi64 ")", smaMgmt.rsetId, pRSmaRef->refId); // pRSmaRef freed in taosHashRemove tdReleaseRSmaInfo(pSma, pRSmaInfo); - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); - taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); + (void)tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); + (void)taosHashRemove(smaMgmt.refHash, ¶m, POINTER_BYTES); return; } @@ -1376,7 +1376,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId); } tdReleaseRSmaInfo(pSma, pRSmaInfo); - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); + (void)tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); return; } default: @@ -1393,7 +1393,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { atomic_store_8(&pItem->fetchLevel, 1); if (atomic_load_8(&pRSmaInfo->assigned) == 0) { - tsem_post(&(pStat->notEmpty)); + (void)tsem_post(&(pStat->notEmpty)); } } break; case TASK_TRIGGER_STAT_INACTIVE: { @@ -1414,7 +1414,7 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) { _end: taosTmrReset(tdRSmaFetchTrigger, pItem->maxDelay, pItem, smaMgmt.tmrHandle, &pItem->tmrId); tdReleaseRSmaInfo(pSma, pRSmaInfo); - tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); + (void)tdReleaseSmaRef(smaMgmt.rsetId, pRSmaRef->refId); } static void tdFreeRSmaSubmitItems(SArray *pItems, int32_t type) { @@ -1507,7 +1507,7 @@ static int32_t tdRSmaBatchExec(SSma *pSma, SRSmaInfo *pInfo, STaosQall *qall, SA // the submitReq/deleteReq msg may exsit alternately in the msg queue, consume them sequentially in batch mode while (1) { - taosGetQitem(qall, (void **)&msg); + (void)taosGetQitem(qall, (void **)&msg); if (msg) { int8_t inputType = RSMA_EXEC_MSG_TYPE(msg); if (inputType == STREAM_INPUT__DATA_SUBMIT) { @@ -1574,7 +1574,7 @@ _exit: tdFreeRSmaSubmitItems(pSubmitArr, nSubmit ? STREAM_INPUT__MERGED_SUBMIT : STREAM_INPUT__REF_DATA_BLOCK); while (1) { void *msg = NULL; - taosGetQitem(qall, (void **)&msg); + (void)taosGetQitem(qall, (void **)&msg); if (msg) { taosFreeQitem(msg); } else { @@ -1687,7 +1687,7 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) { break; } - tsem_wait(&pRSmaStat->notEmpty); + (void)tsem_wait(&pRSmaStat->notEmpty); if ((pEnv->flag & SMA_ENV_FLG_CLOSE) && (atomic_load_64(&pRSmaStat->nBufItems) <= 0)) { smaDebug("vgId:%d, exec task end, flag:%" PRIi8 ", nBufItems:%" PRIi64, SMA_VID(pSma), pEnv->flag, diff --git a/source/dnode/vnode/src/sma/smaSnapshot.c b/source/dnode/vnode/src/sma/smaSnapshot.c index cd8a334f4a..0095acf79a 100644 --- a/source/dnode/vnode/src/sma/smaSnapshot.c +++ b/source/dnode/vnode/src/sma/smaSnapshot.c @@ -93,7 +93,7 @@ int32_t rsmaSnapRead(SRSmaSnapReader* pReader, uint8_t** ppData) { _exit: if (code) { smaError("vgId:%d, %s failed at line %d since %s", SMA_VID(pReader->pSma), __func__, lino, tstrerror(code)); - rsmaSnapReaderClose(&pReader); + (void)rsmaSnapReaderClose(&pReader); } else { smaInfo("vgId:%d, vnode snapshot rsma read succeed", SMA_VID(pReader->pSma)); } @@ -106,7 +106,7 @@ int32_t rsmaSnapReaderClose(SRSmaSnapReader** ppReader) { for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) { if (pReader->pDataReader[i]) { - tsdbSnapReaderClose(&pReader->pDataReader[i]); + (void)tsdbSnapReaderClose(&pReader->pDataReader[i]); } } diff --git a/source/dnode/vnode/src/sma/smaTimeRange.c b/source/dnode/vnode/src/sma/smaTimeRange.c index da99a2c9a2..918fd9e5d3 100644 --- a/source/dnode/vnode/src/sma/smaTimeRange.c +++ b/source/dnode/vnode/src/sma/smaTimeRange.c @@ -204,7 +204,10 @@ int32_t smaBlockToSubmit(SVnode *pVnode, const SArray *pBlocks, const STSchema * continue; } - taosArrayPush(pReq->aSubmitTbData, &tbData); + if( taosArrayPush(pReq->aSubmitTbData, &tbData) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + continue; + } int32_t size = (int32_t)taosArrayGetSize(pReq->aSubmitTbData) - 1; TAOS_CHECK_EXIT(taosHashPut(pTableIndexMap, &groupId, sizeof(groupId), &size, sizeof(size))); diff --git a/source/dnode/vnode/src/sma/smaUtil.c b/source/dnode/vnode/src/sma/smaUtil.c index d94e58f954..8b908ed5bb 100644 --- a/source/dnode/vnode/src/sma/smaUtil.c +++ b/source/dnode/vnode/src/sma/smaUtil.c @@ -19,19 +19,19 @@ void tdRSmaQTaskInfoGetFullPath(SVnode *pVnode, tb_uid_t suid, int8_t level, STfs *pTfs, char *outputName) { tdRSmaGetDirName(pVnode, pTfs, true, outputName); int32_t rsmaLen = strlen(outputName); - snprintf(outputName + rsmaLen, TSDB_FILENAME_LEN - rsmaLen, "%" PRIi8 "%s%" PRIi64, level, TD_DIRSEP, suid); + (void)snprintf(outputName + rsmaLen, TSDB_FILENAME_LEN - rsmaLen, "%" PRIi8 "%s%" PRIi64, level, TD_DIRSEP, suid); } void tdRSmaGetDirName(SVnode *pVnode, STfs *pTfs, bool endWithSep, char *outputName) { int32_t offset = 0; // vnode - vnodeGetPrimaryDir(pVnode->path, pVnode->diskPrimary, pTfs, outputName, TSDB_FILENAME_LEN); + (void)vnodeGetPrimaryDir(pVnode->path, pVnode->diskPrimary, pTfs, outputName, TSDB_FILENAME_LEN); offset = strlen(outputName); // rsma - snprintf(outputName + offset, TSDB_FILENAME_LEN - offset - 1, "%s%s%s", TD_DIRSEP, VNODE_RSMA_DIR, - (endWithSep ? TD_DIRSEP : "")); + (void)snprintf(outputName + offset, TSDB_FILENAME_LEN - offset - 1, "%s%s%s", TD_DIRSEP, VNODE_RSMA_DIR, + (endWithSep ? TD_DIRSEP : "")); } // smaXXXUtil ================ diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index e1d7362f0a..7f57a09460 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -2672,7 +2672,7 @@ _return: ctgReleaseVgInfoToCache(pCtg, pDbCache); } if (pTsma) { - tFreeTableTSMAInfo(pTsma); + tFreeAndClearTableTSMAInfo(pTsma); pTsma = NULL; } if (pVgHash) { diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c index 565dcd1739..8e5aba26af 100644 --- a/source/libs/catalog/src/ctgCache.c +++ b/source/libs/catalog/src/ctgCache.c @@ -3546,15 +3546,23 @@ int32_t ctgGetTbMetasFromCache(SCatalog *pCtg, SRequestConnInfo *pConn, SCtgTbMe continue; } + int32_t schemaExtSize = 0; + if (stbMeta->schemaExt != NULL) { + schemaExtSize = stbMeta->tableInfo.numOfColumns * sizeof(SSchemaExt); + } metaSize = CTG_META_SIZE(stbMeta); - pTableMeta = taosMemoryRealloc(pTableMeta, metaSize); + pTableMeta = taosMemoryRealloc(pTableMeta, metaSize + schemaExtSize); if (NULL == pTableMeta) { ctgReleaseTbMetaToCache(pCtg, dbCache, pCache); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - TAOS_MEMCPY(&pTableMeta->sversion, &stbMeta->sversion, metaSize - sizeof(SCTableMeta)); - pTableMeta->schemaExt = NULL; + TAOS_MEMCPY(&pTableMeta->sversion, &stbMeta->sversion, metaSize + schemaExtSize - sizeof(SCTableMeta)); + if (stbMeta->schemaExt != NULL) { + pTableMeta->schemaExt = (SSchemaExt *)((char *)pTableMeta + metaSize); + } else { + pTableMeta->schemaExt = NULL; + } CTG_UNLOCK(CTG_READ, &pCache->metaLock); taosHashRelease(dbCache->tbCache, pCache); diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c index e0040ac0e1..1c95735c14 100644 --- a/source/libs/command/src/explain.c +++ b/source/libs/command/src/explain.c @@ -163,10 +163,10 @@ int32_t qExplainGenerateResChildren(SPhysiNode *pNode, SExplainGroup *group, SNo SNodeList *pPhysiChildren = pNode->pChildren; if (pPhysiChildren) { - *pChildren = nodesMakeList(); + int32_t code = nodesMakeList(pChildren); if (NULL == *pChildren) { qError("nodesMakeList failed"); - QRY_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + QRY_ERR_RET(code); } } diff --git a/source/libs/executor/inc/executorInt.h b/source/libs/executor/inc/executorInt.h index eb36141ef0..0d2692267b 100644 --- a/source/libs/executor/inc/executorInt.h +++ b/source/libs/executor/inc/executorInt.h @@ -364,6 +364,7 @@ typedef struct STagScanFilterContext { SHashObj* colHash; int32_t index; SArray* cInfoList; + int32_t code; } STagScanFilterContext; typedef struct STagScanInfo { diff --git a/source/libs/executor/src/aggregateoperator.c b/source/libs/executor/src/aggregateoperator.c index 905e82e443..f23f01c80f 100644 --- a/source/libs/executor/src/aggregateoperator.c +++ b/source/libs/executor/src/aggregateoperator.c @@ -380,7 +380,7 @@ static int32_t createDataBlockForEmptyInput(SOperatorInfo* pOperator, SSDataBloc for (int32_t k = numOfCols; k < slotId + 1; ++k) { void* tmp = taosArrayPush(pBlock->pDataBlock, &colInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } } else if (pFuncParam->type == FUNC_PARAM_TYPE_VALUE) { diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c index d6ba2f7c26..8a413f34fb 100644 --- a/source/libs/executor/src/cachescanoperator.c +++ b/source/libs/executor/src/cachescanoperator.c @@ -132,20 +132,20 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe } SArray* pCidList = taosArrayInit(numOfCols, sizeof(int16_t)); - QUERY_CHECK_NULL(pCidList, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pCidList, code, lino, _error, terrno); pInfo->pFuncTypeList = taosArrayInit(taosArrayGetSize(pScanNode->pFuncTypes), sizeof(int32_t)); - QUERY_CHECK_NULL(pInfo->pFuncTypeList, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pFuncTypeList, code, lino, _error, terrno); void* tmp = taosArrayAddAll(pInfo->pFuncTypeList, pScanNode->pFuncTypes); if (!tmp && taosArrayGetSize(pScanNode->pFuncTypes) > 0) { - QUERY_CHECK_NULL(tmp, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _error, terrno); } for (int i = 0; i < TARRAY_SIZE(pInfo->matchInfo.pList); ++i) { SColMatchItem* pColInfo = taosArrayGet(pInfo->matchInfo.pList, i); void* tmp = taosArrayPush(pCidList, &pColInfo->colId); - QUERY_CHECK_NULL(tmp, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _error, terrno); if (pInfo->pFuncTypeList != NULL && taosArrayGetSize(pInfo->pFuncTypeList) > i) { pColInfo->funcType = *(int32_t*)taosArrayGet(pInfo->pFuncTypeList, i); } @@ -469,7 +469,7 @@ int32_t removeRedundantTsCol(SLastRowScanPhysiNode* pScanNode, SColMatchInfo* pC size_t size = taosArrayGetSize(pColMatchInfo->pList); SArray* pMatchInfo = taosArrayInit(size, sizeof(SColMatchItem)); - QUERY_CHECK_NULL(pMatchInfo, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pMatchInfo, code, lino, _end, terrno); for (int32_t i = 0; i < size; ++i) { SColMatchItem* pColInfo = taosArrayGet(pColMatchInfo->pList, i); @@ -480,10 +480,10 @@ int32_t removeRedundantTsCol(SLastRowScanPhysiNode* pScanNode, SColMatchInfo* pC SSlotDescNode* pDesc = (SSlotDescNode*)nodesListGetNode(pList, slotId); if (pDesc->dataType.type != TSDB_DATA_TYPE_TIMESTAMP) { void* tmp = taosArrayPush(pMatchInfo, pColInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } else if (FUNCTION_TYPE_CACHE_LAST_ROW == pColInfo->funcType) { void* tmp = taosArrayPush(pMatchInfo, pColInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } diff --git a/source/libs/executor/src/eventwindowoperator.c b/source/libs/executor/src/eventwindowoperator.c index 4b23bc9d6e..f5fda4c276 100644 --- a/source/libs/executor/src/eventwindowoperator.c +++ b/source/libs/executor/src/eventwindowoperator.c @@ -100,7 +100,7 @@ SOperatorInfo* createEventwindowOperatorInfo(SOperatorInfo* downstream, SPhysiNo QUERY_CHECK_CODE(code, lino, _error); SSDataBlock* pResBlock = createDataBlockFromDescNode(pEventWindowNode->window.node.pOutputDataBlockDesc); - QUERY_CHECK_NULL(pResBlock, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pResBlock, code, lino, _error, terrno); code = blockDataEnsureCapacity(pResBlock, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _error); diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c index cce3bf69af..22d5b6097e 100644 --- a/source/libs/executor/src/exchangeoperator.c +++ b/source/libs/executor/src/exchangeoperator.c @@ -547,7 +547,7 @@ int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTas size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources); SFetchRspHandleWrapper* pWrapper = taosMemoryCalloc(1, sizeof(SFetchRspHandleWrapper)); - QUERY_CHECK_NULL(pWrapper, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pWrapper, code, lino, _end, terrno); pWrapper->exchangeId = pExchangeInfo->self; pWrapper->sourceIndex = sourceIndex; @@ -764,12 +764,12 @@ int32_t doExtractResultBlocks(SExchangeInfo* pExchangeInfo, SSourceDataInfo* pDa if (pRetrieveRsp->compressed) { // decompress the data if (pDataInfo->decompBuf == NULL) { pDataInfo->decompBuf = taosMemoryMalloc(pRetrieveRsp->payloadLen); - QUERY_CHECK_NULL(pDataInfo->decompBuf, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pDataInfo->decompBuf, code, lino, _end, terrno); pDataInfo->decompBufSize = pRetrieveRsp->payloadLen; } else { if (pDataInfo->decompBufSize < pRetrieveRsp->payloadLen) { char* p = taosMemoryRealloc(pDataInfo->decompBuf, pRetrieveRsp->payloadLen); - QUERY_CHECK_NULL(p, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(p, code, lino, _end, terrno); if (p != NULL) { pDataInfo->decompBuf = p; pDataInfo->decompBufSize = pRetrieveRsp->payloadLen; @@ -787,7 +787,7 @@ int32_t doExtractResultBlocks(SExchangeInfo* pExchangeInfo, SSourceDataInfo* pDa blockDataCleanup(pb); } else { pb = createOneDataBlock(pExchangeInfo->pDummyBlock, false); - QUERY_CHECK_NULL(pb, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pb, code, lino, _end, terrno); } int32_t compLen = *(int32_t*)pStart; @@ -811,7 +811,7 @@ int32_t doExtractResultBlocks(SExchangeInfo* pExchangeInfo, SSourceDataInfo* pDa } void* tmp = taosArrayPush(pExchangeInfo->pResultBlockList, &pb); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } _end: diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 5db27478fc..7dd1fc1f4e 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -33,8 +33,14 @@ typedef struct tagFilterAssist { SHashObj* colHash; int32_t index; SArray* cInfoList; + int32_t code; } tagFilterAssist; +typedef struct STransTagExprCtx { + int32_t code; + SMetaReader* pReader; +} STransTagExprCtx; + typedef enum { FILTER_NO_LOGIC = 1, FILTER_AND, @@ -300,8 +306,9 @@ int32_t prepareDataBlockBuf(SSDataBlock* pDataBlock, SColMatchInfo* pMatchInfo) } EDealRes doTranslateTagExpr(SNode** pNode, void* pContext) { - SMetaReader* mr = (SMetaReader*)pContext; - bool isTagCol = false, isTbname = false; + STransTagExprCtx* pCtx = pContext; + SMetaReader* mr = pCtx->pReader; + bool isTagCol = false, isTbname = false; if (nodeType(*pNode) == QUERY_NODE_COLUMN) { SColumnNode* pCol = (SColumnNode*)*pNode; if (pCol->colType == COLUMN_TYPE_TBNAME) @@ -315,7 +322,8 @@ EDealRes doTranslateTagExpr(SNode** pNode, void* pContext) { if (isTagCol) { SColumnNode* pSColumnNode = *(SColumnNode**)pNode; - SValueNode* res = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* res = NULL; + pCtx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { return DEAL_RES_ERROR; } @@ -345,7 +353,8 @@ EDealRes doTranslateTagExpr(SNode** pNode, void* pContext) { nodesDestroyNode(*pNode); *pNode = (SNode*)res; } else if (isTbname) { - SValueNode* res = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* res = NULL; + pCtx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { return DEAL_RES_ERROR; } @@ -377,10 +386,20 @@ int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle, return TSDB_CODE_SUCCESS; } - SNode* pTagCondTmp = nodesCloneNode(pTagCond); - - nodesRewriteExprPostOrder(&pTagCondTmp, doTranslateTagExpr, &mr); + SNode* pTagCondTmp = NULL; + code = nodesCloneNode(pTagCond, &pTagCondTmp); + if (TSDB_CODE_SUCCESS != code) { + *pQualified = false; + return code; + } + STransTagExprCtx ctx = {.code = 0, .pReader = &mr}; + nodesRewriteExprPostOrder(&pTagCondTmp, doTranslateTagExpr, &ctx); pAPI->metaReaderFn.clearReader(&mr); + if (TSDB_CODE_SUCCESS != ctx.code) { + *pQualified = false; + terrno = code; + return code; + } SNode* pNew = NULL; code = scalarCalculateConstants(pTagCondTmp, &pNew); @@ -400,13 +419,14 @@ int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle, } static EDealRes getColumn(SNode** pNode, void* pContext) { + tagFilterAssist* pData = (tagFilterAssist*)pContext; SColumnNode* pSColumnNode = NULL; if (QUERY_NODE_COLUMN == nodeType((*pNode))) { pSColumnNode = *(SColumnNode**)pNode; } else if (QUERY_NODE_FUNCTION == nodeType((*pNode))) { SFunctionNode* pFuncNode = *(SFunctionNode**)(pNode); if (pFuncNode->funcType == FUNCTION_TYPE_TBNAME) { - pSColumnNode = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + pData->code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pSColumnNode); if (NULL == pSColumnNode) { return DEAL_RES_ERROR; } @@ -423,7 +443,6 @@ static EDealRes getColumn(SNode** pNode, void* pContext) { return DEAL_RES_CONTINUE; } - tagFilterAssist* pData = (tagFilterAssist*)pContext; void* data = taosHashGet(pData->colHash, &pSColumnNode->colId, sizeof(pSColumnNode->colId)); if (!data) { int32_t tempRes = @@ -521,7 +540,7 @@ static int32_t genTbGroupDigest(const SNode* pGroup, uint8_t* filterDigest, T_MD if (filterDigest[0]) { payload = taosMemoryRealloc(payload, len + tListLen(pContext->digest)); - QUERY_CHECK_NULL(payload, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(payload, code, lino, _end, terrno); memcpy(payload + len, filterDigest + 1, tListLen(pContext->digest)); len += tListLen(pContext->digest); } @@ -571,12 +590,20 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf SNode* pNode = NULL; FOREACH(pNode, group) { nodesRewriteExprPostOrder(&pNode, getColumn, (void*)&ctx); + if (TSDB_CODE_SUCCESS != ctx.code) { + code = ctx.code; + goto end; + } REPLACE_NODE(pNode); } T_MD5_CTX context = {0}; if (tsTagFilterCache) { - SNodeListNode* listNode = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNodeListNode* listNode = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&listNode); + if (TSDB_CODE_SUCCESS != code) { + goto end; + } listNode->pNodeList = group; code = genTbGroupDigest((SNode*)listNode, digest, &context); QUERY_CHECK_CODE(code, lino, end); @@ -597,13 +624,13 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf } pUidTagList = taosArrayInit(8, sizeof(STUidTagInfo)); - QUERY_CHECK_NULL(pUidTagList, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pUidTagList, code, lino, end, terrno); for (int32_t i = 0; i < rows; ++i) { STableKeyInfo* pkeyInfo = taosArrayGet(pTableListInfo->pTableList, i); STUidTagInfo info = {.uid = pkeyInfo->uid}; void* tmp = taosArrayPush(pUidTagList, &info); - QUERY_CHECK_NULL(tmp, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, end, terrno); } code = pAPI->metaFn.getTableTags(pVnode, pTableListInfo->idInfo.suid, pUidTagList); @@ -622,13 +649,13 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf // qDebug("generate tag block rows:%d, cost:%ld us", rows, st1-st); pBlockList = taosArrayInit(2, POINTER_BYTES); - QUERY_CHECK_NULL(pBlockList, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pBlockList, code, lino, end, terrno); void* tmp = taosArrayPush(pBlockList, &pResBlock); - QUERY_CHECK_NULL(tmp, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, end, terrno); groupData = taosArrayInit(2, POINTER_BYTES); - QUERY_CHECK_NULL(groupData, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(groupData, code, lino, end, terrno); FOREACH(pNode, group) { SScalarParam output = {0}; @@ -668,7 +695,7 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf } void* tmp = taosArrayPush(groupData, &output.columnData); - QUERY_CHECK_NULL(tmp, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, end, terrno); } int32_t keyLen = 0; @@ -792,7 +819,7 @@ static SArray* getTableNameList(const SNodeListNode* pList) { SListCell* cell = pList->pNodeList->pHead; SArray* pTbList = taosArrayInit(len, POINTER_BYTES); - QUERY_CHECK_NULL(pTbList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pTbList, code, lino, _end, terrno); for (int i = 0; i < pList->pNodeList->length; i++) { SValueNode* valueNode = (SValueNode*)cell->pNode; @@ -804,7 +831,7 @@ static SArray* getTableNameList(const SNodeListNode* pList) { char* name = varDataVal(valueNode->datum.p); void* tmp = taosArrayPush(pTbList, &name); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); cell = cell->pNext; } @@ -816,7 +843,7 @@ static SArray* getTableNameList(const SNodeListNode* pList) { // remove the duplicates SArray* pNewList = taosArrayInit(taosArrayGetSize(pTbList), sizeof(void*)); void* tmp = taosArrayPush(pNewList, taosArrayGet(pTbList, 0)); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); for (int32_t i = 1; i < numOfTables; ++i) { char** name = taosArrayGetLast(pNewList); @@ -826,7 +853,7 @@ static SArray* getTableNameList(const SNodeListNode* pList) { } tmp = taosArrayPush(pNewList, nameInOldList); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } _end: @@ -1051,7 +1078,7 @@ SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, S QUERY_CHECK_CODE(code, lino, _end); } else if (IS_VAR_DATA_TYPE(pColInfo->info.type)) { char* tmp = taosMemoryMalloc(tagVal.nData + VARSTR_HEADER_SIZE + 1); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); varDataSetLen(tmp, tagVal.nData); memcpy(tmp + VARSTR_HEADER_SIZE, tagVal.pData, tagVal.nData); code = colDataSetVal(pColInfo, i, tmp, false); @@ -1166,12 +1193,16 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN } nodesRewriteExprPostOrder(&pTagCond, getColumn, (void*)&ctx); + if (TSDB_CODE_SUCCESS != ctx.code) { + terrno = code = ctx.code; + goto end; + } SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; // int64_t stt = taosGetTimestampUs(); pUidTagList = taosArrayInit(10, sizeof(STUidTagInfo)); - QUERY_CHECK_NULL(pUidTagList, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pUidTagList, code, lino, end, terrno); code = copyExistedUids(pUidTagList, pUidList); QUERY_CHECK_CODE(code, lino, end); @@ -1189,7 +1220,7 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN for (int32_t i = 0; i < numOfRows; ++i) { STUidTagInfo* pInfo = taosArrayGet(pUidTagList, i); void* tmp = taosArrayPush(pUidList, &pInfo->uid); - QUERY_CHECK_NULL(tmp, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, end, terrno); } terrno = 0; } else { @@ -1219,10 +1250,10 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN // int64_t st1 = taosGetTimestampUs(); // qDebug("generate tag block rows:%d, cost:%ld us", rows, st1-st); pBlockList = taosArrayInit(2, POINTER_BYTES); - QUERY_CHECK_NULL(pBlockList, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pBlockList, code, lino, end, terrno); void* tmp = taosArrayPush(pBlockList, &pResBlock); - QUERY_CHECK_NULL(tmp, code, lino, end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, end, terrno); code = createResultData(&type, numOfTables, &output); if (code != TSDB_CODE_SUCCESS) { @@ -1270,14 +1301,14 @@ int32_t getTableList(void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, S pListInfo->idInfo.tableType = pScanNode->tableType; SArray* pUidList = taosArrayInit(8, sizeof(uint64_t)); - QUERY_CHECK_NULL(pUidList, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pUidList, code, lino, _error, terrno); SIdxFltStatus status = SFLT_NOT_INDEX; if (pScanNode->tableType != TSDB_SUPER_TABLE) { pListInfo->idInfo.uid = pScanNode->uid; if (pStorageAPI->metaFn.isTableExisted(pVnode, pScanNode->uid)) { void* tmp = taosArrayPush(pUidList, &pScanNode->uid); - QUERY_CHECK_NULL(tmp, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _error, terrno); } code = doFilterByTagCond(pListInfo, pUidList, pTagCond, pVnode, status, pStorageAPI, false, &listAdded); QUERY_CHECK_CODE(code, lino, _end); @@ -1334,7 +1365,7 @@ int32_t getTableList(void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, S if (tsTagFilterCache) { size_t size = numOfTables * sizeof(uint64_t) + sizeof(int32_t); char* pPayload = taosMemoryMalloc(size); - QUERY_CHECK_NULL(pPayload, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pPayload, code, lino, _end, terrno); *(int32_t*)pPayload = numOfTables; if (numOfTables > 0) { @@ -1414,9 +1445,20 @@ int32_t getGroupIdFromTagsVal(void* pVnode, uint64_t uid, SNodeList* pGroupNode, return TSDB_CODE_PAR_TABLE_NOT_EXIST; } - SNodeList* groupNew = nodesCloneList(pGroupNode); + SNodeList* groupNew = NULL; + int32_t code = nodesCloneList(pGroupNode, &groupNew); + if (TSDB_CODE_SUCCESS != code) { + pAPI->metaReaderFn.clearReader(&mr); + return code; + } - nodesRewriteExprsPostOrder(groupNew, doTranslateTagExpr, &mr); + STransTagExprCtx ctx = {.code = 0, .pReader = &mr}; + nodesRewriteExprsPostOrder(groupNew, doTranslateTagExpr, &ctx); + if (TSDB_CODE_SUCCESS != ctx.code) { + nodesDestroyList(groupNew); + pAPI->metaReaderFn.clearReader(&mr); + return code; + } char* isNull = (char*)keyBuf; char* pStart = (char*)keyBuf + sizeof(int8_t) * LIST_LENGTH(pGroupNode); @@ -1531,7 +1573,7 @@ int32_t extractColMatchInfo(SNodeList* pNodeList, SDataBlockDescNode* pOutputNod c.isPk = pColNode->isPk; c.dataType = pColNode->node.resType; void* tmp = taosArrayPush(pList, &c); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } @@ -1608,7 +1650,7 @@ int32_t createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; pExp->pExpr = taosMemoryCalloc(1, sizeof(tExprNode)); - QUERY_CHECK_NULL(pExp->pExpr, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pExp->pExpr, code, lino, _end, terrno); pExp->pExpr->_function.num = 1; pExp->pExpr->_function.functionId = -1; @@ -1620,7 +1662,7 @@ int32_t createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) { SColumnNode* pColNode = (SColumnNode*)pNode; pExp->base.pParam = taosMemoryCalloc(1, sizeof(SFunctParam)); - QUERY_CHECK_NULL(pExp->base.pParam, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pExp->base.pParam, code, lino, _end, terrno); pExp->base.numOfParams = 1; @@ -1635,7 +1677,7 @@ int32_t createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) { SValueNode* pValNode = (SValueNode*)pNode; pExp->base.pParam = taosMemoryCalloc(1, sizeof(SFunctParam)); - QUERY_CHECK_NULL(pExp->base.pParam, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pExp->base.pParam, code, lino, _end, terrno); pExp->base.numOfParams = 1; @@ -1667,9 +1709,13 @@ int32_t createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) { if (!pFuncNode->pParameterList && (memcmp(pExprNode->_function.functionName, name, len) == 0) && pExprNode->_function.functionName[len] == 0) { - pFuncNode->pParameterList = nodesMakeList(); - SValueNode* res = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (NULL == res) { // todo handle error + pFuncNode->pParameterList = NULL; + int32_t code = nodesMakeList(&pFuncNode->pParameterList); + SValueNode* res = NULL; + if (TSDB_CODE_SUCCESS == code) { + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); + } + if (TSDB_CODE_SUCCESS != code) { // todo handle error } else { res->node.resType = (SDataType){.bytes = sizeof(int64_t), .type = TSDB_DATA_TYPE_BIGINT}; code = nodesListAppend(pFuncNode->pParameterList, (SNode*)res); @@ -1898,9 +1944,9 @@ SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput, pCtx->input.numOfInputCols = pFunct->numOfParams; pCtx->input.pData = taosMemoryCalloc(pFunct->numOfParams, POINTER_BYTES); - QUERY_CHECK_NULL(pCtx->input.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pCtx->input.pData, code, lino, _end, terrno); pCtx->input.pColumnDataAgg = taosMemoryCalloc(pFunct->numOfParams, POINTER_BYTES); - QUERY_CHECK_NULL(pCtx->input.pColumnDataAgg, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pCtx->input.pColumnDataAgg, code, lino, _end, terrno); pCtx->pTsOutput = NULL; pCtx->resDataInfo.bytes = pFunct->resSchema.bytes; @@ -2238,12 +2284,12 @@ int32_t tableListAddTableInfo(STableListInfo* pTableList, uint64_t uid, uint64_t int32_t lino = 0; if (pTableList->map == NULL) { pTableList->map = taosHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK); - QUERY_CHECK_NULL(pTableList->map, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pTableList->map, code, lino, _end, terrno); } STableKeyInfo keyInfo = {.uid = uid, .groupId = gid}; void* tmp = taosArrayPush(pTableList->pTableList, &keyInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); int32_t slot = (int32_t)taosArrayGetSize(pTableList->pTableList) - 1; code = taosHashPut(pTableList->map, &uid, sizeof(uid), &slot, sizeof(slot)); diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index d5757d2fc3..a801e3cc99 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -63,31 +63,31 @@ static int32_t doSetSMABlock(SOperatorInfo* pOperator, void* input, size_t numOf for (int32_t i = 0; i < numOfBlocks; i++) { SPackedData* pReq = POINTER_SHIFT(input, i * sizeof(SPackedData)); void* tmp = taosArrayPush(pInfo->pBlockLists, pReq); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; } else if (type == STREAM_INPUT__DATA_SUBMIT) { void* tmp = taosArrayPush(pInfo->pBlockLists, &input); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; } else if (type == STREAM_INPUT__DATA_BLOCK) { for (int32_t i = 0; i < numOfBlocks; ++i) { SSDataBlock* pDataBlock = &((SSDataBlock*)input)[i]; SPackedData tmp = {.pDataBlock = pDataBlock}; void* tmpItem = taosArrayPush(pInfo->pBlockLists, &tmp); - QUERY_CHECK_NULL(tmpItem, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmpItem, code, lino, _end, terrno); } pInfo->blockType = STREAM_INPUT__DATA_BLOCK; } else if (type == STREAM_INPUT__CHECKPOINT) { SPackedData tmp = {.pDataBlock = input}; void* tmpItem = taosArrayPush(pInfo->pBlockLists, &tmp); - QUERY_CHECK_NULL(tmpItem, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmpItem, code, lino, _end, terrno); pInfo->blockType = STREAM_INPUT__CHECKPOINT; } else if (type == STREAM_INPUT__REF_DATA_BLOCK) { for (int32_t i = 0; i < numOfBlocks; ++i) { SPackedData* pReq = POINTER_SHIFT(input, i * sizeof(SPackedData)); void* tmp = taosArrayPush(pInfo->pBlockLists, pReq); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } pInfo->blockType = STREAM_INPUT__DATA_BLOCK; } @@ -164,13 +164,13 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu for (int32_t i = 0; i < numOfBlocks; i++) { SPackedData* pReq = POINTER_SHIFT(input, i * sizeof(SPackedData)); void* tmp = taosArrayPush(pInfo->pBlockLists, pReq); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; } else if (type == STREAM_INPUT__DATA_SUBMIT) { void* tmp = taosArrayPush(pInfo->pBlockLists, input); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; } else if (type == STREAM_INPUT__DATA_BLOCK) { @@ -178,14 +178,14 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu SSDataBlock* pDataBlock = &((SSDataBlock*)input)[i]; SPackedData tmp = {.pDataBlock = pDataBlock}; void* tmpItem = taosArrayPush(pInfo->pBlockLists, &tmp); - QUERY_CHECK_NULL(tmpItem, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmpItem, code, lino, _end, terrno); } pInfo->blockType = STREAM_INPUT__DATA_BLOCK; } else if (type == STREAM_INPUT__CHECKPOINT_TRIGGER) { SPackedData tmp = {.pDataBlock = input}; void* tmpItem = taosArrayPush(pInfo->pBlockLists, &tmp); - QUERY_CHECK_NULL(tmpItem, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmpItem, code, lino, _end, terrno); pInfo->blockType = STREAM_INPUT__CHECKPOINT; } else { @@ -435,7 +435,7 @@ static int32_t filterUnqualifiedTables(const SStreamScanInfo* pScanInfo, const S // handle multiple partition void* tmp = taosArrayPush(qa, id); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } pAPI->metaReaderFn.clearReader(&mr); @@ -698,7 +698,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo if (blockIndex >= taosArrayGetSize(pTaskInfo->pResultBlockList)) { SSDataBlock* p1 = createOneDataBlock(pRes, true); void* tmp = taosArrayPush(pTaskInfo->pResultBlockList, &p1); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); p = p1; } else { p = *(SSDataBlock**)taosArrayGet(pTaskInfo->pResultBlockList, blockIndex); @@ -711,7 +711,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo current += p->info.rows; ASSERT(p->info.rows > 0 || p->info.type == STREAM_CHECKPOINT); void* tmp = taosArrayPush(pResList, &p); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); if (current >= rowsThreshold) { break; @@ -1464,13 +1464,13 @@ SArray* qGetQueriedTableListInfo(qTaskInfo_t tinfo) { STableListInfo* pTableListInfo = taosArrayGetP(plist, 0); SArray* pUidList = taosArrayInit(10, sizeof(uint64_t)); - QUERY_CHECK_NULL(pUidList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pUidList, code, lino, _end, terrno); int32_t numOfTables = tableListGetSize(pTableListInfo); for (int32_t i = 0; i < numOfTables; ++i) { STableKeyInfo* pKeyInfo = tableListGetInfo(pTableListInfo, i); void* tmp = taosArrayPush(pUidList, &pKeyInfo->uid); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } taosArrayDestroy(plist); @@ -1492,11 +1492,11 @@ static void extractTableList(SArray* pList, const SOperatorInfo* pOperator) { SStreamScanInfo* pScanInfo = pOperator->info; STableScanInfo* pTableScanInfo = pScanInfo->pTableScanOp->info; void* tmp = taosArrayPush(pList, &pTableScanInfo->base.pTableListInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) { STableScanInfo* pScanInfo = pOperator->info; void* tmp = taosArrayPush(pList, &pScanInfo->base.pTableListInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } else { if (pOperator->pDownstream != NULL && pOperator->pDownstream[0] != NULL) { extractTableList(pList, pOperator->pDownstream[0]); diff --git a/source/libs/executor/src/executorInt.c b/source/libs/executor/src/executorInt.c index 6d669b75e6..d980244360 100644 --- a/source/libs/executor/src/executorInt.c +++ b/source/libs/executor/src/executorInt.c @@ -267,7 +267,7 @@ static int32_t doCreateConstantValColumnInfo(SInputColumnInfoData* pInput, SFunc SColumnInfoData* pColInfo = NULL; if (pInput->pData[paramIndex] == NULL) { pColInfo = taosMemoryCalloc(1, sizeof(SColumnInfoData)); - QUERY_CHECK_NULL(pColInfo, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno); // Set the correct column info (data type and bytes) pColInfo->info.type = pFuncParam->param.nType; diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index eb48144967..bd503d4638 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -753,13 +753,13 @@ static void doHashPartition(SOperatorInfo* pOperator, SSDataBlock* pBlock) { } if (pGroupInfo->blockForNotLoaded == NULL) { pGroupInfo->blockForNotLoaded = taosArrayInit(0, sizeof(SSDataBlock*)); - QUERY_CHECK_NULL(pGroupInfo->blockForNotLoaded, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pGroupInfo->blockForNotLoaded, code, lino, _end, terrno); pGroupInfo->offsetForNotLoaded = 0; } dataNotLoadBlock->info.id.groupId = pGroupInfo->groupId; dataNotLoadBlock->info.dataLoad = 0; void* tmp = taosArrayPush(pGroupInfo->blockForNotLoaded, &dataNotLoadBlock); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); break; } } @@ -780,7 +780,7 @@ void* getCurrentDataGroupInfo(const SPartitionOperatorInfo* pInfo, SDataGroupInf if (p == NULL) { // it is a new group SDataGroupInfo gi = {0}; gi.pPageList = taosArrayInit(100, sizeof(int32_t)); - QUERY_CHECK_NULL(gi.pPageList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(gi.pPageList, code, lino, _end, terrno); code = taosHashPut(pInfo->pGroupSet, pInfo->keyBuf, len, &gi, sizeof(SDataGroupInfo)); if (code == TSDB_CODE_DUP_KEY) { @@ -797,7 +797,7 @@ void* getCurrentDataGroupInfo(const SPartitionOperatorInfo* pInfo, SDataGroupInf } void* tmp = taosArrayPush(p->pPageList, &pageId); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); *(int32_t*)pPage = 0; } else { @@ -822,7 +822,7 @@ void* getCurrentDataGroupInfo(const SPartitionOperatorInfo* pInfo, SDataGroupInf } void* tmp = taosArrayPush(p->pPageList, &pageId); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); memset(pPage, 0, getBufPageSize(pInfo->pBuf)); } @@ -1030,13 +1030,13 @@ static int32_t hashPartitionNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) } SArray* groupArray = taosArrayInit(taosHashGetSize(pInfo->pGroupSet), sizeof(SDataGroupInfo)); - QUERY_CHECK_NULL(groupArray, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(groupArray, code, lino, _end, terrno); void* pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL); while (pGroupIter != NULL) { SDataGroupInfo* pGroupInfo = pGroupIter; void* tmp = taosArrayPush(groupArray, pGroupInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); pGroupIter = taosHashIterate(pInfo->pGroupSet, pGroupIter); } @@ -1129,7 +1129,7 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartition goto _error; } void* tmp = taosArrayPush(pInfo->pOrderInfoArr, &order); - QUERY_CHECK_NULL(tmp, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _error, terrno); } if (pPartNode->pExprs != NULL) { @@ -1409,13 +1409,13 @@ static void doStreamHashPartitionImpl(SStreamPartitionOperatorInfo* pInfo, SSDat (SPartitionDataInfo*)taosHashGet(pInfo->pPartitions, pInfo->partitionSup.keyBuf, keyLen); if (pParData) { void* tmp = taosArrayPush(pParData->rowIds, &i); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } else { SPartitionDataInfo newParData = {0}; newParData.groupId = calcGroupId(pInfo->partitionSup.keyBuf, keyLen); newParData.rowIds = taosArrayInit(64, sizeof(int32_t)); void* tmp = taosArrayPush(newParData.rowIds, &i); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); code = taosHashPut(pInfo->pPartitions, pInfo->partitionSup.keyBuf, keyLen, &newParData, sizeof(SPartitionDataInfo)); @@ -1594,7 +1594,7 @@ SSDataBlock* buildCreateTableBlock(SExprSupp* tbName, SExprSupp* tag) { pBlock->info.rowSize += infoData.info.bytes; // sub table name void* tmp = taosArrayPush(pBlock->pDataBlock, &infoData); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); SColumnInfoData gpIdData = {0}; gpIdData.info.type = TSDB_DATA_TYPE_UBIGINT; @@ -1602,7 +1602,7 @@ SSDataBlock* buildCreateTableBlock(SExprSupp* tbName, SExprSupp* tag) { pBlock->info.rowSize += gpIdData.info.bytes; // group id tmp = taosArrayPush(pBlock->pDataBlock, &gpIdData); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); for (int32_t i = 0; i < tag->numOfExprs; i++) { SColumnInfoData tagCol = {0}; @@ -1611,7 +1611,7 @@ SSDataBlock* buildCreateTableBlock(SExprSupp* tbName, SExprSupp* tag) { tagCol.info.precision = tag->pExprInfo[i].base.resSchema.precision; // tag info tmp = taosArrayPush(pBlock->pDataBlock, &tagCol); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); pBlock->info.rowSize += tagCol.info.bytes; } @@ -1652,7 +1652,7 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr pInfo->tbnameCalSup.numOfExprs = 0; if (pPartNode->pSubtable != NULL) { SExprInfo* pSubTableExpr = taosMemoryCalloc(1, sizeof(SExprInfo)); - QUERY_CHECK_NULL(pSubTableExpr, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pSubTableExpr, code, lino, _error, terrno); pInfo->tbnameCalSup.pExprInfo = pSubTableExpr; code = createExprFromOneNode(pSubTableExpr, pPartNode->pSubtable, 0); @@ -1666,7 +1666,7 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr if (pPartNode->pTags != NULL) { int32_t numOfTags; SExprInfo* pTagExpr = createExpr(pPartNode->pTags, &numOfTags); - QUERY_CHECK_NULL(pTagExpr, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pTagExpr, code, lino, _error, terrno); code = initExprSupp(&pInfo->tagCalSup, pTagExpr, numOfTags, &pTaskInfo->storageAPI.functionStore); QUERY_CHECK_CODE(code, lino, _error); @@ -1674,7 +1674,7 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr if (pInfo->tbnameCalSup.numOfExprs != 0 || pInfo->tagCalSup.numOfExprs != 0) { pInfo->pCreateTbRes = buildCreateTableBlock(&pInfo->tbnameCalSup, &pInfo->tagCalSup); - QUERY_CHECK_NULL(pInfo->pCreateTbRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pCreateTbRes, code, lino, _error, terrno); } else { pInfo->pCreateTbRes = NULL; } @@ -1687,7 +1687,7 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr pInfo->partitionSup.needCalc = true; pInfo->binfo.pRes = createDataBlockFromDescNode(pPartNode->part.node.pOutputDataBlockDesc); - QUERY_CHECK_NULL(pInfo->binfo.pRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->binfo.pRes, code, lino, _error, terrno); code = blockDataEnsureCapacity(pInfo->binfo.pRes, 4096); QUERY_CHECK_CODE(code, lino, _error); @@ -1701,7 +1701,7 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr taosHashSetFreeFp(pInfo->pPartitions, freePartItem); pInfo->tsColIndex = 0; pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT); - QUERY_CHECK_NULL(pInfo->pDelRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pDelRes, code, lino, _error, terrno); int32_t numOfCols = 0; SExprInfo* pExprInfo = createExprInfo(pPartNode->part.pTargets, NULL, &numOfCols); @@ -1750,7 +1750,7 @@ int32_t extractColumnInfo(SNodeList* pNodeList, SArray** pArrayRes) { SColumn c = extractColumnFromColumnNode(pColNode); void* tmp = taosArrayPush(pList, &c); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } else if (nodeType(pNode->pExpr) == QUERY_NODE_VALUE) { SValueNode* pValNode = (SValueNode*)pNode->pExpr; SColumn c = {0}; @@ -1762,7 +1762,7 @@ int32_t extractColumnInfo(SNodeList* pNodeList, SArray** pArrayRes) { c.precision = pValNode->node.resType.precision; void* tmp = taosArrayPush(pList, &c); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 8cb4bfeb2f..e1db1efb59 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -382,7 +382,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca } } - // free the sma info, since it should not be involved in later computing process. + // free the sma info, since it should not be involved in *later computing process. taosMemoryFreeClear(pBlock->pBlockAgg); // try to filter data block according to current results @@ -1725,7 +1725,7 @@ static int32_t doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32_t ts if (pInfo->partitionSup.needCalc) { SSDataBlock* tmpBlock = createOneDataBlock(pResult, true); - QUERY_CHECK_NULL(tmpBlock, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmpBlock, code, lino, _end, terrno); blockDataCleanup(pResult); for (int32_t i = 0; i < tmpBlock->info.rows; i++) { @@ -2549,7 +2549,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock pBlockInfo->id.groupId = tableListGetTableGroupId(pTableScanInfo->base.pTableListInfo, pBlock->info.id.uid); SArray* pColList = taosArrayInit(4, sizeof(int32_t)); - QUERY_CHECK_NULL(pColList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pColList, code, lino, _end, terrno); // todo extract method for (int32_t i = 0; i < taosArrayGetSize(pInfo->matchInfo.pList); ++i) { @@ -2568,7 +2568,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock colExists = true; void* tmp = taosArrayPush(pColList, &pColMatchInfo->dstSlotId); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); break; } } @@ -2578,7 +2578,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock SColumnInfoData* pDst = taosArrayGet(pInfo->pRes->pDataBlock, pColMatchInfo->dstSlotId); colDataSetNNULL(pDst, 0, pBlockInfo->rows); void* tmp = taosArrayPush(pColList, &pColMatchInfo->dstSlotId); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } @@ -2597,7 +2597,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock for (int32_t i = 0; i < pInfo->numOfPseudoExpr; ++i) { void* tmp = taosArrayPush(pColList, &pInfo->pPseudoExpr[i].base.resSchema.slotId); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } @@ -3405,7 +3405,7 @@ static int32_t extractTableIdList(const STableListInfo* pTableListInfo, SArray** for (int32_t i = 0; i < size; ++i) { STableKeyInfo* pkeyInfo = tableListGetInfo(pTableListInfo, i); void* tmp = taosArrayPush(tableIdList, &pkeyInfo->uid); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } (*ppArrayRes) = tableIdList; @@ -3500,10 +3500,10 @@ static int32_t doRawScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { tmpMetaRsp.metaRsp = data; if (!pTaskInfo->streamInfo.btMetaRsp.batchMetaReq) { pTaskInfo->streamInfo.btMetaRsp.batchMetaReq = taosArrayInit(4, POINTER_BYTES); - QUERY_CHECK_NULL(pTaskInfo->streamInfo.btMetaRsp.batchMetaReq, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pTaskInfo->streamInfo.btMetaRsp.batchMetaReq, code, lino, _end, terrno); pTaskInfo->streamInfo.btMetaRsp.batchMetaLen = taosArrayInit(4, sizeof(int32_t)); - QUERY_CHECK_NULL(pTaskInfo->streamInfo.btMetaRsp.batchMetaLen, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pTaskInfo->streamInfo.btMetaRsp.batchMetaLen, code, lino, _end, terrno); } int32_t tempRes = TSDB_CODE_SUCCESS; uint32_t len = 0; @@ -3516,7 +3516,7 @@ static int32_t doRawScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t tLen = sizeof(SMqRspHead) + len; void* tBuf = taosMemoryCalloc(1, tLen); - QUERY_CHECK_NULL(tBuf, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tBuf, code, lino, _end, terrno); void* metaBuff = POINTER_SHIFT(tBuf, sizeof(SMqRspHead)); SEncoder encoder = {0}; @@ -3531,10 +3531,10 @@ static int32_t doRawScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { } taosMemoryFreeClear(data); void* tmp = taosArrayPush(pTaskInfo->streamInfo.btMetaRsp.batchMetaReq, &tBuf); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); tmp = taosArrayPush(pTaskInfo->streamInfo.btMetaRsp.batchMetaLen, &tLen); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } (*ppRes) = NULL; @@ -3741,7 +3741,7 @@ int32_t addPrimaryKeyCol(SSDataBlock* pBlock, uint8_t type, int32_t bytes) { infoData.info.type = type; infoData.info.bytes = bytes; void* tmp = taosArrayPush(pBlock->pDataBlock, &infoData); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); _end: if (code != TSDB_CODE_SUCCESS) { @@ -3788,7 +3788,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys int16_t colId = id->colId; void* tmp = taosArrayPush(pColIds, &colId); - QUERY_CHECK_NULL(tmp, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _error, terrno); if (id->colId == PRIMARYKEY_TIMESTAMP_COL_ID) { pInfo->primaryTsIndex = id->dstSlotId; @@ -3880,7 +3880,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys pInfo->readHandle = *pHandle; pTaskInfo->streamInfo.snapshotVer = pHandle->version; pInfo->pCreateTbRes = buildCreateTableBlock(&pInfo->tbnameCalSup, &pInfo->tagCalSup); - QUERY_CHECK_NULL(pInfo->pCreateTbRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pCreateTbRes, code, lino, _error, terrno); code = blockDataEnsureCapacity(pInfo->pCreateTbRes, 8); QUERY_CHECK_CODE(code, lino, _error); @@ -4073,15 +4073,17 @@ static int32_t tagScanCreateResultData(SDataType* pType, int32_t numOfRows, SSca } static EDealRes tagScanRewriteTagColumn(SNode** pNode, void* pContext) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + STagScanFilterContext* pCtx = (STagScanFilterContext*)pContext; SColumnNode* pSColumnNode = NULL; if (QUERY_NODE_COLUMN == nodeType((*pNode))) { pSColumnNode = *(SColumnNode**)pNode; } else if (QUERY_NODE_FUNCTION == nodeType((*pNode))) { SFunctionNode* pFuncNode = *(SFunctionNode**)(pNode); if (pFuncNode->funcType == FUNCTION_TYPE_TBNAME) { - pSColumnNode = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + pSColumnNode = NULL; + pCtx->code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pSColumnNode); if (NULL == pSColumnNode) { return DEAL_RES_ERROR; } @@ -4098,8 +4100,7 @@ static EDealRes tagScanRewriteTagColumn(SNode** pNode, void* pContext) { return DEAL_RES_CONTINUE; } - STagScanFilterContext* pCtx = (STagScanFilterContext*)pContext; - void* data = taosHashGet(pCtx->colHash, &pSColumnNode->colId, sizeof(pSColumnNode->colId)); + void* data = taosHashGet(pCtx->colHash, &pSColumnNode->colId, sizeof(pSColumnNode->colId)); if (!data) { code = taosHashPut(pCtx->colHash, &pSColumnNode->colId, sizeof(pSColumnNode->colId), pNode, sizeof((*pNode))); if (code == TSDB_CODE_DUP_KEY) { @@ -4111,7 +4112,7 @@ static EDealRes tagScanRewriteTagColumn(SNode** pNode, void* pContext) { .type = pSColumnNode->node.resType.type, .bytes = pSColumnNode->node.resType.bytes}; void* tmp = taosArrayPush(pCtx->cInfoList, &cInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } else { SColumnNode* col = *(SColumnNode**)data; pSColumnNode->slotId = col->slotId; @@ -4132,13 +4133,13 @@ static int32_t tagScanFilterByTagCond(SArray* aUidTags, SNode* pTagCond, SArray* int32_t numOfTables = taosArrayGetSize(aUidTags); SSDataBlock* pResBlock = createTagValBlockForFilter(pInfo->filterCtx.cInfoList, numOfTables, aUidTags, pVnode, pAPI); - QUERY_CHECK_NULL(pResBlock, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pResBlock, code, lino, _end, terrno); SArray* pBlockList = taosArrayInit(1, POINTER_BYTES); - QUERY_CHECK_NULL(pBlockList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pBlockList, code, lino, _end, terrno); void* tmp = taosArrayPush(pBlockList, &pResBlock); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; @@ -4153,7 +4154,7 @@ static int32_t tagScanFilterByTagCond(SArray* aUidTags, SNode* pTagCond, SArray* for (int32_t i = 0; i < numOfTables; ++i) { if (result[i]) { void* tmp = taosArrayPush(aFilterIdxs, &i); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } @@ -4203,7 +4204,7 @@ static int32_t tagScanFillOneCellWithTag(SOperatorInfo* pOperator, const STUidTa QUERY_CHECK_CODE(code, lino, _end); } else if (IS_VAR_DATA_TYPE(pColInfo->info.type)) { char* tmp = taosMemoryMalloc(tagVal.nData + VARSTR_HEADER_SIZE + 1); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); varDataSetLen(tmp, tagVal.nData); memcpy(tmp + VARSTR_HEADER_SIZE, tagVal.pData, tagVal.nData); @@ -4274,7 +4275,7 @@ static int32_t doTagScanFromCtbIdxNext(SOperatorInfo* pOperator, SSDataBlock** p if (pInfo->pCtbCursor == NULL) { pInfo->pCtbCursor = pAPI->metaFn.openCtbCursor(pInfo->readHandle.vnode, pInfo->suid, 1); - QUERY_CHECK_NULL(pInfo->pCtbCursor, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pCtbCursor, code, lino, _end, terrno); } else { code = pAPI->metaFn.resumeCtbCursor(pInfo->pCtbCursor, 0); QUERY_CHECK_CODE(code, lino, _end); @@ -4300,7 +4301,7 @@ static int32_t doTagScanFromCtbIdxNext(SOperatorInfo* pOperator, SSDataBlock** p info.pTagVal = taosMemoryMalloc(pCur->vLen); memcpy(info.pTagVal, pCur->pVal, pCur->vLen); void* tmp = taosArrayPush(aUidTags, &info); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); ++numTables; } @@ -4463,7 +4464,7 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi pInfo->pTableListInfo = pTableListInfo; pInfo->pRes = createDataBlockFromDescNode(pDescNode); - QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno); pInfo->readHandle = *pReadHandle; pInfo->curPos = 0; @@ -4477,22 +4478,23 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi if (pTagScanNode->onlyMetaCtbIdx) { pInfo->aUidTags = taosArrayInit(pOperator->resultInfo.capacity, sizeof(STUidTagInfo)); - QUERY_CHECK_NULL(pInfo->aUidTags, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->aUidTags, code, lino, _error, terrno); pInfo->aFilterIdxs = taosArrayInit(pOperator->resultInfo.capacity, sizeof(int32_t)); - QUERY_CHECK_NULL(pInfo->aFilterIdxs, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->aFilterIdxs, code, lino, _error, terrno); pInfo->filterCtx.colHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK); - QUERY_CHECK_NULL(pInfo->filterCtx.colHash, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->filterCtx.colHash, code, lino, _error, terrno); pInfo->filterCtx.cInfoList = taosArrayInit(4, sizeof(SColumnInfo)); - QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno); if (pInfo->pTagCond != NULL) { nodesRewriteExprPostOrder(&pTagCond, tagScanRewriteTagColumn, (void*)&pInfo->filterCtx); } } + //TODO wjm check pInfo->filterCtx.code __optr_fn_t tagScanNextFn = (pTagScanNode->onlyMetaCtbIdx) ? doTagScanFromCtbIdx : doTagScanFromMetaEntry; pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, tagScanNextFn, NULL, destroyTagScanOperatorInfo, optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL); @@ -4563,7 +4565,7 @@ int32_t dumpQueryTableCond(const SQueryTableDataCond* src, SQueryTableDataCond* int32_t lino = 0; memcpy((void*)dst, (void*)src, sizeof(SQueryTableDataCond)); dst->colList = taosMemoryCalloc(src->numOfCols, sizeof(SColumnInfo)); - QUERY_CHECK_NULL(dst->colList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(dst->colList, code, lino, _end, terrno); for (int i = 0; i < src->numOfCols; i++) { dst->colList[i] = src->colList[i]; } @@ -5038,7 +5040,7 @@ static void tableMergeScanDoSkipTable(uint64_t uid, void* pTableMergeOpInfo) { if (pInfo->mSkipTables == NULL) { pInfo->mSkipTables = taosHashInit(pInfo->tableEndIndex - pInfo->tableStartIndex + 1, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK); - QUERY_CHECK_NULL(pInfo->mSkipTables, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->mSkipTables, code, lino, _end, terrno); } int bSkip = 1; if (pInfo->mSkipTables != NULL) { @@ -5209,10 +5211,10 @@ int32_t generateSortByTsPkInfo(SArray* colMatchInfo, int32_t order, SArray** ppS } void* tmp = taosArrayPush(pSortInfo, &biTs); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); if (pkTargetSlotId != -1) { tmp = taosArrayPush(pSortInfo, &biPk); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } (*ppSortArray) = pSortInfo; @@ -5625,7 +5627,7 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN initResultSizeInfo(&pOperator->resultInfo, 1024); pInfo->pResBlock = createDataBlockFromDescNode(pDescNode); - QUERY_CHECK_NULL(pInfo->pResBlock, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pResBlock, code, lino, _error, terrno); code = blockDataEnsureCapacity(pInfo->pResBlock, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _error); if (!hasLimit && blockDataGetRowSize(pInfo->pResBlock) >= 256 && !pTableScanNode->smallDataTsSort) { @@ -5640,7 +5642,7 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN code = generateSortByTsPkInfo(pInfo->base.matchInfo.pList, pInfo->base.cond.order, &pInfo->pSortInfo); QUERY_CHECK_CODE(code, lino, _error); pInfo->pReaderBlock = createOneDataBlock(pInfo->pResBlock, false); - QUERY_CHECK_NULL(pInfo->pReaderBlock, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pReaderBlock, code, lino, _error, terrno); pInfo->needCountEmptyTable = tsCountAlwaysReturnValue && pTableScanNode->needCountEmptyTable; @@ -5807,7 +5809,7 @@ SOperatorInfo* createTableCountScanOperatorInfo(SReadHandle* readHandle, STableC SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc; initResultSizeInfo(&pOperator->resultInfo, 1); pInfo->pRes = createDataBlockFromDescNode(pDescNode); - QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pRes, code, lino, _error, terrno); code = blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _error); @@ -6030,7 +6032,7 @@ static void buildVnodeGroupedTableCount(SOperatorInfo* pOperator, STableCountSca if (pSupp->groupByStbName) { if (pInfo->stbUidList == NULL) { pInfo->stbUidList = taosArrayInit(16, sizeof(tb_uid_t)); - QUERY_CHECK_NULL(pInfo->stbUidList, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->stbUidList, code, lino, _end, terrno); code = pAPI->metaFn.storeGetTableList(pInfo->readHandle.vnode, TSDB_SUPER_TABLE, pInfo->stbUidList); QUERY_CHECK_CODE(code, lino, _end); } diff --git a/source/libs/executor/src/streamcountwindowoperator.c b/source/libs/executor/src/streamcountwindowoperator.c index 41a5a3505c..90f4b02877 100644 --- a/source/libs/executor/src/streamcountwindowoperator.c +++ b/source/libs/executor/src/streamcountwindowoperator.c @@ -754,7 +754,7 @@ void streamCountReleaseState(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; int32_t resSize = sizeof(TSKEY); char* pBuff = taosMemoryCalloc(1, resSize); - QUERY_CHECK_NULL(pBuff, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pBuff, code, lino, _end, terrno); memcpy(pBuff, &pInfo->twAggSup.maxTs, sizeof(TSKEY)); qDebug("===stream=== count window operator relase state. "); diff --git a/source/libs/executor/src/streameventwindowoperator.c b/source/libs/executor/src/streameventwindowoperator.c index 728ac317d4..805d3568d1 100644 --- a/source/libs/executor/src/streameventwindowoperator.c +++ b/source/libs/executor/src/streameventwindowoperator.c @@ -694,7 +694,7 @@ static int32_t doStreamEventAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRe _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY); pInfo->pAllUpdated = tSimpleHashInit(64, hashFn); - QUERY_CHECK_NULL(pInfo->pAllUpdated, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pAllUpdated, code, lino, _end, terrno); code = getMaxTsWins(pHisWins, pInfo->historyWins); QUERY_CHECK_CODE(code, lino, _end); @@ -915,18 +915,18 @@ SOperatorInfo* createStreamEventAggOperatorInfo(SOperatorInfo* downstream, SPhys if (pInfo->isHistoryOp) { pInfo->pAllUpdated = tSimpleHashInit(64, hashFn); - QUERY_CHECK_NULL(pInfo->pAllUpdated, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pAllUpdated, code, lino, _error, terrno); } else { pInfo->pAllUpdated = NULL; } pInfo->pCheckpointRes = createSpecialDataBlock(STREAM_CHECKPOINT); - QUERY_CHECK_NULL(pInfo->pCheckpointRes, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pCheckpointRes, code, lino, _error, terrno); pInfo->reCkBlock = false; pInfo->recvGetAll = false; pInfo->pPkDeleted = tSimpleHashInit(64, hashFn); - QUERY_CHECK_NULL(pInfo->pPkDeleted, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pPkDeleted, code, lino, _error, terrno); pInfo->destHasPrimaryKey = pEventNode->window.destHasPrimayKey; setOperatorInfo(pOperator, "StreamEventAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_EVENT, true, OP_NOT_OPENED, diff --git a/source/libs/executor/src/streamtimewindowoperator.c b/source/libs/executor/src/streamtimewindowoperator.c index 5aa7cac45d..95cad97a06 100644 --- a/source/libs/executor/src/streamtimewindowoperator.c +++ b/source/libs/executor/src/streamtimewindowoperator.c @@ -1905,7 +1905,11 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, initResultRowInfo(&pInfo->binfo.resultRowInfo); pInfo->numOfChild = numOfChild; - pInfo->pPhyNode = (SPhysiNode*)nodesCloneNode((SNode*)pPhyNode); + pInfo->pPhyNode = NULL; + code = nodesCloneNode((SNode*)pPhyNode, (SNode**)&pInfo->pPhyNode); + if (TSDB_CODE_SUCCESS != code) { + goto _error; + } pInfo->pPullWins = taosArrayInit(8, sizeof(SPullWindowInfo)); pInfo->pullIndex = 0; diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index b502baa8ec..f00a0e175c 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -1055,7 +1055,7 @@ static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, char* tagJson = NULL; parseTagDatatoJson(tagData, &tagJson); tagVarChar = taosMemoryMalloc(strlen(tagJson) + VARSTR_HEADER_SIZE); - QUERY_CHECK_NULL(tagVarChar, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno); memcpy(varDataVal(tagVarChar), tagJson, strlen(tagJson)); varDataSetLen(tagVarChar, strlen(tagJson)); taosMemoryFree(tagJson); @@ -1063,7 +1063,7 @@ static int32_t sysTableUserTagsFillOneTableTags(const SSysTableScanInfo* pInfo, int32_t bufSize = IS_VAR_DATA_TYPE(tagType) ? (tagLen + VARSTR_HEADER_SIZE) : (3 + DBL_MANT_DIG - DBL_MIN_EXP + VARSTR_HEADER_SIZE); tagVarChar = taosMemoryCalloc(1, bufSize + 1); - QUERY_CHECK_NULL(tagVarChar, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tagVarChar, code, lino, _end, terrno); int32_t len = -1; if (tagLen > 0) convertTagDataToStr(varDataVal(tagVarChar), tagType, tagData, tagLen, &len); @@ -1258,7 +1258,7 @@ int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES); - QUERY_CHECK_NULL(p, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(p, code, lino, _end, terrno); code = blockDataEnsureCapacity(p, capacity); QUERY_CHECK_CODE(code, lino, _end); @@ -1542,7 +1542,7 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) { varDataSetLen(dbname, strlen(varDataVal(dbname))); SSDataBlock* p = buildInfoSchemaTableMetaBlock(TSDB_INS_TABLE_TABLES); - QUERY_CHECK_NULL(p, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(p, code, lino, _end, terrno); code = blockDataEnsureCapacity(p, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); @@ -2362,7 +2362,7 @@ int32_t optSysIntersection(SArray* in, SArray* out) { goto _end; } MergeIndex* mi = taosMemoryCalloc(sz, sizeof(MergeIndex)); - QUERY_CHECK_NULL(mi, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(mi, code, lino, _end, terrno); for (int i = 0; i < sz; i++) { SArray* t = taosArrayGetP(in, i); mi[i].len = (int32_t)taosArrayGetSize(t); @@ -2591,7 +2591,7 @@ static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo); char* p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE); - QUERY_CHECK_NULL(p, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(p, code, lino, _end, terrno); int32_t tempRes = tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo); if (tempRes < 0) { diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index a9bc6e8c0f..c237494f4c 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -296,19 +296,19 @@ static int32_t initBeforeAfterDataBuf(SFillInfo* pFillInfo) { SGroupKeys key = {0}; SResSchema* pSchema = &pCol->pExpr->base.resSchema; key.pData = taosMemoryMalloc(pSchema->bytes); - QUERY_CHECK_NULL(key.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(key.pData, code, lino, _end, terrno); key.isNull = true; key.bytes = pSchema->bytes; key.type = pSchema->type; void* tmp = taosArrayPush(pFillInfo->next.pRowVal, &key); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); key.pData = taosMemoryMalloc(pSchema->bytes); - QUERY_CHECK_NULL(key.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(key.pData, code, lino, _end, terrno); tmp = taosArrayPush(pFillInfo->prev.pRowVal, &key); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } _end: @@ -522,7 +522,7 @@ void taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillC } SFillInfo* pFillInfo = taosMemoryCalloc(1, sizeof(SFillInfo)); - QUERY_CHECK_NULL(pFillInfo, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pFillInfo, code, lino, _end, terrno); pFillInfo->order = order; pFillInfo->srcTsSlotId = primaryTsSlotId; @@ -546,10 +546,10 @@ void taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillC pFillInfo->interval = *pInterval; pFillInfo->next.pRowVal = taosArrayInit(pFillInfo->numOfCols, sizeof(SGroupKeys)); - QUERY_CHECK_NULL(pFillInfo->next.pRowVal, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pFillInfo->next.pRowVal, code, lino, _end, terrno); pFillInfo->prev.pRowVal = taosArrayInit(pFillInfo->numOfCols, sizeof(SGroupKeys)); - QUERY_CHECK_NULL(pFillInfo->prev.pRowVal, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pFillInfo->prev.pRowVal, code, lino, _end, terrno); code = initBeforeAfterDataBuf(pFillInfo); QUERY_CHECK_CODE(code, lino, _end); diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c index 58899c87ff..5fbc8007e3 100644 --- a/source/libs/executor/src/timesliceoperator.c +++ b/source/libs/executor/src/timesliceoperator.c @@ -435,7 +435,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp } current.val = taosMemoryCalloc(pLinearInfo->bytes, 1); - QUERY_CHECK_NULL(current.val, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(current.val, code, lino, _end, terrno); taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type); code = colDataSetVal(pDst, rows, (char*)current.val, false); QUERY_CHECK_CODE(code, lino, _end); @@ -558,9 +558,9 @@ static int32_t initPrevRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pB key.type = pColInfo->info.type; key.isNull = false; key.pData = taosMemoryCalloc(1, pColInfo->info.bytes); - QUERY_CHECK_NULL(key.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(key.pData, code, lino, _end, terrno); void* tmp = taosArrayPush(pInfo->pPrevRow, &key); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } pInfo->isPrevRowSet = false; @@ -593,10 +593,10 @@ static int32_t initNextRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pB key.type = pColInfo->info.type; key.isNull = false; key.pData = taosMemoryCalloc(1, pColInfo->info.bytes); - QUERY_CHECK_NULL(key.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(key.pData, code, lino, _end, terrno); void* tmp = taosArrayPush(pInfo->pNextRow, &key); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } pInfo->isNextRowSet = false; @@ -628,16 +628,16 @@ static int32_t initFillLinearInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pB linearInfo.start.key = INT64_MIN; linearInfo.end.key = INT64_MIN; linearInfo.start.val = taosMemoryCalloc(1, pColInfo->info.bytes); - QUERY_CHECK_NULL(linearInfo.start.val, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(linearInfo.start.val, code, lino, _end, terrno); linearInfo.end.val = taosMemoryCalloc(1, pColInfo->info.bytes); - QUERY_CHECK_NULL(linearInfo.end.val, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(linearInfo.end.val, code, lino, _end, terrno); linearInfo.isStartSet = false; linearInfo.isEndSet = false; linearInfo.type = pColInfo->info.type; linearInfo.bytes = pColInfo->info.bytes; void* tmp = taosArrayPush(pInfo->pLinearInfo, &linearInfo); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } _end: diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 4d924d4a0b..8265d270b2 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -1210,10 +1210,10 @@ static bool timeWindowinterpNeeded(SqlFunctionCtx* pCtx, int32_t numOfCols, SInt if (needed) { pInfo->pInterpCols = taosArrayInit(4, sizeof(SColumn)); - QUERY_CHECK_NULL(pInfo->pInterpCols, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pInterpCols, code, lino, _end, terrno); pInfo->pPrevValues = taosArrayInit(4, sizeof(SGroupKeys)); - QUERY_CHECK_NULL(pInfo->pPrevValues, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(pInfo->pPrevValues, code, lino, _end, terrno); { // ts column SColumn c = {0}; @@ -1222,17 +1222,17 @@ static bool timeWindowinterpNeeded(SqlFunctionCtx* pCtx, int32_t numOfCols, SInt c.type = TSDB_DATA_TYPE_TIMESTAMP; c.bytes = sizeof(int64_t); tmp = taosArrayPush(pInfo->pInterpCols, &c); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); SGroupKeys key; key.bytes = c.bytes; key.type = c.type; key.isNull = true; // to denote no value is assigned yet key.pData = taosMemoryCalloc(1, c.bytes); - QUERY_CHECK_NULL(key.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(key.pData, code, lino, _end, terrno); tmp = taosArrayPush(pInfo->pPrevValues, &key); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } @@ -1244,17 +1244,17 @@ static bool timeWindowinterpNeeded(SqlFunctionCtx* pCtx, int32_t numOfCols, SInt SColumn c = *pParam->pCol; tmp = taosArrayPush(pInfo->pInterpCols, &c); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); SGroupKeys key = {0}; key.bytes = c.bytes; key.type = c.type; key.isNull = false; key.pData = taosMemoryCalloc(1, c.bytes); - QUERY_CHECK_NULL(key.pData, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(key.pData, code, lino, _end, terrno); tmp = taosArrayPush(pInfo->pPrevValues, &key); - QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + QUERY_CHECK_NULL(tmp, code, lino, _end, terrno); } } diff --git a/source/libs/executor/src/tlinearhash.c b/source/libs/executor/src/tlinearhash.c index 023583fcde..ec897b06a9 100644 --- a/source/libs/executor/src/tlinearhash.c +++ b/source/libs/executor/src/tlinearhash.c @@ -152,7 +152,8 @@ static void doTrimBucketPages(SLHashObj* pHashObj, SLHashBucket* pBucket) { if (pLast->num <= sizeof(SFilePage)) { // this is empty - dBufSetBufPageRecycled(pHashObj->pBuf, pLast); + // TODO check ret + (void)dBufSetBufPageRecycled(pHashObj->pBuf, pLast); releaseBufPage(pHashObj->pBuf, pFirst); taosArrayRemove(pBucket->pPageIdList, numOfPages - 1); return; @@ -178,7 +179,8 @@ static void doTrimBucketPages(SLHashObj* pHashObj, SLHashBucket* pBucket) { pStart += nodeSize; if (pLast->num <= sizeof(SFilePage)) { // this is empty - dBufSetBufPageRecycled(pHashObj->pBuf, pLast); + // TODO check ret + (void)dBufSetBufPageRecycled(pHashObj->pBuf, pLast); releaseBufPage(pHashObj->pBuf, pFirst); taosArrayRemove(pBucket->pPageIdList, numOfPages - 1); break; diff --git a/source/libs/executor/test/joinTests.cpp b/source/libs/executor/test/joinTests.cpp index e3daf6ff27..95a4a5e841 100755 --- a/source/libs/executor/test/joinTests.cpp +++ b/source/libs/executor/test/joinTests.cpp @@ -305,14 +305,16 @@ static int32_t jtMergeEqCond(SNode** ppDst, SNode** ppSrc) { return TSDB_CODE_SUCCESS; } - SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SLogicConditionNode* pLogicCond = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond); if (NULL == pLogicCond) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; pLogicCond->condType = LOGIC_COND_TYPE_AND; - pLogicCond->pParameterList = nodesMakeList(); + pLogicCond->pParameterList = NULL; + code = nodesMakeList(&pLogicCond->pParameterList); assert(0 == nodesListStrictAppend(pLogicCond->pParameterList, *ppSrc)); assert(0 == nodesListStrictAppend(pLogicCond->pParameterList, *ppDst)); @@ -387,8 +389,10 @@ void createTargetSlotList(SSortMergeJoinPhysiNode* p) { jtCtx.keyColOffset = dstOffset; } - STargetNode* pTarget = (STargetNode*)nodesMakeNode(QUERY_NODE_TARGET); - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + STargetNode* pTarget = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_TARGET, (SNode**)&pTarget); + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); assert(NULL != pTarget && NULL != pCol); pCol->dataBlockId = LEFT_BLK_ID; pCol->slotId = i; @@ -412,8 +416,10 @@ void createTargetSlotList(SSortMergeJoinPhysiNode* p) { jtCtx.keyColOffset = dstOffset; } - STargetNode* pTarget = (STargetNode*)nodesMakeNode(QUERY_NODE_TARGET); - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + STargetNode* pTarget = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_TARGET, (SNode**)&pTarget); + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); assert(NULL != pTarget && NULL != pCol); pCol->dataBlockId = RIGHT_BLK_ID; pCol->slotId = i; @@ -454,9 +460,9 @@ void createColEqCondStart(SSortMergeJoinPhysiNode* p) { for (int32_t i = 0; i < MAX_SLOT_NUM; ++i) { if (jtCtx.colEqList[i]) { - SColumnNode* pCol1 = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol1 = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol1); assert(pCol1); - pCol1->dataBlockId = LEFT_BLK_ID; pCol1->slotId = i; pCol1->node.resType.type = jtInputColType[i]; @@ -464,7 +470,8 @@ void createColEqCondStart(SSortMergeJoinPhysiNode* p) { assert(0 == nodesListMakeStrictAppend(&p->pEqLeft, (SNode*)pCol1)); - SColumnNode* pCol2 = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol2 = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol2); pCol2->dataBlockId = RIGHT_BLK_ID; pCol2->slotId = i; pCol2->node.resType.type = jtInputColType[i]; @@ -511,7 +518,7 @@ void createColEqCondEnd(SSortMergeJoinPhysiNode* p) { SLogicConditionNode* pLogic = NULL; if (jtCtx.colEqNum > 1) { - pLogic = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogic); assert(pLogic); pLogic->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogic->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; @@ -520,21 +527,24 @@ void createColEqCondEnd(SSortMergeJoinPhysiNode* p) { for (int32_t i = 0; i < MAX_SLOT_NUM; ++i) { if (jtCtx.colEqList[i]) { - SColumnNode* pCol1 = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol1 = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol1); assert(pCol1); pCol1->dataBlockId = RES_BLK_ID; pCol1->slotId = getDstSlotId(i); pCol1->node.resType.type = jtInputColType[i]; pCol1->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; - SColumnNode* pCol2 = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol2 = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol2); assert(pCol2); pCol2->dataBlockId = RES_BLK_ID; pCol2->slotId = getDstSlotId(MAX_SLOT_NUM + i); pCol2->node.resType.type = jtInputColType[i]; pCol2->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; - SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOp = NULL; + code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOp); assert(pOp); pOp->opType = OP_TYPE_EQUAL; pOp->node.resType.type = TSDB_DATA_TYPE_BOOL; @@ -563,7 +573,7 @@ void createColOnCondEnd(SSortMergeJoinPhysiNode* p) { SLogicConditionNode* pLogic = NULL; if (jtCtx.colOnNum > 1) { - pLogic = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogic); assert(pLogic); pLogic->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogic->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; @@ -572,21 +582,24 @@ void createColOnCondEnd(SSortMergeJoinPhysiNode* p) { for (int32_t i = 0; i < MAX_SLOT_NUM; ++i) { if (jtCtx.colOnList[i]) { - SColumnNode* pCol1 = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol1 = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol1); assert(pCol1); pCol1->dataBlockId = RES_BLK_ID; pCol1->slotId = getDstSlotId(i); pCol1->node.resType.type = jtInputColType[i]; pCol1->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; - SColumnNode* pCol2 = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol2 = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol2); assert(pCol2); pCol2->dataBlockId = RES_BLK_ID; pCol2->slotId = getDstSlotId(MAX_SLOT_NUM + i); pCol2->node.resType.type = jtInputColType[i]; pCol2->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; - SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOp = NULL; + code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOp); assert(pOp); pOp->opType = OP_TYPE_GREATER_THAN; pOp->node.resType.type = TSDB_DATA_TYPE_BOOL; @@ -607,7 +620,8 @@ void createColOnCondEnd(SSortMergeJoinPhysiNode* p) { p->pColOnCond = (SNode*)pLogic; } - SNode* pTmp = nodesCloneNode(p->pColOnCond); + SNode* pTmp = NULL; + int32_t code = nodesCloneNode(p->pColOnCond, &pTmp); assert(pTmp); assert(0 == jtMergeEqCond(&p->pFullOnCond, &pTmp)); } @@ -721,7 +735,7 @@ void createFilterEnd(SSortMergeJoinPhysiNode* p, bool filter) { SLogicConditionNode* pLogic = NULL; if ((jtCtx.leftFilterNum + jtCtx.rightFilterNum) > 1) { - pLogic = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogic); assert(pLogic); pLogic->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogic->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; @@ -730,7 +744,8 @@ void createFilterEnd(SSortMergeJoinPhysiNode* p, bool filter) { for (int32_t i = 0; i < MAX_SLOT_NUM; ++i) { if (jtCtx.leftFilterColList[i]) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN,(SNode**)&pCol); assert(pCol); pCol->dataBlockId = RES_BLK_ID; pCol->slotId = getDstSlotId(i); @@ -738,13 +753,15 @@ void createFilterEnd(SSortMergeJoinPhysiNode* p, bool filter) { pCol->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; (void)sprintf(pCol->colName, "l%d", i); - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pVal = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); assert(pVal); pVal->node.resType.type = jtInputColType[i]; pVal->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; assert(0 == nodesSetValueNodeValue(pVal, getFilterValue(jtInputColType[i]))); - SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOp = NULL; + code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOp); assert(pOp); pOp->opType = OP_TYPE_GREATER_THAN; pOp->node.resType.type = TSDB_DATA_TYPE_BOOL; @@ -763,7 +780,8 @@ void createFilterEnd(SSortMergeJoinPhysiNode* p, bool filter) { for (int32_t i = 0; i < MAX_SLOT_NUM; ++i) { if (jtCtx.rightFilterColList[i]) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); assert(pCol); pCol->dataBlockId = RES_BLK_ID; pCol->slotId = getDstSlotId(MAX_SLOT_NUM + i); @@ -771,13 +789,15 @@ void createFilterEnd(SSortMergeJoinPhysiNode* p, bool filter) { pCol->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; (void)sprintf(pCol->colName, "r%d", i); - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pVal = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); assert(pVal); pVal->node.resType.type = jtInputColType[i]; pVal->node.resType.bytes = tDataTypes[jtInputColType[i]].bytes; assert(0 == nodesSetValueNodeValue(pVal, getFilterValue(jtInputColType[i]))); - SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOp = NULL; + code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOp); assert(pOp); pOp->opType = OP_TYPE_GREATER_THAN; pOp->node.resType.type = TSDB_DATA_TYPE_BOOL; @@ -810,13 +830,15 @@ void updateColRowInfo() { } void createBlockDescNode(SDataBlockDescNode** ppNode) { - SDataBlockDescNode* pDesc = (SDataBlockDescNode*)nodesMakeNode(QUERY_NODE_DATABLOCK_DESC); + SDataBlockDescNode* pDesc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_DATABLOCK_DESC, (SNode**)&pDesc); assert(pDesc); pDesc->dataBlockId = RES_BLK_ID; pDesc->totalRowSize = jtCtx.resColSize - MAX_SLOT_NUM * 2 * sizeof(bool); pDesc->outputRowSize = pDesc->totalRowSize; for (int32_t i = 0; i < jtCtx.resColNum; ++i) { - SSlotDescNode* pSlot = (SSlotDescNode*)nodesMakeNode(QUERY_NODE_SLOT_DESC); + SSlotDescNode* pSlot = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_SLOT_DESC, (SNode**)&pSlot); assert(pSlot); pSlot->slotId = i; int32_t slotIdx = jtCtx.resColInSlot[i] >= MAX_SLOT_NUM ? jtCtx.resColInSlot[i] - MAX_SLOT_NUM : jtCtx.resColInSlot[i]; @@ -830,14 +852,16 @@ void createBlockDescNode(SDataBlockDescNode** ppNode) { } SSortMergeJoinPhysiNode* createDummySortMergeJoinPhysiNode(SJoinTestParam* param) { - SSortMergeJoinPhysiNode* p = (SSortMergeJoinPhysiNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN); + SSortMergeJoinPhysiNode* p = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN, (SNode**)&p); assert(p); p->joinType = param->joinType; p->subType = param->subType; p->asofOpType = param->asofOp; p->grpJoin = param->grpJoin; if (p->subType == JOIN_STYPE_WIN || param->jLimit > 1 || taosRand() % 2) { - SLimitNode* limitNode = (SLimitNode*)nodesMakeNode(QUERY_NODE_LIMIT); + SLimitNode* limitNode = NULL; + code = nodesMakeNode(QUERY_NODE_LIMIT, (SNode**)&limitNode); assert(limitNode); limitNode->limit = param->jLimit; p->pJLimit = (SNode*)limitNode; @@ -847,11 +871,14 @@ SSortMergeJoinPhysiNode* createDummySortMergeJoinPhysiNode(SJoinTestParam* param p->rightPrimSlotId = JT_PRIM_TS_SLOT_ID; p->node.inputTsOrder = param->asc ? ORDER_ASC : ORDER_DESC; if (JOIN_STYPE_WIN == p->subType) { - SWindowOffsetNode* pOffset = (SWindowOffsetNode*)nodesMakeNode(QUERY_NODE_WINDOW_OFFSET); + SWindowOffsetNode* pOffset = NULL; + code = nodesMakeNode(QUERY_NODE_WINDOW_OFFSET, (SNode**)&pOffset); assert(pOffset); - SValueNode* pStart = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pStart = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pStart); assert(pStart); - SValueNode* pEnd = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pEnd = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pEnd); assert(pEnd); pStart->node.resType.type = TSDB_DATA_TYPE_BIGINT; pStart->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index 9c57c682cf..8c809a5052 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -216,9 +216,10 @@ static int32_t addTimezoneParam(SNodeList* pList) { } int32_t len = (int32_t)strlen(buf); - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); if (pVal == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pVal->literal = strndup(buf, len); @@ -238,7 +239,7 @@ static int32_t addTimezoneParam(SNodeList* pList) { varDataSetLen(pVal->datum.p, len); (void)strncpy(varDataVal(pVal->datum.p), pVal->literal, len); - int32_t code = nodesListAppend(pList, (SNode*)pVal); + code = nodesListAppend(pList, (SNode*)pVal); if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pVal); return code; @@ -247,9 +248,10 @@ static int32_t addTimezoneParam(SNodeList* pList) { } static int32_t addDbPrecisonParam(SNodeList** pList, uint8_t precision) { - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); if (pVal == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pVal->literal = NULL; @@ -261,7 +263,7 @@ static int32_t addDbPrecisonParam(SNodeList** pList, uint8_t precision) { pVal->datum.i = (int64_t)precision; pVal->typeData = (int64_t)precision; - int32_t code = nodesListMakeAppend(pList, (SNode*)pVal); + code = nodesListMakeAppend(pList, (SNode*)pVal); if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pVal); return code; @@ -835,9 +837,13 @@ static int32_t translateTopBot(SFunctionNode* pFunc, char* pErrBuf, int32_t len) static int32_t reserveFirstMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) { int32_t code = nodesListMakeAppend(pParameters, pPartialRes); if (TSDB_CODE_SUCCESS == code) { - code = nodesListStrictAppend(*pParameters, nodesCloneNode(nodesListGetNode(pRawParameters, 1))); + SNode* pNew = NULL; + code = nodesCloneNode(nodesListGetNode(pRawParameters, 1), &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(*pParameters, pNew); + } } - return TSDB_CODE_SUCCESS; + return code; } int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) { @@ -847,7 +853,11 @@ int32_t topBotCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SN int32_t apercentileCreateMergeParam(SNodeList* pRawParameters, SNode* pPartialRes, SNodeList** pParameters) { int32_t code = reserveFirstMergeParam(pRawParameters, pPartialRes, pParameters); if (TSDB_CODE_SUCCESS == code && pRawParameters->length >= 3) { - code = nodesListStrictAppend(*pParameters, nodesCloneNode(nodesListGetNode(pRawParameters, 2))); + SNode* pNew = NULL; + code = nodesCloneNode(nodesListGetNode(pRawParameters, 2), &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(*pParameters, pNew); + } } return code; } diff --git a/source/libs/function/src/functionMgt.c b/source/libs/function/src/functionMgt.c index 0424b2f179..49d700e8c8 100644 --- a/source/libs/function/src/functionMgt.c +++ b/source/libs/function/src/functionMgt.c @@ -382,29 +382,30 @@ static int32_t getFuncInfo(SFunctionNode* pFunc) { return fmGetFuncInfo(pFunc, msg, sizeof(msg)); } -int32_t createFunction(const char* pName, SNodeList* pParameterList, SFunctionNode** pFunc) { - *pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (NULL == *pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; +int32_t createFunction(const char* pName, SNodeList* pParameterList, SFunctionNode** ppFunc) { + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)ppFunc); + if (NULL == *ppFunc) { + return code; } - (void)snprintf((*pFunc)->functionName, sizeof((*pFunc)->functionName), "%s", pName); - (*pFunc)->pParameterList = pParameterList; - int32_t code = getFuncInfo((*pFunc)); + (void)snprintf((*ppFunc)->functionName, sizeof((*ppFunc)->functionName), "%s", pName); + (*ppFunc)->pParameterList = pParameterList; + code = getFuncInfo((*ppFunc)); if (TSDB_CODE_SUCCESS != code) { - (*pFunc)->pParameterList = NULL; - nodesDestroyNode((SNode*)*pFunc); + (*ppFunc)->pParameterList = NULL; + nodesDestroyNode((SNode*)*ppFunc); + *ppFunc = NULL; return code; } return code; } -static int32_t createColumnByFunc(const SFunctionNode* pFunc, SColumnNode** pCol) { - *pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == *pCol) { - return TSDB_CODE_OUT_OF_MEMORY; +static int32_t createColumnByFunc(const SFunctionNode* pFunc, SColumnNode** ppCol) { + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)ppCol); + if (NULL == *ppCol) { + return code; } - (void)strcpy((*pCol)->colName, pFunc->node.aliasName); - (*pCol)->node.resType = pFunc->node.resType; + (void)strcpy((*ppCol)->colName, pFunc->node.aliasName); + (*ppCol)->node.resType = pFunc->node.resType; return TSDB_CODE_SUCCESS; } @@ -419,11 +420,12 @@ bool fmIsDistExecFunc(int32_t funcId) { } static int32_t createPartialFunction(const SFunctionNode* pSrcFunc, SFunctionNode** pPartialFunc) { - SNodeList* pParameterList = nodesCloneList(pSrcFunc->pParameterList); + SNodeList* pParameterList = NULL; + int32_t code = nodesCloneList(pSrcFunc->pParameterList, &pParameterList); if (NULL == pParameterList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = createFunction(funcMgtBuiltins[pSrcFunc->funcId].pPartialFunc, pParameterList,pPartialFunc ); + code = createFunction(funcMgtBuiltins[pSrcFunc->funcId].pPartialFunc, pParameterList,pPartialFunc ); if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pParameterList); return code; @@ -542,12 +544,13 @@ char* fmGetFuncName(int32_t funcId) { /// @retval 0 for succ, otherwise err occured static int32_t fmCreateStateFunc(const SFunctionNode* pFunc, SFunctionNode** pStateFunc) { if (funcMgtBuiltins[pFunc->funcId].pStateFunc) { - SNodeList* pParams = nodesCloneList(pFunc->pParameterList); - if (!pParams) return TSDB_CODE_OUT_OF_MEMORY; - int32_t code = createFunction(funcMgtBuiltins[pFunc->funcId].pStateFunc, pParams, pStateFunc); + SNodeList* pParams = NULL; + int32_t code = nodesCloneList(pFunc->pParameterList, &pParams); + if (!pParams) return code; + code = createFunction(funcMgtBuiltins[pFunc->funcId].pStateFunc, pParams, pStateFunc); if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pParams); - return TSDB_CODE_FUNC_FUNTION_ERROR; + return code; } (void)strcpy((*pStateFunc)->node.aliasName, pFunc->node.aliasName); (void)strcpy((*pStateFunc)->node.userAlias, pFunc->node.userAlias); @@ -588,9 +591,10 @@ int32_t fmCreateStateFuncs(SNodeList* pFuncs) { static int32_t fmCreateStateMergeFunc(SFunctionNode* pFunc, SFunctionNode** pStateMergeFunc) { if (funcMgtBuiltins[pFunc->funcId].pMergeFunc) { - SNodeList* pParams = nodesCloneList(pFunc->pParameterList); - if (!pParams) return TSDB_CODE_OUT_OF_MEMORY; - int32_t code = createFunction(funcMgtBuiltins[pFunc->funcId].pMergeFunc, pParams, pStateMergeFunc); + SNodeList* pParams = NULL; + int32_t code = nodesCloneList(pFunc->pParameterList, &pParams); + if (!pParams) return code; + code = createFunction(funcMgtBuiltins[pFunc->funcId].pMergeFunc, pParams, pStateMergeFunc); if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pParams); return code; diff --git a/source/libs/nodes/src/nodesCloneFuncs.c b/source/libs/nodes/src/nodesCloneFuncs.c index f02fefd977..78cf78f6db 100644 --- a/source/libs/nodes/src/nodesCloneFuncs.c +++ b/source/libs/nodes/src/nodesCloneFuncs.c @@ -47,37 +47,37 @@ } \ } while (0) -#define CLONE_NODE_FIELD(fldname) \ - do { \ - if (NULL == (pSrc)->fldname) { \ - break; \ - } \ - (pDst)->fldname = nodesCloneNode((pSrc)->fldname); \ - if (NULL == (pDst)->fldname) { \ - return TSDB_CODE_OUT_OF_MEMORY; \ - } \ +#define CLONE_NODE_FIELD(fldname) \ + do { \ + if (NULL == (pSrc)->fldname) { \ + break; \ + } \ + int32_t code = nodesCloneNode((pSrc)->fldname, &((pDst)->fldname)); \ + if (NULL == (pDst)->fldname) { \ + return code; \ + } \ } while (0) -#define CLONE_NODE_FIELD_EX(fldname, nodePtrType) \ - do { \ - if (NULL == (pSrc)->fldname) { \ - break; \ - } \ - (pDst)->fldname = (nodePtrType)nodesCloneNode((SNode*)(pSrc)->fldname); \ - if (NULL == (pDst)->fldname) { \ - return TSDB_CODE_OUT_OF_MEMORY; \ - } \ +#define CLONE_NODE_FIELD_EX(fldname, nodePtrType) \ + do { \ + if (NULL == (pSrc)->fldname) { \ + break; \ + } \ + int32_t code = nodesCloneNode((SNode*)(pSrc)->fldname, (SNode**)&((pDst)->fldname)); \ + if (NULL == (pDst)->fldname) { \ + return code; \ + } \ } while (0) -#define CLONE_NODE_LIST_FIELD(fldname) \ - do { \ - if (NULL == (pSrc)->fldname) { \ - break; \ - } \ - (pDst)->fldname = nodesCloneList((pSrc)->fldname); \ - if (NULL == (pDst)->fldname) { \ - return TSDB_CODE_OUT_OF_MEMORY; \ - } \ +#define CLONE_NODE_LIST_FIELD(fldname) \ + do { \ + if (NULL == (pSrc)->fldname) { \ + break; \ + } \ + int32_t code = nodesCloneList((pSrc)->fldname, &((pDst)->fldname)); \ + if (NULL == (pDst)->fldname) { \ + return code; \ + } \ } while (0) #define CLONE_OBJECT_FIELD(fldname, cloneFunc) \ @@ -869,18 +869,17 @@ static int32_t setOperatorCopy(const SSetOperator* pSrc, SSetOperator* pDst) { return TSDB_CODE_SUCCESS; } -SNode* nodesCloneNode(const SNode* pNode) { +int32_t nodesCloneNode(const SNode* pNode, SNode** ppNode) { if (NULL == pNode) { - return NULL; + return TSDB_CODE_SUCCESS; } - SNode* pDst = nodesMakeNode(nodeType(pNode)); - if (NULL == pDst) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + SNode* pDst = NULL; + int32_t code = nodesMakeNode(nodeType(pNode), &pDst); + if (TSDB_CODE_SUCCESS != code) { + return code; } - int32_t code = TSDB_CODE_SUCCESS; switch (nodeType(pNode)) { case QUERY_NODE_COLUMN: code = columnNodeCopy((const SColumnNode*)pNode, (SColumnNode*)pDst); @@ -1058,25 +1057,32 @@ SNode* nodesCloneNode(const SNode* pNode) { terrno = TSDB_CODE_OUT_OF_MEMORY; nodesDestroyNode(pDst); nodesError("nodesCloneNode failed node = %s", nodesNodeName(nodeType(pNode))); - return NULL; + return code; } - return pDst; + *ppNode = pDst; + return code; } -SNodeList* nodesCloneList(const SNodeList* pList) { +int32_t nodesCloneList(const SNodeList* pList, SNodeList** ppList) { if (NULL == pList) { - return NULL; + return TSDB_CODE_SUCCESS; } SNodeList* pDst = NULL; SNode* pNode; FOREACH(pNode, pList) { - int32_t code = nodesListMakeStrictAppend(&pDst, nodesCloneNode(pNode)); + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pNode, &pNew); if (TSDB_CODE_SUCCESS != code) { - terrno = TSDB_CODE_OUT_OF_MEMORY; nodesDestroyList(pDst); - return NULL; + return code; + } + code = nodesListMakeStrictAppend(&pDst, pNew); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pDst); + return code; } } - return pDst; + *ppList = pDst; + return TSDB_CODE_SUCCESS; } diff --git a/source/libs/nodes/src/nodesCodeFuncs.c b/source/libs/nodes/src/nodesCodeFuncs.c index d5b36aa1a8..b34d1b9a70 100644 --- a/source/libs/nodes/src/nodesCodeFuncs.c +++ b/source/libs/nodes/src/nodesCodeFuncs.c @@ -456,9 +456,9 @@ static int32_t nodeListToJson(SJson* pJson, const char* pName, const SNodeList* static int32_t jsonToNodeListImpl(const SJson* pJsonArray, SNodeList** pList) { int32_t size = (NULL == pJsonArray ? 0 : tjsonGetArraySize(pJsonArray)); if (size > 0) { - *pList = nodesMakeList(); + int32_t code = nodesMakeList(pList); if (NULL == *pList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } @@ -1338,7 +1338,7 @@ static int32_t jsonToLogicDynQueryCtrlNode(const SJson* pJson, void* pObj) { tjsonGetNumberValue(pJson, jkDynQueryCtrlLogicPlanQueryType, pNode->qType, code); } if (TSDB_CODE_SUCCESS == code) { - tjsonGetBoolValue(pJson, jkDynQueryCtrlLogicPlanStbJoinBatchFetch, &pNode->stbJoin.batchFetch); + code = tjsonGetBoolValue(pJson, jkDynQueryCtrlLogicPlanStbJoinBatchFetch, &pNode->stbJoin.batchFetch); } if (TSDB_CODE_SUCCESS == code) { code = jsonToNodeList(pJson, jkDynQueryCtrlLogicPlanStbJoinVgList, &pNode->stbJoin.pVgList); @@ -3031,10 +3031,10 @@ static int32_t physiPartitionNodeToJson(const void* pObj, SJson* pJson) { code = nodeListToJson(pJson, jkPartitionPhysiPlanTargets, pNode->pTargets); } if (TSDB_CODE_SUCCESS == code) { - tjsonAddBoolToObject(pJson, jkPartitionPhysiPlanNeedBlockOutputTsOrder, pNode->needBlockOutputTsOrder); + code = tjsonAddBoolToObject(pJson, jkPartitionPhysiPlanNeedBlockOutputTsOrder, pNode->needBlockOutputTsOrder); } if (TSDB_CODE_SUCCESS == code) { - tjsonAddIntegerToObject(pJson, jkPartitionPhysiPlanTsSlotId, pNode->tsSlotId); + code = tjsonAddIntegerToObject(pJson, jkPartitionPhysiPlanTsSlotId, pNode->tsSlotId); } return code; @@ -7390,7 +7390,7 @@ static int32_t jsonToTSMAOption(const SJson* pJson, void* pObj) { code = jsonToNodeObject(pJson, jkTSMAOptionInterval, &pNode->pInterval); } if (TSDB_CODE_SUCCESS == code) { - tjsonGetUTinyIntValue(pJson, jkTSMAOptionTsPrecision, &pNode->tsPrecision); + code = tjsonGetUTinyIntValue(pJson, jkTSMAOptionTsPrecision, &pNode->tsPrecision); } return code; } @@ -8212,9 +8212,9 @@ static int32_t makeNodeByJson(const SJson* pJson, SNode** pNode) { int32_t val = 0; int32_t code = tjsonGetIntValue(pJson, jkNodeType, &val); if (TSDB_CODE_SUCCESS == code) { - *pNode = nodesMakeNode(val); + code = nodesMakeNode(val, pNode); if (NULL == *pNode) { - return TSDB_CODE_FAILED; + return code; } code = jsonToNode(pJson, *pNode); } diff --git a/source/libs/nodes/src/nodesMsgFuncs.c b/source/libs/nodes/src/nodesMsgFuncs.c index 54cf685235..2d3f2b1f3a 100644 --- a/source/libs/nodes/src/nodesMsgFuncs.c +++ b/source/libs/nodes/src/nodesMsgFuncs.c @@ -60,7 +60,7 @@ typedef struct STlvDecoder { typedef int32_t (*FToMsg)(const void* pObj, STlvEncoder* pEncoder); typedef int32_t (*FToObject)(STlvDecoder* pDecoder, void* pObj); -typedef void* (*FMakeObject)(int16_t type); +typedef int32_t (*FMakeObject)(int16_t type, SNode** ppNode); typedef int32_t (*FSetObject)(STlv* pTlv, void* pObj); static int32_t nodeToMsg(const void* pObj, STlvEncoder* pEncoder); @@ -568,9 +568,9 @@ static int32_t tlvDecodeObjArrayFromTlv(STlv* pTlv, FToObject func, void* pArray } static int32_t tlvDecodeDynObjFromTlv(STlv* pTlv, FMakeObject makeFunc, FToObject toFunc, void** pObj) { - *pObj = makeFunc(pTlv->type); + int32_t code = makeFunc(pTlv->type, (SNode**)pObj); if (NULL == *pObj) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } return tlvDecodeObjFromTlv(pTlv, toFunc, *pObj); } @@ -4786,9 +4786,10 @@ static int32_t SArrayToMsg(const void* pObj, STlvEncoder* pEncoder) { static int32_t msgToNodeList(STlvDecoder* pDecoder, void** pObj) { - SNodeList* pList = nodesMakeList(); - + SNodeList* pList = NULL; int32_t code = TSDB_CODE_SUCCESS; + code = nodesMakeList(&pList); + while (TSDB_CODE_SUCCESS == code && !tlvDecodeEnd(pDecoder)) { SNode* pNode = NULL; code = msgToNode(pDecoder, (void**)&pNode); diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index c306cf2c7a..6e69c56687 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -77,45 +77,50 @@ int32_t mergeJoinConds(SNode** ppDst, SNode** ppSrc) { if (QUERY_NODE_LOGIC_CONDITION == nodeType(*ppSrc) && ((SLogicConditionNode*)(*ppSrc))->condType == LOGIC_COND_TYPE_AND) { TSWAP(*ppDst, *ppSrc); } + int32_t code = 0; if (QUERY_NODE_LOGIC_CONDITION == nodeType(*ppDst)) { SLogicConditionNode* pDst = (SLogicConditionNode*)*ppDst; if (pDst->condType == LOGIC_COND_TYPE_AND) { if (QUERY_NODE_LOGIC_CONDITION == nodeType(*ppSrc) && ((SLogicConditionNode*)(*ppSrc))->condType == LOGIC_COND_TYPE_AND) { - nodesListStrictAppendList(pDst->pParameterList, ((SLogicConditionNode*)(*ppSrc))->pParameterList); + code = nodesListStrictAppendList(pDst->pParameterList, ((SLogicConditionNode*)(*ppSrc))->pParameterList); ((SLogicConditionNode*)(*ppSrc))->pParameterList = NULL; } else { - nodesListStrictAppend(pDst->pParameterList, *ppSrc); + code = nodesListStrictAppend(pDst->pParameterList, *ppSrc); *ppSrc = NULL; } nodesDestroyNode(*ppSrc); *ppSrc = NULL; - return TSDB_CODE_SUCCESS; + return code; } } - SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); - if (NULL == pLogicCond) { - return TSDB_CODE_OUT_OF_MEMORY; + SLogicConditionNode* pLogicCond = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond); + if (TSDB_CODE_SUCCESS != code) { + return code; } pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; pLogicCond->condType = LOGIC_COND_TYPE_AND; - pLogicCond->pParameterList = nodesMakeList(); - nodesListStrictAppend(pLogicCond->pParameterList, *ppSrc); - nodesListStrictAppend(pLogicCond->pParameterList, *ppDst); - - *ppDst = (SNode*)pLogicCond; - *ppSrc = NULL; - - return TSDB_CODE_SUCCESS; + pLogicCond->pParameterList = NULL; + code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, *ppSrc); + if (TSDB_CODE_SUCCESS == code) { + *ppSrc = NULL; + code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, *ppDst); + } + if (TSDB_CODE_SUCCESS == code) { + *ppDst = (SNode*)pLogicCond; + } + return code; } -static SNodeMemChunk* callocNodeChunk(SNodeAllocator* pAllocator) { +static int32_t callocNodeChunk(SNodeAllocator* pAllocator, SNodeMemChunk** pOutChunk) { SNodeMemChunk* pNewChunk = taosMemoryCalloc(1, sizeof(SNodeMemChunk) + pAllocator->chunkSize); if (NULL == pNewChunk) { - return NULL; + if (pOutChunk) *pOutChunk = NULL; + return TSDB_CODE_OUT_OF_MEMORY; } pNewChunk->pBuf = (char*)(pNewChunk + 1); pNewChunk->availableSize = pAllocator->chunkSize; @@ -129,31 +134,39 @@ static SNodeMemChunk* callocNodeChunk(SNodeAllocator* pAllocator) { pAllocator->pChunks = pNewChunk; } ++(pAllocator->chunkNum); - return pNewChunk; + if (pOutChunk) *pOutChunk = pNewChunk; + return TSDB_CODE_SUCCESS; } -static void* nodesCallocImpl(int32_t size) { +static int32_t nodesCallocImpl(int32_t size, void** pOut) { if (NULL == g_pNodeAllocator) { - return taosMemoryCalloc(1, size); + *pOut = taosMemoryCalloc(1, size); + if (!pOut) return TSDB_CODE_OUT_OF_MEMORY; + return TSDB_CODE_SUCCESS; } if (g_pNodeAllocator->pCurrChunk->usedSize + size > g_pNodeAllocator->pCurrChunk->availableSize) { - if (NULL == callocNodeChunk(g_pNodeAllocator)) { - return NULL; + int32_t code = callocNodeChunk(g_pNodeAllocator, NULL); + if (TSDB_CODE_SUCCESS != code) { + *pOut = NULL; + return code; } } void* p = g_pNodeAllocator->pCurrChunk->pBuf + g_pNodeAllocator->pCurrChunk->usedSize; g_pNodeAllocator->pCurrChunk->usedSize += size; - return p; + *pOut = p; + return TSDB_CODE_SUCCESS;; } -static void* nodesCalloc(int32_t num, int32_t size) { - void* p = nodesCallocImpl(num * size + 1); - if (NULL == p) { - return NULL; +static int32_t nodesCalloc(int32_t num, int32_t size, void** pOut) { + void* p = NULL; + int32_t code = nodesCallocImpl(num * size + 1, &p); + if (TSDB_CODE_SUCCESS != code) { + return code; } *(char*)p = (NULL != g_pNodeAllocator) ? 1 : 0; - return (char*)p + 1; + *pOut = (char*)p + 1; + return TSDB_CODE_SUCCESS; } void nodesFree(void* p) { @@ -170,11 +183,14 @@ static int32_t createNodeAllocator(int32_t chunkSize, SNodeAllocator** pAllocato return TSDB_CODE_OUT_OF_MEMORY; } (*pAllocator)->chunkSize = chunkSize; - if (NULL == callocNodeChunk(*pAllocator)) { + int32_t code = callocNodeChunk(*pAllocator, NULL); + if (TSDB_CODE_SUCCESS != code) { taosMemoryFreeClear(*pAllocator); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + if (0 != taosThreadMutexInit(&(*pAllocator)->mutex, NULL)) { + return TAOS_SYSTEM_ERROR(errno); } - taosThreadMutexInit(&(*pAllocator)->mutex, NULL); return TSDB_CODE_SUCCESS; } @@ -194,7 +210,7 @@ static void destroyNodeAllocator(void* p) { taosMemoryFree(pChunk); pChunk = pTemp; } - taosThreadMutexDestroy(&pAllocator->mutex); + (void)taosThreadMutexDestroy(&pAllocator->mutex); taosMemoryFree(pAllocator); } @@ -219,10 +235,10 @@ void nodesDestroyAllocatorSet() { int64_t refId = 0; while (NULL != pAllocator) { refId = pAllocator->self; - taosRemoveRef(g_allocatorReqRefPool, refId); + (void)taosRemoveRef(g_allocatorReqRefPool, refId); pAllocator = taosIterateRef(g_allocatorReqRefPool, refId); } - taosCloseRef(g_allocatorReqRefPool); + (void)taosCloseRef(g_allocatorReqRefPool); } } @@ -269,7 +285,7 @@ int32_t nodesAcquireAllocator(int64_t allocatorId) { if (NULL == pAllocator) { return terrno; } - taosThreadMutexLock(&pAllocator->mutex); + (void)taosThreadMutexLock(&pAllocator->mutex); g_pNodeAllocator = pAllocator; return TSDB_CODE_SUCCESS; } @@ -288,7 +304,7 @@ int32_t nodesReleaseAllocator(int64_t allocatorId) { } SNodeAllocator* pAllocator = g_pNodeAllocator; g_pNodeAllocator = NULL; - taosThreadMutexUnlock(&pAllocator->mutex); + (void)taosThreadMutexUnlock(&pAllocator->mutex); return taosReleaseRef(g_allocatorReqRefPool, allocatorId); } @@ -312,205 +328,208 @@ void nodesDestroyAllocator(int64_t allocatorId) { return; } - taosRemoveRef(g_allocatorReqRefPool, allocatorId); + (void)taosRemoveRef(g_allocatorReqRefPool, allocatorId); } -static SNode* makeNode(ENodeType type, int32_t size) { - SNode* p = nodesCalloc(1, size); - if (NULL == p) { - return NULL; +static int32_t makeNode(ENodeType type, int32_t size, SNode** ppNode) { + SNode* p = NULL; + int32_t code = nodesCalloc(1, size, (void**)&p); + if (TSDB_CODE_SUCCESS == code) { + setNodeType(p, type); + *ppNode = p; } - setNodeType(p, type); - return p; + return code; } -SNode* nodesMakeNode(ENodeType type) { +int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) { + SNode* pNode = NULL; + int32_t code = 0; switch (type) { case QUERY_NODE_COLUMN: - return makeNode(type, sizeof(SColumnNode)); + code = makeNode(type, sizeof(SColumnNode), &pNode); break; case QUERY_NODE_VALUE: - return makeNode(type, sizeof(SValueNode)); + code = makeNode(type, sizeof(SValueNode), &pNode); break; case QUERY_NODE_OPERATOR: - return makeNode(type, sizeof(SOperatorNode)); + code = makeNode(type, sizeof(SOperatorNode), &pNode); break; case QUERY_NODE_LOGIC_CONDITION: - return makeNode(type, sizeof(SLogicConditionNode)); + code = makeNode(type, sizeof(SLogicConditionNode), &pNode); break; case QUERY_NODE_FUNCTION: - return makeNode(type, sizeof(SFunctionNode)); + code = makeNode(type, sizeof(SFunctionNode), &pNode); break; case QUERY_NODE_REAL_TABLE: - return makeNode(type, sizeof(SRealTableNode)); + code = makeNode(type, sizeof(SRealTableNode), &pNode); break; case QUERY_NODE_TEMP_TABLE: - return makeNode(type, sizeof(STempTableNode)); + code = makeNode(type, sizeof(STempTableNode), &pNode); break; case QUERY_NODE_JOIN_TABLE: - return makeNode(type, sizeof(SJoinTableNode)); + code = makeNode(type, sizeof(SJoinTableNode), &pNode); break; case QUERY_NODE_GROUPING_SET: - return makeNode(type, sizeof(SGroupingSetNode)); + code = makeNode(type, sizeof(SGroupingSetNode), &pNode); break; case QUERY_NODE_ORDER_BY_EXPR: - return makeNode(type, sizeof(SOrderByExprNode)); + code = makeNode(type, sizeof(SOrderByExprNode), &pNode); break; case QUERY_NODE_LIMIT: - return makeNode(type, sizeof(SLimitNode)); + code = makeNode(type, sizeof(SLimitNode), &pNode); break; case QUERY_NODE_STATE_WINDOW: - return makeNode(type, sizeof(SStateWindowNode)); + code = makeNode(type, sizeof(SStateWindowNode), &pNode); break; case QUERY_NODE_SESSION_WINDOW: - return makeNode(type, sizeof(SSessionWindowNode)); + code = makeNode(type, sizeof(SSessionWindowNode), &pNode); break; case QUERY_NODE_INTERVAL_WINDOW: - return makeNode(type, sizeof(SIntervalWindowNode)); + code = makeNode(type, sizeof(SIntervalWindowNode), &pNode); break; case QUERY_NODE_NODE_LIST: - return makeNode(type, sizeof(SNodeListNode)); + code = makeNode(type, sizeof(SNodeListNode), &pNode); break; case QUERY_NODE_FILL: - return makeNode(type, sizeof(SFillNode)); + code = makeNode(type, sizeof(SFillNode), &pNode); break; case QUERY_NODE_RAW_EXPR: - return makeNode(type, sizeof(SRawExprNode)); + code = makeNode(type, sizeof(SRawExprNode), &pNode); break; case QUERY_NODE_TARGET: - return makeNode(type, sizeof(STargetNode)); + code = makeNode(type, sizeof(STargetNode), &pNode); break; case QUERY_NODE_DATABLOCK_DESC: - return makeNode(type, sizeof(SDataBlockDescNode)); + code = makeNode(type, sizeof(SDataBlockDescNode), &pNode); break; case QUERY_NODE_SLOT_DESC: - return makeNode(type, sizeof(SSlotDescNode)); + code = makeNode(type, sizeof(SSlotDescNode), &pNode); break; case QUERY_NODE_COLUMN_DEF: - return makeNode(type, sizeof(SColumnDefNode)); + code = makeNode(type, sizeof(SColumnDefNode), &pNode); break; case QUERY_NODE_DOWNSTREAM_SOURCE: - return makeNode(type, sizeof(SDownstreamSourceNode)); + code = makeNode(type, sizeof(SDownstreamSourceNode), &pNode); break; case QUERY_NODE_DATABASE_OPTIONS: - return makeNode(type, sizeof(SDatabaseOptions)); + code = makeNode(type, sizeof(SDatabaseOptions), &pNode); break; case QUERY_NODE_TABLE_OPTIONS: - return makeNode(type, sizeof(STableOptions)); + code = makeNode(type, sizeof(STableOptions), &pNode); break; case QUERY_NODE_COLUMN_OPTIONS: - return makeNode(type, sizeof(SColumnOptions)); + code = makeNode(type, sizeof(SColumnOptions), &pNode); break; case QUERY_NODE_INDEX_OPTIONS: - return makeNode(type, sizeof(SIndexOptions)); + code = makeNode(type, sizeof(SIndexOptions), &pNode); break; case QUERY_NODE_EXPLAIN_OPTIONS: - return makeNode(type, sizeof(SExplainOptions)); + code = makeNode(type, sizeof(SExplainOptions), &pNode); break; case QUERY_NODE_STREAM_OPTIONS: - return makeNode(type, sizeof(SStreamOptions)); + code = makeNode(type, sizeof(SStreamOptions), &pNode); break; case QUERY_NODE_LEFT_VALUE: - return makeNode(type, sizeof(SLeftValueNode)); + code = makeNode(type, sizeof(SLeftValueNode), &pNode); break; case QUERY_NODE_COLUMN_REF: - return makeNode(type, sizeof(SColumnRefNode)); + code = makeNode(type, sizeof(SColumnRefNode), &pNode); break; case QUERY_NODE_WHEN_THEN: - return makeNode(type, sizeof(SWhenThenNode)); + code = makeNode(type, sizeof(SWhenThenNode), &pNode); break; case QUERY_NODE_CASE_WHEN: - return makeNode(type, sizeof(SCaseWhenNode)); + code = makeNode(type, sizeof(SCaseWhenNode), &pNode); break; case QUERY_NODE_EVENT_WINDOW: - return makeNode(type, sizeof(SEventWindowNode)); + code = makeNode(type, sizeof(SEventWindowNode), &pNode); break; case QUERY_NODE_COUNT_WINDOW: - return makeNode(type, sizeof(SCountWindowNode)); + code = makeNode(type, sizeof(SCountWindowNode), &pNode); break; case QUERY_NODE_HINT: - return makeNode(type, sizeof(SHintNode)); + code = makeNode(type, sizeof(SHintNode), &pNode); break; case QUERY_NODE_VIEW: - return makeNode(type, sizeof(SViewNode)); + code = makeNode(type, sizeof(SViewNode), &pNode); break; case QUERY_NODE_WINDOW_OFFSET: - return makeNode(type, sizeof(SWindowOffsetNode)); + code = makeNode(type, sizeof(SWindowOffsetNode), &pNode); break; case QUERY_NODE_SET_OPERATOR: - return makeNode(type, sizeof(SSetOperator)); + code = makeNode(type, sizeof(SSetOperator), &pNode); break; case QUERY_NODE_SELECT_STMT: - return makeNode(type, sizeof(SSelectStmt)); + code = makeNode(type, sizeof(SSelectStmt), &pNode); break; case QUERY_NODE_VNODE_MODIFY_STMT: - return makeNode(type, sizeof(SVnodeModifyOpStmt)); + code = makeNode(type, sizeof(SVnodeModifyOpStmt), &pNode); break; case QUERY_NODE_CREATE_DATABASE_STMT: - return makeNode(type, sizeof(SCreateDatabaseStmt)); + code = makeNode(type, sizeof(SCreateDatabaseStmt), &pNode); break; case QUERY_NODE_DROP_DATABASE_STMT: - return makeNode(type, sizeof(SDropDatabaseStmt)); + code = makeNode(type, sizeof(SDropDatabaseStmt), &pNode); break; case QUERY_NODE_ALTER_DATABASE_STMT: - return makeNode(type, sizeof(SAlterDatabaseStmt)); + code = makeNode(type, sizeof(SAlterDatabaseStmt), &pNode); break; case QUERY_NODE_FLUSH_DATABASE_STMT: - return makeNode(type, sizeof(SFlushDatabaseStmt)); + code = makeNode(type, sizeof(SFlushDatabaseStmt), &pNode); break; case QUERY_NODE_TRIM_DATABASE_STMT: - return makeNode(type, sizeof(STrimDatabaseStmt)); + code = makeNode(type, sizeof(STrimDatabaseStmt), &pNode); break; case QUERY_NODE_S3MIGRATE_DATABASE_STMT: - return makeNode(type, sizeof(SS3MigrateDatabaseStmt)); + code = makeNode(type, sizeof(SS3MigrateDatabaseStmt), &pNode); break; case QUERY_NODE_CREATE_TABLE_STMT: - return makeNode(type, sizeof(SCreateTableStmt)); + code = makeNode(type, sizeof(SCreateTableStmt), &pNode); break; case QUERY_NODE_CREATE_SUBTABLE_CLAUSE: - return makeNode(type, sizeof(SCreateSubTableClause)); + code = makeNode(type, sizeof(SCreateSubTableClause), &pNode); break; case QUERY_NODE_CREATE_SUBTABLE_FROM_FILE_CLAUSE: - return makeNode(type, sizeof(SCreateSubTableFromFileClause)); + code = makeNode(type, sizeof(SCreateSubTableFromFileClause), &pNode); break; case QUERY_NODE_CREATE_MULTI_TABLES_STMT: - return makeNode(type, sizeof(SCreateMultiTablesStmt)); + code = makeNode(type, sizeof(SCreateMultiTablesStmt), &pNode); break; case QUERY_NODE_DROP_TABLE_CLAUSE: - return makeNode(type, sizeof(SDropTableClause)); + code = makeNode(type, sizeof(SDropTableClause), &pNode); break; case QUERY_NODE_DROP_TABLE_STMT: - return makeNode(type, sizeof(SDropTableStmt)); + code = makeNode(type, sizeof(SDropTableStmt), &pNode); break; case QUERY_NODE_DROP_SUPER_TABLE_STMT: - return makeNode(type, sizeof(SDropSuperTableStmt)); + code = makeNode(type, sizeof(SDropSuperTableStmt), &pNode); break; case QUERY_NODE_ALTER_TABLE_STMT: case QUERY_NODE_ALTER_SUPER_TABLE_STMT: - return makeNode(type, sizeof(SAlterTableStmt)); + code = makeNode(type, sizeof(SAlterTableStmt), &pNode); break; case QUERY_NODE_CREATE_USER_STMT: - return makeNode(type, sizeof(SCreateUserStmt)); + code = makeNode(type, sizeof(SCreateUserStmt), &pNode); break; case QUERY_NODE_ALTER_USER_STMT: - return makeNode(type, sizeof(SAlterUserStmt)); + code = makeNode(type, sizeof(SAlterUserStmt), &pNode); break; case QUERY_NODE_DROP_USER_STMT: - return makeNode(type, sizeof(SDropUserStmt)); + code = makeNode(type, sizeof(SDropUserStmt), &pNode); break; case QUERY_NODE_USE_DATABASE_STMT: - return makeNode(type, sizeof(SUseDatabaseStmt)); + code = makeNode(type, sizeof(SUseDatabaseStmt), &pNode); break; case QUERY_NODE_CREATE_DNODE_STMT: - return makeNode(type, sizeof(SCreateDnodeStmt)); + code = makeNode(type, sizeof(SCreateDnodeStmt), &pNode); break; case QUERY_NODE_DROP_DNODE_STMT: - return makeNode(type, sizeof(SDropDnodeStmt)); + code = makeNode(type, sizeof(SDropDnodeStmt), &pNode); break; case QUERY_NODE_ALTER_DNODE_STMT: - return makeNode(type, sizeof(SAlterDnodeStmt)); + code = makeNode(type, sizeof(SAlterDnodeStmt), &pNode); break; case QUERY_NODE_CREATE_INDEX_STMT: - return makeNode(type, sizeof(SCreateIndexStmt)); + code = makeNode(type, sizeof(SCreateIndexStmt), &pNode); break; case QUERY_NODE_DROP_INDEX_STMT: - return makeNode(type, sizeof(SDropIndexStmt)); + code = makeNode(type, sizeof(SDropIndexStmt), &pNode); break; case QUERY_NODE_CREATE_QNODE_STMT: case QUERY_NODE_CREATE_BNODE_STMT: case QUERY_NODE_CREATE_SNODE_STMT: case QUERY_NODE_CREATE_MNODE_STMT: - return makeNode(type, sizeof(SCreateComponentNodeStmt)); + code = makeNode(type, sizeof(SCreateComponentNodeStmt), &pNode); break; case QUERY_NODE_DROP_QNODE_STMT: case QUERY_NODE_DROP_BNODE_STMT: case QUERY_NODE_DROP_SNODE_STMT: case QUERY_NODE_DROP_MNODE_STMT: - return makeNode(type, sizeof(SDropComponentNodeStmt)); + code = makeNode(type, sizeof(SDropComponentNodeStmt), &pNode); break; case QUERY_NODE_CREATE_TOPIC_STMT: - return makeNode(type, sizeof(SCreateTopicStmt)); + code = makeNode(type, sizeof(SCreateTopicStmt), &pNode); break; case QUERY_NODE_DROP_TOPIC_STMT: - return makeNode(type, sizeof(SDropTopicStmt)); + code = makeNode(type, sizeof(SDropTopicStmt), &pNode); break; case QUERY_NODE_DROP_CGROUP_STMT: - return makeNode(type, sizeof(SDropCGroupStmt)); + code = makeNode(type, sizeof(SDropCGroupStmt), &pNode); break; case QUERY_NODE_ALTER_LOCAL_STMT: - return makeNode(type, sizeof(SAlterLocalStmt)); + code = makeNode(type, sizeof(SAlterLocalStmt), &pNode); break; case QUERY_NODE_EXPLAIN_STMT: - return makeNode(type, sizeof(SExplainStmt)); + code = makeNode(type, sizeof(SExplainStmt), &pNode); break; case QUERY_NODE_DESCRIBE_STMT: - return makeNode(type, sizeof(SDescribeStmt)); + code = makeNode(type, sizeof(SDescribeStmt), &pNode); break; case QUERY_NODE_RESET_QUERY_CACHE_STMT: - return makeNode(type, sizeof(SNode)); + code = makeNode(type, sizeof(SNode), &pNode); break; case QUERY_NODE_COMPACT_DATABASE_STMT: - return makeNode(type, sizeof(SCompactDatabaseStmt)); + code = makeNode(type, sizeof(SCompactDatabaseStmt), &pNode); break; case QUERY_NODE_CREATE_FUNCTION_STMT: - return makeNode(type, sizeof(SCreateFunctionStmt)); + code = makeNode(type, sizeof(SCreateFunctionStmt), &pNode); break; case QUERY_NODE_DROP_FUNCTION_STMT: - return makeNode(type, sizeof(SDropFunctionStmt)); + code = makeNode(type, sizeof(SDropFunctionStmt), &pNode); break; case QUERY_NODE_CREATE_STREAM_STMT: - return makeNode(type, sizeof(SCreateStreamStmt)); + code = makeNode(type, sizeof(SCreateStreamStmt), &pNode); break; case QUERY_NODE_DROP_STREAM_STMT: - return makeNode(type, sizeof(SDropStreamStmt)); + code = makeNode(type, sizeof(SDropStreamStmt), &pNode); break; case QUERY_NODE_PAUSE_STREAM_STMT: - return makeNode(type, sizeof(SPauseStreamStmt)); + code = makeNode(type, sizeof(SPauseStreamStmt), &pNode); break; case QUERY_NODE_RESUME_STREAM_STMT: - return makeNode(type, sizeof(SResumeStreamStmt)); + code = makeNode(type, sizeof(SResumeStreamStmt), &pNode); break; case QUERY_NODE_BALANCE_VGROUP_STMT: - return makeNode(type, sizeof(SBalanceVgroupStmt)); + code = makeNode(type, sizeof(SBalanceVgroupStmt), &pNode); break; case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT: - return makeNode(type, sizeof(SBalanceVgroupLeaderStmt)); + code = makeNode(type, sizeof(SBalanceVgroupLeaderStmt), &pNode); break; case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT: - return makeNode(type, sizeof(SBalanceVgroupLeaderStmt)); + code = makeNode(type, sizeof(SBalanceVgroupLeaderStmt), &pNode); break; case QUERY_NODE_MERGE_VGROUP_STMT: - return makeNode(type, sizeof(SMergeVgroupStmt)); + code = makeNode(type, sizeof(SMergeVgroupStmt), &pNode); break; case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT: - return makeNode(type, sizeof(SRedistributeVgroupStmt)); + code = makeNode(type, sizeof(SRedistributeVgroupStmt), &pNode); break; case QUERY_NODE_SPLIT_VGROUP_STMT: - return makeNode(type, sizeof(SSplitVgroupStmt)); + code = makeNode(type, sizeof(SSplitVgroupStmt), &pNode); break; case QUERY_NODE_SYNCDB_STMT: break; case QUERY_NODE_GRANT_STMT: - return makeNode(type, sizeof(SGrantStmt)); + code = makeNode(type, sizeof(SGrantStmt), &pNode); break; case QUERY_NODE_REVOKE_STMT: - return makeNode(type, sizeof(SRevokeStmt)); + code = makeNode(type, sizeof(SRevokeStmt), &pNode); break; case QUERY_NODE_ALTER_CLUSTER_STMT: - return makeNode(type, sizeof(SAlterClusterStmt)); + code = makeNode(type, sizeof(SAlterClusterStmt), &pNode); break; case QUERY_NODE_SHOW_DNODES_STMT: case QUERY_NODE_SHOW_MNODES_STMT: case QUERY_NODE_SHOW_MODULES_STMT: @@ -548,186 +567,189 @@ SNode* nodesMakeNode(ENodeType type) { case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT: case QUERY_NODE_SHOW_ENCRYPTIONS_STMT: case QUERY_NODE_SHOW_TSMAS_STMT: - return makeNode(type, sizeof(SShowStmt)); + code = makeNode(type, sizeof(SShowStmt), &pNode); break; case QUERY_NODE_SHOW_TABLE_TAGS_STMT: - return makeNode(type, sizeof(SShowTableTagsStmt)); + code = makeNode(type, sizeof(SShowTableTagsStmt), &pNode); break; case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT: - return makeNode(type, sizeof(SShowDnodeVariablesStmt)); + code = makeNode(type, sizeof(SShowDnodeVariablesStmt), &pNode); break; case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: - return makeNode(type, sizeof(SShowCreateDatabaseStmt)); + code = makeNode(type, sizeof(SShowCreateDatabaseStmt), &pNode); break; case QUERY_NODE_SHOW_DB_ALIVE_STMT: case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT: - return makeNode(type, sizeof(SShowAliveStmt)); + code = makeNode(type, sizeof(SShowAliveStmt), &pNode); break; case QUERY_NODE_SHOW_CREATE_TABLE_STMT: case QUERY_NODE_SHOW_CREATE_STABLE_STMT: - return makeNode(type, sizeof(SShowCreateTableStmt)); + code = makeNode(type, sizeof(SShowCreateTableStmt), &pNode); break; case QUERY_NODE_SHOW_CREATE_VIEW_STMT: - return makeNode(type, sizeof(SShowCreateViewStmt)); + code = makeNode(type, sizeof(SShowCreateViewStmt), &pNode); break; case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: - return makeNode(type, sizeof(SShowTableDistributedStmt)); + code = makeNode(type, sizeof(SShowTableDistributedStmt), &pNode); break; case QUERY_NODE_SHOW_COMPACTS_STMT: - return makeNode(type, sizeof(SShowCompactsStmt)); + code = makeNode(type, sizeof(SShowCompactsStmt), &pNode); break; case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: - return makeNode(type, sizeof(SShowCompactDetailsStmt)); + code = makeNode(type, sizeof(SShowCompactDetailsStmt), &pNode); break; case QUERY_NODE_KILL_QUERY_STMT: - return makeNode(type, sizeof(SKillQueryStmt)); + code = makeNode(type, sizeof(SKillQueryStmt), &pNode); break; case QUERY_NODE_KILL_TRANSACTION_STMT: case QUERY_NODE_KILL_CONNECTION_STMT: case QUERY_NODE_KILL_COMPACT_STMT: - return makeNode(type, sizeof(SKillStmt)); + code = makeNode(type, sizeof(SKillStmt), &pNode); break; case QUERY_NODE_DELETE_STMT: - return makeNode(type, sizeof(SDeleteStmt)); + code = makeNode(type, sizeof(SDeleteStmt), &pNode); break; case QUERY_NODE_INSERT_STMT: - return makeNode(type, sizeof(SInsertStmt)); + code = makeNode(type, sizeof(SInsertStmt), &pNode); break; case QUERY_NODE_QUERY: - return makeNode(type, sizeof(SQuery)); + code = makeNode(type, sizeof(SQuery), &pNode); break; case QUERY_NODE_RESTORE_DNODE_STMT: case QUERY_NODE_RESTORE_QNODE_STMT: case QUERY_NODE_RESTORE_MNODE_STMT: case QUERY_NODE_RESTORE_VNODE_STMT: - return makeNode(type, sizeof(SRestoreComponentNodeStmt)); + code = makeNode(type, sizeof(SRestoreComponentNodeStmt), &pNode); break; case QUERY_NODE_CREATE_VIEW_STMT: - return makeNode(type, sizeof(SCreateViewStmt)); + code = makeNode(type, sizeof(SCreateViewStmt), &pNode); break; case QUERY_NODE_DROP_VIEW_STMT: - return makeNode(type, sizeof(SDropViewStmt)); + code = makeNode(type, sizeof(SDropViewStmt), &pNode); break; case QUERY_NODE_CREATE_TSMA_STMT: - return makeNode(type, sizeof(SCreateTSMAStmt)); + code = makeNode(type, sizeof(SCreateTSMAStmt), &pNode); break; case QUERY_NODE_DROP_TSMA_STMT: - return makeNode(type, sizeof(SDropTSMAStmt)); + code = makeNode(type, sizeof(SDropTSMAStmt), &pNode); break; case QUERY_NODE_TSMA_OPTIONS: - return makeNode(type, sizeof(STSMAOptions)); + code = makeNode(type, sizeof(STSMAOptions), &pNode); break; case QUERY_NODE_LOGIC_PLAN_SCAN: - return makeNode(type, sizeof(SScanLogicNode)); + code = makeNode(type, sizeof(SScanLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_JOIN: - return makeNode(type, sizeof(SJoinLogicNode)); + code = makeNode(type, sizeof(SJoinLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_AGG: - return makeNode(type, sizeof(SAggLogicNode)); + code = makeNode(type, sizeof(SAggLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_PROJECT: - return makeNode(type, sizeof(SProjectLogicNode)); + code = makeNode(type, sizeof(SProjectLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY: - return makeNode(type, sizeof(SVnodeModifyLogicNode)); + code = makeNode(type, sizeof(SVnodeModifyLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_EXCHANGE: - return makeNode(type, sizeof(SExchangeLogicNode)); + code = makeNode(type, sizeof(SExchangeLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_MERGE: - return makeNode(type, sizeof(SMergeLogicNode)); + code = makeNode(type, sizeof(SMergeLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_WINDOW: - return makeNode(type, sizeof(SWindowLogicNode)); + code = makeNode(type, sizeof(SWindowLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_FILL: - return makeNode(type, sizeof(SFillLogicNode)); + code = makeNode(type, sizeof(SFillLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_SORT: - return makeNode(type, sizeof(SSortLogicNode)); + code = makeNode(type, sizeof(SSortLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_PARTITION: - return makeNode(type, sizeof(SPartitionLogicNode)); + code = makeNode(type, sizeof(SPartitionLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC: - return makeNode(type, sizeof(SIndefRowsFuncLogicNode)); + code = makeNode(type, sizeof(SIndefRowsFuncLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC: - return makeNode(type, sizeof(SInterpFuncLogicNode)); + code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE: - return makeNode(type, sizeof(SGroupCacheLogicNode)); + code = makeNode(type, sizeof(SGroupCacheLogicNode), &pNode); break; case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL: - return makeNode(type, sizeof(SDynQueryCtrlLogicNode)); + code = makeNode(type, sizeof(SDynQueryCtrlLogicNode), &pNode); break; case QUERY_NODE_LOGIC_SUBPLAN: - return makeNode(type, sizeof(SLogicSubplan)); + code = makeNode(type, sizeof(SLogicSubplan), &pNode); break; case QUERY_NODE_LOGIC_PLAN: - return makeNode(type, sizeof(SQueryLogicPlan)); + code = makeNode(type, sizeof(SQueryLogicPlan), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN: - return makeNode(type, sizeof(STagScanPhysiNode)); + code = makeNode(type, sizeof(STagScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: - return makeNode(type, sizeof(STableScanPhysiNode)); + code = makeNode(type, sizeof(STableScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN: - return makeNode(type, sizeof(STableSeqScanPhysiNode)); + code = makeNode(type, sizeof(STableSeqScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN: - return makeNode(type, sizeof(STableMergeScanPhysiNode)); + code = makeNode(type, sizeof(STableMergeScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: - return makeNode(type, sizeof(SStreamScanPhysiNode)); + code = makeNode(type, sizeof(SStreamScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN: - return makeNode(type, sizeof(SSystemTableScanPhysiNode)); + code = makeNode(type, sizeof(SSystemTableScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: - return makeNode(type, sizeof(SBlockDistScanPhysiNode)); + code = makeNode(type, sizeof(SBlockDistScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: - return makeNode(type, sizeof(SLastRowScanPhysiNode)); + code = makeNode(type, sizeof(SLastRowScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: - return makeNode(type, sizeof(STableCountScanPhysiNode)); + code = makeNode(type, sizeof(STableCountScanPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_PROJECT: - return makeNode(type, sizeof(SProjectPhysiNode)); + code = makeNode(type, sizeof(SProjectPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: - return makeNode(type, sizeof(SSortMergeJoinPhysiNode)); + code = makeNode(type, sizeof(SSortMergeJoinPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN: - return makeNode(type, sizeof(SHashJoinPhysiNode)); + code = makeNode(type, sizeof(SHashJoinPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: - return makeNode(type, sizeof(SAggPhysiNode)); + code = makeNode(type, sizeof(SAggPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: - return makeNode(type, sizeof(SExchangePhysiNode)); + code = makeNode(type, sizeof(SExchangePhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE: - return makeNode(type, sizeof(SMergePhysiNode)); + code = makeNode(type, sizeof(SMergePhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_SORT: - return makeNode(type, sizeof(SSortPhysiNode)); + code = makeNode(type, sizeof(SSortPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: - return makeNode(type, sizeof(SGroupSortPhysiNode)); + code = makeNode(type, sizeof(SGroupSortPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL: - return makeNode(type, sizeof(SIntervalPhysiNode)); + code = makeNode(type, sizeof(SIntervalPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: - return makeNode(type, sizeof(SMergeAlignedIntervalPhysiNode)); + code = makeNode(type, sizeof(SMergeAlignedIntervalPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL: - return makeNode(type, sizeof(SStreamIntervalPhysiNode)); + code = makeNode(type, sizeof(SStreamIntervalPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL: - return makeNode(type, sizeof(SStreamFinalIntervalPhysiNode)); + code = makeNode(type, sizeof(SStreamFinalIntervalPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL: - return makeNode(type, sizeof(SStreamSemiIntervalPhysiNode)); + code = makeNode(type, sizeof(SStreamSemiIntervalPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_MID_INTERVAL: - return makeNode(type, sizeof(SStreamMidIntervalPhysiNode)); + code = makeNode(type, sizeof(SStreamMidIntervalPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_FILL: case QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL: - return makeNode(type, sizeof(SFillPhysiNode)); + code = makeNode(type, sizeof(SFillPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION: - return makeNode(type, sizeof(SSessionWinodwPhysiNode)); + code = makeNode(type, sizeof(SSessionWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION: - return makeNode(type, sizeof(SStreamSessionWinodwPhysiNode)); + code = makeNode(type, sizeof(SStreamSessionWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION: - return makeNode(type, sizeof(SStreamSemiSessionWinodwPhysiNode)); + code = makeNode(type, sizeof(SStreamSemiSessionWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION: - return makeNode(type, sizeof(SStreamFinalSessionWinodwPhysiNode)); + code = makeNode(type, sizeof(SStreamFinalSessionWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE: - return makeNode(type, sizeof(SStateWinodwPhysiNode)); + code = makeNode(type, sizeof(SStateWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE: - return makeNode(type, sizeof(SStreamStateWinodwPhysiNode)); + code = makeNode(type, sizeof(SStreamStateWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT: - return makeNode(type, sizeof(SEventWinodwPhysiNode)); + code = makeNode(type, sizeof(SEventWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_EVENT: - return makeNode(type, sizeof(SStreamEventWinodwPhysiNode)); + code = makeNode(type, sizeof(SStreamEventWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT: - return makeNode(type, sizeof(SCountWinodwPhysiNode)); + code = makeNode(type, sizeof(SCountWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT: - return makeNode(type, sizeof(SStreamCountWinodwPhysiNode)); + code = makeNode(type, sizeof(SStreamCountWinodwPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_PARTITION: - return makeNode(type, sizeof(SPartitionPhysiNode)); + code = makeNode(type, sizeof(SPartitionPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION: - return makeNode(type, sizeof(SStreamPartitionPhysiNode)); + code = makeNode(type, sizeof(SStreamPartitionPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: - return makeNode(type, sizeof(SIndefRowsFuncPhysiNode)); + code = makeNode(type, sizeof(SIndefRowsFuncPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: - return makeNode(type, sizeof(SInterpFuncLogicNode)); + code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_DISPATCH: - return makeNode(type, sizeof(SDataDispatcherNode)); + code = makeNode(type, sizeof(SDataDispatcherNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_INSERT: - return makeNode(type, sizeof(SDataInserterNode)); + code = makeNode(type, sizeof(SDataInserterNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: - return makeNode(type, sizeof(SQueryInserterNode)); + code = makeNode(type, sizeof(SQueryInserterNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_DELETE: - return makeNode(type, sizeof(SDataDeleterNode)); + code = makeNode(type, sizeof(SDataDeleterNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE: - return makeNode(type, sizeof(SGroupCachePhysiNode)); + code = makeNode(type, sizeof(SGroupCachePhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL: - return makeNode(type, sizeof(SDynQueryCtrlPhysiNode)); + code = makeNode(type, sizeof(SDynQueryCtrlPhysiNode), &pNode); break; case QUERY_NODE_PHYSICAL_SUBPLAN: - return makeNode(type, sizeof(SSubplan)); + code = makeNode(type, sizeof(SSubplan), &pNode); break; case QUERY_NODE_PHYSICAL_PLAN: - return makeNode(type, sizeof(SQueryPlan)); + code = makeNode(type, sizeof(SQueryPlan), &pNode); break; default: break; } - nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type)); - return NULL; + if (TSDB_CODE_SUCCESS != code) + nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type)); + else + *ppNodeOut = pNode; + return code; } static void destroyVgDataBlockArray(SArray* pArray) { @@ -1068,7 +1090,7 @@ void nodesDestroyNode(SNode* pNode) { pStmt->destroyParseFileCxt(&pStmt->pParFileCxt); } - taosCloseFile(&pStmt->fp); + assert(TSDB_CODE_SUCCESS == taosCloseFile(&pStmt->fp)); break; } case QUERY_NODE_CREATE_DATABASE_STMT: @@ -1713,22 +1735,23 @@ void nodesDestroyNode(SNode* pNode) { return; } -SNodeList* nodesMakeList() { - SNodeList* p = nodesCalloc(1, sizeof(SNodeList)); - if (NULL == p) { - return NULL; +int32_t nodesMakeList(SNodeList** ppListOut) { + SNodeList* p = NULL; + int32_t code = nodesCalloc(1, sizeof(SNodeList), (void**)&p); + if (TSDB_CODE_SUCCESS == code) { + *ppListOut = p; } - return p; + return code; } int32_t nodesListAppend(SNodeList* pList, SNode* pNode) { if (NULL == pList || NULL == pNode) { return TSDB_CODE_FAILED; } - SListCell* p = nodesCalloc(1, sizeof(SListCell)); - if (NULL == p) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + SListCell* p = NULL; + int32_t code = nodesCalloc(1, sizeof(SListCell), (void**)&p); + if (TSDB_CODE_SUCCESS != code) { + return code; } p->pNode = pNode; if (NULL == pList->pHead) { @@ -1745,8 +1768,7 @@ int32_t nodesListAppend(SNodeList* pList, SNode* pNode) { int32_t nodesListStrictAppend(SNodeList* pList, SNode* pNode) { if (NULL == pNode) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + return TSDB_CODE_INVALID_PARA; } int32_t code = nodesListAppend(pList, pNode); if (TSDB_CODE_SUCCESS != code) { @@ -1757,10 +1779,9 @@ int32_t nodesListStrictAppend(SNodeList* pList, SNode* pNode) { int32_t nodesListMakeAppend(SNodeList** pList, SNode* pNode) { if (NULL == *pList) { - *pList = nodesMakeList(); + int32_t code = nodesMakeList(pList); if (NULL == *pList) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } return nodesListAppend(*pList, pNode); @@ -1768,10 +1789,9 @@ int32_t nodesListMakeAppend(SNodeList** pList, SNode* pNode) { int32_t nodesListMakeStrictAppend(SNodeList** pList, SNode* pNode) { if (NULL == *pList) { - *pList = nodesMakeList(); + int32_t code = nodesMakeList(pList); if (NULL == *pList) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } return nodesListStrictAppend(*pList, pNode); @@ -1811,10 +1831,9 @@ int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc) { int32_t nodesListMakeStrictAppendList(SNodeList** pTarget, SNodeList* pSrc) { if (NULL == *pTarget) { - *pTarget = nodesMakeList(); + int32_t code = nodesMakeList(pTarget); if (NULL == *pTarget) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } return nodesListStrictAppendList(*pTarget, pSrc); @@ -1822,10 +1841,9 @@ int32_t nodesListMakeStrictAppendList(SNodeList** pTarget, SNodeList* pSrc) { int32_t nodesListMakePushFront(SNodeList** pList, SNode* pNode) { if (*pList == NULL) { - *pList = nodesMakeList(); + int32_t code = nodesMakeList(pList); if (*pList == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } return nodesListPushFront(*pList, pNode); @@ -1835,10 +1853,10 @@ int32_t nodesListPushFront(SNodeList* pList, SNode* pNode) { if (NULL == pList || NULL == pNode) { return TSDB_CODE_FAILED; } - SListCell* p = nodesCalloc(1, sizeof(SListCell)); - if (NULL == p) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return TSDB_CODE_OUT_OF_MEMORY; + SListCell* p = NULL; + int32_t code = nodesCalloc(1, sizeof(SListCell), (void**)&p); + if (TSDB_CODE_SUCCESS != code) { + return code; } p->pNode = pNode; if (NULL != pList->pHead) { @@ -2245,7 +2263,11 @@ static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pN if (NULL == taosHashGet(pCxt->pColHash, name, len)) { pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, NULL, 0); if (TSDB_CODE_SUCCESS == pCxt->errCode) { - pCxt->errCode = nodesListStrictAppend(pCxt->pCols, nodesCloneNode(pNode)); + SNode* pNew = NULL; + pCxt->errCode = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == pCxt->errCode) { + pCxt->errCode = nodesListStrictAppend(pCxt->pCols, pNew); + } } return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR); } @@ -2288,12 +2310,18 @@ int32_t nodesCollectColumns(SSelectStmt* pSelect, ESqlClause clause, const char* if (NULL == pSelect || NULL == pCols) { return TSDB_CODE_FAILED; } - + SNodeList * pList = NULL; + if (!*pCols) { + int32_t code = nodesMakeList(&pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + } SCollectColumnsCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pTableAlias = pTableAlias, .collectType = type, - .pCols = (NULL == *pCols ? nodesMakeList() : *pCols), + .pCols = (NULL == *pCols ? pList : *pCols), .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)}; if (NULL == cxt.pCols || NULL == cxt.pColHash) { return TSDB_CODE_OUT_OF_MEMORY; @@ -2320,12 +2348,20 @@ int32_t nodesCollectColumnsExt(SSelectStmt* pSelect, ESqlClause clause, SSHashOb return TSDB_CODE_FAILED; } + SNodeList * pList = NULL; + if (!*pCols) { + int32_t code = nodesMakeList(&pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + } + SCollectColumnsCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pTableAlias = NULL, .pMultiTableAlias = pMultiTableAlias, .collectType = type, - .pCols = (NULL == *pCols ? nodesMakeList() : *pCols), + .pCols = (NULL == *pCols ? pList : *pCols), .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)}; if (NULL == cxt.pCols || NULL == cxt.pColHash) { return TSDB_CODE_OUT_OF_MEMORY; @@ -2350,11 +2386,19 @@ int32_t nodesCollectColumnsFromNode(SNode* node, const char* pTableAlias, EColle if (NULL == pCols) { return TSDB_CODE_FAILED; } + SNodeList * pList = NULL; + if (!*pCols) { + int32_t code = nodesMakeList(&pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + } + SCollectColumnsCxt cxt = { .errCode = TSDB_CODE_SUCCESS, .pTableAlias = pTableAlias, .collectType = type, - .pCols = (NULL == *pCols ? nodesMakeList() : *pCols), + .pCols = (NULL == *pCols ? pList : *pCols), .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)}; if (NULL == cxt.pCols || NULL == cxt.pColHash) { return TSDB_CODE_OUT_OF_MEMORY; @@ -2405,7 +2449,11 @@ static EDealRes collectFuncs(SNode* pNode, void* pContext) { } } if (!bFound) { - pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, nodesCloneNode(pNode)); + SNode* pNew = NULL; + pCxt->errCode = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == pCxt->errCode) { + pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, pNew); + } } return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR); } @@ -2442,11 +2490,17 @@ int32_t nodesCollectFuncs(SSelectStmt* pSelect, ESqlClause clause, char* tableAl if (NULL == pSelect || NULL == pFuncs) { return TSDB_CODE_FAILED; } - + SNodeList* pList = NULL; + if (!*pFuncs) { + int32_t code = nodesMakeList(&pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + } SCollectFuncsCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .classifier = classifier, .tableAlias = tableAlias, - .pFuncs = (NULL == *pFuncs ? nodesMakeList() : *pFuncs)}; + .pFuncs = (NULL == *pFuncs ? pList : *pFuncs)}; if (NULL == cxt.pFuncs) { return TSDB_CODE_OUT_OF_MEMORY; } @@ -2474,30 +2528,37 @@ typedef struct SCollectSpecialNodesCxt { static EDealRes collectSpecialNodes(SNode* pNode, void* pContext) { SCollectSpecialNodesCxt* pCxt = (SCollectSpecialNodesCxt*)pContext; if (pCxt->type == nodeType(pNode)) { - pCxt->errCode = nodesListStrictAppend(pCxt->pNodes, nodesCloneNode(pNode)); + SNode* pNew = NULL; + pCxt->errCode = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == pCxt->errCode) { + pCxt->errCode = nodesListStrictAppend(pCxt->pNodes, pNew); + } return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR); } return DEAL_RES_CONTINUE; } -int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** pNodes) { - if (NULL == pSelect || NULL == pNodes) { +int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** ppNodes) { + if (NULL == pSelect || NULL == ppNodes) { return TSDB_CODE_FAILED; } - - SCollectSpecialNodesCxt cxt = { - .errCode = TSDB_CODE_SUCCESS, .type = type, .pNodes = (NULL == *pNodes ? nodesMakeList() : *pNodes)}; - if (NULL == cxt.pNodes) { - return TSDB_CODE_OUT_OF_MEMORY; + SCollectSpecialNodesCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .type = type, .pNodes = NULL}; + if (!*ppNodes) { + cxt.errCode = nodesMakeList(&cxt.pNodes); + } else { + cxt.pNodes = *ppNodes; } - *pNodes = NULL; + if (NULL == cxt.pNodes) { + return cxt.errCode; + } + *ppNodes = NULL; nodesWalkSelectStmt(pSelect, SQL_CLAUSE_GROUP_BY, collectSpecialNodes, &cxt); if (TSDB_CODE_SUCCESS != cxt.errCode) { nodesDestroyList(cxt.pNodes); return cxt.errCode; } if (LIST_LENGTH(cxt.pNodes) > 0) { - *pNodes = cxt.pNodes; + *ppNodes = cxt.pNodes; } else { nodesDestroyList(cxt.pNodes); } @@ -2640,9 +2701,10 @@ int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc) { *pDst = nodesListGetNode(*pSrc, 0); nodesClearList(*pSrc); } else { - SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); - if (NULL == pLogicCond) { - return TSDB_CODE_OUT_OF_MEMORY; + SLogicConditionNode* pLogicCond = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond); + if (TSDB_CODE_SUCCESS != code) { + return code; } pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; @@ -2671,15 +2733,16 @@ const char* dataOrderStr(EDataOrderLevel order) { return "unknown"; } -SValueNode* nodesMakeValueNodeFromString(char* literal) { +int32_t nodesMakeValueNodeFromString(char* literal, SValueNode** ppValNode) { int32_t lenStr = strlen(literal); - SValueNode* pValNode = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pValNode = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode); if (pValNode) { pValNode->node.resType.type = TSDB_DATA_TYPE_VARCHAR; pValNode->node.resType.bytes = lenStr + VARSTR_HEADER_SIZE; char* p = taosMemoryMalloc(lenStr + 1 + VARSTR_HEADER_SIZE); if (p == NULL) { - return NULL; + return TSDB_CODE_OUT_OF_MEMORY; } varDataSetLen(p, lenStr); memcpy(varDataVal(p), literal, lenStr + 1); @@ -2687,32 +2750,45 @@ SValueNode* nodesMakeValueNodeFromString(char* literal) { pValNode->literal = tstrdup(literal); pValNode->translate = true; pValNode->isNull = false; + *ppValNode = pValNode; } - return pValNode; + return code; } -SValueNode* nodesMakeValueNodeFromBool(bool b) { - SValueNode* pValNode = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (pValNode) { +int32_t nodesMakeValueNodeFromBool(bool b, SValueNode** ppValNode) { + SValueNode* pValNode = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode); + if (TSDB_CODE_SUCCESS == code) { pValNode->node.resType.type = TSDB_DATA_TYPE_BOOL; pValNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; - nodesSetValueNodeValue(pValNode, &b); - pValNode->translate = true; - pValNode->isNull = false; + code = nodesSetValueNodeValue(pValNode, &b); + if (TSDB_CODE_SUCCESS == code) { + pValNode->translate = true; + pValNode->isNull = false; + *ppValNode = pValNode; + } else { + nodesDestroyNode((SNode*)pValNode); + } } - return pValNode; + return code; } -SNode* nodesMakeValueNodeFromInt32(int32_t value) { - SValueNode* pValNode = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (pValNode) { +int32_t nodesMakeValueNodeFromInt32(int32_t value, SNode** ppNode) { + SValueNode* pValNode = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode); + if (TSDB_CODE_SUCCESS == code) { pValNode->node.resType.type = TSDB_DATA_TYPE_INT; pValNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes; - nodesSetValueNodeValue(pValNode, &value); - pValNode->translate = true; - pValNode->isNull = false; + code = nodesSetValueNodeValue(pValNode, &value); + if (TSDB_CODE_SUCCESS == code) { + pValNode->translate = true; + pValNode->isNull = false; + *ppNode = (SNode*)pValNode; + } else { + nodesDestroyNode((SNode*)pValNode); + } } - return (SNode*)pValNode; + return code; } bool nodesIsStar(SNode* pNode) { diff --git a/source/libs/nodes/test/nodesCloneTest.cpp b/source/libs/nodes/test/nodesCloneTest.cpp index 8b8893d317..75a4f6c66f 100644 --- a/source/libs/nodes/test/nodesCloneTest.cpp +++ b/source/libs/nodes/test/nodesCloneTest.cpp @@ -24,7 +24,9 @@ class NodesCloneTest : public testing::Test { void registerCheckFunc(const std::function& func) { checkFunc_ = func; } void run(const SNode* pSrc) { - std::unique_ptr pDst(nodesCloneNode(pSrc), nodesDestroyNode); + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pSrc, &pNew); + std::unique_ptr pDst(pNew, nodesDestroyNode); checkFunc_(pSrc, pDst.get()); } @@ -43,9 +45,13 @@ TEST_F(NodesCloneTest, tempTable) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_TEMP_TABLE)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_TEMP_TABLE, &pNew); + srcNode.reset(pNew); STempTableNode* pNode = (STempTableNode*)srcNode.get(); - pNode->pSubquery = nodesMakeNode(QUERY_NODE_SELECT_STMT); + pNew = NULL; + code = nodesMakeNode(QUERY_NODE_SELECT_STMT, &pNew); + pNode->pSubquery = pNew; return srcNode.get(); }()); } @@ -66,12 +72,14 @@ TEST_F(NodesCloneTest, joinTable) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_JOIN_TABLE)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_JOIN_TABLE, &pNew); + srcNode.reset(pNew); SJoinTableNode* pNode = (SJoinTableNode*)srcNode.get(); pNode->joinType = JOIN_TYPE_INNER; - pNode->pLeft = nodesMakeNode(QUERY_NODE_REAL_TABLE); - pNode->pRight = nodesMakeNode(QUERY_NODE_REAL_TABLE); - pNode->pOnCond = nodesMakeNode(QUERY_NODE_OPERATOR); + code = nodesMakeNode(QUERY_NODE_REAL_TABLE, &pNode->pLeft); + code = nodesMakeNode(QUERY_NODE_REAL_TABLE, &pNode->pRight); + code = nodesMakeNode(QUERY_NODE_OPERATOR, &pNode->pOnCond); return srcNode.get(); }()); } @@ -88,10 +96,12 @@ TEST_F(NodesCloneTest, stateWindow) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_STATE_WINDOW)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_STATE_WINDOW, &pNew); + srcNode.reset(pNew); SStateWindowNode* pNode = (SStateWindowNode*)srcNode.get(); - pNode->pCol = nodesMakeNode(QUERY_NODE_COLUMN); - pNode->pExpr = nodesMakeNode(QUERY_NODE_OPERATOR); + code = nodesMakeNode(QUERY_NODE_COLUMN, &pNode->pCol); + code = nodesMakeNode(QUERY_NODE_OPERATOR, &pNode->pExpr); return srcNode.get(); }()); } @@ -108,10 +118,12 @@ TEST_F(NodesCloneTest, sessionWindow) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_SESSION_WINDOW)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_SESSION_WINDOW, &pNew); + srcNode.reset(pNew); SSessionWindowNode* pNode = (SSessionWindowNode*)srcNode.get(); - pNode->pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - pNode->pGap = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pNode->pCol); + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pNode->pGap); return srcNode.get(); }()); } @@ -136,12 +148,14 @@ TEST_F(NodesCloneTest, intervalWindow) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW, &pNew); + srcNode.reset(pNew); SIntervalWindowNode* pNode = (SIntervalWindowNode*)srcNode.get(); - pNode->pInterval = nodesMakeNode(QUERY_NODE_VALUE); - pNode->pOffset = nodesMakeNode(QUERY_NODE_VALUE); - pNode->pSliding = nodesMakeNode(QUERY_NODE_VALUE); - pNode->pFill = nodesMakeNode(QUERY_NODE_FILL); + code = nodesMakeNode(QUERY_NODE_VALUE, &pNode->pInterval); + code = nodesMakeNode(QUERY_NODE_VALUE, &pNode->pOffset); + code = nodesMakeNode(QUERY_NODE_VALUE, &pNode->pSliding); + code = nodesMakeNode(QUERY_NODE_FILL, &pNode->pFill); return srcNode.get(); }()); } @@ -163,11 +177,13 @@ TEST_F(NodesCloneTest, fill) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_FILL)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FILL, &pNew); + srcNode.reset(pNew); SFillNode* pNode = (SFillNode*)srcNode.get(); pNode->mode = FILL_MODE_VALUE; - pNode->pValues = nodesMakeNode(QUERY_NODE_NODE_LIST); - pNode->pWStartTs = nodesMakeNode(QUERY_NODE_COLUMN); + code = nodesMakeNode(QUERY_NODE_NODE_LIST, &pNode->pValues); + code = nodesMakeNode(QUERY_NODE_COLUMN, &pNode->pWStartTs); pNode->timeRange.skey = 1666756692907; pNode->timeRange.ekey = 1666756699907; return srcNode.get(); @@ -188,7 +204,9 @@ TEST_F(NodesCloneTest, logicSubplan) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN, &pNew); + srcNode.reset(pNew); SLogicSubplan* pNode = (SLogicSubplan*)srcNode.get(); return srcNode.get(); }()); @@ -208,7 +226,9 @@ TEST_F(NodesCloneTest, physiScan) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN)); + SNode* pNew = nullptr; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN, &pNew); + srcNode.reset(pNew); STagScanPhysiNode* pNode = (STagScanPhysiNode*)srcNode.get(); return srcNode.get(); }()); @@ -227,7 +247,9 @@ TEST_F(NodesCloneTest, physiSystemTableScan) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, &pNew); + srcNode.reset(pNew); SSystemTableScanPhysiNode* pNode = (SSystemTableScanPhysiNode*)srcNode.get(); return srcNode.get(); }()); @@ -244,7 +266,9 @@ TEST_F(NodesCloneTest, physiStreamSemiSessionWinodw) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION, &pNew); + srcNode.reset(pNew); SStreamSemiSessionWinodwPhysiNode* pNode = (SStreamSemiSessionWinodwPhysiNode*)srcNode.get(); return srcNode.get(); }()); @@ -261,7 +285,9 @@ TEST_F(NodesCloneTest, physiStreamFinalSessionWinodw) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION, &pNew); + srcNode.reset(pNew); SStreamFinalSessionWinodwPhysiNode* pNode = (SStreamFinalSessionWinodwPhysiNode*)srcNode.get(); return srcNode.get(); }()); @@ -277,7 +303,9 @@ TEST_F(NodesCloneTest, physiStreamPartition) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION, &pNew); + srcNode.reset(pNew); SStreamPartitionPhysiNode* pNode = (SStreamPartitionPhysiNode*)srcNode.get(); return srcNode.get(); }()); @@ -293,7 +321,9 @@ TEST_F(NodesCloneTest, physiPartition) { std::unique_ptr srcNode(nullptr, nodesDestroyNode); run([&]() { - srcNode.reset(nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_PARTITION)); + SNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_PARTITION, &pNew); + srcNode.reset(pNew); SPartitionPhysiNode* pNode = (SPartitionPhysiNode*)srcNode.get(); return srcNode.get(); }()); diff --git a/source/libs/nodes/test/nodesTestMain.cpp b/source/libs/nodes/test/nodesTestMain.cpp index 4e50595b62..eb69017b11 100644 --- a/source/libs/nodes/test/nodesTestMain.cpp +++ b/source/libs/nodes/test/nodesTestMain.cpp @@ -26,7 +26,8 @@ static EDealRes rewriterTest(SNode** pNode, void* pContext) { if (QUERY_NODE_VALUE != nodeType(pOp->pLeft) || QUERY_NODE_VALUE != nodeType(pOp->pRight)) { *pRes = DEAL_RES_ERROR; } - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); string tmp = to_string(stoi(((SValueNode*)(pOp->pLeft))->literal) + stoi(((SValueNode*)(pOp->pRight))->literal)); pVal->literal = taosStrdup(tmp.c_str()); nodesDestroyNode(*pNode); @@ -36,15 +37,18 @@ static EDealRes rewriterTest(SNode** pNode, void* pContext) { } TEST(NodesTest, traverseTest) { - SNode* pRoot = (SNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SNode* pRoot = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR,(SNode**)&pRoot); + ASSERT_EQ(code, TSDB_CODE_SUCCESS); SOperatorNode* pOp = (SOperatorNode*)pRoot; - SOperatorNode* pLeft = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); - pLeft->pLeft = (SNode*)nodesMakeNode(QUERY_NODE_VALUE); + SOperatorNode* pLeft = NULL; + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pLeft)); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, &pLeft->pLeft)); ((SValueNode*)(pLeft->pLeft))->literal = taosStrdup("10"); - pLeft->pRight = (SNode*)nodesMakeNode(QUERY_NODE_VALUE); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, &pLeft->pRight)); ((SValueNode*)(pLeft->pRight))->literal = taosStrdup("5"); pOp->pLeft = (SNode*)pLeft; - pOp->pRight = (SNode*)nodesMakeNode(QUERY_NODE_VALUE); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, &pOp->pRight)); ((SValueNode*)(pOp->pRight))->literal = taosStrdup("3"); EXPECT_EQ(nodeType(pRoot), QUERY_NODE_OPERATOR); @@ -90,27 +94,32 @@ void assert_sort_result(SNodeList* pList) { } TEST(NodesTest, sort) { - SValueNode *vn1 = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *vn1 = NULL; + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&vn1)); vn1->datum.i = 4; - SValueNode *vn2 = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *vn2 = NULL; + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&vn2)); vn2->datum.i = 3; - SValueNode *vn3 = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *vn3 = NULL; + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&vn3)); vn3->datum.i = 2; - SValueNode *vn4 = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *vn4 = NULL; + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&vn4)); vn4->datum.i = 1; - SValueNode *vn5 = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *vn5 = NULL; + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&vn5)); vn5->datum.i = 0; SNodeList* l = NULL; - nodesListMakeAppend(&l, (SNode*)vn1); - nodesListMakeAppend(&l, (SNode*)vn2); - nodesListMakeAppend(&l, (SNode*)vn3); - nodesListMakeAppend(&l, (SNode*)vn4); - nodesListMakeAppend(&l, (SNode*)vn5); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesListMakeAppend(&l, (SNode*)vn1)); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesListMakeAppend(&l, (SNode*)vn2)); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesListMakeAppend(&l, (SNode*)vn3)); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesListMakeAppend(&l, (SNode*)vn4)); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesListMakeAppend(&l, (SNode*)vn5)); nodesSortList(&l, compareValueNode); diff --git a/source/libs/parser/inc/parInsertUtil.h b/source/libs/parser/inc/parInsertUtil.h index 899661a18c..df9f698dc1 100644 --- a/source/libs/parser/inc/parInsertUtil.h +++ b/source/libs/parser/inc/parInsertUtil.h @@ -46,7 +46,7 @@ void insBuildCreateTbReq(SVCreateTbReq *pTbReq, const char *tname, STag *pTag SArray *tagName, uint8_t tagNum, int32_t ttl); int32_t insInitBoundColsInfo(int32_t numOfBound, SBoundColInfo *pInfo); void insResetBoundColsInfo(SBoundColInfo *pInfo); -void insInitColValues(STableMeta *pTableMeta, SArray *aColValues); +int32_t insInitColValues(STableMeta *pTableMeta, SArray *aColValues); void insCheckTableDataOrder(STableDataCxt *pTableCxt, SRowKey *rowKey); int32_t insGetTableDataCxt(SHashObj *pHash, void *id, int32_t idLen, STableMeta *pTableMeta, SVCreateTbReq **pCreateTbReq, STableDataCxt **pTableCxt, bool colMode, bool ignoreColVals); diff --git a/source/libs/parser/inc/parToken.h b/source/libs/parser/inc/parToken.h index 87e9a82d2b..98f77843f9 100644 --- a/source/libs/parser/inc/parToken.h +++ b/source/libs/parser/inc/parToken.h @@ -182,7 +182,8 @@ _end: return (i < pToken->n) ? TK_NK_ILLEGAL : type; } -void taosCleanupKeywordsTable(); +int32_t taosInitKeywordsTable(); +void taosCleanupKeywordsTable(); #ifdef __cplusplus } diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h index f550840f41..f0f1ea51b0 100644 --- a/source/libs/parser/inc/parUtil.h +++ b/source/libs/parser/inc/parUtil.h @@ -172,7 +172,7 @@ int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput); int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes); void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request); -SNode* createSelectStmtImpl(bool isDistinct, SNodeList* pProjectionList, SNode* pTable, SNodeList* pHint); +int32_t createSelectStmtImpl(bool isDistinct, SNodeList* pProjectionList, SNode* pTable, SNodeList* pHint, SNode** ppSelect); int32_t getTableTsmasFromCache(SParseMetaCache* pMetaCache, const SName* pTbName, SArray** pTsmas); int32_t getTsmaFromCache(SParseMetaCache* pMetaCache, const SName* pTsmaName, STableTSMAInfo** pTsma); diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index c53180eb87..f2d804df27 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -1107,7 +1107,7 @@ expr_or_subquery(A) ::= expression(B). //expr_or_subquery(A) ::= subquery(B). { A = createTempTableNode(pCxt, releaseRawExprNode(pCxt, B), NULL); } expression(A) ::= literal(B). { A = B; } -expression(A) ::= pseudo_column(B). { A = B; setRawExprNodeIsPseudoColumn(pCxt, A, true); } +expression(A) ::= pseudo_column(B). { A = B; (void)setRawExprNodeIsPseudoColumn(pCxt, A, true); } expression(A) ::= column_reference(B). { A = B; } expression(A) ::= function_expression(B). { A = B; } expression(A) ::= case_when_expression(B). { A = B; } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index d61d80a691..cd7cda01e0 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -21,13 +21,19 @@ #include "tglobal.h" #include "ttime.h" -#define CHECK_OUT_OF_MEM(p) \ - do { \ - if (NULL == (p)) { \ - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; \ - snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "Out of memory"); \ - return NULL; \ - } \ +#define CHECK_MAKE_NODE(p) \ + do { \ + if (NULL == (p)) { \ + return NULL; \ + } \ + } while (0) + +#define CHECK_OUT_OF_MEM(p) \ + do { \ + if (NULL == (p)) { \ + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; \ + return NULL; \ + } \ } while (0) #define CHECK_PARSER_STATUS(pCxt) \ @@ -262,8 +268,9 @@ static bool checkTsmaName(SAstCreateContext* pCxt, SToken* pTsmaToken) { SNode* createRawExprNode(SAstCreateContext* pCxt, const SToken* pToken, SNode* pNode) { CHECK_PARSER_STATUS(pCxt); - SRawExprNode* target = (SRawExprNode*)nodesMakeNode(QUERY_NODE_RAW_EXPR); - CHECK_OUT_OF_MEM(target); + SRawExprNode* target = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_RAW_EXPR, (SNode**)&target); + CHECK_MAKE_NODE(target); target->p = pToken->z; target->n = pToken->n; target->pNode = pNode; @@ -272,8 +279,9 @@ SNode* createRawExprNode(SAstCreateContext* pCxt, const SToken* pToken, SNode* p SNode* createRawExprNodeExt(SAstCreateContext* pCxt, const SToken* pStart, const SToken* pEnd, SNode* pNode) { CHECK_PARSER_STATUS(pCxt); - SRawExprNode* target = (SRawExprNode*)nodesMakeNode(QUERY_NODE_RAW_EXPR); - CHECK_OUT_OF_MEM(target); + SRawExprNode* target = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_RAW_EXPR, (SNode**)&target); + CHECK_MAKE_NODE(target); target->p = pStart->z; target->n = (pEnd->z + pEnd->n) - pStart->z; target->pNode = pNode; @@ -338,9 +346,14 @@ SToken getTokenFromRawExprNode(SAstCreateContext* pCxt, SNode* pNode) { SNodeList* createNodeList(SAstCreateContext* pCxt, SNode* pNode) { CHECK_PARSER_STATUS(pCxt); - SNodeList* list = nodesMakeList(); - CHECK_OUT_OF_MEM(list); + SNodeList* list = NULL; + pCxt->errCode = nodesMakeList(&list); + CHECK_MAKE_NODE(list); pCxt->errCode = nodesListAppend(list, pNode); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyList(list); + return NULL; + } return list; } @@ -355,8 +368,9 @@ SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pC if (!checkTableName(pCxt, pTableAlias) || !checkColumnName(pCxt, pColumnName)) { return NULL; } - SColumnNode* col = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - CHECK_OUT_OF_MEM(col); + SColumnNode* col = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&col); + CHECK_MAKE_NODE(col); if (NULL != pTableAlias) { COPY_STRING_FORM_ID_TOKEN(col->tableAlias, pTableAlias); } @@ -366,14 +380,19 @@ SNode* createColumnNode(SAstCreateContext* pCxt, SToken* pTableAlias, SToken* pC SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral) { CHECK_PARSER_STATUS(pCxt); - SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - CHECK_OUT_OF_MEM(val); + SValueNode* val = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + CHECK_MAKE_NODE(val); val->literal = strndup(pLiteral->z, pLiteral->n); + if(!val->literal) { + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)val); + return NULL; + } if (TK_NK_ID != pLiteral->type && TK_TIMEZONE != pLiteral->type && (IS_VAR_DATA_TYPE(dataType) || TSDB_DATA_TYPE_TIMESTAMP == dataType)) { (void)trimString(pLiteral->z, pLiteral->n, val->literal, pLiteral->n); } - CHECK_OUT_OF_MEM(val->literal); val->node.resType.type = dataType; val->node.resType.bytes = IS_VAR_DATA_TYPE(dataType) ? strlen(val->literal) : tDataTypes[dataType].bytes; if (TSDB_DATA_TYPE_TIMESTAMP == dataType) { @@ -386,9 +405,9 @@ SNode* createValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* SNode* createRawValueNode(SAstCreateContext* pCxt, int32_t dataType, const SToken* pLiteral, SNode* pNode) { CHECK_PARSER_STATUS(pCxt); SValueNode* val = NULL; - - if (!(val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE))) { - pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY, "Out of memory"); + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, pCxt->errCode, ""); goto _exit; } if (pLiteral) { @@ -428,8 +447,9 @@ SNode* createRawValueNodeExt(SAstCreateContext* pCxt, int32_t dataType, const ST CHECK_PARSER_STATUS(pCxt); SValueNode* val = NULL; - if (!(val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE))) { - pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY, "Out of memory"); + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, pCxt->errCode, ""); goto _exit; } if (pLiteral) { @@ -501,14 +521,18 @@ bool addHintNodeToList(SAstCreateContext* pCxt, SNodeList** ppHintList, EHintOpt return true; } - SHintNode* hint = (SHintNode*)nodesMakeNode(QUERY_NODE_HINT); - CHECK_OUT_OF_MEM(hint); + SHintNode* hint = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_HINT, (SNode**)&hint); + CHECK_MAKE_NODE(hint); hint->option = opt; hint->value = value; if (NULL == *ppHintList) { - *ppHintList = nodesMakeList(); - CHECK_OUT_OF_MEM(*ppHintList); + pCxt->errCode = nodesMakeList(ppHintList); + if (!*ppHintList) { + nodesDestroyNode((SNode*)hint); + return true; + } } pCxt->errCode = nodesListStrictAppend(*ppHintList, (SNode*)hint); @@ -659,8 +683,9 @@ SNode* createIdentifierValueNode(SAstCreateContext* pCxt, SToken* pLiteral) { SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) { CHECK_PARSER_STATUS(pCxt); - SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - CHECK_OUT_OF_MEM(val); + SValueNode* val = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + CHECK_MAKE_NODE(val); if (pLiteral->type == TK_NK_STRING) { // like '100s' or "100d" // check format: ^[0-9]+[smwbauhdny]$' @@ -695,7 +720,11 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) } else { val->literal = strndup(pLiteral->z, pLiteral->n); } - CHECK_OUT_OF_MEM(val->literal); + if (!val->literal) { + nodesDestroyNode((SNode*)val); + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } val->flag |= VALUE_FLAG_IS_DURATION; val->translate = false; val->node.resType.type = TSDB_DATA_TYPE_BIGINT; @@ -706,8 +735,9 @@ SNode* createDurationValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) SNode* createTimeOffsetValueNode(SAstCreateContext* pCxt, const SToken* pLiteral) { CHECK_PARSER_STATUS(pCxt); - SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - CHECK_OUT_OF_MEM(val); + SValueNode* val = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + CHECK_MAKE_NODE(val); if (pLiteral->type == TK_NK_STRING) { // like '100s' or "100d" // check format: ^[0-9]+[smwbauhdny]$' @@ -740,7 +770,11 @@ SNode* createTimeOffsetValueNode(SAstCreateContext* pCxt, const SToken* pLiteral } else { val->literal = strndup(pLiteral->z, pLiteral->n); } - CHECK_OUT_OF_MEM(val->literal); + if (!val->literal) { + nodesDestroyNode((SNode*)val); + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } val->flag |= VALUE_FLAG_IS_TIME_OFFSET; val->translate = false; val->node.resType.type = TSDB_DATA_TYPE_BIGINT; @@ -755,10 +789,15 @@ SNode* createDefaultDatabaseCondValue(SAstCreateContext* pCxt) { return NULL; } - SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - CHECK_OUT_OF_MEM(val); + SValueNode* val = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + CHECK_MAKE_NODE(val); val->literal = taosStrdup(pCxt->pQueryCxt->db); - CHECK_OUT_OF_MEM(val->literal); + if (!val->literal) { + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)val); + return NULL; + } val->translate = false; val->node.resType.type = TSDB_DATA_TYPE_BINARY; val->node.resType.bytes = strlen(val->literal); @@ -772,10 +811,15 @@ SNode* createPlaceholderValueNode(SAstCreateContext* pCxt, const SToken* pLitera pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, pLiteral->z); return NULL; } - SValueNode* val = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - CHECK_OUT_OF_MEM(val); + SValueNode* val = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&val); + CHECK_MAKE_NODE(val); val->literal = strndup(pLiteral->z, pLiteral->n); - CHECK_OUT_OF_MEM(val->literal); + if (!val->literal) { + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)val); + return NULL; + } val->placeholderNo = ++pCxt->placeholderNo; if (NULL == pCxt->pPlaceholderValues) { pCxt->pPlaceholderValues = taosArrayInit(TARRAY_MIN_SIZE, POINTER_BYTES); @@ -804,15 +848,19 @@ static int32_t addParamToLogicConditionNode(SLogicConditionNode* pCond, SNode* p SNode* createLogicConditionNode(SAstCreateContext* pCxt, ELogicConditionType type, SNode* pParam1, SNode* pParam2) { CHECK_PARSER_STATUS(pCxt); - SLogicConditionNode* cond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); - CHECK_OUT_OF_MEM(cond); + SLogicConditionNode* cond = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&cond); + CHECK_MAKE_NODE(cond); cond->condType = type; - cond->pParameterList = nodesMakeList(); - int32_t code = addParamToLogicConditionNode(cond, pParam1); - if (TSDB_CODE_SUCCESS == code && NULL != pParam2) { - code = addParamToLogicConditionNode(cond, pParam2); + cond->pParameterList = NULL; + pCxt->errCode = nodesMakeList(&cond->pParameterList); + if (TSDB_CODE_SUCCESS == pCxt->errCode) { + pCxt->errCode = addParamToLogicConditionNode(cond, pParam1); } - if (TSDB_CODE_SUCCESS != code) { + if (TSDB_CODE_SUCCESS == pCxt->errCode && NULL != pParam2) { + pCxt->errCode = addParamToLogicConditionNode(cond, pParam2); + } + if (TSDB_CODE_SUCCESS != pCxt->errCode) { nodesDestroyNode((SNode*)cond); return NULL; } @@ -837,7 +885,10 @@ SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pL if (OP_TYPE_MINUS == type && QUERY_NODE_VALUE == nodeType(pLeft)) { SValueNode* pVal = (SValueNode*)pLeft; char* pNewLiteral = taosMemoryCalloc(1, strlen(pVal->literal) + 2); - CHECK_OUT_OF_MEM(pNewLiteral); + if (!pNewLiteral) { + pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } if ('+' == pVal->literal[0]) { sprintf(pNewLiteral, "-%s", pVal->literal + 1); } else if ('-' == pVal->literal[0]) { @@ -850,8 +901,9 @@ SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pL pVal->node.resType.type = getMinusDataType(pVal->node.resType.type); return pLeft; } - SOperatorNode* op = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); - CHECK_OUT_OF_MEM(op); + SOperatorNode* op = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&op); + CHECK_MAKE_NODE(op); op->opType = type; op->pLeft = pLeft; op->pRight = pRight; @@ -860,21 +912,58 @@ SNode* createOperatorNode(SAstCreateContext* pCxt, EOperatorType type, SNode* pL SNode* createBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight) { CHECK_PARSER_STATUS(pCxt); - return createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, - createOperatorNode(pCxt, OP_TYPE_GREATER_EQUAL, pExpr, pLeft), - createOperatorNode(pCxt, OP_TYPE_LOWER_EQUAL, nodesCloneNode(pExpr), pRight)); + SNode* pNew = NULL; + pCxt->errCode = nodesCloneNode(pExpr, &pNew); + CHECK_PARSER_STATUS(pCxt); + SNode* pGE = createOperatorNode(pCxt, OP_TYPE_GREATER_EQUAL, pExpr, pLeft); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode(pNew); + return NULL; + } + SNode* pLE = createOperatorNode(pCxt, OP_TYPE_LOWER_EQUAL, pNew, pRight); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode(pNew); + nodesDestroyNode(pGE); + return NULL; + } + SNode* pRet = createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, pGE, pLE); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode(pNew); + nodesDestroyNode(pGE); + nodesDestroyNode(pLE); + } + return pRet; } SNode* createNotBetweenAnd(SAstCreateContext* pCxt, SNode* pExpr, SNode* pLeft, SNode* pRight) { CHECK_PARSER_STATUS(pCxt); - return createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, createOperatorNode(pCxt, OP_TYPE_LOWER_THAN, pExpr, pLeft), - createOperatorNode(pCxt, OP_TYPE_GREATER_THAN, nodesCloneNode(pExpr), pRight)); + SNode* pLT = createOperatorNode(pCxt, OP_TYPE_LOWER_THAN, pExpr, pLeft); + CHECK_MAKE_NODE(pLT); + SNode* pNew = NULL; + pCxt->errCode = nodesCloneNode(pExpr, &pNew); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode(pLT); + return NULL; + } + SNode* pGT = createOperatorNode(pCxt, OP_TYPE_GREATER_THAN, pNew, pRight); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode(pLT); + nodesDestroyNode(pNew); + } + SNode* pRet = createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, pLT, pGT); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode(pLT); + nodesDestroyNode(pGT); + nodesDestroyNode(pNew); + } + return pRet; } static SNode* createPrimaryKeyCol(SAstCreateContext* pCxt, const SToken* pFuncName) { CHECK_PARSER_STATUS(pCxt); - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - CHECK_OUT_OF_MEM(pCol); + SColumnNode* pCol = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + CHECK_MAKE_NODE(pCol); pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID; if (NULL == pFuncName) { strcpy(pCol->colName, ROWTS_PSEUDO_COLUMN_NAME); @@ -890,8 +979,9 @@ SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNod if (0 == strncasecmp("_rowts", pFuncName->z, pFuncName->n) || 0 == strncasecmp("_c0", pFuncName->z, pFuncName->n)) { return createPrimaryKeyCol(pCxt, pFuncName); } - SFunctionNode* func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - CHECK_OUT_OF_MEM(func); + SFunctionNode* func = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&func); + CHECK_MAKE_NODE(func); COPY_STRING_FORM_ID_TOKEN(func->functionName, pFuncName); func->pParameterList = pParameterList; return (SNode*)func; @@ -899,8 +989,9 @@ SNode* createFunctionNode(SAstCreateContext* pCxt, const SToken* pFuncName, SNod SNode* createCastFunctionNode(SAstCreateContext* pCxt, SNode* pExpr, SDataType dt) { CHECK_PARSER_STATUS(pCxt); - SFunctionNode* func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - CHECK_OUT_OF_MEM(func); + SFunctionNode* func = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&func); + CHECK_MAKE_NODE(func); strcpy(func->functionName, "cast"); func->node.resType = dt; if (TSDB_DATA_TYPE_VARCHAR == dt.type || TSDB_DATA_TYPE_GEOMETRY == dt.type || TSDB_DATA_TYPE_VARBINARY == dt.type) { @@ -915,22 +1006,28 @@ SNode* createCastFunctionNode(SAstCreateContext* pCxt, SNode* pExpr, SDataType d SNode* createNodeListNode(SAstCreateContext* pCxt, SNodeList* pList) { CHECK_PARSER_STATUS(pCxt); - SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); - CHECK_OUT_OF_MEM(list); + SNodeListNode* list = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&list); + CHECK_MAKE_NODE(list); list->pNodeList = pList; return (SNode*)list; } SNode* createNodeListNodeEx(SAstCreateContext* pCxt, SNode* p1, SNode* p2) { CHECK_PARSER_STATUS(pCxt); - SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); - CHECK_OUT_OF_MEM(list); - list->pNodeList = nodesMakeList(); - CHECK_OUT_OF_MEM(list->pNodeList); - pCxt->errCode = nodesListAppend(list->pNodeList, p1); - CHECK_PARSER_STATUS(pCxt); - pCxt->errCode = nodesListAppend(list->pNodeList, p2); - CHECK_PARSER_STATUS(pCxt); + SNodeListNode* list = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&list); + CHECK_MAKE_NODE(list); + pCxt->errCode = nodesListMakeStrictAppend(&list->pNodeList, p1); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode((SNode*)list); + return NULL; + } + pCxt->errCode = nodesListStrictAppend(list->pNodeList, p2); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode((SNode*)list); + return NULL; + } return (SNode*)list; } @@ -939,8 +1036,9 @@ SNode* createRealTableNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pTa if (!checkDbName(pCxt, pDbName, true) || !checkTableName(pCxt, pTableName) || !checkTableName(pCxt, pTableAlias)) { return NULL; } - SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); - CHECK_OUT_OF_MEM(realTable); + SRealTableNode* realTable = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_REAL_TABLE, (SNode**)&realTable); + CHECK_MAKE_NODE(realTable); if (NULL != pDbName) { COPY_STRING_FORM_ID_TOKEN(realTable->table.dbName, pDbName); } else { @@ -960,8 +1058,9 @@ SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, SToken* pT if (!checkTableName(pCxt, pTableAlias)) { return NULL; } - STempTableNode* tempTable = (STempTableNode*)nodesMakeNode(QUERY_NODE_TEMP_TABLE); - CHECK_OUT_OF_MEM(tempTable); + STempTableNode* tempTable = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TEMP_TABLE, (SNode**)&tempTable); + CHECK_MAKE_NODE(tempTable); tempTable->pSubquery = pSubquery; if (NULL != pTableAlias && TK_NK_NIL != pTableAlias->type) { COPY_STRING_FORM_ID_TOKEN(tempTable->table.tableAlias, pTableAlias); @@ -980,8 +1079,9 @@ SNode* createTempTableNode(SAstCreateContext* pCxt, SNode* pSubquery, SToken* pT SNode* createJoinTableNode(SAstCreateContext* pCxt, EJoinType type, EJoinSubType stype, SNode* pLeft, SNode* pRight, SNode* pJoinCond) { CHECK_PARSER_STATUS(pCxt); - SJoinTableNode* joinTable = (SJoinTableNode*)nodesMakeNode(QUERY_NODE_JOIN_TABLE); - CHECK_OUT_OF_MEM(joinTable); + SJoinTableNode* joinTable = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_JOIN_TABLE, (SNode**)&joinTable); + CHECK_MAKE_NODE(joinTable); joinTable->joinType = type; joinTable->subType = stype; joinTable->pLeft = pLeft; @@ -995,8 +1095,9 @@ SNode* createViewNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pViewNam if (!checkDbName(pCxt, pDbName, true) || !checkViewName(pCxt, pViewName)) { return NULL; } - SViewNode* pView = (SViewNode*)nodesMakeNode(QUERY_NODE_VIEW); - CHECK_OUT_OF_MEM(pView); + SViewNode* pView = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_VIEW, (SNode**)&pView); + CHECK_MAKE_NODE(pView); if (NULL != pDbName) { COPY_STRING_FORM_ID_TOKEN(pView->table.dbName, pDbName); } else { @@ -1008,8 +1109,9 @@ SNode* createViewNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pViewNam SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const SToken* pOffset) { CHECK_PARSER_STATUS(pCxt); - SLimitNode* limitNode = (SLimitNode*)nodesMakeNode(QUERY_NODE_LIMIT); - CHECK_OUT_OF_MEM(limitNode); + SLimitNode* limitNode = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_LIMIT, (SNode**)&limitNode); + CHECK_MAKE_NODE(limitNode); limitNode->limit = taosStr2Int64(pLimit->z, NULL, 10); if (NULL != pOffset) { limitNode->offset = taosStr2Int64(pOffset->z, NULL, 10); @@ -1019,8 +1121,9 @@ SNode* createLimitNode(SAstCreateContext* pCxt, const SToken* pLimit, const STok SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order, ENullOrder nullOrder) { CHECK_PARSER_STATUS(pCxt); - SOrderByExprNode* orderByExpr = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); - CHECK_OUT_OF_MEM(orderByExpr); + SOrderByExprNode* orderByExpr = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&orderByExpr); + CHECK_MAKE_NODE(orderByExpr); orderByExpr->pExpr = pExpr; orderByExpr->order = order; if (NULL_ORDER_DEFAULT == nullOrder) { @@ -1032,8 +1135,9 @@ SNode* createOrderByExprNode(SAstCreateContext* pCxt, SNode* pExpr, EOrder order SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap) { CHECK_PARSER_STATUS(pCxt); - SSessionWindowNode* session = (SSessionWindowNode*)nodesMakeNode(QUERY_NODE_SESSION_WINDOW); - CHECK_OUT_OF_MEM(session); + SSessionWindowNode* session = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SESSION_WINDOW, (SNode**)&session); + CHECK_MAKE_NODE(session); session->pCol = (SColumnNode*)pCol; session->pGap = (SValueNode*)pGap; return (SNode*)session; @@ -1041,12 +1145,13 @@ SNode* createSessionWindowNode(SAstCreateContext* pCxt, SNode* pCol, SNode* pGap SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) { CHECK_PARSER_STATUS(pCxt); - SStateWindowNode* state = (SStateWindowNode*)nodesMakeNode(QUERY_NODE_STATE_WINDOW); - CHECK_OUT_OF_MEM(state); + SStateWindowNode* state = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_STATE_WINDOW, (SNode**)&state); + CHECK_MAKE_NODE(state); state->pCol = createPrimaryKeyCol(pCxt, NULL); if (NULL == state->pCol) { nodesDestroyNode((SNode*)state); - CHECK_OUT_OF_MEM(NULL); + CHECK_MAKE_NODE(NULL); } state->pExpr = pExpr; return (SNode*)state; @@ -1054,12 +1159,13 @@ SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) { SNode* createEventWindowNode(SAstCreateContext* pCxt, SNode* pStartCond, SNode* pEndCond) { CHECK_PARSER_STATUS(pCxt); - SEventWindowNode* pEvent = (SEventWindowNode*)nodesMakeNode(QUERY_NODE_EVENT_WINDOW); - CHECK_OUT_OF_MEM(pEvent); + SEventWindowNode* pEvent = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_EVENT_WINDOW, (SNode**)&pEvent); + CHECK_MAKE_NODE(pEvent); pEvent->pCol = createPrimaryKeyCol(pCxt, NULL); if (NULL == pEvent->pCol) { nodesDestroyNode((SNode*)pEvent); - CHECK_OUT_OF_MEM(NULL); + CHECK_MAKE_NODE(NULL); } pEvent->pStartCond = pStartCond; pEvent->pEndCond = pEndCond; @@ -1068,12 +1174,13 @@ SNode* createEventWindowNode(SAstCreateContext* pCxt, SNode* pStartCond, SNode* SNode* createCountWindowNode(SAstCreateContext* pCxt, const SToken* pCountToken, const SToken* pSlidingToken) { CHECK_PARSER_STATUS(pCxt); - SCountWindowNode* pCount = (SCountWindowNode*)nodesMakeNode(QUERY_NODE_COUNT_WINDOW); - CHECK_OUT_OF_MEM(pCount); + SCountWindowNode* pCount = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COUNT_WINDOW, (SNode**)&pCount); + CHECK_MAKE_NODE(pCount); pCount->pCol = createPrimaryKeyCol(pCxt, NULL); if (NULL == pCount->pCol) { nodesDestroyNode((SNode*)pCount); - CHECK_OUT_OF_MEM(NULL); + CHECK_MAKE_NODE(NULL); } pCount->windowCount = taosStr2Int64(pCountToken->z, NULL, 10); pCount->windowSliding = taosStr2Int64(pSlidingToken->z, NULL, 10); @@ -1083,12 +1190,13 @@ SNode* createCountWindowNode(SAstCreateContext* pCxt, const SToken* pCountToken, SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode* pOffset, SNode* pSliding, SNode* pFill) { CHECK_PARSER_STATUS(pCxt); - SIntervalWindowNode* interval = (SIntervalWindowNode*)nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW); - CHECK_OUT_OF_MEM(interval); + SIntervalWindowNode* interval = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW, (SNode**)&interval); + CHECK_MAKE_NODE(interval); interval->pCol = createPrimaryKeyCol(pCxt, NULL); if (NULL == interval->pCol) { nodesDestroyNode((SNode*)interval); - CHECK_OUT_OF_MEM(NULL); + CHECK_MAKE_NODE(NULL); } interval->pInterval = pInterval; interval->pOffset = pOffset; @@ -1099,8 +1207,9 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode SNode* createWindowOffsetNode(SAstCreateContext* pCxt, SNode* pStartOffset, SNode* pEndOffset) { CHECK_PARSER_STATUS(pCxt); - SWindowOffsetNode* winOffset = (SWindowOffsetNode*)nodesMakeNode(QUERY_NODE_WINDOW_OFFSET); - CHECK_OUT_OF_MEM(winOffset); + SWindowOffsetNode* winOffset = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_WINDOW_OFFSET, (SNode**)&winOffset); + CHECK_MAKE_NODE(winOffset); winOffset->pStartOffset = pStartOffset; winOffset->pEndOffset = pEndOffset; return (SNode*)winOffset; @@ -1108,14 +1217,16 @@ SNode* createWindowOffsetNode(SAstCreateContext* pCxt, SNode* pStartOffset, SNod SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) { CHECK_PARSER_STATUS(pCxt); - SFillNode* fill = (SFillNode*)nodesMakeNode(QUERY_NODE_FILL); - CHECK_OUT_OF_MEM(fill); + SFillNode* fill = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FILL, (SNode**)&fill); + CHECK_MAKE_NODE(fill); fill->mode = mode; fill->pValues = pValues; - fill->pWStartTs = nodesMakeNode(QUERY_NODE_FUNCTION); + fill->pWStartTs = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&(fill->pWStartTs)); if (NULL == fill->pWStartTs) { nodesDestroyNode((SNode*)fill); - CHECK_OUT_OF_MEM(NULL); + return NULL; } strcpy(((SFunctionNode*)fill->pWStartTs)->functionName, "_wstart"); return (SNode*)fill; @@ -1123,11 +1234,16 @@ SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) { SNode* createGroupingSetNode(SAstCreateContext* pCxt, SNode* pNode) { CHECK_PARSER_STATUS(pCxt); - SGroupingSetNode* groupingSet = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET); - CHECK_OUT_OF_MEM(groupingSet); + SGroupingSetNode* groupingSet = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_GROUPING_SET, (SNode**)&groupingSet); + CHECK_MAKE_NODE(groupingSet); groupingSet->groupingSetType = GP_TYPE_NORMAL; - groupingSet->pParameterList = nodesMakeList(); - pCxt->errCode = nodesListAppend(groupingSet->pParameterList, pNode); + groupingSet->pParameterList = NULL; + pCxt->errCode = nodesListMakeAppend(&groupingSet->pParameterList, pNode); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode((SNode*)groupingSet); + return NULL; + } CHECK_PARSER_STATUS(pCxt); return (SNode*)groupingSet; } @@ -1144,8 +1260,9 @@ SNode* createInterpTimePoint(SAstCreateContext* pCxt, SNode* pPoint) { SNode* createWhenThenNode(SAstCreateContext* pCxt, SNode* pWhen, SNode* pThen) { CHECK_PARSER_STATUS(pCxt); - SWhenThenNode* pWhenThen = (SWhenThenNode*)nodesMakeNode(QUERY_NODE_WHEN_THEN); - CHECK_OUT_OF_MEM(pWhenThen); + SWhenThenNode* pWhenThen = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_WHEN_THEN, (SNode**)&pWhenThen); + CHECK_MAKE_NODE(pWhenThen); pWhenThen->pWhen = pWhen; pWhenThen->pThen = pThen; return (SNode*)pWhenThen; @@ -1153,8 +1270,9 @@ SNode* createWhenThenNode(SAstCreateContext* pCxt, SNode* pWhen, SNode* pThen) { SNode* createCaseWhenNode(SAstCreateContext* pCxt, SNode* pCase, SNodeList* pWhenThenList, SNode* pElse) { CHECK_PARSER_STATUS(pCxt); - SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)nodesMakeNode(QUERY_NODE_CASE_WHEN); - CHECK_OUT_OF_MEM(pCaseWhen); + SCaseWhenNode* pCaseWhen = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CASE_WHEN, (SNode**)&pCaseWhen); + CHECK_MAKE_NODE(pCaseWhen); pCaseWhen->pCase = pCase; pCaseWhen->pWhenThenList = pWhenThenList; pCaseWhen->pElse = pElse; @@ -1303,8 +1421,9 @@ SNode* addWindowOffsetClause(SAstCreateContext* pCxt, SNode* pJoin, SNode* pWinO SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable, SNodeList* pHint) { CHECK_PARSER_STATUS(pCxt); - SNode* select = createSelectStmtImpl(isDistinct, pProjectionList, pTable, pHint); - CHECK_OUT_OF_MEM(select); + SNode* select = NULL; + pCxt->errCode = createSelectStmtImpl(isDistinct, pProjectionList, pTable, pHint, &select); + CHECK_MAKE_NODE(select); return select; } @@ -1327,8 +1446,9 @@ static void setSubquery(SNode* pStmt) { SNode* createSetOperator(SAstCreateContext* pCxt, ESetOperatorType type, SNode* pLeft, SNode* pRight) { CHECK_PARSER_STATUS(pCxt); - SSetOperator* setOp = (SSetOperator*)nodesMakeNode(QUERY_NODE_SET_OPERATOR); - CHECK_OUT_OF_MEM(setOp); + SSetOperator* setOp = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SET_OPERATOR, (SNode**)&setOp); + CHECK_MAKE_NODE(setOp); setOp->opType = type; setOp->pLeft = pLeft; setSubquery(setOp->pLeft); @@ -1354,8 +1474,9 @@ static void updateWalOptionsDefault(SDatabaseOptions* pOptions) { SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + SDatabaseOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->buffer = TSDB_DEFAULT_BUFFER_PER_VNODE; pOptions->cacheModel = TSDB_DEFAULT_CACHE_MODEL; pOptions->cacheLastSize = TSDB_DEFAULT_CACHE_SIZE; @@ -1392,8 +1513,9 @@ SNode* createDefaultDatabaseOptions(SAstCreateContext* pCxt) { SNode* createAlterDatabaseOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SDatabaseOptions* pOptions = (SDatabaseOptions*)nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + SDatabaseOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DATABASE_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->buffer = -1; pOptions->cacheModel = -1; pOptions->cacheLastSize = -1; @@ -1592,8 +1714,9 @@ SNode* createCreateDatabaseStmt(SAstCreateContext* pCxt, bool ignoreExists, STok if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SCreateDatabaseStmt* pStmt = (SCreateDatabaseStmt*)nodesMakeNode(QUERY_NODE_CREATE_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); pStmt->ignoreExists = ignoreExists; pStmt->pOptions = (SDatabaseOptions*)pOptions; @@ -1605,8 +1728,9 @@ SNode* createDropDatabaseStmt(SAstCreateContext* pCxt, bool ignoreNotExists, STo if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SDropDatabaseStmt* pStmt = (SDropDatabaseStmt*)nodesMakeNode(QUERY_NODE_DROP_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); pStmt->ignoreNotExists = ignoreNotExists; return (SNode*)pStmt; @@ -1617,8 +1741,9 @@ SNode* createAlterDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SAlterDatabaseStmt* pStmt = (SAlterDatabaseStmt*)nodesMakeNode(QUERY_NODE_ALTER_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); pStmt->pOptions = (SDatabaseOptions*)pOptions; return (SNode*)pStmt; @@ -1629,8 +1754,9 @@ SNode* createFlushDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SFlushDatabaseStmt* pStmt = (SFlushDatabaseStmt*)nodesMakeNode(QUERY_NODE_FLUSH_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SFlushDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FLUSH_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); return (SNode*)pStmt; } @@ -1640,8 +1766,9 @@ SNode* createTrimDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName, int32_t if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - STrimDatabaseStmt* pStmt = (STrimDatabaseStmt*)nodesMakeNode(QUERY_NODE_TRIM_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + STrimDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TRIM_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); pStmt->maxSpeed = maxSpeed; return (SNode*)pStmt; @@ -1652,8 +1779,9 @@ SNode* createS3MigrateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SS3MigrateDatabaseStmt* pStmt = (SS3MigrateDatabaseStmt*)nodesMakeNode(QUERY_NODE_S3MIGRATE_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SS3MigrateDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_S3MIGRATE_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); return (SNode*)pStmt; } @@ -1663,8 +1791,9 @@ SNode* createCompactStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pStart if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SCompactDatabaseStmt* pStmt = (SCompactDatabaseStmt*)nodesMakeNode(QUERY_NODE_COMPACT_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCompactDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COMPACT_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); pStmt->pStart = pStart; pStmt->pEnd = pEnd; @@ -1673,8 +1802,9 @@ SNode* createCompactStmt(SAstCreateContext* pCxt, SToken* pDbName, SNode* pStart SNode* createDefaultTableOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - STableOptions* pOptions = (STableOptions*)nodesMakeNode(QUERY_NODE_TABLE_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + STableOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->maxDelay1 = -1; pOptions->maxDelay2 = -1; pOptions->watermark1 = TSDB_DEFAULT_ROLLUP_WATERMARK; @@ -1686,8 +1816,9 @@ SNode* createDefaultTableOptions(SAstCreateContext* pCxt) { SNode* createAlterTableOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - STableOptions* pOptions = (STableOptions*)nodesMakeNode(QUERY_NODE_TABLE_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + STableOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TABLE_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->ttl = -1; pOptions->commentNull = true; // mark null return (SNode*)pOptions; @@ -1734,8 +1865,9 @@ SNode* setTableOption(SAstCreateContext* pCxt, SNode* pOptions, ETableOptionType SNode* createDefaultColumnOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SColumnOptions* pOptions = (SColumnOptions*)nodesMakeNode(QUERY_NODE_COLUMN_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + SColumnOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->commentNull = true; pOptions->bPrimaryKey = false; return (SNode*)pOptions; @@ -1783,8 +1915,9 @@ SNode* createColumnDefNode(SAstCreateContext* pCxt, SToken* pColName, SDataType pCxt->errCode = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN); return NULL; } - SColumnDefNode* pCol = (SColumnDefNode*)nodesMakeNode(QUERY_NODE_COLUMN_DEF); - CHECK_OUT_OF_MEM(pCol); + SColumnDefNode* pCol = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN_DEF, (SNode**)&pCol); + CHECK_MAKE_NODE(pCol); COPY_STRING_FORM_ID_TOKEN(pCol->colName, pColName); pCol->dataType = dataType; pCol->pOptions = pNode; @@ -1808,8 +1941,9 @@ SDataType createVarLenDataType(uint8_t type, const SToken* pLen) { SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNodeList* pCols, SNodeList* pTags, SNode* pOptions) { CHECK_PARSER_STATUS(pCxt); - SCreateTableStmt* pStmt = (SCreateTableStmt*)nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); pStmt->ignoreExists = ignoreExists; @@ -1823,8 +1957,9 @@ SNode* createCreateTableStmt(SAstCreateContext* pCxt, bool ignoreExists, SNode* SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SNode* pRealTable, SNode* pUseRealTable, SNodeList* pSpecificTags, SNodeList* pValsOfTags, SNode* pOptions) { CHECK_PARSER_STATUS(pCxt); - SCreateSubTableClause* pStmt = (SCreateSubTableClause*)nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_CLAUSE); - CHECK_OUT_OF_MEM(pStmt); + SCreateSubTableClause* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_CLAUSE, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); strcpy(pStmt->useDbName, ((SRealTableNode*)pUseRealTable)->table.dbName); @@ -1841,9 +1976,9 @@ SNode* createCreateSubTableClause(SAstCreateContext* pCxt, bool ignoreExists, SN SNode* createCreateSubTableFromFileClause(SAstCreateContext* pCxt, bool ignoreExists, SNode* pUseRealTable, SNodeList* pSpecificTags, const SToken* pFilePath) { CHECK_PARSER_STATUS(pCxt); - SCreateSubTableFromFileClause* pStmt = - (SCreateSubTableFromFileClause*)nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_FROM_FILE_CLAUSE); - CHECK_OUT_OF_MEM(pStmt); + SCreateSubTableFromFileClause* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_SUBTABLE_FROM_FILE_CLAUSE, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->useDbName, ((SRealTableNode*)pUseRealTable)->table.dbName); strcpy(pStmt->useTableName, ((SRealTableNode*)pUseRealTable)->table.tableName); pStmt->ignoreExists = ignoreExists; @@ -1860,16 +1995,18 @@ SNode* createCreateSubTableFromFileClause(SAstCreateContext* pCxt, bool ignoreEx SNode* createCreateMultiTableStmt(SAstCreateContext* pCxt, SNodeList* pSubTables) { CHECK_PARSER_STATUS(pCxt); - SCreateMultiTablesStmt* pStmt = (SCreateMultiTablesStmt*)nodesMakeNode(QUERY_NODE_CREATE_MULTI_TABLES_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateMultiTablesStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_MULTI_TABLES_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pSubTables = pSubTables; return (SNode*)pStmt; } SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SDropTableClause* pStmt = (SDropTableClause*)nodesMakeNode(QUERY_NODE_DROP_TABLE_CLAUSE); - CHECK_OUT_OF_MEM(pStmt); + SDropTableClause* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_TABLE_CLAUSE, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); pStmt->ignoreNotExists = ignoreNotExists; @@ -1879,16 +2016,18 @@ SNode* createDropTableClause(SAstCreateContext* pCxt, bool ignoreNotExists, SNod SNode* createDropTableStmt(SAstCreateContext* pCxt, SNodeList* pTables) { CHECK_PARSER_STATUS(pCxt); - SDropTableStmt* pStmt = (SDropTableStmt*)nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pTables = pTables; return (SNode*)pStmt; } SNode* createDropSuperTableStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SDropSuperTableStmt* pStmt = (SDropSuperTableStmt*)nodesMakeNode(QUERY_NODE_DROP_SUPER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropSuperTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_SUPER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); pStmt->ignoreNotExists = ignoreNotExists; @@ -1905,8 +2044,9 @@ static SNode* createAlterTableStmtFinalize(SNode* pRealTable, SAlterTableStmt* p SNode* createAlterTableModifyOptions(SAstCreateContext* pCxt, SNode* pRealTable, SNode* pOptions) { CHECK_PARSER_STATUS(pCxt); - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_OPTIONS; pStmt->pOptions = (STableOptions*)pOptions; return createAlterTableStmtFinalize(pRealTable, pStmt); @@ -1918,8 +2058,9 @@ SNode* createAlterTableAddModifyCol(SAstCreateContext* pCxt, SNode* pRealTable, if (!checkColumnName(pCxt, pColName)) { return NULL; } - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = alterType; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pColName); pStmt->dataType = dataType; @@ -1932,8 +2073,9 @@ SNode* createAlterTableAddModifyColOptions2(SAstCreateContext* pCxt, SNode* pRea return NULL; } - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = alterType; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pColName); pStmt->dataType = dataType; @@ -1952,6 +2094,7 @@ SNode* createAlterTableAddModifyColOptions2(SAstCreateContext* pCxt, SNode* pRea } else { pCxt->errCode = generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, "not support alter column with option except compress"); + nodesDestroyNode((SNode*)pStmt); return NULL; } } @@ -1964,8 +2107,9 @@ SNode* createAlterTableAddModifyColOptions(SAstCreateContext* pCxt, SNode* pReal if (!checkColumnName(pCxt, pColName)) { return NULL; } - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pColName); pStmt->pColOptions = (SColumnOptions*)pOptions; @@ -1977,8 +2121,9 @@ SNode* createAlterTableDropCol(SAstCreateContext* pCxt, SNode* pRealTable, int8_ if (!checkColumnName(pCxt, pColName)) { return NULL; } - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = alterType; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pColName); return createAlterTableStmtFinalize(pRealTable, pStmt); @@ -1990,8 +2135,9 @@ SNode* createAlterTableRenameCol(SAstCreateContext* pCxt, SNode* pRealTable, int if (!checkColumnName(pCxt, pOldColName) || !checkColumnName(pCxt, pNewColName)) { return NULL; } - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = alterType; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pOldColName); COPY_STRING_FORM_ID_TOKEN(pStmt->newColName, pNewColName); @@ -2004,8 +2150,9 @@ SNode* createAlterTableSetTag(SAstCreateContext* pCxt, SNode* pRealTable, SToken nodesDestroyNode(pVal); return NULL; } - SAlterTableStmt* pStmt = (SAlterTableStmt*)nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_TABLE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->alterType = TSDB_ALTER_TABLE_UPDATE_TAG_VAL; COPY_STRING_FORM_ID_TOKEN(pStmt->colName, pTagName); pStmt->pVal = (SValueNode*)pVal; @@ -2023,8 +2170,9 @@ SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { if (!checkDbName(pCxt, pDbName, false)) { return NULL; } - SUseDatabaseStmt* pStmt = (SUseDatabaseStmt*)nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SUseDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_USE_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); return (SNode*)pStmt; } @@ -2038,24 +2186,27 @@ static bool needDbShowStmt(ENodeType type) { SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) { CHECK_PARSER_STATUS(pCxt); - SShowStmt* pStmt = (SShowStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->withFull = false; return (SNode*)pStmt; } SNode* createShowStmtWithFull(SAstCreateContext* pCxt, ENodeType type) { CHECK_PARSER_STATUS(pCxt); - SShowStmt* pStmt = (SShowStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->withFull = true; return (SNode*)pStmt; } SNode* createShowCompactsStmt(SAstCreateContext* pCxt, ENodeType type) { CHECK_PARSER_STATUS(pCxt); - SShowCompactsStmt* pStmt = (SShowCompactsStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowCompactsStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); return (SNode*)pStmt; } @@ -2076,8 +2227,9 @@ SNode* createShowStmtWithCond(SAstCreateContext* pCxt, ENodeType type, SNode* pD pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR; return NULL; } - SShowStmt* pStmt = (SShowStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pDbName = pDbName; pStmt->pTbName = pTbName; pStmt->tableCondType = tableCondType; @@ -2103,8 +2255,9 @@ SNode* createShowCreateDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName) { if (!checkDbName(pCxt, pDbName, true)) { return NULL; } - SShowCreateDatabaseStmt* pStmt = (SShowCreateDatabaseStmt*)nodesMakeNode(QUERY_NODE_SHOW_CREATE_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SShowCreateDatabaseStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_CREATE_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); return (SNode*)pStmt; } @@ -2128,8 +2281,14 @@ SNode* createShowAliveStmt(SAstCreateContext* pCxt, SNode* pNode, ENodeType type return NULL; } - SShowAliveStmt* pStmt = (SShowAliveStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowAliveStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + if (pNode) { + nodesDestroyNode(pNode); + } + return NULL; + } if (pDbToken) { COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbToken); @@ -2143,8 +2302,9 @@ SNode* createShowAliveStmt(SAstCreateContext* pCxt, SNode* pNode, ENodeType type SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SShowCreateTableStmt* pStmt = (SShowCreateTableStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowCreateTableStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); nodesDestroyNode(pRealTable); @@ -2153,8 +2313,9 @@ SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode* SNode* createShowCreateViewStmt(SAstCreateContext* pCxt, ENodeType type, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SShowCreateViewStmt* pStmt = (SShowCreateViewStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SShowCreateViewStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->viewName, ((SRealTableNode*)pRealTable)->table.tableName); nodesDestroyNode(pRealTable); @@ -2163,8 +2324,9 @@ SNode* createShowCreateViewStmt(SAstCreateContext* pCxt, ENodeType type, SNode* SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SShowTableDistributedStmt* pStmt = (SShowTableDistributedStmt*)nodesMakeNode(QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT); - CHECK_OUT_OF_MEM(pStmt); + SShowTableDistributedStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); nodesDestroyNode(pRealTable); @@ -2173,8 +2335,9 @@ SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pLikePattern) { CHECK_PARSER_STATUS(pCxt); - SShowDnodeVariablesStmt* pStmt = (SShowDnodeVariablesStmt*)nodesMakeNode(QUERY_NODE_SHOW_DNODE_VARIABLES_STMT); - CHECK_OUT_OF_MEM(pStmt); + SShowDnodeVariablesStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_DNODE_VARIABLES_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pDnodeId = pDnodeId; pStmt->pLikePattern = pLikePattern; return (SNode*)pStmt; @@ -2182,8 +2345,9 @@ SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SN SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDnodeEndpoint) { CHECK_PARSER_STATUS(pCxt); - SShowVnodesStmt* pStmt = (SShowVnodesStmt*)nodesMakeNode(QUERY_NODE_SHOW_VNODES_STMT); - CHECK_OUT_OF_MEM(pStmt); + SShowVnodesStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_VNODES_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pDnodeId = pDnodeId; pStmt->pDnodeEndpoint = pDnodeEndpoint; return (SNode*)pStmt; @@ -2196,8 +2360,9 @@ SNode* createShowTableTagsStmt(SAstCreateContext* pCxt, SNode* pTbName, SNode* p pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR; return NULL; } - SShowTableTagsStmt* pStmt = (SShowTableTagsStmt*)nodesMakeNode(QUERY_NODE_SHOW_TABLE_TAGS_STMT); - CHECK_OUT_OF_MEM(pStmt); + SShowTableTagsStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_TABLE_TAGS_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pDbName = pDbName; pStmt->pTbName = pTbName; pStmt->pTags = pTags; @@ -2206,7 +2371,9 @@ SNode* createShowTableTagsStmt(SAstCreateContext* pCxt, SNode* pTbName, SNode* p SNode* createShowCompactDetailsStmt(SAstCreateContext* pCxt, SNode* pCompactId) { CHECK_PARSER_STATUS(pCxt); - SShowCompactDetailsStmt* pStmt = (SShowCompactDetailsStmt*)nodesMakeNode(QUERY_NODE_SHOW_COMPACT_DETAILS_STMT); + SShowCompactDetailsStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_COMPACT_DETAILS_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pCompactId = pCompactId; return (SNode*)pStmt; } @@ -2296,8 +2463,9 @@ SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const ST if (!checkUserName(pCxt, pUserName) || !checkPassword(pCxt, pPassword, password)) { return NULL; } - SCreateUserStmt* pStmt = (SCreateUserStmt*)nodesMakeNode(QUERY_NODE_CREATE_USER_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateUserStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_USER_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName); strcpy(pStmt->password, password); pStmt->sysinfo = sysinfo; @@ -2311,8 +2479,9 @@ SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t al if (!checkUserName(pCxt, pUserName)) { return NULL; } - SAlterUserStmt* pStmt = (SAlterUserStmt*)nodesMakeNode(QUERY_NODE_ALTER_USER_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterUserStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_USER_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName); pStmt->alterType = alterType; switch (alterType) { @@ -2371,16 +2540,18 @@ SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName) { if (!checkUserName(pCxt, pUserName)) { return NULL; } - SDropUserStmt* pStmt = (SDropUserStmt*)nodesMakeNode(QUERY_NODE_DROP_USER_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropUserStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_USER_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->userName, pUserName); return (SNode*)pStmt; } SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SToken* pPort) { CHECK_PARSER_STATUS(pCxt); - SCreateDnodeStmt* pStmt = (SCreateDnodeStmt*)nodesMakeNode(QUERY_NODE_CREATE_DNODE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateDnodeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_DNODE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); if (!checkAndSplitEndpoint(pCxt, pFqdn, pPort, pStmt->fqdn, &pStmt->port)) { nodesDestroyNode((SNode*)pStmt); return NULL; @@ -2390,8 +2561,9 @@ SNode* createCreateDnodeStmt(SAstCreateContext* pCxt, const SToken* pFqdn, const SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, bool force, bool unsafe) { CHECK_PARSER_STATUS(pCxt); - SDropDnodeStmt* pStmt = (SDropDnodeStmt*)nodesMakeNode(QUERY_NODE_DROP_DNODE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropDnodeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_DNODE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); if (TK_NK_INTEGER == pDnode->type) { pStmt->dnodeId = taosStr2Int32(pDnode->z, NULL, 10); } else { @@ -2408,8 +2580,9 @@ SNode* createDropDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, bool f SNode* createAlterDnodeStmt(SAstCreateContext* pCxt, const SToken* pDnode, const SToken* pConfig, const SToken* pValue) { CHECK_PARSER_STATUS(pCxt); - SAlterDnodeStmt* pStmt = (SAlterDnodeStmt*)nodesMakeNode(QUERY_NODE_ALTER_DNODE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterDnodeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_DNODE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); if (NULL != pDnode) { pStmt->dnodeId = taosStr2Int32(pDnode->z, NULL, 10); } else { @@ -2440,8 +2613,9 @@ SNode* createRealTableNodeForIndexName(SAstCreateContext* pCxt, SToken* pDbName, SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, bool ignoreExists, SNode* pIndexName, SNode* pRealTable, SNodeList* pCols, SNode* pOptions) { CHECK_PARSER_STATUS(pCxt); - SCreateIndexStmt* pStmt = (SCreateIndexStmt*)nodesMakeNode(QUERY_NODE_CREATE_INDEX_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateIndexStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_INDEX_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->indexType = type; pStmt->ignoreExists = ignoreExists; @@ -2473,8 +2647,9 @@ SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, bool igno SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInterval, SNode* pOffset, SNode* pSliding, SNode* pStreamOptions) { CHECK_PARSER_STATUS(pCxt); - SIndexOptions* pOptions = (SIndexOptions*)nodesMakeNode(QUERY_NODE_INDEX_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + SIndexOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_INDEX_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->pFuncs = pFuncs; pOptions->pInterval = pInterval; pOptions->pOffset = pOffset; @@ -2485,8 +2660,9 @@ SNode* createIndexOption(SAstCreateContext* pCxt, SNodeList* pFuncs, SNode* pInt SNode* createDropIndexStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pIndexName) { CHECK_PARSER_STATUS(pCxt); - SDropIndexStmt* pStmt = (SDropIndexStmt*)nodesMakeNode(QUERY_NODE_DROP_INDEX_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropIndexStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_INDEX_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->ignoreNotExists = ignoreNotExists; snprintf(pStmt->indexDbName, sizeof(pStmt->indexDbName), "%s", ((SRealTableNode*)pIndexName)->table.dbName); snprintf(pStmt->indexName, sizeof(pStmt->indexName), "%s", ((SRealTableNode*)pIndexName)->table.tableName); @@ -2496,24 +2672,27 @@ SNode* createDropIndexStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* SNode* createCreateComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDnodeId) { CHECK_PARSER_STATUS(pCxt); - SCreateComponentNodeStmt* pStmt = (SCreateComponentNodeStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SCreateComponentNodeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->dnodeId = taosStr2Int32(pDnodeId->z, NULL, 10); return (SNode*)pStmt; } SNode* createDropComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDnodeId) { CHECK_PARSER_STATUS(pCxt); - SDropComponentNodeStmt* pStmt = (SDropComponentNodeStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SDropComponentNodeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->dnodeId = taosStr2Int32(pDnodeId->z, NULL, 10); return (SNode*)pStmt; } SNode* createRestoreComponentNodeStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pDnodeId) { CHECK_PARSER_STATUS(pCxt); - SRestoreComponentNodeStmt* pStmt = (SRestoreComponentNodeStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SRestoreComponentNodeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->dnodeId = taosStr2Int32(pDnodeId->z, NULL, 10); return (SNode*)pStmt; } @@ -2524,8 +2703,9 @@ SNode* createCreateTopicStmtUseQuery(SAstCreateContext* pCxt, bool ignoreExists, nodesDestroyNode(pQuery); return NULL; } - SCreateTopicStmt* pStmt = (SCreateTopicStmt*)nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateTopicStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); pStmt->ignoreExists = ignoreExists; pStmt->pQuery = pQuery; @@ -2538,8 +2718,9 @@ SNode* createCreateTopicStmtUseDb(SAstCreateContext* pCxt, bool ignoreExists, ST if (!checkTopicName(pCxt, pTopicName) || !checkDbName(pCxt, pSubDbName, true)) { return NULL; } - SCreateTopicStmt* pStmt = (SCreateTopicStmt*)nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateTopicStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); pStmt->ignoreExists = ignoreExists; COPY_STRING_FORM_ID_TOKEN(pStmt->subDbName, pSubDbName); @@ -2553,8 +2734,9 @@ SNode* createCreateTopicStmtUseTable(SAstCreateContext* pCxt, bool ignoreExists, if (!checkTopicName(pCxt, pTopicName)) { return NULL; } - SCreateTopicStmt* pStmt = (SCreateTopicStmt*)nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateTopicStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_TOPIC_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); pStmt->ignoreExists = ignoreExists; pStmt->withMeta = withMeta; @@ -2571,8 +2753,9 @@ SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken if (!checkTopicName(pCxt, pTopicName)) { return NULL; } - SDropTopicStmt* pStmt = (SDropTopicStmt*)nodesMakeNode(QUERY_NODE_DROP_TOPIC_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropTopicStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_TOPIC_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); pStmt->ignoreNotExists = ignoreNotExists; return (SNode*)pStmt; @@ -2586,8 +2769,9 @@ SNode* createDropCGroupStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToke if (!checkCGroupName(pCxt, pCGroupId)) { return NULL; } - SDropCGroupStmt* pStmt = (SDropCGroupStmt*)nodesMakeNode(QUERY_NODE_DROP_CGROUP_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropCGroupStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_CGROUP_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->ignoreNotExists = ignoreNotExists; COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); COPY_STRING_FORM_ID_TOKEN(pStmt->cgroup, pCGroupId); @@ -2596,8 +2780,9 @@ SNode* createDropCGroupStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToke SNode* createAlterClusterStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue) { CHECK_PARSER_STATUS(pCxt); - SAlterClusterStmt* pStmt = (SAlterClusterStmt*)nodesMakeNode(QUERY_NODE_ALTER_CLUSTER_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterClusterStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_CLUSTER_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); (void)trimString(pConfig->z, pConfig->n, pStmt->config, sizeof(pStmt->config)); if (NULL != pValue) { (void)trimString(pValue->z, pValue->n, pStmt->value, sizeof(pStmt->value)); @@ -2607,8 +2792,9 @@ SNode* createAlterClusterStmt(SAstCreateContext* pCxt, const SToken* pConfig, co SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue) { CHECK_PARSER_STATUS(pCxt); - SAlterLocalStmt* pStmt = (SAlterLocalStmt*)nodesMakeNode(QUERY_NODE_ALTER_LOCAL_STMT); - CHECK_OUT_OF_MEM(pStmt); + SAlterLocalStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_ALTER_LOCAL_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); (void)trimString(pConfig->z, pConfig->n, pStmt->config, sizeof(pStmt->config)); if (NULL != pValue) { (void)trimString(pValue->z, pValue->n, pStmt->value, sizeof(pStmt->value)); @@ -2618,8 +2804,9 @@ SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, cons SNode* createDefaultExplainOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SExplainOptions* pOptions = (SExplainOptions*)nodesMakeNode(QUERY_NODE_EXPLAIN_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + SExplainOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_EXPLAIN_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->verbose = TSDB_DEFAULT_EXPLAIN_VERBOSE; pOptions->ratio = TSDB_DEFAULT_EXPLAIN_RATIO; return (SNode*)pOptions; @@ -2639,8 +2826,9 @@ SNode* setExplainRatio(SAstCreateContext* pCxt, SNode* pOptions, const SToken* p SNode* createExplainStmt(SAstCreateContext* pCxt, bool analyze, SNode* pOptions, SNode* pQuery) { CHECK_PARSER_STATUS(pCxt); - SExplainStmt* pStmt = (SExplainStmt*)nodesMakeNode(QUERY_NODE_EXPLAIN_STMT); - CHECK_OUT_OF_MEM(pStmt); + SExplainStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_EXPLAIN_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->analyze = analyze; pStmt->pOptions = (SExplainOptions*)pOptions; pStmt->pQuery = pQuery; @@ -2649,8 +2837,9 @@ SNode* createExplainStmt(SAstCreateContext* pCxt, bool analyze, SNode* pOptions, SNode* createDescribeStmt(SAstCreateContext* pCxt, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SDescribeStmt* pStmt = (SDescribeStmt*)nodesMakeNode(QUERY_NODE_DESCRIBE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDescribeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DESCRIBE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName); nodesDestroyNode(pRealTable); @@ -2659,8 +2848,9 @@ SNode* createDescribeStmt(SAstCreateContext* pCxt, SNode* pRealTable) { SNode* createResetQueryCacheStmt(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SNode* pStmt = nodesMakeNode(QUERY_NODE_RESET_QUERY_CACHE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SNode* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_RESET_QUERY_CACHE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); return pStmt; } @@ -2688,8 +2878,9 @@ SNode* createCreateFunctionStmt(SAstCreateContext* pCxt, bool ignoreExists, bool if (TSDB_CODE_SUCCESS != convertUdfLanguageType(pCxt, pLanguage, &language)) { return NULL; } - SCreateFunctionStmt* pStmt = (SCreateFunctionStmt*)nodesMakeNode(QUERY_NODE_CREATE_FUNCTION_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateFunctionStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_FUNCTION_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->orReplace = orReplace; pStmt->ignoreExists = ignoreExists; COPY_STRING_FORM_ID_TOKEN(pStmt->funcName, pFuncName); @@ -2703,8 +2894,9 @@ SNode* createCreateFunctionStmt(SAstCreateContext* pCxt, bool ignoreExists, bool SNode* createDropFunctionStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pFuncName) { CHECK_PARSER_STATUS(pCxt); - SDropFunctionStmt* pStmt = (SDropFunctionStmt*)nodesMakeNode(QUERY_NODE_DROP_FUNCTION_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropFunctionStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_FUNCTION_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->ignoreNotExists = ignoreNotExists; COPY_STRING_FORM_ID_TOKEN(pStmt->funcName, pFuncName); return (SNode*)pStmt; @@ -2712,8 +2904,9 @@ SNode* createDropFunctionStmt(SAstCreateContext* pCxt, bool ignoreNotExists, con SNode* createCreateViewStmt(SAstCreateContext* pCxt, bool orReplace, SNode* pView, const SToken* pAs, SNode* pQuery) { CHECK_PARSER_STATUS(pCxt); - SCreateViewStmt* pStmt = (SCreateViewStmt*)nodesMakeNode(QUERY_NODE_CREATE_VIEW_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateViewStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_VIEW_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); int32_t i = pAs->n; while (isspace(*(pAs->z + i))) { ++i; @@ -2730,8 +2923,9 @@ SNode* createCreateViewStmt(SAstCreateContext* pCxt, bool orReplace, SNode* pVie SNode* createDropViewStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pView) { CHECK_PARSER_STATUS(pCxt); - SDropViewStmt* pStmt = (SDropViewStmt*)nodesMakeNode(QUERY_NODE_DROP_VIEW_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropViewStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_VIEW_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->ignoreNotExists = ignoreNotExists; strcpy(pStmt->dbName, ((SViewNode*)pView)->table.dbName); strcpy(pStmt->viewName, ((SViewNode*)pView)->table.tableName); @@ -2741,8 +2935,9 @@ SNode* createDropViewStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* SNode* createStreamOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SStreamOptions* pOptions = (SStreamOptions*)nodesMakeNode(QUERY_NODE_STREAM_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + SStreamOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_STREAM_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; pOptions->fillHistory = STREAM_DEFAULT_FILL_HISTORY; pOptions->ignoreExpired = STREAM_DEFAULT_IGNORE_EXPIRED; @@ -2811,8 +3006,9 @@ SNode* createCreateStreamStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken nodesDestroyNode(pOptions); return NULL; } - SCreateStreamStmt* pStmt = (SCreateStreamStmt*)nodesMakeNode(QUERY_NODE_CREATE_STREAM_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateStreamStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_STREAM_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->streamName, pStreamName); strcpy(pStmt->targetDbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->targetTabName, ((SRealTableNode*)pRealTable)->table.tableName); @@ -2831,8 +3027,9 @@ SNode* createDropStreamStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToke if (!checkStreamName(pCxt, pStreamName)) { return NULL; } - SDropStreamStmt* pStmt = (SDropStreamStmt*)nodesMakeNode(QUERY_NODE_DROP_STREAM_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropStreamStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_STREAM_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->streamName, pStreamName); pStmt->ignoreNotExists = ignoreNotExists; return (SNode*)pStmt; @@ -2843,8 +3040,9 @@ SNode* createPauseStreamStmt(SAstCreateContext* pCxt, bool ignoreNotExists, STok if (!checkStreamName(pCxt, pStreamName)) { return NULL; } - SPauseStreamStmt* pStmt = (SPauseStreamStmt*)nodesMakeNode(QUERY_NODE_PAUSE_STREAM_STMT); - CHECK_OUT_OF_MEM(pStmt); + SPauseStreamStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_PAUSE_STREAM_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->streamName, pStreamName); pStmt->ignoreNotExists = ignoreNotExists; return (SNode*)pStmt; @@ -2856,8 +3054,9 @@ SNode* createResumeStreamStmt(SAstCreateContext* pCxt, bool ignoreNotExists, boo if (!checkStreamName(pCxt, pStreamName)) { return NULL; } - SResumeStreamStmt* pStmt = (SResumeStreamStmt*)nodesMakeNode(QUERY_NODE_RESUME_STREAM_STMT); - CHECK_OUT_OF_MEM(pStmt); + SResumeStreamStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_RESUME_STREAM_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); COPY_STRING_FORM_ID_TOKEN(pStmt->streamName, pStreamName); pStmt->ignoreNotExists = ignoreNotExists; pStmt->ignoreUntreated = ignoreUntreated; @@ -2866,31 +3065,35 @@ SNode* createResumeStreamStmt(SAstCreateContext* pCxt, bool ignoreNotExists, boo SNode* createKillStmt(SAstCreateContext* pCxt, ENodeType type, const SToken* pId) { CHECK_PARSER_STATUS(pCxt); - SKillStmt* pStmt = (SKillStmt*)nodesMakeNode(type); - CHECK_OUT_OF_MEM(pStmt); + SKillStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->targetId = taosStr2Int32(pId->z, NULL, 10); return (SNode*)pStmt; } SNode* createKillQueryStmt(SAstCreateContext* pCxt, const SToken* pQueryId) { CHECK_PARSER_STATUS(pCxt); - SKillQueryStmt* pStmt = (SKillQueryStmt*)nodesMakeNode(QUERY_NODE_KILL_QUERY_STMT); - CHECK_OUT_OF_MEM(pStmt); + SKillQueryStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_KILL_QUERY_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); (void)trimString(pQueryId->z, pQueryId->n, pStmt->queryId, sizeof(pStmt->queryId) - 1); return (SNode*)pStmt; } SNode* createBalanceVgroupStmt(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - SBalanceVgroupStmt* pStmt = (SBalanceVgroupStmt*)nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_STMT); - CHECK_OUT_OF_MEM(pStmt); + SBalanceVgroupStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); return (SNode*)pStmt; } SNode* createBalanceVgroupLeaderStmt(SAstCreateContext* pCxt, const SToken* pVgId) { CHECK_PARSER_STATUS(pCxt); - SBalanceVgroupLeaderStmt* pStmt = (SBalanceVgroupLeaderStmt*)nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_LEADER_STMT); - CHECK_OUT_OF_MEM(pStmt); + SBalanceVgroupLeaderStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_LEADER_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); if (NULL != pVgId && NULL != pVgId->z) { pStmt->vgId = taosStr2Int32(pVgId->z, NULL, 10); } @@ -2899,9 +3102,9 @@ SNode* createBalanceVgroupLeaderStmt(SAstCreateContext* pCxt, const SToken* pVgI SNode* createBalanceVgroupLeaderDBNameStmt(SAstCreateContext* pCxt, const SToken* pDbName) { CHECK_PARSER_STATUS(pCxt); - SBalanceVgroupLeaderStmt* pStmt = - (SBalanceVgroupLeaderStmt*)nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SBalanceVgroupLeaderStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); if (NULL != pDbName) { COPY_STRING_FORM_ID_TOKEN(pStmt->dbName, pDbName); } @@ -2910,8 +3113,9 @@ SNode* createBalanceVgroupLeaderDBNameStmt(SAstCreateContext* pCxt, const SToken SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, const SToken* pVgId2) { CHECK_PARSER_STATUS(pCxt); - SMergeVgroupStmt* pStmt = (SMergeVgroupStmt*)nodesMakeNode(QUERY_NODE_MERGE_VGROUP_STMT); - CHECK_OUT_OF_MEM(pStmt); + SMergeVgroupStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_MERGE_VGROUP_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->vgId1 = taosStr2Int32(pVgId1->z, NULL, 10); pStmt->vgId2 = taosStr2Int32(pVgId2->z, NULL, 10); return (SNode*)pStmt; @@ -2919,8 +3123,9 @@ SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, cons SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId, SNodeList* pDnodes) { CHECK_PARSER_STATUS(pCxt); - SRedistributeVgroupStmt* pStmt = (SRedistributeVgroupStmt*)nodesMakeNode(QUERY_NODE_REDISTRIBUTE_VGROUP_STMT); - CHECK_OUT_OF_MEM(pStmt); + SRedistributeVgroupStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_REDISTRIBUTE_VGROUP_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->vgId = taosStr2Int32(pVgId->z, NULL, 10); pStmt->pDnodes = pDnodes; return (SNode*)pStmt; @@ -2928,16 +3133,18 @@ SNode* createRedistributeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId SNode* createSplitVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId) { CHECK_PARSER_STATUS(pCxt); - SSplitVgroupStmt* pStmt = (SSplitVgroupStmt*)nodesMakeNode(QUERY_NODE_SPLIT_VGROUP_STMT); - CHECK_OUT_OF_MEM(pStmt); + SSplitVgroupStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SPLIT_VGROUP_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->vgId = taosStr2Int32(pVgId->z, NULL, 10); return (SNode*)pStmt; } SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName) { CHECK_PARSER_STATUS(pCxt); - SNode* pStmt = nodesMakeNode(QUERY_NODE_SYNCDB_STMT); - CHECK_OUT_OF_MEM(pStmt); + SNode* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SYNCDB_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); return pStmt; } @@ -2948,8 +3155,9 @@ SNode* createGrantStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* !checkTableName(pCxt, &pPrivLevel->second)) { return NULL; } - SGrantStmt* pStmt = (SGrantStmt*)nodesMakeNode(QUERY_NODE_GRANT_STMT); - CHECK_OUT_OF_MEM(pStmt); + SGrantStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_GRANT_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->privileges = privileges; COPY_STRING_FORM_ID_TOKEN(pStmt->objName, &pPrivLevel->first); if (TK_NK_NIL != pPrivLevel->second.type && TK_NK_STAR != pPrivLevel->second.type) { @@ -2966,8 +3174,9 @@ SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* if (!checkDbName(pCxt, &pPrivLevel->first, false) || !checkUserName(pCxt, pUserName)) { return NULL; } - SRevokeStmt* pStmt = (SRevokeStmt*)nodesMakeNode(QUERY_NODE_REVOKE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SRevokeStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_REVOKE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->privileges = privileges; COPY_STRING_FORM_ID_TOKEN(pStmt->objName, &pPrivLevel->first); if (TK_NK_NIL != pPrivLevel->second.type && TK_NK_STAR != pPrivLevel->second.type) { @@ -2979,20 +3188,28 @@ SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, STokenPair* } SNode* createFuncForDelete(SAstCreateContext* pCxt, const char* pFuncName) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - CHECK_OUT_OF_MEM(pFunc); + SFunctionNode* pFunc = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); + CHECK_MAKE_NODE(pFunc); snprintf(pFunc->functionName, sizeof(pFunc->functionName), "%s", pFuncName); - if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pFunc->pParameterList, createPrimaryKeyCol(pCxt, NULL))) { + SNode* pCol = createPrimaryKeyCol(pCxt, NULL); + if (!pCol) { nodesDestroyNode((SNode*)pFunc); - CHECK_OUT_OF_MEM(NULL); + return NULL; + } + pCxt->errCode = nodesListMakeStrictAppend(&pFunc->pParameterList, pCol); + if (TSDB_CODE_SUCCESS != pCxt->errCode) { + nodesDestroyNode((SNode*)pFunc); + return NULL; } return (SNode*)pFunc; } SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere) { CHECK_PARSER_STATUS(pCxt); - SDeleteStmt* pStmt = (SDeleteStmt*)nodesMakeNode(QUERY_NODE_DELETE_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDeleteStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DELETE_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pFromTable = pTable; pStmt->pWhere = pWhere; pStmt->pCountFunc = createFuncForDelete(pCxt, "count"); @@ -3000,15 +3217,16 @@ SNode* createDeleteStmt(SAstCreateContext* pCxt, SNode* pTable, SNode* pWhere) { pStmt->pLastFunc = createFuncForDelete(pCxt, "last"); if (NULL == pStmt->pCountFunc || NULL == pStmt->pFirstFunc || NULL == pStmt->pLastFunc) { nodesDestroyNode((SNode*)pStmt); - CHECK_OUT_OF_MEM(NULL); + CHECK_MAKE_NODE(NULL); } return (SNode*)pStmt; } SNode* createInsertStmt(SAstCreateContext* pCxt, SNode* pTable, SNodeList* pCols, SNode* pQuery) { CHECK_PARSER_STATUS(pCxt); - SInsertStmt* pStmt = (SInsertStmt*)nodesMakeNode(QUERY_NODE_INSERT_STMT); - CHECK_OUT_OF_MEM(pStmt); + SInsertStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_INSERT_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pTable = pTable; pStmt->pCols = pCols; pStmt->pQuery = pQuery; @@ -3028,18 +3246,18 @@ SNode* createCreateTSMAStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* return NULL; } - SCreateTSMAStmt* pStmt = (SCreateTSMAStmt*)nodesMakeNode(QUERY_NODE_CREATE_TSMA_STMT); - CHECK_OUT_OF_MEM(pStmt); + SCreateTSMAStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_CREATE_TSMA_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->ignoreExists = ignoreExists; if (!pOptions) { // recursive tsma - pStmt->pOptions = (STSMAOptions*)nodesMakeNode(QUERY_NODE_TSMA_OPTIONS); + pStmt->pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TSMA_OPTIONS, (SNode**)&pStmt->pOptions); if (!pStmt->pOptions) { nodesDestroyNode(pInterval); nodesDestroyNode((SNode*)pStmt); - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; - snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "Out of memory"); return NULL; } pStmt->pOptions->recursiveTsma = true; @@ -3060,28 +3278,26 @@ SNode* createCreateTSMAStmt(SAstCreateContext* pCxt, bool ignoreExists, SToken* SNode* createTSMAOptions(SAstCreateContext* pCxt, SNodeList* pFuncs) { CHECK_PARSER_STATUS(pCxt); - STSMAOptions* pOptions = (STSMAOptions*)nodesMakeNode(QUERY_NODE_TSMA_OPTIONS); - if (!pOptions) { - // nodesDestroyList(pTSMAFuncs); - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; - snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "Out of memory"); - return NULL; - } + STSMAOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TSMA_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); pOptions->pFuncs = pFuncs; return (SNode*)pOptions; } SNode* createDefaultTSMAOptions(SAstCreateContext* pCxt) { CHECK_PARSER_STATUS(pCxt); - STSMAOptions* pOptions = (STSMAOptions*)nodesMakeNode(QUERY_NODE_TSMA_OPTIONS); - CHECK_OUT_OF_MEM(pOptions); + STSMAOptions* pOptions = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_TSMA_OPTIONS, (SNode**)&pOptions); + CHECK_MAKE_NODE(pOptions); return (SNode*)pOptions; } SNode* createDropTSMAStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* pRealTable) { CHECK_PARSER_STATUS(pCxt); - SDropTSMAStmt* pStmt = (SDropTSMAStmt*)nodesMakeNode(QUERY_NODE_DROP_TSMA_STMT); - CHECK_OUT_OF_MEM(pStmt); + SDropTSMAStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_DROP_TSMA_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->ignoreNotExists = ignoreNotExists; SRealTableNode* pTableNode = (SRealTableNode*)pRealTable; @@ -3096,8 +3312,9 @@ SNode* createDropTSMAStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode* SNode* createShowTSMASStmt(SAstCreateContext* pCxt, SNode* dbName) { CHECK_PARSER_STATUS(pCxt); - SShowStmt* pStmt = (SShowStmt*)nodesMakeNode(QUERY_NODE_SHOW_TSMAS_STMT); - CHECK_OUT_OF_MEM(pStmt); + SShowStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_SHOW_TSMAS_STMT, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); pStmt->pDbName = dbName; return (SNode*)pStmt; diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index fa4b57c2b4..49be0b8d90 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -30,9 +30,10 @@ extern void ParseFree(void*, FFree); extern void ParseTrace(FILE*, char*); int32_t buildQueryAfterParse(SQuery** pQuery, SNode* pRootNode, int16_t placeholderNo, SArray** pPlaceholderValues) { - *pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); + *pQuery = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)pQuery); if (NULL == *pQuery) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } (*pQuery)->pRoot = pRootNode; (*pQuery)->placeholderNum = placeholderNo; @@ -424,7 +425,7 @@ static int32_t collectMetaKeyFromDescribe(SCollectMetaKeyCxt* pCxt, SDescribeStm #ifdef TD_ENTERPRISE if (TSDB_CODE_SUCCESS == code) { char dbFName[TSDB_DB_FNAME_LEN]; - tNameGetFullDbName(&name, dbFName); + (void)tNameGetFullDbName(&name, dbFName); code = catalogRemoveViewMeta(pCxt->pParseCxt->pCatalog, dbFName, 0, pStmt->tableName, 0); } #endif @@ -439,9 +440,9 @@ static int32_t collectMetaKeyFromCreateStream(SCollectMetaKeyCxt* pCxt, SCreateS reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->targetDbName, pStmt->targetTabName, pCxt->pMetaCache); if (TSDB_CODE_SUCCESS == code && NULL != pStmt->pSubtable && NULL != pStmt->pQuery) { SSelectStmt* pSelect = (SSelectStmt*)pStmt->pQuery; - pSelect->pSubtable = nodesCloneNode(pStmt->pSubtable); + int32_t code = nodesCloneNode(pStmt->pSubtable, &pSelect->pSubtable); if (NULL == pSelect->pSubtable) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } if (TSDB_CODE_SUCCESS == code) { @@ -724,7 +725,7 @@ static int32_t collectMetaKeyFromShowCreateView(SCollectMetaKeyCxt* pCxt, SShowC strcpy(name.dbname, pStmt->dbName); strcpy(name.tname, pStmt->viewName); char dbFName[TSDB_DB_FNAME_LEN]; - tNameGetFullDbName(&name, dbFName); + (void)tNameGetFullDbName(&name, dbFName); int32_t code = catalogRemoveViewMeta(pCxt->pParseCxt->pCatalog, dbFName, 0, pStmt->viewName, 0); if (TSDB_CODE_SUCCESS == code) { code = reserveViewUserAuthInCache(pCxt->pParseCxt->acctId, pCxt->pParseCxt->pUser, pStmt->dbName, pStmt->viewName, diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index 03fda3681f..60cc1024bf 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -34,7 +34,7 @@ typedef struct SAuthRewriteCxt { static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt); -static void setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, +static int32_t setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, bool isView, bool effective, SUserAuthInfo* pAuth) { if (effective) { snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pEffectiveUser ? pCxt->pEffectiveUser : ""); @@ -43,12 +43,14 @@ static void setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char } if (NULL == pTabName) { - tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName)); + int32_t code = tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName)); + if (TSDB_CODE_SUCCESS != code) return code; } else { - toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName); + (void)toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName); } pAuth->type = type; pAuth->isView = isView; + return TSDB_CODE_SUCCESS; } static int32_t checkAuthImpl(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, SNode** pCond, bool isView, bool effective) { @@ -59,8 +61,8 @@ static int32_t checkAuthImpl(SAuthCxt* pCxt, const char* pDbName, const char* pT AUTH_RES_TYPE auth_res_type = isView ? AUTH_RES_VIEW : AUTH_RES_BASIC; SUserAuthInfo authInfo = {0}; - setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, type, isView, effective, &authInfo); - int32_t code = TSDB_CODE_SUCCESS; + int32_t code = setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, type, isView, effective, &authInfo); + if (TSDB_CODE_SUCCESS != code) return code; SUserAuthRes authRes = {0}; if (NULL != pCxt->pMetaCache) { code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes); @@ -105,14 +107,15 @@ static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) { } static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) { - SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SLogicConditionNode* pLogicCond = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond); if (NULL == pLogicCond) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; pLogicCond->condType = LOGIC_COND_TYPE_AND; - int32_t code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond); + code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond); if (TSDB_CODE_SUCCESS == code) { code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere); } @@ -136,9 +139,10 @@ EDealRes rewriteAuthTable(SNode* pNode, void* pContext) { } static int32_t rewriteAppendStableTagCond(SNode** pWhere, SNode* pTagCond, STableNode* pTable) { - SNode* pTagCondCopy = nodesCloneNode(pTagCond); + SNode* pTagCondCopy = NULL; + int32_t code = nodesCloneNode(pTagCond, &pTagCondCopy); if (NULL == pTagCondCopy) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SAuthRewriteCxt cxt = {.pTarget = pTable}; diff --git a/source/libs/parser/src/parCalcConst.c b/source/libs/parser/src/parCalcConst.c index af24624067..87b434a202 100644 --- a/source/libs/parser/src/parCalcConst.c +++ b/source/libs/parser/src/parCalcConst.c @@ -72,9 +72,10 @@ static bool isCondition(const SNode* pNode) { } static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) { - SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOp = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOp); if (NULL == pOp) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pOp->opType = OP_TYPE_IS_TRUE; pOp->pLeft = pSrc; @@ -179,9 +180,9 @@ static EDealRes doFindAndReplaceNode(SNode** pNode, void* pContext) { char aliasName[TSDB_COL_NAME_LEN] = {0}; strcpy(aliasName, ((SExprNode*)*pNode)->aliasName); nodesDestroyNode(*pNode); - *pNode = nodesCloneNode(pCxt->replaceCxt.pNew); + *pNode = NULL; + pCxt->code = nodesCloneNode(pCxt->replaceCxt.pNew, pNode); if (NULL == *pNode) { - pCxt->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } strcpy(((SExprNode*)*pNode)->aliasName, aliasName); @@ -231,12 +232,14 @@ static int32_t calcConstProject(SCalcConstContext* pCxt, SNode* pProject, bool d SArray* pOrigAss = NULL; TSWAP(((SExprNode*)*pCol)->pAssociation, pOrigAss); nodesDestroyNode(*pCol); - *pCol = nodesCloneNode(*pNew); - TSWAP(pOrigAss, ((SExprNode*)*pCol)->pAssociation); + *pCol = NULL; + code = nodesCloneNode(*pNew, pCol); + if (TSDB_CODE_SUCCESS == code) { + strcpy(((SExprNode*)*pCol)->aliasName, aliasName); + TSWAP(pOrigAss, ((SExprNode*)*pCol)->pAssociation); + } taosArrayDestroy(pOrigAss); - strcpy(((SExprNode*)*pCol)->aliasName, aliasName); - if (NULL == *pCol) { - code = TSDB_CODE_OUT_OF_MEMORY; + if (TSDB_CODE_SUCCESS != code) { break; } } else { @@ -276,17 +279,23 @@ static bool isUselessCol(SExprNode* pProj) { return NULL == ((SExprNode*)pProj)->pAssociation; } -static SNode* createConstantValue() { - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); +static int32_t createConstantValue(SValueNode** ppNode) { + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); if (NULL == pVal) { - return NULL; + return code; } pVal->node.resType.type = TSDB_DATA_TYPE_INT; pVal->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes; const int32_t val = 1; - nodesSetValueNodeValue(pVal, (void*)&val); - pVal->translate = true; - return (SNode*)pVal; + code = nodesSetValueNodeValue(pVal, (void*)&val); + if (TSDB_CODE_SUCCESS == code) { + pVal->translate = true; + *ppNode = pVal; + } else { + nodesDestroyNode((SNode*)pVal); + } + return code; } static int32_t calcConstProjections(SCalcConstContext* pCxt, SSelectStmt* pSelect, bool subquery) { @@ -306,7 +315,11 @@ static int32_t calcConstProjections(SCalcConstContext* pCxt, SSelectStmt* pSelec WHERE_NEXT; } if (0 == LIST_LENGTH(pSelect->pProjectionList)) { - return nodesListStrictAppend(pSelect->pProjectionList, createConstantValue()); + SValueNode* pVal = NULL; + int32_t code = createConstantValue(&pVal); + if (TSDB_CODE_SUCCESS == code) { + return nodesListStrictAppend(pSelect->pProjectionList, (SNode*)pVal); + } } return TSDB_CODE_SUCCESS; } @@ -412,12 +425,12 @@ static SNodeList* getChildProjection(SNode* pStmt) { static void eraseSetOpChildProjection(SSetOperator* pSetOp, int32_t index) { SNodeList* pLeftProjs = getChildProjection(pSetOp->pLeft); - nodesListErase(pLeftProjs, nodesListGetCell(pLeftProjs, index)); + (void)nodesListErase(pLeftProjs, nodesListGetCell(pLeftProjs, index)); if (QUERY_NODE_SET_OPERATOR == nodeType(pSetOp->pLeft)) { eraseSetOpChildProjection((SSetOperator*)pSetOp->pLeft, index); } SNodeList* pRightProjs = getChildProjection(pSetOp->pRight); - nodesListErase(pRightProjs, nodesListGetCell(pRightProjs, index)); + (void)nodesListErase(pRightProjs, nodesListGetCell(pRightProjs, index)); if (QUERY_NODE_SET_OPERATOR == nodeType(pSetOp->pRight)) { eraseSetOpChildProjection((SSetOperator*)pSetOp->pRight, index); } @@ -495,7 +508,11 @@ static int32_t calcConstSetOpProjections(SCalcConstContext* pCxt, SSetOperator* WHERE_NEXT; } if (0 == LIST_LENGTH(pSetOp->pProjectionList)) { - return nodesListStrictAppend(pSetOp->pProjectionList, createConstantValue()); + SValueNode* pVal = NULL; + int32_t code = createConstantValue(&pVal); + if (TSDB_CODE_SUCCESS == code) { + return nodesListStrictAppend(pSetOp->pProjectionList, (SNode*)pVal); + } } return TSDB_CODE_SUCCESS; } diff --git a/source/libs/parser/src/parInsertSml.c b/source/libs/parser/src/parInsertSml.c index 89eaf14f75..acd1851d76 100644 --- a/source/libs/parser/src/parInsertSml.c +++ b/source/libs/parser/src/parInsertSml.c @@ -296,13 +296,13 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc int ret = insInitBoundColsInfo(getNumOfTags(pTableMeta), &bindTags); if (ret != TSDB_CODE_SUCCESS) { - buildInvalidOperationMsg(&pBuf, "init bound cols error"); + ret = buildInvalidOperationMsg(&pBuf, "init bound cols error"); goto end; } ret = smlBoundColumnData(tags, &bindTags, pTagsSchema, true); if (ret != TSDB_CODE_SUCCESS) { - buildInvalidOperationMsg(&pBuf, "bound tags error"); + ret = buildInvalidOperationMsg(&pBuf, "bound tags error"); goto end; } @@ -347,20 +347,20 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid, sizeof(pTableMeta->uid), pTableMeta, &pCreateTblReq, &pTableCxt, false, false); if (ret != TSDB_CODE_SUCCESS) { - buildInvalidOperationMsg(&pBuf, "insGetTableDataCxt error"); + ret = buildInvalidOperationMsg(&pBuf, "insGetTableDataCxt error"); goto end; } SSchema* pSchema = getTableColumnSchema(pTableMeta); ret = smlBoundColumnData(colsSchema, &pTableCxt->boundColsInfo, pSchema, false); if (ret != TSDB_CODE_SUCCESS) { - buildInvalidOperationMsg(&pBuf, "bound cols error"); + ret = buildInvalidOperationMsg(&pBuf, "bound cols error"); goto end; } ret = initTableColSubmitData(pTableCxt); if (ret != TSDB_CODE_SUCCESS) { - buildInvalidOperationMsg(&pBuf, "initTableColSubmitData error"); + ret = buildInvalidOperationMsg(&pBuf, "initTableColSubmitData error"); goto end; } @@ -407,7 +407,7 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc if (errno == E2BIG) { uError("sml bind taosMbsToUcs4 error, kv length:%d, bytes:%d, kv->value:%s", (int)kv->length, pColSchema->bytes, kv->value); - buildInvalidOperationMsg(&pBuf, "value too long"); + (void)buildInvalidOperationMsg(&pBuf, "value too long"); ret = TSDB_CODE_PAR_VALUE_TOO_LONG; goto end; } @@ -440,7 +440,7 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc } ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow); if (TSDB_CODE_SUCCESS != ret) { - buildInvalidOperationMsg(&pBuf, "tRowBuild error"); + ret = buildInvalidOperationMsg(&pBuf, "tRowBuild error"); goto end; } SRowKey key; @@ -459,19 +459,21 @@ end: int32_t smlInitHandle(SQuery** query) { *query = NULL; - SQuery* pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); + SQuery* pQuery = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pQuery); if (NULL == pQuery) { uError("create pQuery error"); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE; pQuery->haveResultSet = false; pQuery->msgType = TDMT_VND_SUBMIT; - SVnodeModifyOpStmt* stmt = (SVnodeModifyOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT); + SVnodeModifyOpStmt* stmt = NULL; + code = nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT, (SNode**)&stmt); if (NULL == stmt) { uError("create SVnodeModifyOpStmt error"); qDestroyQuery(pQuery); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } stmt->pTableBlockHashObj = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK); if (stmt->pTableBlockHashObj == NULL){ diff --git a/source/libs/parser/src/parInsertSql.c b/source/libs/parser/src/parInsertSql.c index 0d0fe75ddb..70bd43559c 100644 --- a/source/libs/parser/src/parInsertSql.c +++ b/source/libs/parser/src/parInsertSql.c @@ -142,7 +142,10 @@ static int32_t parseDuplicateUsingClause(SInsertParseContext* pCxt, SVnodeModify *pDuplicate = false; char tbFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(&pStmt->targetTableName, tbFName); + code = tNameExtractFullName(&pStmt->targetTableName, tbFName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } STableMeta** pMeta = taosHashGet(pStmt->pSubTableHashObj, tbFName, strlen(tbFName)); if (NULL != pMeta) { *pDuplicate = true; @@ -708,7 +711,10 @@ static int32_t parseTagToken(const char** end, SToken* pToken, SSchema* pSchema, // input pStmt->pSql: [(tag1_name, ...)] TAGS (tag1_value, ...) ... // output pStmt->pSql: TAGS (tag1_value, ...) ... static int32_t parseBoundTagsClause(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt) { - insInitBoundColsInfo(getNumOfTags(pStmt->pTableMeta), &pCxt->tags); + int32_t code = insInitBoundColsInfo(getNumOfTags(pStmt->pTableMeta), &pCxt->tags); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SToken token; int32_t index = 0; @@ -725,7 +731,9 @@ int32_t parseTagValue(SMsgBuf* pMsgBuf, const char** pSql, uint8_t precision, SS SArray* pTagName, SArray* pTagVals, STag** pTag) { bool isNull = isNullValue(pTagSchema->type, pToken); if (!isNull && pTagName) { - taosArrayPush(pTagName, pTagSchema->name); + if (NULL == taosArrayPush(pTagName, pTagSchema->name)) { + return TSDB_CODE_OUT_OF_MEMORY; + } } if (pTagSchema->type == TSDB_DATA_TYPE_JSON) { @@ -745,7 +753,9 @@ int32_t parseTagValue(SMsgBuf* pMsgBuf, const char** pSql, uint8_t precision, SS STagVal val = {0}; int32_t code = parseTagToken(pSql, pToken, pTagSchema, precision, &val, pMsgBuf); if (TSDB_CODE_SUCCESS == code) { - taosArrayPush(pTagVals, &val); + if (NULL == taosArrayPush(pTagVals, &val)){ + code = TSDB_CODE_OUT_OF_MEMORY; + } } return code; @@ -796,9 +806,10 @@ typedef struct SRewriteTagCondCxt { } SRewriteTagCondCxt; static int32_t rewriteTagCondColumnImpl(STagVal* pVal, SNode** pNode) { - SValueNode* pValue = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode* pValue = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValue); if (NULL == pValue) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pValue->node.resType = ((SColumnNode*)*pNode)->node.resType; @@ -1028,8 +1039,16 @@ static int32_t storeChildTableMeta(SInsertParseContext* pCxt, SVnodeModifyOpStmt } char tbFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(&pStmt->targetTableName, tbFName); - return taosHashPut(pStmt->pSubTableHashObj, tbFName, strlen(tbFName), &pBackup, POINTER_BYTES); + int32_t code = tNameExtractFullName(&pStmt->targetTableName, tbFName); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(pBackup); + return code; + } + code = taosHashPut(pStmt->pSubTableHashObj, tbFName, strlen(tbFName), &pBackup, POINTER_BYTES); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(pBackup); + } + return code; } static int32_t parseTableOptions(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt) { @@ -1215,13 +1234,16 @@ static int32_t getTargetTableMetaAndVgroup(SInsertParseContext* pCxt, SVnodeModi static int32_t collectUseTable(const SName* pName, SHashObj* pTable) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pName, fullName); + int32_t code = tNameExtractFullName(pName, fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } return taosHashPut(pTable, fullName, strlen(fullName), pName, sizeof(SName)); } static int32_t collectUseDatabase(const SName* pName, SHashObj* pDbs) { char dbFName[TSDB_DB_FNAME_LEN] = {0}; - tNameGetFullDbName(pName, dbFName); + (void)tNameGetFullDbName(pName, dbFName); return taosHashPut(pDbs, dbFName, strlen(dbFName), dbFName, sizeof(dbFName)); } @@ -1240,7 +1262,8 @@ static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifyOpStm pCxt->needTableTagVal = (NULL != pTagCond); pCxt->missCache = (NULL != pTagCond); } else { - pStmt->pTagCond = nodesCloneNode(pTagCond); + pStmt->pTagCond = NULL; + code = nodesCloneNode(pTagCond, &pStmt->pTagCond); } } nodesDestroyNode(pTagCond); @@ -1357,7 +1380,10 @@ static int32_t getTableDataCxt(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pS } char tbFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(&pStmt->targetTableName, tbFName); + int32_t code = tNameExtractFullName(&pStmt->targetTableName, tbFName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (pStmt->usingTableProcessing) { pStmt->pTableMeta->uid = 0; } @@ -1860,9 +1886,11 @@ static int32_t getStbRowValues(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pS } bool ctbFirst = true; + char ctbFName[TSDB_TABLE_FNAME_LEN]; if (code == TSDB_CODE_SUCCESS) { - char ctbFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(&pStbRowsCxt->ctbName, ctbFName); + code = tNameExtractFullName(&pStbRowsCxt->ctbName, ctbFName); + } + if (TSDB_CODE_SUCCESS == code) { STableMeta** pCtbMeta = taosHashGet(pStmt->pSubTableHashObj, ctbFName, strlen(ctbFName)); ctbFirst = (pCtbMeta == NULL); if (!ctbFirst) { @@ -1899,23 +1927,31 @@ static int32_t processCtbAutoCreationAndCtbMeta(SInsertParseContext* pCxt, SVnod if (code == TSDB_CODE_SUCCESS) { char ctbFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(&pStbRowsCxt->ctbName, ctbFName); + code = tNameExtractFullName(&pStbRowsCxt->ctbName, ctbFName); SVgroupInfo vg; SRequestConnInfo conn = {.pTrans = pCxt->pComCxt->pTransporter, - .requestId = pCxt->pComCxt->requestId, - .requestObjRefId = pCxt->pComCxt->requestRid, - .mgmtEps = pCxt->pComCxt->mgmtEpSet}; - code = catalogGetTableHashVgroup(pCxt->pComCxt->pCatalog, &conn, &pStbRowsCxt->ctbName, &vg); + .requestId = pCxt->pComCxt->requestId, + .requestObjRefId = pCxt->pComCxt->requestRid, + .mgmtEps = pCxt->pComCxt->mgmtEpSet}; + if (TSDB_CODE_SUCCESS == code) { + code = catalogGetTableHashVgroup(pCxt->pComCxt->pCatalog, &conn, &pStbRowsCxt->ctbName, &vg); + } if (code == TSDB_CODE_SUCCESS) { - taosHashPut(pStmt->pVgroupsHashObj, (const char*)(&vg.vgId), sizeof(vg.vgId), &vg, sizeof(vg)); + code = taosHashPut(pStmt->pVgroupsHashObj, (const char*)(&vg.vgId), sizeof(vg.vgId), &vg, sizeof(vg)); + } + STableMeta* pBackup = NULL; + if (TSDB_CODE_SUCCESS == code) { pStbRowsCxt->pCtbMeta->uid = taosHashGetSize(pStmt->pSubTableHashObj) + 1; pStbRowsCxt->pCtbMeta->vgId = vg.vgId; - STableMeta* pBackup = NULL; - cloneTableMeta(pStbRowsCxt->pCtbMeta, &pBackup); - taosHashPut(pStmt->pSubTableHashObj, ctbFName, strlen(ctbFName), &pBackup, POINTER_BYTES); + code = cloneTableMeta(pStbRowsCxt->pCtbMeta, &pBackup); + } + if (TSDB_CODE_SUCCESS == code) { + code = taosHashPut(pStmt->pSubTableHashObj, ctbFName, strlen(ctbFName), &pBackup, POINTER_BYTES); + } + if (TSDB_CODE_SUCCESS == code) { + code = collectUseTable(&pStbRowsCxt->ctbName, pStmt->pTableNameHashObj); } - collectUseTable(&pStbRowsCxt->ctbName, pStmt->pTableNameHashObj); } return code; } @@ -2126,7 +2162,7 @@ static int32_t parseCsvFile(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt bool gotRow = false; if (TSDB_CODE_SUCCESS == code) { SToken token; - strtolower(pLine, pLine); + (void)strtolower(pLine, pLine); const char* pRow = pLine; if (!pStmt->stbSyntax) { code = parseOneRow(pCxt, (const char**)&pRow, rowsDataCxt.pTableDataCxt, &gotRow, &token); @@ -2137,8 +2173,11 @@ static int32_t parseCsvFile(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt if (code == TSDB_CODE_SUCCESS) { SStbRowsDataContext* pStbRowsCxt = rowsDataCxt.pStbRowsCxt; void* pData = pTableDataCxt; - taosHashPut(pStmt->pTableCxtHashObj, &pStbRowsCxt->pCtbMeta->uid, sizeof(pStbRowsCxt->pCtbMeta->uid), &pData, + code = taosHashPut(pStmt->pTableCxtHashObj, &pStbRowsCxt->pCtbMeta->uid, sizeof(pStbRowsCxt->pCtbMeta->uid), &pData, POINTER_BYTES); + if (TSDB_CODE_SUCCESS != code) { + break; + } } } if (code && firstLine) { @@ -2175,6 +2214,9 @@ static int32_t parseDataFromFileImpl(SInsertParseContext* pCxt, SVnodeModifyOpSt // init only for file if (NULL == pStmt->pTableCxtHashObj) { pStmt->pTableCxtHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); + if (!pStmt->pTableCxtHashObj) { + return TSDB_CODE_OUT_OF_MEMORY; + } } int32_t numOfRows = 0; int32_t code = parseCsvFile(pCxt, pStmt, rowsDataCxt, &numOfRows); @@ -2186,7 +2228,10 @@ static int32_t parseDataFromFileImpl(SInsertParseContext* pCxt, SVnodeModifyOpSt rowsDataCxt.pTableDataCxt->pData->flags |= SUBMIT_REQ_FROM_FILE; } if (!pStmt->fileProcessing) { - taosCloseFile(&pStmt->fp); + code = taosCloseFile(&pStmt->fp); + if (TSDB_CODE_SUCCESS != code) { + parserWarn("0x%" PRIx64 " failed to close file.", pCxt->pComCxt->requestId); + } } else { parserDebug("0x%" PRIx64 " insert from csv. File is too large, do it in batches.", pCxt->pComCxt->requestId); } @@ -2198,7 +2243,7 @@ static int32_t parseDataFromFileImpl(SInsertParseContext* pCxt, SVnodeModifyOpSt // just record pTableCxt whose data come from file if (!pStmt->stbSyntax && numOfRows > 0) { void* pData = rowsDataCxt.pTableDataCxt; - taosHashPut(pStmt->pTableCxtHashObj, &pStmt->pTableMeta->uid, sizeof(pStmt->pTableMeta->uid), &pData, + code = taosHashPut(pStmt->pTableCxtHashObj, &pStmt->pTableMeta->uid, sizeof(pStmt->pTableMeta->uid), &pData, POINTER_BYTES); } @@ -2209,7 +2254,7 @@ static int32_t parseDataFromFile(SInsertParseContext* pCxt, SVnodeModifyOpStmt* SRowsDataContext rowsDataCxt) { char filePathStr[TSDB_FILENAME_LEN] = {0}; if (TK_NK_STRING == pFilePath->type) { - trimString(pFilePath->z, pFilePath->n, filePathStr, sizeof(filePathStr)); + (void)trimString(pFilePath->z, pFilePath->n, filePathStr, sizeof(filePathStr)); } else { strncpy(filePathStr, pFilePath->z, pFilePath->n); } @@ -2275,32 +2320,54 @@ static int32_t constructStbRowsDataContext(SVnodeModifyOpStmt* pStmt, SStbRowsDa return TSDB_CODE_OUT_OF_MEMORY; } tNameAssign(&pStbRowsCxt->stbName, &pStmt->targetTableName); - collectUseTable(&pStbRowsCxt->stbName, pStmt->pTableNameHashObj); - collectUseDatabase(&pStbRowsCxt->stbName, pStmt->pDbFNameHashObj); + int32_t code = collectUseTable(&pStbRowsCxt->stbName, pStmt->pTableNameHashObj); + if (TSDB_CODE_SUCCESS == code) { + code = collectUseDatabase(&pStbRowsCxt->stbName, pStmt->pDbFNameHashObj); + } + if (TSDB_CODE_SUCCESS == code) { + pStbRowsCxt->ctbName.type = TSDB_TABLE_NAME_T; + pStbRowsCxt->ctbName.acctId = pStbRowsCxt->stbName.acctId; + memcpy(pStbRowsCxt->ctbName.dbname, pStbRowsCxt->stbName.dbname, sizeof(pStbRowsCxt->stbName.dbname)); - pStbRowsCxt->ctbName.type = TSDB_TABLE_NAME_T; - pStbRowsCxt->ctbName.acctId = pStbRowsCxt->stbName.acctId; - memcpy(pStbRowsCxt->ctbName.dbname, pStbRowsCxt->stbName.dbname, sizeof(pStbRowsCxt->stbName.dbname)); + pStbRowsCxt->pTagCond = pStmt->pTagCond; + pStbRowsCxt->pStbMeta = pStmt->pTableMeta; - pStbRowsCxt->pTagCond = pStmt->pTagCond; - pStbRowsCxt->pStbMeta = pStmt->pTableMeta; + code = cloneTableMeta(pStbRowsCxt->pStbMeta, &pStbRowsCxt->pCtbMeta); + } + if (TSDB_CODE_SUCCESS == code) { + pStbRowsCxt->pCtbMeta->tableType = TSDB_CHILD_TABLE; + pStbRowsCxt->pCtbMeta->suid = pStbRowsCxt->pStbMeta->uid; - cloneTableMeta(pStbRowsCxt->pStbMeta, &pStbRowsCxt->pCtbMeta); - pStbRowsCxt->pCtbMeta->tableType = TSDB_CHILD_TABLE; - pStbRowsCxt->pCtbMeta->suid = pStbRowsCxt->pStbMeta->uid; - - pStbRowsCxt->aTagNames = taosArrayInit(8, TSDB_COL_NAME_LEN); - pStbRowsCxt->aTagVals = taosArrayInit(8, sizeof(STagVal)); - - // col values and bound cols info of STableDataContext is not used - pStbRowsCxt->aColVals = taosArrayInit(getNumOfColumns(pStbRowsCxt->pStbMeta), sizeof(SColVal)); - insInitColValues(pStbRowsCxt->pStbMeta, pStbRowsCxt->aColVals); - - STableComInfo tblInfo = getTableInfo(pStmt->pTableMeta); - insInitBoundColsInfo(tblInfo.numOfColumns + tblInfo.numOfTags + 1, &pStbRowsCxt->boundColsInfo); - - *ppStbRowsCxt = pStbRowsCxt; - return TSDB_CODE_SUCCESS; + pStbRowsCxt->aTagNames = taosArrayInit(8, TSDB_COL_NAME_LEN); + if (!pStbRowsCxt->aTagNames) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + } + if (TSDB_CODE_SUCCESS == code) { + pStbRowsCxt->aTagVals = taosArrayInit(8, sizeof(STagVal)); + if (!pStbRowsCxt->aTagVals) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + } + if (TSDB_CODE_SUCCESS == code) { + // col values and bound cols info of STableDataContext is not used + pStbRowsCxt->aColVals = taosArrayInit(getNumOfColumns(pStbRowsCxt->pStbMeta), sizeof(SColVal)); + if (!pStbRowsCxt->aColVals) + code = TSDB_CODE_OUT_OF_MEMORY; + } + if (TSDB_CODE_SUCCESS == code) { + code = insInitColValues(pStbRowsCxt->pStbMeta, pStbRowsCxt->aColVals); + } + if (TSDB_CODE_SUCCESS == code) { + STableComInfo tblInfo = getTableInfo(pStmt->pTableMeta); + code = insInitBoundColsInfo(tblInfo.numOfColumns + tblInfo.numOfTags + 1, &pStbRowsCxt->boundColsInfo); + } + if (TSDB_CODE_SUCCESS == code) { + *ppStbRowsCxt = pStbRowsCxt; + } else { + clearStbRowsDataContext(pStbRowsCxt); + } + return code; } static int32_t parseInsertStbClauseBottom(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pStmt) { @@ -2535,9 +2602,10 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt, SVnodeModifyOpStmt* pS static void destroySubTableHashElem(void* p) { taosMemoryFree(*(STableMeta**)p); } static int32_t createVnodeModifOpStmt(SInsertParseContext* pCxt, bool reentry, SNode** pOutput) { - SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT); + SVnodeModifyOpStmt* pStmt = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT, (SNode**)&pStmt); if (NULL == pStmt) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } if (pCxt->pComCxt->pStmtCb) { @@ -2575,16 +2643,17 @@ static int32_t createVnodeModifOpStmt(SInsertParseContext* pCxt, bool reentry, S } static int32_t createInsertQuery(SInsertParseContext* pCxt, SQuery** pOutput) { - SQuery* pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY); + SQuery* pQuery = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_QUERY, (SNode**)&pQuery); if (NULL == pQuery) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE; pQuery->haveResultSet = false; pQuery->msgType = TDMT_VND_SUBMIT; - int32_t code = createVnodeModifOpStmt(pCxt, false, &pQuery->pRoot); + code = createVnodeModifOpStmt(pCxt, false, &pQuery->pRoot); if (TSDB_CODE_SUCCESS == code) { *pOutput = pQuery; } else { @@ -2601,10 +2670,10 @@ static int32_t checkAuthFromMetaData(const SArray* pUsers, SNode** pTagCond) { SMetaRes* pRes = taosArrayGet(pUsers, 0); if (TSDB_CODE_SUCCESS == pRes->code) { SUserAuthRes* pAuth = pRes->pRes; - if (NULL != pAuth->pCond) { - *pTagCond = nodesCloneNode(pAuth->pCond[AUTH_RES_BASIC]); + pRes->code = nodesCloneNode(pAuth->pCond[AUTH_RES_BASIC], pTagCond); + if (TSDB_CODE_SUCCESS == pRes->code) { + return pAuth->pass[AUTH_RES_BASIC] ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED; } - return pAuth->pass[AUTH_RES_BASIC] ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED; } return pRes->code; } @@ -2649,10 +2718,16 @@ static int32_t buildTagNameFromMeta(STableMeta* pMeta, SArray** pTagName) { return TSDB_CODE_OUT_OF_MEMORY; } SSchema* pSchema = getTableTagSchema(pMeta); + int32_t code = 0; for (int32_t i = 0; i < pMeta->tableInfo.numOfTags; ++i) { - taosArrayPush(*pTagName, pSchema[i].name); + if (NULL == taosArrayPush(*pTagName, pSchema[i].name)) { + code = TSDB_CODE_OUT_OF_MEMORY; + taosArrayDestroy(*pTagName); + *pTagName = NULL; + break; + } } - return TSDB_CODE_SUCCESS; + return code; } static int32_t checkSubtablePrivilegeForTable(const SArray* pTables, SVnodeModifyOpStmt* pStmt) { @@ -2740,17 +2815,19 @@ static int32_t resetVnodeModifOpStmt(SInsertParseContext* pCxt, SQuery* pQuery) if (TSDB_CODE_SUCCESS == code) { SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)pQuery->pRoot; - (*pCxt->pComCxt->pStmtCb->getExecInfoFn)(pCxt->pComCxt->pStmtCb->pStmt, &pStmt->pVgroupsHashObj, - &pStmt->pTableBlockHashObj); - if (NULL == pStmt->pVgroupsHashObj) { - pStmt->pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK); - } - if (NULL == pStmt->pTableBlockHashObj) { - pStmt->pTableBlockHashObj = + code = (*pCxt->pComCxt->pStmtCb->getExecInfoFn)(pCxt->pComCxt->pStmtCb->pStmt, &pStmt->pVgroupsHashObj, + &pStmt->pTableBlockHashObj); + if (TSDB_CODE_SUCCESS == code) { + if (NULL == pStmt->pVgroupsHashObj) { + pStmt->pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK); + } + if (NULL == pStmt->pTableBlockHashObj) { + pStmt->pTableBlockHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); - } - if (NULL == pStmt->pVgroupsHashObj || NULL == pStmt->pTableBlockHashObj) { - code = TSDB_CODE_OUT_OF_MEMORY; + } + if (NULL == pStmt->pVgroupsHashObj || NULL == pStmt->pTableBlockHashObj) { + code = TSDB_CODE_OUT_OF_MEMORY; + } } } @@ -2778,28 +2855,45 @@ static int32_t initInsertQuery(SInsertParseContext* pCxt, SCatalogReq* pCatalogR static int32_t setRefreshMeta(SQuery* pQuery) { SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)pQuery->pRoot; + int32_t code = 0; if (taosHashGetSize(pStmt->pTableNameHashObj) > 0) { taosArrayDestroy(pQuery->pTableList); pQuery->pTableList = taosArrayInit(taosHashGetSize(pStmt->pTableNameHashObj), sizeof(SName)); - SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL); - while (NULL != pTable) { - taosArrayPush(pQuery->pTableList, pTable); - pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable); + if (!pQuery->pTableList) { + code = TSDB_CODE_OUT_OF_MEMORY; + } else { + SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL); + while (NULL != pTable) { + if (NULL == taosArrayPush(pQuery->pTableList, pTable)) { + code = TSDB_CODE_OUT_OF_MEMORY; + taosHashCancelIterate(pStmt->pTableNameHashObj, pTable); + break; + } + pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable); + } } } - if (taosHashGetSize(pStmt->pDbFNameHashObj) > 0) { + if (TSDB_CODE_SUCCESS == code && taosHashGetSize(pStmt->pDbFNameHashObj) > 0) { taosArrayDestroy(pQuery->pDbList); pQuery->pDbList = taosArrayInit(taosHashGetSize(pStmt->pDbFNameHashObj), TSDB_DB_FNAME_LEN); - char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL); - while (NULL != pDb) { - taosArrayPush(pQuery->pDbList, pDb); - pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb); + if (!pQuery->pDbList) { + code = TSDB_CODE_OUT_OF_MEMORY; + } else { + char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL); + while (NULL != pDb) { + if (NULL == taosArrayPush(pQuery->pDbList, pDb)) { + code = TSDB_CODE_OUT_OF_MEMORY; + taosHashCancelIterate(pStmt->pDbFNameHashObj, pDb); + break; + } + pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb); + } } } - return TSDB_CODE_SUCCESS; + return code; } // INSERT INTO @@ -2868,7 +2962,11 @@ static int32_t buildInsertTableReq(SName* pName, SArray** pTables) { return TSDB_CODE_OUT_OF_MEMORY; } - taosArrayPush(*pTables, pName); + if (NULL == taosArrayPush(*pTables, pName)) { + taosArrayDestroy(*pTables); + *pTables = NULL; + return TSDB_CODE_OUT_OF_MEMORY; + } return TSDB_CODE_SUCCESS; } @@ -2881,11 +2979,13 @@ static int32_t buildInsertDbReq(SName* pName, SArray** pDbs) { } STablesReq req = {0}; - tNameGetFullDbName(pName, req.dbFName); - buildInsertTableReq(pName, &req.pTables); - taosArrayPush(*pDbs, &req); + (void)tNameGetFullDbName(pName, req.dbFName); + int32_t code = buildInsertTableReq(pName, &req.pTables); + if (TSDB_CODE_SUCCESS == code && NULL == taosArrayPush(*pDbs, &req)) { + code = TSDB_CODE_OUT_OF_MEMORY; + } - return TSDB_CODE_SUCCESS; + return code; } static int32_t buildInsertUserAuthReq(const char* pUser, SName* pName, SArray** pUserAuth) { @@ -2897,7 +2997,11 @@ static int32_t buildInsertUserAuthReq(const char* pUser, SName* pName, SArray** SUserAuthInfo userAuth = {.type = AUTH_TYPE_WRITE}; snprintf(userAuth.user, sizeof(userAuth.user), "%s", pUser); memcpy(&userAuth.tbName, pName, sizeof(SName)); - taosArrayPush(*pUserAuth, &userAuth); + if (NULL == taosArrayPush(*pUserAuth, &userAuth)) { + taosArrayDestroy(*pUserAuth); + *pUserAuth = NULL; + return TSDB_CODE_OUT_OF_MEMORY; + } return TSDB_CODE_SUCCESS; } diff --git a/source/libs/parser/src/parInsertStmt.c b/source/libs/parser/src/parInsertStmt.c index 2bcc7501fb..ffead946ce 100644 --- a/source/libs/parser/src/parInsertStmt.c +++ b/source/libs/parser/src/parInsertStmt.c @@ -39,8 +39,17 @@ int32_t qCloneCurrentTbData(STableDataCxt* pDataBlock, SSubmitTbData** pData) { *pNew = *pDataBlock->pData; - cloneSVreateTbReq(pDataBlock->pData->pCreateTbReq, &pNew->pCreateTbReq); + int32_t code = cloneSVreateTbReq(pDataBlock->pData->pCreateTbReq, &pNew->pCreateTbReq); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFreeClear(*pData); + return code; + } pNew->aCol = taosArrayDup(pDataBlock->pData->aCol, NULL); + if (!pNew->aCol) { + code = TSDB_CODE_OUT_OF_MEMORY; + taosMemoryFreeClear(*pData); + return code; + } int32_t colNum = taosArrayGetSize(pNew->aCol); for (int32_t i = 0; i < colNum; ++i) { @@ -152,7 +161,10 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch goto end; } } - taosArrayPush(tagName, pTagSchema->name); + if (NULL == taosArrayPush(tagName, pTagSchema->name)) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto end; + } if (pTagSchema->type == TSDB_DATA_TYPE_JSON) { if (colLen > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) { code = buildSyntaxErrMsg(&pBuf, "json string too long than 4095", bind[c].buffer); @@ -198,7 +210,10 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const ch } else { memcpy(&val.i64, bind[c].buffer, colLen); } - taosArrayPush(pTagArray, &val); + if (NULL == taosArrayPush(pTagArray, &val)) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto end; + } } } @@ -433,7 +448,7 @@ int32_t qBindStmtSingleColValue(void* pBlock, SArray* pCols, TAOS_MULTI_BIND* bi pBind = bind; } - tColDataAddValueByBind(pCol, pBind, IS_VAR_DATA_TYPE(pColSchema->type) ? pColSchema->bytes - VARSTR_HEADER_SIZE : -1); + code = tColDataAddValueByBind(pCol, pBind, IS_VAR_DATA_TYPE(pColSchema->type) ? pColSchema->bytes - VARSTR_HEADER_SIZE : -1); qDebug("stmt col %d bind %d rows data", colIdx, rowNum); diff --git a/source/libs/parser/src/parInsertUtil.c b/source/libs/parser/src/parInsertUtil.c index 7e1893ae00..3eb69afa40 100644 --- a/source/libs/parser/src/parInsertUtil.c +++ b/source/libs/parser/src/parInsertUtil.c @@ -94,7 +94,7 @@ int32_t insCreateSName(SName* pName, SToken* pTableName, int32_t acctId, const c char tbname[TSDB_TABLE_FNAME_LEN] = {0}; strncpy(tbname, p + 1, tbLen); - /*tbLen = */ strdequote(tbname); + /*tbLen = */ (void)strdequote(tbname); code = tNameFromString(pName, tbname, T_NAME_TABLE); if (code != 0) { @@ -110,7 +110,7 @@ int32_t insCreateSName(SName* pName, SToken* pTableName, int32_t acctId, const c char name[TSDB_TABLE_FNAME_LEN] = {0}; strncpy(name, pTableName->z, pTableName->n); - strdequote(name); + (void)strdequote(name); if (dbName == NULL) { return buildInvalidOperationMsg(pMsgBuf, msg3); @@ -167,15 +167,20 @@ static void initBoundCols(int32_t ncols, int16_t* pBoundCols) { } } -static void initColValues(STableMeta* pTableMeta, SArray* pValues) { +static int32_t initColValues(STableMeta* pTableMeta, SArray* pValues) { SSchema* pSchemas = getTableColumnSchema(pTableMeta); + int32_t code = 0; for (int32_t i = 0; i < pTableMeta->tableInfo.numOfColumns; ++i) { SColVal val = COL_VAL_NONE(pSchemas[i].colId, pSchemas[i].type); - taosArrayPush(pValues, &val); + if (NULL == taosArrayPush(pValues, &val)) { + code = TSDB_CODE_OUT_OF_MEMORY; + break; + } } + return code; } -void insInitColValues(STableMeta* pTableMeta, SArray* aColValues) { initColValues(pTableMeta, aColValues); } +int32_t insInitColValues(STableMeta* pTableMeta, SArray* aColValues) { return initColValues(pTableMeta, aColValues); } int32_t insInitBoundColsInfo(int32_t numOfBound, SBoundColInfo* pInfo) { pInfo->numOfCols = numOfBound; @@ -253,7 +258,7 @@ static int32_t createTableDataCxt(STableMeta* pTableMeta, SVCreateTbReq** pCreat if (NULL == pTableCxt->pValues) { code = TSDB_CODE_OUT_OF_MEMORY; } else { - initColValues(pTableMeta, pTableCxt->pValues); + code = initColValues(pTableMeta, pTableCxt->pValues); } } if (TSDB_CODE_SUCCESS == code) { @@ -281,9 +286,12 @@ static int32_t createTableDataCxt(STableMeta* pTableMeta, SVCreateTbReq** pCreat } } } - - *pOutput = pTableCxt; - qDebug("tableDataCxt created, code:%d, uid:%" PRId64 ", vgId:%d", code, pTableMeta->uid, pTableMeta->vgId); + if (TSDB_CODE_SUCCESS == code) { + *pOutput = pTableCxt; + qDebug("tableDataCxt created, code:%d, uid:%" PRId64 ", vgId:%d", code, pTableMeta->uid, pTableMeta->vgId); + } else { + insDestroyTableDataCxt(pTableCxt); + } return code; } @@ -301,24 +309,27 @@ static int32_t rebuildTableData(SSubmitTbData* pSrc, SSubmitTbData** pDst) { pTmp->pCreateTbReq = NULL; if (pTmp->flags & SUBMIT_REQ_AUTO_CREATE_TABLE) { if (pSrc->pCreateTbReq) { - cloneSVreateTbReq(pSrc->pCreateTbReq, &pTmp->pCreateTbReq); + code = cloneSVreateTbReq(pSrc->pCreateTbReq, &pTmp->pCreateTbReq); } else { pTmp->flags &= ~SUBMIT_REQ_AUTO_CREATE_TABLE; } } - - if (pTmp->flags & SUBMIT_REQ_COLUMN_DATA_FORMAT) { - pTmp->aCol = taosArrayInit(128, sizeof(SColData)); - if (NULL == pTmp->aCol) { - code = TSDB_CODE_OUT_OF_MEMORY; - taosMemoryFree(pTmp); + if (TSDB_CODE_SUCCESS == code) { + if (pTmp->flags & SUBMIT_REQ_COLUMN_DATA_FORMAT) { + pTmp->aCol = taosArrayInit(128, sizeof(SColData)); + if (NULL == pTmp->aCol) { + code = TSDB_CODE_OUT_OF_MEMORY; + taosMemoryFree(pTmp); + } + } else { + pTmp->aRowP = taosArrayInit(128, POINTER_BYTES); + if (NULL == pTmp->aRowP) { + code = TSDB_CODE_OUT_OF_MEMORY; + taosMemoryFree(pTmp); + } } } else { - pTmp->aRowP = taosArrayInit(128, POINTER_BYTES); - if (NULL == pTmp->aRowP) { - code = TSDB_CODE_OUT_OF_MEMORY; - taosMemoryFree(pTmp); - } + taosMemoryFree(pTmp); } } @@ -447,16 +458,19 @@ static int32_t fillVgroupDataCxt(STableDataCxt* pTableCxt, SVgroupDataCxt* pVgCx } // push data to submit, rebuild empty data for next submit - taosArrayPush(pVgCxt->pData->aSubmitTbData, pTableCxt->pData); + if (NULL == taosArrayPush(pVgCxt->pData->aSubmitTbData, pTableCxt->pData)) { + return TSDB_CODE_OUT_OF_MEMORY; + } + int32_t code = 0; if (isRebuild) { - rebuildTableData(pTableCxt->pData, &pTableCxt->pData); + code = rebuildTableData(pTableCxt->pData, &pTableCxt->pData); } else if (clear) { taosMemoryFreeClear(pTableCxt->pData); } qDebug("add tableDataCxt uid:%" PRId64 " to vgId:%d", pTableCxt->pMeta->uid, pVgCxt->vgId); - return TSDB_CODE_SUCCESS; + return code; } static int32_t createVgroupDataCxt(STableDataCxt* pTableCxt, SHashObj* pVgroupHash, SArray* pVgroupList, @@ -474,7 +488,11 @@ static int32_t createVgroupDataCxt(STableDataCxt* pTableCxt, SHashObj* pVgroupHa pVgCxt->vgId = pTableCxt->pMeta->vgId; int32_t code = taosHashPut(pVgroupHash, &pVgCxt->vgId, sizeof(pVgCxt->vgId), &pVgCxt, POINTER_BYTES); if (TSDB_CODE_SUCCESS == code) { - taosArrayPush(pVgroupList, &pVgCxt); + if (NULL == taosArrayPush(pVgroupList, &pVgCxt)) { + code = TSDB_CODE_OUT_OF_MEMORY; + insDestroyVgroupDataCxt(pVgCxt); + return code; + } // uDebug("td23101 2vgId:%d, uid:%" PRIu64, pVgCxt->vgId, pTableCxt->pMeta->uid); *pOutput = pVgCxt; } else { @@ -531,7 +549,10 @@ int32_t insGetStmtTableVgUid(SHashObj* pAllVgHash, SStbInterlaceInfo* pBuildInfo if (NULL == pTbInfo) { SName sname; - qCreateSName(&sname, pTbData->tbName, pBuildInfo->acctId, pBuildInfo->dbname, NULL, 0); + code = qCreateSName(&sname, pTbData->tbName, pBuildInfo->acctId, pBuildInfo->dbname, NULL, 0); + if (TSDB_CODE_SUCCESS != code) { + return code; + } STableMeta* pTableMeta = NULL; SRequestConnInfo conn = {.pTrans = pBuildInfo->transport, @@ -553,9 +574,10 @@ int32_t insGetStmtTableVgUid(SHashObj* pAllVgHash, SStbInterlaceInfo* pBuildInfo *vgId = pTableMeta->vgId; STableVgUid tbInfo = {.uid = *uid, .vgid = *vgId}; - tSimpleHashPut(pBuildInfo->pTableHash, pTbData->tbName, strlen(pTbData->tbName), &tbInfo, sizeof(tbInfo)); - - code = insTryAddTableVgroupInfo(pAllVgHash, pBuildInfo, vgId, pTbData, &sname); + code = tSimpleHashPut(pBuildInfo->pTableHash, pTbData->tbName, strlen(pTbData->tbName), &tbInfo, sizeof(tbInfo)); + if (TSDB_CODE_SUCCESS == code) { + code = insTryAddTableVgroupInfo(pAllVgHash, pBuildInfo, vgId, pTbData, &sname); + } taosMemoryFree(pTableMeta); } else { diff --git a/source/libs/parser/src/parTokenizer.c b/source/libs/parser/src/parTokenizer.c index cc5d2a1cdf..deec310862 100644 --- a/source/libs/parser/src/parTokenizer.c +++ b/source/libs/parser/src/parTokenizer.c @@ -352,22 +352,23 @@ static const char isIdChar[] = { static void* keywordHashTable = NULL; -static void doInitKeywordsTable(void) { +static int32_t doInitKeywordsTable(void) { int numOfEntries = tListLen(keywordTable); keywordHashTable = taosHashInit(numOfEntries, MurmurHash3_32, true, false); for (int32_t i = 0; i < numOfEntries; i++) { keywordTable[i].len = (uint8_t)strlen(keywordTable[i].name); void* ptr = &keywordTable[i]; - taosHashPut(keywordHashTable, keywordTable[i].name, keywordTable[i].len, (void*)&ptr, POINTER_BYTES); + int32_t code = taosHashPut(keywordHashTable, keywordTable[i].name, keywordTable[i].len, (void*)&ptr, POINTER_BYTES); + if (TSDB_CODE_SUCCESS != code) { + taosHashCleanup(keywordHashTable); + return code; + } } + return TSDB_CODE_SUCCESS; } -static TdThreadOnce keywordsHashTableInit = PTHREAD_ONCE_INIT; - static int32_t tKeywordCode(const char* z, int n) { - taosThreadOnce(&keywordsHashTableInit, doInitKeywordsTable); - char key[512] = {0}; if (n > tListLen(key)) { // too long token, can not be any other token type return TK_NK_ID; @@ -792,7 +793,7 @@ SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr, bool* pIgnoreC // check the table name is '?', db.?asf is not valid. if (TK_NK_QUESTION == type) { - tGetToken(&str[*i + t0.n + 2], &type); + (void)tGetToken(&str[*i + t0.n + 2], &type); if (TK_NK_SPACE != type) { t0.type = TK_NK_ILLEGAL; t0.n = 0; @@ -821,6 +822,10 @@ SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr, bool* pIgnoreC bool taosIsKeyWordToken(const char* z, int32_t len) { return (tKeywordCode((char*)z, len) != TK_NK_ID); } +int32_t taosInitKeywordsTable() { + return doInitKeywordsTable(); +} + void taosCleanupKeywordsTable() { void* m = keywordHashTable; if (m != NULL && atomic_val_compare_exchange_ptr(&keywordHashTable, m, 0) == m) { diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index e67001889e..b3aec983f7 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -35,15 +35,16 @@ #define CHECK_RES_OUT_OF_MEM(p) \ do { \ - if (TSDB_CODE_SUCCESS != (p)) { \ - return TSDB_CODE_OUT_OF_MEMORY; \ + int32_t code = (p); \ + if (TSDB_CODE_SUCCESS != code) { \ + return code; \ } \ } while (0) #define CHECK_POINTER_OUT_OF_MEM(p) \ do { \ if (NULL == (p)) { \ - return TSDB_CODE_OUT_OF_MEMORY; \ + return code; \ } \ } while (0) @@ -57,6 +58,7 @@ typedef struct SBuildTopicContext { bool colNotFound; STableMeta* pMeta; SNodeList* pTags; + int32_t code; } SBuildTopicContext; typedef struct SFullDatabaseName { @@ -83,6 +85,11 @@ typedef struct SCollectJoinCondsContext { int32_t code; } SCollectJoinCondsContext; +typedef struct SCollectWindowsPseudocolumnsContext { + int32_t code; + SNodeList* pCols; +} SCollectWindowsPseudocolumnsContext; + // clang-format off static const SSysTableShowAdapter sysTableShowAdapter[] = { { @@ -1054,7 +1061,10 @@ int32_t buildPartitionListFromOrderList(SNodeList* pOrderList, int32_t nodesNum, for (int32_t i = 0; i < nodesNum; ++i) { pNode = nodesListGetNode(pOrderList, i); pOrder = (SOrderByExprNode*)pNode; - code = nodesListMakeStrictAppend(&pPartitionList, nodesCloneNode(pOrder->pExpr)); + SNode* pClonedNode = NULL; + code = nodesCloneNode(pOrder->pExpr, &pClonedNode); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeStrictAppend(&pPartitionList, pClonedNode); if (TSDB_CODE_SUCCESS != code) { break; } @@ -1271,9 +1281,10 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p pCxt->pParseCxt->hasInvisibleCol = true; continue; } - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY); + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { + return generateSyntaxErrMsg(&pCxt->msgBuf, code); } setColumnInfoBySchema((SRealTableNode*)pTable, pMeta->schema + i, (i - pMeta->tableInfo.numOfColumns), pCol); setColumnPrimTs(pCxt, pCol, pTable); @@ -1284,9 +1295,10 @@ static int32_t createColumnsByTable(STranslateContext* pCxt, const STableNode* p SNodeList* pProjectList = getProjectList(pTempTable->pSubquery); SNode* pNode; FOREACH(pNode, pProjectList) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY); + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { + return generateSyntaxErrMsg(&pCxt->msgBuf, code); } code = nodesListStrictAppend(pList, (SNode*)pCol); if (TSDB_CODE_SUCCESS == code) { @@ -1458,9 +1470,10 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p } } if (*pFound) { - SNode* pNew = nodesCloneNode(pFoundNode); + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pFoundNode, &pNew); if (NULL == pNew) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + pCxt->errCode = code; return DEAL_RES_ERROR; } nodesDestroyNode(*(SNode**)pCol); @@ -1485,8 +1498,9 @@ static int32_t biMakeTbnameProjectAstNode(char* funcName, char* tableAlias, SNod int32_t code = 0; SValueNode* valNode = NULL; if (tableAlias != NULL) { - SValueNode* n = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (!n) return TSDB_CODE_OUT_OF_MEMORY; + SValueNode* n = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&n); + if (TSDB_CODE_SUCCESS != code) return code; n->literal = tstrdup(tableAlias); if (!n->literal) { nodesDestroyNode((SNode*)n); @@ -1498,11 +1512,11 @@ static int32_t biMakeTbnameProjectAstNode(char* funcName, char* tableAlias, SNod valNode = n; } - SFunctionNode* tbNameFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (!tbNameFunc) { + SFunctionNode* tbNameFunc = NULL; + code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&tbNameFunc); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)valNode); valNode = NULL; - code = TSDB_CODE_OUT_OF_MEMORY; } if (TSDB_CODE_SUCCESS == code) { tstrncpy(tbNameFunc->functionName, "tbname", TSDB_FUNC_NAME_LEN); @@ -1519,10 +1533,8 @@ static int32_t biMakeTbnameProjectAstNode(char* funcName, char* tableAlias, SNod *pOutNode = (SNode*)tbNameFunc; return code; } else { - SFunctionNode* multiResFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (!multiResFunc) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + SFunctionNode* multiResFunc = NULL; + code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&multiResFunc); if (TSDB_CODE_SUCCESS == code) { tstrncpy(multiResFunc->functionName, funcName, TSDB_FUNC_NAME_LEN); @@ -1553,9 +1565,9 @@ static int32_t biMakeTbnameProjectAstNode(char* funcName, char* tableAlias, SNod static int32_t biRewriteSelectFuncParamStar(STranslateContext* pCxt, SSelectStmt* pSelect, SNode* pNode, SListCell* pSelectListCell) { - SNodeList* pTbnameNodeList = nodesMakeList(); - if (!pTbnameNodeList) return TSDB_CODE_OUT_OF_MEMORY; - int32_t code = 0; + SNodeList* pTbnameNodeList = NULL; + int32_t code = nodesMakeList(&pTbnameNodeList); + if (!pTbnameNodeList) return code; SFunctionNode* pFunc = (SFunctionNode*)pNode; if (strcasecmp(pFunc->functionName, "last") == 0 || strcasecmp(pFunc->functionName, "last_row") == 0 || @@ -1609,8 +1621,9 @@ static int32_t biRewriteSelectFuncParamStar(STranslateContext* pCxt, SSelectStmt int32_t biRewriteSelectStar(STranslateContext* pCxt, SSelectStmt* pSelect) { int32_t code = TSDB_CODE_SUCCESS; SNode* pNode = NULL; - SNodeList* pTbnameNodeList = nodesMakeList(); - if (!pTbnameNodeList) return TSDB_CODE_OUT_OF_MEMORY; + SNodeList* pTbnameNodeList = NULL; + code = nodesMakeList(&pTbnameNodeList); + if (!pTbnameNodeList) return code; WHERE_EACH(pNode, pSelect->pProjectionList) { if (nodesIsStar(pNode)) { SArray* pTables = taosArrayGetP(pCxt->pNsLevel, pCxt->currLevel); @@ -2121,17 +2134,20 @@ static bool isCountStar(SFunctionNode* pFunc) { static int32_t rewriteCountStarAsCount1(STranslateContext* pCxt, SFunctionNode* pCount) { int32_t code = TSDB_CODE_SUCCESS; - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (NULL == pVal) { - return TSDB_CODE_OUT_OF_MEMORY; + SValueNode* pVal = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); + if (TSDB_CODE_SUCCESS != code) { + return code; } pVal->node.resType.type = TSDB_DATA_TYPE_INT; pVal->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes; const int32_t val = 1; - (void)nodesSetValueNodeValue(pVal, (void*)&val); - pVal->translate = true; - (void)nodesListErase(pCount->pParameterList, nodesListGetCell(pCount->pParameterList, 0)); - code = nodesListAppend(pCount->pParameterList, (SNode*)pVal); + code = nodesSetValueNodeValue(pVal, (void*)&val); + if (TSDB_CODE_SUCCESS == code) { + pVal->translate = true; + (void)nodesListErase(pCount->pParameterList, nodesListGetCell(pCount->pParameterList, 0)); + code = nodesListAppend(pCount->pParameterList, (SNode*)pVal); + } return code; } @@ -2196,10 +2212,9 @@ static int32_t rewriteCountNotNullValue(STranslateContext* pCxt, SFunctionNode* STableNode* pTable = NULL; int32_t code = findTable(pCxt, NULL, &pTable); if (TSDB_CODE_SUCCESS == code && QUERY_NODE_REAL_TABLE == nodeType(pTable)) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - code = TSDB_CODE_OUT_OF_MEMORY; - } else { + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS == code) { setColumnInfoBySchema((SRealTableNode*)pTable, ((SRealTableNode*)pTable)->pMeta->schema, -1, pCol); NODES_DESTORY_LIST(pCount->pParameterList); code = nodesListMakeAppend(&pCount->pParameterList, (SNode*)pCol); @@ -2226,10 +2241,9 @@ static int32_t rewriteCountTbname(STranslateContext* pCxt, SFunctionNode* pCount STableNode* pTable = NULL; int32_t code = findTable(pCxt, pTableAlias, &pTable); if (TSDB_CODE_SUCCESS == code) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - code = TSDB_CODE_OUT_OF_MEMORY; - } else { + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS == code) { setColumnInfoBySchema((SRealTableNode*)pTable, ((SRealTableNode*)pTable)->pMeta->schema, -1, pCol); NODES_DESTORY_LIST(pCount->pParameterList); code = nodesListMakeAppend(&pCount->pParameterList, (SNode*)pCol); @@ -2595,9 +2609,10 @@ static void setFuncClassification(SNode* pCurrStmt, SFunctionNode* pFunc) { } static int32_t rewriteFuncToValue(STranslateContext* pCxt, char** pLiteral, SNode** pNode) { - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (NULL == pVal) { - return TSDB_CODE_OUT_OF_MEMORY; + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); + if (TSDB_CODE_SUCCESS != code) { + return code; } strcpy(pVal->node.aliasName, ((SExprNode*)*pNode)->aliasName); strcpy(pVal->node.userAlias, ((SExprNode*)*pNode)->userAlias); @@ -2700,9 +2715,10 @@ static int32_t rewriteSystemInfoFunc(STranslateContext* pCxt, SNode** pNode) { } static int32_t replacePsedudoColumnFuncWithColumn(STranslateContext* pCxt, SNode** ppNode) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (pCol == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { + return code; } SExprNode* pOldExpr = (SExprNode*)(*ppNode); // rewrite a.tbname == tbname(a) @@ -2955,9 +2971,10 @@ static EDealRes translateLogicCond(STranslateContext* pCxt, SLogicConditionNode* } static int32_t createCastFunc(STranslateContext* pCxt, SNode* pExpr, SDataType dt, SNode** pCast) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (NULL == pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); + if (TSDB_CODE_SUCCESS != code) { + return code; } strcpy(pFunc->functionName, "cast"); pFunc->node.resType = dt; @@ -2965,7 +2982,7 @@ static int32_t createCastFunc(STranslateContext* pCxt, SNode* pExpr, SDataType d nodesDestroyNode((SNode*)pFunc); return TSDB_CODE_OUT_OF_MEMORY; } - int32_t code = getFuncInfo(pCxt, pFunc); + code = getFuncInfo(pCxt, pFunc); if (TSDB_CODE_SUCCESS != code) { nodesClearList(pFunc->pParameterList); pFunc->pParameterList = NULL; @@ -2989,9 +3006,10 @@ static bool isCondition(const SNode* pNode) { } static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) { - SOperatorNode* pOp = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); - if (NULL == pOp) { - return TSDB_CODE_OUT_OF_MEMORY; + SOperatorNode* pOp = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOp); + if (TSDB_CODE_SUCCESS != code) { + return code; } pOp->opType = OP_TYPE_IS_TRUE; pOp->pLeft = pSrc; @@ -3122,9 +3140,10 @@ static int32_t getGroupByErrorCode(STranslateContext* pCxt) { } static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (NULL == pFunc) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); + if (TSDB_CODE_SUCCESS != code) { + pCxt->errCode = code; return DEAL_RES_ERROR; } strcpy(pFunc->functionName, "_select_value"); @@ -3144,9 +3163,10 @@ static EDealRes rewriteColToSelectValFunc(STranslateContext* pCxt, SNode** pNode } static EDealRes rewriteExprToGroupKeyFunc(STranslateContext* pCxt, SNode** pNode) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (NULL == pFunc) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); + if (TSDB_CODE_SUCCESS != code) { + pCxt->errCode = code; return DEAL_RES_ERROR; } @@ -3163,9 +3183,9 @@ static EDealRes rewriteExprToGroupKeyFunc(STranslateContext* pCxt, SNode** pNode } static EDealRes rewriteExprToSelectTagFunc(STranslateContext* pCxt, SNode** pNode) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } @@ -3554,8 +3574,10 @@ static int32_t resetSelectFuncNumWithoutDup(SSelectStmt* pSelect) { if (pSelect->selectFuncNum <= 1) return TSDB_CODE_SUCCESS; pSelect->selectFuncNum = 0; pSelect->lastProcessByRowFuncId = -1; - SNodeList* pNodeList = nodesMakeList(); - int32_t code = nodesCollectSelectFuncs(pSelect, SQL_CLAUSE_FROM, NULL, fmIsSelectFunc, pNodeList); + SNodeList* pNodeList = NULL; + int32_t code = nodesMakeList(&pNodeList); + if (TSDB_CODE_SUCCESS != code) return code; + code = nodesCollectSelectFuncs(pSelect, SQL_CLAUSE_FROM, NULL, fmIsSelectFunc, pNodeList); if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pNodeList); return code; @@ -4016,9 +4038,10 @@ static EDealRes doTranslateTbName(SNode** pNode, void* pContext) { SFunctionNode* pFunc = (SFunctionNode*)*pNode; if (FUNCTION_TYPE_TBNAME == pFunc->funcType) { SRewriteTbNameContext* pCxt = (SRewriteTbNameContext*)pContext; - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (NULL == pVal) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); + if (TSDB_CODE_SUCCESS != code) { + pCxt->errCode = code; return DEAL_RES_ERROR; } @@ -4073,9 +4096,10 @@ static int32_t addPrimJoinEqCond(SNode** pCond, SRealTableNode* leftTable, SReal struct STableMeta* pLMeta = leftTable->pMeta; struct STableMeta* pRMeta = rightTable->pMeta; - *pCond = nodesMakeNode(QUERY_NODE_OPERATOR); - if (NULL == *pCond) { - return TSDB_CODE_OUT_OF_MEMORY; + *pCond = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, pCond); + if (TSDB_CODE_SUCCESS != code) { + return code; } SOperatorNode* pOp = (SOperatorNode*)*pCond; @@ -4089,10 +4113,11 @@ static int32_t addPrimJoinEqCond(SNode** pCond, SRealTableNode* leftTable, SReal pOp->opType = OP_TYPE_LOWER_EQUAL; } - SColumnNode* pLeft = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pLeft) { + SColumnNode* pLeft = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pLeft); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode(*pCond); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pLeft->node.resType.type = pLMeta->schema[0].type; pLeft->node.resType.bytes = pLMeta->schema[0].bytes; @@ -4105,10 +4130,11 @@ static int32_t addPrimJoinEqCond(SNode** pCond, SRealTableNode* leftTable, SReal pOp->pLeft = (SNode*)pLeft; - SColumnNode* pRight = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pRight) { + SColumnNode* pRight = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pRight); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode(*pCond); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pRight->node.resType.type = pRMeta->schema[0].type; pRight->node.resType.bytes = pRMeta->schema[0].bytes; @@ -4688,9 +4714,9 @@ int32_t translateTable(STranslateContext* pCxt, SNode** pTable, SNode* pJoinPare } static int32_t createAllColumns(STranslateContext* pCxt, bool igTags, SNodeList** pCols) { - *pCols = nodesMakeList(); + int32_t code = nodesMakeList(pCols); if (NULL == *pCols) { - return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY); + return generateSyntaxErrMsg(&pCxt->msgBuf, code); } SArray* pTables = taosArrayGetP(pCxt->pNsLevel, pCxt->currLevel); size_t nums = taosArrayGetSize(pTables); @@ -4704,16 +4730,18 @@ static int32_t createAllColumns(STranslateContext* pCxt, bool igTags, SNodeList* return TSDB_CODE_SUCCESS; } -static SNode* createMultiResFunc(SFunctionNode* pSrcFunc, SExprNode* pExpr) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - if (NULL == pFunc) { - return NULL; +static int32_t createMultiResFunc(SFunctionNode* pSrcFunc, SExprNode* pExpr, SNode** ppNodeOut) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); + if (TSDB_CODE_SUCCESS != code) { + return code; } - pFunc->pParameterList = nodesMakeList(); - if (NULL == pFunc->pParameterList || - TSDB_CODE_SUCCESS != nodesListStrictAppend(pFunc->pParameterList, nodesCloneNode((SNode*)pExpr))) { + code = nodesMakeList(&pFunc->pParameterList); + SNode* pClonedNode = NULL; + if (NULL == pFunc->pParameterList || TSDB_CODE_SUCCESS != (code = nodesCloneNode((SNode*)pExpr, &pClonedNode)) || + TSDB_CODE_SUCCESS != (code = nodesListStrictAppend(pFunc->pParameterList, pClonedNode))) { nodesDestroyNode((SNode*)pFunc); - return NULL; + return code; } pFunc->node.resType = pExpr->resType; @@ -4743,17 +4771,17 @@ static SNode* createMultiResFunc(SFunctionNode* pSrcFunc, SExprNode* pExpr) { // note: userAlias could be truncated here strncpy(pFunc->node.userAlias, buf, TSDB_COL_NAME_LEN - 1); } - - return (SNode*)pFunc; + *ppNodeOut = (SNode*)pFunc; + return code; } static int32_t createTableAllCols(STranslateContext* pCxt, SColumnNode* pCol, bool igTags, SNodeList** pOutput) { STableNode* pTable = NULL; int32_t code = findTable(pCxt, pCol->tableAlias, &pTable); if (TSDB_CODE_SUCCESS == code && NULL == *pOutput) { - *pOutput = nodesMakeList(); + code = nodesMakeList(pOutput); if (NULL == *pOutput) { - code = generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY); + code = generateSyntaxErrMsg(&pCxt->msgBuf, code); } } if (TSDB_CODE_SUCCESS == code) { @@ -4773,7 +4801,10 @@ static int32_t createMultiResFuncsParas(STranslateContext* pCxt, SNodeList* pSrc } else if (nodesIsTableStar(pPara)) { code = createTableAllCols(pCxt, (SColumnNode*)pPara, !tsMultiResultFunctionStarReturnTags, &pExprs); } else { - code = nodesListMakeStrictAppend(&pExprs, nodesCloneNode(pPara)); + SNode* pClonedNode = NULL; + code = nodesCloneNode(pPara, &pClonedNode); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeStrictAppend(&pExprs, pClonedNode); } if (TSDB_CODE_SUCCESS != code) { break; @@ -4790,15 +4821,18 @@ static int32_t createMultiResFuncsParas(STranslateContext* pCxt, SNodeList* pSrc } static int32_t createMultiResFuncs(SFunctionNode* pSrcFunc, SNodeList* pExprs, SNodeList** pOutput) { - SNodeList* pFuncs = nodesMakeList(); + SNodeList* pFuncs = NULL; + int32_t code = nodesMakeList(&pFuncs); if (NULL == pFuncs) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; SNode* pExpr = NULL; FOREACH(pExpr, pExprs) { - code = nodesListStrictAppend(pFuncs, createMultiResFunc(pSrcFunc, (SExprNode*)pExpr)); + SNode* pNode = NULL; + code = createMultiResFunc(pSrcFunc, (SExprNode*)pExpr, &pNode); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListStrictAppend(pFuncs, pNode); if (TSDB_CODE_SUCCESS != code) { break; } @@ -4839,8 +4873,9 @@ static int32_t createTags(STranslateContext* pCxt, SNodeList** pOutput) { SSchema* pTagsSchema = getTableTagSchema(pMeta); for (int32_t i = 0; i < pMeta->tableInfo.numOfTags; ++i) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_OUT_OF_MEMORY); } setColumnInfoBySchema(pTable, pTagsSchema + i, 1, pCol); @@ -5157,13 +5192,14 @@ static int32_t getQueryTimeRange(STranslateContext* pCxt, SNode* pWhere, STimeWi return TSDB_CODE_SUCCESS; } - SNode* pCond = nodesCloneNode(pWhere); + SNode* pCond = NULL; + int32_t code = nodesCloneNode(pWhere, &pCond); if (NULL == pCond) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SNode* pPrimaryKeyCond = NULL; - int32_t code = filterPartitionCond(&pCond, &pPrimaryKeyCond, NULL, NULL, NULL); + code = filterPartitionCond(&pCond, &pPrimaryKeyCond, NULL, NULL, NULL); if (TSDB_CODE_SUCCESS == code) { if (NULL != pPrimaryKeyCond) { @@ -5232,9 +5268,12 @@ static int32_t translateFill(STranslateContext* pCxt, SSelectStmt* pSelect, SInt return checkFill(pCxt, (SFillNode*)pInterval->pFill, (SValueNode*)pInterval->pInterval, false); } -static int64_t getMonthsFromTimeVal(int64_t val, int32_t fromPrecision, char unit) { +static int32_t getMonthsFromTimeVal(int64_t val, int32_t fromPrecision, char unit, int64_t* pMonth) { int64_t days = -1; - convertTimeFromPrecisionToUnit(val, fromPrecision, 'd', &days); + int32_t code = convertTimeFromPrecisionToUnit(val, fromPrecision, 'd', &days); + if (TSDB_CODE_SUCCESS != code) { + return code; + } switch (unit) { case 'b': case 'u': @@ -5244,15 +5283,19 @@ static int64_t getMonthsFromTimeVal(int64_t val, int32_t fromPrecision, char uni case 'h': case 'd': case 'w': - return days / 28; + *pMonth = days / 28; + return code; case 'n': - return val; + *pMonth = val; + return code; case 'y': - return val * 12; + *pMonth = val * 12; + return code; default: + code = TSDB_CODE_INVALID_PARA; break; } - return -1; + return code; } static const char* getPrecisionStr(uint8_t precision) { @@ -5319,11 +5362,23 @@ static int32_t checkIntervalWindow(STranslateContext* pCxt, SIntervalWindowNode* return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INTER_OFFSET_UNIT); } bool fixed = !IS_CALENDAR_TIME_DURATION(pOffset->unit) && !valInter; - if ((fixed && pOffset->datum.i >= pInter->datum.i) || - (!fixed && getMonthsFromTimeVal(pOffset->datum.i, precision, pOffset->unit) >= - getMonthsFromTimeVal(pInter->datum.i, precision, pInter->unit))) { + if (fixed && pOffset->datum.i >= pInter->datum.i) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INTER_OFFSET_TOO_BIG); } + if (!fixed) { + int64_t offsetMonth = 0, intervalMonth = 0; + int32_t code = getMonthsFromTimeVal(pOffset->datum.i, precision, pOffset->unit, &offsetMonth); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = getMonthsFromTimeVal(pInter->datum.i, precision, pInter->unit, &intervalMonth); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + if (offsetMonth > intervalMonth) { + return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INTER_OFFSET_TOO_BIG); + } + } if (pOffset->unit == 'n' || pOffset->unit == 'y') { convertVarDuration(pOffset, precision); @@ -5476,12 +5531,15 @@ static int32_t translateSpecificWindow(STranslateContext* pCxt, SSelectStmt* pSe } static EDealRes collectWindowsPseudocolumns(SNode* pNode, void* pContext) { - SNodeList* pCols = (SNodeList*)pContext; + SCollectWindowsPseudocolumnsContext* pCtx = pContext; + SNodeList* pCols = pCtx->pCols; if (QUERY_NODE_FUNCTION == nodeType(pNode)) { SFunctionNode* pFunc = (SFunctionNode*)pNode; if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType || FUNCTION_TYPE_WDURATION == pFunc->funcType) { - if (TSDB_CODE_SUCCESS != nodesListStrictAppend(pCols, nodesCloneNode(pNode))) { + SNode* pClonedNode = NULL; + if (TSDB_CODE_SUCCESS != (pCtx->code = nodesCloneNode(pNode, &pClonedNode))) return DEAL_RES_ERROR; + if (TSDB_CODE_SUCCESS != (pCtx->code = nodesListStrictAppend(pCols, pClonedNode))) { return DEAL_RES_ERROR; } } @@ -5494,17 +5552,19 @@ static int32_t checkWindowsConditonValid(SNode* pNode) { if (QUERY_NODE_EVENT_WINDOW != nodeType(pNode)) return code; SEventWindowNode* pEventWindowNode = (SEventWindowNode*)pNode; - SNodeList* pCols = nodesMakeList(); + SNodeList* pCols = NULL; + code = nodesMakeList(&pCols); if (NULL == pCols) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - nodesWalkExpr(pEventWindowNode->pStartCond, collectWindowsPseudocolumns, pCols); - if (pCols->length > 0) { + SCollectWindowsPseudocolumnsContext ctx = {.code = 0, .pCols = pCols}; + nodesWalkExpr(pEventWindowNode->pStartCond, collectWindowsPseudocolumns, &ctx); + if (TSDB_CODE_SUCCESS == ctx.code && pCols->length > 0) { code = TSDB_CODE_QRY_INVALID_WINDOW_CONDITION; } if (TSDB_CODE_SUCCESS == code) { - nodesWalkExpr(pEventWindowNode->pEndCond, collectWindowsPseudocolumns, pCols); - if (pCols->length > 0) { + nodesWalkExpr(pEventWindowNode->pEndCond, collectWindowsPseudocolumns, &ctx); + if (TSDB_CODE_SUCCESS == ctx.code && pCols->length > 0) { code = TSDB_CODE_QRY_INVALID_WINDOW_CONDITION; } } @@ -5562,17 +5622,19 @@ static int32_t translateWindow(STranslateContext* pCxt, SSelectStmt* pSelect) { } static int32_t createDefaultFillNode(STranslateContext* pCxt, SNode** pOutput) { - SFillNode* pFill = (SFillNode*)nodesMakeNode(QUERY_NODE_FILL); - if (NULL == pFill) { - return TSDB_CODE_OUT_OF_MEMORY; + SFillNode* pFill = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FILL, (SNode**)&pFill); + if (TSDB_CODE_SUCCESS != code) { + return code; } pFill->mode = FILL_MODE_NONE; - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pFill); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID; strcpy(pCol->colName, ROWTS_PSEUDO_COLUMN_NAME); @@ -5583,9 +5645,10 @@ static int32_t createDefaultFillNode(STranslateContext* pCxt, SNode** pOutput) { } static int32_t createDefaultEveryNode(STranslateContext* pCxt, SNode** pOutput) { - SValueNode* pEvery = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (NULL == pEvery) { - return TSDB_CODE_OUT_OF_MEMORY; + SValueNode* pEvery = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pEvery); + if (TSDB_CODE_SUCCESS != code) { + return code; } pEvery->node.resType.type = TSDB_DATA_TYPE_BIGINT; @@ -6112,14 +6175,15 @@ static int32_t checkLimit(STranslateContext* pCxt, SSelectStmt* pSelect) { } static int32_t createPrimaryKeyColByTable(STranslateContext* pCxt, STableNode* pTable, SNode** pPrimaryKey) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - return TSDB_CODE_OUT_OF_MEMORY; + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { + return code; } pCol->colId = PRIMARYKEY_TIMESTAMP_COL_ID; strcpy(pCol->colName, ROWTS_PSEUDO_COLUMN_NAME); bool found = false; - int32_t code = findAndSetColumn(pCxt, &pCol, pTable, &found, true); + code = findAndSetColumn(pCxt, &pCol, pTable, &found, true); if (TSDB_CODE_SUCCESS != code || !found) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_VALID_PRIM_TS_REQUIRED); } @@ -6210,14 +6274,15 @@ static int32_t appendTsForImplicitTsFunc(STranslateContext* pCxt, SSelectStmt* p } static int32_t createPkColByTable(STranslateContext* pCxt, SRealTableNode* pTable, SNode** pPk) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { - return TSDB_CODE_OUT_OF_MEMORY; + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { + return code; } pCol->colId = pTable->pMeta->schema[1].colId; strcpy(pCol->colName, pTable->pMeta->schema[1].name); bool found = false; - int32_t code = findAndSetColumn(pCxt, &pCol, (STableNode*)pTable, &found, true); + code = findAndSetColumn(pCxt, &pCol, (STableNode*)pTable, &found, true); if (TSDB_CODE_SUCCESS != code || !found) { return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INTERNAL_ERROR); } @@ -6284,9 +6349,10 @@ static EDealRes replaceOrderByAliasImpl(SNode** pNode, void* pContext) { (QUERY_NODE_COLUMN == nodeType(pProject) && !nodesEqualNode(*pNode, pProject)))) { continue; } - SNode* pNew = nodesCloneNode(pProject); + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pProject, &pNew); if (NULL == pNew) { - pCxt->pTranslateCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + pCxt->pTranslateCxt->errCode = code; return DEAL_RES_ERROR; } ((SExprNode*)pNew)->orderAlias = true; @@ -6307,9 +6373,10 @@ static EDealRes replaceOrderByAliasImpl(SNode** pNode, void* pContext) { } int32_t pos = getPositionValue(pVal); if (0 < pos && pos <= LIST_LENGTH(pProjectionList)) { - SNode* pNew = nodesCloneNode(nodesListGetNode(pProjectionList, pos - 1)); + SNode* pNew = NULL; + int32_t code = nodesCloneNode(nodesListGetNode(pProjectionList, pos - 1), &pNew); if (NULL == pNew) { - pCxt->pTranslateCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + pCxt->pTranslateCxt->errCode = code; return DEAL_RES_ERROR; } ((SExprNode*)pNew)->orderAlias = true; @@ -6464,8 +6531,9 @@ static int32_t translateSelect(STranslateContext* pCxt, SSelectStmt* pSelect) { } static SNode* createSetOperProject(const char* pTableAlias, SNode* pNode) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pCol) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (TSDB_CODE_SUCCESS != code) { return NULL; } pCol->node.resType = ((SExprNode*)pNode)->resType; @@ -6672,16 +6740,17 @@ static int32_t translateInsertQuery(STranslateContext* pCxt, SInsertStmt* pInser static int32_t addOrderByPrimaryKeyToQueryImpl(STranslateContext* pCxt, SNode* pPrimaryKeyExpr, SNodeList** pOrderByList) { - SOrderByExprNode* pOrderByExpr = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); - if (NULL == pOrderByExpr) { - return TSDB_CODE_OUT_OF_MEMORY; + SOrderByExprNode* pOrderByExpr = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOrderByExpr); + if (TSDB_CODE_SUCCESS != code) { + return code; } pOrderByExpr->nullOrder = NULL_ORDER_FIRST; pOrderByExpr->order = ORDER_ASC; - pOrderByExpr->pExpr = nodesCloneNode(pPrimaryKeyExpr); + code = nodesCloneNode(pPrimaryKeyExpr, &pOrderByExpr->pExpr); if (NULL == pOrderByExpr->pExpr) { nodesDestroyNode((SNode*)pOrderByExpr); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } ((SExprNode*)pOrderByExpr->pExpr)->orderAlias = true; // NODES_DESTORY_LIST(*pOrderByList); @@ -7487,6 +7556,9 @@ static int32_t buildCmdMsg(STranslateContext* pCxt, int16_t msgType, FSerializeF pCxt->pCmdMsg->epSet = pCxt->pParseCxt->mgmtEpSet; pCxt->pCmdMsg->msgType = msgType; pCxt->pCmdMsg->msgLen = func(NULL, 0, pReq); + if (pCxt->pCmdMsg->msgLen < 0) { + return terrno; + } pCxt->pCmdMsg->pMsg = taosMemoryMalloc(pCxt->pCmdMsg->msgLen); if (NULL == pCxt->pCmdMsg->pMsg) { taosMemoryFreeClear(pCxt->pCmdMsg); @@ -8100,9 +8172,10 @@ typedef struct SSampleAstInfo { } SSampleAstInfo; static int32_t buildTableForSampleAst(SSampleAstInfo* pInfo, SNode** pOutput) { - SRealTableNode* pTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); - if (NULL == pTable) { - return TSDB_CODE_OUT_OF_MEMORY; + SRealTableNode* pTable = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_REAL_TABLE, (SNode**)&pTable); + if (TSDB_CODE_SUCCESS != code) { + return code; } snprintf(pTable->table.dbName, sizeof(pTable->table.dbName), "%s", pInfo->pDbName); snprintf(pTable->table.tableName, sizeof(pTable->table.tableName), "%s", pInfo->pTableName); @@ -8113,9 +8186,10 @@ static int32_t buildTableForSampleAst(SSampleAstInfo* pInfo, SNode** pOutput) { } static int32_t addWstartToSampleProjects(SNodeList* pProjectionList) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pFunc->functionName, "_wstart"); strcpy(pFunc->node.userAlias, "_wstart"); @@ -8123,9 +8197,10 @@ static int32_t addWstartToSampleProjects(SNodeList* pProjectionList) { } static int32_t addWendToSampleProjects(SNodeList* pProjectionList) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pFunc->functionName, "_wend"); strcpy(pFunc->node.userAlias, "_wend"); @@ -8133,9 +8208,10 @@ static int32_t addWendToSampleProjects(SNodeList* pProjectionList) { } static int32_t addWdurationToSampleProjects(SNodeList* pProjectionList) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pFunc->functionName, "_wduration"); strcpy(pFunc->node.userAlias, "_wduration"); @@ -8169,17 +8245,19 @@ static int32_t buildProjectsForSampleAst(SSampleAstInfo* pInfo, SNodeList** pLis } static int32_t buildIntervalForSampleAst(SSampleAstInfo* pInfo, SNode** pOutput) { - SIntervalWindowNode* pInterval = (SIntervalWindowNode*)nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW); + SIntervalWindowNode* pInterval = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_INTERVAL_WINDOW, (SNode**)&pInterval); if (NULL == pInterval) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } TSWAP(pInterval->pInterval, pInfo->pInterval); TSWAP(pInterval->pOffset, pInfo->pOffset); TSWAP(pInterval->pSliding, pInfo->pSliding); - pInterval->pCol = nodesMakeNode(QUERY_NODE_COLUMN); + pInterval->pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pInterval->pCol); if (NULL == pInterval->pCol) { nodesDestroyNode((SNode*)pInterval); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } ((SColumnNode*)pInterval->pCol)->colId = PRIMARYKEY_TIMESTAMP_COL_ID; strcpy(((SColumnNode*)pInterval->pCol)->colName, ROWTS_PSEUDO_COLUMN_NAME); @@ -8189,13 +8267,14 @@ static int32_t buildIntervalForSampleAst(SSampleAstInfo* pInfo, SNode** pOutput) static int32_t buildSampleAst(STranslateContext* pCxt, SSampleAstInfo* pInfo, char** pAst, int32_t* pLen, char** pExpr, int32_t* pExprLen, int32_t* pProjectionTotalLen) { - SSelectStmt* pSelect = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); + SSelectStmt* pSelect = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_SELECT_STMT, (SNode**)&pSelect); if (NULL == pSelect) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } sprintf(pSelect->stmtName, "%p", pSelect); - int32_t code = buildTableForSampleAst(pInfo, &pSelect->pFromTable); + code = buildTableForSampleAst(pInfo, &pSelect->pFromTable); if (TSDB_CODE_SUCCESS == code) { code = buildProjectsForSampleAst(pInfo, &pSelect->pProjectionList, pProjectionTotalLen); } @@ -8228,52 +8307,69 @@ static void clearSampleAstInfo(SSampleAstInfo* pInfo) { nodesDestroyList(pInfo->pTags); } -static SNode* makeIntervalVal(SRetention* pRetension, int8_t precision) { - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); +static int32_t makeIntervalVal(SRetention* pRetension, int8_t precision, SNode** ppNode) { + SValueNode* pVal = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); if (NULL == pVal) { - return NULL; + return code; } int64_t timeVal = -1; - convertTimeFromPrecisionToUnit(pRetension->freq, precision, pRetension->freqUnit, &timeVal); + code = convertTimeFromPrecisionToUnit(pRetension->freq, precision, pRetension->freqUnit, &timeVal); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pVal); + return code; + } char buf[20] = {0}; int32_t len = snprintf(buf, sizeof(buf), "%" PRId64 "%c", timeVal, pRetension->freqUnit); pVal->literal = strndup(buf, len); if (NULL == pVal->literal) { nodesDestroyNode((SNode*)pVal); - return NULL; + return TSDB_CODE_OUT_OF_MEMORY; } pVal->flag |= VALUE_FLAG_IS_DURATION; pVal->node.resType.type = TSDB_DATA_TYPE_BIGINT; pVal->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; pVal->node.resType.precision = precision; - return (SNode*)pVal; + *ppNode = (SNode*)pVal; + return code; } -static SNode* createColumnFromDef(SColumnDefNode* pDef) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); +static int32_t createColumnFromDef(SColumnDefNode* pDef, SNode** ppCol) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - return NULL; + return code; } strcpy(pCol->colName, pDef->colName); - return (SNode*)pCol; + *ppCol = (SNode*)pCol; + return code; } -static SNode* createRollupFunc(SNode* pSrcFunc, SColumnDefNode* pColDef) { - SFunctionNode* pFunc = (SFunctionNode*)nodesCloneNode(pSrcFunc); +static int32_t createRollupFunc(SNode* pSrcFunc, SColumnDefNode* pColDef, SNode** ppRollupFunc) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesCloneNode(pSrcFunc, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } - if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pFunc->pParameterList, createColumnFromDef(pColDef))) { + SNode* pCol = NULL; + code = createColumnFromDef(pColDef, &pCol); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pFunc->pParameterList, pCol); + pCol = NULL; + } + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pFunc); - return NULL; + } else { + *ppRollupFunc = (SNode*)pFunc; } - return (SNode*)pFunc; + return code; } -static SNodeList* createRollupFuncs(SCreateTableStmt* pStmt) { - SNodeList* pFuncs = nodesMakeList(); +static int32_t createRollupFuncs(SCreateTableStmt* pStmt, SNodeList** ppList) { + SNodeList* pFuncs = NULL; + int32_t code = nodesMakeList(&pFuncs); if (NULL == pFuncs) { - return NULL; + return code; } SNode* pFunc = NULL; @@ -8285,21 +8381,29 @@ static SNodeList* createRollupFuncs(SCreateTableStmt* pStmt) { primaryKey = false; continue; } - if (TSDB_CODE_SUCCESS != nodesListStrictAppend(pFuncs, createRollupFunc(pFunc, (SColumnDefNode*)pCol))) { + SNode* pRollupFunc = NULL; + code = createRollupFunc(pFunc, (SColumnDefNode*)pCol, &pRollupFunc); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pFuncs); - return NULL; + return code; + } + code = nodesListStrictAppend(pFuncs, pRollupFunc); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pFuncs); + return code; } } } + *ppList = pFuncs; - return pFuncs; + return code;; } -static STableMeta* createRollupTableMeta(SCreateTableStmt* pStmt, int8_t precision) { +static int32_t createRollupTableMeta(SCreateTableStmt* pStmt, int8_t precision, STableMeta** ppTbMeta) { int32_t numOfField = LIST_LENGTH(pStmt->pCols) + LIST_LENGTH(pStmt->pTags); STableMeta* pMeta = taosMemoryCalloc(1, sizeof(STableMeta) + numOfField * sizeof(SSchema)); if (NULL == pMeta) { - return NULL; + return TSDB_CODE_OUT_OF_MEMORY; } pMeta->tableType = TSDB_SUPER_TABLE; pMeta->tableInfo.numOfTags = LIST_LENGTH(pStmt->pTags); @@ -8318,31 +8422,39 @@ static STableMeta* createRollupTableMeta(SCreateTableStmt* pStmt, int8_t precisi ++index; } - return pMeta; + *ppTbMeta = pMeta; + return TSDB_CODE_SUCCESS; } -static SNode* createTbnameFunction() { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t createTbnameFunction(SFunctionNode** ppFunc) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } strcpy(pFunc->functionName, "tbname"); strcpy(pFunc->node.aliasName, "tbname"); strcpy(pFunc->node.userAlias, "tbname"); - return (SNode*)pFunc; + *ppFunc = pFunc; + return code; } static int32_t buildSampleAstInfoByTable(STranslateContext* pCxt, SCreateTableStmt* pStmt, SRetention* pRetension, int8_t precision, SSampleAstInfo* pInfo) { pInfo->pDbName = pStmt->dbName; pInfo->pTableName = pStmt->tableName; - pInfo->pFuncs = createRollupFuncs(pStmt); - pInfo->pInterval = makeIntervalVal(pRetension, precision); - pInfo->pRollupTableMeta = createRollupTableMeta(pStmt, precision); - if (NULL == pInfo->pFuncs || NULL == pInfo->pInterval || NULL == pInfo->pRollupTableMeta) { - return TSDB_CODE_OUT_OF_MEMORY; - } - return nodesListMakeStrictAppend(&pInfo->pPartitionByList, createTbnameFunction()); + int32_t code = createRollupFuncs(pStmt, &pInfo->pFuncs); + if (TSDB_CODE_SUCCESS != code) return code; + pInfo->pInterval = NULL; + code = makeIntervalVal(pRetension, precision, (SNode**)&pInfo->pInterval); + if (TSDB_CODE_SUCCESS != code) return code; + pInfo->pRollupTableMeta = NULL; + code = createRollupTableMeta(pStmt, precision, &pInfo->pRollupTableMeta); + if (TSDB_CODE_SUCCESS != code) return code; + SFunctionNode* pFunc = NULL; + code = createTbnameFunction(&pFunc); + if (!pFunc) return code; + return nodesListMakeStrictAppend(&pInfo->pPartitionByList, (SNode*)pFunc); } static int32_t getRollupAst(STranslateContext* pCxt, SCreateTableStmt* pStmt, SRetention* pRetension, int8_t precision, @@ -8973,15 +9085,14 @@ static int32_t buildSampleAstInfoByIndex(STranslateContext* pCxt, SCreateIndexSt pInfo->createSmaIndex = true; pInfo->pDbName = pStmt->dbName; pInfo->pTableName = pStmt->tableName; - pInfo->pFuncs = nodesCloneList(pStmt->pOptions->pFuncs); - pInfo->pInterval = nodesCloneNode(pStmt->pOptions->pInterval); - pInfo->pOffset = nodesCloneNode(pStmt->pOptions->pOffset); - pInfo->pSliding = nodesCloneNode(pStmt->pOptions->pSliding); - if (NULL == pInfo->pFuncs || NULL == pInfo->pInterval || - (NULL != pStmt->pOptions->pOffset && NULL == pInfo->pOffset) || - (NULL != pStmt->pOptions->pSliding && NULL == pInfo->pSliding)) { - return TSDB_CODE_OUT_OF_MEMORY; - } + int32_t code = nodesCloneList(pStmt->pOptions->pFuncs, &pInfo->pFuncs); + if (TSDB_CODE_SUCCESS != code) return code; + code = nodesCloneNode(pStmt->pOptions->pInterval, &pInfo->pInterval); + if (TSDB_CODE_SUCCESS != code) return code; + code = nodesCloneNode(pStmt->pOptions->pOffset, &pInfo->pOffset); + if (TSDB_CODE_SUCCESS != code) return code; + code = nodesCloneNode(pStmt->pOptions->pSliding, &pInfo->pSliding); + if (TSDB_CODE_SUCCESS != code) return code; return TSDB_CODE_SUCCESS; } @@ -9337,14 +9448,14 @@ static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pS return code; } -static int32_t addTagList(SNodeList** ppList, SNode** pNode) { +static int32_t addTagList(SNodeList** ppList, SNode* pNode) { + int32_t code = 0; if (NULL == *ppList) { - *ppList = nodesMakeList(); - if (!*ppList) return TSDB_CODE_OUT_OF_MEMORY; + code = nodesMakeList(ppList); + if (!*ppList) return code; } - int32_t code = nodesListStrictAppend(*ppList, *pNode); - *pNode = NULL; + code = nodesListAppend(*ppList, pNode); if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(*ppList); *ppList = NULL; @@ -9362,10 +9473,14 @@ static EDealRes checkColumnTagsInCond(SNode* pNode, void* pContext) { pCxt->colExists = true; return DEAL_RES_ERROR; } else if (type == TCOL_TYPE_TAG) { - SNode* pNodeClone = nodesCloneNode(pNode); - int32_t code = addTagList(&pCxt->pTags, &pNodeClone); - if (TSDB_CODE_SUCCESS != code) nodesDestroyNode(pNodeClone); - return DEAL_RES_ERROR; + SNode* pNew = NULL; + pCxt->code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS != pCxt->code) return DEAL_RES_ERROR; + pCxt->code = addTagList(&pCxt->pTags, pNew); + if (TSDB_CODE_SUCCESS != pCxt->code) { + nodesDestroyNode(pNew); + return DEAL_RES_ERROR; + } } else { pCxt->colNotFound = true; return DEAL_RES_ERROR; @@ -9373,9 +9488,11 @@ static EDealRes checkColumnTagsInCond(SNode* pNode, void* pContext) { } else if (QUERY_NODE_FUNCTION == nodeType(pNode)) { SFunctionNode* pFunc = (SFunctionNode*)pNode; if (0 == strcasecmp(pFunc->functionName, "tbname")) { - SNode* pNodeClone = nodesCloneNode(pNode); - if (TSDB_CODE_SUCCESS != addTagList(&pCxt->pTags, &pNodeClone)) { - nodesDestroyNode(pNodeClone); + SNode* pNew = NULL; + pCxt->code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS != pCxt->code) return DEAL_RES_ERROR; + if (TSDB_CODE_SUCCESS != (pCxt->code = addTagList(&pCxt->pTags, pNew))) { + nodesDestroyNode(pNew); return DEAL_RES_ERROR; } } @@ -9398,14 +9515,15 @@ static int32_t checkCollectTopicTags(STranslateContext* pCxt, SCreateTopicStmt* if (NULL == colCxt.pTags) { // put one column to select // for (int32_t i = 0; i < pMeta->tableInfo.numOfColumns; ++i) { SSchema* column = &pMeta->schema[0]; - SColumnNode* col = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* col = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&col); if (NULL == col) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(col->colName, column->name); strcpy(col->node.aliasName, col->colName); strcpy(col->node.userAlias, col->colName); - int32_t code = addTagList(&colCxt.pTags, (SNode**)&col); + code = addTagList(&colCxt.pTags, (SNode*)col); if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)col); return code; @@ -9416,7 +9534,7 @@ static int32_t checkCollectTopicTags(STranslateContext* pCxt, SCreateTopicStmt* return TSDB_CODE_SUCCESS; } -static int32_t buildQueryForTableTopic(STranslateContext* pCxt, SCreateTopicStmt* pStmt, SNode** pSelect) { +static int32_t buildQueryForTableTopic(STranslateContext* pCxt, SCreateTopicStmt* pStmt, SNode** ppSelect) { SParseContext* pParCxt = pCxt->pParseCxt; SRequestConnInfo connInfo = {.pTrans = pParCxt->pTransporter, .requestId = pParCxt->requestId, @@ -9436,18 +9554,29 @@ static int32_t buildQueryForTableTopic(STranslateContext* pCxt, SCreateTopicStmt } SNodeList* pProjection = NULL; + SRealTableNode* realTable = NULL; code = checkCollectTopicTags(pCxt, pStmt, pMeta, &pProjection); if (TSDB_CODE_SUCCESS == code) { - SRealTableNode* realTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); - strcpy(realTable->table.dbName, pStmt->subDbName); - strcpy(realTable->table.tableName, pStmt->subSTbName); - strcpy(realTable->table.tableAlias, pStmt->subSTbName); - *pSelect = createSelectStmtImpl(true, pProjection, (SNode*)realTable, NULL); - ((SSelectStmt*)*pSelect)->pWhere = nodesCloneNode(pStmt->pWhere); - pCxt->pParseCxt->topicQuery = true; - code = translateQuery(pCxt, *pSelect); + code = nodesMakeNode(QUERY_NODE_REAL_TABLE, (SNode**)&realTable); + if (realTable) { + strcpy(realTable->table.dbName, pStmt->subDbName); + strcpy(realTable->table.tableName, pStmt->subSTbName); + strcpy(realTable->table.tableAlias, pStmt->subSTbName); + code = createSelectStmtImpl(true, pProjection, (SNode*)realTable, NULL, ppSelect); + } + if (TSDB_CODE_SUCCESS == code) { + pProjection = NULL; + realTable = NULL; + SNode** ppWhere = &((SSelectStmt*)*ppSelect)->pWhere; + code = nodesCloneNode(pStmt->pWhere, ppWhere); + } + if (TSDB_CODE_SUCCESS == code) { + pCxt->pParseCxt->topicQuery = true; + code = translateQuery(pCxt, *ppSelect); + } } - + nodesDestroyNode((SNode*)realTable); + nodesDestroyList(pProjection); taosMemoryFree(pMeta); return code; } @@ -9696,14 +9825,15 @@ static void getStreamQueryFirstProjectAliasName(SHashObj* pUserAliasSet, char* a return; } -static void setColumnDefNodePrimaryKey(SColumnDefNode* pNode, bool isPk) { - if (!pNode) return; - if (!isPk && !pNode->pOptions) return; +static int32_t setColumnDefNodePrimaryKey(SColumnDefNode* pNode, bool isPk) { + int32_t code = 0; + if (!pNode) return code; + if (!isPk && !pNode->pOptions) return code; if (!pNode->pOptions) { - pNode->pOptions = nodesMakeNode(QUERY_NODE_COLUMN_OPTIONS); + code = nodesMakeNode(QUERY_NODE_COLUMN_OPTIONS, &pNode->pOptions); } - ((SColumnOptions*)pNode->pOptions)->bPrimaryKey = isPk; - return; + if (TSDB_CODE_SUCCESS ==code) ((SColumnOptions*)pNode->pOptions)->bPrimaryKey = isPk; + return code; } static int32_t addWstartTsToCreateStreamQueryImpl(STranslateContext* pCxt, SSelectStmt* pSelect, @@ -9713,24 +9843,29 @@ static int32_t addWstartTsToCreateStreamQueryImpl(STranslateContext* pCxt, SSele (QUERY_NODE_FUNCTION == nodeType(pProj) && 0 == strcmp("_wstart", ((SFunctionNode*)pProj)->functionName))) { return TSDB_CODE_SUCCESS; } - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pFunc->functionName, "_wstart"); getStreamQueryFirstProjectAliasName(pUserAliasSet, pFunc->node.aliasName, sizeof(pFunc->node.aliasName)); - int32_t code = getFuncInfo(pCxt, pFunc); + code = getFuncInfo(pCxt, pFunc); if (TSDB_CODE_SUCCESS == code) { code = nodesListPushFront(pSelect->pProjectionList, (SNode*)pFunc); } if (TSDB_CODE_SUCCESS == code && STREAM_CREATE_STABLE_TRUE == pReq->createStb) { - SColumnDefNode* pColDef = (SColumnDefNode*)nodesMakeNode(QUERY_NODE_COLUMN_DEF); - strcpy(pColDef->colName, pFunc->node.aliasName); - pColDef->dataType = pFunc->node.resType; - pColDef->sma = true; - setColumnDefNodePrimaryKey(pColDef, false); - code = nodesListPushFront(pCols, (SNode*)pColDef); + SColumnDefNode* pColDef = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN_DEF, (SNode**)&pColDef); + if (TSDB_CODE_SUCCESS == code) { + strcpy(pColDef->colName, pFunc->node.aliasName); + pColDef->dataType = pFunc->node.resType; + pColDef->sma = true; + code = setColumnDefNodePrimaryKey(pColDef, false); + } + if (TSDB_CODE_SUCCESS == code) code = nodesListPushFront(pCols, (SNode*)pColDef); + if (TSDB_CODE_SUCCESS != code) nodesDestroyNode((SNode*)pColDef); } if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pFunc); @@ -9768,8 +9903,11 @@ static int32_t addTagsToCreateStreamQuery(STranslateContext* pCxt, SCreateStream SNode* pPart = NULL; FOREACH(pPart, pSelect->pPartitionByList) { if (0 == strcmp(getTagNameForCreateStreamTag(pTag), ((SExprNode*)pPart)->userAlias)) { - if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pSelect->pTags, nodesCloneNode(pPart))) { - return TSDB_CODE_OUT_OF_MEMORY; + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pPart, &pNew); + if (TSDB_CODE_SUCCESS != code) return code; + if (TSDB_CODE_SUCCESS != (code = nodesListMakeStrictAppend(&pSelect->pTags, pNew))) { + return code; } found = true; break; @@ -9782,22 +9920,27 @@ static int32_t addTagsToCreateStreamQuery(STranslateContext* pCxt, SCreateStream return TSDB_CODE_SUCCESS; } -static SNode* createNullValue() { - SValueNode* pValue = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); +static int32_t createNullValue(SNode** ppNode) { + SValueNode* pValue = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValue); if (NULL == pValue) { - return NULL; + return code; } pValue->isNull = true; pValue->node.resType.type = TSDB_DATA_TYPE_NULL; pValue->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes; - return (SNode*)pValue; + *ppNode = (SNode*)pValue; + return code; } static int32_t addNullTagsForExistTable(STranslateContext* pCxt, STableMeta* pMeta, SSelectStmt* pSelect) { int32_t numOfTags = getNumOfTags(pMeta); int32_t code = TSDB_CODE_SUCCESS; for (int32_t i = 0; TSDB_CODE_SUCCESS == code && i < numOfTags; ++i) { - code = nodesListMakeStrictAppend(&pSelect->pTags, createNullValue()); + SNode* pNull = NULL; + code = createNullValue(&pNull); + if (TSDB_CODE_SUCCESS == code) + code = nodesListMakeStrictAppend(&pSelect->pTags, pNull); } return code; } @@ -9814,9 +9957,10 @@ static EDealRes rewriteSubtable(SNode** pNode, void* pContext) { SNode* pPart = NULL; FOREACH(pPart, pCxt->pPartitionList) { if (0 == strcmp(((SColumnNode*)*pNode)->colName, ((SExprNode*)pPart)->userAlias)) { - SNode* pNew = nodesCloneNode(pPart); + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pPart, &pNew); if (NULL == pNew) { - pCxt->pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + pCxt->pCxt->errCode = code; return DEAL_RES_ERROR; } nodesDestroyNode(*pNode); @@ -9839,9 +9983,10 @@ static int32_t addSubtableNameToCreateStreamQuery(STranslateContext* pCxt, SCrea return TSDB_CODE_SUCCESS; } if (NULL == pSelect->pSubtable) { - pSelect->pSubtable = nodesCloneNode(pStmt->pSubtable); + pSelect->pSubtable = NULL; + int32_t code = nodesCloneNode(pStmt->pSubtable, &pSelect->pSubtable); if (NULL == pSelect->pSubtable) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } @@ -9853,7 +9998,10 @@ static int32_t addSubtableNameToCreateStreamQuery(STranslateContext* pCxt, SCrea static int32_t addNullTagsForCreateTable(STranslateContext* pCxt, SCreateStreamStmt* pStmt) { int32_t code = TSDB_CODE_SUCCESS; for (int32_t i = 0; TSDB_CODE_SUCCESS == code && i < LIST_LENGTH(pStmt->pTags); ++i) { - code = nodesListMakeStrictAppend(&((SSelectStmt*)pStmt->pQuery)->pTags, createNullValue()); + SNode* pNull = NULL; + code = createNullValue(&pNull); + if (TSDB_CODE_SUCCESS == code) + code = nodesListMakeStrictAppend(&((SSelectStmt*)pStmt->pQuery)->pTags, pNull); } return code; } @@ -9867,12 +10015,19 @@ static int32_t addNullTagsToCreateStreamQuery(STranslateContext* pCxt, STableMet static int32_t addColDefNodeByProj(SNodeList** ppCols, const SNode* pProject, int8_t flags) { const SExprNode* pExpr = (const SExprNode*)pProject; - SColumnDefNode* pColDef = (SColumnDefNode*)nodesMakeNode(QUERY_NODE_COLUMN_DEF); + SColumnDefNode* pColDef = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN_DEF, (SNode**)&pColDef); + if (TSDB_CODE_SUCCESS != code) return code; strcpy(pColDef->colName, pExpr->userAlias); pColDef->dataType = pExpr->resType; pColDef->sma = flags & COL_SMA_ON; - setColumnDefNodePrimaryKey(pColDef, flags & COL_IS_KEY); - return nodesListMakeAppend(ppCols, (SNode*)pColDef); + code = setColumnDefNodePrimaryKey(pColDef, flags & COL_IS_KEY); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pColDef); + } else { + code = nodesListMakeStrictAppend(ppCols, (SNode*)pColDef); + } + return code; } static int32_t addColsToCreateStreamQuery(STranslateContext* pCxt, SCreateStreamStmt* pStmt, SCMCreateStreamReq* pReq) { @@ -10043,12 +10198,18 @@ static int32_t adjustDataTypeOfProjections(STranslateContext* pCxt, const STable } REPLACE_NODE(pFunc); } - SColumnDefNode* pColDef = (SColumnDefNode*)nodesMakeNode(QUERY_NODE_COLUMN_DEF); + SColumnDefNode* pColDef = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN_DEF, (SNode**)&pColDef); + if (TSDB_CODE_SUCCESS != code) return code; strcpy(pColDef->colName, pSchema->name); pColDef->dataType = dt; pColDef->sma = pSchema->flags & COL_SMA_ON; - setColumnDefNodePrimaryKey(pColDef, pSchema->flags & COL_IS_KEY); - int32_t code = nodesListMakeAppend(ppCols, (SNode*)pColDef); + code = setColumnDefNodePrimaryKey(pColDef, pSchema->flags & COL_IS_KEY); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pColDef); + return code; + } + code = nodesListMakeStrictAppend(ppCols, (SNode*)pColDef); if (TSDB_CODE_SUCCESS != code) { return code; } @@ -10073,12 +10234,12 @@ static int32_t projColPosCompar(const void* l, const void* r) { static void projColPosDelete(void* p) { nodesDestroyNode(((SProjColPos*)p)->pProj); } static int32_t addProjToProjColPos(STranslateContext* pCxt, const SSchema* pSchema, SNode* pProj, SArray* pProjColPos) { - SNode* pNewProj = nodesCloneNode(pProj); + SNode* pNewProj = NULL; + int32_t code = nodesCloneNode(pProj, &pNewProj); if (NULL == pNewProj) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; SDataType dt = {.type = pSchema->type, .bytes = pSchema->bytes}; if (!dataTypeEqual(&dt, &((SExprNode*)pNewProj)->resType)) { SNode* pFunc = NULL; @@ -10174,10 +10335,11 @@ static int32_t adjustOrderOfProjections(STranslateContext* pCxt, SNodeList** ppC if (TSDB_CODE_SUCCESS == code) { taosArraySort(pProjColPos, projColPosCompar); int32_t num = taosArrayGetSize(pProjColPos); - pNewProjections = nodesMakeList(); - pNewCols = nodesMakeList(); - if (NULL == pNewProjections || !pNewCols) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = nodesMakeList(&pNewProjections); + if (TSDB_CODE_SUCCESS != code) return code; + code = nodesMakeList(&pNewCols); + if (TSDB_CODE_SUCCESS != code) { + code = code; } for (int32_t i = 0; TSDB_CODE_SUCCESS == code && i < num; ++i) { SProjColPos* pPos = taosArrayGet(pProjColPos, i); @@ -10283,9 +10445,9 @@ static int32_t adjustOrderOfTags(STranslateContext* pCxt, SNodeList* pTags, cons int32_t numOfBoundTags = taosArrayGetSize(pTagPos); int32_t numOfTags = getNumOfTags(pMeta); const SSchema* pTagsSchema = getTableTagSchema(pMeta); - pNewTagExprs = nodesMakeList(); + code = nodesMakeList(&pNewTagExprs); if (NULL == pNewTagExprs) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } for (int32_t i = 0; TSDB_CODE_SUCCESS == code && i < numOfTags; ++i) { const SSchema* pTagSchema = pTagsSchema + i; @@ -10298,7 +10460,10 @@ static int32_t adjustOrderOfTags(STranslateContext* pCxt, SNodeList* pTags, cons continue; } } - code = nodesListStrictAppend(pNewTagExprs, createNullValue()); + SNode* pNull = NULL; + code = createNullValue(&pNull); + if (TSDB_CODE_SUCCESS == code) + code = nodesListStrictAppend(pNewTagExprs, pNull); } } @@ -10401,20 +10566,22 @@ static int32_t translateStreamTargetTable(STranslateContext* pCxt, SCreateStream } static int32_t createLastTsSelectStmt(char* pDb, const char* pTable, const char* pkColName, SNode** pQuery) { - SColumnNode* col = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* col = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&col); if (NULL == col) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } tstrncpy(col->tableAlias, pTable, tListLen(col->tableAlias)); tstrncpy(col->colName, pkColName, tListLen(col->colName)); - SNodeList* pParameterList = nodesMakeList(); + SNodeList* pParameterList = NULL; + code = nodesMakeList(&pParameterList); if (NULL == pParameterList) { nodesDestroyNode((SNode*)col); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = nodesListStrictAppend(pParameterList, (SNode*)col); + code = nodesListStrictAppend(pParameterList, (SNode*)col); if (code) { nodesDestroyList(pParameterList); return code; @@ -10424,13 +10591,14 @@ static int32_t createLastTsSelectStmt(char* pDb, const char* pTable, const char* code = createFunction("last", pParameterList, (SFunctionNode**)&pFunc); if (code) { nodesDestroyList(pParameterList); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } - SNodeList* pProjectionList = nodesMakeList(); + SNodeList* pProjectionList = NULL; + code = nodesMakeList(&pProjectionList); if (NULL == pProjectionList) { nodesDestroyNode(pFunc); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } code = nodesListStrictAppend(pProjectionList, pFunc); @@ -10443,7 +10611,7 @@ static int32_t createLastTsSelectStmt(char* pDb, const char* pTable, const char* code = createFunction("_vgid", NULL, &pFunc1); if (code) { nodesDestroyList(pProjectionList); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } snprintf(pFunc1->node.aliasName, sizeof(pFunc1->node.aliasName), "%s.%p", pFunc1->functionName, pFunc1); @@ -10457,7 +10625,7 @@ static int32_t createLastTsSelectStmt(char* pDb, const char* pTable, const char* code = createFunction("_vgver", NULL, &pFunc2); if (code) { nodesDestroyList(pProjectionList); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } snprintf(pFunc2->node.aliasName, sizeof(pFunc2->node.aliasName), "%s.%p", pFunc2->functionName, pFunc2); @@ -10474,24 +10642,31 @@ static int32_t createLastTsSelectStmt(char* pDb, const char* pTable, const char* } SSelectStmt** pSelect1 = (SSelectStmt**)pQuery; - (*pSelect1)->pGroupByList = nodesMakeList(); + code = nodesMakeList(&(*pSelect1)->pGroupByList); if (NULL == (*pSelect1)->pGroupByList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - SGroupingSetNode* pNode1 = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET); + SGroupingSetNode* pNode1 = NULL; + code = nodesMakeNode(QUERY_NODE_GROUPING_SET, (SNode**)&pNode1); if (NULL == pNode1) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pNode1->groupingSetType = GP_TYPE_NORMAL; - pNode1->pParameterList = nodesMakeList(); + code = nodesMakeList(&pNode1->pParameterList); if (NULL == pNode1->pParameterList) { nodesDestroyNode((SNode*)pNode1); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - code = nodesListStrictAppend(pNode1->pParameterList, nodesCloneNode((SNode*)pFunc1)); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pFunc1, &pNew); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNode1); + return code; + } + code = nodesListStrictAppend(pNode1->pParameterList, pNew); if (code) { nodesDestroyNode((SNode*)pNode1); return code; @@ -10502,25 +10677,32 @@ static int32_t createLastTsSelectStmt(char* pDb, const char* pTable, const char* return code; } - SGroupingSetNode* pNode2 = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET); + SGroupingSetNode* pNode2 = NULL; + code = nodesMakeNode(QUERY_NODE_GROUPING_SET, (SNode**)&pNode2); if (NULL == pNode2) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pNode2->groupingSetType = GP_TYPE_NORMAL; - pNode2->pParameterList = nodesMakeList(); + code = nodesMakeList(&pNode2->pParameterList); if (NULL == pNode2->pParameterList) { nodesDestroyNode((SNode*)pNode2); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - code = nodesListStrictAppend(pNode2->pParameterList, nodesCloneNode((SNode*)pFunc2)); + pNew = NULL; + code = nodesCloneNode((SNode*)pFunc2, &pNew); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNode2); + return code; + } + code = nodesListStrictAppend(pNode2->pParameterList, pNew); if (code) { nodesDestroyNode((SNode*)pNode2); return code; } - return nodesListAppend((*pSelect1)->pGroupByList, (SNode*)pNode2); + return nodesListStrictAppend((*pSelect1)->pGroupByList, (SNode*)pNode2); } static int32_t checkAndAdjStreamDestTableSchema(STranslateContext* pCxt, SCreateStreamStmt* pStmt, @@ -10551,7 +10733,8 @@ static int32_t checkAndAdjStreamDestTableSchema(STranslateContext* pCxt, SCreate pNode = nodesListGetNode(pStmt->pCols, 1); pCol = (SColumnDefNode*)pNode; if (STREAM_CREATE_STABLE_TRUE == pReq->createStb) { - setColumnDefNodePrimaryKey(pCol, true); + int32_t code = setColumnDefNodePrimaryKey(pCol, true); + if (TSDB_CODE_SUCCESS != code) return code; } if (!pCol->pOptions || !((SColumnOptions*)pCol->pOptions)->bPrimaryKey) { return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, @@ -10974,9 +11157,10 @@ static int32_t translateDropFunction(STranslateContext* pCxt, SDropFunctionStmt* } static int32_t createRealTableForGrantTable(SGrantStmt* pStmt, SRealTableNode** pTable) { - SRealTableNode* pRealTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); + SRealTableNode* pRealTable = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_REAL_TABLE, (SNode**)&pRealTable); if (NULL == pRealTable) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pRealTable->table.dbName, pStmt->objName); strcpy(pRealTable->table.tableName, pStmt->tabName); @@ -11209,13 +11393,15 @@ static int32_t translateShowCreateView(STranslateContext* pCxt, SShowCreateViewS #endif } -static SColumnNode* createColumnNodeWithName(const char* name) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - if (!pCol) return NULL; +static int32_t createColumnNodeWithName(const char* name, SNode** ppCol) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); + if (!pCol) return code; tstrncpy(pCol->colName, name, TSDB_COL_NAME_LEN); tstrncpy(pCol->node.aliasName, name, TSDB_COL_NAME_LEN); tstrncpy(pCol->node.userAlias, name, TSDB_COL_NAME_LEN); - return pCol; + *ppCol = (SNode*)pCol; + return code; } static int32_t compareTsmaColWithColId(SNode* pNode1, SNode* pNode2) { @@ -11265,13 +11451,16 @@ static void deduplicateTsmaFuncs(SNodeList* pFuncs) { static int32_t buildTSMAAstStreamSubTable(SCreateTSMAStmt* pStmt, SMCreateSmaReq* pReq, const SNode* pTbname, SNode** pSubTable) { int32_t code = 0; - SFunctionNode* pMd5Func = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - SFunctionNode* pConcatFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - SValueNode* pVal = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); - if (!pMd5Func || !pConcatFunc || !pVal) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _end; - } + SFunctionNode* pMd5Func = NULL; + code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pMd5Func); + if (TSDB_CODE_SUCCESS != code) goto _end; + SFunctionNode* pConcatFunc = NULL; + code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pConcatFunc); + if (TSDB_CODE_SUCCESS != code) goto _end; + SValueNode* pVal = NULL; + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pVal); + if (TSDB_CODE_SUCCESS != code) goto _end; + sprintf(pMd5Func->functionName, "%s", "md5"); sprintf(pConcatFunc->functionName, "%s", "concat"); pVal->literal = taosMemoryMalloc(TSDB_TABLE_FNAME_LEN + 1); @@ -11288,7 +11477,10 @@ static int32_t buildTSMAAstStreamSubTable(SCreateTSMAStmt* pStmt, SMCreateSmaReq // not recursive tsma, md5(concat('1.test.tsma1_', tbname)) // recursive tsma, md5(concat('1.test.tsma1_', `tbname`)), `tbname` is the last tag - code = nodesListStrictAppend(pConcatFunc->pParameterList, nodesCloneNode(pTbname)); + SNode* pNew = NULL; + code = nodesCloneNode(pTbname, &pNew); + if (TSDB_CODE_SUCCESS != code) goto _end; + code = nodesListStrictAppend(pConcatFunc->pParameterList, pNew); if (code != TSDB_CODE_SUCCESS) goto _end; code = nodesListMakeAppend(&pMd5Func->pParameterList, (SNode*)pConcatFunc); @@ -11312,19 +11504,19 @@ static int32_t buildTSMAAst(STranslateContext* pCxt, SCreateTSMAStmt* pStmt, SMC info.createSmaIndex = true; info.pDbName = pStmt->dbName; info.pTableName = tbName; - info.pFuncs = nodesCloneList(pStmt->pOptions->pFuncs); - info.pInterval = nodesCloneNode(pStmt->pOptions->pInterval); - if (!info.pFuncs || !info.pInterval) code = TSDB_CODE_OUT_OF_MEMORY; + code = nodesCloneList(pStmt->pOptions->pFuncs, &info.pFuncs); + if (TSDB_CODE_SUCCESS == code) + code = nodesCloneNode(pStmt->pOptions->pInterval, &info.pInterval); SFunctionNode* pTbnameFunc = NULL; if (TSDB_CODE_SUCCESS == code) { // append partition by tbname - pTbnameFunc = (SFunctionNode*)createTbnameFunction(); + code = createTbnameFunction(&pTbnameFunc); if (pTbnameFunc) { sprintf(pTbnameFunc->node.userAlias, "tbname"); code = nodesListMakeStrictAppend(&info.pPartitionByList, (SNode*)pTbnameFunc); } else { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } if (TSDB_CODE_SUCCESS == code) { @@ -11332,14 +11524,18 @@ static int32_t buildTSMAAst(STranslateContext* pCxt, SCreateTSMAStmt* pStmt, SMC // append partition by tags SNode* pTagCol = NULL; for (int32_t idx = 0; idx < partitionTagNum; ++idx) { - pTagCol = (SNode*)createColumnNodeWithName(pTags[idx].name); + pTagCol = NULL; + code = createColumnNodeWithName(pTags[idx].name, &pTagCol); if (!pTagCol) { - code = TSDB_CODE_OUT_OF_MEMORY; break; } code = nodesListAppend(info.pPartitionByList, pTagCol); - if (TSDB_CODE_SUCCESS == code) - code = nodesListMakeStrictAppend(&info.pTags, nodesCloneNode(pTagCol)); + if (TSDB_CODE_SUCCESS == code) { + SNode*pNew = NULL; + code = nodesCloneNode(pTagCol, &pNew); + if (TSDB_CODE_SUCCESS == code) + code = nodesListMakeStrictAppend(&info.pTags, pNew); + } } // sub table @@ -11347,17 +11543,22 @@ static int32_t buildTSMAAst(STranslateContext* pCxt, SCreateTSMAStmt* pStmt, SMC SFunctionNode* pSubTable = NULL; pTagCol = NULL; if (pTags && numOfTags > 0) { - pTagCol = (SNode*)createColumnNodeWithName(pTags[numOfTags - 1].name); - if (!pTagCol) code = TSDB_CODE_OUT_OF_MEMORY; + code = createColumnNodeWithName(pTags[numOfTags - 1].name, &pTagCol); } if (code == TSDB_CODE_SUCCESS) { code = buildTSMAAstStreamSubTable(pStmt, pReq, pStmt->pOptions->recursiveTsma ? pTagCol : (SNode*)pTbnameFunc, (SNode**)&pSubTable); info.pSubTable = (SNode*)pSubTable; } - if (code == TSDB_CODE_SUCCESS) - code = nodesListMakeStrictAppend( - &info.pTags, pStmt->pOptions->recursiveTsma ? pTagCol : nodesCloneNode((SNode*)pTbnameFunc)); + if (code == TSDB_CODE_SUCCESS) { + if (pStmt->pOptions->recursiveTsma) { + code = nodesListMakeStrictAppend(&info.pTags, pTagCol); + } else { + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pTbnameFunc, &pNew); + if (TSDB_CODE_SUCCESS == code) code = nodesListMakeStrictAppend(&info.pTags, pNew); + } + } } } @@ -11375,9 +11576,8 @@ static int32_t buildTSMAAst(STranslateContext* pCxt, SCreateTSMAStmt* pStmt, SMC } static int32_t createColumnBySchema(const SSchema* pSchema, SColumnNode** ppCol) { - *ppCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); - int32_t code = 0; - if (!*ppCol) return TSDB_CODE_OUT_OF_MEMORY; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)ppCol); + if (!*ppCol) return code; (*ppCol)->colId = pSchema->colId; (*ppCol)->node.resType.type = pSchema->type; @@ -11523,7 +11723,10 @@ static int32_t buildCreateTSMAReq(STranslateContext* pCxt, SCreateTSMAStmt* pStm FOREACH(pNode, pSelect->pProjectionList) { SFunctionNode* pFuncNode = (SFunctionNode*)pNode; if (!fmIsTSMASupportedFunc(pFuncNode->funcId)) continue; - code = nodesListMakeStrictAppend(&pStmt->pOptions->pFuncs, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeStrictAppend(&pStmt->pOptions->pFuncs, pNew); if (TSDB_CODE_SUCCESS != code) { break; } @@ -12114,29 +12317,36 @@ int32_t extractResultSchema(const SNode* pRoot, int32_t* numOfCols, SSchema** pS return TSDB_CODE_FAILED; } -static SNode* createStarCol() { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); +static int32_t createStarCol(SNode** ppNode) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - return NULL; + return code; } strcpy(pCol->colName, "*"); - return (SNode*)pCol; + *ppNode = (SNode*)pCol; + return code; } -static SNode* createProjectCol(const char* pProjCol) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); +static int32_t createProjectCol(const char* pProjCol, SNode** ppNode) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - return NULL; + return code; } snprintf(pCol->colName, sizeof(pCol->colName), "%s", pProjCol); - return (SNode*)pCol; + *ppNode = (SNode*)pCol; + return code; } static int32_t createProjectCols(int32_t ncols, const char* const pCols[], SNodeList** pResList) { SNodeList* pProjections = NULL; int32_t code = TSDB_CODE_SUCCESS; if (0 == ncols) { - code = nodesListMakeStrictAppend(&pProjections, createStarCol()); + SNode* pStar = NULL; + code = createStarCol(&pStar); + if (TSDB_CODE_SUCCESS != code) return code; + code = nodesListMakeStrictAppend(&pProjections, pStar); if (TSDB_CODE_SUCCESS == code) *pResList = pProjections; else @@ -12144,7 +12354,13 @@ static int32_t createProjectCols(int32_t ncols, const char* const pCols[], SNode return code; } for (int32_t i = 0; i < ncols; ++i) { - code = nodesListMakeStrictAppend(&pProjections, createProjectCol(pCols[i])); + SNode* pPrjCol = NULL; + code = createProjectCol(pCols[i], (SNode**)&pPrjCol); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pProjections); + break; + } + code = nodesListMakeStrictAppend(&pProjections, pPrjCol); if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pProjections); break; @@ -12156,16 +12372,18 @@ static int32_t createProjectCols(int32_t ncols, const char* const pCols[], SNode static int32_t createSimpleSelectStmtImpl(const char* pDb, const char* pTable, SNodeList* pProjectionList, SSelectStmt** pStmt) { - SSelectStmt* pSelect = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); + SSelectStmt* pSelect = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_SELECT_STMT, (SNode**)&pSelect); if (NULL == pSelect) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } sprintf(pSelect->stmtName, "%p", pSelect); - SRealTableNode* pRealTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); + SRealTableNode* pRealTable = NULL; + code = nodesMakeNode(QUERY_NODE_REAL_TABLE, (SNode**)&pRealTable); if (NULL == pRealTable) { nodesDestroyNode((SNode*)pSelect); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } snprintf(pRealTable->table.dbName, sizeof(pRealTable->table.dbName), "%s", pDb); snprintf(pRealTable->table.tableName, sizeof(pRealTable->table.tableName), "%s", pTable); @@ -12204,22 +12422,27 @@ static int32_t createSelectStmtForShowTableDist(SShowTableDistributedStmt* pStmt return createSimpleSelectStmtFromCols(pStmt->dbName, pStmt->tableName, 0, NULL, pOutput); } -static int32_t createOperatorNode(EOperatorType opType, const char* pColName, SNode* pRight, SNode** pOp) { +static int32_t createOperatorNode(EOperatorType opType, const char* pColName, const SNode* pRight, SNode** pOp) { if (NULL == pRight) { return TSDB_CODE_SUCCESS; } - SOperatorNode* pOper = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOper = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOper); if (NULL == pOper) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pOper->opType = opType; - pOper->pLeft = nodesMakeNode(QUERY_NODE_COLUMN); - pOper->pRight = nodesCloneNode(pRight); - if (NULL == pOper->pLeft || NULL == pOper->pRight) { + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pOper->pLeft); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pOper); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + code = nodesCloneNode(pRight, (SNode**)&pOper->pRight); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pOper); + return code; } snprintf(((SColumnNode*)pOper->pLeft)->colName, sizeof(((SColumnNode*)pOper->pLeft)->colName), "%s", pColName); @@ -12229,15 +12452,20 @@ static int32_t createOperatorNode(EOperatorType opType, const char* pColName, SN static int32_t createParOperatorNode(EOperatorType opType, const char* pLeftCol, const char* pRightCol, SNode** ppResOp) { - SOperatorNode* pOper = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); - CHECK_POINTER_OUT_OF_MEM(pOper); + SOperatorNode* pOper = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOper); + if (TSDB_CODE_SUCCESS != code) return code; pOper->opType = opType; - pOper->pLeft = nodesMakeNode(QUERY_NODE_COLUMN); - pOper->pRight = nodesMakeNode(QUERY_NODE_COLUMN); - if (NULL == pOper->pLeft || NULL == pOper->pRight) { + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pOper->pLeft); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pOper); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pOper->pRight); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pOper); + return code; } strcpy(((SColumnNode*)pOper->pLeft)->colName, pLeftCol); strcpy(((SColumnNode*)pOper->pRight)->colName, pRightCol); @@ -12264,15 +12492,16 @@ static const char* getTbNameColName(ENodeType type) { static int32_t createLogicCondNode(SNode** pCond1, SNode** pCond2, SNode** pCond, ELogicConditionType logicCondType) { int32_t code = TSDB_CODE_SUCCESS; - SLogicConditionNode* pCondition = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SLogicConditionNode* pCondition = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pCondition); if (NULL == pCondition) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pCondition->condType = logicCondType; - pCondition->pParameterList = nodesMakeList(); + code = nodesMakeList(&pCondition->pParameterList); if (NULL == pCondition->pParameterList) { nodesDestroyNode((SNode*)pCondition); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } code = nodesListAppend(pCondition->pParameterList, *pCond1); if (TSDB_CODE_SUCCESS == code) { @@ -12326,7 +12555,8 @@ static int32_t insertCondIntoSelectStmt(SSelectStmt* pSelect, SNode** pCond) { } if (TSDB_CODE_SUCCESS == code) { - SLogicConditionNode* pWhere = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SLogicConditionNode* pWhere = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pWhere); if (pWhere) { pWhere->condType = LOGIC_COND_TYPE_AND; pWhere->pParameterList = pLogicCondListWhere; @@ -12348,13 +12578,10 @@ static int32_t addShowUserDatabasesCond(SSelectStmt* pSelect) { SNode* pNameCond2 = NULL; SNode* pNameCond = NULL; SValueNode* pValNode1 = NULL, *pValNode2 = NULL; - pValNode1 = nodesMakeValueNodeFromString(TSDB_INFORMATION_SCHEMA_DB); - if (!pValNode1) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesMakeValueNodeFromString(TSDB_INFORMATION_SCHEMA_DB, &pValNode1); + if (TSDB_CODE_SUCCESS == code) { - pValNode2 = nodesMakeValueNodeFromString(TSDB_PERFORMANCE_SCHEMA_DB); - if (!pValNode2) code = TSDB_CODE_OUT_OF_MEMORY; + code = nodesMakeValueNodeFromString(TSDB_PERFORMANCE_SCHEMA_DB, &pValNode2); } if (TSDB_CODE_SUCCESS == code) { code = createOperatorNode(OP_TYPE_NOT_EQUAL, "name", (SNode*)pValNode1, &pNameCond1); @@ -12384,13 +12611,9 @@ static int32_t addShowSystemDatabasesCond(SSelectStmt* pSelect) { SNode* pNameCond2 = NULL; SValueNode* pValNode1 = NULL, * pValNode2 = NULL; SNode* pNameCond = NULL; - pValNode1 = nodesMakeValueNodeFromString(TSDB_INFORMATION_SCHEMA_DB); - if (!pValNode1) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesMakeValueNodeFromString(TSDB_INFORMATION_SCHEMA_DB, &pValNode1); if (TSDB_CODE_SUCCESS == code) { - pValNode2 = nodesMakeValueNodeFromString(TSDB_PERFORMANCE_SCHEMA_DB); - if (!pValNode2) code = terrno; + code = nodesMakeValueNodeFromString(TSDB_PERFORMANCE_SCHEMA_DB, &pValNode2); } if (TSDB_CODE_SUCCESS == code) { code = createOperatorNode(OP_TYPE_EQUAL, "name", (SNode*)pValNode1, &pNameCond1); @@ -12418,8 +12641,8 @@ static int32_t addShowSystemDatabasesCond(SSelectStmt* pSelect) { static int32_t addShowNormalTablesCond(SSelectStmt* pSelect) { SNode* pTypeCond = NULL; int32_t code = TSDB_CODE_SUCCESS; - SValueNode* pValNode1 = nodesMakeValueNodeFromString("NORMAL_TABLE"); - if (!pValNode1) code = TSDB_CODE_OUT_OF_MEMORY; + SValueNode* pValNode1 = NULL; + code = nodesMakeValueNodeFromString("NORMAL_TABLE", &pValNode1); if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "type", (SNode*)pValNode1, &pTypeCond); @@ -12434,8 +12657,8 @@ static int32_t addShowNormalTablesCond(SSelectStmt* pSelect) { static int32_t addShowChildTablesCond(SSelectStmt* pSelect) { int32_t code = TSDB_CODE_SUCCESS; SNode* pTypeCond = NULL; - SValueNode* pValNode1 = nodesMakeValueNodeFromString("CHILD_TABLE"); - if (!pValNode1) code = TSDB_CODE_OUT_OF_MEMORY; + SValueNode* pValNode1 = NULL; + code = nodesMakeValueNodeFromString("CHILD_TABLE", &pValNode1); if (TSDB_CODE_SUCCESS == code) code = createOperatorNode(OP_TYPE_EQUAL, "type", (SNode*)pValNode1, &pTypeCond); @@ -12564,13 +12787,15 @@ static int32_t rewriteShowTags(STranslateContext* pCxt, SQuery* pQuery) { return code; } -static SNode* createTagsFunction() { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t createTagsFunction(SFunctionNode** ppNode) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } strcpy(pFunc->functionName, "_tags"); - return (SNode*)pFunc; + *ppNode = pFunc; + return code; } static int32_t createShowTableTagsProjections(SNodeList** pProjections, SNodeList** pTags) { @@ -12578,9 +12803,17 @@ static int32_t createShowTableTagsProjections(SNodeList** pProjections, SNodeLis TSWAP(*pProjections, *pTags); return TSDB_CODE_SUCCESS; } - int32_t code = nodesListMakeStrictAppend(pProjections, createTbnameFunction()); + SFunctionNode* pTbNameFunc = NULL; + int32_t code = createTbnameFunction(&pTbNameFunc); if (TSDB_CODE_SUCCESS == code) { - code = nodesListStrictAppend(*pProjections, createTagsFunction()); + code = nodesListMakeStrictAppend(pProjections, (SNode*)pTbNameFunc); + } + SFunctionNode* pTagsFunc = NULL; + if (TSDB_CODE_SUCCESS == code) { + code = createTagsFunction(&pTagsFunc); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(*pProjections, (SNode*)pTagsFunc); } return code; } @@ -12651,30 +12884,39 @@ static int32_t rewriteShowVnodes(STranslateContext* pCxt, SQuery* pQuery) { return code; } -static SNode* createBlockDistInfoFunc() { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t createBlockDistInfoFunc(SFunctionNode** ppNode) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } strcpy(pFunc->functionName, "_block_dist_info"); strcpy(pFunc->node.aliasName, "_block_dist_info"); - return (SNode*)pFunc; + *ppNode = pFunc; + return code; } -static SNode* createBlockDistFunc() { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t createBlockDistFunc(SFunctionNode** ppNode) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } strcpy(pFunc->functionName, "_block_dist"); strcpy(pFunc->node.aliasName, "_block_dist"); - if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pFunc->pParameterList, createBlockDistInfoFunc())) { - nodesDestroyNode((SNode*)pFunc); - return NULL; + SFunctionNode* pFuncNew = NULL; + code = createBlockDistInfoFunc(&pFuncNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pFunc->pParameterList, (SNode*)pFuncNew); } - return (SNode*)pFunc; + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pFunc); + return code; + } + *ppNode = pFunc; + return code; } static int32_t rewriteShowTableDist(STranslateContext* pCxt, SQuery* pQuery) { @@ -12682,7 +12924,10 @@ static int32_t rewriteShowTableDist(STranslateContext* pCxt, SQuery* pQuery) { int32_t code = createSelectStmtForShowTableDist((SShowTableDistributedStmt*)pQuery->pRoot, &pStmt); if (TSDB_CODE_SUCCESS == code) { NODES_DESTORY_LIST(pStmt->pProjectionList); - code = nodesListMakeStrictAppend(&pStmt->pProjectionList, createBlockDistFunc()); + SFunctionNode* pFuncNew = NULL; + code = createBlockDistFunc(&pFuncNew); + if (TSDB_CODE_SUCCESS == code) + code = nodesListMakeStrictAppend(&pStmt->pProjectionList, (SNode*)pFuncNew); } if (TSDB_CODE_SUCCESS == code) { pCxt->showRewrite = true; @@ -12821,9 +13066,10 @@ static void destroyCreateTbReqBatch(void* data) { } int32_t rewriteToVnodeModifyOpStmt(SQuery* pQuery, SArray* pBufArray) { - SVnodeModifyOpStmt* pNewStmt = (SVnodeModifyOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT); + SVnodeModifyOpStmt* pNewStmt = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT, (SNode**)&pNewStmt); if (pNewStmt == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pNewStmt->sqlNodeType = nodeType(pQuery->pRoot); pNewStmt->pDataBlocks = pBufArray; @@ -12950,11 +13196,12 @@ static int32_t addCreateTbReqIntoVgroup(SHashObj* pVgroupHashmap, const char* db } static int32_t createCastFuncForTag(STranslateContext* pCxt, SNode* pNode, SDataType dt, SNode** pCast) { - SNode* pExpr = nodesCloneNode(pNode); + SNode* pExpr = NULL; + int32_t code = nodesCloneNode(pNode, (SNode**)&pExpr); if (NULL == pExpr) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = translateExpr(pCxt, &pExpr); + code = translateExpr(pCxt, &pExpr); if (TSDB_CODE_SUCCESS == code) { code = createCastFunc(pCxt, pExpr, dt, pCast); } @@ -13654,9 +13901,10 @@ static int32_t rewriteCreateMultiTable(STranslateContext* pCxt, SQuery* pQuery) } static int32_t rewriteCreateTableFromFile(STranslateContext* pCxt, SQuery* pQuery) { - SVnodeModifyOpStmt* pModifyStmt = (SVnodeModifyOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT); + SVnodeModifyOpStmt* pModifyStmt = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VNODE_MODIFY_STMT, (SNode**)&pModifyStmt); if (pModifyStmt == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pModifyStmt->sqlNodeType = nodeType(pQuery->pRoot); pModifyStmt->fileProcessing = false; @@ -13669,7 +13917,7 @@ static int32_t rewriteCreateTableFromFile(STranslateContext* pCxt, SQuery* pQuer SCreateSubTableFromFileClause* pCreateStmt = (SCreateSubTableFromFileClause*)pQuery->pRoot; - int32_t code = prepareReadCsvFile(pCxt, pCreateStmt, pModifyStmt); + code = prepareReadCsvFile(pCxt, pCreateStmt, pModifyStmt); if (TSDB_CODE_SUCCESS != code) { taosHashCleanup(pModifyStmt->pVgroupsHashObj); return code; @@ -14459,8 +14707,9 @@ static int32_t rewriteShowCompactDetailsStmt(STranslateContext* pCxt, SQuery* pQ } static int32_t createParWhenThenNode(SNode* pWhen, SNode* pThen, SNode** ppResWhenThen) { - SWhenThenNode* pWThen = (SWhenThenNode*)nodesMakeNode(QUERY_NODE_WHEN_THEN); - CHECK_POINTER_OUT_OF_MEM(pWThen); + SWhenThenNode* pWThen = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_WHEN_THEN, (SNode**)&pWThen); + if (TSDB_CODE_SUCCESS != code) return code; pWThen->pWhen = pWhen; pWThen->pThen = pThen; @@ -14470,8 +14719,11 @@ static int32_t createParWhenThenNode(SNode* pWhen, SNode* pThen, SNode** ppResWh static int32_t createParCaseWhenNode(SNode* pCase, SNodeList* pWhenThenList, SNode* pElse, const char* pAias, SNode** ppResCaseWhen) { - SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)nodesMakeNode(QUERY_NODE_CASE_WHEN); - CHECK_POINTER_OUT_OF_MEM(pCaseWhen); + SCaseWhenNode* pCaseWhen = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_CASE_WHEN, (SNode**)&pCaseWhen); + if (TSDB_CODE_SUCCESS != code) { + return code; + } pCaseWhen->pCase = pCase; pCaseWhen->pWhenThenList = pWhenThenList; @@ -14486,8 +14738,11 @@ static int32_t createParCaseWhenNode(SNode* pCase, SNodeList* pWhenThenList, SNo static int32_t createParFunctionNode(const char* pFunName, const char* pAias, SNodeList* pParameterList, SNode** ppResFunc) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); - CHECK_POINTER_OUT_OF_MEM(pFunc); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); + if (TSDB_CODE_SUCCESS != code) { + return code; + } strcpy(pFunc->functionName, pFunName); strcpy(pFunc->node.aliasName, pAias); strcpy(pFunc->node.userAlias, pAias); @@ -14497,16 +14752,22 @@ static int32_t createParFunctionNode(const char* pFunName, const char* pAias, SN } static int32_t createParListNode(SNode* pItem, SNodeList** ppResList) { - SNodeList* pList = nodesMakeList(); - CHECK_POINTER_OUT_OF_MEM(pList); - CHECK_RES_OUT_OF_MEM(nodesListStrictAppend(pList, pItem)); + SNodeList* pList = NULL; + int32_t code = nodesMakeList(&pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + CHECK_RES_OUT_OF_MEM(nodesListAppend(pList, pItem)); *ppResList = pList; return TSDB_CODE_SUCCESS; } static int32_t createParTempTableNode(SSelectStmt* pSubquery, SNode** ppResTempTable) { - STempTableNode* pTempTable = (STempTableNode*)nodesMakeNode(QUERY_NODE_TEMP_TABLE); - CHECK_POINTER_OUT_OF_MEM(pTempTable); + STempTableNode* pTempTable = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_TEMP_TABLE, (SNode**)&pTempTable); + if (TSDB_CODE_SUCCESS != code) { + return code; + } pTempTable->pSubquery = (SNode*)pSubquery; taosRandStr(pTempTable->table.tableAlias, 8); strcpy(pSubquery->stmtName, pTempTable->table.tableAlias); @@ -14526,128 +14787,389 @@ static int32_t rewriteShowAliveStmt(STranslateContext* pCxt, SQuery* pQuery) { } } - SValueNode* pValNode = nodesMakeValueNodeFromString("leader"); - CHECK_POINTER_OUT_OF_MEM(pValNode); + SValueNode* pValNode = NULL; + code = nodesMakeValueNodeFromString("leader", &pValNode); + if (TSDB_CODE_SUCCESS != code) return code; SNode* pCond1 = NULL; SNode* pCond2 = NULL; SNode* pCond3 = NULL; SNode* pCond4 = NULL; - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_EQUAL, "v1_status", (SNode*)pValNode, &pCond1)); - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_EQUAL, "v2_status", (SNode*)pValNode, &pCond2)); - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_EQUAL, "v3_status", (SNode*)pValNode, &pCond3)); - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_EQUAL, "v4_status", (SNode*)pValNode, &pCond4)); + code = createOperatorNode(OP_TYPE_EQUAL, "v1_status", (SNode*)pValNode, &pCond1); + if (TSDB_CODE_SUCCESS == code) + code = createOperatorNode(OP_TYPE_EQUAL, "v2_status", (SNode*)pValNode, &pCond2); + if (TSDB_CODE_SUCCESS == code) + code = createOperatorNode(OP_TYPE_EQUAL, "v3_status", (SNode*)pValNode, &pCond3); + if (TSDB_CODE_SUCCESS == code) + code = createOperatorNode(OP_TYPE_EQUAL, "v4_status", (SNode*)pValNode, &pCond4); nodesDestroyNode((SNode*)pValNode); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pCond1); + nodesDestroyNode(pCond2); + nodesDestroyNode(pCond3); + nodesDestroyNode(pCond4); + return code; + } + // pCond1-4 need to free if error SNode* pTemp1 = NULL; SNode* pTemp2 = NULL; SNode* pFullCond = NULL; - CHECK_RES_OUT_OF_MEM(createLogicCondNode(&pCond1, &pCond2, &pTemp1, LOGIC_COND_TYPE_OR)); - CHECK_RES_OUT_OF_MEM(createLogicCondNode(&pTemp1, &pCond3, &pTemp2, LOGIC_COND_TYPE_OR)); - CHECK_RES_OUT_OF_MEM(createLogicCondNode(&pTemp2, &pCond4, &pFullCond, LOGIC_COND_TYPE_OR)); + code = createLogicCondNode(&pCond1, &pCond2, &pTemp1, LOGIC_COND_TYPE_OR); + if (TSDB_CODE_SUCCESS == code) + code = createLogicCondNode(&pTemp1, &pCond3, &pTemp2, LOGIC_COND_TYPE_OR); + if (TSDB_CODE_SUCCESS == code) + code = createLogicCondNode(&pTemp2, &pCond4, &pFullCond, LOGIC_COND_TYPE_OR); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pCond1); + nodesDestroyNode(pCond2); + nodesDestroyNode(pCond3); + nodesDestroyNode(pCond4); + nodesDestroyNode(pTemp1); + nodesDestroyNode(pTemp2); + nodesDestroyNode(pFullCond); + return code; + } - SNode* pThen = nodesMakeValueNodeFromInt32(1); - CHECK_POINTER_OUT_OF_MEM(pThen); + // only pFullCond needs to free if err + + SNode* pThen = NULL; + code = nodesMakeValueNodeFromInt32(1, &pThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pFullCond); + return code; + } + + // pFullCond and pThen need to free SNode* pWhenThen = NULL; - CHECK_RES_OUT_OF_MEM(createParWhenThenNode(pFullCond, pThen, &pWhenThen)); - SNodeList* pWhenThenlist = NULL; - CHECK_RES_OUT_OF_MEM(createParListNode(pWhenThen, &pWhenThenlist)); + code = createParWhenThenNode(pFullCond, pThen, &pWhenThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pFullCond); + nodesDestroyNode(pThen); + return code; + } + // pWhenThen needs to free - SNode* pElse = nodesMakeValueNodeFromInt32(0); - CHECK_POINTER_OUT_OF_MEM(pElse); + SNodeList* pWhenThenlist = NULL; + code = createParListNode(pWhenThen, &pWhenThenlist); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pWhenThen); + return code; + } + + // pWhenThenlist needs to free + + SNode* pElse = NULL; + code = nodesMakeValueNodeFromInt32(0, &pElse); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pWhenThenlist); + return code; + } + + // pWhenThenlist and pElse need to free // case when (v1_status = "leader" or v2_status = "lead er" or v3_status = "leader" or v4_status = "leader") then 1 // else 0 end SNode* pCaseWhen = NULL; - CHECK_RES_OUT_OF_MEM(createParCaseWhenNode(NULL, pWhenThenlist, pElse, NULL, &pCaseWhen)); + code = createParCaseWhenNode(NULL, pWhenThenlist, pElse, NULL, &pCaseWhen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pElse); + return code; + } + + // pCaseWhen needs to free SNodeList* pParaList = NULL; - CHECK_RES_OUT_OF_MEM(createParListNode(pCaseWhen, &pParaList)); + code = createParListNode(pCaseWhen, &pParaList); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pCaseWhen); + return code; + } + + // pParaList needs to free // sum( case when ... end) as leader_col SNode* pSumFun = NULL; const char* pSumColAlias = "leader_col"; - CHECK_RES_OUT_OF_MEM(createParFunctionNode("sum", pSumColAlias, pParaList, &pSumFun)); + code = createParFunctionNode("sum", pSumColAlias, pParaList, &pSumFun); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pParaList); + return code; + } - SNode* pPara1 = nodesMakeValueNodeFromInt32(1); - CHECK_POINTER_OUT_OF_MEM(pThen); + // pSumFun needs to free + + SNode* pPara1 = NULL; + code = nodesMakeValueNodeFromInt32(1, &pPara1); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pSumFun); + return code; + } + + // pSumFun and pPara1 need to free pParaList = NULL; - CHECK_RES_OUT_OF_MEM(createParListNode(pPara1, &pParaList)); + code = createParListNode(pPara1, &pParaList); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pSumFun); + nodesDestroyNode(pPara1); + return code; + } + + // pSumFun and pParaList need to free // count(1) as count_col SNode* pCountFun = NULL; const char* pCountColAlias = "count_col"; - CHECK_RES_OUT_OF_MEM(createParFunctionNode("count", pCountColAlias, pParaList, &pCountFun)); + code = createParFunctionNode("count", pCountColAlias, pParaList, &pCountFun); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pSumFun); + nodesDestroyList(pParaList); + return code; + } + + // pSumFun and pCountFun need to free SNodeList* pProjList = NULL; - CHECK_RES_OUT_OF_MEM(createParListNode(pSumFun, &pProjList)); - CHECK_RES_OUT_OF_MEM(nodesListStrictAppend(pProjList, pCountFun)); + code = createParListNode(pSumFun, &pProjList); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pSumFun); + nodesDestroyNode(pCountFun); + return code; + } + + // pProjList and pCountFun need to free + + code = nodesListStrictAppend(pProjList, pCountFun); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pProjList); + return code; + } + + // pProjList needs to free SSelectStmt* pSubSelect = NULL; // select sum( case when .... end) as leader_col, count(*) as count_col from information_schema.ins_vgroups - CHECK_RES_OUT_OF_MEM( - createSimpleSelectStmtFromProjList(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, pProjList, &pSubSelect)); + code = createSimpleSelectStmtFromProjList(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, pProjList, &pSubSelect); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pProjList); + return code; + } + + // pSubSelect needs to free if (pDbName && pDbName[0] != 0) { // for show db.alive // select sum( case when .... end) as leader_col, count(*) as count_col from information_schema.ins_vgroups where // db_name = "..." SNode* pDbCond = NULL; - pValNode = nodesMakeValueNodeFromString(pDbName); - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_EQUAL, "db_name", (SNode*)pValNode, &pDbCond)); + code = nodesMakeValueNodeFromString(pDbName, &pValNode); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + return code; + } + // pSubSelect and pValNode need to free + + code = createOperatorNode(OP_TYPE_EQUAL, "db_name", (SNode*)pValNode, &pDbCond); nodesDestroyNode((SNode*)pValNode); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + return code; + } + pCxt->showRewrite = false; pQuery->showRewrite = false; pSubSelect->pWhere = pDbCond; + // pSubSelect need to free } + // pSubSelect need to free + pCond1 = NULL; - CHECK_RES_OUT_OF_MEM(createParOperatorNode(OP_TYPE_EQUAL, pSumColAlias, pCountColAlias, &pCond1)); + code = createParOperatorNode(OP_TYPE_EQUAL, pSumColAlias, pCountColAlias, &pCond1); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + return code; + } + // pSubSelect and pCond1 need to free + pCond2 = NULL; - SNode* pTempVal = nodesMakeValueNodeFromInt32(0); - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_GREATER_THAN, pSumColAlias, pTempVal, &pCond2)); + SNode* pTempVal = NULL; + code = nodesMakeValueNodeFromInt32(0, &pTempVal); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pCond1); + return code; + } + // pSubSelect, pCond1, pTempVal need to free + + code = createOperatorNode(OP_TYPE_GREATER_THAN, pSumColAlias, pTempVal, &pCond2); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pCond1); + nodesDestroyNode(pTempVal); + return code; + } + // pSubSelect, pCond1, pCond2, pTempVal need to free + // leader_col = count_col and leader_col > 0 pTemp1 = NULL; - CHECK_RES_OUT_OF_MEM(createLogicCondNode(&pCond1, &pCond2, &pTemp1, LOGIC_COND_TYPE_AND)); + code = createLogicCondNode(&pCond1, &pCond2, &pTemp1, LOGIC_COND_TYPE_AND); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pCond1); + nodesDestroyNode(pCond2); + nodesDestroyNode(pTempVal); + return code; + } + + // pSubSelect, pTemp1, pTempVal need to free + + pThen = NULL; + code = nodesMakeValueNodeFromInt32(1, &pThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pTemp1); + nodesDestroyNode(pTempVal); + return code; + } + // pSubSelect, pTemp1, pThen, pTempVal need to free - pThen = nodesMakeValueNodeFromInt32(1); - CHECK_POINTER_OUT_OF_MEM(pThen); pWhenThen = NULL; - CHECK_RES_OUT_OF_MEM(createParWhenThenNode(pTemp1, pThen, &pWhenThen)); + code = createParWhenThenNode(pTemp1, pThen, &pWhenThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pTemp1); + nodesDestroyNode(pThen); + nodesDestroyNode(pTempVal); + return code; + } + // pSubSelect, pWhenThen, pTempVal need to free + pWhenThenlist = NULL; - CHECK_RES_OUT_OF_MEM(createParListNode(pWhenThen, &pWhenThenlist)); + code = createParListNode(pWhenThen, &pWhenThenlist); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pWhenThen); + nodesDestroyNode(pTempVal); + return code; + } + + // pSubSelect, pWhenThenlist, pTempVal need to free pCond1 = NULL; - CHECK_RES_OUT_OF_MEM(createParOperatorNode(OP_TYPE_LOWER_THAN, pSumColAlias, pCountColAlias, &pCond1)); + code = createParOperatorNode(OP_TYPE_LOWER_THAN, pSumColAlias, pCountColAlias, &pCond1); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pTempVal); + return code; + } + // pSubSelect, pWhenThenlist, pCond1, pTempVal need to free + pCond2 = NULL; - CHECK_RES_OUT_OF_MEM(createOperatorNode(OP_TYPE_GREATER_THAN, pSumColAlias, pTempVal, &pCond2)); + code = createOperatorNode(OP_TYPE_GREATER_THAN, pSumColAlias, pTempVal, &pCond2); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pTempVal); + nodesDestroyNode(pCond1); + return code; + } + // pSubSelect, pWhenThenlist, pCond1, pTempVal, pCond2 need to free + // leader_col < count_col and leader_col > 0 pTemp2 = NULL; - CHECK_RES_OUT_OF_MEM(createLogicCondNode(&pCond1, &pCond2, &pTemp2, LOGIC_COND_TYPE_AND)); + code = createLogicCondNode(&pCond1, &pCond2, &pTemp2, LOGIC_COND_TYPE_AND); nodesDestroyNode((SNode*)pTempVal); - pThen = nodesMakeValueNodeFromInt32(2); - CHECK_POINTER_OUT_OF_MEM(pThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pCond1); + nodesDestroyNode(pCond2); + return code; + } + + // pSubSelect, pWhenThenlist, pTemp2 need to free + + pThen = NULL; + code = nodesMakeValueNodeFromInt32(2, &pThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pTemp2); + return code; + } + // pSubSelect, pWhenThenlist, pTemp2, pThen need to free + pWhenThen = NULL; - CHECK_RES_OUT_OF_MEM(createParWhenThenNode(pTemp2, pThen, &pWhenThen)); - CHECK_RES_OUT_OF_MEM(nodesListStrictAppend(pWhenThenlist, pWhenThen)); + code = createParWhenThenNode(pTemp2, pThen, &pWhenThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pTemp2); + nodesDestroyNode(pThen); + return code; + } + // pSubSelect, pWhenThenlist, pWhenThen need to free + + code = nodesListStrictAppend(pWhenThenlist, pWhenThen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + return code; + } + // pSubSelect, pWhenThenlist need to free // case when leader_col = count_col and count_col > 0 then 1 when leader_col < count_col and count_col > 0 then 2 else // 0 end as status + pElse = NULL; + code = nodesMakeValueNodeFromInt32(0, &pElse); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + return code; + } + // pSubSelect, pWhenThenlist, pElse need to free + pCaseWhen = NULL; - pElse = nodesMakeValueNodeFromInt32(0); - CHECK_POINTER_OUT_OF_MEM(pElse); - CHECK_RES_OUT_OF_MEM(createParCaseWhenNode(NULL, pWhenThenlist, pElse, "status", &pCaseWhen)); + code = createParCaseWhenNode(NULL, pWhenThenlist, pElse, "status", &pCaseWhen); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pWhenThenlist); + nodesDestroyNode(pElse); + return code; + } + // pSubSelect, pCaseWhen need to free pProjList = NULL; - CHECK_RES_OUT_OF_MEM(createParListNode(pCaseWhen, &pProjList)); + code = createParListNode(pCaseWhen, &pProjList); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyNode(pCaseWhen); + return code; + } + // pSubSelect, pProjList need to free SNode* pTempTblNode = NULL; - CHECK_RES_OUT_OF_MEM(createParTempTableNode(pSubSelect, &pTempTblNode)); + code = createParTempTableNode(pSubSelect, &pTempTblNode); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSubSelect); + nodesDestroyList(pProjList); + return code; + } + // pTempTblNode, pProjList need to free + + SSelectStmt* pStmt = NULL; + code = nodesMakeNode(QUERY_NODE_SELECT_STMT, (SNode**)&pStmt); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pTempTblNode); + nodesDestroyList(pProjList); + return code; + } - SSelectStmt* pStmt = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); - CHECK_POINTER_OUT_OF_MEM(pStmt); pStmt->pProjectionList = pProjList; pStmt->pFromTable = pTempTblNode; sprintf(pStmt->stmtName, "%p", pStmt); diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index e6b6bcc903..35d54ad43c 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -233,7 +233,7 @@ static char* getSyntaxErrFormat(int32_t errCode) { int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...) { va_list vArgList; va_start(vArgList, errCode); - vsnprintf(pBuf->buf, pBuf->len, getSyntaxErrFormat(errCode), vArgList); + (void)vsnprintf(pBuf->buf, pBuf->len, getSyntaxErrFormat(errCode), vArgList); va_end(vArgList); return errCode; } @@ -241,7 +241,7 @@ int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...) { int32_t generateSyntaxErrMsgExt(SMsgBuf* pBuf, int32_t errCode, const char* pFormat, ...) { va_list vArgList; va_start(vArgList, pFormat); - vsnprintf(pBuf->buf, pBuf->len, pFormat, vArgList); + (void)vsnprintf(pBuf->buf, pBuf->len, pFormat, vArgList); va_end(vArgList); return errCode; } @@ -254,7 +254,7 @@ int32_t buildInvalidOperationMsg(SMsgBuf* pBuf, const char* msg) { int32_t buildInvalidOperationMsgExt(SMsgBuf* pBuf, const char* pFormat, ...) { va_list vArgList; va_start(vArgList, pFormat); - vsnprintf(pBuf->buf, pBuf->len, pFormat, vArgList); + (void)vsnprintf(pBuf->buf, pBuf->len, pFormat, vArgList); va_end(vArgList); return TSDB_CODE_TSC_INVALID_OPERATION; } @@ -423,6 +423,10 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi } keyHash = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, false); + if (!keyHash) { + retCode = TSDB_CODE_OUT_OF_MEMORY; + goto end; + } for (int32_t i = 0; i < size; i++) { cJSON* item = cJSON_GetArrayItem(root, i); if (!item) { @@ -448,8 +452,11 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi STagVal val = {0}; // strcpy(val.colName, colName); val.pKey = jsonKey; - taosHashPut(keyHash, jsonKey, keyLen, &keyLen, - CHAR_BYTES); // add key to hash to remove dumplicate, value is useless + retCode = taosHashPut(keyHash, jsonKey, keyLen, &keyLen, + CHAR_BYTES); // add key to hash to remove dumplicate, value is useless + if (TSDB_CODE_SUCCESS != retCode) { + goto end; + } if (item->type == cJSON_String) { // add json value format: type|data char* jsonValue = item->valuestring; @@ -486,7 +493,10 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi retCode = buildSyntaxErrMsg(pMsgBuf, "invalidate json value", json); goto end; } - taosArrayPush(pTagVals, &val); + if (NULL == taosArrayPush(pTagVals, &val)) { + retCode = TSDB_CODE_OUT_OF_MEMORY; + goto end; + } } end: @@ -534,10 +544,11 @@ static int32_t getInsTagsTableTargetNameFromOp(int32_t acctId, SOperatorNode* pO return TSDB_CODE_SUCCESS; } -static void getInsTagsTableTargetObjName(int32_t acctId, SNode* pNode, SName* pName) { +static int32_t getInsTagsTableTargetObjName(int32_t acctId, SNode* pNode, SName* pName) { if (QUERY_NODE_OPERATOR == nodeType(pNode)) { - getInsTagsTableTargetNameFromOp(acctId, (SOperatorNode*)pNode, pName); + return getInsTagsTableTargetNameFromOp(acctId, (SOperatorNode*)pNode, pName); } + return TSDB_CODE_SUCCESS; } static int32_t getInsTagsTableTargetNameFromCond(int32_t acctId, SLogicConditionNode* pCond, SName* pName) { @@ -546,7 +557,12 @@ static int32_t getInsTagsTableTargetNameFromCond(int32_t acctId, SLogicCondition } SNode* pNode = NULL; - FOREACH(pNode, pCond->pParameterList) { getInsTagsTableTargetObjName(acctId, pNode, pName); } + FOREACH(pNode, pCond->pParameterList) { + int32_t code = getInsTagsTableTargetObjName(acctId, pNode, pName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + } if ('\0' == pName->dbname[0]) { pName->type = 0; } @@ -634,8 +650,18 @@ static int32_t buildTableReq(SHashObj* pTablesHash, SArray** pTables) { char fullName[TSDB_TABLE_FNAME_LEN] = {0}; strncpy(fullName, pKey, len); SName name = {0}; - tNameFromString(&name, fullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); - taosArrayPush(*pTables, &name); + int32_t code = tNameFromString(&name, fullName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE); + if (TSDB_CODE_SUCCESS == code) { + if (NULL == taosArrayPush(*pTables, &name)) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + } + if (TSDB_CODE_SUCCESS != code) { + taosHashCancelIterate(pTablesHash, p); + taosArrayDestroy(*pTables); + *pTables = NULL; + return code; + } p = taosHashIterate(pTablesHash, p); } } @@ -654,7 +680,12 @@ static int32_t buildDbReq(SHashObj* pDbsHash, SArray** pDbs) { char* pKey = taosHashGetKey(p, &len); char fullName[TSDB_DB_FNAME_LEN] = {0}; strncpy(fullName, pKey, len); - taosArrayPush(*pDbs, fullName); + if (NULL == taosArrayPush(*pDbs, fullName)) { + taosHashCancelIterate(pDbsHash, p); + taosArrayDestroy(*pDbs); + *pDbs = NULL; + return TSDB_CODE_OUT_OF_MEMORY; + } p = taosHashIterate(pDbsHash, p); } } @@ -673,8 +704,18 @@ static int32_t buildTableReqFromDb(SHashObj* pDbsHash, SArray** pDbs) { while (NULL != p) { STablesReq req = {0}; strcpy(req.dbFName, p->dbFName); - buildTableReq(p->pTables, &req.pTables); - taosArrayPush(*pDbs, &req); + int32_t code = buildTableReq(p->pTables, &req.pTables); + if (TSDB_CODE_SUCCESS == code) { + if (NULL == taosArrayPush(*pDbs, &req)) { + code = TSDB_CODE_OUT_OF_MEMORY; + } + } + if (TSDB_CODE_SUCCESS != code) { + taosHashCancelIterate(pDbsHash, p); + taosArrayDestroy(*pDbs); + *pDbs = NULL; + return code; + } p = taosHashIterate(pDbsHash, p); } } @@ -695,7 +736,12 @@ static int32_t buildUserAuthReq(SHashObj* pUserAuthHash, SArray** pUserAuth) { strncpy(key, pKey, len); SUserAuthInfo userAuth = {0}; stringToUserAuth(key, len, &userAuth); - taosArrayPush(*pUserAuth, &userAuth); + if (NULL == taosArrayPush(*pUserAuth, &userAuth)) { + taosHashCancelIterate(pUserAuthHash, p); + taosArrayDestroy(*pUserAuth); + *pUserAuth = NULL; + return TSDB_CODE_OUT_OF_MEMORY; + } p = taosHashIterate(pUserAuthHash, p); } } @@ -714,7 +760,12 @@ static int32_t buildUdfReq(SHashObj* pUdfHash, SArray** pUdf) { char* pFunc = taosHashGetKey(p, &len); char func[TSDB_FUNC_NAME_LEN] = {0}; strncpy(func, pFunc, len); - taosArrayPush(*pUdf, func); + if (NULL == taosArrayPush(*pUdf, func)) { + taosHashCancelIterate(pUdfHash, p); + taosArrayDestroy(*pUdf); + *pUdf = NULL; + return TSDB_CODE_OUT_OF_MEMORY; + } p = taosHashIterate(pUdfHash, p); } } @@ -762,10 +813,11 @@ int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalog return code; } -SNode* createSelectStmtImpl(bool isDistinct, SNodeList* pProjectionList, SNode* pTable, SNodeList* pHint) { - SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); +int32_t createSelectStmtImpl(bool isDistinct, SNodeList* pProjectionList, SNode* pTable, SNodeList* pHint, SNode** ppSelect) { + SSelectStmt* select = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_SELECT_STMT, (SNode**)&select); if (NULL == select) { - return NULL; + return code; } select->isDistinct = isDistinct; select->pProjectionList = pProjectionList; @@ -777,7 +829,8 @@ SNode* createSelectStmtImpl(bool isDistinct, SNodeList* pProjectionList, SNode* select->timeRange = TSWINDOW_INITIALIZER; select->pHint = pHint; select->lastProcessByRowFuncId = -1; - return (SNode*)select; + *ppSelect = (SNode*)select; + return code; } static int32_t putMetaDataToHash(const char* pKey, int32_t len, const SArray* pData, int32_t index, SHashObj** pHash) { @@ -806,7 +859,10 @@ static int32_t putTableDataToCache(const SArray* pTableReq, const SArray* pTable int32_t ntables = taosArrayGetSize(pTableReq); for (int32_t i = 0; i < ntables; ++i) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(taosArrayGet(pTableReq, i), fullName); + int32_t code = tNameExtractFullName(taosArrayGet(pTableReq, i), fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (TSDB_CODE_SUCCESS != putMetaDataToHash(fullName, strlen(fullName), pTableData, i, pTable)) { return TSDB_CODE_OUT_OF_MEMORY; } @@ -834,7 +890,10 @@ static int32_t putDbTableDataToCache(const SArray* pDbReq, const SArray* pTableD int32_t ntables = taosArrayGetSize(pReq->pTables); for (int32_t j = 0; j < ntables; ++j) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(taosArrayGet(pReq->pTables, j), fullName); + int32_t code = tNameExtractFullName(taosArrayGet(pReq->pTables, j), fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (TSDB_CODE_SUCCESS != putMetaDataToHash(fullName, strlen(fullName), pTableData, tableNo, pTable)) { return TSDB_CODE_OUT_OF_MEMORY; } @@ -962,9 +1021,12 @@ int32_t reserveTableMetaInCacheExt(const SName* pName, SParseMetaCache* pMetaCac int32_t getTableMetaFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pName, fullName); + int32_t code = tNameExtractFullName(pName, fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } STableMeta* pTableMeta = NULL; - int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableMeta, (void**)&pTableMeta); + code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableMeta, (void**)&pTableMeta); if (TSDB_CODE_SUCCESS == code) { *pMeta = tableMetaDup(pTableMeta); if (NULL == *pMeta) { @@ -996,9 +1058,12 @@ int32_t buildTableMetaFromViewMeta(STableMeta** pMeta, SViewMeta* pViewMeta) { int32_t getViewMetaFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pName, fullName); + int32_t code = tNameExtractFullName(pName, fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SViewMeta* pViewMeta = NULL; - int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pViews, (void**)&pViewMeta); + code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pViews, (void**)&pViewMeta); if (TSDB_CODE_SUCCESS == code) { code = buildTableMetaFromViewMeta(pMeta, pViewMeta); } @@ -1044,9 +1109,12 @@ int32_t reserveTableVgroupInCacheExt(const SName* pName, SParseMetaCache* pMetaC int32_t getTableVgroupFromCache(SParseMetaCache* pMetaCache, const SName* pName, SVgroupInfo* pVgroup) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pName, fullName); + int32_t code = tNameExtractFullName(pName, fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SVgroupInfo* pVg = NULL; - int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableVgroup, (void**)&pVg); + code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableVgroup, (void**)&pVg); if (TSDB_CODE_SUCCESS == code) { memcpy(pVgroup, pVg, sizeof(SVgroupInfo)); } @@ -1178,9 +1246,10 @@ int32_t reserveTSMAInfoInCache(int32_t acctId, const char* pDb, const char* pTsm int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pName, fullName); + int32_t code = tNameExtractFullName(pName, fullName); + if (TSDB_CODE_SUCCESS != code) return code;; SArray* pSmaIndexes = NULL; - int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableIndex, (void**)&pSmaIndexes); + code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableIndex, (void**)&pSmaIndexes); if (TSDB_CODE_SUCCESS == code && NULL != pSmaIndexes) { *pIndexes = smaIndexesDup(pSmaIndexes); if (NULL == *pIndexes) { @@ -1192,9 +1261,12 @@ int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, int32_t getTableTsmasFromCache(SParseMetaCache* pMetaCache, const SName* pTbName, SArray** pTsmas) { char tbFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pTbName, tbFName); + int32_t code = tNameExtractFullName(pTbName, tbFName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } STableTSMAInfoRsp* pTsmasRsp = NULL; - int32_t code = getMetaDataFromHash(tbFName, strlen(tbFName), pMetaCache->pTableTSMAs, (void**)&pTsmasRsp); + code = getMetaDataFromHash(tbFName, strlen(tbFName), pMetaCache->pTableTSMAs, (void**)&pTsmasRsp); if (TSDB_CODE_SUCCESS == code && pTsmasRsp) { *pTsmas = pTsmasRsp->pTsmas; } @@ -1203,9 +1275,12 @@ int32_t getTableTsmasFromCache(SParseMetaCache* pMetaCache, const SName* pTbName int32_t getTsmaFromCache(SParseMetaCache* pMetaCache, const SName* pTsmaName, STableTSMAInfo** pTsma) { char tsmaFName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pTsmaName, tsmaFName); + int32_t code = tNameExtractFullName(pTsmaName, tsmaFName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } STableTSMAInfoRsp* pTsmaRsp = NULL; - int32_t code = getMetaDataFromHash(tsmaFName, strlen(tsmaFName), pMetaCache->pTSMAs, (void**)&pTsmaRsp); + code = getMetaDataFromHash(tsmaFName, strlen(tsmaFName), pMetaCache->pTSMAs, (void**)&pTsmaRsp); if (TSDB_CODE_SUCCESS == code && pTsmaRsp) { ASSERT(pTsmaRsp->pTsmas->size == 1); *pTsma = taosArrayGetP(pTsmaRsp->pTsmas, 0); @@ -1250,9 +1325,12 @@ STableCfg* tableCfgDup(STableCfg* pCfg) { int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput) { char fullName[TSDB_TABLE_FNAME_LEN]; - tNameExtractFullName(pName, fullName); + int32_t code = tNameExtractFullName(pName, fullName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } STableCfg* pCfg = NULL; - int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableCfg, (void**)&pCfg); + code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableCfg, (void**)&pCfg); if (TSDB_CODE_SUCCESS == code && NULL != pCfg) { *pOutput = tableCfgDup(pCfg); if (NULL == *pOutput) { diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c index 7d042aeddb..e96aaf52ed 100644 --- a/source/libs/parser/src/parser.c +++ b/source/libs/parser/src/parser.c @@ -283,7 +283,7 @@ int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq code = parseQuerySyntax(pCxt, pQuery, pCatalogReq); } } - nodesReleaseAllocator(pCxt->allocatorId); + (void)nodesReleaseAllocator(pCxt->allocatorId); terrno = code; return code; } @@ -298,7 +298,7 @@ int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCata if (TSDB_CODE_SUCCESS == code) { code = analyseSemantic(pCxt, pQuery, &metaCache); } - nodesReleaseAllocator(pCxt->allocatorId); + (void)nodesReleaseAllocator(pCxt->allocatorId); destoryParseMetaCache(&metaCache, false); terrno = code; return code; @@ -410,6 +410,10 @@ int32_t qSetSTableIdForRsma(SNode* pStmt, int64_t uid) { return TSDB_CODE_FAILED; } +int32_t qInitKeywordsTable() { + return taosInitKeywordsTable(); +} + void qCleanupKeywordsTable() { taosCleanupKeywordsTable(); } int32_t qStmtBindParams(SQuery* pQuery, TAOS_MULTI_BIND* pParams, int32_t colIdx) { @@ -429,9 +433,10 @@ int32_t qStmtBindParams(SQuery* pQuery, TAOS_MULTI_BIND* pParams, int32_t colIdx if (TSDB_CODE_SUCCESS == code && (colIdx < 0 || colIdx + 1 == pQuery->placeholderNum)) { nodesDestroyNode(pQuery->pRoot); - pQuery->pRoot = nodesCloneNode(pQuery->pPrepareRoot); + pQuery->pRoot = NULL; + code = nodesCloneNode(pQuery->pPrepareRoot, &pQuery->pRoot); if (NULL == pQuery->pRoot) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } if (TSDB_CODE_SUCCESS == code) { diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp index c0348ab43b..3a364bf8c0 100644 --- a/source/libs/parser/test/mockCatalogService.cpp +++ b/source/libs/parser/test/mockCatalogService.cpp @@ -46,12 +46,12 @@ class TableBuilder : public ITableBuilder { schema()->vgId = vgid; SVgroupInfo vgroup = {vgid, 0, 0, {0}, 0}; - addEpIntoEpSet(&vgroup.epSet, "dnode_1", 6030); - addEpIntoEpSet(&vgroup.epSet, "dnode_2", 6030); - addEpIntoEpSet(&vgroup.epSet, "dnode_3", 6030); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(&vgroup.epSet, "dnode_1", 6030)); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(&vgroup.epSet, "dnode_2", 6030)); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(&vgroup.epSet, "dnode_3", 6030)); vgroup.epSet.inUse = 0; - meta_->vgs.emplace_back(vgroup); + (void)meta_->vgs.emplace_back(vgroup); return *this; } @@ -117,7 +117,7 @@ class MockCatalogServiceImpl { std::unique_ptr table; char db[TSDB_DB_NAME_LEN] = {0}; - tNameGetDbName(pTableName, db); + (void)tNameGetDbName(pTableName, db); const char* tname = tNameGetTableName(pTableName); int32_t code = copyTableSchemaMeta(db, tname, &table); @@ -140,7 +140,7 @@ class MockCatalogServiceImpl { int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** vgList) const { char db[TSDB_DB_NAME_LEN] = {0}; - tNameGetDbName(pTableName, db); + (void)tNameGetDbName(pTableName, db); return copyTableVgroup(db, tNameGetTableName(pTableName), vgList); } @@ -174,7 +174,10 @@ class MockCatalogServiceImpl { int32_t catalogGetTableIndex(const SName* pTableName, SArray** pIndexes) const { char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - tNameExtractFullName(pTableName, tbFName); + int32_t code = tNameExtractFullName(pTableName, tbFName); + if (TSDB_CODE_SUCCESS != code) { + return code; + } auto it = index_.find(tbFName); if (index_.end() == it) { return TSDB_CODE_SUCCESS; @@ -183,15 +186,26 @@ class MockCatalogServiceImpl { for (const auto& index : it->second) { STableIndexInfo info; - taosArrayPush(*pIndexes, copyTableIndexInfo(&info, &index)); + if (nullptr == taosArrayPush(*pIndexes, copyTableIndexInfo(&info, &index))) { + taosArrayDestroy(*pIndexes); + *pIndexes = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } return TSDB_CODE_SUCCESS; } int32_t catalogGetDnodeList(SArray** pDnodes) const { *pDnodes = taosArrayInit(dnode_.size(), sizeof(SEpSet)); + if (!pDnodes) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (const auto& dnode : dnode_) { - taosArrayPush(*pDnodes, &dnode.second); + if (nullptr == taosArrayPush(*pDnodes, &dnode.second)) { + taosArrayDestroy(*pDnodes); + *pDnodes = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } return TSDB_CODE_SUCCESS; } @@ -252,9 +266,9 @@ class MockCatalogServiceImpl { SVgroupInfo vgroup = {vgid, 0, 0, {0}, 0}; genEpSet(&vgroup.epSet); - meta_[db][tbname]->vgs.emplace_back(vgroup); + (void)meta_[db][tbname]->vgs.emplace_back(vgroup); // super table - meta_[db][stbname]->vgs.emplace_back(vgroup); + (void)meta_[db][stbname]->vgs.emplace_back(vgroup); } void showTables() const { @@ -345,7 +359,7 @@ class MockCatalogServiceImpl { void createDnode(int32_t dnodeId, const string& host, int16_t port) { SEpSet epSet = {0}; - addEpIntoEpSet(&epSet, host.c_str(), port); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(&epSet, host.c_str(), port)); dnode_.insert(std::make_pair(dnodeId, epSet)); } @@ -370,9 +384,9 @@ class MockCatalogServiceImpl { uint64_t getNextId() { return id_++; } void genEpSet(SEpSet* pEpSet) { - addEpIntoEpSet(pEpSet, "dnode_1", 6030); - addEpIntoEpSet(pEpSet, "dnode_2", 6030); - addEpIntoEpSet(pEpSet, "dnode_3", 6030); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(pEpSet, "dnode_1", 6030)); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(pEpSet, "dnode_2", 6030)); + assert(TSDB_CODE_SUCCESS == addEpIntoEpSet(pEpSet, "dnode_3", 6030)); pEpSet->inUse = 0; } @@ -456,8 +470,15 @@ class MockCatalogServiceImpl { return TSDB_CODE_SUCCESS; } *vgList = taosArrayInit(table->vgs.size(), sizeof(SVgroupInfo)); + if (!*vgList) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (const SVgroupInfo& vg : table->vgs) { - taosArrayPush(*vgList, &vg); + if (nullptr == taosArrayPush(*vgList, &vg)) { + taosArrayDestroy(*vgList); + *vgList = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } return TSDB_CODE_SUCCESS; } @@ -478,13 +499,21 @@ class MockCatalogServiceImpl { if (NULL != pTableMetaReq) { int32_t ndbs = taosArrayGetSize(pTableMetaReq); *pTableMetaData = taosArrayInit(ndbs, sizeof(SMetaRes)); + if (!*pTableMetaData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < ndbs; ++i) { STablesReq* pReq = (STablesReq*)taosArrayGet(pTableMetaReq, i); int32_t ntables = taosArrayGetSize(pReq->pTables); for (int32_t j = 0; j < ntables; ++j) { SMetaRes res = {0}; res.code = catalogGetTableMeta((const SName*)taosArrayGet(pReq->pTables, j), (STableMeta**)&res.pRes); - taosArrayPush(*pTableMetaData, &res); + if (nullptr == taosArrayPush(*pTableMetaData, &res)) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pTableMetaData, MockCatalogService::destoryMetaRes); + *pTableMetaData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } } @@ -495,14 +524,27 @@ class MockCatalogServiceImpl { if (NULL != pTableVgroupReq) { int32_t ndbs = taosArrayGetSize(pTableVgroupReq); *pTableVgroupData = taosArrayInit(ndbs, sizeof(SMetaRes)); + if (!*pTableVgroupData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < ndbs; ++i) { STablesReq* pReq = (STablesReq*)taosArrayGet(pTableVgroupReq, i); int32_t ntables = taosArrayGetSize(pReq->pTables); for (int32_t j = 0; j < ntables; ++j) { SMetaRes res = {0}; res.pRes = taosMemoryCalloc(1, sizeof(SVgroupInfo)); + if (!res.pRes) { + taosArrayDestroyEx(*pTableVgroupData, MockCatalogService::destoryMetaRes); + *pTableVgroupData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } res.code = catalogGetTableHashVgroup((const SName*)taosArrayGet(pReq->pTables, j), (SVgroupInfo*)res.pRes); - taosArrayPush(*pTableVgroupData, &res); + if (nullptr == taosArrayPush(*pTableVgroupData, &res)) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pTableVgroupData, MockCatalogService::destoryMetaRes); + *pTableVgroupData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } } @@ -514,9 +556,16 @@ class MockCatalogServiceImpl { if (NULL != pDbVgroupReq) { int32_t ndbs = taosArrayGetSize(pDbVgroupReq); *pDbVgroupData = taosArrayInit(ndbs, sizeof(SMetaRes)); + if (!*pDbVgroupData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < ndbs; ++i) { SMetaRes res = {0}; - taosArrayPush(*pDbVgroupData, &res); + if (nullptr == taosArrayPush(*pDbVgroupData, &res)) { + taosArrayDestroyEx(*pDbVgroupData, MockCatalogService::destoryMetaRes); + *pDbVgroupData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return code; @@ -529,11 +578,17 @@ class MockCatalogServiceImpl { } std::set vgSet; *pVgList = taosArrayInit(it->second.size(), sizeof(SVgroupInfo)); + if (!*pVgList) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (const auto& vgs : it->second) { for (const auto& vg : vgs.second->vgs) { if (0 == vgSet.count(vg.vgId)) { - taosArrayPush(*pVgList, &vg); - vgSet.insert(vg.vgId); + if (nullptr == taosArrayPush(*pVgList, &vg)) { + taosArrayDestroy(*pVgList); + return TSDB_CODE_OUT_OF_MEMORY; + } + (void)vgSet.insert(vg.vgId); } } } @@ -543,12 +598,18 @@ class MockCatalogServiceImpl { int32_t catalogGetAllDBVgList(SArray** pVgList) const { std::set vgSet; *pVgList = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVgroupInfo)); + if (!*pVgList) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (const auto& db : meta_) { for (const auto& vgs : db.second) { for (const auto& vg : vgs.second->vgs) { if (0 == vgSet.count(vg.vgId)) { - taosArrayPush(*pVgList, &vg); - vgSet.insert(vg.vgId); + if (nullptr == taosArrayPush(*pVgList, &vg)) { + taosArrayDestroy(*pVgList); + return TSDB_CODE_OUT_OF_MEMORY; + } + (void)vgSet.insert(vg.vgId); } } } @@ -561,11 +622,24 @@ class MockCatalogServiceImpl { if (NULL != pDbCfgReq) { int32_t ndbs = taosArrayGetSize(pDbCfgReq); *pDbCfgData = taosArrayInit(ndbs, sizeof(SMetaRes)); + if (!*pDbCfgData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < ndbs; ++i) { SMetaRes res = {0}; res.pRes = taosMemoryCalloc(1, sizeof(SDbCfgInfo)); + if (!res.pRes) { + taosArrayDestroyEx(*pDbCfgData, MockCatalogService::destoryMetaRes); + *pDbCfgData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } res.code = catalogGetDBCfg((const char*)taosArrayGet(pDbCfgReq, i), (SDbCfgInfo*)res.pRes); - taosArrayPush(*pDbCfgData, &res); + if (nullptr == taosArrayPush(*pDbCfgData, &res)) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pDbCfgData, MockCatalogService::destoryMetaRes); + *pDbCfgData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return code; @@ -576,10 +650,18 @@ class MockCatalogServiceImpl { if (NULL != pDbInfoReq) { int32_t ndbs = taosArrayGetSize(pDbInfoReq); *pDbInfoData = taosArrayInit(ndbs, sizeof(SMetaRes)); + if (!*pDbInfoData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < ndbs; ++i) { SMetaRes res = {0}; res.pRes = taosMemoryCalloc(1, sizeof(SDbInfo)); - taosArrayPush(*pDbInfoData, &res); + if (!res.pRes || (nullptr == taosArrayPush(*pDbInfoData, &res))) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pDbInfoData, MockCatalogService::destoryMetaRes); + *pDbInfoData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return code; @@ -590,11 +672,25 @@ class MockCatalogServiceImpl { if (NULL != pUserAuthReq) { int32_t num = taosArrayGetSize(pUserAuthReq); *pUserAuthData = taosArrayInit(num, sizeof(SMetaRes)); + if (!*pUserAuthData) { + return TSDB_CODE_OUT_OF_MEMORY; + } + int32_t code = TSDB_CODE_SUCCESS; for (int32_t i = 0; i < num; ++i) { SMetaRes res = {0}; res.pRes = taosMemoryCalloc(1, sizeof(SUserAuthRes)); + if (!res.pRes) { + taosArrayDestroy(*pUserAuthData); + *pUserAuthData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } ((SUserAuthRes*)res.pRes)->pass[0] = true; - taosArrayPush(*pUserAuthData, &res); + if (nullptr == taosArrayPush(*pUserAuthData, &res)) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pUserAuthData, MockCatalogService::destoryMetaRes); + *pUserAuthData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return code; @@ -604,11 +700,24 @@ class MockCatalogServiceImpl { if (NULL != pUdfReq) { int32_t num = taosArrayGetSize(pUdfReq); *pUdfData = taosArrayInit(num, sizeof(SMetaRes)); + if (!*pUdfData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < num; ++i) { SMetaRes res = {0}; res.pRes = taosMemoryCalloc(1, sizeof(SFuncInfo)); + if (!res.pRes) { + taosArrayDestroyEx(*pUdfData, MockCatalogService::destoryMetaRes); + *pUdfData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } res.code = catalogGetUdfInfo((char*)taosArrayGet(pUdfReq, i), (SFuncInfo*)res.pRes); - taosArrayPush(*pUdfData, &res); + if (nullptr == taosArrayPush(*pUdfData, &res)) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pUdfData, MockCatalogService::destoryMetaRes); + *pUdfData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return TSDB_CODE_SUCCESS; @@ -618,10 +727,18 @@ class MockCatalogServiceImpl { if (NULL != pTableIndex) { int32_t num = taosArrayGetSize(pTableIndex); *pTableIndexData = taosArrayInit(num, sizeof(SMetaRes)); + if (!*pTableIndexData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < num; ++i) { SMetaRes res = {0}; res.code = catalogGetTableIndex((const SName*)taosArrayGet(pTableIndex, i), (SArray**)(&res.pRes)); - taosArrayPush(*pTableIndexData, &res); + if (nullptr == taosArrayPush(*pTableIndexData, &res)) { + MockCatalogService::destoryMetaRes(&res); + taosArrayDestroyEx(*pTableIndexData, MockCatalogService::destoryMetaRes); + *pTableIndexData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return TSDB_CODE_SUCCESS; @@ -631,11 +748,20 @@ class MockCatalogServiceImpl { if (NULL != pTableCfgReq) { int32_t ntables = taosArrayGetSize(pTableCfgReq); *pTableCfgData = taosArrayInit(ntables, sizeof(SMetaRes)); + if (!*pTableCfgData) { + return TSDB_CODE_OUT_OF_MEMORY; + } + int32_t code = 0; for (int32_t i = 0; i < ntables; ++i) { SMetaRes res = {0}; - res.pRes = taosMemoryCalloc(1, sizeof(STableCfg)); res.code = TSDB_CODE_SUCCESS; - taosArrayPush(*pTableCfgData, &res); + res.pRes = taosMemoryCalloc(1, sizeof(STableCfg)); + if (!res.pRes || (nullptr == taosArrayPush(*pTableCfgData, &res))) { + taosMemoryFree(res.pRes); + taosArrayDestroy(*pTableCfgData); + *pTableCfgData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return TSDB_CODE_SUCCESS; @@ -645,11 +771,18 @@ class MockCatalogServiceImpl { if (NULL != pViewMetaReq) { int32_t nviews = taosArrayGetSize(pViewMetaReq); *pViewMetaData = taosArrayInit(nviews, sizeof(SMetaRes)); + if (!*pViewMetaData) { + return TSDB_CODE_OUT_OF_MEMORY; + } for (int32_t i = 0; i < nviews; ++i) { SMetaRes res = {0}; - res.pRes = NULL; + res.pRes = nullptr; res.code = TSDB_CODE_PAR_TABLE_NOT_EXIST; - taosArrayPush(*pViewMetaData, &res); + if (nullptr == taosArrayPush(*pViewMetaData, &res)) { + taosArrayDestroyEx(*pViewMetaData, MockCatalogService::destoryMetaRes); + *pViewMetaData = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } } } return TSDB_CODE_SUCCESS; @@ -657,9 +790,20 @@ class MockCatalogServiceImpl { int32_t getAllDnodeList(SArray** pDnodes) const { SMetaRes res = {0}; - catalogGetDnodeList((SArray**)&res.pRes); + int32_t code = catalogGetDnodeList((SArray**)&res.pRes); + if (TSDB_CODE_SUCCESS != code) { + return code; + } *pDnodes = taosArrayInit(1, sizeof(SMetaRes)); - taosArrayPush(*pDnodes, &res); + if (!*pDnodes) { + return TSDB_CODE_OUT_OF_MEMORY; + } + if (nullptr == taosArrayPush(*pDnodes, &res)) { + MockCatalogService::destoryMetaArrayRes(&res); + taosArrayDestroyEx(*pDnodes, MockCatalogService::destoryMetaArrayRes); + *pDnodes = nullptr; + return TSDB_CODE_OUT_OF_MEMORY; + } return TSDB_CODE_SUCCESS; } diff --git a/source/libs/parser/test/parAlterToBalanceTest.cpp b/source/libs/parser/test/parAlterToBalanceTest.cpp index 4e7325c9b2..d25435913f 100644 --- a/source/libs/parser/test/parAlterToBalanceTest.cpp +++ b/source/libs/parser/test/parAlterToBalanceTest.cpp @@ -358,9 +358,9 @@ TEST_F(ParserInitialATest, alterLocal) { }; auto setAlterLocal = [&](const char* pConfig, const char* pValue = nullptr) { - expect.first.assign(pConfig); + (void)expect.first.assign(pConfig); if (nullptr != pValue) { - expect.second.assign(pValue); + (void)expect.second.assign(pValue); } }; @@ -429,9 +429,10 @@ TEST_F(ParserInitialATest, alterSTable) { expect.numOfFields = numOfFields; if (NULL == expect.pFields) { expect.pFields = taosArrayInit(2, sizeof(TAOS_FIELD)); + ASSERT_TRUE(expect.pFields); TAOS_FIELD field = {0}; - taosArrayPush(expect.pFields, &field); - taosArrayPush(expect.pFields, &field); + ASSERT_TRUE(nullptr != taosArrayPush(expect.pFields, &field)); + ASSERT_TRUE(nullptr != taosArrayPush(expect.pFields, &field)); } TAOS_FIELD* pField = (TAOS_FIELD*)taosArrayGet(expect.pFields, 0); @@ -706,9 +707,10 @@ TEST_F(ParserInitialATest, alterTable) { expect.numOfFields = numOfFields; if (NULL == expect.pFields) { expect.pFields = taosArrayInit(2, sizeof(TAOS_FIELD)); + ASSERT_TRUE(expect.pFields); TAOS_FIELD field = {0}; - taosArrayPush(expect.pFields, &field); - taosArrayPush(expect.pFields, &field); + ASSERT_TRUE(nullptr != taosArrayPush(expect.pFields, &field)); + ASSERT_TRUE(nullptr != taosArrayPush(expect.pFields, &field)); } TAOS_FIELD* pField = (TAOS_FIELD*)taosArrayGet(expect.pFields, 0); diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index 1a3559316c..3422ebe028 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -192,8 +192,9 @@ TEST_F(ParserInitialCTest, createDatabase) { retention.keepUnit = keepUnit; if (NULL == expect.pRetensions) { expect.pRetensions = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SRetention)); + ASSERT_TRUE(expect.pRetensions); } - taosArrayPush(expect.pRetensions, &retention); + ASSERT_TRUE(taosArrayPush(expect.pRetensions, &retention) != nullptr); ++expect.numOfRetensions; }; auto setDbSchemaless = [&](int8_t schemaless) { expect.schemaless = schemaless; }; @@ -449,7 +450,7 @@ TEST_F(ParserInitialCTest, createFunction) { file << 123 << "abc" << '\n'; file.close(); } - ~udfFile() { remove(path_.c_str()); } + ~udfFile() { assert(0 == remove(path_.c_str())); } std::string path_; } udffile("udf"); @@ -506,7 +507,7 @@ TEST_F(ParserInitialCTest, createView) { if (NULL == expect.pTags) { expect.pTags = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SField)); } - taosArrayPush(expect.pTags, &field); + ASSERT_TRUE(nullptr != taosArrayPush(expect.pTags, &field)); expect.numOfTags += 1; }; @@ -684,7 +685,7 @@ TEST_F(ParserInitialCTest, createSmaIndex) { pCmdMsg->msgLen = tSerializeSMCreateSmaReq(NULL, 0, pStmt->pReq); pCmdMsg->pMsg = taosMemoryMalloc(pCmdMsg->msgLen); if (!pCmdMsg->pMsg) FAIL(); - tSerializeSMCreateSmaReq(pCmdMsg->pMsg, pCmdMsg->msgLen, pStmt->pReq); + ASSERT_TRUE(0 < tSerializeSMCreateSmaReq(pCmdMsg->pMsg, pCmdMsg->msgLen, pStmt->pReq)); ((SQuery*)pQuery)->pCmdMsg = pCmdMsg; ASSERT_TRUE(TSDB_CODE_SUCCESS == tDeserializeSMCreateSmaReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req)); @@ -797,13 +798,13 @@ TEST_F(ParserInitialCTest, createStable) { if (NULL == expect.pColumns) { expect.pColumns = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SField)); } - taosArrayPush(expect.pColumns, &field); + ASSERT_TRUE(nullptr != taosArrayPush(expect.pColumns, &field)); expect.numOfColumns += 1; } else { if (NULL == expect.pTags) { expect.pTags = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SField)); } - taosArrayPush(expect.pTags, &field); + ASSERT_TRUE(taosArrayPush(expect.pTags, &field) != nullptr); expect.numOfTags += 1; } }; @@ -983,7 +984,7 @@ TEST_F(ParserInitialCTest, createStream) { if (NULL == expect.pTags) { expect.pTags = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SField)); } - taosArrayPush(expect.pTags, &field); + ASSERT_TRUE(taosArrayPush(expect.pTags, &field) != nullptr); expect.numOfTags += 1; }; @@ -1123,8 +1124,9 @@ TEST_F(ParserInitialCTest, createTable) { ++expect.nReqs; if (nullptr == expect.pArray) { expect.pArray = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SVCreateTbReq)); + ASSERT_TRUE(expect.pArray != nullptr); } - taosArrayPush(expect.pArray, &req); + ASSERT_TRUE(taosArrayPush(expect.pArray, &req) != nullptr); }; setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) { @@ -1200,11 +1202,11 @@ TEST_F(ParserInitialCTest, createTableSemanticCheck) { string sql = "CREATE TABLE st1(ts TIMESTAMP, "; for (int32_t i = 1; i < 4096; ++i) { if (i > 1) { - sql.append(", "); + (void)sql.append(", "); } - sql.append("c" + to_string(i) + " INT"); + (void)sql.append("c" + to_string(i) + " INT"); } - sql.append(") TAGS (t1 int)"); + (void)sql.append(") TAGS (t1 int)"); run(sql, TSDB_CODE_PAR_TOO_MANY_COLUMNS); } diff --git a/source/libs/parser/test/parTestMain.cpp b/source/libs/parser/test/parTestMain.cpp index c8925b3df7..87ecf34ebc 100644 --- a/source/libs/parser/test/parTestMain.cpp +++ b/source/libs/parser/test/parTestMain.cpp @@ -35,8 +35,7 @@ namespace ParserTest { class ParserEnv : public testing::Environment { public: virtual void SetUp() { - // TODO(smj) : How to handle return value of fmFuncMgtInit - (void)fmFuncMgtInit(); + ASSERT_EQ(TSDB_CODE_SUCCESS, fmFuncMgtInit()); initMetaDataEnv(); generateMetaData(); initLog(TD_TMP_DIR_PATH "td"); @@ -71,7 +70,7 @@ class ParserEnv : public testing::Environment { tsAsyncLog = 0; taosRemoveDir(path); - taosMkDir(path); + ASSERT_EQ(TSDB_CODE_SUCCESS, taosMkDir(path)); tstrncpy(tsLogDir, path, PATH_MAX); if (taosInitLog("taoslog", 1) != 0) { std::cout << "failed to init log file" << std::endl; @@ -118,7 +117,7 @@ static void parseArg(int argc, char* argv[]) { } // namespace ParserTest int main(int argc, char* argv[]) { - testing::AddGlobalTestEnvironment(new ParserTest::ParserEnv()); + (void)testing::AddGlobalTestEnvironment(new ParserTest::ParserEnv()); testing::InitGoogleTest(&argc, argv); ParserTest::parseArg(argc, argv); return RUN_ALL_TESTS(); diff --git a/source/libs/parser/test/parTestUtil.cpp b/source/libs/parser/test/parTestUtil.cpp index dfe9fcf96e..5ca2cea409 100644 --- a/source/libs/parser/test/parTestUtil.cpp +++ b/source/libs/parser/test/parTestUtil.cpp @@ -66,6 +66,7 @@ int32_t getLogLevel() { return g_logLevel; } class ParserTestBaseImpl { public: ParserTestBaseImpl(ParserTestBase* pBase) : pBase_(pBase), sqlNo_(0), sqlNum_(0) { + assert(TSDB_CODE_SUCCESS == qInitKeywordsTable()); caseEnv_.numOfSkipSql_ = g_skipSql; caseEnv_.numOfLimitSql_ = g_limitSql; } @@ -216,7 +217,7 @@ class ParserTestBaseImpl { void setParseContext(const string& sql, SParseContext* pCxt, bool async = false) { stmtEnv_.sql_ = sql; - strtolower((char*)stmtEnv_.sql_.c_str(), sql.c_str()); + (void)strtolower((char*)stmtEnv_.sql_.c_str(), sql.c_str()); pCxt->acctId = atoi(caseEnv_.acctId_.c_str()); pCxt->db = caseEnv_.db_.c_str(); diff --git a/source/libs/planner/inc/planInt.h b/source/libs/planner/inc/planInt.h index 79cf87d941..090071ee7f 100644 --- a/source/libs/planner/inc/planInt.h +++ b/source/libs/planner/inc/planInt.h @@ -65,7 +65,7 @@ int32_t tagScanSetExecutionMode(SScanLogicNode* pScan); #define CLONE_LIMIT 1 #define CLONE_SLIMIT 1 << 1 #define CLONE_LIMIT_SLIMIT (CLONE_LIMIT | CLONE_SLIMIT) -bool cloneLimit(SLogicNode* pParent, SLogicNode* pChild, uint8_t cloneWhat); +int32_t cloneLimit(SLogicNode* pParent, SLogicNode* pChild, uint8_t cloneWhat, bool* pCloned); int32_t sortPriKeyOptGetSequencingNodesImpl(SLogicNode* pNode, bool groupSort, SSortLogicNode* pSort, bool* pNotOptimize, SNodeList** pSequencingNodes, bool* keepSort); diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c index cee765ff94..d5ee5c51df 100644 --- a/source/libs/planner/src/planLogicCreater.c +++ b/source/libs/planner/src/planLogicCreater.c @@ -112,7 +112,8 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) { pExpr = nodesListGetNode(((SGroupingSetNode*)pExpr)->pParameterList, 0); } if (nodesEqualNode(pExpr, *pNode)) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { return DEAL_RES_ERROR; } @@ -177,7 +178,11 @@ static int32_t cloneRewriteExprs(SNodeList* pExprs, bool* pOutputs, SNodeList** SNode* pExpr = NULL; FOREACH(pExpr, pExprs) { if (pOutputs[index]) { - code = nodesListMakeStrictAppend(pRewriteExpr, nodesCloneNode(pExpr)); + SNode* pNew = NULL; + code = nodesCloneNode(pExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(pRewriteExpr, pNew); + } if (TSDB_CODE_SUCCESS != code) { NODES_DESTORY_LIST(*pRewriteExpr); break; @@ -223,9 +228,9 @@ static int32_t rewriteExprs(SNodeList* pExprs, SNodeList* pTarget) { static int32_t pushLogicNode(SLogicPlanContext* pCxt, SLogicNode** pOldRoot, SLogicNode* pNewRoot) { if (NULL == pNewRoot->pChildren) { - pNewRoot->pChildren = nodesMakeList(); + int32_t code = nodesMakeList(&pNewRoot->pChildren); if (NULL == pNewRoot->pChildren) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } if (TSDB_CODE_SUCCESS != nodesListAppend(pNewRoot->pChildren, (SNode*)*pOldRoot)) { @@ -289,7 +294,8 @@ static bool hasPkInTable(const STableMeta* pTableMeta) { } static SNode* createFirstCol(SRealTableNode* pTable, const SSchema* pSchema) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + terrno = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { return NULL; } @@ -360,9 +366,10 @@ static int32_t addDefaultScanCol(SRealTableNode* pTable, SNodeList** pCols) { static int32_t makeScanLogicNode(SLogicPlanContext* pCxt, SRealTableNode* pRealTable, bool hasRepeatScanFuncs, SLogicNode** pLogicNode) { - SScanLogicNode* pScan = (SScanLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SCAN); + SScanLogicNode* pScan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SCAN, (SNode**)&pScan); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } TSWAP(pScan->pVgroupList, pRealTable->pVgroupList); @@ -448,17 +455,11 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pTags && NULL == pSelect->pPartitionByList) { - pScan->pTags = nodesCloneList(pSelect->pTags); - if (NULL == pScan->pTags) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneList(pSelect->pTags, &pScan->pTags); } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pSubtable && NULL == pSelect->pPartitionByList) { - pScan->pSubtable = nodesCloneNode(pSelect->pSubtable); - if (NULL == pScan->pSubtable) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneNode(pSelect->pSubtable, &pScan->pSubtable); } // set output @@ -505,10 +506,17 @@ static int32_t createSubqueryLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSe int32_t collectJoinResColumns(SSelectStmt* pSelect, SJoinLogicNode* pJoin, SNodeList** pCols) { SSHashObj* pTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pTables); - - int32_t code = nodesCollectColumnsExt(pSelect, SQL_CLAUSE_WHERE, pTables, COLLECT_COL_TYPE_ALL, pCols); + int32_t code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pTables); + return code; + } else { + code = nodesCollectColumnsExt(pSelect, SQL_CLAUSE_WHERE, pTables, COLLECT_COL_TYPE_ALL, pCols); + } tSimpleHashCleanup(pTables); @@ -518,9 +526,10 @@ int32_t collectJoinResColumns(SSelectStmt* pSelect, SJoinLogicNode* pJoin, SNode static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SJoinTableNode* pJoinTable, SLogicNode** pLogicNode) { int32_t code = TSDB_CODE_SUCCESS; - SJoinLogicNode* pJoin = (SJoinLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_JOIN); + SJoinLogicNode* pJoin = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_JOIN, (SNode**)&pJoin); if (NULL == pJoin) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pJoin->joinType = pJoinTable->joinType; @@ -535,15 +544,17 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect pJoin->node.requireDataOrder = pJoin->hashJoinHint ? DATA_ORDER_LEVEL_NONE : DATA_ORDER_LEVEL_GLOBAL; pJoin->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; pJoin->isLowLevelJoin = pJoinTable->isLowLevelJoin; - pJoin->pWindowOffset = nodesCloneNode(pJoinTable->pWindowOffset); - pJoin->pJLimit = nodesCloneNode(pJoinTable->pJLimit); - pJoin->addPrimEqCond = nodesCloneNode(pJoinTable->addPrimCond); - pJoin->node.pChildren = nodesMakeList(); - pJoin->seqWinGroup = (JOIN_STYPE_WIN == pJoinTable->subType) && (pSelect->hasAggFuncs || pSelect->hasIndefiniteRowsFunc); - - if (NULL == pJoin->node.pChildren) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = nodesCloneNode(pJoinTable->pWindowOffset, &pJoin->pWindowOffset); + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pJoinTable->pJLimit, &pJoin->pJLimit); } + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pJoinTable->addPrimCond, &pJoin->addPrimEqCond); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesMakeList(&pJoin->node.pChildren); + } + pJoin->seqWinGroup = (JOIN_STYPE_WIN == pJoinTable->subType) && (pSelect->hasAggFuncs || pSelect->hasIndefiniteRowsFunc); SLogicNode* pLeft = NULL; if (TSDB_CODE_SUCCESS == code) { @@ -566,10 +577,7 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect // set on conditions if (TSDB_CODE_SUCCESS == code && NULL != pJoinTable->pOnCond) { - pJoin->pFullOnCond = nodesCloneNode(pJoinTable->pOnCond); - if (NULL == pJoin->pFullOnCond) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneNode(pJoinTable->pOnCond, &pJoin->pFullOnCond); } #if 0 @@ -631,10 +639,7 @@ static int32_t createJoinLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect } if (NULL == pJoin->node.pTargets && NULL != pLeft) { - pJoin->node.pTargets = nodesCloneList(pLeft->pTargets); - if (NULL == pJoin->node.pTargets) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneList(pLeft->pTargets, &pJoin->node.pTargets); } #endif @@ -669,10 +674,11 @@ static int32_t createLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSel SLogicNode* pNode = NULL; int32_t code = doCreateLogicNodeByTable(pCxt, pSelect, pTable, &pNode); if (TSDB_CODE_SUCCESS == code) { - pNode->pConditions = nodesCloneNode(pSelect->pWhere); + pNode->pConditions = NULL; + code = nodesCloneNode(pSelect->pWhere, &pNode->pConditions); if (NULL != pSelect->pWhere && NULL == pNode->pConditions) { nodesDestroyNode((SNode*)pNode); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pNode->precision = pSelect->precision; *pLogicNode = pNode; @@ -682,7 +688,8 @@ static int32_t createLogicNodeByTable(SLogicPlanContext* pCxt, SSelectStmt* pSel } static SColumnNode* createColumnByExpr(const char* pStmtName, SExprNode* pExpr) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + terrno = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { return NULL; } @@ -694,17 +701,24 @@ static SColumnNode* createColumnByExpr(const char* pStmtName, SExprNode* pExpr) return pCol; } -static SNode* createGroupingSetNode(SNode* pExpr) { - SGroupingSetNode* pGroupingSet = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET); +static int32_t createGroupingSetNode(SNode* pExpr, SNode** ppNode) { + SGroupingSetNode* pGroupingSet = NULL; + int32_t code = 0; + *ppNode = NULL; + code = nodesMakeNode(QUERY_NODE_GROUPING_SET, (SNode**)&pGroupingSet); if (NULL == pGroupingSet) { - return NULL; + return code; } pGroupingSet->groupingSetType = GP_TYPE_NORMAL; - if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pGroupingSet->pParameterList, nodesCloneNode(pExpr))) { - nodesDestroyNode((SNode*)pGroupingSet); - return NULL; + SNode* pNew = NULL; + code = nodesCloneNode(pExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pGroupingSet->pParameterList, pNew); } - return (SNode*)pGroupingSet; + if (TSDB_CODE_SUCCESS == code) { + *ppNode = (SNode*)pGroupingSet; + } + return code; } static EGroupAction getDistinctGroupAction(SLogicPlanContext* pCxt, SSelectStmt* pSelect) { @@ -727,7 +741,14 @@ static EDataOrderLevel getRequireDataOrder(bool needTimeline, SSelectStmt* pSele } static int32_t addWinJoinPrimKeyToAggFuncs(SSelectStmt* pSelect, SNodeList** pList) { - SNodeList* pTargets = (NULL == *pList) ? nodesMakeList() : *pList; + SNodeList* pTargets = *pList; + int32_t code = 0; + if (pTargets) { + code = nodesMakeList(&pTargets); + } + if (TSDB_CODE_SUCCESS != code) { + return code; + } SJoinTableNode* pJoinTable = (SJoinTableNode*)pSelect->pFromTable; SRealTableNode* pProbeTable = NULL; switch (pJoinTable->joinType) { @@ -742,10 +763,11 @@ static int32_t addWinJoinPrimKeyToAggFuncs(SSelectStmt* pSelect, SNodeList** pLi return TSDB_CODE_PLAN_INTERNAL_ERROR; } - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { if (!*pList) nodesDestroyList(pTargets); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SSchema* pColSchema = &pProbeTable->pMeta->schema[0]; @@ -765,10 +787,17 @@ static int32_t addWinJoinPrimKeyToAggFuncs(SSelectStmt* pSelect, SNodeList** pLi pCol->node.resType.precision = pProbeTable->pMeta->tableInfo.precision; SNode* pFunc = (SNode*)createGroupKeyAggFunc(pCol); + if (!pFunc) { + nodesDestroyList(pTargets); + return terrno; + } - nodesListAppend(pTargets, pFunc); + code = nodesListStrictAppend(pTargets, pFunc); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pTargets); + } - return TSDB_CODE_SUCCESS; + return code; } static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) { @@ -776,9 +805,10 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, return TSDB_CODE_SUCCESS; } - SAggLogicNode* pAgg = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); + SAggLogicNode* pAgg = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG, (SNode**)&pAgg); if (NULL == pAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } bool winJoin = isWindowJoinStmt(pSelect); @@ -792,8 +822,6 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, pAgg->node.resultDataOrder = pAgg->onlyHasKeepOrderFunc ? pAgg->node.requireDataOrder : DATA_ORDER_LEVEL_NONE; pAgg->node.forceCreateNonBlockingOptr = winJoin ? true : false; - int32_t code = TSDB_CODE_SUCCESS; - // set grouyp keys, agg funcs and having conditions if (TSDB_CODE_SUCCESS == code) { code = nodesCollectFuncs(pSelect, SQL_CLAUSE_GROUP_BY, NULL, fmIsAggFunc, &pAgg->pAggFuncs); @@ -805,10 +833,8 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, } if (NULL != pSelect->pGroupByList) { - pAgg->pGroupKeys = nodesCloneList(pSelect->pGroupByList); - if (NULL == pAgg->pGroupKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pAgg->pGroupKeys = NULL; + code = nodesCloneList(pSelect->pGroupByList, &pAgg->pGroupKeys); } // rewrite the expression in subsequent clauses @@ -818,10 +844,8 @@ static int32_t createAggLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pHaving) { - pAgg->node.pConditions = nodesCloneNode(pSelect->pHaving); - if (NULL == pAgg->node.pConditions) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pAgg->node.pConditions = NULL; + code = nodesCloneNode(pSelect->pHaving, &pAgg->node.pConditions); } // set the output @@ -857,10 +881,10 @@ static int32_t createIndefRowsFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt return TSDB_CODE_SUCCESS; } - SIndefRowsFuncLogicNode* pIdfRowsFunc = - (SIndefRowsFuncLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC); + SIndefRowsFuncLogicNode* pIdfRowsFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC, (SNode**)&pIdfRowsFunc); if (NULL == pIdfRowsFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pIdfRowsFunc->isTailFunc = pSelect->hasTailFunc; @@ -871,7 +895,7 @@ static int32_t createIndefRowsFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt pIdfRowsFunc->node.resultDataOrder = pIdfRowsFunc->node.requireDataOrder; // indefinite rows functions and _select_values functions - int32_t code = nodesCollectFuncs(pSelect, SQL_CLAUSE_SELECT, NULL, fmIsVectorFunc, &pIdfRowsFunc->pFuncs); + code = nodesCollectFuncs(pSelect, SQL_CLAUSE_SELECT, NULL, fmIsVectorFunc, &pIdfRowsFunc->pFuncs); if (TSDB_CODE_SUCCESS == code) { code = rewriteExprsForSelect(pIdfRowsFunc->pFuncs, pSelect, SQL_CLAUSE_SELECT, NULL); } @@ -899,9 +923,10 @@ static int32_t createInterpFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p return TSDB_CODE_SUCCESS; } - SInterpFuncLogicNode* pInterpFunc = (SInterpFuncLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_INTERP_FUNC); + SInterpFuncLogicNode* pInterpFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_INTERP_FUNC, (SNode**)&pInterpFunc); if (NULL == pInterpFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pInterpFunc->node.groupAction = getGroupAction(pCxt, pSelect); @@ -909,7 +934,7 @@ static int32_t createInterpFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p pInterpFunc->node.resultDataOrder = pInterpFunc->node.requireDataOrder; // interp functions and _group_key functions - int32_t code = nodesCollectFuncs(pSelect, SQL_CLAUSE_SELECT, NULL, isInterpFunc, &pInterpFunc->pFuncs); + code = nodesCollectFuncs(pSelect, SQL_CLAUSE_SELECT, NULL, isInterpFunc, &pInterpFunc->pFuncs); if (TSDB_CODE_SUCCESS == code) { code = rewriteExprsForSelect(pInterpFunc->pFuncs, pSelect, SQL_CLAUSE_SELECT, NULL); } @@ -918,10 +943,10 @@ static int32_t createInterpFuncLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p SFillNode* pFill = (SFillNode*)pSelect->pFill; pInterpFunc->timeRange = pFill->timeRange; pInterpFunc->fillMode = pFill->mode; - pInterpFunc->pTimeSeries = nodesCloneNode(pFill->pWStartTs); - pInterpFunc->pFillValues = nodesCloneNode(pFill->pValues); - if (NULL == pInterpFunc->pTimeSeries || (NULL != pFill->pValues && NULL == pInterpFunc->pFillValues)) { - code = TSDB_CODE_OUT_OF_MEMORY; + pInterpFunc->pTimeSeries = NULL; + code = nodesCloneNode(pFill->pWStartTs, &pInterpFunc->pTimeSeries); + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pFill->pValues, &pInterpFunc->pFillValues); } } @@ -965,10 +990,7 @@ static int32_t createWindowLogicNodeFinalize(SLogicPlanContext* pCxt, SSelectStm } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pHaving) { - pWindow->node.pConditions = nodesCloneNode(pSelect->pHaving); - if (NULL == pWindow->node.pConditions) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneNode(pSelect->pHaving, &pWindow->node.pConditions); } pSelect->hasAggFuncs = false; @@ -984,9 +1006,10 @@ static int32_t createWindowLogicNodeFinalize(SLogicPlanContext* pCxt, SSelectStm static int32_t createWindowLogicNodeByState(SLogicPlanContext* pCxt, SStateWindowNode* pState, SSelectStmt* pSelect, SLogicNode** pLogicNode) { - SWindowLogicNode* pWindow = (SWindowLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW); + SWindowLogicNode* pWindow = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW, (SNode**)&pWindow); if (NULL == pWindow) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pWindow->winType = WINDOW_TYPE_STATE; @@ -995,16 +1018,23 @@ static int32_t createWindowLogicNodeByState(SLogicPlanContext* pCxt, SStateWindo pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_IN_BLOCK : getRequireDataOrder(true, pSelect); pWindow->node.resultDataOrder = pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_GLOBAL : pWindow->node.requireDataOrder; - pWindow->pStateExpr = nodesCloneNode(pState->pExpr); - pWindow->pTspk = nodesCloneNode(pState->pCol); - if (NULL == pWindow->pStateExpr || NULL == pWindow->pTspk) { + pWindow->pStateExpr = NULL; + code = nodesCloneNode(pState->pExpr, &pWindow->pStateExpr); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pWindow); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + code = nodesCloneNode(pState->pCol, &pWindow->pTspk); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pWindow); + return code; } // rewrite the expression in subsequent clauses - int32_t code = rewriteExprForSelect(pWindow->pStateExpr, pSelect, SQL_CLAUSE_WINDOW); + code = rewriteExprForSelect(pWindow->pStateExpr, pSelect, SQL_CLAUSE_WINDOW); if (TSDB_CODE_SUCCESS == code) { code = createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode); + } else { + nodesDestroyNode((SNode*)pWindow); } return code; @@ -1012,9 +1042,10 @@ static int32_t createWindowLogicNodeByState(SLogicPlanContext* pCxt, SStateWindo static int32_t createWindowLogicNodeBySession(SLogicPlanContext* pCxt, SSessionWindowNode* pSession, SSelectStmt* pSelect, SLogicNode** pLogicNode) { - SWindowLogicNode* pWindow = (SWindowLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW); + SWindowLogicNode* pWindow = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW, (SNode**)&pWindow); if (NULL == pWindow) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pWindow->winType = WINDOW_TYPE_SESSION; @@ -1026,21 +1057,28 @@ static int32_t createWindowLogicNodeBySession(SLogicPlanContext* pCxt, SSessionW pWindow->node.resultDataOrder = pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_GLOBAL : pWindow->node.requireDataOrder; - pWindow->pTspk = nodesCloneNode((SNode*)pSession->pCol); + pWindow->pTspk = NULL; + code = nodesCloneNode((SNode*)pSession->pCol, &pWindow->pTspk); if (NULL == pWindow->pTspk) { nodesDestroyNode((SNode*)pWindow); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + pWindow->pTsEnd = NULL; + code = nodesCloneNode((SNode*)pSession->pCol, &pWindow->pTsEnd); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pWindow); + return code; } - pWindow->pTsEnd = nodesCloneNode((SNode*)pSession->pCol); return createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode); } static int32_t createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SIntervalWindowNode* pInterval, SSelectStmt* pSelect, SLogicNode** pLogicNode) { - SWindowLogicNode* pWindow = (SWindowLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW); + SWindowLogicNode* pWindow = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW, (SNode**)&pWindow); if (NULL == pWindow) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pWindow->winType = WINDOW_TYPE_INTERVAL; @@ -1058,10 +1096,11 @@ static int32_t createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SInterva : (pSelect->hasTimeLineFunc ? getRequireDataOrder(true, pSelect) : DATA_ORDER_LEVEL_IN_BLOCK); pWindow->node.resultDataOrder = pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_GLOBAL : getRequireDataOrder(true, pSelect); - pWindow->pTspk = nodesCloneNode(pInterval->pCol); + pWindow->pTspk = NULL; + code = nodesCloneNode(pInterval->pCol, &pWindow->pTspk); if (NULL == pWindow->pTspk) { nodesDestroyNode((SNode*)pWindow); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pWindow->isPartTb = pSelect->pPartitionByList ? keysHasTbname(pSelect->pPartitionByList) : 0; @@ -1070,9 +1109,10 @@ static int32_t createWindowLogicNodeByInterval(SLogicPlanContext* pCxt, SInterva static int32_t createWindowLogicNodeByEvent(SLogicPlanContext* pCxt, SEventWindowNode* pEvent, SSelectStmt* pSelect, SLogicNode** pLogicNode) { - SWindowLogicNode* pWindow = (SWindowLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW); + SWindowLogicNode* pWindow = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW, (SNode**)&pWindow); if (NULL == pWindow) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pWindow->winType = WINDOW_TYPE_EVENT; @@ -1081,9 +1121,22 @@ static int32_t createWindowLogicNodeByEvent(SLogicPlanContext* pCxt, SEventWindo pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_IN_BLOCK : getRequireDataOrder(true, pSelect); pWindow->node.resultDataOrder = pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_GLOBAL : pWindow->node.requireDataOrder; - pWindow->pStartCond = nodesCloneNode(pEvent->pStartCond); - pWindow->pEndCond = nodesCloneNode(pEvent->pEndCond); - pWindow->pTspk = nodesCloneNode(pEvent->pCol); + pWindow->pStartCond = NULL; + code = nodesCloneNode(pEvent->pStartCond, &pWindow->pStartCond); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pWindow); + return code; + } + code = nodesCloneNode(pEvent->pEndCond, &pWindow->pEndCond); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pWindow); + return code; + } + code = nodesCloneNode(pEvent->pCol, &pWindow->pTspk); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pWindow); + return code; + } if (NULL == pWindow->pStartCond || NULL == pWindow->pEndCond || NULL == pWindow->pTspk) { nodesDestroyNode((SNode*)pWindow); return TSDB_CODE_OUT_OF_MEMORY; @@ -1093,9 +1146,10 @@ static int32_t createWindowLogicNodeByEvent(SLogicPlanContext* pCxt, SEventWindo static int32_t createWindowLogicNodeByCount(SLogicPlanContext* pCxt, SCountWindowNode* pCount, SSelectStmt* pSelect, SLogicNode** pLogicNode) { - SWindowLogicNode* pWindow = (SWindowLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW); + SWindowLogicNode* pWindow = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_WINDOW, (SNode**)&pWindow); if (NULL == pWindow) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pWindow->winType = WINDOW_TYPE_COUNT; @@ -1106,10 +1160,11 @@ static int32_t createWindowLogicNodeByCount(SLogicPlanContext* pCxt, SCountWindo pCxt->pPlanCxt->streamQuery ? DATA_ORDER_LEVEL_GLOBAL : pWindow->node.requireDataOrder; pWindow->windowCount = pCount->windowCount; pWindow->windowSliding = pCount->windowSliding; - pWindow->pTspk = nodesCloneNode(pCount->pCol); + pWindow->pTspk = NULL; + code = nodesCloneNode(pCount->pCol, &pWindow->pTspk); if (NULL == pWindow->pTspk) { nodesDestroyNode((SNode*)pWindow); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } return createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode); } @@ -1159,9 +1214,17 @@ static int32_t partFillExprs(SSelectStmt* pSelect, SNodeList** pFillExprs, SNode SNode* pProject = NULL; FOREACH(pProject, pSelect->pProjectionList) { if (needFillValue(pProject)) { - code = nodesListMakeStrictAppend(pFillExprs, nodesCloneNode(pProject)); + SNode* pNew = NULL; + code = nodesCloneNode(pProject, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(pFillExprs, pNew); + } } else if (QUERY_NODE_VALUE != nodeType(pProject)) { - code = nodesListMakeStrictAppend(pNotFillExprs, nodesCloneNode(pProject)); + SNode* pNew = NULL; + code = nodesCloneNode(pProject, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(pNotFillExprs, pNew); + } } if (TSDB_CODE_SUCCESS != code) { NODES_DESTORY_LIST(*pFillExprs); @@ -1174,9 +1237,17 @@ static int32_t partFillExprs(SSelectStmt* pSelect, SNodeList** pFillExprs, SNode FOREACH(pOrderExpr, pSelect->pOrderByList) { SNode* pExpr = ((SOrderByExprNode*)pOrderExpr)->pExpr; if (needFillValue(pExpr)) { - code = nodesListMakeStrictAppend(pFillExprs, nodesCloneNode(pExpr)); + SNode* pNew = NULL; + code = nodesCloneNode(pExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(pFillExprs, pNew); + } } else if (QUERY_NODE_VALUE != nodeType(pExpr)) { - code = nodesListMakeStrictAppend(pNotFillExprs, nodesCloneNode(pExpr)); + SNode* pNew = NULL; + code = nodesCloneNode(pExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(pNotFillExprs, pNew); + } } if (TSDB_CODE_SUCCESS != code) { NODES_DESTORY_LIST(*pFillExprs); @@ -1199,9 +1270,10 @@ static int32_t createFillLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect return TSDB_CODE_SUCCESS; } - SFillLogicNode* pFill = (SFillLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_FILL); + SFillLogicNode* pFill = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_FILL, (SNode**)&pFill); if (NULL == pFill) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pFill->node.groupAction = getGroupAction(pCxt, pSelect); @@ -1209,7 +1281,7 @@ static int32_t createFillLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect pFill->node.resultDataOrder = pFill->node.requireDataOrder; pFill->node.inputTsOrder = TSDB_ORDER_ASC; - int32_t code = partFillExprs(pSelect, &pFill->pFillExprs, &pFill->pNotFillExprs); + code = partFillExprs(pSelect, &pFill->pFillExprs, &pFill->pNotFillExprs); if (TSDB_CODE_SUCCESS == code) { code = rewriteExprsForSelect(pFill->pFillExprs, pSelect, SQL_CLAUSE_FILL, NULL); } @@ -1225,10 +1297,10 @@ static int32_t createFillLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect pFill->mode = pFillNode->mode; pFill->timeRange = pFillNode->timeRange; - pFill->pValues = nodesCloneNode(pFillNode->pValues); - pFill->pWStartTs = nodesCloneNode(pFillNode->pWStartTs); - if ((NULL != pFillNode->pValues && NULL == pFill->pValues) || NULL == pFill->pWStartTs) { - code = TSDB_CODE_OUT_OF_MEMORY; + pFill->pValues = NULL; + code = nodesCloneNode(pFillNode->pValues, &pFill->pValues); + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pFillNode->pWStartTs, &pFill->pWStartTs); } if (TSDB_CODE_SUCCESS == code && 0 == LIST_LENGTH(pFill->node.pTargets)) { @@ -1257,9 +1329,10 @@ static int32_t createSortLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect return TSDB_CODE_SUCCESS; } - SSortLogicNode* pSort = (SSortLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT); + SSortLogicNode* pSort = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT, (SNode**)&pSort); if (NULL == pSort) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pSort->groupSort = pSelect->groupSort; @@ -1268,16 +1341,20 @@ static int32_t createSortLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect pSort->node.resultDataOrder = isPrimaryKeySort(pSelect->pOrderByList) ? (pSort->groupSort ? DATA_ORDER_LEVEL_IN_GROUP : DATA_ORDER_LEVEL_GLOBAL) : DATA_ORDER_LEVEL_NONE; - int32_t code = nodesCollectColumns(pSelect, SQL_CLAUSE_ORDER_BY, NULL, COLLECT_COL_TYPE_ALL, &pSort->node.pTargets); + code = nodesCollectColumns(pSelect, SQL_CLAUSE_ORDER_BY, NULL, COLLECT_COL_TYPE_ALL, &pSort->node.pTargets); if (TSDB_CODE_SUCCESS == code && NULL == pSort->node.pTargets) { - code = nodesListMakeStrictAppend(&pSort->node.pTargets, - nodesCloneNode(nodesListGetNode(pCxt->pCurrRoot->pTargets, 0))); + SNode* pNew = NULL; + code = nodesCloneNode(nodesListGetNode(pCxt->pCurrRoot->pTargets, 0), &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pSort->node.pTargets, pNew); + } } if (TSDB_CODE_SUCCESS == code) { - pSort->pSortKeys = nodesCloneList(pSelect->pOrderByList); + pSort->pSortKeys = NULL; + code = nodesCloneList(pSelect->pOrderByList, &pSort->pSortKeys); if (NULL == pSort->pSortKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } SNode* pNode = NULL; SOrderByExprNode* firstSortKey = (SOrderByExprNode*)nodesListGetNode(pSort->pSortKeys, 0); @@ -1306,16 +1383,17 @@ static int32_t createSortLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect static int32_t createColumnByProjections(SLogicPlanContext* pCxt, const char* pStmtName, SNodeList* pExprs, SNodeList** pCols) { - SNodeList* pList = nodesMakeList(); + SNodeList* pList = NULL; + int32_t code = nodesMakeList(&pList); if (NULL == pList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SNode* pNode; FOREACH(pNode, pExprs) { - if (TSDB_CODE_SUCCESS != nodesListAppend(pList, (SNode*)createColumnByExpr(pStmtName, (SExprNode*)pNode))) { + if (TSDB_CODE_SUCCESS != (code = nodesListStrictAppend(pList, (SNode*)createColumnByExpr(pStmtName, (SExprNode*)pNode)))) { nodesDestroyList(pList); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } @@ -1324,9 +1402,10 @@ static int32_t createColumnByProjections(SLogicPlanContext* pCxt, const char* pS } static int32_t createProjectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect, SLogicNode** pLogicNode) { - SProjectLogicNode* pProject = (SProjectLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT); + SProjectLogicNode* pProject = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT, (SNode**)&pProject); if (NULL == pProject) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } TSWAP(pProject->node.pLimit, pSelect->pLimit); @@ -1337,11 +1416,10 @@ static int32_t createProjectLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSel pProject->node.requireDataOrder = DATA_ORDER_LEVEL_NONE; pProject->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - int32_t code = TSDB_CODE_SUCCESS; - - pProject->pProjections = nodesCloneList(pSelect->pProjectionList); + pProject->pProjections = NULL; + code = nodesCloneList(pSelect->pProjectionList, &pProject->pProjections); if (NULL == pProject->pProjections) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } strcpy(pProject->stmtName, pSelect->stmtName); @@ -1363,20 +1441,23 @@ static int32_t createPartitionLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pS return TSDB_CODE_SUCCESS; } - SPartitionLogicNode* pPartition = (SPartitionLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PARTITION); + SPartitionLogicNode* pPartition = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PARTITION, (SNode**)&pPartition); if (NULL == pPartition) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pPartition->node.groupAction = GROUP_ACTION_SET; pPartition->node.requireDataOrder = DATA_ORDER_LEVEL_NONE; pPartition->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - int32_t code = - nodesCollectColumns(pSelect, SQL_CLAUSE_PARTITION_BY, NULL, COLLECT_COL_TYPE_ALL, &pPartition->node.pTargets); + code = nodesCollectColumns(pSelect, SQL_CLAUSE_PARTITION_BY, NULL, COLLECT_COL_TYPE_ALL, &pPartition->node.pTargets); if (TSDB_CODE_SUCCESS == code && NULL == pPartition->node.pTargets) { - code = nodesListMakeStrictAppend(&pPartition->node.pTargets, - nodesCloneNode(nodesListGetNode(pCxt->pCurrRoot->pTargets, 0))); + SNode* pNew = NULL; + code = nodesCloneNode(nodesListGetNode(pCxt->pCurrRoot->pTargets, 0), &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pPartition->node.pTargets, pNew); + } } if (TSDB_CODE_SUCCESS == code) { @@ -1385,10 +1466,8 @@ static int32_t createPartitionLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pS } if (TSDB_CODE_SUCCESS == code) { - pPartition->pPartitionKeys = nodesCloneList(pSelect->pPartitionByList); - if (NULL == pPartition->pPartitionKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pPartition->pPartitionKeys = NULL; + code = nodesCloneList(pSelect->pPartitionByList, &pPartition->pPartitionKeys); } if (keysHasCol(pPartition->pPartitionKeys) && pSelect->pWindow && @@ -1401,25 +1480,19 @@ static int32_t createPartitionLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pS } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pTags) { - pPartition->pTags = nodesCloneList(pSelect->pTags); - if (NULL == pPartition->pTags) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pPartition->pTags = NULL; + code = nodesCloneList(pSelect->pTags, &pPartition->pTags); } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pSubtable) { - pPartition->pSubtable = nodesCloneNode(pSelect->pSubtable); - if (NULL == pPartition->pSubtable) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pPartition->pSubtable = NULL; + code = nodesCloneNode(pSelect->pSubtable, &pPartition->pSubtable); } if (TSDB_CODE_SUCCESS == code && NULL != pSelect->pHaving && !pSelect->hasAggFuncs && NULL == pSelect->pGroupByList && NULL == pSelect->pWindow) { - pPartition->node.pConditions = nodesCloneNode(pSelect->pHaving); - if (NULL == pPartition->node.pConditions) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pPartition->node.pConditions = NULL; + code = nodesCloneNode(pSelect->pHaving, &pPartition->node.pConditions); } if (TSDB_CODE_SUCCESS == code) { @@ -1436,21 +1509,25 @@ static int32_t createDistinctLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSe return TSDB_CODE_SUCCESS; } - SAggLogicNode* pAgg = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); + SAggLogicNode* pAgg = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG, (SNode**)&pAgg); if (NULL == pAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pAgg->node.groupAction = GROUP_ACTION_CLEAR;//getDistinctGroupAction(pCxt, pSelect); pAgg->node.requireDataOrder = DATA_ORDER_LEVEL_NONE; pAgg->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - int32_t code = TSDB_CODE_SUCCESS; // set grouyp keys, agg funcs and having conditions SNodeList* pGroupKeys = NULL; SNode* pProjection = NULL; FOREACH(pProjection, pSelect->pProjectionList) { - code = nodesListMakeStrictAppend(&pGroupKeys, createGroupingSetNode(pProjection)); + SNode* pNew = NULL; + code = createGroupingSetNode(pProjection, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pGroupKeys, pNew); + } if (TSDB_CODE_SUCCESS != code) { nodesDestroyList(pGroupKeys); break; @@ -1548,25 +1625,20 @@ static int32_t createSetOpSortLogicNode(SLogicPlanContext* pCxt, SSetOperator* p return TSDB_CODE_SUCCESS; } - SSortLogicNode* pSort = (SSortLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT); + SSortLogicNode* pSort = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT, (SNode**)&pSort); if (NULL == pSort) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } TSWAP(pSort->node.pLimit, pSetOperator->pLimit); - int32_t code = TSDB_CODE_SUCCESS; - - pSort->node.pTargets = nodesCloneList(pSetOperator->pProjectionList); - if (NULL == pSort->node.pTargets) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pSort->node.pTargets = NULL; + code = nodesCloneList(pSetOperator->pProjectionList, &pSort->node.pTargets); if (TSDB_CODE_SUCCESS == code) { - pSort->pSortKeys = nodesCloneList(pSetOperator->pOrderByList); - if (NULL == pSort->pSortKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pSort->pSortKeys = NULL; + code = nodesCloneList(pSetOperator->pOrderByList, &pSort->pSortKeys); } if (TSDB_CODE_SUCCESS == code) { @@ -1580,9 +1652,10 @@ static int32_t createSetOpSortLogicNode(SLogicPlanContext* pCxt, SSetOperator* p static int32_t createSetOpProjectLogicNode(SLogicPlanContext* pCxt, SSetOperator* pSetOperator, SLogicNode** pLogicNode) { - SProjectLogicNode* pProject = (SProjectLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT); + SProjectLogicNode* pProject = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT, (SNode**)&pProject); if (NULL == pProject) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } if (NULL == pSetOperator->pOrderByList) { @@ -1591,12 +1664,8 @@ static int32_t createSetOpProjectLogicNode(SLogicPlanContext* pCxt, SSetOperator pProject->ignoreGroupId = true; pProject->isSetOpProj = true; - int32_t code = TSDB_CODE_SUCCESS; - - pProject->pProjections = nodesCloneList(pSetOperator->pProjectionList); - if (NULL == pProject->pProjections) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pProject->pProjections = NULL; + code = nodesCloneList(pSetOperator->pProjectionList, &pProject->pProjections); if (TSDB_CODE_SUCCESS == code) { code = createColumnByProjections(pCxt, pSetOperator->stmtName, pSetOperator->pProjectionList, @@ -1613,20 +1682,18 @@ static int32_t createSetOpProjectLogicNode(SLogicPlanContext* pCxt, SSetOperator } static int32_t createSetOpAggLogicNode(SLogicPlanContext* pCxt, SSetOperator* pSetOperator, SLogicNode** pLogicNode) { - SAggLogicNode* pAgg = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); + SAggLogicNode* pAgg = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG, (SNode**)&pAgg); if (NULL == pAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } if (NULL == pSetOperator->pOrderByList) { TSWAP(pAgg->node.pSlimit, pSetOperator->pLimit); } - int32_t code = TSDB_CODE_SUCCESS; - pAgg->pGroupKeys = nodesCloneList(pSetOperator->pProjectionList); - if (NULL == pAgg->pGroupKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pAgg->pGroupKeys = NULL; + code = nodesCloneList(pSetOperator->pProjectionList, &pAgg->pGroupKeys); // rewrite the expression in subsequent clauses if (TSDB_CODE_SUCCESS == code) { @@ -1723,9 +1790,10 @@ static int32_t getMsgType(ENodeType sqlType) { } static int32_t createVnodeModifLogicNode(SLogicPlanContext* pCxt, SVnodeModifyOpStmt* pStmt, SLogicNode** pLogicNode) { - SVnodeModifyLogicNode* pModif = (SVnodeModifyLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY); + SVnodeModifyLogicNode* pModif = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY, (SNode**)&pModif); if (NULL == pModif) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pModif->modifyType = MODIFY_TABLE_TYPE_INSERT; TSWAP(pModif->pDataBlocks, pStmt->pDataBlocks); @@ -1747,10 +1815,8 @@ static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p if (TSDB_CODE_SUCCESS == code) { pScan->scanType = SCAN_TYPE_TABLE; pScan->scanRange = pDelete->timeRange; - pScan->pScanCols = nodesCloneList(((SFunctionNode*)pDelete->pCountFunc)->pParameterList); - if (NULL == pScan->pScanCols) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pScan->pScanCols = NULL; + code = nodesCloneList(((SFunctionNode*)pDelete->pCountFunc)->pParameterList, &pScan->pScanCols); } STableMeta* pMeta = ((SRealTableNode*)pDelete->pFromTable)->pMeta; @@ -1759,10 +1825,7 @@ static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p } if (TSDB_CODE_SUCCESS == code && NULL != pDelete->pTagCond) { - pScan->pTagCond = nodesCloneNode(pDelete->pTagCond); - if (NULL == pScan->pTagCond) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneNode(pDelete->pTagCond, &pScan->pTagCond); } // set output @@ -1780,17 +1843,30 @@ static int32_t createDeleteScanLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* p } static int32_t createDeleteAggLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pDelete, SLogicNode** pLogicNode) { - SAggLogicNode* pAgg = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); + SAggLogicNode* pAgg = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG, (SNode**)&pAgg); if (NULL == pAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, nodesCloneNode(pDelete->pCountFunc)); + SNode* pNew = NULL; + code = nodesCloneNode(pDelete->pCountFunc, &pNew); if (TSDB_CODE_SUCCESS == code) { - code = nodesListStrictAppend(pAgg->pAggFuncs, nodesCloneNode(pDelete->pFirstFunc)); + code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, pNew); } if (TSDB_CODE_SUCCESS == code) { - code = nodesListStrictAppend(pAgg->pAggFuncs, nodesCloneNode(pDelete->pLastFunc)); + SNode* pNew = NULL; + code = nodesCloneNode(pDelete->pFirstFunc, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pAgg->pAggFuncs, pNew); + } + } + if (TSDB_CODE_SUCCESS == code) { + SNode* pNew = NULL; + code = nodesCloneNode(pDelete->pLastFunc, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pAgg->pAggFuncs, pNew); + } } if (TSDB_CODE_SUCCESS == code) { code = rewriteExpr(pAgg->pAggFuncs, &pDelete->pCountFunc); @@ -1817,9 +1893,10 @@ static int32_t createDeleteAggLogicNode(SLogicPlanContext* pCxt, SDeleteStmt* pD static int32_t createVnodeModifLogicNodeByDelete(SLogicPlanContext* pCxt, SDeleteStmt* pDelete, SLogicNode** pLogicNode) { - SVnodeModifyLogicNode* pModify = (SVnodeModifyLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY); + SVnodeModifyLogicNode* pModify = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY, (SNode**)&pModify); if (NULL == pModify) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SRealTableNode* pRealTable = (SRealTableNode*)pDelete->pFromTable; @@ -1830,12 +1907,21 @@ static int32_t createVnodeModifLogicNodeByDelete(SLogicPlanContext* pCxt, SDelet snprintf(pModify->tableName, sizeof(pModify->tableName), "%s", pRealTable->table.tableName); strcpy(pModify->tsColName, pRealTable->pMeta->schema->name); pModify->deleteTimeRange = pDelete->timeRange; - pModify->pAffectedRows = nodesCloneNode(pDelete->pCountFunc); - pModify->pStartTs = nodesCloneNode(pDelete->pFirstFunc); - pModify->pEndTs = nodesCloneNode(pDelete->pLastFunc); - if (NULL == pModify->pAffectedRows || NULL == pModify->pStartTs || NULL == pModify->pEndTs) { + pModify->pAffectedRows = NULL; + code = nodesCloneNode(pDelete->pCountFunc, &pModify->pAffectedRows); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pModify); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + code = nodesCloneNode(pDelete->pFirstFunc, &pModify->pStartTs); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pModify); + return code; + } + code = nodesCloneNode(pDelete->pLastFunc, &pModify->pEndTs); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pModify); + return code; } *pLogicNode = (SLogicNode*)pModify; @@ -1868,9 +1954,10 @@ static int32_t creatInsertRootLogicNode(SLogicPlanContext* pCxt, SInsertStmt* pI static int32_t createVnodeModifLogicNodeByInsert(SLogicPlanContext* pCxt, SInsertStmt* pInsert, SLogicNode** pLogicNode) { - SVnodeModifyLogicNode* pModify = (SVnodeModifyLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY); + SVnodeModifyLogicNode* pModify = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY, (SNode**)&pModify); if (NULL == pModify) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SRealTableNode* pRealTable = (SRealTableNode*)pInsert->pTable; @@ -1881,10 +1968,11 @@ static int32_t createVnodeModifLogicNodeByInsert(SLogicPlanContext* pCxt, SInser pModify->tableType = pRealTable->pMeta->tableType; snprintf(pModify->tableName, sizeof(pModify->tableName), "%s", pRealTable->table.tableName); TSWAP(pModify->pVgroupList, pRealTable->pVgroupList); - pModify->pInsertCols = nodesCloneList(pInsert->pCols); + pModify->pInsertCols = NULL; + code = nodesCloneList(pInsert->pCols, &pModify->pInsertCols); if (NULL == pModify->pInsertCols) { nodesDestroyNode((SNode*)pModify); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } *pLogicNode = (SLogicNode*)pModify; @@ -1949,15 +2037,16 @@ static void setLogicSubplanType(bool hasScan, SLogicSubplan* pSubplan) { int32_t createLogicPlan(SPlanContext* pCxt, SLogicSubplan** pLogicSubplan) { SLogicPlanContext cxt = {.pPlanCxt = pCxt, .pCurrRoot = NULL, .hasScan = false}; - SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + SLogicSubplan* pSubplan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN, (SNode**)&pSubplan); if (NULL == pSubplan) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pSubplan->id.queryId = pCxt->queryId; pSubplan->id.groupId = 1; pSubplan->id.subplanId = 1; - int32_t code = createQueryLogicNode(&cxt, pCxt->pAstRoot, &pSubplan->pNode); + code = createQueryLogicNode(&cxt, pCxt->pAstRoot, &pSubplan->pNode); if (TSDB_CODE_SUCCESS == code) { setLogicNodeParent(pSubplan->pNode); setLogicSubplanType(cxt.hasScan, pSubplan); diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c index b72cad012d..27d3e80ef0 100644 --- a/source/libs/planner/src/planOptimizer.c +++ b/source/libs/planner/src/planOptimizer.c @@ -45,6 +45,11 @@ typedef struct SOptimizeRule { FOptimize optimizeFunc; } SOptimizeRule; +typedef struct SOptimizePKCtx { + SNodeList* pList; + int32_t code; +} SOptimizePKCtx; + typedef enum EScanOrder { SCAN_ORDER_ASC = 1, SCAN_ORDER_DESC, SCAN_ORDER_BOTH } EScanOrder; typedef struct SOsdInfo { @@ -108,7 +113,7 @@ typedef struct SJoinOptimizeOpt { int8_t pushDownFlag; } SJoinOptimizeOpt; -typedef bool (*FMayBeOptimized)(SLogicNode* pNode); +typedef bool (*FMayBeOptimized)(SLogicNode* pNode, void* pCtx); typedef bool (*FShouldBeOptimized)(SLogicNode* pNode, void* pInfo); #if 0 @@ -139,13 +144,13 @@ static SJoinOptimizeOpt gJoinOnOpt[JOIN_TYPE_MAX_VALUE][JOIN_STYPE_MAX_VALUE] = #endif -static SLogicNode* optFindPossibleNode(SLogicNode* pNode, FMayBeOptimized func) { - if (func(pNode)) { +static SLogicNode* optFindPossibleNode(SLogicNode* pNode, FMayBeOptimized func, void* pCtx) { + if (func(pNode, pCtx)) { return pNode; } SNode* pChild; FOREACH(pChild, pNode->pChildren) { - SLogicNode* pScanNode = optFindPossibleNode((SLogicNode*)pChild, func); + SLogicNode* pScanNode = optFindPossibleNode((SLogicNode*)pChild, func, pCtx); if (NULL != pScanNode) { return pScanNode; } @@ -173,9 +178,10 @@ static void optResetParent(SLogicNode* pNode) { static EDealRes optRebuildTbanme(SNode** pNode, void* pContext) { if (QUERY_NODE_COLUMN == nodeType(*pNode) && COLUMN_TYPE_TBNAME == ((SColumnNode*)*pNode)->colType) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - *(int32_t*)pContext = TSDB_CODE_OUT_OF_MEMORY; + *(int32_t*)pContext = code; return DEAL_RES_ERROR; } strcpy(pFunc->functionName, "tbname"); @@ -234,7 +240,7 @@ static bool scanPathOptHaveNormalCol(SNodeList* pList) { return res; } -static bool scanPathOptMayBeOptimized(SLogicNode* pNode) { +static bool scanPathOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (OPTIMIZE_FLAG_TEST_MASK(pNode->optimizedFlag, OPTIMIZE_FLAG_SCAN_PATH)) { return false; } @@ -298,9 +304,17 @@ static int32_t scanPathOptGetRelatedFuncs(SScanLogicNode* pScan, SNodeList** pSd SFunctionNode* pFunc = (SFunctionNode*)pNode; int32_t code = TSDB_CODE_SUCCESS; if (scanPathOptIsSpecifiedFuncType(pFunc, fmIsSpecialDataRequiredFunc)) { - code = nodesListMakeStrictAppend(&pTmpSdrFuncs, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pTmpSdrFuncs, pNew); + } } else if (scanPathOptIsSpecifiedFuncType(pFunc, fmIsDynamicScanOptimizedFunc)) { - code = nodesListMakeStrictAppend(&pTmpDsoFuncs, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pTmpDsoFuncs, pNew); + } } else if (scanPathOptIsSpecifiedFuncType(pFunc, fmIsSkipScanCheckFunc)) { continue; } else { @@ -358,7 +372,7 @@ static int32_t scanPathOptSetOsdInfo(SOsdInfo* pInfo) { } static int32_t scanPathOptMatch(SOptimizeContext* pCxt, SLogicNode* pLogicNode, SOsdInfo* pInfo) { - pInfo->pScan = (SScanLogicNode*)optFindPossibleNode(pLogicNode, scanPathOptMayBeOptimized); + pInfo->pScan = (SScanLogicNode*)optFindPossibleNode(pLogicNode, scanPathOptMayBeOptimized, NULL); if (NULL == pInfo->pScan) { return TSDB_CODE_SUCCESS; } @@ -471,14 +485,15 @@ static int32_t scanPathOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub } static int32_t pdcMergeCondsToLogic(SNode** pDst, SNode** pSrc) { - SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SLogicConditionNode* pLogicCond = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond); if (NULL == pLogicCond) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL; pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes; pLogicCond->condType = LOGIC_COND_TYPE_AND; - int32_t code = nodesListMakeAppend(&pLogicCond->pParameterList, *pSrc); + code = nodesListMakeAppend(&pLogicCond->pParameterList, *pSrc); if (TSDB_CODE_SUCCESS == code) { *pSrc = NULL; code = nodesListMakeAppend(&pLogicCond->pParameterList, *pDst); @@ -659,8 +674,15 @@ static int32_t pdcJoinSplitLogicCond(SJoinLogicNode* pJoin, SNode** pSrcCond, SN int32_t code = TSDB_CODE_SUCCESS; SSHashObj* pLeftTables = NULL; SSHashObj* pRightTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pLeftTables); + return code; + } SNodeList* pOnConds = NULL; SNodeList* pLeftChildConds = NULL; @@ -669,14 +691,17 @@ static int32_t pdcJoinSplitLogicCond(SJoinLogicNode* pJoin, SNode** pSrcCond, SN SNode* pCond = NULL; FOREACH(pCond, pLogicCond->pParameterList) { ECondAction condAction = pdcJoinGetCondAction(pJoin, pLeftTables, pRightTables, pCond, whereCond); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS != code) { break; } if (COND_ACTION_PUSH_JOIN == condAction && NULL != pOnCond) { - code = nodesListMakeAppend(&pOnConds, nodesCloneNode(pCond)); + code = nodesListMakeAppend(&pOnConds, pNew); } else if (COND_ACTION_PUSH_LEFT_CHILD == condAction) { - code = nodesListMakeAppend(&pLeftChildConds, nodesCloneNode(pCond)); + code = nodesListMakeAppend(&pLeftChildConds, pNew); } else if (COND_ACTION_PUSH_RIGHT_CHILD == condAction) { - code = nodesListMakeAppend(&pRightChildConds, nodesCloneNode(pCond)); + code = nodesListMakeAppend(&pRightChildConds, pNew); } else { - code = nodesListMakeAppend(&pRemainConds, nodesCloneNode(pCond)); + code = nodesListMakeAppend(&pRemainConds, pNew); } if (TSDB_CODE_SUCCESS != code) { break; @@ -729,8 +754,15 @@ static int32_t pdcJoinSplitOpCond(SJoinLogicNode* pJoin, SNode** pSrcCond, SNode SNode** pRightChildCond, bool whereCond) { SSHashObj* pLeftTables = NULL; SSHashObj* pRightTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + int32_t code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pLeftTables); + return code; + } ECondAction condAction = pdcJoinGetCondAction(pJoin, pLeftTables, pRightTables, *pSrcCond, whereCond); @@ -811,8 +843,15 @@ static bool pdcJoinIsPrimEqualCond(SJoinLogicNode* pJoin, SNode* pCond) { SSHashObj* pLeftTables = NULL; SSHashObj* pRightTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + int32_t code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pLeftTables); + return code; + } bool res = false; if (pdcJoinIsPrim(pOper->pLeft, pLeftTables)) { @@ -857,11 +896,15 @@ static int32_t pdcJoinSplitPrimInLogicCond(SJoinLogicNode* pJoin, SNode** ppPrim SNodeList* pOnConds = NULL; SNode* pCond = NULL; WHERE_EACH(pCond, pLogicCond->pParameterList) { + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS != code) break; if (pdcJoinIsPrimEqualCond(pJoin, pCond) && (NULL == *ppPrimEqCond)) { - *ppPrimEqCond = nodesCloneNode(pCond); + *ppPrimEqCond = pNew; ERASE_NODE(pLogicCond->pParameterList); } else { - code = nodesListMakeAppend(&pOnConds, nodesCloneNode(pCond)); + code = nodesListMakeAppend(&pOnConds, pNew); + if (TSDB_CODE_SUCCESS != code) break; WHERE_NEXT; } } @@ -912,24 +955,26 @@ static int32_t pdcJoinSplitPrimEqCond(SOptimizeContext* pCxt, SJoinLogicNode* pJ return code; } -static bool pdcJoinIsEqualOnCond(SJoinLogicNode* pJoin, SNode* pCond, bool* allTags) { +static int32_t pdcJoinIsEqualOnCond(SJoinLogicNode* pJoin, SNode* pCond, bool* allTags, bool* pRes) { + *pRes = false; + int32_t code = 0; if (QUERY_NODE_OPERATOR != nodeType(pCond)) { - return false; + return code; } SOperatorNode* pOper = (SOperatorNode*)pCond; if ((QUERY_NODE_COLUMN != nodeType(pOper->pLeft) && !(QUERY_NODE_OPERATOR == nodeType(pOper->pLeft) && OP_TYPE_JSON_GET_VALUE ==((SOperatorNode*)pOper->pLeft)->opType)) || NULL == pOper->pRight || (QUERY_NODE_COLUMN != nodeType(pOper->pRight) && !(QUERY_NODE_OPERATOR == nodeType(pOper->pRight) && OP_TYPE_JSON_GET_VALUE ==((SOperatorNode*)pOper->pRight)->opType))) { - return false; + return code; } if (OP_TYPE_EQUAL != pOper->opType) { - return false; + return code; } if ((QUERY_NODE_OPERATOR == nodeType(pOper->pLeft) || QUERY_NODE_OPERATOR == nodeType(pOper->pRight)) && !(IS_ASOF_JOIN(pJoin->subType) || IS_WINDOW_JOIN(pJoin->subType))) { - return false; + return code; } SColumnNode* pLeft = (SColumnNode*)(pOper->pLeft); @@ -947,7 +992,7 @@ static bool pdcJoinIsEqualOnCond(SJoinLogicNode* pJoin, SNode* pCond, bool* allT if (pLeft->node.resType.type != pRight->node.resType.type || pLeft->node.resType.bytes != pRight->node.resType.bytes) { - return false; + return code; } SNodeList* pLeftCols = ((SLogicNode*)nodesListGetNode(pJoin->node.pChildren, 0))->pTargets; SNodeList* pRightCols = ((SLogicNode*)nodesListGetNode(pJoin->node.pChildren, 1))->pTargets; @@ -955,18 +1000,46 @@ static bool pdcJoinIsEqualOnCond(SJoinLogicNode* pJoin, SNode* pCond, bool* allT if (pdcJoinColInTableColList((SNode*)pLeft, pLeftCols)) { isEqual = pdcJoinColInTableColList((SNode*)pRight, pRightCols); if (isEqual) { - nodesListMakeStrictAppend(&pJoin->pLeftEqNodes, nodesCloneNode(pOper->pLeft)); - nodesListMakeStrictAppend(&pJoin->pRightEqNodes, nodesCloneNode(pOper->pRight)); + SNode* pNewLeft = NULL; + code = nodesCloneNode(pOper->pLeft, &pNewLeft); + if (TSDB_CODE_SUCCESS != code) return code; + SNode* pNewRight = NULL; + code = nodesCloneNode(pOper->pRight, &pNewRight); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNewLeft); + return code; + } + code = nodesListMakeStrictAppend(&pJoin->pLeftEqNodes, pNewLeft); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNewRight); + return code; + } + code = nodesListMakeStrictAppend(&pJoin->pRightEqNodes, pNewRight); } } else if (pdcJoinColInTableColList((SNode*)pLeft, pRightCols)) { isEqual = pdcJoinColInTableColList((SNode*)pRight, pLeftCols); if (isEqual) { - nodesListMakeStrictAppend(&pJoin->pLeftEqNodes, nodesCloneNode(pOper->pRight)); - nodesListMakeStrictAppend(&pJoin->pRightEqNodes, nodesCloneNode(pOper->pLeft)); + SNode* pNewLeft = NULL; + code = nodesCloneNode(pOper->pLeft, &pNewLeft); + if (TSDB_CODE_SUCCESS != code) return code; + SNode* pNewRight = NULL; + code = nodesCloneNode(pOper->pRight, &pNewRight); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNewLeft); + return code; + } + code = nodesListMakeStrictAppend(&pJoin->pLeftEqNodes, pNewRight); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNewLeft); + return code; + } + code = nodesListMakeStrictAppend(&pJoin->pRightEqNodes, pNewLeft); } } - - return isEqual; + if (TSDB_CODE_SUCCESS == code) { + *pRes = isEqual; + } + return code; } static int32_t pdcJoinPartLogicEqualOnCond(SJoinLogicNode* pJoin) { @@ -981,17 +1054,24 @@ static int32_t pdcJoinPartLogicEqualOnCond(SJoinLogicNode* pJoin) { bool allTags = false; FOREACH(pCond, pLogicCond->pParameterList) { allTags = false; - if (pdcJoinIsEqualOnCond(pJoin, pCond, &allTags)) { + bool eqOnCond = false; + SNode* pNew = NULL; + code = pdcJoinIsEqualOnCond(pJoin, pCond, &allTags, &eqOnCond); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + + if (eqOnCond) { if (allTags) { - code = nodesListMakeAppend(&pTagEqOnConds, nodesCloneNode(pCond)); + code = nodesListMakeStrictAppend(&pTagEqOnConds, pNew); } else { - code = nodesListMakeAppend(&pColEqOnConds, nodesCloneNode(pCond)); + code = nodesListMakeStrictAppend(&pColEqOnConds, pNew); pJoin->allEqTags = false; } } else if (allTags) { - code = nodesListMakeAppend(&pTagOnConds, nodesCloneNode(pCond)); + code = nodesListMakeStrictAppend(&pTagOnConds, pNew); } else { - code = nodesListMakeAppend(&pColOnConds, nodesCloneNode(pCond)); + code = nodesListMakeStrictAppend(&pColOnConds, pNew); pJoin->allEqTags = false; } @@ -1051,17 +1131,27 @@ static int32_t pdcJoinPartEqualOnCond(SOptimizeContext* pCxt, SJoinLogicNode* pJ } bool allTags = false; - if (pdcJoinIsEqualOnCond(pJoin, pJoin->pFullOnCond, &allTags)) { + bool eqOnCond = false; + int32_t code = pdcJoinIsEqualOnCond(pJoin, pJoin->pFullOnCond, &allTags, &eqOnCond); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + SNode* pNew = NULL; + code = nodesCloneNode(pJoin->pFullOnCond, &pNew); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + if (eqOnCond) { if (allTags) { - pJoin->pTagEqCond = nodesCloneNode(pJoin->pFullOnCond); + pJoin->pTagEqCond = pNew; } else { - pJoin->pColEqCond = nodesCloneNode(pJoin->pFullOnCond); + pJoin->pColEqCond = pNew; pJoin->allEqTags = false; } } else if (allTags) { - pJoin->pTagOnCond = nodesCloneNode(pJoin->pFullOnCond); + pJoin->pTagOnCond = pNew; } else { - pJoin->pColOnCond = nodesCloneNode(pJoin->pFullOnCond); + pJoin->pColOnCond = pNew; pJoin->allEqTags = false; } @@ -1083,7 +1173,11 @@ static EDealRes pdcJoinCollectCondCol(SNode* pNode, void* pContext) { if (NULL == taosHashGet(pCxt->pColHash, name, len)) { pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, NULL, 0); if (TSDB_CODE_SUCCESS == pCxt->errCode) { - pCxt->errCode = nodesListStrictAppend(pCxt->pResCols, nodesCloneNode(pNode)); + SNode* pNew = NULL; + pCxt->errCode = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == pCxt->errCode) { + pCxt->errCode = nodesListStrictAppend(pCxt->pResCols, pNew); + } } } } @@ -1120,14 +1214,22 @@ static int32_t pdcJoinAddParentOnColsToTarget(SOptimizeContext* pCxt, SJoinLogic SNodeList* pTargets = NULL; int32_t code = TSDB_CODE_SUCCESS; - SNodeList* pCondCols = nodesMakeList(); + SNodeList* pCondCols = NULL; + code = nodesMakeList(&pCondCols); if (NULL == pCondCols) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SSHashObj* pTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pTables); + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pTables); + return code; + } SJoinLogicNode* pTmp = (SJoinLogicNode*)pJoin->node.pParent; do { @@ -1161,7 +1263,14 @@ static int32_t pdcJoinAddParentOnColsToTarget(SOptimizeContext* pCxt, SJoinLogic } } if (!found) { - nodesListStrictAppend(pJoin->node.pTargets, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->node.pTargets, pNew); + } + if (TSDB_CODE_SUCCESS != code) { + break; + } } } } @@ -1178,10 +1287,11 @@ static int32_t pdcJoinAddPreFilterColsToTarget(SOptimizeContext* pCxt, SJoinLogi } int32_t code = TSDB_CODE_SUCCESS; - SNodeList* pCondCols = nodesMakeList(); + SNodeList* pCondCols = NULL; + code = nodesMakeList(&pCondCols); SNodeList* pTargets = NULL; if (NULL == pCondCols) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } else { code = nodesCollectColumnsFromNode(pJoin->pColOnCond, NULL, COLLECT_COL_TYPE_ALL, &pCondCols); } @@ -1206,7 +1316,14 @@ static int32_t pdcJoinAddPreFilterColsToTarget(SOptimizeContext* pCxt, SJoinLogi } } if (!found) { - nodesListStrictAppend(pJoin->node.pTargets, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->node.pTargets, pNew); + } + if (TSDB_CODE_SUCCESS != code) { + break; + } } } } @@ -1222,10 +1339,11 @@ static int32_t pdcJoinAddFilterColsToTarget(SOptimizeContext* pCxt, SJoinLogicNo } int32_t code = TSDB_CODE_SUCCESS; - SNodeList* pCondCols = nodesMakeList(); + SNodeList* pCondCols = NULL; + code = nodesMakeList(&pCondCols); SNodeList* pTargets = NULL; if (NULL == pCondCols) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } if (NULL != pJoin->node.pConditions) { @@ -1252,7 +1370,14 @@ static int32_t pdcJoinAddFilterColsToTarget(SOptimizeContext* pCxt, SJoinLogicNo } } if (!found) { - nodesListStrictAppend(pJoin->node.pTargets, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->node.pTargets, pNew); + } + if (TSDB_CODE_SUCCESS != code) { + break; + } } } } @@ -1448,15 +1573,24 @@ static int32_t pdcRewriteTypeBasedOnConds(SOptimizeContext* pCxt, SJoinLogicNode SSHashObj* pLeftTables = NULL; SSHashObj* pRightTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + int32_t code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pLeftTables); + return code; + } bool tableCondTypes[4] = {0}; - int32_t code = pdcGetTableCondTypes(pJoin->node.pConditions, pLeftTables, pRightTables, tableCondTypes); - + code = pdcGetTableCondTypes(pJoin->node.pConditions, pLeftTables, pRightTables, tableCondTypes); tSimpleHashCleanup(pLeftTables); tSimpleHashCleanup(pRightTables); + if (TSDB_CODE_SUCCESS != code) return code; + switch (pJoin->joinType) { case JOIN_TYPE_LEFT: if (tableCondTypes[2] && !tableCondTypes[3]) { @@ -1561,8 +1695,15 @@ static int32_t pdcRewriteTypeBasedOnJoinRes(SOptimizeContext* pCxt, SJoinLogicNo int32_t code = 0; SSHashObj* pLeftTables = NULL; SSHashObj* pRightTables = NULL; - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); - collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 0), &pLeftTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + code = collectTableAliasFromNodes(nodesListGetNode(pJoin->node.pChildren, 1), &pRightTables); + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(pLeftTables); + return code; + } SLogicNode* pParent = pJoin->node.pParent; bool tableResNonNull[2] = {true, true}; @@ -1754,10 +1895,15 @@ static int32_t partitionAggCondConj(SAggLogicNode* pAgg, SNode** ppAggFuncCond, SNodeList* pGroupKeyConds = NULL; SNode* pCond = NULL; FOREACH(pCond, pLogicCond->pParameterList) { + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS != code) { + break; + } if (partitionAggCondHasAggFunc(pAgg, pCond)) { - code = nodesListMakeAppend(&pAggFuncConds, nodesCloneNode(pCond)); + code = nodesListMakeStrictAppend(&pAggFuncConds, pNew); } else { - code = nodesListMakeAppend(&pGroupKeyConds, nodesCloneNode(pCond)); + code = nodesListMakeStrictAppend(&pGroupKeyConds, pNew); } if (TSDB_CODE_SUCCESS != code) { break; @@ -1820,9 +1966,9 @@ static EDealRes rewriteAggGroupKeyCondForPushDownImpl(SNode** pNode, void* pCont SNode* pGroup = NULL; FOREACH(pGroup, ((SGroupingSetNode*)pGroupKey)->pParameterList) { if (0 == strcmp(((SExprNode*)pGroup)->aliasName, ((SColumnNode*)(*pNode))->colName)) { - SNode* pExpr = nodesCloneNode(pGroup); + SNode* pExpr = NULL; + pCxt->errCode = nodesCloneNode(pGroup, &pExpr); if (pExpr == NULL) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } nodesDestroyNode(*pNode); @@ -1889,9 +2035,9 @@ static EDealRes rewriteProjectCondForPushDownImpl(SNode** ppNode, void* pContext SNode* pProjection = NULL; FOREACH(pProjection, pProj->pProjections) { if (0 == strcmp(((SExprNode*)pProjection)->aliasName, ((SColumnNode*)(*ppNode))->colName)) { - SNode* pExpr = nodesCloneNode(pProjection); + SNode* pExpr = NULL; + pCxt->errCode = nodesCloneNode(pProjection, &pExpr); if (pExpr == NULL) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } nodesDestroyNode(*ppNode); @@ -1999,7 +2145,7 @@ static int32_t pdcOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) } -static bool eliminateNotNullCondMayBeOptimized(SLogicNode* pNode) { +static bool eliminateNotNullCondMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode)) { return false; } @@ -2059,7 +2205,7 @@ static bool eliminateNotNullCondMayBeOptimized(SLogicNode* pNode) { } static int32_t eliminateNotNullCondOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pNode = (SLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, eliminateNotNullCondMayBeOptimized); + SLogicNode* pNode = (SLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, eliminateNotNullCondMayBeOptimized, NULL); if (NULL == pNode) { return TSDB_CODE_SUCCESS; } @@ -2082,7 +2228,7 @@ static bool sortPriKeyOptIsPriKeyOrderBy(SNodeList* pSortKeys) { return (QUERY_NODE_COLUMN == nodeType(pNode) ? isPrimaryKeyImpl(pNode) : false); } -static bool sortPriKeyOptMayBeOptimized(SLogicNode* pNode) { +static bool sortPriKeyOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_SORT != nodeType(pNode)) { return false; } @@ -2100,7 +2246,7 @@ static bool sortPriKeyOptMayBeOptimized(SLogicNode* pNode) { } FOREACH(pChild, pSort->node.pChildren) { - SLogicNode* pSortDescendent = optFindPossibleNode((SLogicNode*)pChild, sortPriKeyOptMayBeOptimized); + SLogicNode* pSortDescendent = optFindPossibleNode((SLogicNode*)pChild, sortPriKeyOptMayBeOptimized, NULL); if (pSortDescendent != NULL) { return false; } @@ -2391,7 +2537,7 @@ static int32_t sortPrimaryKeyOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* } static int32_t sortPrimaryKeyOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SSortLogicNode* pSort = (SSortLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, sortPriKeyOptMayBeOptimized); + SSortLogicNode* pSort = (SSortLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, sortPriKeyOptMayBeOptimized, NULL); if (NULL == pSort) { return TSDB_CODE_SUCCESS; } @@ -2435,7 +2581,10 @@ static int32_t sortForJoinOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pL SNode* pOrderByNode = NULL; - collectTableAliasFromNodes((SNode*)pChild, &pTables); + int32_t code = collectTableAliasFromNodes((SNode*)pChild, &pTables); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (NULL != tSimpleHashGet(pTables, ((SColumnNode*)pOp->pLeft)->tableAlias, strlen(((SColumnNode*)pOp->pLeft)->tableAlias))) { pOrderByNode = pOp->pLeft; } else if (NULL != tSimpleHashGet(pTables, ((SColumnNode*)pOp->pRight)->tableAlias, strlen(((SColumnNode*)pOp->pRight)->tableAlias))) { @@ -2448,36 +2597,47 @@ static int32_t sortForJoinOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pL return TSDB_CODE_PLAN_INTERNAL_ERROR; } - SSortLogicNode* pSort = (SSortLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT); + SSortLogicNode* pSort = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT, (SNode**)&pSort); if (NULL == pSort) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pSort->node.outputTsOrder = targetOrder; - pSort->node.pTargets = nodesCloneList(pChild->pTargets); + pSort->node.pTargets = NULL; + code = nodesCloneList(pChild->pTargets, &pSort->node.pTargets); if (NULL == pSort->node.pTargets) { nodesDestroyNode((SNode *)pSort); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pSort->groupSort = false; - SOrderByExprNode* pOrder = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); + SOrderByExprNode* pOrder = NULL; + code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOrder); if (NULL == pOrder) { nodesDestroyNode((SNode *)pSort); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - nodesListMakeAppend(&pSort->pSortKeys, (SNode*)pOrder); + code = nodesListMakeStrictAppend(&pSort->pSortKeys, (SNode*)pOrder); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSort); + return code; + } pOrder->order = targetOrder; - pOrder->pExpr = nodesCloneNode(pOrderByNode); + pOrder->pExpr = NULL; pOrder->nullOrder = (ORDER_ASC == pOrder->order) ? NULL_ORDER_FIRST : NULL_ORDER_LAST; + code = nodesCloneNode(pOrderByNode, &pOrder->pExpr); if (!pOrder->pExpr) { nodesDestroyNode((SNode *)pSort); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pChild->pParent = (SLogicNode*)pSort; - nodesListMakeAppend(&pSort->node.pChildren, (SNode*)pChild); + code = nodesListMakeAppend(&pSort->node.pChildren, (SNode*)pChild); + if (TSDB_CODE_SUCCESS != code) { + return code; + } *pChildPos = (SNode*)pSort; pSort->node.pParent = (SLogicNode*)pJoin;; @@ -2489,7 +2649,7 @@ _return: } -static bool sortForJoinOptMayBeOptimized(SLogicNode* pNode) { +static bool sortForJoinOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode)) { return false; } @@ -2518,7 +2678,7 @@ static bool sortForJoinOptMayBeOptimized(SLogicNode* pNode) { static int32_t sortForJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SJoinLogicNode* pJoin = (SJoinLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, sortForJoinOptMayBeOptimized); + SJoinLogicNode* pJoin = (SJoinLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, sortForJoinOptMayBeOptimized, NULL); if (NULL == pJoin) { return TSDB_CODE_SUCCESS; } @@ -2562,7 +2722,7 @@ static int32_t joinCondGetAllScanNodes(SLogicNode* pNode, SNodeList** pList) { } -static bool joinCondMayBeOptimized(SLogicNode* pNode) { +static bool joinCondMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode) || OPTIMIZE_FLAG_TEST_MASK(pNode->optimizedFlag, OPTIMIZE_FLAG_JOIN_COND)) { return false; } @@ -2621,7 +2781,7 @@ static void joinCondMergeScanRand(STimeWindow* pDst, STimeWindow* pSrc) { } static int32_t joinCondOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SJoinLogicNode* pJoin = (SJoinLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, joinCondMayBeOptimized); + SJoinLogicNode* pJoin = (SJoinLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, joinCondMayBeOptimized, NULL); if (NULL == pJoin) { return TSDB_CODE_SUCCESS; } @@ -2684,7 +2844,7 @@ static int32_t joinCondOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub return TSDB_CODE_SUCCESS; } -static bool smaIndexOptMayBeOptimized(SLogicNode* pNode) { +static bool smaIndexOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(pNode) || NULL == pNode->pParent || QUERY_NODE_LOGIC_PLAN_WINDOW != nodeType(pNode->pParent) || WINDOW_TYPE_INTERVAL != ((SWindowLogicNode*)pNode->pParent)->winType) { @@ -2701,9 +2861,10 @@ static bool smaIndexOptMayBeOptimized(SLogicNode* pNode) { static int32_t smaIndexOptCreateSmaScan(SScanLogicNode* pScan, STableIndexInfo* pIndex, SNodeList* pCols, SLogicNode** pOutput) { - SScanLogicNode* pSmaScan = (SScanLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SCAN); + SScanLogicNode* pSmaScan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SCAN, (SNode**)&pSmaScan); if (NULL == pSmaScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pSmaScan->pScanCols = pCols; pSmaScan->tableType = TSDB_SUPER_TABLE; @@ -2716,11 +2877,15 @@ static int32_t smaIndexOptCreateSmaScan(SScanLogicNode* pScan, STableIndexInfo* pSmaScan->dataRequired = FUNC_DATA_REQUIRED_DATA_LOAD; pSmaScan->pVgroupList = taosMemoryCalloc(1, sizeof(SVgroupsInfo) + sizeof(SVgroupInfo)); - pSmaScan->node.pTargets = nodesCloneList(pCols); - if (NULL == pSmaScan->pVgroupList || NULL == pSmaScan->node.pTargets) { + if (!pSmaScan->pVgroupList) { nodesDestroyNode((SNode*)pSmaScan); return TSDB_CODE_OUT_OF_MEMORY; } + code = nodesCloneList(pCols, &pSmaScan->node.pTargets); + if (NULL == pSmaScan->node.pTargets) { + nodesDestroyNode((SNode*)pSmaScan); + return code; + } pSmaScan->pVgroupList->numOfVgroups = 1; pSmaScan->pVgroupList->vgroups[0].vgId = pIndex->dstVgId; memcpy(&(pSmaScan->pVgroupList->vgroups[0].epSet), &pIndex->epSet, sizeof(SEpSet)); @@ -2749,10 +2914,11 @@ static bool smaIndexOptEqualInterval(SScanLogicNode* pScan, SWindowLogicNode* pW return true; } -static SNode* smaIndexOptCreateSmaCol(SNode* pFunc, uint64_t tableId, int32_t colId) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); +static int32_t smaIndexOptCreateSmaCol(SNode* pFunc, uint64_t tableId, int32_t colId, SColumnNode** ppNode) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - return NULL; + return code; } pCol->tableId = tableId; pCol->tableType = TSDB_SUPER_TABLE; @@ -2761,7 +2927,8 @@ static SNode* smaIndexOptCreateSmaCol(SNode* pFunc, uint64_t tableId, int32_t co strcpy(pCol->colName, ((SExprNode*)pFunc)->aliasName); pCol->node.resType = ((SExprNode*)pFunc)->resType; strcpy(pCol->node.aliasName, ((SExprNode*)pFunc)->aliasName); - return (SNode*)pCol; + *ppNode = pCol; + return code; } static int32_t smaIndexOptFindSmaFunc(SNode* pQueryFunc, SNodeList* pSmaFuncs) { @@ -2799,7 +2966,12 @@ static int32_t smaIndexOptCreateSmaCols(SNodeList* pFuncs, uint64_t tableId, SNo if (smaFuncIndex < 0) { break; } else { - code = nodesListMakeStrictAppend(&pCols, smaIndexOptCreateSmaCol(pFunc, tableId, smaFuncIndex + 1)); + SColumnNode* pCol = NULL; + code = smaIndexOptCreateSmaCol(pFunc, tableId, smaFuncIndex + 1, &pCol); + if (TSDB_CODE_SUCCESS != code) { + break; + } + code = nodesListMakeStrictAppend(&pCols, (SNode*)pCol); if (TSDB_CODE_SUCCESS != code) { break; } @@ -2824,10 +2996,15 @@ static int32_t smaIndexOptCreateSmaCols(SNodeList* pFuncs, uint64_t tableId, SNo SExprNode exprNode; exprNode.resType = ((SExprNode*)pWsNode)->resType; sprintf(exprNode.aliasName, "#expr_%d", index + 1); - SNode* pkNode = smaIndexOptCreateSmaCol((SNode*)&exprNode, tableId, PRIMARYKEY_TIMESTAMP_COL_ID); - code = nodesListPushFront(pCols, pkNode); + SColumnNode* pkNode = NULL; + code = smaIndexOptCreateSmaCol((SNode*)&exprNode, tableId, PRIMARYKEY_TIMESTAMP_COL_ID, &pkNode); if (TSDB_CODE_SUCCESS != code) { - nodesDestroyNode(pkNode); + nodesDestroyList(pCols); + return code; + } + code = nodesListPushFront(pCols, (SNode*)pkNode); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pkNode); nodesDestroyList(pCols); return code; } @@ -2884,7 +3061,7 @@ static int32_t smaIndexOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogi } static int32_t smaIndexOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SScanLogicNode* pScan = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, smaIndexOptMayBeOptimized); + SScanLogicNode* pScan = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, smaIndexOptMayBeOptimized, NULL); if (NULL == pScan) { return TSDB_CODE_SUCCESS; } @@ -2968,7 +3145,7 @@ static bool partTagsOptAreSupportedFuncs(SNodeList* pFuncs) { return true; } -static bool partTagsOptMayBeOptimized(SLogicNode* pNode) { +static bool partTagsOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (!partTagsIsOptimizableNode(pNode)) { return false; } @@ -2987,14 +3164,16 @@ static void partTagsSetAlias(char* pAlias, const char* pTableAlias, const char* char name[TSDB_COL_FNAME_LEN + 1] = {0}; int32_t len = snprintf(name, TSDB_COL_FNAME_LEN, "%s.%s", pTableAlias, pColName); - taosCreateMD5Hash(name, len); + (void)taosCreateMD5Hash(name, len); strncpy(pAlias, name, TSDB_COL_NAME_LEN - 1); } -static SNode* partTagsCreateWrapperFunc(const char* pFuncName, SNode* pNode) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t partTagsCreateWrapperFunc(const char* pFuncName, SNode* pNode, SFunctionNode** ppNode) { + SNode* pNew = NULL; + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } snprintf(pFunc->functionName, sizeof(pFunc->functionName), "%s", pFuncName); @@ -3006,17 +3185,20 @@ static SNode* partTagsCreateWrapperFunc(const char* pFuncName, SNode* pNode) { } else { strcpy(pFunc->node.aliasName, ((SExprNode*)pNode)->aliasName); } - int32_t code = nodesListMakeStrictAppend(&pFunc->pParameterList, nodesCloneNode(pNode)); + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pFunc->pParameterList, pNew); + } if (TSDB_CODE_SUCCESS == code) { code = fmGetFuncInfo(pFunc, NULL, 0); } if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pFunc); - return NULL; + return code; } - - return (SNode*)pFunc; + *ppNode = pFunc; + return code; } static bool partTagsHasIndefRowsSelectFunc(SNodeList* pFuncs) { @@ -3052,10 +3234,17 @@ static int32_t partTagsRewriteGroupTagsToFuncs(SNodeList* pGroupTags, int32_t st if (index++ < start || !partTagsNeedOutput(pNode, pAgg->node.pTargets)) { continue; } + SFunctionNode* pFunc = NULL; if (hasIndefRowsSelectFunc) { - code = nodesListStrictAppend(pAgg->pAggFuncs, partTagsCreateWrapperFunc("_select_value", pNode)); + code = partTagsCreateWrapperFunc("_select_value", pNode, &pFunc); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pAgg->pAggFuncs, (SNode*)pFunc); + } } else { - code = nodesListStrictAppend(pAgg->pAggFuncs, partTagsCreateWrapperFunc("_group_key", pNode)); + code = partTagsCreateWrapperFunc("_group_key", pNode, &pFunc); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pAgg->pAggFuncs, (SNode*)pFunc); + } } if (TSDB_CODE_SUCCESS != code) { break; @@ -3065,7 +3254,7 @@ static int32_t partTagsRewriteGroupTagsToFuncs(SNodeList* pGroupTags, int32_t st } static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, partTagsOptMayBeOptimized); + SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, partTagsOptMayBeOptimized, NULL); if (NULL == pNode) { return TSDB_CODE_SUCCESS; } @@ -3108,7 +3297,11 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub if (start < 0) { start = LIST_LENGTH(pScan->pGroupTags); } - code = nodesListMakeStrictAppend(&pScan->pGroupTags, nodesCloneNode(pGroupExpr)); + SNode* pNew = NULL; + code = nodesCloneNode(pGroupExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pScan->pGroupTags, pNew); + } if (TSDB_CODE_SUCCESS != code) { break; } @@ -3128,7 +3321,8 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub return code; } -static bool eliminateProjOptCheckProjColumnNames(SProjectLogicNode* pProjectNode) { +static int32_t eliminateProjOptCheckProjColumnNames(SProjectLogicNode* pProjectNode, bool* pRet) { + int32_t code = 0; SHashObj* pProjColNameHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); SNode* pProjection; FOREACH(pProjection, pProjectNode->pProjections) { @@ -3139,14 +3333,18 @@ static bool eliminateProjOptCheckProjColumnNames(SProjectLogicNode* pProjectNode return false; } else { int32_t exist = 1; - taosHashPut(pProjColNameHash, projColumnName, strlen(projColumnName), &exist, sizeof(exist)); + code = taosHashPut(pProjColNameHash, projColumnName, strlen(projColumnName), &exist, sizeof(exist)); + if (TSDB_CODE_SUCCESS != code) { + break; + } } } taosHashCleanup(pProjColNameHash); - return true; + *pRet = true; + return code; } -static bool eliminateProjOptMayBeOptimized(SLogicNode* pNode) { +static bool eliminateProjOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { // Super table scan requires project operator to merge packets to improve performance. if (NULL == pNode->pParent && (QUERY_NODE_LOGIC_PLAN_PROJECT != nodeType(pNode) || 1 != LIST_LENGTH(pNode->pChildren) || (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(nodesListGetNode(pNode->pChildren, 0)) && @@ -3191,8 +3389,13 @@ static bool eliminateProjOptMayBeOptimized(SLogicNode* pNode) { return false; } } - - return eliminateProjOptCheckProjColumnNames(pProjectNode); + int32_t* pCode = pCtx; + bool ret = false; + int32_t code = eliminateProjOptCheckProjColumnNames(pProjectNode, &ret); + if (TSDB_CODE_SUCCESS != code) { + *pCode = code; + } + return ret; } typedef struct CheckNewChildTargetsCxt { @@ -3252,7 +3455,7 @@ static void alignProjectionWithTarget(SLogicNode* pNode) { } } if (!keep) { - nodesListErase(pProjectNode->pProjections, cell); + (void)nodesListErase(pProjectNode->pProjections, cell); } } } @@ -3275,9 +3478,14 @@ static EDealRes eliminateProjOptRewriteScanTableAlias(SNode* pNode, void* pConte static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan, SProjectLogicNode* pProjectNode) { SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pProjectNode->node.pChildren, 0); + int32_t code = 0; if (NULL == pProjectNode->node.pParent) { - SNodeList* pNewChildTargets = nodesMakeList(); + SNodeList* pNewChildTargets = NULL; + code = nodesMakeList(&pNewChildTargets); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SNode * pProjection = NULL, *pChildTarget = NULL; bool orderMatch = true; bool needOrderMatch = @@ -3292,18 +3500,34 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* orderMatch = false; break; } - nodesListAppend(pNewChildTargets, nodesCloneNode(pChildTarget)); + SNode* pNew = NULL; + code = nodesCloneNode(pChildTarget, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pNewChildTargets, pNew); + } + if (TSDB_CODE_SUCCESS != code) break; } } else { FOREACH(pProjection, pProjectNode->pProjections) { FOREACH(pChildTarget, pChild->pTargets) { if (0 == strcmp(((SColumnNode*)pProjection)->colName, ((SColumnNode*)pChildTarget)->colName)) { - nodesListAppend(pNewChildTargets, nodesCloneNode(pChildTarget)); + SNode* pNew = NULL; + code = nodesCloneNode(pChildTarget, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pNewChildTargets, pNew); + } break; } } + if (TSDB_CODE_SUCCESS != code) { + break; + } } } + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pNewChildTargets); + return code; + } if (eliminateProjOptCanChildConditionUseChildTargets(pChild, pNewChildTargets) && (!needOrderMatch || (needOrderMatch && orderMatch))) { @@ -3324,9 +3548,11 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* nodesWalkExprs(pChild->pTargets, eliminateProjOptRewriteScanTableAlias, &cxt); } - int32_t code = replaceLogicNode(pLogicSubplan, (SLogicNode*)pProjectNode, pChild); - if (pProjectNode->node.pHint && !pChild->pHint) TSWAP(pProjectNode->node.pHint, pChild->pHint); if (TSDB_CODE_SUCCESS == code) { + code = replaceLogicNode(pLogicSubplan, (SLogicNode*)pProjectNode, pChild); + } + if (TSDB_CODE_SUCCESS == code) { + if (pProjectNode->node.pHint && !pChild->pHint) TSWAP(pProjectNode->node.pHint, pChild->pHint); NODES_CLEAR_LIST(pProjectNode->node.pChildren); nodesDestroyNode((SNode*)pProjectNode); // if pChild is a project logic node, remove its projection which is not reference by its target. @@ -3337,8 +3563,9 @@ static int32_t eliminateProjOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* } static int32_t eliminateProjOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { + int32_t code = 0; SProjectLogicNode* pProjectNode = - (SProjectLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, eliminateProjOptMayBeOptimized); + (SProjectLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, eliminateProjOptMayBeOptimized, &code); if (NULL == pProjectNode) { return TSDB_CODE_SUCCESS; @@ -3347,28 +3574,32 @@ static int32_t eliminateProjOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLog return eliminateProjOptimizeImpl(pCxt, pLogicSubplan, pProjectNode); } -static bool rewriteTailOptMayBeOptimized(SLogicNode* pNode) { +static bool rewriteTailOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { return QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC == nodeType(pNode) && ((SIndefRowsFuncLogicNode*)pNode)->isTailFunc; } -static SNode* rewriteTailOptCreateOrderByExpr(SNode* pSortKey) { - SOrderByExprNode* pOrder = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); +static int32_t rewriteTailOptCreateOrderByExpr(SNode* pSortKey, SNode** ppNode) { + SOrderByExprNode* pOrder = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOrder); if (NULL == pOrder) { - return NULL; + return code; } pOrder->order = ORDER_DESC; - pOrder->pExpr = nodesCloneNode(pSortKey); + pOrder->pExpr = NULL; + code = nodesCloneNode(pSortKey, &pOrder->pExpr); if (NULL == pOrder->pExpr) { nodesDestroyNode((SNode*)pOrder); - return NULL; + return code; } - return (SNode*)pOrder; + *ppNode = (SNode*)pOrder; + return code; } static int32_t rewriteTailOptCreateLimit(SNode* pLimit, SNode* pOffset, SNode** pOutput) { - SLimitNode* pLimitNode = (SLimitNode*)nodesMakeNode(QUERY_NODE_LIMIT); + SLimitNode* pLimitNode = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LIMIT, (SNode**)&pLimitNode); if (NULL == pLimitNode) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pLimitNode->limit = NULL == pLimit ? -1 : ((SValueNode*)pLimit)->datum.i; pLimitNode->offset = NULL == pOffset ? 0 : ((SValueNode*)pOffset)->datum.i; @@ -3386,9 +3617,10 @@ static bool rewriteTailOptNeedGroupSort(SIndefRowsFuncLogicNode* pIndef) { } static int32_t rewriteTailOptCreateSort(SIndefRowsFuncLogicNode* pIndef, SLogicNode** pOutput) { - SSortLogicNode* pSort = (SSortLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT); + SSortLogicNode* pSort = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT, (SNode**)&pSort); if (NULL == pSort) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pSort->groupSort = rewriteTailOptNeedGroupSort(pIndef); @@ -3408,13 +3640,13 @@ static int32_t rewriteTailOptCreateSort(SIndefRowsFuncLogicNode* pIndef, SLogicN // tail(expr, [limit, offset,] _rowts) int32_t rowtsIndex = LIST_LENGTH(pTail->pParameterList) - 1; - int32_t code = nodesListMakeStrictAppend( - &pSort->pSortKeys, rewriteTailOptCreateOrderByExpr(nodesListGetNode(pTail->pParameterList, rowtsIndex))); + SNode* pNewNode = NULL; + code = rewriteTailOptCreateOrderByExpr(nodesListGetNode(pTail->pParameterList, rowtsIndex), &pNewNode); if (TSDB_CODE_SUCCESS == code) { - pSort->node.pTargets = nodesCloneList(((SLogicNode*)nodesListGetNode(pSort->node.pChildren, 0))->pTargets); - if (NULL == pSort->node.pTargets) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesListMakeStrictAppend(&pSort->pSortKeys, pNewNode); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneList(((SLogicNode*)nodesListGetNode(pSort->node.pChildren, 0))->pTargets, &pSort->node.pTargets); } if (TSDB_CODE_SUCCESS == code) { @@ -3426,17 +3658,20 @@ static int32_t rewriteTailOptCreateSort(SIndefRowsFuncLogicNode* pIndef, SLogicN return code; } -static SNode* rewriteTailOptCreateProjectExpr(SFunctionNode* pFunc) { - SNode* pExpr = nodesCloneNode(nodesListGetNode(pFunc->pParameterList, 0)); +static int32_t rewriteTailOptCreateProjectExpr(SFunctionNode* pFunc, SNode** ppNode) { + SNode* pExpr = NULL; + int32_t code = nodesCloneNode(nodesListGetNode(pFunc->pParameterList, 0), &pExpr); if (NULL == pExpr) { - return NULL; + return code; } strcpy(((SExprNode*)pExpr)->aliasName, pFunc->node.aliasName); - return pExpr; + *ppNode = pExpr; + return code; } static int32_t rewriteTailOptCreateProject(SIndefRowsFuncLogicNode* pIndef, SLogicNode** pOutput) { - SProjectLogicNode* pProject = (SProjectLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT); + SProjectLogicNode* pProject = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT, (SNode**)&pProject); if (NULL == pProject) { return TSDB_CODE_OUT_OF_MEMORY; } @@ -3444,11 +3679,14 @@ static int32_t rewriteTailOptCreateProject(SIndefRowsFuncLogicNode* pIndef, SLog TSWAP(pProject->node.pTargets, pIndef->node.pTargets); pProject->node.precision = pIndef->node.precision; - int32_t code = TSDB_CODE_SUCCESS; SFunctionNode* pTail = NULL; SNode* pFunc = NULL; FOREACH(pFunc, pIndef->pFuncs) { - code = nodesListMakeStrictAppend(&pProject->pProjections, rewriteTailOptCreateProjectExpr((SFunctionNode*)pFunc)); + SNode* pNew = NULL; + code = rewriteTailOptCreateProjectExpr((SFunctionNode*)pFunc, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pProject->pProjections, pNew); + } if (TSDB_CODE_SUCCESS != code) { break; } @@ -3501,7 +3739,7 @@ static int32_t rewriteTailOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* pL static int32_t rewriteTailOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { SIndefRowsFuncLogicNode* pIndef = - (SIndefRowsFuncLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, rewriteTailOptMayBeOptimized); + (SIndefRowsFuncLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, rewriteTailOptMayBeOptimized, NULL); if (NULL == pIndef) { return TSDB_CODE_SUCCESS; @@ -3510,7 +3748,7 @@ static int32_t rewriteTailOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic return rewriteTailOptimizeImpl(pCxt, pLogicSubplan, pIndef); } -static bool eliminateSetOpMayBeOptimized(SLogicNode* pNode) { +static bool eliminateSetOpMayBeOptimized(SLogicNode* pNode, void* pCtx) { SLogicNode* pParent = pNode->pParent; if (NULL == pParent || QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pParent) && QUERY_NODE_LOGIC_PLAN_PROJECT != nodeType(pParent) || @@ -3543,7 +3781,7 @@ static int32_t eliminateSetOpOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* } static int32_t eliminateSetOpOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pSetOpNode = optFindPossibleNode(pLogicSubplan->pNode, eliminateSetOpMayBeOptimized); + SLogicNode* pSetOpNode = optFindPossibleNode(pLogicSubplan->pNode, eliminateSetOpMayBeOptimized, NULL); if (NULL == pSetOpNode) { return TSDB_CODE_SUCCESS; } @@ -3551,28 +3789,35 @@ static int32_t eliminateSetOpOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLo return eliminateSetOpOptimizeImpl(pCxt, pLogicSubplan, pSetOpNode); } -static bool rewriteUniqueOptMayBeOptimized(SLogicNode* pNode) { +static bool rewriteUniqueOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { return QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC == nodeType(pNode) && ((SIndefRowsFuncLogicNode*)pNode)->isUniqueFunc; } -static SNode* rewriteUniqueOptCreateGroupingSet(SNode* pExpr) { - SGroupingSetNode* pGroupingSet = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET); +static int32_t rewriteUniqueOptCreateGroupingSet(SNode* pExpr, SNode** ppNode) { + SGroupingSetNode* pGroupingSet = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_GROUPING_SET, (SNode**)&pGroupingSet); if (NULL == pGroupingSet) { - return NULL; + return code; } pGroupingSet->groupingSetType = GP_TYPE_NORMAL; - SExprNode* pGroupExpr = (SExprNode*)nodesCloneNode(pExpr); - if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pGroupingSet->pParameterList, (SNode*)pGroupExpr)) { - nodesDestroyNode((SNode*)pGroupingSet); - return NULL; + SExprNode* pGroupExpr = NULL; + code = nodesCloneNode(pExpr, (SNode**)&pGroupExpr); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pGroupingSet->pParameterList, (SNode*)pGroupExpr); } - return (SNode*)pGroupingSet; + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pGroupingSet); + return code; + } + *ppNode = (SNode*)pGroupingSet; + return code; } -static SNode* rewriteUniqueOptCreateFirstFunc(SFunctionNode* pSelectValue, SNode* pCol) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t rewriteUniqueOptCreateFirstFunc(SFunctionNode* pSelectValue, SNode* pCol, SNode** ppNode) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } strcpy(pFunc->functionName, "first"); @@ -3582,26 +3827,31 @@ static SNode* rewriteUniqueOptCreateFirstFunc(SFunctionNode* pSelectValue, SNode int64_t pointer = (int64_t)pFunc; char name[TSDB_FUNC_NAME_LEN + TSDB_POINTER_PRINT_BYTES + TSDB_NAME_DELIMITER_LEN + 1] = {0}; int32_t len = snprintf(name, sizeof(name) - 1, "%s.%" PRId64 "", pFunc->functionName, pointer); - taosCreateMD5Hash(name, len); + (void)taosCreateMD5Hash(name, len); strncpy(pFunc->node.aliasName, name, TSDB_COL_NAME_LEN - 1); } - int32_t code = nodesListMakeStrictAppend(&pFunc->pParameterList, nodesCloneNode(pCol)); + SNode* pNew = NULL; + code = nodesCloneNode(pCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pFunc->pParameterList, pNew); + } if (TSDB_CODE_SUCCESS == code) { code = fmGetFuncInfo(pFunc, NULL, 0); } if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pFunc); - return NULL; + return code; } - - return (SNode*)pFunc; + *ppNode = (SNode*)pFunc; + return code; } static int32_t rewriteUniqueOptCreateAgg(SIndefRowsFuncLogicNode* pIndef, SLogicNode** pOutput) { - SAggLogicNode* pAgg = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); + SAggLogicNode* pAgg = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG, (SNode**)&pAgg); if (NULL == pAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } TSWAP(pAgg->node.pChildren, pIndef->node.pChildren); @@ -3610,7 +3860,6 @@ static int32_t rewriteUniqueOptCreateAgg(SIndefRowsFuncLogicNode* pIndef, SLogic pAgg->node.requireDataOrder = DATA_ORDER_LEVEL_IN_BLOCK; // first function requirement pAgg->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - int32_t code = TSDB_CODE_SUCCESS; bool hasSelectPrimaryKey = false; SNode* pPrimaryKey = NULL; SNode* pNode = NULL; @@ -3619,12 +3868,24 @@ static int32_t rewriteUniqueOptCreateAgg(SIndefRowsFuncLogicNode* pIndef, SLogic SNode* pExpr = nodesListGetNode(pFunc->pParameterList, 0); if (FUNCTION_TYPE_UNIQUE == pFunc->funcType) { pPrimaryKey = nodesListGetNode(pFunc->pParameterList, 1); - code = nodesListMakeStrictAppend(&pAgg->pGroupKeys, rewriteUniqueOptCreateGroupingSet(pExpr)); + SNode* pNew = NULL; + code = rewriteUniqueOptCreateGroupingSet(pExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pAgg->pGroupKeys, pNew); + } } else if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pExpr)->colId) { // _select_value(ts) => first(ts) hasSelectPrimaryKey = true; - code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, rewriteUniqueOptCreateFirstFunc(pFunc, pExpr)); + SNode* pNew = NULL; + code = rewriteUniqueOptCreateFirstFunc(pFunc, pExpr, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, pNew); + } } else { // _select_value(other_col) - code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, pNew); + } } if (TSDB_CODE_SUCCESS != code) { break; @@ -3639,7 +3900,11 @@ static int32_t rewriteUniqueOptCreateAgg(SIndefRowsFuncLogicNode* pIndef, SLogic } if (TSDB_CODE_SUCCESS == code && !hasSelectPrimaryKey && NULL != pAgg->pAggFuncs) { - code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, rewriteUniqueOptCreateFirstFunc(NULL, pPrimaryKey)); + SNode* pNew = NULL; + code = rewriteUniqueOptCreateFirstFunc(NULL, pPrimaryKey, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pAgg->pAggFuncs, pNew); + } } if (TSDB_CODE_SUCCESS == code) { @@ -3650,10 +3915,11 @@ static int32_t rewriteUniqueOptCreateAgg(SIndefRowsFuncLogicNode* pIndef, SLogic return code; } -static SNode* rewriteUniqueOptCreateProjectCol(SFunctionNode* pFunc) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); +static int32_t rewriteUniqueOptCreateProjectCol(SFunctionNode* pFunc, SNode** ppNode) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - return NULL; + return code; } pCol->node.resType = pFunc->node.resType; @@ -3669,14 +3935,15 @@ static SNode* rewriteUniqueOptCreateProjectCol(SFunctionNode* pFunc) { strcpy(pCol->colName, pFunc->node.aliasName); } strcpy(pCol->node.aliasName, pFunc->node.aliasName); - - return (SNode*)pCol; + *ppNode = (SNode*)pCol; + return code; } static int32_t rewriteUniqueOptCreateProject(SIndefRowsFuncLogicNode* pIndef, SLogicNode** pOutput) { - SProjectLogicNode* pProject = (SProjectLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT); + SProjectLogicNode* pProject = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PROJECT, (SNode**)&pProject); if (NULL == pProject) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } TSWAP(pProject->node.pTargets, pIndef->node.pTargets); @@ -3684,10 +3951,13 @@ static int32_t rewriteUniqueOptCreateProject(SIndefRowsFuncLogicNode* pIndef, SL pProject->node.requireDataOrder = DATA_ORDER_LEVEL_NONE; pProject->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - int32_t code = TSDB_CODE_SUCCESS; SNode* pNode = NULL; FOREACH(pNode, pIndef->pFuncs) { - code = nodesListMakeStrictAppend(&pProject->pProjections, rewriteUniqueOptCreateProjectCol((SFunctionNode*)pNode)); + SNode* pNew = NULL; + code = rewriteUniqueOptCreateProjectCol((SFunctionNode*)pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pProject->pProjections, pNew); + } if (TSDB_CODE_SUCCESS != code) { break; } @@ -3734,7 +4004,7 @@ static int32_t rewriteUniqueOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* static int32_t rewriteUniqueOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { SIndefRowsFuncLogicNode* pIndef = - (SIndefRowsFuncLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, rewriteUniqueOptMayBeOptimized); + (SIndefRowsFuncLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, rewriteUniqueOptMayBeOptimized, NULL); if (NULL == pIndef) { return TSDB_CODE_SUCCESS; @@ -3893,7 +4163,7 @@ static bool lastRowScanOptCheckLastCache(SAggLogicNode* pAgg, SScanLogicNode* pS return true; } -static bool lastRowScanOptMayBeOptimized(SLogicNode* pNode) { +static bool lastRowScanOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode) || 1 != LIST_LENGTH(pNode->pChildren) || QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(nodesListGetNode(pNode->pChildren, 0))) { return false; @@ -3923,13 +4193,17 @@ typedef struct SLastRowScanOptSetColDataTypeCxt { SNodeList* pOtherCols; int32_t funcType; int32_t pkBytes; + int32_t code; } SLastRowScanOptSetColDataTypeCxt; static EDealRes lastRowScanOptSetColDataType(SNode* pNode, void* pContext) { if (QUERY_NODE_COLUMN == nodeType(pNode)) { SLastRowScanOptSetColDataTypeCxt* pCxt = pContext; if (pCxt->doAgg) { - nodesListMakeAppend(&pCxt->pLastCols, pNode); + pCxt->code = nodesListMakeAppend(&pCxt->pLastCols, pNode); + if (TSDB_CODE_SUCCESS != pCxt->code) { + return DEAL_RES_ERROR; + } getLastCacheDataType(&(((SColumnNode*)pNode)->node.resType), pCxt->pkBytes); } else { SNode* pCol = NULL; @@ -4022,14 +4296,17 @@ static int32_t lastRowScanBuildFuncTypes(SScanLogicNode* pScan, SColumnNode* pCo } pFuncTypeParam->pCol->colId = pColNode->colId; strcpy(pFuncTypeParam->pCol->name, pColNode->colName); - taosArrayPush(pScan->pFuncTypes, pFuncTypeParam); + if (NULL == taosArrayPush(pScan->pFuncTypes, pFuncTypeParam)) { + taosMemoryFree(pFuncTypeParam); + return TSDB_CODE_OUT_OF_MEMORY; + } taosMemoryFree(pFuncTypeParam); return TSDB_CODE_SUCCESS; } static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SAggLogicNode* pAgg = (SAggLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, lastRowScanOptMayBeOptimized); + SAggLogicNode* pAgg = (SAggLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, lastRowScanOptMayBeOptimized, NULL); if (NULL == pAgg) { return TSDB_CODE_SUCCESS; @@ -4046,24 +4323,26 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic SNodeList* pLastRowCols = NULL; bool adjLastRowTsColName = false; char tsColName[TSDB_COL_NAME_LEN] = {0}; + int32_t code = 0; FOREACH(pNode, pAgg->pAggFuncs) { SFunctionNode* pFunc = (SFunctionNode*)pNode; int32_t funcType = pFunc->funcType; SNode* pParamNode = NULL; if (FUNCTION_TYPE_LAST == funcType) { - nodesListErase(pFunc->pParameterList, nodesListGetCell(pFunc->pParameterList, 1)); + (void)nodesListErase(pFunc->pParameterList, nodesListGetCell(pFunc->pParameterList, 1)); nodesWalkExpr(nodesListGetNode(pFunc->pParameterList, 0), lastRowScanOptSetColDataType, &cxt); + if (TSDB_CODE_SUCCESS != cxt.code) break; } FOREACH(pParamNode, pFunc->pParameterList) { if (FUNCTION_TYPE_LAST_ROW == funcType || FUNCTION_TYPE_LAST == funcType) { int32_t len = snprintf(pFunc->functionName, sizeof(pFunc->functionName), FUNCTION_TYPE_LAST_ROW == funcType ? "_cache_last_row" : "_cache_last"); pFunc->functionName[len] = '\0'; - int32_t code = fmGetFuncInfo(pFunc, NULL, 0); + code = fmGetFuncInfo(pFunc, NULL, 0); if (TSDB_CODE_SUCCESS != code) { nodesClearList(cxt.pLastCols); - return code; + break; } cxt.funcType = pFunc->funcType; cxt.pkBytes = (pFunc->hasPk) ? pFunc->pkBytes : 0; @@ -4076,7 +4355,10 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic bool isDup = false; bool* isDuplicate = taosArrayGet(isDuplicateCol, i); if (NULL == isDuplicate) { - taosArrayInsert(isDuplicateCol, i, &isDup); + if (NULL == taosArrayInsert(isDuplicateCol, i, &isDup)) { + code = terrno; + break; + } isDuplicate = taosArrayGet(isDuplicateCol, i); } i++; @@ -4085,7 +4367,11 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic if (0 == strncmp(((SColumnNode*)pColNode)->colName, "#dup_col.", 9)) { continue; } - SNode* newColNode = nodesCloneNode(pColNode); + SNode* newColNode = NULL; + code = nodesCloneNode(pColNode, &newColNode); + if (TSDB_CODE_SUCCESS != code) { + break; + } sprintf(((SColumnNode*)newColNode)->colName, "#dup_col.%p", newColNode); sprintf(((SColumnNode*)pParamNode)->colName, "#dup_col.%p", newColNode); if (FUNCTION_TYPE_LAST_ROW == funcType && @@ -4100,51 +4386,82 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic } } - nodesListAppend(pScan->pScanCols, newColNode); + code = nodesListStrictAppend(pScan->pScanCols, newColNode); + if (TSDB_CODE_SUCCESS != code) break; isDup = true; - taosArrayInsert(isDuplicateCol, pScan->pScanCols->length, &isDup); - nodesListAppend(pScan->node.pTargets, nodesCloneNode(newColNode)); + if (NULL == taosArrayInsert(isDuplicateCol, pScan->pScanCols->length, &isDup)) { + code = terrno; + break; + } + SNode* pNew = NULL; + code = nodesCloneNode(newColNode, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListStrictAppend(pScan->node.pTargets, pNew); + if (TSDB_CODE_SUCCESS != code) break; if (funcType != FUNCTION_TYPE_LAST) { - nodesListMakeAppend(&pLastRowCols, nodesCloneNode(newColNode)); + pNew = NULL; + code = nodesCloneNode(newColNode, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeAppend(&pLastRowCols, pNew); + if (TSDB_CODE_SUCCESS != code) break; } - lastRowScanBuildFuncTypes(pScan, (SColumnNode*)newColNode, pFunc->funcType); + code = lastRowScanBuildFuncTypes(pScan, (SColumnNode*)newColNode, pFunc->funcType); + if (TSDB_CODE_SUCCESS != code) break; } else { isDup = true; *isDuplicate = isDup; if (funcType != FUNCTION_TYPE_LAST && !nodeListNodeEqual(cxt.pLastCols, pColNode)) { - nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pColNode, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeStrictAppend(&pLastRowCols, pNew); + if (TSDB_CODE_SUCCESS != code) break; } - lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType); + code = lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType); + if (TSDB_CODE_SUCCESS != code) break; } continue; - }else if (nodeListNodeEqual(pFunc->pParameterList, pColNode)) { + } else if (nodeListNodeEqual(pFunc->pParameterList, pColNode)) { if (funcType != FUNCTION_TYPE_LAST && ((SColumnNode*)pColNode)->colId == PRIMARYKEY_TIMESTAMP_COL_ID && !nodeListNodeEqual(pLastRowCols, pColNode)) { - nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pColNode, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeAppend(&pLastRowCols, pNew); + if (TSDB_CODE_SUCCESS != code) break; - lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType); + code = lastRowScanBuildFuncTypes(pScan, (SColumnNode*)pColNode, pFunc->funcType); + if (TSDB_CODE_SUCCESS != code) break; isDup = true; *isDuplicate = isDup; } } } + if (TSDB_CODE_SUCCESS != code) break;; FOREACH(pColNode, pScan->pScanPseudoCols) { if (nodesEqualNode(pParamNode, pColNode)) { if (funcType != FUNCTION_TYPE_LAST) { - nodesListMakeAppend(&pLastRowCols, nodesCloneNode(pColNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pColNode, &pNew); + if (TSDB_CODE_SUCCESS != code) break; + code = nodesListMakeAppend(&pLastRowCols, pNew); + if (TSDB_CODE_SUCCESS != code) break; } } } } } + if (TSDB_CODE_SUCCESS != code) break; if (pFunc->hasPk) { - nodesListMakeAppend(&cxt.pOtherCols, nodesListGetNode(pFunc->pParameterList, LIST_LENGTH(pFunc->pParameterList) - 1)); + code = nodesListMakeAppend(&cxt.pOtherCols, nodesListGetNode(pFunc->pParameterList, LIST_LENGTH(pFunc->pParameterList) - 1)); } + if (TSDB_CODE_SUCCESS != code) break; } else { pNode = nodesListGetNode(pFunc->pParameterList, 0); - nodesListMakeAppend(&cxt.pOtherCols, pNode); + code = nodesListMakeAppend(&cxt.pOtherCols, pNode); + if (TSDB_CODE_SUCCESS != code) break; if (FUNCTION_TYPE_SELECT_VALUE == funcType) { if (nodeType(pNode) == QUERY_NODE_COLUMN) { @@ -4158,6 +4475,13 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic } } } + if (TSDB_CODE_SUCCESS != code) break; + } + + if (TSDB_CODE_SUCCESS != code) { + taosArrayDestroy(isDuplicateCol); + nodesClearList(cxt.pLastCols); + return code; } if (NULL != cxt.pLastCols) { @@ -4166,7 +4490,12 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic lastRowScanOptSetLastTargets(pScan->pScanCols, cxt.pLastCols, pLastRowCols, true, cxt.pkBytes); nodesWalkExprs(pScan->pScanPseudoCols, lastRowScanOptSetColDataType, &cxt); - + if (TSDB_CODE_SUCCESS != cxt.code) { + nodesClearList(cxt.pLastCols); + nodesClearList(cxt.pOtherCols); + taosArrayDestroy(isDuplicateCol); + return cxt.code; + } lastRowScanOptSetLastTargets(pScan->node.pTargets, cxt.pLastCols, pLastRowCols, false, cxt.pkBytes); lastRowScanOptRemoveUslessTargets(pScan->node.pTargets, cxt.pLastCols, cxt.pOtherCols, pLastRowCols); if (pPKTsCol && @@ -4174,14 +4503,28 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic (pScan->node.pTargets->length == 2 && cxt.pkBytes > 0))) { // when select last(ts),tbname,ts from ..., we add another ts to targets sprintf(pPKTsCol->colName, "#sel_val.%p", pPKTsCol); - nodesListAppend(pScan->node.pTargets, nodesCloneNode((SNode*)pPKTsCol)); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pPKTsCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListAppend(pScan->node.pTargets, pNew); + } + if (TSDB_CODE_SUCCESS != code) { + nodesClearList(cxt.pLastCols); + nodesClearList(cxt.pOtherCols); + taosArrayDestroy(isDuplicateCol); + return code; + } } if (pNonPKCol && cxt.pLastCols->length == 1 && nodesEqualNode((SNode*)pNonPKCol, nodesListGetNode(cxt.pLastCols, 0))) { // when select last(c1), c1 from ..., we add c1 to targets sprintf(pNonPKCol->colName, "#sel_val.%p", pNonPKCol); - nodesListAppend(pScan->node.pTargets, nodesCloneNode((SNode*)pNonPKCol)); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pNonPKCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListAppend(pScan->node.pTargets, pNew); + } } nodesClearList(cxt.pLastCols); @@ -4196,7 +4539,7 @@ static int32_t lastRowScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogic return TSDB_CODE_SUCCESS; } -static bool splitCacheLastFuncOptMayBeOptimized(SLogicNode* pNode) { +static bool splitCacheLastFuncOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode) || 1 != LIST_LENGTH(pNode->pChildren) || QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(nodesListGetNode(pNode->pChildren, 0))) { return false; @@ -4222,11 +4565,12 @@ static bool splitCacheLastFuncOptMayBeOptimized(SLogicNode* pNode) { static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, SAggLogicNode* pAgg, SNodeList* pFunc, SNodeList* pTargets) { - SAggLogicNode* pNew = (SAggLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG); + SAggLogicNode* pNew = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_AGG, (SNode**)&pNew); if (NULL == pNew) { nodesDestroyList(pFunc); nodesDestroyList(pTargets); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pNew->hasLastRow = false; @@ -4249,14 +4593,25 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, pNew->node.resultDataOrder = pAgg->node.resultDataOrder; pNew->node.pTargets = pTargets; pNew->pAggFuncs = pFunc; - pNew->pGroupKeys = nodesCloneList(pAgg->pGroupKeys); - pNew->node.pConditions = nodesCloneNode(pAgg->node.pConditions); + code = nodesCloneList(pAgg->pGroupKeys, &pNew->pGroupKeys); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); + return code; + } + code = nodesCloneNode(pAgg->node.pConditions, &pNew->node.pConditions); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); + return code; + } pNew->isGroupTb = pAgg->isGroupTb; pNew->isPartTb = pAgg->isPartTb; pNew->hasGroup = pAgg->hasGroup; - pNew->node.pChildren = nodesCloneList(pAgg->node.pChildren); + code = nodesCloneList(pAgg->node.pChildren, &pNew->node.pChildren); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); + return code; + } - int32_t code = 0; SNode* pNode = nodesListGetNode(pNew->node.pChildren, 0); if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) { SScanLogicNode* pScan = (SScanLogicNode*)pNode; @@ -4266,15 +4621,21 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, pScan->pScanPseudoCols = NULL; nodesDestroyList(pScan->node.pTargets); pScan->node.pTargets = NULL; - SNodeListNode* list = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); - if (!list) return TSDB_CODE_OUT_OF_MEMORY; + SNodeListNode* list = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&list); + if (!list) { + nodesDestroyNode((SNode*)pNew); + return code; + } list->pNodeList = pFunc; code = nodesCollectColumnsFromNode((SNode*)list, NULL, COLLECT_COL_TYPE_COL, &pScan->pScanCols); if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); return code; } code = nodesCollectColumnsFromNode((SNode*)list, NULL, COLLECT_COL_TYPE_TAG, &pScan->pScanPseudoCols); if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); return code; } nodesFree(list); @@ -4288,18 +4649,28 @@ static int32_t splitCacheLastFuncOptCreateAggLogicNode(SAggLogicNode** pNewAgg, if (!found) { FOREACH(pNode, pOldScanCols) { if (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pNode)->colId) { - nodesListMakeStrictAppend(&pScan->pScanCols, nodesCloneNode(pNode)); + SNode* pTmp = NULL; + code = nodesCloneNode(pNode, &pTmp); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pScan->pScanCols, pTmp); + } break; } } + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); + return code; + } } nodesDestroyList(pOldScanCols); code = createColumnByRewriteExprs(pScan->pScanCols, &pScan->node.pTargets); if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); return code; } code = createColumnByRewriteExprs(pScan->pScanPseudoCols, &pScan->node.pTargets); if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pNew); return code; } OPTIMIZE_FLAG_CLEAR_MASK(pScan->node.optimizedFlag, OPTIMIZE_FLAG_SCAN_PATH); @@ -4319,21 +4690,28 @@ static int32_t splitCacheLastFuncOptModifyAggLogicNode(SAggLogicNode* pAgg) { static int32_t splitCacheLastFuncOptCreateMergeLogicNode(SMergeLogicNode** pNew, SAggLogicNode* pAgg1, SAggLogicNode* pAgg2) { - SMergeLogicNode* pMerge = (SMergeLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_MERGE); + SMergeLogicNode* pMerge = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_MERGE, (SNode**)&pMerge); if (NULL == pMerge) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pMerge->colsMerge = true; pMerge->numOfChannels = 2; pMerge->srcGroupId = -1; pMerge->node.precision = pAgg1->node.precision; - SNode* pNewAgg1 = nodesCloneNode((SNode*)pAgg1); - SNode* pNewAgg2 = nodesCloneNode((SNode*)pAgg2); - if (NULL == pNewAgg1 || NULL == pNewAgg2) { + SNode* pNewAgg1 = NULL; + code = nodesCloneNode((SNode*)pAgg1, &pNewAgg1); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pMerge); + return code; + } + SNode* pNewAgg2 = NULL; + code = nodesCloneNode((SNode*)pAgg2, &pNewAgg2); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode(pNewAgg1); - nodesDestroyNode(pNewAgg2); - return TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)pMerge); + return code; } ((SAggLogicNode*)pNewAgg1)->node.pParent = (SLogicNode*)pMerge; @@ -4343,9 +4721,17 @@ static int32_t splitCacheLastFuncOptCreateMergeLogicNode(SMergeLogicNode** pNew, FOREACH(pNode, ((SAggLogicNode*)pNewAgg1)->node.pChildren) { ((SLogicNode*)pNode)->pParent = (SLogicNode*)pNewAgg1; } FOREACH(pNode, ((SAggLogicNode*)pNewAgg2)->node.pChildren) { ((SLogicNode*)pNode)->pParent = (SLogicNode*)pNewAgg2; } - int32_t code = nodesListMakeStrictAppendList(&pMerge->node.pTargets, nodesCloneList(pAgg1->node.pTargets)); + SNodeList* pNewTargets1 = NULL; + code = nodesCloneList(pAgg1->node.pTargets, &pNewTargets1); if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppendList(&pMerge->node.pTargets, nodesCloneList(pAgg2->node.pTargets)); + code = nodesListMakeStrictAppendList(&pMerge->node.pTargets, pNewTargets1); + } + SNodeList* pNewTargets2 = NULL; + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneList(pAgg2->node.pTargets, &pNewTargets2); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppendList(&pMerge->node.pTargets, pNewTargets2); } if (TSDB_CODE_SUCCESS == code) { code = nodesListMakeStrictAppend(&pMerge->node.pChildren, pNewAgg1); @@ -4366,14 +4752,15 @@ static int32_t splitCacheLastFuncOptCreateMergeLogicNode(SMergeLogicNode** pNew, } static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SAggLogicNode* pAgg = (SAggLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, splitCacheLastFuncOptMayBeOptimized); + SAggLogicNode* pAgg = (SAggLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, splitCacheLastFuncOptMayBeOptimized, NULL); if (NULL == pAgg) { return TSDB_CODE_SUCCESS; } SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pAgg->node.pChildren, 0); - SNode* pNode = NULL; - SNodeList* pAggFuncList = NULL; + SNode* pNode = NULL; + SNodeList* pAggFuncList = NULL; + int32_t code = 0; { bool hasLast = false; @@ -4383,7 +4770,14 @@ static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* int32_t funcType = pFunc->funcType; if (isNeedSplitCacheLastFunc(pFunc, pScan)) { - nodesListMakeStrictAppend(&pAggFuncList, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pAggFuncList, pNew); + } + if (TSDB_CODE_SUCCESS != code) { + break; + } ERASE_NODE(pAgg->pAggFuncs); continue; } @@ -4397,6 +4791,10 @@ static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* pAgg->hasLast = hasLast; pAgg->hasLastRow = hasLastRow; } + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pAggFuncList); + return code; + } if (NULL == pAggFuncList) { planError("empty agg func list while splite projections, funcNum:%d", pAgg->pAggFuncs->length); @@ -4412,11 +4810,18 @@ static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* FOREACH(pFuncNode, pAggFuncList) { SFunctionNode* pFunc = (SFunctionNode*)pFuncNode; if (0 == strcmp(pFunc->node.aliasName, pCol->colName)) { - nodesListMakeStrictAppend(&pTargets, nodesCloneNode(pNode)); + SNode* pNew = NULL; + code = nodesCloneNode(pNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pTargets, pNew); + } found = true; break; } } + if (TSDB_CODE_SUCCESS != code) { + break; + } if (found) { ERASE_NODE(pAgg->node.pTargets); continue; @@ -4424,6 +4829,10 @@ static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* WHERE_NEXT; } } + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyList(pTargets); + return code; + } if (NULL == pTargets) { planError("empty target func list while splite projections, targetsNum:%d", pAgg->node.pTargets->length); @@ -4433,7 +4842,7 @@ static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* SMergeLogicNode* pMerge = NULL; SAggLogicNode* pNewAgg = NULL; - int32_t code = splitCacheLastFuncOptCreateAggLogicNode(&pNewAgg, pAgg, pAggFuncList, pTargets); + code = splitCacheLastFuncOptCreateAggLogicNode(&pNewAgg, pAgg, pAggFuncList, pTargets); if (TSDB_CODE_SUCCESS == code) { code = splitCacheLastFuncOptModifyAggLogicNode(pAgg); } @@ -4456,7 +4865,7 @@ static int32_t splitCacheLastFuncOptimize(SOptimizeContext* pCxt, SLogicSubplan* } // merge projects -static bool mergeProjectsMayBeOptimized(SLogicNode* pNode) { +static bool mergeProjectsMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_PROJECT != nodeType(pNode) || 1 != LIST_LENGTH(pNode->pChildren)) { return false; } @@ -4484,9 +4893,9 @@ static EDealRes mergeProjectionsExpr(SNode** pNode, void* pContext) { SNode* pProjection; FOREACH(pProjection, pChildProj->pProjections) { if (0 == strcmp(((SColumnNode*)pTarget)->colName, ((SExprNode*)pProjection)->aliasName)) { - SNode* pExpr = nodesCloneNode(pProjection); + SNode* pExpr = NULL; + pCxt->errCode = nodesCloneNode(pProjection, &pExpr); if (pExpr == NULL) { - pCxt->errCode = terrno; return DEAL_RES_ERROR; } snprintf(((SExprNode*)pExpr)->aliasName, sizeof(((SExprNode*)pExpr)->aliasName), "%s", @@ -4529,7 +4938,7 @@ static int32_t mergeProjectsOptimizeImpl(SOptimizeContext* pCxt, SLogicSubplan* } static int32_t mergeProjectsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pProjectNode = optFindPossibleNode(pLogicSubplan->pNode, mergeProjectsMayBeOptimized); + SLogicNode* pProjectNode = optFindPossibleNode(pLogicSubplan->pNode, mergeProjectsMayBeOptimized, NULL); if (NULL == pProjectNode) { return TSDB_CODE_SUCCESS; } @@ -4537,7 +4946,7 @@ static int32_t mergeProjectsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLog return mergeProjectsOptimizeImpl(pCxt, pLogicSubplan, pProjectNode); } -static bool tagScanOptShouldBeOptimized(SLogicNode* pNode) { +static bool tagScanOptShouldBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_SCAN != nodeType(pNode) || (SCAN_TYPE_TAG == ((SScanLogicNode*)pNode)->scanType)) { return false; } @@ -4572,7 +4981,7 @@ static bool tagScanOptShouldBeOptimized(SLogicNode* pNode) { } static int32_t tagScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SScanLogicNode* pScanNode = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, tagScanOptShouldBeOptimized); + SScanLogicNode* pScanNode = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, tagScanOptShouldBeOptimized, NULL); if (NULL == pScanNode) { return TSDB_CODE_SUCCESS; } @@ -4590,17 +4999,28 @@ static int32_t tagScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubp SLogicNode* pAgg = pScanNode->node.pParent; if (NULL == pAgg->pParent) { - SNodeList* pScanTargets = nodesMakeList(); + SNodeList* pScanTargets = NULL; + int32_t code = nodesMakeList(&pScanTargets); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SNode* pAggTarget = NULL; FOREACH(pAggTarget, pAgg->pTargets) { SNode* pScanTarget = NULL; FOREACH(pScanTarget, pScanNode->node.pTargets) { if (0 == strcmp(((SColumnNode*)pAggTarget)->colName, ((SColumnNode*)pScanTarget)->colName)) { - nodesListAppend(pScanTargets, nodesCloneNode(pScanTarget)); + SNode* pNew = NULL; + code = nodesCloneNode(pScanTarget, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListAppend(pScanTargets, pNew); + } break; } } + if (TSDB_CODE_SUCCESS != code) { + break; + } } nodesDestroyList(pScanNode->node.pTargets); pScanNode->node.pTargets = pScanTargets; @@ -4612,7 +5032,7 @@ static int32_t tagScanOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubp return TSDB_CODE_SUCCESS; } -static bool pushDownLimitOptShouldBeOptimized(SLogicNode* pNode) { +static bool pushDownLimitOptShouldBeOptimized(SLogicNode* pNode, void* pCtx) { if ((NULL == pNode->pLimit && pNode->pSlimit == NULL) || 1 != LIST_LENGTH(pNode->pChildren)) { return false; } @@ -4627,29 +5047,48 @@ static void swapLimit(SLogicNode* pParent, SLogicNode* pChild) { pParent->pLimit = NULL; } -static bool pushDownLimitHow(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPushTo); -static bool pushDownLimitTo(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPushTo) { +static int32_t pushDownLimitHow(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPushTo, bool* pPushed); +static int32_t pushDownLimitTo(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPushTo, bool* pPushed) { + int32_t code = 0; + bool cloned; switch (nodeType(pNodeLimitPushTo)) { case QUERY_NODE_LOGIC_PLAN_WINDOW: { SWindowLogicNode* pWindow = (SWindowLogicNode*)pNodeLimitPushTo; if (pWindow->winType != WINDOW_TYPE_INTERVAL) break; - cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT_SLIMIT); - return true; + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT_SLIMIT, &cloned); + if (TSDB_CODE_SUCCESS == code) { + *pPushed = true; + } + return code; } case QUERY_NODE_LOGIC_PLAN_SORT: if (((SSortLogicNode*)pNodeLimitPushTo)->calcGroupId) break; // fall through - case QUERY_NODE_LOGIC_PLAN_FILL: - cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT_SLIMIT); + case QUERY_NODE_LOGIC_PLAN_FILL: { SNode* pChild = NULL; - FOREACH(pChild, pNodeLimitPushTo->pChildren) { pushDownLimitHow(pNodeLimitPushTo, (SLogicNode*)pChild); } - return true; + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT_SLIMIT, &cloned); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + FOREACH(pChild, pNodeLimitPushTo->pChildren) { + code = pushDownLimitHow(pNodeLimitPushTo, (SLogicNode*)pChild, &cloned); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + } + *pPushed = true; + return code; + } case QUERY_NODE_LOGIC_PLAN_AGG: { if (nodeType(pNodeWithLimit) == QUERY_NODE_LOGIC_PLAN_PROJECT && (isPartTagAgg((SAggLogicNode*)pNodeLimitPushTo) || isPartTableAgg((SAggLogicNode*)pNodeLimitPushTo))) { // when part by tag/tbname, slimit will be cloned to agg, and it will be pipelined. // The scan below will do scanning with group order - return cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_SLIMIT); + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_SLIMIT, &cloned); + if (TSDB_CODE_SUCCESS == code) { + *pPushed = cloned; + } + return code; } // else if not part by tag and tbname, the partition node below indicates that results are sorted, the agg node // can be pipelined. @@ -4657,14 +5096,22 @@ static bool pushDownLimitTo(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPu SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pNodeLimitPushTo->pChildren, 0); if (nodeType(pChild) == QUERY_NODE_LOGIC_PLAN_PARTITION) { pNodeLimitPushTo->forceCreateNonBlockingOptr = true; - return cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_SLIMIT); + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_SLIMIT, &cloned); + if (TSDB_CODE_SUCCESS == code) { + *pPushed = cloned; + } + return code; } // Currently, partColOpt is executed after pushDownLimitOpt, and partColOpt will replace partition node with // sort node. // To avoid dependencies between these two optimizations, we add sort node too. if (nodeType(pChild) == QUERY_NODE_LOGIC_PLAN_SORT && ((SSortLogicNode*)pChild)->calcGroupId) { pNodeLimitPushTo->forceCreateNonBlockingOptr = true; - return cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_SLIMIT); + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_SLIMIT, &cloned); + if (TSDB_CODE_SUCCESS == code) { + *pPushed = cloned; + } + return code; } } break; @@ -4672,47 +5119,57 @@ static bool pushDownLimitTo(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPu case QUERY_NODE_LOGIC_PLAN_SCAN: if (nodeType(pNodeWithLimit) == QUERY_NODE_LOGIC_PLAN_PROJECT && pNodeWithLimit->pLimit) { if (((SProjectLogicNode*)pNodeWithLimit)->inputIgnoreGroup) { - cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT); + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT, &cloned); } else { swapLimit(pNodeWithLimit, pNodeLimitPushTo); } - return true; + if (TSDB_CODE_SUCCESS == code) { + *pPushed = true; + } + return code; } break; case QUERY_NODE_LOGIC_PLAN_JOIN: { - cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT); - break; + code = cloneLimit(pNodeWithLimit, pNodeLimitPushTo, CLONE_LIMIT, &cloned); + break; } default: break; } - return false; + *pPushed = false; + return code; } -static bool pushDownLimitHow(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPushTo) { +static int32_t pushDownLimitHow(SLogicNode* pNodeWithLimit, SLogicNode* pNodeLimitPushTo, bool* pPushed) { switch (nodeType(pNodeWithLimit)) { case QUERY_NODE_LOGIC_PLAN_PROJECT: case QUERY_NODE_LOGIC_PLAN_FILL: - return pushDownLimitTo(pNodeWithLimit, pNodeLimitPushTo); + return pushDownLimitTo(pNodeWithLimit, pNodeLimitPushTo, pPushed); case QUERY_NODE_LOGIC_PLAN_SORT: { SSortLogicNode* pSort = (SSortLogicNode*)pNodeWithLimit; - if (sortPriKeyOptIsPriKeyOrderBy(pSort->pSortKeys)) return pushDownLimitTo(pNodeWithLimit, pNodeLimitPushTo); + if (sortPriKeyOptIsPriKeyOrderBy(pSort->pSortKeys)) return pushDownLimitTo(pNodeWithLimit, pNodeLimitPushTo, pPushed); } default: break; } - return false; + *pPushed = false; + return TSDB_CODE_SUCCESS; } static int32_t pushDownLimitOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, pushDownLimitOptShouldBeOptimized); + SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, pushDownLimitOptShouldBeOptimized, NULL); if (NULL == pNode) { return TSDB_CODE_SUCCESS; } SLogicNode* pChild = (SLogicNode*)nodesListGetNode(pNode->pChildren, 0); nodesDestroyNode(pChild->pLimit); - if (pushDownLimitHow(pNode, pChild)) { + bool pushed = false; + int32_t code = pushDownLimitHow(pNode, pChild, &pushed); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + if (pushed) { pCxt->optimized = true; } return TSDB_CODE_SUCCESS; @@ -4866,18 +5323,21 @@ static bool tbCntScanOptShouldBeOptimized(SLogicNode* pNode, STbCntScanOptInfo* return tbCntScanOptIsEligibleAgg(pInfo->pAgg) && tbCntScanOptIsEligibleScan(pInfo); } -static SNode* tbCntScanOptCreateTableCountFunc() { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); +static int32_t tbCntScanOptCreateTableCountFunc(SNode** ppNode) { + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return NULL; + return code; } strcpy(pFunc->functionName, "_table_count"); strcpy(pFunc->node.aliasName, "_table_count"); - if (TSDB_CODE_SUCCESS != fmGetFuncInfo(pFunc, NULL, 0)) { + code = fmGetFuncInfo(pFunc, NULL, 0); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pFunc); - return NULL; + return code; } - return (SNode*)pFunc; + *ppNode = (SNode*)pFunc; + return code; } static int32_t tbCntScanOptRewriteScan(STbCntScanOptInfo* pInfo) { @@ -4888,35 +5348,54 @@ static int32_t tbCntScanOptRewriteScan(STbCntScanOptInfo* pInfo) { NODES_DESTORY_LIST(pInfo->pScan->pScanCols); NODES_DESTORY_NODE(pInfo->pScan->node.pConditions); NODES_DESTORY_LIST(pInfo->pScan->pScanPseudoCols); - int32_t code = nodesListMakeStrictAppend(&pInfo->pScan->pScanPseudoCols, tbCntScanOptCreateTableCountFunc()); + SNode* pNew = NULL; + int32_t code = tbCntScanOptCreateTableCountFunc(&pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pInfo->pScan->pScanPseudoCols, pNew); + } if (TSDB_CODE_SUCCESS == code) { code = createColumnByRewriteExpr(nodesListGetNode(pInfo->pScan->pScanPseudoCols, 0), &pInfo->pScan->node.pTargets); } SNode* pGroupKey = NULL; - FOREACH(pGroupKey, pInfo->pAgg->pGroupKeys) { - SNode* pGroupCol = nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0); - code = nodesListMakeStrictAppend(&pInfo->pScan->pGroupTags, nodesCloneNode(pGroupCol)); - if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(&pInfo->pScan->pScanCols, nodesCloneNode(pGroupCol)); - } - if (TSDB_CODE_SUCCESS == code) { - code = nodesListMakeStrictAppend(&pInfo->pScan->node.pTargets, nodesCloneNode(pGroupCol)); - } - if (TSDB_CODE_SUCCESS != code) { - break; + if (TSDB_CODE_SUCCESS == code) { + FOREACH(pGroupKey, pInfo->pAgg->pGroupKeys) { + SNode* pGroupCol = nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0); + SNode* pNew = NULL; + code = nodesCloneNode(pGroupCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pInfo->pScan->pGroupTags, pNew); + } + if (TSDB_CODE_SUCCESS == code) { + pNew = NULL; + code = nodesCloneNode(pGroupCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pInfo->pScan->pScanCols, pNew); + } + } + if (TSDB_CODE_SUCCESS == code) { + pNew = NULL; + code = nodesCloneNode(pGroupCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pInfo->pScan->node.pTargets, pNew); + } + } + if (TSDB_CODE_SUCCESS != code) { + break; + } } } return code; } static int32_t tbCntScanOptCreateSumFunc(SFunctionNode* pCntFunc, SNode* pParam, SNode** pOutput) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (NULL == pFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pFunc->functionName, "sum"); strcpy(pFunc->node.aliasName, pCntFunc->node.aliasName); - int32_t code = createColumnByRewriteExpr(pParam, &pFunc->pParameterList); + code = createColumnByRewriteExpr(pParam, &pFunc->pParameterList); if (TSDB_CODE_SUCCESS == code) { code = fmGetFuncInfo(pFunc, NULL, 0); } @@ -4988,14 +5467,23 @@ static SSortLogicNode* sortNonPriKeySatisfied(SLogicNode* pNode) { static bool sortNonPriKeyShouldOptimize(SLogicNode* pNode, void* pInfo) { SSortLogicNode* pSort = sortNonPriKeySatisfied(pNode); if (!pSort) return false; - SNodeList* pSortNodeList = pInfo; - nodesListAppend(pSortNodeList, (SNode*)pSort); + SOptimizePKCtx* ctx = pInfo; + ctx->code = nodesListAppend(ctx->pList, (SNode*)pSort); return false; } static int32_t sortNonPriKeyOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SNodeList* pNodeList = nodesMakeList(); - optFindEligibleNode(pLogicSubplan->pNode, sortNonPriKeyShouldOptimize, pNodeList); + SNodeList* pNodeList = NULL; + int32_t code = nodesMakeList(&pNodeList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + SOptimizePKCtx ctx = {.pList = pNodeList, .code = 0}; + (void)optFindEligibleNode(pLogicSubplan->pNode, sortNonPriKeyShouldOptimize, &ctx); + if (TSDB_CODE_SUCCESS != ctx.code) { + nodesClearList(pNodeList); + return code; + } SNode* pNode = NULL; FOREACH(pNode, pNodeList) { SSortLogicNode* pSort = (SSortLogicNode*)pNode; @@ -5008,7 +5496,7 @@ static int32_t sortNonPriKeyOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLog return TSDB_CODE_SUCCESS; } -static bool hashJoinOptShouldBeOptimized(SLogicNode* pNode) { +static bool hashJoinOptShouldBeOptimized(SLogicNode* pNode, void* pCtx) { bool res = false; if (QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode)) { return res; @@ -5033,7 +5521,11 @@ _return: if (!res && DATA_ORDER_LEVEL_NONE == pJoin->node.requireDataOrder) { pJoin->node.requireDataOrder = DATA_ORDER_LEVEL_GLOBAL; - (void)adjustLogicNodeDataRequirement(pNode, pJoin->node.requireDataOrder); + int32_t *pCode = pCtx; + int32_t code = adjustLogicNodeDataRequirement(pNode, pJoin->node.requireDataOrder); + if (TSDB_CODE_SUCCESS != code) { + *pCode = code; + } } return res; @@ -5056,7 +5548,11 @@ static int32_t hashJoinOptSplitPrimFromLogicCond(SNode **pCondition, SNode **pPr continue; } - code = nodesListMakeAppend(&pPrimaryKeyConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pPrimaryKeyConds, pNew); + } if (TSDB_CODE_SUCCESS != code) { break; } @@ -5181,7 +5677,10 @@ static int32_t hashJoinOptRewriteJoin(SOptimizeContext* pCxt, SLogicNode* pNode, } #else SNode* pPrimaryKeyCond = NULL; - hashJoinOptSplitPrimCond(&pJoin->pColOnCond, &pPrimaryKeyCond); + code = hashJoinOptSplitPrimCond(&pJoin->pColOnCond, &pPrimaryKeyCond); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (NULL != pPrimaryKeyCond) { bool isStrict = false; code = getTimeRangeFromNode(&pPrimaryKeyCond, &pJoin->timeRange, &isStrict); @@ -5303,7 +5802,11 @@ static int32_t hashJoinOptRewriteJoin(SOptimizeContext* pCxt, SLogicNode* pNode, static int32_t hashJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, hashJoinOptShouldBeOptimized); + int32_t code = 0; + SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, hashJoinOptShouldBeOptimized, &code); + if (TSDB_CODE_SUCCESS != code) { + return code; + } if (NULL == pNode) { return TSDB_CODE_SUCCESS; } @@ -5311,7 +5814,7 @@ static int32_t hashJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub return hashJoinOptRewriteJoin(pCxt, pNode, pLogicSubplan); } -static bool stbJoinOptShouldBeOptimized(SLogicNode* pNode) { +static bool stbJoinOptShouldBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode) || OPTIMIZE_FLAG_TEST_MASK(pNode->optimizedFlag, OPTIMIZE_FLAG_STB_JOIN)) { return false; } @@ -5359,8 +5862,11 @@ int32_t stbJoinOptRewriteToTagScan(SLogicNode* pJoin, SNode* pNode) { pScan->node.requireDataOrder = DATA_ORDER_LEVEL_NONE; pScan->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - SNodeList* pTags = nodesMakeList(); - int32_t code = nodesCollectColumnsFromNode(pJoinNode->pTagEqCond, NULL, COLLECT_COL_TYPE_TAG, &pTags); + SNodeList* pTags = NULL; + int32_t code = nodesMakeList(&pTags); + if (TSDB_CODE_SUCCESS == code) { + code = nodesCollectColumnsFromNode(pJoinNode->pTagEqCond, NULL, COLLECT_COL_TYPE_TAG, &pTags); + } if (TSDB_CODE_SUCCESS == code) { code = nodesCollectColumnsFromNode(pJoinNode->pTagOnCond, NULL, COLLECT_COL_TYPE_TAG, &pTags); } @@ -5392,7 +5898,9 @@ int32_t stbJoinOptRewriteToTagScan(SLogicNode* pJoin, SNode* pNode) { code = stbJoinOptAddFuncToScanNode("_vgid", pScan); } - tagScanSetExecutionMode(pScan); + if (TSDB_CODE_SUCCESS == code) { + code = tagScanSetExecutionMode(pScan); + } if (code) { nodesDestroyList(pTags); @@ -5402,12 +5910,12 @@ int32_t stbJoinOptRewriteToTagScan(SLogicNode* pJoin, SNode* pNode) { } static int32_t stbJoinOptCreateTagScanNode(SLogicNode* pJoin, SNodeList** ppList) { - SNodeList* pList = nodesCloneList(pJoin->pChildren); + SNodeList* pList = NULL; + int32_t code = nodesCloneList(pJoin->pChildren, &pList); if (NULL == pList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; SNode* pNode = NULL; FOREACH(pNode, pList) { code = stbJoinOptRewriteToTagScan(pJoin, pNode); @@ -5427,9 +5935,10 @@ static int32_t stbJoinOptCreateTagScanNode(SLogicNode* pJoin, SNodeList** ppList static int32_t stbJoinOptCreateTagHashJoinNode(SLogicNode* pOrig, SNodeList* pChildren, SLogicNode** ppLogic) { SJoinLogicNode* pOrigJoin = (SJoinLogicNode*)pOrig; - SJoinLogicNode* pJoin = (SJoinLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_JOIN); + SJoinLogicNode* pJoin = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_JOIN, (SNode**)&pJoin); if (NULL == pJoin) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pJoin->joinType = pOrigJoin->joinType; @@ -5441,10 +5950,17 @@ static int32_t stbJoinOptCreateTagHashJoinNode(SLogicNode* pOrig, SNodeList* pCh pJoin->node.groupAction = pOrigJoin->node.groupAction; pJoin->node.requireDataOrder = DATA_ORDER_LEVEL_NONE; pJoin->node.resultDataOrder = DATA_ORDER_LEVEL_NONE; - pJoin->pTagEqCond = nodesCloneNode(pOrigJoin->pTagEqCond); - pJoin->pTagOnCond = nodesCloneNode(pOrigJoin->pTagOnCond); + code = nodesCloneNode(pOrigJoin->pTagEqCond, &pJoin->pTagEqCond); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pJoin); + return code; + } + code = nodesCloneNode(pOrigJoin->pTagOnCond, &pJoin->pTagOnCond); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pJoin); + return code; + } - int32_t code = TSDB_CODE_SUCCESS; pJoin->node.pChildren = pChildren; SNode* pNode = NULL; @@ -5467,15 +5983,16 @@ static int32_t stbJoinOptCreateTagHashJoinNode(SLogicNode* pOrig, SNodeList* pCh } SNodeList* pCols = NULL; - nodesCollectColumnsFromNode(pJoin->pFullOnCond, NULL, COLLECT_COL_TYPE_ALL, &pCols); + code = nodesCollectColumnsFromNode(pJoin->pFullOnCond, NULL, COLLECT_COL_TYPE_ALL, &pCols); - FOREACH(pNode, pCols) { - code = createColumnByRewriteExpr(pNode, &pJoin->node.pTargets); - if (code) { - break; + if (TSDB_CODE_SUCCESS == code) { + FOREACH(pNode, pCols) { + code = createColumnByRewriteExpr(pNode, &pJoin->node.pTargets); + if (code) { + break; + } } } - nodesDestroyList(pCols); if (TSDB_CODE_SUCCESS == code) { @@ -5489,12 +6006,12 @@ static int32_t stbJoinOptCreateTagHashJoinNode(SLogicNode* pOrig, SNodeList* pCh } static int32_t stbJoinOptCreateTableScanNodes(SLogicNode* pJoin, SNodeList** ppList, bool* srcScan) { - SNodeList* pList = nodesCloneList(pJoin->pChildren); + SNodeList* pList = NULL; + int32_t code = nodesCloneList(pJoin->pChildren, &pList); if (NULL == pList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; int32_t i = 0; SNode* pNode = NULL; FOREACH(pNode, pList) { @@ -5522,9 +6039,10 @@ static int32_t stbJoinOptCreateTableScanNodes(SLogicNode* pJoin, SNodeList** ppL static int32_t stbJoinOptCreateGroupCacheNode(SLogicNode* pRoot, SNodeList* pChildren, SLogicNode** ppLogic) { int32_t code = TSDB_CODE_SUCCESS; - SGroupCacheLogicNode* pGrpCache = (SGroupCacheLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_GROUP_CACHE); + SGroupCacheLogicNode* pGrpCache = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_GROUP_CACHE, (SNode**)&pGrpCache); if (NULL == pGrpCache) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } // pGrpCache->node.dynamicOp = true; @@ -5532,13 +6050,15 @@ static int32_t stbJoinOptCreateGroupCacheNode(SLogicNode* pRoot, SNodeList* pChi pGrpCache->grpByUid = true; pGrpCache->batchFetch = getBatchScanOptionFromHint(pRoot->pHint); pGrpCache->node.pChildren = pChildren; - pGrpCache->node.pTargets = nodesMakeList(); - if (NULL == pGrpCache->node.pTargets) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pGrpCache->node.pTargets = NULL; + code = nodesMakeList(&pGrpCache->node.pTargets); if (TSDB_CODE_SUCCESS == code) { SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pChildren, 0); - code = nodesListStrictAppendList(pGrpCache->node.pTargets, nodesCloneList(pScan->node.pTargets)); + SNodeList* pNewList = NULL; + code = nodesCloneList(pScan->node.pTargets, &pNewList); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppendList(pGrpCache->node.pTargets, pNewList); + } } SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pChildren, 0); @@ -5609,9 +6129,10 @@ static void stbJoinOptRemoveTagEqCond(SJoinLogicNode* pJoin) { static int32_t stbJoinOptCreateMergeJoinNode(SLogicNode* pOrig, SLogicNode* pChild, SLogicNode** ppLogic) { SJoinLogicNode* pOrigJoin = (SJoinLogicNode*)pOrig; - SJoinLogicNode* pJoin = (SJoinLogicNode*)nodesCloneNode((SNode*)pOrig); + SJoinLogicNode* pJoin = NULL; + int32_t code = nodesCloneNode((SNode*)pOrig, (SNode**)&pJoin); if (NULL == pJoin) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pJoin->joinAlgo = JOIN_ALGO_MERGE; @@ -5622,7 +6143,7 @@ static int32_t stbJoinOptCreateMergeJoinNode(SLogicNode* pOrig, SLogicNode* pChi SNode* pNode = NULL; FOREACH(pNode, pJoin->node.pChildren) { ERASE_NODE(pJoin->node.pChildren); } - int32_t code = nodesListStrictAppend(pJoin->node.pChildren, (SNode*)pChild); + code = nodesListStrictAppend(pJoin->node.pChildren, (SNode*)pChild); if (TSDB_CODE_SUCCESS == code) { pChild->pParent = (SLogicNode*)pJoin; *ppLogic = (SLogicNode*)pJoin; @@ -5637,9 +6158,10 @@ static int32_t stbJoinOptCreateMergeJoinNode(SLogicNode* pOrig, SLogicNode* pChi static int32_t stbJoinOptCreateDynQueryCtrlNode(SLogicNode* pRoot, SLogicNode* pPrev, SLogicNode* pPost, bool* srcScan, SLogicNode** ppDynNode) { int32_t code = TSDB_CODE_SUCCESS; - SDynQueryCtrlLogicNode* pDynCtrl = (SDynQueryCtrlLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL); + SDynQueryCtrlLogicNode* pDynCtrl = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL, (SNode**)&pDynCtrl); if (NULL == pDynCtrl) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pDynCtrl->qType = DYN_QTYPE_STB_HASH; @@ -5647,31 +6169,40 @@ static int32_t stbJoinOptCreateDynQueryCtrlNode(SLogicNode* pRoot, SLogicNode* p memcpy(pDynCtrl->stbJoin.srcScan, srcScan, sizeof(pDynCtrl->stbJoin.srcScan)); if (TSDB_CODE_SUCCESS == code) { - pDynCtrl->node.pChildren = nodesMakeList(); + pDynCtrl->node.pChildren = NULL; + code = nodesMakeList(&pDynCtrl->node.pChildren); if (NULL == pDynCtrl->node.pChildren) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } if (TSDB_CODE_SUCCESS == code) { - pDynCtrl->stbJoin.pVgList = nodesMakeList(); + pDynCtrl->stbJoin.pVgList = NULL; + code = nodesMakeList(&pDynCtrl->stbJoin.pVgList); if (NULL == pDynCtrl->stbJoin.pVgList) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } if (TSDB_CODE_SUCCESS == code) { - pDynCtrl->stbJoin.pUidList = nodesMakeList(); + pDynCtrl->stbJoin.pUidList = NULL; + code = nodesMakeList(&pDynCtrl->stbJoin.pUidList); if (NULL == pDynCtrl->stbJoin.pUidList) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } SJoinLogicNode* pHJoin = (SJoinLogicNode*)pPrev; - nodesListStrictAppend(pDynCtrl->stbJoin.pUidList, nodesListGetNode(pHJoin->node.pTargets, 0)); - nodesListStrictAppend(pDynCtrl->stbJoin.pUidList, nodesListGetNode(pHJoin->node.pTargets, 2)); - nodesListStrictAppend(pDynCtrl->stbJoin.pVgList, nodesListGetNode(pHJoin->node.pTargets, 1)); - nodesListStrictAppend(pDynCtrl->stbJoin.pVgList, nodesListGetNode(pHJoin->node.pTargets, 3)); + code = nodesListStrictAppend(pDynCtrl->stbJoin.pUidList, nodesListGetNode(pHJoin->node.pTargets, 0)); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pDynCtrl->stbJoin.pUidList, nodesListGetNode(pHJoin->node.pTargets, 2)); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pDynCtrl->stbJoin.pVgList, nodesListGetNode(pHJoin->node.pTargets, 1)); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pDynCtrl->stbJoin.pVgList, nodesListGetNode(pHJoin->node.pTargets, 3)); + } if (TSDB_CODE_SUCCESS == code) { code = nodesListStrictAppend(pDynCtrl->node.pChildren, (SNode*)pPrev); @@ -5679,9 +6210,10 @@ static int32_t stbJoinOptCreateDynQueryCtrlNode(SLogicNode* pRoot, SLogicNode* p code = nodesListStrictAppend(pDynCtrl->node.pChildren, (SNode*)pPost); } if (TSDB_CODE_SUCCESS == code) { - pDynCtrl->node.pTargets = nodesCloneList(pPost->pTargets); + pDynCtrl->node.pTargets = NULL; + code = nodesCloneList(pPost->pTargets, &pDynCtrl->node.pTargets); if (!pDynCtrl->node.pTargets) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } } @@ -5735,7 +6267,7 @@ static int32_t stbJoinOptRewriteStableJoin(SOptimizeContext* pCxt, SLogicNode* p } static int32_t stableJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, stbJoinOptShouldBeOptimized); + SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, stbJoinOptShouldBeOptimized, NULL); if (NULL == pNode) { return TSDB_CODE_SUCCESS; } @@ -5743,7 +6275,7 @@ static int32_t stableJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicS return stbJoinOptRewriteStableJoin(pCxt, pNode, pLogicSubplan); } -static bool grpJoinOptShouldBeOptimized(SLogicNode* pNode) { +static bool grpJoinOptShouldBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_JOIN != nodeType(pNode)) { return false; } @@ -5761,30 +6293,39 @@ static bool grpJoinOptShouldBeOptimized(SLogicNode* pNode) { } static int32_t grpJoinOptCreatePartitionNode(SLogicNode* pParent, SLogicNode* pChild, bool leftChild, SLogicNode** pNew) { - SPartitionLogicNode* pPartition = (SPartitionLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PARTITION); + SPartitionLogicNode* pPartition = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_PARTITION, (SNode**)&pPartition); if (NULL == pPartition) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pPartition->node.groupAction = GROUP_ACTION_SET; pPartition->node.requireDataOrder = DATA_ORDER_LEVEL_GLOBAL; pPartition->node.resultDataOrder = DATA_ORDER_LEVEL_IN_GROUP; - pPartition->node.pTargets = nodesCloneList(pChild->pTargets); + pPartition->node.pTargets = NULL; + code = nodesCloneList(pChild->pTargets, &pPartition->node.pTargets); if (NULL == pPartition->node.pTargets) { nodesDestroyNode((SNode*)pPartition); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SJoinLogicNode* pJoin = (SJoinLogicNode*)pParent; - pPartition->pPartitionKeys = nodesCloneList(leftChild ? pJoin->pLeftEqNodes : pJoin->pRightEqNodes); - pChild->pParent = (SLogicNode*)pPartition; - pPartition->node.pParent = pParent; - nodesListMakeStrictAppend(&pPartition->node.pChildren, (SNode *)pChild); - - *pNew = (SLogicNode*)pPartition; - - return TSDB_CODE_SUCCESS; + pPartition->pPartitionKeys = NULL; + code = nodesCloneList(leftChild ? pJoin->pLeftEqNodes : pJoin->pRightEqNodes, &pPartition->pPartitionKeys); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pPartition); + return code; + } + code = nodesListMakeStrictAppend(&pPartition->node.pChildren, (SNode *)pChild); + if (TSDB_CODE_SUCCESS == code) { + *pNew = (SLogicNode*)pPartition; + pChild->pParent = (SLogicNode*)pPartition; + pPartition->node.pParent = pParent; + } else { + nodesDestroyNode((SNode*)pPartition); + } + return code; } static int32_t grpJoinOptInsertPartitionNode(SLogicNode* pJoin) { @@ -5816,11 +6357,18 @@ static int32_t grpJoinOptPartByTags(SLogicNode* pNode) { } SScanLogicNode* pScan = (SScanLogicNode*)pChild; - if (leftChild) { - nodesListMakeStrictAppendList(&pScan->pGroupTags, nodesCloneList(pJoin->pLeftEqNodes)); - leftChild = false; - } else { - nodesListMakeStrictAppendList(&pScan->pGroupTags, nodesCloneList(pJoin->pRightEqNodes)); + SNodeList* pNewList = NULL; + code = nodesCloneList(pJoin->pLeftEqNodes, &pNewList); + if (TSDB_CODE_SUCCESS == code) { + if (leftChild) { + code = nodesListMakeStrictAppendList(&pScan->pGroupTags, pNewList); + leftChild = false; + } else { + code = nodesListMakeStrictAppendList(&pScan->pGroupTags, pNewList); + } + } + if (TSDB_CODE_SUCCESS != code) { + break; } pScan->groupSort = true; @@ -5842,7 +6390,7 @@ static int32_t grpJoinOptRewriteGroupJoin(SOptimizeContext* pCxt, SLogicNode* pN static int32_t groupJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { - SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, grpJoinOptShouldBeOptimized); + SLogicNode* pNode = optFindPossibleNode(pLogicSubplan->pNode, grpJoinOptShouldBeOptimized, NULL); if (NULL == pNode) { return TSDB_CODE_SUCCESS; } @@ -5850,7 +6398,7 @@ static int32_t groupJoinOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSu return grpJoinOptRewriteGroupJoin(pCxt, pNode, pLogicSubplan); } -static bool partColOptShouldBeOptimized(SLogicNode* pNode) { +static bool partColOptShouldBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode)) { SPartitionLogicNode* pPartition = (SPartitionLogicNode*)pNode; if (keysHasCol(pPartition->pPartitionKeys)) return true; @@ -5858,71 +6406,83 @@ static bool partColOptShouldBeOptimized(SLogicNode* pNode) { return false; } -static SSortLogicNode* partColOptCreateSort(SPartitionLogicNode* pPartition) { +static int32_t partColOptCreateSort(SPartitionLogicNode* pPartition, SSortLogicNode** ppSort) { SNode* node; int32_t code = TSDB_CODE_SUCCESS; - SSortLogicNode* pSort = (SSortLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT); + SSortLogicNode* pSort = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_SORT, (SNode**)&pSort); if (pSort) { bool alreadyPartByPKTs = false; pSort->groupSort = false; FOREACH(node, pPartition->pPartitionKeys) { - SOrderByExprNode* pOrder = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); + SOrderByExprNode* pOrder = NULL; + code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOrder); + if (TSDB_CODE_SUCCESS != code) { + break; + } if (QUERY_NODE_COLUMN == nodeType(node) && ((SColumnNode*)node)->colId == pPartition->pkTsColId && ((SColumnNode*)node)->tableId == pPartition->pkTsColTbId) alreadyPartByPKTs = true; - if (!pOrder) { - code = TSDB_CODE_OUT_OF_MEMORY; - } else { - nodesListMakeAppend(&pSort->pSortKeys, (SNode*)pOrder); + code = nodesListMakeStrictAppend(&pSort->pSortKeys, (SNode*)pOrder); + if (TSDB_CODE_SUCCESS == code) { pOrder->order = ORDER_ASC; - pOrder->pExpr = nodesCloneNode(node); + pOrder->pExpr = NULL; pOrder->nullOrder = NULL_ORDER_FIRST; - if (!pOrder->pExpr) code = TSDB_CODE_OUT_OF_MEMORY; + code = nodesCloneNode(node, &pOrder->pExpr); } + if (TSDB_CODE_SUCCESS != code) { + break; + } + } + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pSort); + return code; } if (pPartition->needBlockOutputTsOrder && !alreadyPartByPKTs) { - SOrderByExprNode* pOrder = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); - if (!pOrder) { - code = TSDB_CODE_OUT_OF_MEMORY; - } else { + SOrderByExprNode* pOrder = NULL; + code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOrder); + if (pOrder) { pSort->excludePkCol = true; - nodesListMakeAppend(&pSort->pSortKeys, (SNode*)pOrder); - pOrder->order = ORDER_ASC; - pOrder->pExpr = 0; - FOREACH(node, pPartition->node.pTargets) { - if (nodeType(node) == QUERY_NODE_COLUMN) { - SColumnNode* pCol = (SColumnNode*)node; - if (pCol->colId == pPartition->pkTsColId && pCol->tableId == pPartition->pkTsColTbId) { - pOrder->pExpr = nodesCloneNode((SNode*)pCol); - break; + code = nodesListMakeStrictAppend(&pSort->pSortKeys, (SNode*)pOrder); + if (TSDB_CODE_SUCCESS == code) { + pOrder->order = ORDER_ASC; + pOrder->pExpr = 0; + FOREACH(node, pPartition->node.pTargets) { + if (nodeType(node) == QUERY_NODE_COLUMN) { + SColumnNode* pCol = (SColumnNode*)node; + if (pCol->colId == pPartition->pkTsColId && pCol->tableId == pPartition->pkTsColTbId) { + pOrder->pExpr = NULL; + code = nodesCloneNode((SNode*)pCol, &pOrder->pExpr); + break; + } } } } - if (!pOrder->pExpr) { - code = TSDB_CODE_PAR_INTERNAL_ERROR; - } } } } if (code != TSDB_CODE_SUCCESS) { nodesDestroyNode((SNode*)pSort); pSort = NULL; + } else { + *ppSort = pSort; } - return pSort; + return code; } static int32_t partitionColsOpt(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { SNode* node; int32_t code = TSDB_CODE_SUCCESS; SPartitionLogicNode* pNode = - (SPartitionLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, partColOptShouldBeOptimized); + (SPartitionLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, partColOptShouldBeOptimized, NULL); if (NULL == pNode) return TSDB_CODE_SUCCESS; SLogicNode* pRootNode = getLogicNodeRootNode((SLogicNode*)pNode); if (pRootNode->pHint && getSortForGroupOptHint(pRootNode->pHint)) { // replace with sort node - SSortLogicNode* pSort = partColOptCreateSort(pNode); + SSortLogicNode* pSort = NULL; + code = partColOptCreateSort(pNode, &pSort); if (!pSort) { // if sort create failed, we eat the error, skip the optimization code = TSDB_CODE_SUCCESS; @@ -5944,15 +6504,19 @@ static int32_t partitionColsOpt(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub // Check if we can delete partition node SAggLogicNode* pAgg = (SAggLogicNode*)pNode->node.pParent; FOREACH(node, pNode->pPartitionKeys) { - SGroupingSetNode* pgsNode = (SGroupingSetNode*)nodesMakeNode(QUERY_NODE_GROUPING_SET); - if (!pgsNode) code = TSDB_CODE_OUT_OF_MEMORY; + SGroupingSetNode* pgsNode = NULL; + code = nodesMakeNode(QUERY_NODE_GROUPING_SET, (SNode**)&pgsNode); if (code == TSDB_CODE_SUCCESS) { pgsNode->groupingSetType = GP_TYPE_NORMAL; - pgsNode->pParameterList = nodesMakeList(); - if (!pgsNode->pParameterList) code = TSDB_CODE_OUT_OF_MEMORY; + pgsNode->pParameterList = NULL; + code = nodesMakeList(&pgsNode->pParameterList); } if (code == TSDB_CODE_SUCCESS) { - code = nodesListAppend(pgsNode->pParameterList, nodesCloneNode(node)); + SNode* pNew = NULL; + code = nodesCloneNode(node, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pgsNode->pParameterList, pNew); + } } if (code == TSDB_CODE_SUCCESS) { // Now we are using hash agg @@ -5983,7 +6547,7 @@ static int32_t partitionColsOpt(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub return code; } -static bool tsmaOptMayBeOptimized(SLogicNode* pNode) { +static bool tsmaOptMayBeOptimized(SLogicNode* pNode, void* pCtx) { if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) { SNode* pTmpNode; SNodeList* pFuncs = NULL; @@ -6117,7 +6681,8 @@ static bool tsmaOptCheckValidInterval(int64_t tsmaInterval, int8_t unit, const S return validInterval && validSliding && validOffset; } -static bool tsmaOptCheckValidFuncs(const SArray* pTsmaFuncs, const SNodeList* pQueryFuncs, SArray* pTsmaScanCols) { +static int32_t tsmaOptCheckValidFuncs(const SArray* pTsmaFuncs, const SNodeList* pQueryFuncs, SArray* pTsmaScanCols, + bool* pIsValid) { SNode* pNode; bool failed = false, found = false; @@ -6146,14 +6711,17 @@ static bool tsmaOptCheckValidFuncs(const SArray* pTsmaFuncs, const SNodeList* pQ continue; } found = true; - taosArrayPush(pTsmaScanCols, &i); + if (NULL == taosArrayPush(pTsmaScanCols, &i)) { + return TSDB_CODE_OUT_OF_MEMORY; + } break; } if (failed || !found) { break; } } - return found; + *pIsValid = found; + return TSDB_CODE_SUCCESS; } typedef struct STsmaOptTagCheckCtx { @@ -6197,6 +6765,7 @@ static int32_t tsmaOptFilterTsmas(STSMAOptCtx* pTsmaOptCtx) { STSMAOptUsefulTsma usefulTsma = { .pTsma = NULL, .scanRange = {.skey = TSKEY_MIN, .ekey = TSKEY_MAX}, .precision = pTsmaOptCtx->precision}; SArray* pTsmaScanCols = NULL; + int32_t code = 0; for (int32_t i = 0; i < pTsmaOptCtx->pTsmas->size; ++i) { if (!pTsmaScanCols) { @@ -6217,18 +6786,24 @@ static int32_t tsmaOptFilterTsmas(STSMAOptCtx* pTsmaOptCtx) { continue; } // filter with funcs, note that tsma funcs has been sorted by funcId and ColId - if (!tsmaOptCheckValidFuncs(pTsma->pFuncs, pTsmaOptCtx->pAggFuncs, pTsmaScanCols)) { - continue; - } + bool valid = false; + int32_t code = tsmaOptCheckValidFuncs(pTsma->pFuncs, pTsmaOptCtx->pAggFuncs, pTsmaScanCols, &valid); + if (TSDB_CODE_SUCCESS != code) break; + if (!valid) continue; if (!tsmaOptCheckTags(pTsmaOptCtx, pTsma)) continue; usefulTsma.pTsma = pTsma; usefulTsma.pTsmaScanCols = pTsmaScanCols; pTsmaScanCols = NULL; - taosArrayPush(pTsmaOptCtx->pUsefulTsmas, &usefulTsma); + if (NULL == taosArrayPush(pTsmaOptCtx->pUsefulTsmas, &usefulTsma)) { + if (pTsmaScanCols) { + taosArrayDestroy(pTsmaScanCols); + } + return TSDB_CODE_OUT_OF_MEMORY; + } } if (pTsmaScanCols) taosArrayDestroy(pTsmaScanCols); - return TSDB_CODE_SUCCESS; + return code; } static int32_t tsmaInfoCompWithIntervalDesc(const void* pLeft, const void* pRight) { @@ -6277,9 +6852,10 @@ static const STSMAOptUsefulTsma* tsmaOptFindUsefulTsma(const SArray* pUsefulTsma return NULL; } -static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pScanRange) { +static int32_t tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pScanRange) { bool needTailWindow = false; bool isSkeyAlignedWithTsma = true, isEkeyAlignedWithTsma = true; + int32_t code = 0; int64_t winSkey = TSKEY_MIN, winEkey = TSKEY_MAX; int64_t startOfSkeyFirstWin = pScanRange->skey, endOfSkeyFirstWin; int64_t startOfEkeyFirstWin = pScanRange->ekey, endOfEkeyFirstWin; @@ -6289,7 +6865,7 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc const STSMAOptUsefulTsma* pUsefulTsma = taosArrayGet(pTsmaOptCtx->pUsefulTsmas, 0); const STableTSMAInfo* pTsma = pUsefulTsma->pTsma; - if (pScanRange->ekey <= pScanRange->skey) return; + if (pScanRange->ekey <= pScanRange->skey) return code; if (!pInterval) { tsmaOptInitIntervalFromTsma(&interval, pTsma, pTsmaOptCtx->precision); @@ -6329,7 +6905,8 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc STSMAOptUsefulTsma usefulTsma = {.pTsma = pTsmaFound ? pTsmaFound->pTsma : NULL, .scanRange = scanRange, .pTsmaScanCols = pTsmaFound ? pTsmaFound->pTsmaScanCols : NULL}; - taosArrayPush(pTsmaOptCtx->pUsedTsmas, &usefulTsma); + if (NULL == taosArrayPush(pTsmaOptCtx->pUsedTsmas, &usefulTsma)) + return TSDB_CODE_OUT_OF_MEMORY; } // the main tsma @@ -6341,7 +6918,8 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc } STSMAOptUsefulTsma usefulTsma = { .pTsma = pTsma, .scanRange = scanRange, .pTsmaScanCols = pUsefulTsma->pTsmaScanCols}; - taosArrayPush(pTsmaOptCtx->pUsedTsmas, &usefulTsma); + if (NULL == taosArrayPush(pTsmaOptCtx->pUsedTsmas, &usefulTsma)) + return TSDB_CODE_OUT_OF_MEMORY; } // add tail tsma if possible @@ -6354,11 +6932,13 @@ static void tsmaOptSplitWindows(STSMAOptCtx* pTsmaOptCtx, const STimeWindow* pSc STSMAOptUsefulTsma usefulTsma = {.pTsma = pTsmaFound ? pTsmaFound->pTsma : NULL, .scanRange = scanRange, .pTsmaScanCols = pTsmaFound ? pTsmaFound->pTsmaScanCols : NULL}; - taosArrayPush(pTsmaOptCtx->pUsedTsmas, &usefulTsma); + if (NULL == taosArrayPush(pTsmaOptCtx->pUsedTsmas, &usefulTsma)) + return TSDB_CODE_OUT_OF_MEMORY; } + return code; } -SNodeList* tsmaOptCreateTsmaScanCols(const STSMAOptUsefulTsma* pTsma, const SNodeList* pAggFuncs) { +int32_t tsmaOptCreateTsmaScanCols(const STSMAOptUsefulTsma* pTsma, const SNodeList* pAggFuncs, SNodeList** ppList) { ASSERT(pTsma->pTsma); ASSERT(pTsma->pTsmaScanCols); int32_t code; @@ -6373,7 +6953,8 @@ SNodeList* tsmaOptCreateTsmaScanCols(const STSMAOptUsefulTsma* pTsma, const SNod continue; } const int32_t* idx = taosArrayGet(pTsma->pTsmaScanCols, i); - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (pCol) { pCol->colId = *idx + 2; pCol->tableType = TSDB_SUPER_TABLE; @@ -6385,8 +6966,6 @@ SNodeList* tsmaOptCreateTsmaScanCols(const STSMAOptUsefulTsma* pTsma, const SNod strcpy(pCol->node.aliasName, pFunc->node.aliasName); pCol->node.resType.type = TSDB_DATA_TYPE_BINARY; code = nodesListMakeStrictAppend(&pScanCols, (SNode*)pCol); - } else { - code = TSDB_CODE_OUT_OF_MEMORY; } if (code) break; ++i; @@ -6395,8 +6974,10 @@ SNodeList* tsmaOptCreateTsmaScanCols(const STSMAOptUsefulTsma* pTsma, const SNod if (code) { nodesDestroyList(pScanCols); pScanCols = NULL; + } else { + *ppList = pScanCols; } - return pScanCols; + return code; } static int32_t tsmaOptRewriteTag(const STSMAOptCtx* pTsmaOptCtx, const STSMAOptUsefulTsma* pTsma, @@ -6422,9 +7003,9 @@ static int32_t tsmaOptRewriteTag(const STSMAOptCtx* pTsmaOptCtx, const STSMAOptU static int32_t tsmaOptRewriteTbname(const STSMAOptCtx* pTsmaOptCtx, SNode** pTbNameNode, const STSMAOptUsefulTsma* pTsma) { int32_t code = 0; - SExprNode* pRewrittenFunc = (SExprNode*)nodesMakeNode(pTsma ? QUERY_NODE_COLUMN : QUERY_NODE_FUNCTION); + SExprNode* pRewrittenFunc = NULL; + code = nodesMakeNode(pTsma ? QUERY_NODE_COLUMN : QUERY_NODE_FUNCTION, (SNode**)&pRewrittenFunc); SValueNode* pValue = NULL; - if (!pRewrittenFunc) code = TSDB_CODE_OUT_OF_MEMORY; if (code == TSDB_CODE_SUCCESS) { pRewrittenFunc->resType = ((SExprNode*)(*pTbNameNode))->resType; } @@ -6444,7 +7025,7 @@ static int32_t tsmaOptRewriteTbname(const STSMAOptCtx* pTsmaOptCtx, SNode** pTbN SFunctionNode* pFunc = (SFunctionNode*)pRewrittenFunc; pFunc->funcId = fmGetFuncId("concat"); snprintf(pFunc->functionName, TSDB_FUNC_NAME_LEN, "concat"); - pValue = (SValueNode*)nodesMakeNode(QUERY_NODE_VALUE); + code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValue); if (!pValue) code = TSDB_CODE_OUT_OF_MEMORY; if (code == TSDB_CODE_SUCCESS) { @@ -6537,24 +7118,24 @@ static int32_t tsmaOptRewriteScan(STSMAOptCtx* pTsmaOptCtx, SScanLogicNode* pNew SColumnNode* pCol = (SColumnNode*)pNode; ASSERT(pTsma->pTsmaScanCols); if (pCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID) { - pPkTsCol = (SColumnNode*)nodesCloneNode((SNode*)pCol); - if (!pPkTsCol) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pPkTsCol = NULL; + code = nodesCloneNode((SNode*)pCol, (SNode**)&pPkTsCol); break; } } if (code == TSDB_CODE_SUCCESS) { nodesDestroyList(pNewScan->pScanCols); // normal cols - pNewScan->pScanCols = tsmaOptCreateTsmaScanCols(pTsma, pTsmaOptCtx->pAggFuncs); - if (!pNewScan->pScanCols) code = TSDB_CODE_OUT_OF_MEMORY; + pNewScan->pScanCols = NULL; + code = tsmaOptCreateTsmaScanCols(pTsma, pTsmaOptCtx->pAggFuncs, &pNewScan->pScanCols); } if (code == TSDB_CODE_SUCCESS && pPkTsCol) { tstrncpy(pPkTsCol->tableName, pTsma->targetTbName, TSDB_TABLE_NAME_LEN); tstrncpy(pPkTsCol->tableAlias, pTsma->targetTbName, TSDB_TABLE_NAME_LEN); pPkTsCol->tableId = pTsma->targetTbUid; - nodesListMakeStrictAppend(&pNewScan->pScanCols, nodesCloneNode((SNode*)pPkTsCol)); + code = nodesListMakeStrictAppend(&pNewScan->pScanCols, (SNode*)pPkTsCol); + } else if (pPkTsCol){ + nodesDestroyNode((SNode*)pPkTsCol); } if (code == TSDB_CODE_SUCCESS) { pNewScan->stableId = pTsma->pTsma->destTbUid; @@ -6570,17 +7151,23 @@ static int32_t tsmaOptRewriteScan(STSMAOptCtx* pTsmaOptCtx, SScanLogicNode* pNew if (code == TSDB_CODE_SUCCESS) { code = tsmaOptRewriteNodeList(pNewScan->pGroupTags, pTsmaOptCtx, pTsma, true, true); } - pTsmaOptCtx->pScan->dataRequired = FUNC_DATA_REQUIRED_DATA_LOAD; - if (pTsmaOptCtx->pScan->pTsmaTargetTbVgInfo && pTsmaOptCtx->pScan->pTsmaTargetTbVgInfo->size > 0) { - for (int32_t i = 0; i < taosArrayGetSize(pTsmaOptCtx->pScan->pTsmas); ++i) { - STableTSMAInfo* pTsmaInfo = taosArrayGetP(pTsmaOptCtx->pScan->pTsmas, i); - if (pTsmaInfo == pTsma->pTsma) { - const SVgroupsInfo* pVgpsInfo = taosArrayGetP(pTsmaOptCtx->pScan->pTsmaTargetTbVgInfo, i); - taosMemoryFreeClear(pNewScan->pVgroupList); - int32_t len = sizeof(int32_t) + sizeof(SVgroupInfo) * pVgpsInfo->numOfVgroups; - pNewScan->pVgroupList = taosMemoryCalloc(1, len); - memcpy(pNewScan->pVgroupList, pVgpsInfo, len); - break; + if (TSDB_CODE_SUCCESS == code) { + pTsmaOptCtx->pScan->dataRequired = FUNC_DATA_REQUIRED_DATA_LOAD; + if (pTsmaOptCtx->pScan->pTsmaTargetTbVgInfo && pTsmaOptCtx->pScan->pTsmaTargetTbVgInfo->size > 0) { + for (int32_t i = 0; i < taosArrayGetSize(pTsmaOptCtx->pScan->pTsmas); ++i) { + STableTSMAInfo* pTsmaInfo = taosArrayGetP(pTsmaOptCtx->pScan->pTsmas, i); + if (pTsmaInfo == pTsma->pTsma) { + const SVgroupsInfo* pVgpsInfo = taosArrayGetP(pTsmaOptCtx->pScan->pTsmaTargetTbVgInfo, i); + taosMemoryFreeClear(pNewScan->pVgroupList); + int32_t len = sizeof(int32_t) + sizeof(SVgroupInfo) * pVgpsInfo->numOfVgroups; + pNewScan->pVgroupList = taosMemoryCalloc(1, len); + if (!pNewScan->pVgroupList) { + code = TSDB_CODE_OUT_OF_MEMORY; + break; + } + memcpy(pNewScan->pVgroupList, pVgpsInfo, len); + break; + } } } } @@ -6601,19 +7188,20 @@ static int32_t tsmaOptRewriteScan(STSMAOptCtx* pTsmaOptCtx, SScanLogicNode* pNew } static int32_t tsmaOptCreateWStart(int8_t precision, SFunctionNode** pWStartOut) { - SFunctionNode* pWStart = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pWStart = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pWStart); if (NULL == pWStart) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pWStart->functionName, "_wstart"); int64_t pointer = (int64_t)pWStart; char name[TSDB_COL_NAME_LEN + TSDB_POINTER_PRINT_BYTES + TSDB_NAME_DELIMITER_LEN + 1] = {0}; int32_t len = snprintf(name, sizeof(name) - 1, "%s.%" PRId64 "", pWStart->functionName, pointer); - taosCreateMD5Hash(name, len); + (void)taosCreateMD5Hash(name, len); strncpy(pWStart->node.aliasName, name, TSDB_COL_NAME_LEN - 1); pWStart->node.resType.precision = precision; - int32_t code = fmGetFuncInfo(pWStart, NULL, 0); + code = fmGetFuncInfo(pWStart, NULL, 0); if (code) { nodesDestroyNode((SNode*)pWStart); } else { @@ -6652,6 +7240,7 @@ static int32_t tsmaOptRewriteParent(STSMAOptCtx* pTsmaOptCtx, SLogicNode* pParen nodesRewriteExpr(&pAggFuncNode, tsmaOptNodeRewriter, &ctx); if (ctx.code) { code = ctx.code; + break; } else { REPLACE_NODE(pAggFuncNode); } @@ -6666,10 +7255,18 @@ static int32_t tsmaOptRewriteParent(STSMAOptCtx* pTsmaOptCtx, SLogicNode* pParen pScanListCell = pScanListCell->pNext; pColNode->node.resType = pPartial->node.resType; // currently we assume that the first parameter must be the scan column - nodesListErase(pMerge->pParameterList, pMerge->pParameterList->pHead); - nodesListPushFront(pMerge->pParameterList, nodesCloneNode((SNode*)pColNode)); - + (void)nodesListErase(pMerge->pParameterList, pMerge->pParameterList->pHead); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pColNode, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListPushFront(pMerge->pParameterList, pNew); + } nodesDestroyNode((SNode*)pPartial); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pNew); + break; + } + REPLACE_NODE(pMerge); } @@ -6677,7 +7274,8 @@ static int32_t tsmaOptRewriteParent(STSMAOptCtx* pTsmaOptCtx, SLogicNode* pParen SColumnNode* pCol = (SColumnNode*)pScan->pScanCols->pTail->pNode; assert(pCol->colId == PRIMARYKEY_TIMESTAMP_COL_ID); nodesDestroyNode(pWindow->pTspk); - pWindow->pTspk = nodesCloneNode((SNode*)pCol); + pWindow->pTspk = NULL; + code = nodesCloneNode((SNode*)pCol, &pWindow->pTspk); } if (code == TSDB_CODE_SUCCESS) { @@ -6717,17 +7315,17 @@ static int32_t tsmaOptGeneratePlan(STSMAOptCtx* pTsmaOptCtx) { for (int32_t i = 1; i < pTsmaOptCtx->pUsedTsmas->size && code == TSDB_CODE_SUCCESS; ++i) { pTsma = taosArrayGet(pTsmaOptCtx->pUsedTsmas, i); - SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + SLogicSubplan* pSubplan = NULL; + code = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN, (SNode**)&pSubplan); if (!pSubplan) { - code = TSDB_CODE_OUT_OF_MEMORY; break; } pSubplan->subplanType = SUBPLAN_TYPE_SCAN; pTsmaOptCtx->generatedSubPlans[i - 1] = pSubplan; hasSubPlan = true; - SLogicNode* pParent = (SLogicNode*)nodesCloneNode((SNode*)pTsmaOptCtx->pParent); + SLogicNode* pParent = NULL; + code = nodesCloneNode((SNode*)pTsmaOptCtx->pParent, (SNode**)&pParent); if (!pParent) { - code = TSDB_CODE_OUT_OF_MEMORY; break; } pSubplan->pNode = pParent; @@ -6766,7 +7364,7 @@ static bool tsmaOptIsUsingTsmas(STSMAOptCtx* pCtx) { static int32_t tsmaOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan) { int32_t code = 0; STSMAOptCtx tsmaOptCtx = {0}; - SScanLogicNode* pScan = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, tsmaOptMayBeOptimized); + SScanLogicNode* pScan = (SScanLogicNode*)optFindPossibleNode(pLogicSubplan->pNode, tsmaOptMayBeOptimized, NULL); if (!pScan) return code; SLogicNode* pRootNode = getLogicNodeRootNode((SLogicNode*)pScan); @@ -6781,17 +7379,17 @@ static int32_t tsmaOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSubplan // 2. sort useful tsmas with interval taosArraySort(tsmaOptCtx.pUsefulTsmas, tsmaInfoCompWithIntervalDesc); // 3. split windows - tsmaOptSplitWindows(&tsmaOptCtx, tsmaOptCtx.pTimeRange); - if (tsmaOptIsUsingTsmas(&tsmaOptCtx)) { + code = tsmaOptSplitWindows(&tsmaOptCtx, tsmaOptCtx.pTimeRange); + if (TSDB_CODE_SUCCESS == code && tsmaOptIsUsingTsmas(&tsmaOptCtx)) { // 4. create logic plan code = tsmaOptGeneratePlan(&tsmaOptCtx); if (TSDB_CODE_SUCCESS == code) { - for (int32_t i = 0; i < 2; i++) { + for (int32_t i = 0; i < 2 && (TSDB_CODE_SUCCESS == code); i++) { SLogicSubplan* pSubplan = tsmaOptCtx.generatedSubPlans[i]; if (!pSubplan) continue; pSubplan->subplanType = SUBPLAN_TYPE_SCAN; - nodesListMakeAppend(tsmaOptCtx.ppParentTsmaSubplans, (SNode*)pSubplan); + code = nodesListMakeAppend(tsmaOptCtx.ppParentTsmaSubplans, (SNode*)pSubplan); } pCxt->optimized = true; } @@ -6834,24 +7432,31 @@ static const SOptimizeRule optimizeRuleSet[] = { static const int32_t optimizeRuleNum = (sizeof(optimizeRuleSet) / sizeof(SOptimizeRule)); -static void dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) { +static int32_t dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) { + int32_t code = 0; if (!tsQueryPlannerTrace) { - return; + return code; } char* pStr = NULL; - nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL); - if (NULL == pRuleName) { - qDebugL("before optimize, JsonPlan: %s", pStr); - } else { - qDebugL("apply optimize %s rule, JsonPlan: %s", pRuleName, pStr); + code = nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL); + if (TSDB_CODE_SUCCESS == code) { + if (NULL == pRuleName) { + qDebugL("before optimize, JsonPlan: %s", pStr); + } else { + qDebugL("apply optimize %s rule, JsonPlan: %s", pRuleName, pStr); + } + taosMemoryFree(pStr); } - taosMemoryFree(pStr); + return code; } static int32_t applyOptimizeRule(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan) { SOptimizeContext cxt = {.pPlanCxt = pCxt, .optimized = false}; bool optimized = false; - dumpLogicSubplan(NULL, pLogicSubplan); + int32_t code = dumpLogicSubplan(NULL, pLogicSubplan); + if (TSDB_CODE_SUCCESS != code) { + return code; + } do { optimized = false; for (int32_t i = 0; i < optimizeRuleNum; ++i) { @@ -6862,12 +7467,12 @@ static int32_t applyOptimizeRule(SPlanContext* pCxt, SLogicSubplan* pLogicSubpla } if (cxt.optimized) { optimized = true; - dumpLogicSubplan(optimizeRuleSet[i].pName, pLogicSubplan); + code = dumpLogicSubplan(optimizeRuleSet[i].pName, pLogicSubplan); break; } } - } while (optimized); - return TSDB_CODE_SUCCESS; + } while (optimized && (TSDB_CODE_SUCCESS == code)); + return code; } int32_t optimizeLogicPlan(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan) { diff --git a/source/libs/planner/src/planPhysiCreater.c b/source/libs/planner/src/planPhysiCreater.c index 1b896e03c3..d75e02bc6b 100644 --- a/source/libs/planner/src/planPhysiCreater.c +++ b/source/libs/planner/src/planPhysiCreater.c @@ -82,8 +82,10 @@ static int32_t getSlotKey(SNode* pNode, const char* pStmtName, char* pKey, int32 static SNode* createSlotDesc(SPhysiPlanContext* pCxt, const char* pName, const SNode* pNode, int16_t slotId, bool output, bool reserve) { - SSlotDescNode* pSlot = (SSlotDescNode*)nodesMakeNode(QUERY_NODE_SLOT_DESC); + SSlotDescNode* pSlot = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_SLOT_DESC, (SNode**)&pSlot); if (NULL == pSlot) { + terrno = code; return NULL; } snprintf(pSlot->name, sizeof(pSlot->name), "%s", pName); @@ -95,9 +97,10 @@ static SNode* createSlotDesc(SPhysiPlanContext* pCxt, const char* pName, const S } static int32_t createTarget(SNode* pNode, int16_t dataBlockId, int16_t slotId, SNode** pOutput) { - STargetNode* pTarget = (STargetNode*)nodesMakeNode(QUERY_NODE_TARGET); + STargetNode* pTarget = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_TARGET, (SNode**)&pTarget); if (NULL == pTarget) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pTarget->dataBlockId = dataBlockId; @@ -112,7 +115,9 @@ static int32_t putSlotToHashImpl(int16_t dataBlockId, int16_t slotId, const char SSlotIndex* pIndex = taosHashGet(pHash, pName, len); if (NULL != pIndex) { SSlotIdInfo info = {.slotId = slotId, .set = false}; - taosArrayPush(pIndex->pSlotIdsInfo, &info); + if (NULL == taosArrayPush(pIndex->pSlotIdsInfo, &info)) { + return TSDB_CODE_OUT_OF_MEMORY; + } return TSDB_CODE_SUCCESS; } @@ -121,7 +126,9 @@ static int32_t putSlotToHashImpl(int16_t dataBlockId, int16_t slotId, const char return TSDB_CODE_OUT_OF_MEMORY; } SSlotIdInfo info = {.slotId = slotId, .set = false}; - taosArrayPush(index.pSlotIdsInfo, &info); + if (NULL == taosArrayPush(index.pSlotIdsInfo, &info)) { + return TSDB_CODE_OUT_OF_MEMORY; + } return taosHashPut(pHash, pName, len, &index, sizeof(SSlotIndex)); } @@ -146,17 +153,17 @@ static int32_t createDataBlockDescHash(SPhysiPlanContext* pCxt, int32_t capacity static int32_t buildDataBlockSlots(SPhysiPlanContext* pCxt, SNodeList* pList, SDataBlockDescNode* pDataBlockDesc, SHashObj* pHash) { - pDataBlockDesc->pSlots = nodesMakeList(); + pDataBlockDesc->pSlots = NULL; + int32_t code = nodesMakeList(&pDataBlockDesc->pSlots); if (NULL == pDataBlockDesc->pSlots) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; int16_t slotId = 0; SNode* pNode = NULL; FOREACH(pNode, pList) { char name[TSDB_COL_FNAME_LEN + 1] = {0}; - getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); + (void)getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); code = nodesListStrictAppend(pDataBlockDesc->pSlots, createSlotDesc(pCxt, name, pNode, slotId, true, false)); if (TSDB_CODE_SUCCESS == code) { code = putSlotToHash(name, pDataBlockDesc->dataBlockId, slotId, pNode, pHash); @@ -173,14 +180,15 @@ static int32_t buildDataBlockSlots(SPhysiPlanContext* pCxt, SNodeList* pList, SD } static int32_t createDataBlockDesc(SPhysiPlanContext* pCxt, SNodeList* pList, SDataBlockDescNode** pDataBlockDesc) { - SDataBlockDescNode* pDesc = (SDataBlockDescNode*)nodesMakeNode(QUERY_NODE_DATABLOCK_DESC); + SDataBlockDescNode* pDesc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_DATABLOCK_DESC, (SNode**)&pDesc); if (NULL == pDesc) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pDesc->dataBlockId = pCxt->nextDataBlockId++; SHashObj* pHash = NULL; - int32_t code = createDataBlockDescHash(pCxt, LIST_LENGTH(pList), pDesc->dataBlockId, &pHash); + code = createDataBlockDescHash(pCxt, LIST_LENGTH(pList), pDesc->dataBlockId, &pHash); if (TSDB_CODE_SUCCESS == code) { code = buildDataBlockSlots(pCxt, pList, pDesc, pHash); } @@ -334,9 +342,10 @@ static int32_t setNodeSlotId(SPhysiPlanContext* pCxt, int16_t leftDataBlockId, i return TSDB_CODE_SUCCESS; } - SNode* pRes = nodesCloneNode(pNode); + SNode* pRes = NULL; + int32_t code = nodesCloneNode(pNode, &pRes); if (NULL == pRes) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SSetSlotIdCxt cxt = { @@ -359,9 +368,10 @@ static int32_t setListSlotId(SPhysiPlanContext* pCxt, int16_t leftDataBlockId, i return TSDB_CODE_SUCCESS; } - SNodeList* pRes = nodesCloneList(pList); + SNodeList* pRes = NULL; + int32_t code = nodesCloneList(pList, &pRes); if (NULL == pRes) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SSetSlotIdCxt cxt = { @@ -378,8 +388,10 @@ static int32_t setListSlotId(SPhysiPlanContext* pCxt, int16_t leftDataBlockId, i } static SPhysiNode* makePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode, ENodeType type) { - SPhysiNode* pPhysiNode = (SPhysiNode*)nodesMakeNode(type); + SPhysiNode* pPhysiNode = NULL; + int32_t code = nodesMakeNode(type, (SNode**)&pPhysiNode); if (NULL == pPhysiNode) { + terrno = code; return NULL; } @@ -389,9 +401,10 @@ static SPhysiNode* makePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode pPhysiNode->inputTsOrder = pLogicNode->inputTsOrder; pPhysiNode->outputTsOrder = pLogicNode->outputTsOrder; - int32_t code = createDataBlockDesc(pCxt, pLogicNode->pTargets, &pPhysiNode->pOutputDataBlockDesc); + code = createDataBlockDesc(pCxt, pLogicNode->pTargets, &pPhysiNode->pOutputDataBlockDesc); if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pPhysiNode); + terrno = code; return NULL; } pPhysiNode->pOutputDataBlockDesc->precision = pLogicNode->precision; @@ -418,8 +431,18 @@ static int32_t sortScanCols(SNodeList* pScanCols) { return TSDB_CODE_OUT_OF_MEMORY; } + int32_t code = 0; SNode* pCol = NULL; - FOREACH(pCol, pScanCols) { taosArrayPush(pArray, &pCol); } + FOREACH(pCol, pScanCols) { + if (NULL == taosArrayPush(pArray, &pCol)) { + code = TSDB_CODE_OUT_OF_MEMORY; + break; + } + } + if (TSDB_CODE_SUCCESS != code) { + taosArrayDestroy(pArray); + return code; + } taosArraySort(pArray, colIdCompare); int32_t index = 0; @@ -434,9 +457,10 @@ static int32_t createScanCols(SPhysiPlanContext* pCxt, SScanPhysiNode* pScanPhys return TSDB_CODE_SUCCESS; } - pScanPhysiNode->pScanCols = nodesCloneList(pScanCols); + pScanPhysiNode->pScanCols = NULL; + int32_t code = nodesCloneList(pScanCols, &pScanPhysiNode->pScanCols); if (NULL == pScanPhysiNode->pScanCols) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } return sortScanCols(pScanPhysiNode->pScanCols); } @@ -449,9 +473,10 @@ static int32_t createScanPhysiNodeFinalize(SPhysiPlanContext* pCxt, SSubplan* pS } if (TSDB_CODE_SUCCESS == code && NULL != pScanLogicNode->pScanPseudoCols) { - pScanPhysiNode->pScanPseudoCols = nodesCloneList(pScanLogicNode->pScanPseudoCols); + pScanPhysiNode->pScanPseudoCols = NULL; + code = nodesCloneList(pScanLogicNode->pScanPseudoCols, &pScanPhysiNode->pScanPseudoCols); if (NULL == pScanPhysiNode->pScanPseudoCols) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } @@ -470,18 +495,20 @@ static int32_t createScanPhysiNodeFinalize(SPhysiPlanContext* pCxt, SSubplan* pS pScanPhysiNode->groupOrderScan = pScanLogicNode->groupOrderScan; memcpy(&pScanPhysiNode->tableName, &pScanLogicNode->tableName, sizeof(SName)); if (NULL != pScanLogicNode->pTagCond) { - pSubplan->pTagCond = nodesCloneNode(pScanLogicNode->pTagCond); + pSubplan->pTagCond = NULL; + code = nodesCloneNode(pScanLogicNode->pTagCond, &pSubplan->pTagCond); if (NULL == pSubplan->pTagCond) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } } if (TSDB_CODE_SUCCESS == code) { if (NULL != pScanLogicNode->pTagIndexCond) { - pSubplan->pTagIndexCond = nodesCloneNode(pScanLogicNode->pTagIndexCond); + pSubplan->pTagIndexCond = NULL; + code = nodesCloneNode(pScanLogicNode->pTagIndexCond, &pSubplan->pTagIndexCond); if (NULL == pSubplan->pTagIndexCond) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } } @@ -525,7 +552,7 @@ static int32_t createSimpleScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSub SScanPhysiNode* pScan = (SScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode, getScanOperatorType(pScanLogicNode->scanType)); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (pScanLogicNode->pVgroupList) { @@ -539,7 +566,7 @@ static int32_t createTagScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubpla STagScanPhysiNode* pScan = (STagScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode, QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (pScanLogicNode->pVgroupList) { vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode); @@ -554,14 +581,19 @@ static int32_t createLastRowScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSu SLastRowScanPhysiNode* pScan = (SLastRowScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode, QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } - pScan->pTargets = nodesCloneList(pScanLogicNode->node.pTargets); - - pScan->pGroupTags = nodesCloneList(pScanLogicNode->pGroupTags); - if (NULL != pScanLogicNode->pGroupTags && NULL == pScan->pGroupTags) { + pScan->pTargets = NULL; + int32_t code = nodesCloneList(pScanLogicNode->node.pTargets, &pScan->pTargets); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pScan); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + pScan->pGroupTags = NULL; + code = nodesCloneList(pScanLogicNode->pGroupTags, &pScan->pGroupTags); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pScan); + return code; } pScan->groupSort = pScanLogicNode->groupSort; @@ -571,7 +603,7 @@ static int32_t createLastRowScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSu vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode); } - int32_t code = createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pScan, pPhyNode); + code = createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pScan, pPhyNode); if (TSDB_CODE_SUCCESS == code && pScanLogicNode->pFuncTypes != NULL) { pScan->pFuncTypes = taosArrayInit(taosArrayGetSize(pScanLogicNode->pFuncTypes), sizeof(int32_t)); if (NULL == pScan->pFuncTypes) { @@ -590,7 +622,9 @@ static int32_t createLastRowScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSu SFunctParam* pFunctParam = taosArrayGet(pScanLogicNode->pFuncTypes, i); if (pColNode->colId == pFunctParam->pCol->colId && 0 == strncmp(pColNode->colName, pFunctParam->pCol->name, strlen(pColNode->colName))) { - taosArrayInsert(pScan->pFuncTypes, funcTypeIndex, &pFunctParam->type); + if (NULL == taosArrayInsert(pScan->pFuncTypes, funcTypeIndex, &pFunctParam->type)) { + code = TSDB_CODE_OUT_OF_MEMORY; + } break; } } @@ -605,13 +639,14 @@ static int32_t createTableCountScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* STableCountScanPhysiNode* pScan = (STableCountScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode, QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } - pScan->pGroupTags = nodesCloneList(pScanLogicNode->pGroupTags); + pScan->pGroupTags = NULL; + int32_t code = nodesCloneList(pScanLogicNode->pGroupTags, &pScan->pGroupTags); if (NULL != pScanLogicNode->pGroupTags && NULL == pScan->pGroupTags) { nodesDestroyNode((SNode*)pScan); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pScan->groupSort = pScanLogicNode->groupSort; @@ -626,7 +661,7 @@ static int32_t createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubp STableScanPhysiNode* pTableScan = (STableScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode, getScanOperatorType(pScanLogicNode->scanType)); if (NULL == pTableScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } memcpy(pTableScan->scanSeq, pScanLogicNode->scanSeq, sizeof(pScanLogicNode->scanSeq)); @@ -636,14 +671,19 @@ static int32_t createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubp vgroupInfoToNodeAddr(pScanLogicNode->pVgroupList->vgroups, &pSubplan->execNode); pSubplan->execNodeStat.tableNum = pScanLogicNode->pVgroupList->vgroups[0].numOfTable; } - tNameGetFullDbName(&pScanLogicNode->tableName, pSubplan->dbFName); + (void)tNameGetFullDbName(&pScanLogicNode->tableName, pSubplan->dbFName); pTableScan->dataRequired = pScanLogicNode->dataRequired; - pTableScan->pDynamicScanFuncs = nodesCloneList(pScanLogicNode->pDynamicScanFuncs); - pTableScan->pGroupTags = nodesCloneList(pScanLogicNode->pGroupTags); - if ((NULL != pScanLogicNode->pDynamicScanFuncs && NULL == pTableScan->pDynamicScanFuncs) || - (NULL != pScanLogicNode->pGroupTags && NULL == pTableScan->pGroupTags)) { + pTableScan->pDynamicScanFuncs = NULL; + int32_t code = nodesCloneList(pScanLogicNode->pDynamicScanFuncs, &pTableScan->pDynamicScanFuncs); + if (TSDB_CODE_SUCCESS != code) { nodesDestroyNode((SNode*)pTableScan); - return TSDB_CODE_OUT_OF_MEMORY; + return code; + } + pTableScan->pGroupTags = NULL; + code = nodesCloneList(pScanLogicNode->pGroupTags, &pTableScan->pGroupTags); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pTableScan); + return code; } pTableScan->groupSort = pScanLogicNode->groupSort; pTableScan->interval = pScanLogicNode->interval; @@ -661,7 +701,7 @@ static int32_t createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubp pTableScan->paraTablesSort = pScanLogicNode->paraTablesSort; pTableScan->smallDataTsSort = pScanLogicNode->smallDataTsSort; - int32_t code = createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pTableScan, pPhyNode); + code = createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pTableScan, pPhyNode); if (TSDB_CODE_SUCCESS == code) { code = setListSlotId(pCxt, pTableScan->scan.node.pOutputDataBlockDesc->dataBlockId, -1, pScanLogicNode->pTags, &pTableScan->pTags); @@ -678,7 +718,7 @@ static int32_t createSystemTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* SSystemTableScanPhysiNode* pScan = (SSystemTableScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pScanLogicNode, QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pSubplan->showRewrite = pScanLogicNode->showRewrite; @@ -700,7 +740,7 @@ static int32_t createSystemTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* } else { pScan->mgmtEpSet = pCxt->pPlanCxt->mgmtEpSet; } - tNameGetFullDbName(&pScanLogicNode->tableName, pSubplan->dbFName); + (void)tNameGetFullDbName(&pScanLogicNode->tableName, pSubplan->dbFName); pCxt->hasSysScan = true; return createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pScan, pPhyNode); @@ -757,24 +797,40 @@ static int32_t getJoinDataBlockDescNode(SNodeList* pChildren, int32_t idx, SData } static int32_t setColEqList(SNode* pEqCond, int16_t leftBlkId, int16_t rightBlkId, SNodeList** ppLeft, SNodeList** ppRight) { + int32_t code = 0; if (QUERY_NODE_OPERATOR == nodeType(pEqCond) && ((SOperatorNode*)pEqCond)->opType == OP_TYPE_EQUAL) { SOperatorNode* pOp = (SOperatorNode*)pEqCond; + SNode* pNew = NULL; if (leftBlkId == ((SColumnNode*)pOp->pLeft)->dataBlockId) { - nodesListMakeStrictAppend(ppLeft, nodesCloneNode(pOp->pLeft)); + code = nodesCloneNode(pOp->pLeft, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(ppLeft, pNew); + } } else if (rightBlkId == ((SColumnNode*)pOp->pLeft)->dataBlockId) { - nodesListMakeStrictAppend(ppRight, nodesCloneNode(pOp->pLeft)); + code = nodesCloneNode(pOp->pLeft, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(ppRight, pNew); + } } else { planError("invalid col equal list, leftBlockId:%d", ((SColumnNode*)pOp->pLeft)->dataBlockId); return TSDB_CODE_PLAN_INTERNAL_ERROR; } - - if (leftBlkId == ((SColumnNode*)pOp->pRight)->dataBlockId) { - nodesListMakeStrictAppend(ppLeft, nodesCloneNode(pOp->pRight)); - } else if (rightBlkId == ((SColumnNode*)pOp->pRight)->dataBlockId) { - nodesListMakeStrictAppend(ppRight, nodesCloneNode(pOp->pRight)); - } else { - planError("invalid col equal list, rightBlockId:%d", ((SColumnNode*)pOp->pRight)->dataBlockId); - return TSDB_CODE_PLAN_INTERNAL_ERROR; + if (TSDB_CODE_SUCCESS == code) { + pNew = NULL; + if (leftBlkId == ((SColumnNode*)pOp->pRight)->dataBlockId) { + code = nodesCloneNode(pOp->pRight, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(ppLeft, pNew); + } + } else if (rightBlkId == ((SColumnNode*)pOp->pRight)->dataBlockId) { + code = nodesCloneNode(pOp->pRight, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(ppRight, pNew); + } + } else { + planError("invalid col equal list, rightBlockId:%d", ((SColumnNode*)pOp->pRight)->dataBlockId); + return TSDB_CODE_PLAN_INTERNAL_ERROR; + } } } else if (QUERY_NODE_LOGIC_CONDITION == nodeType(pEqCond) && ((SLogicConditionNode*)pEqCond)->condType == LOGIC_COND_TYPE_AND) { SLogicConditionNode* pLogic = (SLogicConditionNode*)pEqCond; @@ -790,10 +846,11 @@ static int32_t setColEqList(SNode* pEqCond, int16_t leftBlkId, int16_t rightBlkI return TSDB_CODE_PLAN_INTERNAL_ERROR; } - return TSDB_CODE_SUCCESS; + return code; } static int32_t setMergeJoinPrimColEqCond(SNode* pEqCond, int32_t subType, int16_t leftBlkId, int16_t rightBlkId, SSortMergeJoinPhysiNode* pJoin) { + int32_t code = 0; if (QUERY_NODE_OPERATOR == nodeType(pEqCond)) { SOperatorNode* pOp = (SOperatorNode*)pEqCond; if (pOp->opType != OP_TYPE_EQUAL && JOIN_STYPE_ASOF != subType) { @@ -830,10 +887,12 @@ static int32_t setMergeJoinPrimColEqCond(SNode* pEqCond, int32_t subType, int16_ if (leftBlkId == pCol->dataBlockId) { pJoin->leftPrimSlotId = pCol->slotId; pJoin->asofOpType = pOp->opType; - pJoin->leftPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->leftPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->leftPrimExpr); } else if (rightBlkId == pCol->dataBlockId) { pJoin->rightPrimSlotId = pCol->slotId; - pJoin->rightPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->rightPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->rightPrimExpr); } else { planError("invalid primary key col equal cond, leftBlockId:%d", pCol->dataBlockId); return TSDB_CODE_PLAN_INTERNAL_ERROR; @@ -844,7 +903,9 @@ static int32_t setMergeJoinPrimColEqCond(SNode* pEqCond, int32_t subType, int16_ planError("invalid primary cond left node type, leftNodeType:%d", nodeType(pOp->pLeft)); return TSDB_CODE_PLAN_INTERNAL_ERROR; } - + if (TSDB_CODE_SUCCESS != code) { + return code; + } switch (nodeType(pOp->pRight)) { case QUERY_NODE_COLUMN: { SColumnNode* pCol = (SColumnNode*)pOp->pRight; @@ -874,10 +935,12 @@ static int32_t setMergeJoinPrimColEqCond(SNode* pEqCond, int32_t subType, int16_ if (leftBlkId == pCol->dataBlockId) { pJoin->leftPrimSlotId = pCol->slotId; pJoin->asofOpType = getAsofJoinReverseOp(pOp->opType); - pJoin->leftPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->leftPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->leftPrimExpr); } else if (rightBlkId == pCol->dataBlockId) { pJoin->rightPrimSlotId = pCol->slotId; - pJoin->rightPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->rightPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->rightPrimExpr); } else { planError("invalid primary key col equal cond, rightBlockId:%d", pCol->dataBlockId); return TSDB_CODE_PLAN_INTERNAL_ERROR; @@ -893,7 +956,7 @@ static int32_t setMergeJoinPrimColEqCond(SNode* pEqCond, int32_t subType, int16_ return TSDB_CODE_PLAN_INTERNAL_ERROR; } - return TSDB_CODE_SUCCESS; + return code; } static int32_t createMergeJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren, SJoinLogicNode* pJoinLogicNode, @@ -901,20 +964,26 @@ static int32_t createMergeJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChi SSortMergeJoinPhysiNode* pJoin = (SSortMergeJoinPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pJoinLogicNode, QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN); if (NULL == pJoin) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } - pJoin->joinType = pJoinLogicNode->joinType; - pJoin->subType = pJoinLogicNode->subType; - pJoin->pWindowOffset = nodesCloneNode(pJoinLogicNode->pWindowOffset); - pJoin->pJLimit = nodesCloneNode(pJoinLogicNode->pJLimit); - pJoin->node.inputTsOrder = pJoinLogicNode->node.inputTsOrder; - pJoin->seqWinGroup = pJoinLogicNode->seqWinGroup; - pJoin->grpJoin = pJoinLogicNode->grpJoin; - SDataBlockDescNode* pLeftDesc = NULL; SDataBlockDescNode* pRightDesc = NULL; - int32_t code = getJoinDataBlockDescNode(pChildren, 0, &pLeftDesc); + pJoin->joinType = pJoinLogicNode->joinType; + pJoin->subType = pJoinLogicNode->subType; + pJoin->pWindowOffset = NULL; + int32_t code = nodesCloneNode(pJoinLogicNode->pWindowOffset, &pJoin->pWindowOffset); + if (TSDB_CODE_SUCCESS == code) { + pJoin->pJLimit = NULL; + code = nodesCloneNode(pJoinLogicNode->pJLimit, (SNode**)&pJoin->pJLimit); + } + if (TSDB_CODE_SUCCESS == code) { + pJoin->node.inputTsOrder = pJoinLogicNode->node.inputTsOrder; + pJoin->seqWinGroup = pJoinLogicNode->seqWinGroup; + pJoin->grpJoin = pJoinLogicNode->grpJoin; + code = getJoinDataBlockDescNode(pChildren, 0, &pLeftDesc); + } + if (TSDB_CODE_SUCCESS == code) { code = getJoinDataBlockDescNode(pChildren, 1, &pRightDesc); } @@ -1009,22 +1078,41 @@ static int32_t createMergeJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChi } static int32_t extractHashJoinOpCols(int16_t lBlkId, int16_t rBlkId, SNode* pEq, SHashJoinPhysiNode* pJoin) { + int32_t code = 0; if (QUERY_NODE_OPERATOR == nodeType(pEq)) { SOperatorNode* pOp = (SOperatorNode*)pEq; SColumnNode* pLeft = (SColumnNode*)pOp->pLeft; SColumnNode* pRight = (SColumnNode*)pOp->pRight; if (lBlkId == pLeft->dataBlockId && rBlkId == pRight->dataBlockId) { - nodesListStrictAppend(pJoin->pOnLeft, nodesCloneNode(pOp->pLeft)); - nodesListStrictAppend(pJoin->pOnRight, nodesCloneNode(pOp->pRight)); + SNode* pL = NULL, *pR = NULL; + code = nodesCloneNode(pOp->pLeft, &pL); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->pOnLeft, pL); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pOp->pRight, &pR); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->pOnRight, pR); + } } else if (rBlkId == pLeft->dataBlockId && lBlkId == pRight->dataBlockId) { - nodesListStrictAppend(pJoin->pOnLeft, nodesCloneNode(pOp->pRight)); - nodesListStrictAppend(pJoin->pOnRight, nodesCloneNode(pOp->pLeft)); + SNode* pL = NULL, *pR = NULL; + code = nodesCloneNode(pOp->pRight, &pR); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->pOnLeft, pR); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pOp->pLeft, &pL); + } + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pJoin->pOnRight, pL); + } } else { planError("Invalid join equal cond, lbid:%d, rbid:%d, oplid:%d, oprid:%d", lBlkId, rBlkId, pLeft->dataBlockId, pRight->dataBlockId); return TSDB_CODE_PLAN_INTERNAL_ERROR; } - return TSDB_CODE_SUCCESS; + return code; } planError("Invalid join equal node type:%d", nodeType(pEq)); @@ -1058,10 +1146,15 @@ static int32_t extractHashJoinOnCols(int16_t lBlkId, int16_t rBlkId, SNode* pEq, static int32_t createHashJoinColList(int16_t lBlkId, int16_t rBlkId, SNode* pEq1, SNode* pEq2, SNode* pEq3, SHashJoinPhysiNode* pJoin) { int32_t code = TSDB_CODE_SUCCESS; - pJoin->pOnLeft = nodesMakeList(); - pJoin->pOnRight = nodesMakeList(); - if (NULL == pJoin->pOnLeft || NULL == pJoin->pOnRight) { - return TSDB_CODE_OUT_OF_MEMORY; + pJoin->pOnLeft = NULL; + code = nodesMakeList(&pJoin->pOnLeft); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + pJoin->pOnRight = NULL; + code = nodesMakeList(&pJoin->pOnRight); + if (TSDB_CODE_SUCCESS != code) { + return code; } code = extractHashJoinOnCols(lBlkId, rBlkId, pEq1, pJoin); @@ -1086,56 +1179,82 @@ static int32_t sortHashJoinTargets(int16_t lBlkId, int16_t rBlkId, SHashJoinPhys if (NULL == pHash) { return TSDB_CODE_OUT_OF_MEMORY; } - SNodeList* pNew = nodesMakeList(); + SNodeList* pNew = NULL; + int32_t code = nodesMakeList(&pNew); - FOREACH(pNode, pJoin->pTargets) { - SColumnNode* pCol = (SColumnNode*)pNode; - int32_t len = getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); - tSimpleHashPut(pHash, name, len, &pCol, POINTER_BYTES); - } - - nodesClearList(pJoin->pTargets); - pJoin->pTargets = pNew; - - FOREACH(pNode, pJoin->pOnLeft) { - SColumnNode* pCol = (SColumnNode*)pNode; - int32_t len = getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); - SNode** p = tSimpleHashGet(pHash, name, len); - if (p) { - nodesListStrictAppend(pJoin->pTargets, *p); - tSimpleHashRemove(pHash, name, len); - } - } - FOREACH(pNode, pJoin->pOnRight) { - SColumnNode* pCol = (SColumnNode*)pNode; - int32_t len = getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); - SNode** p = tSimpleHashGet(pHash, name, len); - if (p) { - nodesListStrictAppend(pJoin->pTargets, *p); - tSimpleHashRemove(pHash, name, len); - } - } - - if (tSimpleHashGetSize(pHash) > 0) { - SNode** p = NULL; - int32_t iter = 0; - while (1) { - p = tSimpleHashIterate(pHash, p, &iter); - if (p == NULL) { + if (TSDB_CODE_SUCCESS == code) { + FOREACH(pNode, pJoin->pTargets) { + SColumnNode* pCol = (SColumnNode*)pNode; + int32_t len = getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); + code = tSimpleHashPut(pHash, name, len, &pCol, POINTER_BYTES); + if (TSDB_CODE_SUCCESS != code) { break; } + } + } + if (TSDB_CODE_SUCCESS == code) { + nodesClearList(pJoin->pTargets); + pJoin->pTargets = pNew; - nodesListStrictAppend(pJoin->pTargets, *p); + FOREACH(pNode, pJoin->pOnLeft) { + SColumnNode* pCol = (SColumnNode*)pNode; + int32_t len = getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); + SNode** p = tSimpleHashGet(pHash, name, len); + if (p) { + code = nodesListStrictAppend(pJoin->pTargets, *p); + if (TSDB_CODE_SUCCESS != code) { + break; + } + code = tSimpleHashRemove(pHash, name, len); + if (TSDB_CODE_SUCCESS != code) { + break; + } + } + } + } + if (TSDB_CODE_SUCCESS == code) { + FOREACH(pNode, pJoin->pOnRight) { + SColumnNode* pCol = (SColumnNode*)pNode; + int32_t len = getSlotKey(pNode, NULL, name, TSDB_COL_FNAME_LEN); + SNode** p = tSimpleHashGet(pHash, name, len); + if (p) { + code = nodesListStrictAppend(pJoin->pTargets, *p); + if (TSDB_CODE_SUCCESS != code) { + break; + } + code = tSimpleHashRemove(pHash, name, len); + if (TSDB_CODE_SUCCESS != code) { + break; + } + } + } + } + if (TSDB_CODE_SUCCESS == code) { + if (tSimpleHashGetSize(pHash) > 0) { + SNode** p = NULL; + int32_t iter = 0; + while (1) { + p = tSimpleHashIterate(pHash, p, &iter); + if (p == NULL) { + break; + } + + code = nodesListStrictAppend(pJoin->pTargets, *p); + if (TSDB_CODE_SUCCESS != code) { + break; + } + } } } tSimpleHashCleanup(pHash); - return TSDB_CODE_SUCCESS; + return code; } static int32_t setHashJoinPrimColEqCond(SNode* pEqCond, int16_t leftBlkId, int16_t rightBlkId, SHashJoinPhysiNode* pJoin) { + int32_t code = 0; if (QUERY_NODE_OPERATOR == nodeType(pEqCond)) { SOperatorNode* pOp = (SOperatorNode*)pEqCond; if (pOp->opType != OP_TYPE_EQUAL) { @@ -1170,10 +1289,12 @@ static int32_t setHashJoinPrimColEqCond(SNode* pEqCond, int16_t leftBlkId, int16 SColumnNode* pCol = (SColumnNode*)pParam; if (leftBlkId == pCol->dataBlockId) { pJoin->leftPrimSlotId = pCol->slotId; - pJoin->leftPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->leftPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->leftPrimExpr); } else if (rightBlkId == pCol->dataBlockId) { pJoin->rightPrimSlotId = pCol->slotId; - pJoin->rightPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->rightPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->rightPrimExpr); } else { planError("invalid primary key col equal cond, leftBlockId:%d", pCol->dataBlockId); return TSDB_CODE_PLAN_INTERNAL_ERROR; @@ -1184,7 +1305,9 @@ static int32_t setHashJoinPrimColEqCond(SNode* pEqCond, int16_t leftBlkId, int16 planError("invalid primary cond left node type, leftNodeType:%d", nodeType(pOp->pLeft)); return TSDB_CODE_PLAN_INTERNAL_ERROR; } - + if (TSDB_CODE_SUCCESS != code) { + return code; + } switch (nodeType(pOp->pRight)) { case QUERY_NODE_COLUMN: { SColumnNode* pCol = (SColumnNode*)pOp->pRight; @@ -1212,10 +1335,12 @@ static int32_t setHashJoinPrimColEqCond(SNode* pEqCond, int16_t leftBlkId, int16 SColumnNode* pCol = (SColumnNode*)pParam; if (leftBlkId == pCol->dataBlockId) { pJoin->leftPrimSlotId = pCol->slotId; - pJoin->leftPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->leftPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->leftPrimExpr); } else if (rightBlkId == pCol->dataBlockId) { pJoin->rightPrimSlotId = pCol->slotId; - pJoin->rightPrimExpr = nodesCloneNode((SNode*)pFunc); + pJoin->rightPrimExpr = NULL; + code = nodesCloneNode((SNode*)pFunc, &pJoin->rightPrimExpr); } else { planError("invalid primary key col equal cond, rightBlockId:%d", pCol->dataBlockId); return TSDB_CODE_PLAN_INTERNAL_ERROR; @@ -1231,7 +1356,7 @@ static int32_t setHashJoinPrimColEqCond(SNode* pEqCond, int16_t leftBlkId, int16 return TSDB_CODE_PLAN_INTERNAL_ERROR; } - return TSDB_CODE_SUCCESS; + return code; } @@ -1240,7 +1365,7 @@ static int32_t createHashJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil SHashJoinPhysiNode* pJoin = (SHashJoinPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pJoinLogicNode, QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN); if (NULL == pJoin) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SDataBlockDescNode* pLeftDesc = ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc; @@ -1249,8 +1374,18 @@ static int32_t createHashJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil pJoin->joinType = pJoinLogicNode->joinType; pJoin->subType = pJoinLogicNode->subType; - pJoin->pWindowOffset = nodesCloneNode(pJoinLogicNode->pWindowOffset); - pJoin->pJLimit = nodesCloneNode(pJoinLogicNode->pJLimit); + pJoin->pWindowOffset = NULL; + code = nodesCloneNode(pJoinLogicNode->pWindowOffset, &pJoin->pWindowOffset); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pJoin); + return code; + } + pJoin->pJLimit = NULL; + code = nodesCloneNode(pJoinLogicNode->pJLimit, &pJoin->pJLimit); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pJoin); + return code; + } pJoin->node.inputTsOrder = pJoinLogicNode->node.inputTsOrder; pJoin->timeRangeTarget = pJoinLogicNode->timeRangeTarget; pJoin->timeRange.skey = pJoinLogicNode->timeRange.skey; @@ -1333,7 +1468,7 @@ static int32_t createGroupCachePhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh SGroupCachePhysiNode* pGrpCache = (SGroupCachePhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pLogicNode, QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE); if (NULL == pGrpCache) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pGrpCache->grpColsMayBeNull = pLogicNode->grpColsMayBeNull; @@ -1390,7 +1525,7 @@ static int32_t createDynQueryCtrlPhysiNode(SPhysiPlanContext* pCxt, SNodeList* p SDynQueryCtrlPhysiNode* pDynCtrl = (SDynQueryCtrlPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pLogicNode, QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL); if (NULL == pDynCtrl) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } switch (pLogicNode->qType) { @@ -1418,19 +1553,18 @@ typedef struct SRewritePrecalcExprsCxt { } SRewritePrecalcExprsCxt; static EDealRes collectAndRewrite(SRewritePrecalcExprsCxt* pCxt, SNode** pNode) { - SNode* pExpr = nodesCloneNode(*pNode); + SNode* pExpr = NULL; + pCxt->errCode = nodesCloneNode(*pNode, &pExpr); if (NULL == pExpr) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } - if (nodesListAppend(pCxt->pPrecalcExprs, pExpr)) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; + if (TSDB_CODE_SUCCESS != (pCxt->errCode = nodesListAppend(pCxt->pPrecalcExprs, pExpr))) { nodesDestroyNode(pExpr); return DEAL_RES_ERROR; } - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - pCxt->errCode = TSDB_CODE_OUT_OF_MEMORY; nodesDestroyNode(pExpr); return DEAL_RES_ERROR; } @@ -1449,14 +1583,16 @@ static EDealRes collectAndRewrite(SRewritePrecalcExprsCxt* pCxt, SNode** pNode) } static int32_t rewriteValueToOperator(SRewritePrecalcExprsCxt* pCxt, SNode** pNode) { - SOperatorNode* pOper = (SOperatorNode*)nodesMakeNode(QUERY_NODE_OPERATOR); + SOperatorNode* pOper = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, (SNode**)&pOper); if (NULL == pOper) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - pOper->pLeft = nodesMakeNode(QUERY_NODE_LEFT_VALUE); + pOper->pLeft = NULL; + code = nodesMakeNode(QUERY_NODE_LEFT_VALUE, &pOper->pLeft); if (NULL == pOper->pLeft) { nodesDestroyNode((SNode*)pOper); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SValueNode* pVal = (SValueNode*)*pNode; pOper->node.resType = pVal->node.resType; @@ -1501,32 +1637,32 @@ static int32_t rewritePrecalcExprs(SPhysiPlanContext* pCxt, SNodeList* pList, SN if (NULL == pList) { return TSDB_CODE_SUCCESS; } - + int32_t code = 0; if (NULL == *pPrecalcExprs) { - *pPrecalcExprs = nodesMakeList(); + code = nodesMakeList(pPrecalcExprs); if (NULL == *pPrecalcExprs) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } if (NULL == *pRewrittenList) { - *pRewrittenList = nodesMakeList(); + code = nodesMakeList(pRewrittenList); if (NULL == *pRewrittenList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } SNode* pNode = NULL; FOREACH(pNode, pList) { SNode* pNew = NULL; if (QUERY_NODE_GROUPING_SET == nodeType(pNode)) { - pNew = nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pNode)->pParameterList, 0)); + code = nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pNode)->pParameterList, 0), &pNew); } else { - pNew = nodesCloneNode(pNode); + code = nodesCloneNode(pNode, &pNew); } if (NULL == pNew) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - if (TSDB_CODE_SUCCESS != nodesListAppend(*pRewrittenList, pNew)) { - return TSDB_CODE_OUT_OF_MEMORY; + if (TSDB_CODE_SUCCESS != (code = nodesListAppend(*pRewrittenList, pNew))) { + return code; } } SRewritePrecalcExprsCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pPrecalcExprs = *pPrecalcExprs}; @@ -1573,7 +1709,7 @@ static int32_t createAggPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren, SAggPhysiNode* pAgg = (SAggPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pAggLogicNode, QUERY_NODE_PHYSICAL_PLAN_HASH_AGG); if (NULL == pAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (pAgg->node.pSlimit) { pSubPlan->dynamicRowThreshold = true; @@ -1638,7 +1774,7 @@ static int32_t createIndefRowsFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList* SIndefRowsFuncPhysiNode* pIdfRowsFunc = (SIndefRowsFuncPhysiNode*)makePhysiNode( pCxt, (SLogicNode*)pFuncLogicNode, QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC); if (NULL == pIdfRowsFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SNodeList* pPrecalcExprs = NULL; @@ -1687,7 +1823,7 @@ static int32_t createInterpFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh SInterpFuncPhysiNode* pInterpFunc = (SInterpFuncPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pFuncLogicNode, QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC); if (NULL == pInterpFunc) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SNodeList* pPrecalcExprs = NULL; @@ -1714,9 +1850,10 @@ static int32_t createInterpFuncPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh pInterpFunc->timeRange = pFuncLogicNode->timeRange; pInterpFunc->interval = pFuncLogicNode->interval; pInterpFunc->fillMode = pFuncLogicNode->fillMode; - pInterpFunc->pFillValues = nodesCloneNode(pFuncLogicNode->pFillValues); - if (NULL != pFuncLogicNode->pFillValues && NULL == pInterpFunc->pFillValues) { - code = TSDB_CODE_OUT_OF_MEMORY; + pInterpFunc->pFillValues = NULL; + code = nodesCloneNode(pFuncLogicNode->pFillValues, &pInterpFunc->pFillValues); + if (TSDB_CODE_SUCCESS != code) { + code = code; } } @@ -1759,7 +1896,7 @@ static int32_t createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChild SProjectPhysiNode* pProject = (SProjectPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pProjectLogicNode, QUERY_NODE_PHYSICAL_PLAN_PROJECT); if (NULL == pProject) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pProject->mergeDataBlock = projectCanMergeDataBlock(pProjectLogicNode); @@ -1768,10 +1905,7 @@ static int32_t createProjectPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChild int32_t code = TSDB_CODE_SUCCESS; if (0 == LIST_LENGTH(pChildren)) { - pProject->pProjections = nodesCloneList(pProjectLogicNode->pProjections); - if (NULL == pProject->pProjections) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneList(pProjectLogicNode->pProjections, &pProject->pProjections); } else { code = setListSlotId(pCxt, ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc->dataBlockId, -1, pProjectLogicNode->pProjections, &pProject->pProjections); @@ -1798,7 +1932,7 @@ static int32_t doCreateExchangePhysiNode(SPhysiPlanContext* pCxt, SExchangeLogic SExchangePhysiNode* pExchange = (SExchangePhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pExchangeLogicNode, QUERY_NODE_PHYSICAL_PLAN_EXCHANGE); if (NULL == pExchange) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pExchange->srcStartGroupId = pExchangeLogicNode->srcStartGroupId; @@ -1820,15 +1954,13 @@ static int32_t createStreamScanPhysiNodeByExchange(SPhysiPlanContext* pCxt, SExc SScanPhysiNode* pScan = (SScanPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pExchangeLogicNode, QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN); if (NULL == pScan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } int32_t code = TSDB_CODE_SUCCESS; - pScan->pScanCols = nodesCloneList(pExchangeLogicNode->node.pTargets); - if (NULL == pScan->pScanCols) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pScan->pScanCols = NULL; + code = nodesCloneList(pExchangeLogicNode->node.pTargets, &pScan->pScanCols); if (TSDB_CODE_SUCCESS == code) { code = sortScanCols(pScan->pScanCols); @@ -1948,7 +2080,7 @@ static int32_t createIntervalPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChil SIntervalPhysiNode* pInterval = (SIntervalPhysiNode*)makePhysiNode( pCxt, (SLogicNode*)pWindowLogicNode, getIntervalOperatorType(pWindowLogicNode->windowAlgo)); if (NULL == pInterval) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pInterval->interval = pWindowLogicNode->interval; @@ -1972,7 +2104,7 @@ static int32_t createSessionWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* SSessionWinodwPhysiNode* pSession = (SSessionWinodwPhysiNode*)makePhysiNode( pCxt, (SLogicNode*)pWindowLogicNode, getIntervalOperatorType(pWindowLogicNode->windowAlgo)); if (NULL == pSession) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pSession->gap = pWindowLogicNode->sessionGap; @@ -1993,7 +2125,7 @@ static int32_t createStateWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC pCxt, (SLogicNode*)pWindowLogicNode, (pCxt->pPlanCxt->streamQuery ? QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE : QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE)); if (NULL == pState) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SNodeList* pPrecalcExprs = NULL; @@ -2038,7 +2170,7 @@ static int32_t createEventWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC pCxt, (SLogicNode*)pWindowLogicNode, (pCxt->pPlanCxt->streamQuery ? QUERY_NODE_PHYSICAL_PLAN_STREAM_EVENT : QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT)); if (NULL == pEvent) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SDataBlockDescNode* pChildTupe = (((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc); @@ -2065,7 +2197,7 @@ static int32_t createCountWindowPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pC pCxt, (SLogicNode*)pWindowLogicNode, (pCxt->pPlanCxt->streamQuery ? QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT : QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT)); if (NULL == pCount) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pCount->windowCount = pWindowLogicNode->windowCount; pCount->windowSliding = pWindowLogicNode->windowSliding; @@ -2105,7 +2237,7 @@ static int32_t createSortPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren pCxt, (SLogicNode*)pSortLogicNode, pSortLogicNode->groupSort ? QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT : QUERY_NODE_PHYSICAL_PLAN_SORT); if (NULL == pSort) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SNodeList* pPrecalcExprs = NULL; @@ -2155,7 +2287,7 @@ static int32_t createPartitionPhysiNodeImpl(SPhysiPlanContext* pCxt, SNodeList* SPhysiNode** pPhyNode) { SPartitionPhysiNode* pPart = (SPartitionPhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pPartLogicNode, type); if (NULL == pPart) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SNodeList* pPrecalcExprs = NULL; @@ -2249,7 +2381,7 @@ static int32_t createFillPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren pCxt, (SLogicNode*)pFillNode, pCxt->pPlanCxt->streamQuery ? QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL : QUERY_NODE_PHYSICAL_PLAN_FILL); if (NULL == pFill) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pFill->mode = pFillNode->mode; @@ -2276,10 +2408,7 @@ static int32_t createFillPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren } if (TSDB_CODE_SUCCESS == code && NULL != pFillNode->pValues) { - pFill->pValues = nodesCloneNode(pFillNode->pValues); - if (NULL == pFill->pValues) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneNode(pFillNode->pValues, &pFill->pValues); } if (TSDB_CODE_SUCCESS == code) { @@ -2296,18 +2425,20 @@ static int32_t createFillPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren } static int32_t createExchangePhysiNodeByMerge(SMergePhysiNode* pMerge, int32_t idx) { - SExchangePhysiNode* pExchange = (SExchangePhysiNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_EXCHANGE); + SExchangePhysiNode* pExchange = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, (SNode**)&pExchange); if (NULL == pExchange) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pExchange->srcStartGroupId = pMerge->srcGroupId + idx; pExchange->srcEndGroupId = pMerge->srcGroupId + idx; pExchange->singleChannel = true; pExchange->node.pParent = (SPhysiNode*)pMerge; - pExchange->node.pOutputDataBlockDesc = (SDataBlockDescNode*)nodesCloneNode((SNode*)pMerge->node.pOutputDataBlockDesc); + pExchange->node.pOutputDataBlockDesc = NULL; + code = nodesCloneNode((SNode*)pMerge->node.pOutputDataBlockDesc, (SNode**)&pExchange->node.pOutputDataBlockDesc); if (NULL == pExchange->node.pOutputDataBlockDesc) { nodesDestroyNode((SNode*)pExchange); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } SNode* pSlot = NULL; FOREACH(pSlot, pExchange->node.pOutputDataBlockDesc->pSlots) { ((SSlotDescNode*)pSlot)->output = true; } @@ -2319,7 +2450,7 @@ static int32_t createMergePhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildre SMergePhysiNode* pMerge = (SMergePhysiNode*)makePhysiNode(pCxt, (SLogicNode*)pMergeLogicNode, QUERY_NODE_PHYSICAL_PLAN_MERGE); if (NULL == pMerge) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (pMergeLogicNode->colsMerge) { @@ -2423,13 +2554,12 @@ static int32_t doCreatePhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode static int32_t createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode, SSubplan* pSubplan, SPhysiNode** pPhyNode) { - SNodeList* pChildren = nodesMakeList(); + SNodeList* pChildren = NULL; + int32_t code = nodesMakeList(&pChildren); if (NULL == pChildren) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; - SNode* pLogicChild; FOREACH(pLogicChild, pLogicNode->pChildren) { SPhysiNode* pChild = NULL; @@ -2462,9 +2592,10 @@ static int32_t createPhysiNode(SPhysiPlanContext* pCxt, SLogicNode* pLogicNode, } static int32_t createDataInserter(SPhysiPlanContext* pCxt, SVgDataBlocks* pBlocks, SDataSinkNode** pSink) { - SDataInserterNode* pInserter = (SDataInserterNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT); + SDataInserterNode* pInserter = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT, (SNode**)&pInserter); if (NULL == pInserter) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pInserter->numOfTables = pBlocks->numOfTables; @@ -2476,25 +2607,28 @@ static int32_t createDataInserter(SPhysiPlanContext* pCxt, SVgDataBlocks* pBlock } static int32_t createDataDispatcher(SPhysiPlanContext* pCxt, const SPhysiNode* pRoot, SDataSinkNode** pSink) { - SDataDispatcherNode* pDispatcher = (SDataDispatcherNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DISPATCH); + SDataDispatcherNode* pDispatcher = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DISPATCH, (SNode**)&pDispatcher); if (NULL == pDispatcher) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - pDispatcher->sink.pInputDataBlockDesc = (SDataBlockDescNode*)nodesCloneNode((SNode*)pRoot->pOutputDataBlockDesc); + pDispatcher->sink.pInputDataBlockDesc = NULL; + code = nodesCloneNode((SNode*)pRoot->pOutputDataBlockDesc, (SNode**)&pDispatcher->sink.pInputDataBlockDesc); if (NULL == pDispatcher->sink.pInputDataBlockDesc) { nodesDestroyNode((SNode*)pDispatcher); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } *pSink = (SDataSinkNode*)pDispatcher; return TSDB_CODE_SUCCESS; } -static SSubplan* makeSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubplan) { - SSubplan* pSubplan = (SSubplan*)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); +static int32_t makeSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubplan, SSubplan** ppSubplan) { + SSubplan* pSubplan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&pSubplan); if (NULL == pSubplan) { - return NULL; + return code; } pSubplan->id = pLogicSubplan->id; pSubplan->subplanType = pLogicSubplan->subplanType; @@ -2506,7 +2640,8 @@ static SSubplan* makeSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubpl if (NULL != pCxt->pPlanCxt->pUser) { snprintf(pSubplan->user, sizeof(pSubplan->user), "%s", pCxt->pPlanCxt->pUser); } - return pSubplan; + *ppSubplan = pSubplan; + return code; } static int32_t buildInsertValuesSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan) { @@ -2518,9 +2653,10 @@ static int32_t buildInsertValuesSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLog static int32_t createQueryInserter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, SSubplan* pSubplan, SDataSinkNode** pSink) { - SQueryInserterNode* pInserter = (SQueryInserterNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT); + SQueryInserterNode* pInserter = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT, (SNode**)&pInserter); if (NULL == pInserter) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pInserter->tableId = pModify->tableId; @@ -2533,13 +2669,13 @@ static int32_t createQueryInserter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNod pInserter->epSet = pModify->pVgroupList->vgroups[0].epSet; vgroupInfoToNodeAddr(pModify->pVgroupList->vgroups, &pSubplan->execNode); } - int32_t code = setListSlotId(pCxt, pSubplan->pNode->pOutputDataBlockDesc->dataBlockId, -1, pModify->pInsertCols, + code = setListSlotId(pCxt, pSubplan->pNode->pOutputDataBlockDesc->dataBlockId, -1, pModify->pInsertCols, &pInserter->pCols); if (TSDB_CODE_SUCCESS == code) { - pInserter->sink.pInputDataBlockDesc = - (SDataBlockDescNode*)nodesCloneNode((SNode*)pSubplan->pNode->pOutputDataBlockDesc); + pInserter->sink.pInputDataBlockDesc = NULL; + code = nodesCloneNode((SNode*)pSubplan->pNode->pOutputDataBlockDesc, (SNode**)&pInserter->sink.pInputDataBlockDesc); if (NULL == pInserter->sink.pInputDataBlockDesc) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } @@ -2571,9 +2707,10 @@ static int32_t buildInsertSubplan(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode static int32_t createDataDeleter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* pModify, const SPhysiNode* pRoot, SDataSinkNode** pSink) { - SDataDeleterNode* pDeleter = (SDataDeleterNode*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DELETE); + SDataDeleterNode* pDeleter = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_DELETE, (SNode**)&pDeleter); if (NULL == pDeleter) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pDeleter->tableId = pModify->tableId; @@ -2582,7 +2719,7 @@ static int32_t createDataDeleter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* strcpy(pDeleter->tsColName, pModify->tsColName); pDeleter->deleteTimeRange = pModify->deleteTimeRange; - int32_t code = setNodeSlotId(pCxt, pRoot->pOutputDataBlockDesc->dataBlockId, -1, pModify->pAffectedRows, + code = setNodeSlotId(pCxt, pRoot->pOutputDataBlockDesc->dataBlockId, -1, pModify->pAffectedRows, &pDeleter->pAffectedRows); if (TSDB_CODE_SUCCESS == code) { code = setNodeSlotId(pCxt, pRoot->pOutputDataBlockDesc->dataBlockId, -1, pModify->pStartTs, &pDeleter->pStartTs); @@ -2591,9 +2728,10 @@ static int32_t createDataDeleter(SPhysiPlanContext* pCxt, SVnodeModifyLogicNode* code = setNodeSlotId(pCxt, pRoot->pOutputDataBlockDesc->dataBlockId, -1, pModify->pEndTs, &pDeleter->pEndTs); } if (TSDB_CODE_SUCCESS == code) { - pDeleter->sink.pInputDataBlockDesc = (SDataBlockDescNode*)nodesCloneNode((SNode*)pRoot->pOutputDataBlockDesc); + pDeleter->sink.pInputDataBlockDesc = NULL; + code = nodesCloneNode((SNode*)pRoot->pOutputDataBlockDesc, (SNode**)&pDeleter->sink.pInputDataBlockDesc); if (NULL == pDeleter->sink.pInputDataBlockDesc) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } @@ -2634,13 +2772,12 @@ static int32_t buildVnodeModifySubplan(SPhysiPlanContext* pCxt, SLogicSubplan* p } static int32_t createPhysiSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubplan, SSubplan** pPhysiSubplan) { - SSubplan* pSubplan = makeSubplan(pCxt, pLogicSubplan); + SSubplan* pSubplan = NULL; + int32_t code = makeSubplan(pCxt, pLogicSubplan, &pSubplan); if (NULL == pSubplan) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; - if (SUBPLAN_TYPE_MODIFY == pLogicSubplan->subplanType) { code = buildVnodeModifySubplan(pCxt, pLogicSubplan, pSubplan); } else { @@ -2664,26 +2801,30 @@ static int32_t createPhysiSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogic return code; } -static SQueryPlan* makeQueryPhysiPlan(SPhysiPlanContext* pCxt) { - SQueryPlan* pPlan = (SQueryPlan*)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); +static int32_t makeQueryPhysiPlan(SPhysiPlanContext* pCxt, SQueryPlan** ppQueryPlan) { + SQueryPlan* pPlan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN, (SNode**)&pPlan); if (NULL == pPlan) { - return NULL; + return code; } - pPlan->pSubplans = nodesMakeList(); + pPlan->pSubplans = NULL; + code = nodesMakeList(&pPlan->pSubplans); if (NULL == pPlan->pSubplans) { nodesDestroyNode((SNode*)pPlan); - return NULL; + return code; } pPlan->queryId = pCxt->pPlanCxt->queryId; - return pPlan; + *ppQueryPlan = pPlan; + return code; } static int32_t pushSubplan(SPhysiPlanContext* pCxt, SNode* pSubplan, int32_t level, SNodeList* pSubplans) { SNodeListNode* pGroup = NULL; if (level >= LIST_LENGTH(pSubplans)) { - pGroup = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST); + pGroup = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&pGroup); if (NULL == pGroup) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } if (TSDB_CODE_SUCCESS != nodesListStrictAppend(pSubplans, (SNode*)pGroup)) { return TSDB_CODE_OUT_OF_MEMORY; @@ -2692,9 +2833,9 @@ static int32_t pushSubplan(SPhysiPlanContext* pCxt, SNode* pSubplan, int32_t lev pGroup = (SNodeListNode*)nodesListGetNode(pSubplans, level); } if (NULL == pGroup->pNodeList) { - pGroup->pNodeList = nodesMakeList(); + int32_t code = nodesMakeList(&pGroup->pNodeList); if (NULL == pGroup->pNodeList) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } return nodesListAppend(pGroup->pNodeList, (SNode*)pSubplan); @@ -2736,13 +2877,12 @@ static int32_t buildPhysiPlan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubp } static int32_t doCreatePhysiPlan(SPhysiPlanContext* pCxt, SQueryLogicPlan* pLogicPlan, SQueryPlan** pPhysiPlan) { - SQueryPlan* pPlan = (SQueryPlan*)makeQueryPhysiPlan(pCxt); + SQueryPlan* pPlan = NULL; + int32_t code = makeQueryPhysiPlan(pCxt, &pPlan); if (NULL == pPlan) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; - SNode* pSubplan = NULL; FOREACH(pSubplan, pLogicPlan->pTopSubplans) { code = buildPhysiPlan(pCxt, (SLogicSubplan*)pSubplan, NULL, pPlan); @@ -2785,14 +2925,17 @@ static void setExplainInfo(SPlanContext* pCxt, SQueryPlan* pPlan) { } } -static void setExecNodeList(SPhysiPlanContext* pCxt, SArray* pExecNodeList) { +static int32_t setExecNodeList(SPhysiPlanContext* pCxt, SArray* pExecNodeList) { + int32_t code = 0; if (NULL == pExecNodeList) { - return; + return code; } if (pCxt->hasSysScan || !pCxt->hasScan) { SQueryNodeLoad node = {.addr = {.nodeId = MNODE_HANDLE, .epSet = pCxt->pPlanCxt->mgmtEpSet}, .load = 0}; - taosArrayPush(pExecNodeList, &node); + if (NULL == taosArrayPush(pExecNodeList, &node)) + code = TSDB_CODE_OUT_OF_MEMORY; } + return code; } int32_t createPhysiPlan(SPlanContext* pCxt, SQueryLogicPlan* pLogicPlan, SQueryPlan** pPlan, SArray* pExecNodeList) { @@ -2809,7 +2952,7 @@ int32_t createPhysiPlan(SPlanContext* pCxt, SQueryLogicPlan* pLogicPlan, SQueryP int32_t code = doCreatePhysiPlan(&cxt, pLogicPlan, pPlan); if (TSDB_CODE_SUCCESS == code) { setExplainInfo(pCxt, *pPlan); - setExecNodeList(&cxt, pExecNodeList); + code = setExecNodeList(&cxt, pExecNodeList); } destoryPhysiPlanContext(&cxt); diff --git a/source/libs/planner/src/planScaleOut.c b/source/libs/planner/src/planScaleOut.c index 1f43d54333..bcac7ddd7e 100644 --- a/source/libs/planner/src/planScaleOut.c +++ b/source/libs/planner/src/planScaleOut.c @@ -21,12 +21,16 @@ typedef struct SScaleOutContext { } SScaleOutContext; static SLogicSubplan* singleCloneSubLogicPlan(SScaleOutContext* pCxt, SLogicSubplan* pSrc, int32_t level) { - SLogicSubplan* pDst = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + SLogicSubplan* pDst = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN, (SNode**)&pDst); if (NULL == pDst) { + terrno = code; return NULL; } - pDst->pNode = (SLogicNode*)nodesCloneNode((SNode*)pSrc->pNode); + pDst->pNode = NULL; + code = nodesCloneNode((SNode*)pSrc->pNode, (SNode**)&pDst->pNode); if (NULL == pDst->pNode) { + terrno = code; nodesDestroyNode((SNode*)pDst); return NULL; } @@ -69,7 +73,7 @@ static int32_t scaleOutByVgroups(SScaleOutContext* pCxt, SLogicSubplan* pSubplan for (int32_t i = 0; i < pSubplan->pVgroupList->numOfVgroups; ++i) { SLogicSubplan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level); if (NULL == pNewSubplan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } code = setScanVgroup(pNewSubplan->pNode, pSubplan->pVgroupList->vgroups + i); if (TSDB_CODE_SUCCESS == code) { @@ -90,14 +94,15 @@ static int32_t scaleOutForInsertValues(SScaleOutContext* pCxt, SLogicSubplan* pS SNodeList* pGroup) { SVnodeModifyLogicNode* pNode = (SVnodeModifyLogicNode*)pSubplan->pNode; size_t numOfVgroups = taosArrayGetSize(pNode->pDataBlocks); + int32_t code = 0; for (int32_t i = 0; i < numOfVgroups; ++i) { SLogicSubplan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level); if (NULL == pNewSubplan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } ((SVnodeModifyLogicNode*)pNewSubplan->pNode)->pVgDataBlocks = (SVgDataBlocks*)taosArrayGetP(pNode->pDataBlocks, i); - if (TSDB_CODE_SUCCESS != nodesListStrictAppend(pGroup, (SNode*)pNewSubplan)) { - return TSDB_CODE_OUT_OF_MEMORY; + if (TSDB_CODE_SUCCESS != (code = nodesListStrictAppend(pGroup, (SNode*)pNewSubplan))) { + return code; } } return TSDB_CODE_SUCCESS; @@ -132,7 +137,7 @@ static int32_t scaleOutForCompute(SScaleOutContext* pCxt, SLogicSubplan* pSubpla for (int32_t i = 0; i < pSubplan->numOfComputeNodes; ++i) { SLogicSubplan* pNewSubplan = singleCloneSubLogicPlan(pCxt, pSubplan, level); if (NULL == pNewSubplan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } code = nodesListStrictAppend(pGroup, (SNode*)pNewSubplan); if (TSDB_CODE_SUCCESS != code) { @@ -196,12 +201,12 @@ static int32_t pushHierarchicalPlan(SNodeList* pParentsGroup, SNodeList* pCurren } static int32_t doScaleOut(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32_t level, SNodeList* pParentsGroup) { - SNodeList* pCurrentGroup = nodesMakeList(); + SNodeList* pCurrentGroup = NULL; + int32_t code = nodesMakeList(&pCurrentGroup); if (NULL == pCurrentGroup) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - int32_t code = TSDB_CODE_SUCCESS; switch (pSubplan->subplanType) { case SUBPLAN_TYPE_MERGE: code = scaleOutForMerge(pCxt, pSubplan, level, pCurrentGroup); @@ -243,13 +248,17 @@ static int32_t doScaleOut(SScaleOutContext* pCxt, SLogicSubplan* pSubplan, int32 } static SQueryLogicPlan* makeQueryLogicPlan() { - SQueryLogicPlan* pLogicPlan = (SQueryLogicPlan*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN); + SQueryLogicPlan* pLogicPlan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN, (SNode**)&pLogicPlan); if (NULL == pLogicPlan) { + terrno = code; return NULL; } - pLogicPlan->pTopSubplans = nodesMakeList(); + pLogicPlan->pTopSubplans = NULL; + code = nodesMakeList(&pLogicPlan->pTopSubplans); if (NULL == pLogicPlan->pTopSubplans) { nodesDestroyNode((SNode*)pLogicPlan); + terrno = code; return NULL; } return pLogicPlan; @@ -258,7 +267,7 @@ static SQueryLogicPlan* makeQueryLogicPlan() { int32_t scaleOutLogicPlan(SPlanContext* pCxt, SLogicSubplan* pLogicSubplan, SQueryLogicPlan** pLogicPlan) { SQueryLogicPlan* pPlan = makeQueryLogicPlan(); if (NULL == pPlan) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SScaleOutContext cxt = {.pPlanCxt = pCxt, .subplanId = 1}; diff --git a/source/libs/planner/src/planSpliter.c b/source/libs/planner/src/planSpliter.c index 45322e62a8..efbcd79b69 100644 --- a/source/libs/planner/src/planSpliter.c +++ b/source/libs/planner/src/planSpliter.c @@ -59,7 +59,8 @@ static void splSetSubplanVgroups(SLogicSubplan* pSubplan, SLogicNode* pNode) { } static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SLogicNode* pNode, int32_t flag) { - SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); + SLogicSubplan* pSubplan = NULL; + terrno = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN, (SNode**)&pSubplan); if (NULL == pSubplan) { return NULL; } @@ -93,37 +94,44 @@ static void splSetSubplanType(SLogicSubplan* pSubplan) { pSubplan->subplanType = splHasScan(pSubplan->pNode) ? SUBPLAN_TYPE_SCAN : SUBPLAN_TYPE_MERGE; } -static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode) { - SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN); +static int32_t splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode, SLogicSubplan** ppSubplan) { + SLogicSubplan* pSubplan = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN, (SNode**)&pSubplan); if (NULL == pSubplan) { - return NULL; + return code; } pSubplan->id.queryId = pCxt->queryId; pSubplan->id.groupId = pCxt->groupId; pSubplan->pNode = pNode; pNode->pParent = NULL; splSetSubplanType(pSubplan); - return pSubplan; + *ppSubplan = pSubplan; + return code; } static int32_t splCreateExchangeNode(SSplitContext* pCxt, SLogicNode* pChild, SExchangeLogicNode** pOutput) { - SExchangeLogicNode* pExchange = (SExchangeLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE); + SExchangeLogicNode* pExchange = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE, (SNode**)&pExchange); if (NULL == pExchange) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pExchange->srcStartGroupId = pCxt->groupId; pExchange->srcEndGroupId = pCxt->groupId; pExchange->node.precision = pChild->precision; pExchange->node.dynamicOp = pChild->dynamicOp; - pExchange->node.pTargets = nodesCloneList(pChild->pTargets); + pExchange->node.pTargets = NULL; + code = nodesCloneList(pChild->pTargets, &pExchange->node.pTargets); if (NULL == pExchange->node.pTargets) { - return TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)pExchange); + return code; } if (NULL != pChild->pLimit) { - pExchange->node.pLimit = nodesCloneNode(pChild->pLimit); + pExchange->node.pLimit = NULL; + code = nodesCloneNode(pChild->pLimit, &pExchange->node.pLimit); if (NULL == pExchange->node.pLimit) { - return TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)pExchange); + return code; } ((SLimitNode*)pChild->pLimit)->limit += ((SLimitNode*)pChild->pLimit)->offset; ((SLimitNode*)pChild->pLimit)->offset = 0; @@ -368,18 +376,14 @@ static int32_t stbSplRewriteFuns(const SNodeList* pFuncs, SNodeList** pPartialFu SFunctionNode* pMergeFunc = NULL; int32_t code = TSDB_CODE_SUCCESS; if (fmIsWindowPseudoColumnFunc(pFunc->funcId)) { - pPartFunc = (SFunctionNode*)nodesCloneNode(pNode); - pMergeFunc = (SFunctionNode*)nodesCloneNode(pNode); - if (NULL == pPartFunc || NULL == pMergeFunc) { - nodesDestroyNode((SNode*)pPartFunc); - nodesDestroyNode((SNode*)pMergeFunc); - code = TSDB_CODE_OUT_OF_MEMORY; + code = nodesCloneNode(pNode, (SNode**)&pPartFunc); + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pNode, (SNode**)&pMergeFunc); } - if(pMidFuncs != NULL){ - pMidFunc = (SFunctionNode*)nodesCloneNode(pNode); + if(TSDB_CODE_SUCCESS == code && pMidFuncs != NULL){ + code = nodesCloneNode(pNode, (SNode**)&pMidFunc); if (NULL == pMidFunc) { nodesDestroyNode((SNode*)pMidFunc); - code = TSDB_CODE_OUT_OF_MEMORY; } } } else { @@ -419,19 +423,20 @@ static int32_t stbSplAppendWStart(SNodeList* pFuncs, int32_t* pIndex, uint8_t pr ++index; } - SFunctionNode* pWStart = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pWStart = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pWStart); if (NULL == pWStart) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pWStart->functionName, "_wstart"); int64_t pointer = (int64_t)pWStart; char name[TSDB_COL_NAME_LEN + TSDB_POINTER_PRINT_BYTES + TSDB_NAME_DELIMITER_LEN + 1] = {0}; int32_t len = snprintf(name, sizeof(name) - 1, "%s.%" PRId64 "", pWStart->functionName, pointer); - taosCreateMD5Hash(name, len); + (void)taosCreateMD5Hash(name, len); strncpy(pWStart->node.aliasName, name, TSDB_COL_NAME_LEN - 1); pWStart->node.resType.precision = precision; - int32_t code = fmGetFuncInfo(pWStart, NULL, 0); + code = fmGetFuncInfo(pWStart, NULL, 0); if (TSDB_CODE_SUCCESS == code) { code = nodesListStrictAppend(pFuncs, (SNode*)pWStart); } @@ -450,18 +455,19 @@ static int32_t stbSplAppendWEnd(SWindowLogicNode* pWin, int32_t* pIndex) { ++index; } - SFunctionNode* pWEnd = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pWEnd = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pWEnd); if (NULL == pWEnd) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } strcpy(pWEnd->functionName, "_wend"); int64_t pointer = (int64_t)pWEnd; char name[TSDB_COL_NAME_LEN + TSDB_POINTER_PRINT_BYTES + TSDB_NAME_DELIMITER_LEN + 1] = {0}; int32_t len = snprintf(name, sizeof(name) - 1, "%s.%" PRId64 "", pWEnd->functionName, pointer); - taosCreateMD5Hash(name, len); + (void)taosCreateMD5Hash(name, len); strncpy(pWEnd->node.aliasName, name, TSDB_COL_NAME_LEN - 1); - int32_t code = fmGetFuncInfo(pWEnd, NULL, 0); + code = fmGetFuncInfo(pWEnd, NULL, 0); if (TSDB_CODE_SUCCESS == code) { code = nodesListStrictAppend(pWin->pFuncs, (SNode*)pWEnd); } @@ -482,9 +488,10 @@ static int32_t stbSplCreatePartWindowNode(SWindowLogicNode* pMergeWindow, SLogic SNode* pConditions = pMergeWindow->node.pConditions; pMergeWindow->node.pConditions = NULL; - SWindowLogicNode* pPartWin = (SWindowLogicNode*)nodesCloneNode((SNode*)pMergeWindow); + SWindowLogicNode* pPartWin = NULL; + int32_t code = nodesCloneNode((SNode*)pMergeWindow, (SNode**)&pPartWin); if (NULL == pPartWin) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pPartWin->node.groupAction = GROUP_ACTION_KEEP; @@ -494,7 +501,7 @@ static int32_t stbSplCreatePartWindowNode(SWindowLogicNode* pMergeWindow, SLogic splSetParent((SLogicNode*)pPartWin); int32_t index = 0; - int32_t code = stbSplRewriteFuns(pFunc, &pPartWin->pFuncs, NULL, &pMergeWindow->pFuncs); + code = stbSplRewriteFuns(pFunc, &pPartWin->pFuncs, NULL, &pMergeWindow->pFuncs); if (TSDB_CODE_SUCCESS == code) { code = stbSplAppendWStart(pPartWin->pFuncs, &index, ((SColumnNode*)pMergeWindow->pTspk)->node.resType.precision); } @@ -503,10 +510,8 @@ static int32_t stbSplCreatePartWindowNode(SWindowLogicNode* pMergeWindow, SLogic } if (TSDB_CODE_SUCCESS == code) { nodesDestroyNode(pMergeWindow->pTspk); - pMergeWindow->pTspk = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index)); - if (NULL == pMergeWindow->pTspk) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pMergeWindow->pTspk = NULL; + code = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index), &pMergeWindow->pTspk); } nodesDestroyList(pFunc); @@ -529,14 +534,17 @@ static int32_t stbSplCreatePartMidWindowNode(SWindowLogicNode* pMergeWindow, SLo SNode* pConditions = pMergeWindow->node.pConditions; pMergeWindow->node.pConditions = NULL; - SWindowLogicNode* pPartWin = (SWindowLogicNode*)nodesCloneNode((SNode*)pMergeWindow); + SWindowLogicNode* pPartWin = NULL; + int32_t code = nodesCloneNode((SNode*)pMergeWindow, (SNode**)&pPartWin); if (NULL == pPartWin) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - SWindowLogicNode* pMidWin = (SWindowLogicNode*)nodesCloneNode((SNode*)pMergeWindow); + SWindowLogicNode* pMidWin = NULL; + code = nodesCloneNode((SNode*)pMergeWindow, (SNode**)&pMidWin); if (NULL == pMidWin) { - return TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)pPartWin); + return code; } pPartWin->node.groupAction = GROUP_ACTION_KEEP; @@ -550,7 +558,7 @@ static int32_t stbSplCreatePartMidWindowNode(SWindowLogicNode* pMergeWindow, SLo SNodeList* pFuncPart = NULL; SNodeList* pFuncMid = NULL; SNodeList* pFuncMerge = NULL; - int32_t code = stbSplRewriteFuns(pFunc, &pFuncPart, &pFuncMid, &pFuncMerge); + code = stbSplRewriteFuns(pFunc, &pFuncPart, &pFuncMid, &pFuncMerge); pPartWin->pFuncs = pFuncPart; pMidWin->pFuncs = pFuncMid; pMergeWindow->pFuncs = pFuncMerge; @@ -565,10 +573,8 @@ static int32_t stbSplCreatePartMidWindowNode(SWindowLogicNode* pMergeWindow, SLo if (TSDB_CODE_SUCCESS == code) { nodesDestroyNode(pMidWin->pTspk); - pMidWin->pTspk = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index)); - if (NULL == pMidWin->pTspk) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pMidWin->pTspk = NULL; + code = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index), &pMidWin->pTspk); } if (TSDB_CODE_SUCCESS == code) { @@ -580,10 +586,7 @@ static int32_t stbSplCreatePartMidWindowNode(SWindowLogicNode* pMergeWindow, SLo if (TSDB_CODE_SUCCESS == code) { nodesDestroyNode(pMergeWindow->pTspk); - pMergeWindow->pTspk = nodesCloneNode(nodesListGetNode(pMidWin->node.pTargets, index)); - if (NULL == pMergeWindow->pTspk) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = nodesCloneNode(nodesListGetNode(pMidWin->node.pTargets, index), &pMergeWindow->pTspk); } nodesDestroyList(pFunc); @@ -649,9 +652,10 @@ static int32_t stbSplRewriteFromMergeNode(SMergeLogicNode* pMerge, SLogicNode* p static int32_t stbSplCreateMergeNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, SLogicNode* pSplitNode, SNodeList* pMergeKeys, SLogicNode* pPartChild, bool groupSort, bool needSort) { - SMergeLogicNode* pMerge = (SMergeLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_MERGE); + SMergeLogicNode* pMerge = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_MERGE, (SNode**)&pMerge); if (NULL == pMerge) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pMerge->needSort = needSort; pMerge->numOfChannels = stbSplGetNumOfVgroups(pPartChild); @@ -662,22 +666,19 @@ static int32_t stbSplCreateMergeNode(SSplitContext* pCxt, SLogicSubplan* pSubpla pMerge->groupSort = groupSort; pMerge->numOfSubplans = 1; - int32_t code = TSDB_CODE_SUCCESS; - pMerge->pInputs = nodesCloneList(pPartChild->pTargets); - // NULL != pSubplan means 'merge node' replaces 'split node'. - if (NULL == pSubplan) { - pMerge->node.pTargets = nodesCloneList(pPartChild->pTargets); - } else { - pMerge->node.pTargets = nodesCloneList(pSplitNode->pTargets); - } - if (NULL == pMerge->node.pTargets || NULL == pMerge->pInputs) { - code = TSDB_CODE_OUT_OF_MEMORY; + pMerge->pInputs = NULL; + code = nodesCloneList(pPartChild->pTargets, &pMerge->pInputs); + if (TSDB_CODE_SUCCESS == code) { + // NULL != pSubplan means 'merge node' replaces 'split node'. + if (NULL == pSubplan) { + code = nodesCloneList(pPartChild->pTargets, &pMerge->node.pTargets); + } else { + code = nodesCloneList(pSplitNode->pTargets, &pMerge->node.pTargets); + } } if (TSDB_CODE_SUCCESS == code && NULL != pSplitNode->pLimit) { - pMerge->node.pLimit = nodesCloneNode(pSplitNode->pLimit); - if (NULL == pMerge->node.pLimit) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pMerge->node.pLimit = NULL; + code = nodesCloneNode(pSplitNode->pLimit, &pMerge->node.pLimit); ((SLimitNode*)pSplitNode->pLimit)->limit += ((SLimitNode*)pSplitNode->pLimit)->offset; ((SLimitNode*)pSplitNode->pLimit)->offset = 0; } @@ -708,14 +709,16 @@ static int32_t stbSplCreateExchangeNode(SSplitContext* pCxt, SLogicNode* pParent } static int32_t stbSplCreateMergeKeysByExpr(SNode* pExpr, EOrder order, SNodeList** pMergeKeys) { - SOrderByExprNode* pOrderByExpr = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); + SOrderByExprNode* pOrderByExpr = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOrderByExpr); if (NULL == pOrderByExpr) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } - pOrderByExpr->pExpr = nodesCloneNode(pExpr); + pOrderByExpr->pExpr = NULL; + code = nodesCloneNode(pExpr, &pOrderByExpr->pExpr); if (NULL == pOrderByExpr->pExpr) { nodesDestroyNode((SNode*)pOrderByExpr); - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pOrderByExpr->order = order; pOrderByExpr->nullOrder = (order == ORDER_ASC) ? NULL_ORDER_FIRST : NULL_ORDER_LAST; @@ -745,7 +748,7 @@ static int32_t stbSplSplitIntervalForBatch(SSplitContext* pCxt, SStableSplitInfo SLogicSubplan* pSplitSubPlan = NULL; if (TSDB_CODE_SUCCESS == code) { pSplitSubPlan = splCreateScanSubplan(pCxt, pPartWindow, SPLIT_FLAG_STABLE_SPLIT); - if (!pSplitSubPlan) code = TSDB_CODE_OUT_OF_MEMORY; + if (!pSplitSubPlan) code = terrno; } if (code == TSDB_CODE_SUCCESS) { SNode* pNode; @@ -793,11 +796,14 @@ static int32_t stbSplSplitIntervalForStreamMultiAgg(SSplitContext* pCxt, SStable } if (TSDB_CODE_SUCCESS == code) { - SNode* subPlan = (SNode*)splCreateSubplan(pCxt, pMidWindow); - ((SLogicSubplan*)subPlan)->subplanType = SUBPLAN_TYPE_MERGE; + SNode* subPlan = NULL; + code = splCreateSubplan(pCxt, pMidWindow, (SLogicSubplan**)&subPlan); + if (TSDB_CODE_SUCCESS == code) { + ((SLogicSubplan*)subPlan)->subplanType = SUBPLAN_TYPE_MERGE; - code = nodesListMakeStrictAppend(&((SLogicSubplan*)subPlan)->pChildren, - (SNode*)splCreateScanSubplan(pCxt, pPartWindow, SPLIT_FLAG_STABLE_SPLIT)); + code = nodesListMakeStrictAppend(&((SLogicSubplan*)subPlan)->pChildren, + (SNode*)splCreateScanSubplan(pCxt, pPartWindow, SPLIT_FLAG_STABLE_SPLIT)); + } if (TSDB_CODE_SUCCESS == code) { code = nodesListMakeStrictAppend(&pInfo->pSubplan->pChildren, subPlan); } @@ -828,9 +834,10 @@ static int32_t stbSplSplitSessionForStream(SSplitContext* pCxt, SStableSplitInfo int32_t code = stbSplAppendWEnd(pPartWin, &index); if (TSDB_CODE_SUCCESS == code) { nodesDestroyNode(pMergeWin->pTsEnd); - pMergeWin->pTsEnd = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index)); + pMergeWin->pTsEnd = NULL; + code = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index), &pMergeWin->pTsEnd); if (NULL == pMergeWin->pTsEnd) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } } code = stbSplCreateExchangeNode(pCxt, pInfo->pSplitNode, pPartWindow); @@ -1006,24 +1013,21 @@ static int32_t stbSplCreatePartAggNode(SAggLogicNode* pMergeAgg, SLogicNode** pO SNode* pConditions = pMergeAgg->node.pConditions; pMergeAgg->node.pConditions = NULL; - SAggLogicNode* pPartAgg = (SAggLogicNode*)nodesCloneNode((SNode*)pMergeAgg); + SAggLogicNode* pPartAgg = NULL; + int32_t code = nodesCloneNode((SNode*)pMergeAgg, (SNode**)&pPartAgg); if (NULL == pPartAgg) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pPartAgg->node.groupAction = GROUP_ACTION_KEEP; - int32_t code = TSDB_CODE_SUCCESS; - if (NULL != pGroupKeys) { pPartAgg->pGroupKeys = pGroupKeys; code = createColumnByRewriteExprs(pPartAgg->pGroupKeys, &pPartAgg->node.pTargets); } if (TSDB_CODE_SUCCESS == code && NULL != pGroupKeys) { - pMergeAgg->pGroupKeys = nodesCloneList(pPartAgg->node.pTargets); - if (NULL == pMergeAgg->pGroupKeys) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + pMergeAgg->pGroupKeys = NULL; + code = nodesCloneList(pPartAgg->node.pTargets, &pMergeAgg->pGroupKeys); } if (TSDB_CODE_SUCCESS == code) { pMergeAgg->node.pConditions = pConditions; @@ -1090,7 +1094,7 @@ static int32_t stbSplAggNodeCreateMerge(SSplitContext* pCtx, SStableSplitInfo* p if (idx++ < originalLen) continue; SFunctionNode* pGroupKeyFunc = createGroupKeyAggFunc((SColumnNode*)node); if (!pGroupKeyFunc) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = terrno; break; } code = nodesListMakeStrictAppend(&extraAggFuncs, (SNode*)pGroupKeyFunc); @@ -1104,7 +1108,7 @@ static int32_t stbSplAggNodeCreateMerge(SSplitContext* pCtx, SStableSplitInfo* p code = createColumnByRewriteExprs(extraAggFuncs, &pChildAgg->pTargets); } if (code == TSDB_CODE_SUCCESS) { - nodesListAppendList(((SAggLogicNode*)pChildAgg)->pAggFuncs, extraAggFuncs); + code = nodesListAppendList(((SAggLogicNode*)pChildAgg)->pAggFuncs, extraAggFuncs); extraAggFuncs = NULL; } @@ -1165,7 +1169,7 @@ static int32_t stbSplSplitAggNodeForCrossTableMulSubplan(SSplitContext* pCxt, SS if (code == TSDB_CODE_SUCCESS) { pFirstScanSubplan = splCreateScanSubplan(pCxt, pPartAgg, SPLIT_FLAG_STABLE_SPLIT); - if (!pFirstScanSubplan) code = TSDB_CODE_OUT_OF_MEMORY; + if (!pFirstScanSubplan) code = terrno; } if (code == TSDB_CODE_SUCCESS) { @@ -1220,7 +1224,7 @@ static int32_t stbSplSplitAggNodeForCrossTable(SSplitContext* pCxt, SStableSplit SLogicSubplan* pScanSubplan = NULL; if (TSDB_CODE_SUCCESS == code) { pScanSubplan = splCreateScanSubplan(pCxt, pPartAgg, SPLIT_FLAG_STABLE_SPLIT); - if (!pScanSubplan) code = TSDB_CODE_OUT_OF_MEMORY; + if (!pScanSubplan) code = terrno; } if (code == TSDB_CODE_SUCCESS) { @@ -1242,10 +1246,11 @@ static int32_t stbSplSplitAggNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) return stbSplSplitAggNodeForCrossTable(pCxt, pInfo); } -static SNode* stbSplCreateColumnNode(SExprNode* pExpr) { - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); +static int32_t stbSplCreateColumnNode(SExprNode* pExpr, SNode** ppNode) { + SColumnNode* pCol = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { - return NULL; + return code; } if (QUERY_NODE_COLUMN == nodeType(pExpr)) { strcpy(pCol->dbName, ((SColumnNode*)pExpr)->dbName); @@ -1258,22 +1263,26 @@ static SNode* stbSplCreateColumnNode(SExprNode* pExpr) { strcpy(pCol->node.aliasName, pExpr->aliasName); strcpy(pCol->node.userAlias, pExpr->userAlias); pCol->node.resType = pExpr->resType; - return (SNode*)pCol; + *ppNode = (SNode*)pCol; + return code; } -static SNode* stbSplCreateOrderByExpr(SOrderByExprNode* pSortKey, SNode* pCol) { - SOrderByExprNode* pOutput = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR); +static int32_t stbSplCreateOrderByExpr(SOrderByExprNode* pSortKey, SNode* pCol, SNode** ppNode) { + SOrderByExprNode* pOutput = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR, (SNode**)&pOutput); if (NULL == pOutput) { - return NULL; + return code; } - pOutput->pExpr = nodesCloneNode(pCol); + pOutput->pExpr = NULL; + code = nodesCloneNode(pCol, &pOutput->pExpr); if (NULL == pOutput->pExpr) { nodesDestroyNode((SNode*)pOutput); - return NULL; + return code; } pOutput->order = pSortKey->order; pOutput->nullOrder = pSortKey->nullOrder; - return (SNode*)pOutput; + *ppNode = (SNode*)pOutput; + return code; } static int32_t stbSplCreateMergeKeys(SNodeList* pSortKeys, SNodeList* pTargets, SNodeList** pOutput) { @@ -1288,7 +1297,11 @@ static int32_t stbSplCreateMergeKeys(SNodeList* pSortKeys, SNodeList* pTargets, FOREACH(pTarget, pTargets) { if ((QUERY_NODE_COLUMN == nodeType(pSortExpr) && nodesEqualNode((SNode*)pSortExpr, pTarget)) || (0 == strcmp(pSortExpr->aliasName, ((SColumnNode*)pTarget)->colName))) { - code = nodesListMakeStrictAppend(&pMergeKeys, stbSplCreateOrderByExpr(pSortKey, pTarget)); + SNode* pNew = NULL; + code = stbSplCreateOrderByExpr(pSortKey, pTarget, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pMergeKeys, pNew); + } if (TSDB_CODE_SUCCESS != code) { break; } @@ -1296,8 +1309,15 @@ static int32_t stbSplCreateMergeKeys(SNodeList* pSortKeys, SNodeList* pTargets, } } if (TSDB_CODE_SUCCESS == code && !found) { - SNode* pCol = stbSplCreateColumnNode(pSortExpr); - code = nodesListMakeStrictAppend(&pMergeKeys, stbSplCreateOrderByExpr(pSortKey, pCol)); + SNode* pCol = NULL; + code = stbSplCreateColumnNode(pSortExpr, &pCol); + if (TSDB_CODE_SUCCESS == code) { + SNode* pNew = NULL; + code = stbSplCreateOrderByExpr(pSortKey, pCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pMergeKeys, pNew); + } + } if (TSDB_CODE_SUCCESS == code) { code = nodesListStrictAppend(pTargets, pCol); } else { @@ -1324,9 +1344,10 @@ static int32_t stbSplCreatePartSortNode(SSortLogicNode* pSort, SLogicNode** pOut pSort->node.pChildren = NULL; int32_t code = TSDB_CODE_SUCCESS; - SSortLogicNode* pPartSort = (SSortLogicNode*)nodesCloneNode((SNode*)pSort); + SSortLogicNode* pPartSort = NULL; + code = nodesCloneNode((SNode*)pSort, (SNode**)&pPartSort); if (NULL == pPartSort) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } SNodeList* pMergeKeys = NULL; @@ -1392,9 +1413,10 @@ static int32_t stbSplGetSplitNodeForScan(SStableSplitInfo* pInfo, SLogicNode** p !((SProjectLogicNode*)pInfo->pSplitNode->pParent)->inputIgnoreGroup) { *pSplitNode = pInfo->pSplitNode->pParent; if (NULL != pInfo->pSplitNode->pLimit) { - (*pSplitNode)->pLimit = nodesCloneNode(pInfo->pSplitNode->pLimit); + (*pSplitNode)->pLimit = NULL; + int32_t code = nodesCloneNode(pInfo->pSplitNode->pLimit, &(*pSplitNode)->pLimit); if (NULL == (*pSplitNode)->pLimit) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } ((SLimitNode*)pInfo->pSplitNode->pLimit)->limit += ((SLimitNode*)pInfo->pSplitNode->pLimit)->offset; ((SLimitNode*)pInfo->pSplitNode->pLimit)->offset = 0; @@ -1436,7 +1458,7 @@ static int32_t stbSplSplitScanNodeWithPartTags(SSplitContext* pCxt, SStableSplit return code; } -static SNode* stbSplFindPrimaryKeyFromScan(SScanLogicNode* pScan) { +static int32_t stbSplFindPrimaryKeyFromScan(SScanLogicNode* pScan, SNode** ppNode) { bool find = false; SNode* pCol = NULL; FOREACH(pCol, pScan->pScanCols) { @@ -1446,19 +1468,29 @@ static SNode* stbSplFindPrimaryKeyFromScan(SScanLogicNode* pScan) { } } if (!find) { - return NULL; + *ppNode = NULL; + return TSDB_CODE_SUCCESS; } SNode* pTarget = NULL; FOREACH(pTarget, pScan->node.pTargets) { if (nodesEqualNode(pTarget, pCol)) { - return pCol; + *ppNode = pCol; + return TSDB_CODE_SUCCESS; } } - nodesListStrictAppend(pScan->node.pTargets, nodesCloneNode(pCol)); - return pCol; + SNode* pNew = NULL; + int32_t code = nodesCloneNode(pCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pScan->node.pTargets, pNew); + } + if (TSDB_CODE_SUCCESS == code) { + *ppNode = pCol; + } + return code; } -static SNode* stbSplFindPkFromScan(SScanLogicNode* pScan) { +static int32_t stbSplFindPkFromScan(SScanLogicNode* pScan, SNode** ppNode) { + int32_t code = 0; bool find = false; SNode* pCol = NULL; FOREACH(pCol, pScan->pScanCols) { @@ -1468,16 +1500,25 @@ static SNode* stbSplFindPkFromScan(SScanLogicNode* pScan) { } } if (!find) { - return NULL; + *ppNode = NULL; + return code; } SNode* pTarget = NULL; FOREACH(pTarget, pScan->node.pTargets) { if (nodesEqualNode(pTarget, pCol)) { - return pCol; + *ppNode = pCol; + return code; } } - nodesListStrictAppend(pScan->node.pTargets, nodesCloneNode(pCol)); - return pCol; + SNode* pNew = NULL; + code = nodesCloneNode(pCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListStrictAppend(pScan->node.pTargets, pNew); + } + if (TSDB_CODE_SUCCESS == code) { + *ppNode = pCol; + } + return code; } static int32_t stbSplCreateMergeScanNode(SScanLogicNode* pScan, SLogicNode** pOutputMergeScan, @@ -1486,9 +1527,10 @@ static int32_t stbSplCreateMergeScanNode(SScanLogicNode* pScan, SLogicNode** pOu pScan->node.pChildren = NULL; int32_t code = TSDB_CODE_SUCCESS; - SScanLogicNode* pMergeScan = (SScanLogicNode*)nodesCloneNode((SNode*)pScan); + SScanLogicNode* pMergeScan = NULL; + code = nodesCloneNode((SNode*)pScan, (SNode**)&pMergeScan); if (NULL == pMergeScan) { - code = TSDB_CODE_OUT_OF_MEMORY; + code = code; } SNodeList* pMergeKeys = NULL; @@ -1498,9 +1540,15 @@ static int32_t stbSplCreateMergeScanNode(SScanLogicNode* pScan, SLogicNode** pOu pMergeScan->node.pChildren = pChildren; splSetParent((SLogicNode*)pMergeScan); - SNode* pTs = stbSplFindPrimaryKeyFromScan(pMergeScan); - code = stbSplCreateMergeKeysByPrimaryKey(pTs, pMergeScan->scanSeq[0] > 0 ? ORDER_ASC : ORDER_DESC, &pMergeKeys); - SNode* pPk = stbSplFindPkFromScan(pMergeScan); + SNode* pTs = NULL; + code = stbSplFindPrimaryKeyFromScan(pMergeScan, &pTs); + if (TSDB_CODE_SUCCESS == code) { + code = stbSplCreateMergeKeysByPrimaryKey(pTs, pMergeScan->scanSeq[0] > 0 ? ORDER_ASC : ORDER_DESC, &pMergeKeys); + } + SNode* pPk = NULL; + if (TSDB_CODE_SUCCESS == code) { + code = stbSplFindPkFromScan(pMergeScan, &pPk); + } if (TSDB_CODE_SUCCESS == code && NULL != pPk) { code = stbSplCreateMergeKeysByExpr(pPk, pMergeScan->scanSeq[0] > 0 ? ORDER_ASC : ORDER_DESC, &pMergeKeys); } @@ -1589,11 +1637,16 @@ static int32_t stbSplSplitJoinNode(SSplitContext* pCxt, SStableSplitInfo* pInfo) static int32_t stbSplCreateMergeKeysForPartitionNode(SLogicNode* pPart, SNodeList** pMergeKeys) { SScanLogicNode* pScan = (SScanLogicNode*)nodesListGetNode(pPart->pChildren, 0); - SNode* pPrimaryKey = nodesCloneNode(stbSplFindPrimaryKeyFromScan(pScan)); - if (NULL == pPrimaryKey) { - return TSDB_CODE_OUT_OF_MEMORY; + SNode* pPK = NULL; + SNode* pPrimaryKey = NULL; + int32_t code = stbSplFindPrimaryKeyFromScan(pScan, &pPK); + if (TSDB_CODE_SUCCESS == code) { + code = nodesCloneNode(pPK, &pPrimaryKey); } - int32_t code = nodesListAppend(pPart->pTargets, pPrimaryKey); + if (NULL == pPrimaryKey) { + return code; + } + code = nodesListStrictAppend(pPart->pTargets, pPrimaryKey); if (TSDB_CODE_SUCCESS == code) { code = stbSplCreateMergeKeysByPrimaryKey(pPrimaryKey, pScan->scanSeq[0] > 0 ? ORDER_ASC : ORDER_DESC, pMergeKeys); } @@ -1711,8 +1764,11 @@ static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubpl SNode* pChild = NULL; FOREACH(pChild, pSplitNode->pChildren) { - SLogicSubplan* pNewSubplan = splCreateSubplan(pCxt, (SLogicNode*)pChild); - code = nodesListMakeStrictAppend(&pUnionSubplan->pChildren, (SNode*)pNewSubplan); + SLogicSubplan* pNewSubplan = NULL; + code = splCreateSubplan(pCxt, (SLogicNode*)pChild, &pNewSubplan); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pUnionSubplan->pChildren, (SNode*)pNewSubplan); + } if (TSDB_CODE_SUCCESS == code) { REPLACE_NODE(NULL); code = splMountSubplan(pNewSubplan, pSubplanChildren); @@ -1725,7 +1781,7 @@ static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubpl if (TSDB_CODE_SUCCESS == code) { if (NULL != pSubplanChildren) { if (pSubplanChildren->length > 0) { - nodesListMakeStrictAppendList(&pUnionSubplan->pChildren, pSubplanChildren); + code = nodesListMakeStrictAppendList(&pUnionSubplan->pChildren, pSubplanChildren); } else { nodesDestroyList(pSubplanChildren); } @@ -1752,17 +1808,25 @@ static bool unAllSplFindSplitNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, static int32_t unAllSplCreateExchangeNode(SSplitContext* pCxt, int32_t startGroupId, SLogicSubplan* pSubplan, SProjectLogicNode* pProject) { - SExchangeLogicNode* pExchange = (SExchangeLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE); + SExchangeLogicNode* pExchange = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE, (SNode**)&pExchange); if (NULL == pExchange) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pExchange->srcStartGroupId = startGroupId; pExchange->srcEndGroupId = pCxt->groupId - 1; pExchange->node.precision = pProject->node.precision; - pExchange->node.pTargets = nodesCloneList(pProject->node.pTargets); - pExchange->node.pConditions = nodesCloneNode(pProject->node.pConditions); - if (NULL == pExchange->node.pTargets || (NULL != pProject->node.pConditions && NULL == pExchange->node.pConditions)) { - return TSDB_CODE_OUT_OF_MEMORY; + pExchange->node.pTargets = NULL; + code = nodesCloneList(pProject->node.pTargets, &pExchange->node.pTargets); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pExchange); + return code; + } + pExchange->node.pConditions = NULL; + code = nodesCloneNode(pProject->node.pConditions, &pExchange->node.pConditions); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode((SNode*)pExchange); + return code; } TSWAP(pExchange->node.pLimit, pProject->node.pLimit); @@ -1808,21 +1872,24 @@ typedef struct SUnionDistinctSplitInfo { static int32_t unDistSplCreateExchangeNode(SSplitContext* pCxt, int32_t startGroupId, SLogicSubplan* pSubplan, SAggLogicNode* pAgg) { - SExchangeLogicNode* pExchange = (SExchangeLogicNode*)nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE); + SExchangeLogicNode* pExchange = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_PLAN_EXCHANGE, (SNode**)&pExchange); if (NULL == pExchange) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } pExchange->srcStartGroupId = startGroupId; pExchange->srcEndGroupId = pCxt->groupId - 1; pExchange->node.precision = pAgg->node.precision; - pExchange->node.pTargets = nodesCloneList(pAgg->pGroupKeys); + pExchange->node.pTargets = NULL; + code = nodesCloneList(pAgg->pGroupKeys, &pExchange->node.pTargets); if (NULL == pExchange->node.pTargets) { - return TSDB_CODE_OUT_OF_MEMORY; + nodesDestroyNode((SNode*)pExchange); + return code; } pSubplan->subplanType = SUBPLAN_TYPE_MERGE; - return nodesListMakeAppend(&pAgg->node.pChildren, (SNode*)pExchange); + return nodesListMakeStrictAppend(&pAgg->node.pChildren, (SNode*)pExchange); } static bool unDistSplFindSplitNode(SSplitContext* pCxt, SLogicSubplan* pSubplan, SLogicNode* pNode, @@ -1910,10 +1977,7 @@ static int32_t insertSelectSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) { SNodeList* pSubplanChildren = info.pSubplan->pChildren; int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, SUBPLAN_TYPE_MODIFY); if (TSDB_CODE_SUCCESS == code) { - pNewSubplan = splCreateSubplan(pCxt, info.pQueryRoot); - if (NULL == pNewSubplan) { - code = TSDB_CODE_OUT_OF_MEMORY; - } + code = splCreateSubplan(pCxt, info.pQueryRoot, &pNewSubplan); } if (TSDB_CODE_SUCCESS == code) { code = nodesListMakeStrictAppend(&info.pSubplan->pChildren, (SNode*)pNewSubplan); @@ -1967,7 +2031,7 @@ static int32_t qnodeSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) { } code = nodesListMakeStrictAppend(&info.pSubplan->pChildren, (SNode*)pScanSubplan); } else { - code = TSDB_CODE_OUT_OF_MEMORY; + code = terrno; } } info.pSubplan->subplanType = SUBPLAN_TYPE_COMPUTE; @@ -1989,25 +2053,32 @@ static const SSplitRule splitRuleSet[] = { static const int32_t splitRuleNum = (sizeof(splitRuleSet) / sizeof(SSplitRule)); -static void dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) { +static int32_t dumpLogicSubplan(const char* pRuleName, SLogicSubplan* pSubplan) { + int32_t code = 0; if (!tsQueryPlannerTrace) { - return; + return code; } char* pStr = NULL; - nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL); - if (NULL == pRuleName) { - qDebugL("before split, JsonPlan: %s", pStr); - } else { - qDebugL("apply split %s rule, JsonPlan: %s", pRuleName, pStr); + code = nodesNodeToString((SNode*)pSubplan, false, &pStr, NULL); + if (TSDB_CODE_SUCCESS == code) { + if (NULL == pRuleName) { + qDebugL("before split, JsonPlan: %s", pStr); + } else { + qDebugL("apply split %s rule, JsonPlan: %s", pRuleName, pStr); + } + taosMemoryFree(pStr); } - taosMemoryFree(pStr); + return code; } static int32_t applySplitRule(SPlanContext* pCxt, SLogicSubplan* pSubplan) { SSplitContext cxt = { .pPlanCxt = pCxt, .queryId = pSubplan->id.queryId, .groupId = pSubplan->id.groupId + 1, .split = false}; bool split = false; - dumpLogicSubplan(NULL, pSubplan); + int32_t code = dumpLogicSubplan(NULL, pSubplan); + if (TSDB_CODE_SUCCESS != code) { + return code; + } do { split = false; for (int32_t i = 0; i < splitRuleNum; ++i) { @@ -2018,7 +2089,10 @@ static int32_t applySplitRule(SPlanContext* pCxt, SLogicSubplan* pSubplan) { } if (cxt.split) { split = true; - dumpLogicSubplan(splitRuleSet[i].pName, pSubplan); + code = dumpLogicSubplan(splitRuleSet[i].pName, pSubplan); + if (TSDB_CODE_SUCCESS != code) { + return code; + } } } } while (split); diff --git a/source/libs/planner/src/planUtil.c b/source/libs/planner/src/planUtil.c index 02572a1a90..91dc36b99f 100644 --- a/source/libs/planner/src/planUtil.c +++ b/source/libs/planner/src/planUtil.c @@ -35,7 +35,7 @@ static char* getUsageErrFormat(int32_t errCode) { int32_t generateUsageErrMsg(char* pBuf, int32_t len, int32_t errCode, ...) { va_list vArgList; va_start(vArgList, errCode); - vsnprintf(pBuf, len, getUsageErrFormat(errCode), vArgList); + (void)vsnprintf(pBuf, len, getUsageErrFormat(errCode), vArgList); va_end(vArgList); return errCode; } @@ -49,7 +49,8 @@ static EDealRes doCreateColumn(SNode* pNode, void* pContext) { SCreateColumnCxt* pCxt = (SCreateColumnCxt*)pContext; switch (nodeType(pNode)) { case QUERY_NODE_COLUMN: { - SNode* pCol = nodesCloneNode(pNode); + SNode* pCol = NULL; + pCxt->errCode = nodesCloneNode(pNode, &pCol); if (NULL == pCol) { return DEAL_RES_ERROR; } @@ -61,7 +62,8 @@ static EDealRes doCreateColumn(SNode* pNode, void* pContext) { case QUERY_NODE_FUNCTION: case QUERY_NODE_CASE_WHEN: { SExprNode* pExpr = (SExprNode*)pNode; - SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + SColumnNode* pCol = NULL; + pCxt->errCode = nodesMakeNode(QUERY_NODE_COLUMN, (SNode**)&pCol); if (NULL == pCol) { return DEAL_RES_ERROR; } @@ -88,9 +90,12 @@ static EDealRes doCreateColumn(SNode* pNode, void* pContext) { } int32_t createColumnByRewriteExprs(SNodeList* pExprs, SNodeList** pList) { - SCreateColumnCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pList = (NULL == *pList ? nodesMakeList() : *pList)}; - if (NULL == cxt.pList) { - return TSDB_CODE_OUT_OF_MEMORY; + SCreateColumnCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pList = *pList}; + if (!cxt.pList) { + int32_t code = nodesMakeList(&cxt.pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } } nodesWalkExprs(pExprs, doCreateColumn, &cxt); @@ -105,9 +110,12 @@ int32_t createColumnByRewriteExprs(SNodeList* pExprs, SNodeList** pList) { } int32_t createColumnByRewriteExpr(SNode* pExpr, SNodeList** pList) { - SCreateColumnCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pList = (NULL == *pList ? nodesMakeList() : *pList)}; - if (NULL == cxt.pList) { - return TSDB_CODE_OUT_OF_MEMORY; + SCreateColumnCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pList = *pList}; + if (!cxt.pList) { + int32_t code = nodesMakeList(&cxt.pList); + if (TSDB_CODE_SUCCESS != code) { + return code; + } } nodesWalkExpr(pExpr, doCreateColumn, &cxt); @@ -517,17 +525,26 @@ int32_t collectTableAliasFromNodes(SNode* pNode, SSHashObj** ppRes) { } } - tSimpleHashPut(*ppRes, pCol->tableAlias, strlen(pCol->tableAlias), NULL, 0); - } - - FOREACH(pNode, pCurr->pChildren) { - code = collectTableAliasFromNodes(pNode, ppRes); + code = tSimpleHashPut(*ppRes, pCol->tableAlias, strlen(pCol->tableAlias), NULL, 0); if (TSDB_CODE_SUCCESS != code) { - return code; + break; } } - return TSDB_CODE_SUCCESS; + if (TSDB_CODE_SUCCESS == code) { + FOREACH(pNode, pCurr->pChildren) { + code = collectTableAliasFromNodes(pNode, ppRes); + if (TSDB_CODE_SUCCESS != code) { + break; + } + } + } + if (TSDB_CODE_SUCCESS != code) { + tSimpleHashCleanup(*ppRes); + *ppRes = NULL; + } + + return code; } bool isPartTagAgg(SAggLogicNode* pAgg) { @@ -545,25 +562,35 @@ bool isPartTableWinodw(SWindowLogicNode* pWindow) { return pWindow->isPartTb || keysHasTbname(stbGetPartKeys((SLogicNode*)nodesListGetNode(pWindow->node.pChildren, 0))); } -bool cloneLimit(SLogicNode* pParent, SLogicNode* pChild, uint8_t cloneWhat) { - SLimitNode* pLimit; - bool cloned = false; +int32_t cloneLimit(SLogicNode* pParent, SLogicNode* pChild, uint8_t cloneWhat, bool* pCloned) { + SLimitNode* pLimit = NULL, *pSlimit = NULL; + int32_t code = 0; + bool cloned = false; if (pParent->pLimit && (cloneWhat & CLONE_LIMIT)) { - pChild->pLimit = nodesCloneNode(pParent->pLimit); - pLimit = (SLimitNode*)pChild->pLimit; - pLimit->limit += pLimit->offset; - pLimit->offset = 0; - cloned = true; + code = nodesCloneNode(pParent->pLimit, (SNode**)&pLimit); + if (TSDB_CODE_SUCCESS == code) { + pLimit->limit += pLimit->offset; + pLimit->offset = 0; + cloned = true; + } } if (pParent->pSlimit && (cloneWhat & CLONE_SLIMIT)) { - pChild->pSlimit = nodesCloneNode(pParent->pSlimit); - pLimit = (SLimitNode*)pChild->pSlimit; - pLimit->limit += pLimit->offset; - pLimit->offset = 0; - cloned = true; + code = nodesCloneNode(pParent->pSlimit, (SNode**)&pSlimit); + if (TSDB_CODE_SUCCESS == code) { + pSlimit->limit += pSlimit->offset; + pSlimit->offset = 0; + cloned = true; + } } - return cloned; + if (TSDB_CODE_SUCCESS == code) { + pChild->pLimit = (SNode*)pLimit; + pChild->pSlimit = (SNode*)pSlimit; + *pCloned = cloned; + } else { + nodesDestroyNode((SNode*)pLimit); + } + return code; } static EDealRes partTagsOptHasColImpl(SNode* pNode, void* pContext) { @@ -583,12 +610,17 @@ bool keysHasCol(SNodeList* pKeys) { } SFunctionNode* createGroupKeyAggFunc(SColumnNode* pGroupCol) { - SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION); + SFunctionNode* pFunc = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_FUNCTION, (SNode**)&pFunc); if (pFunc) { strcpy(pFunc->functionName, "_group_key"); strcpy(pFunc->node.aliasName, pGroupCol->node.aliasName); strcpy(pFunc->node.userAlias, pGroupCol->node.userAlias); - int32_t code = nodesListMakeStrictAppend(&pFunc->pParameterList, nodesCloneNode((SNode*)pGroupCol)); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pGroupCol, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeStrictAppend(&pFunc->pParameterList, pNew); + } if (code == TSDB_CODE_SUCCESS) { code = fmGetFuncInfo(pFunc, NULL, 0); } @@ -596,10 +628,17 @@ SFunctionNode* createGroupKeyAggFunc(SColumnNode* pGroupCol) { nodesDestroyNode((SNode*)pFunc); pFunc = NULL; } - char name[TSDB_FUNC_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_POINTER_PRINT_BYTES + 1] = {0}; - int32_t len = snprintf(name, sizeof(name) - 1, "%s.%p", pFunc->functionName, pFunc); - taosCreateMD5Hash(name, len); - strncpy(pFunc->node.aliasName, name, TSDB_COL_NAME_LEN - 1); + if (TSDB_CODE_SUCCESS == code) { + char name[TSDB_FUNC_NAME_LEN + TSDB_NAME_DELIMITER_LEN + TSDB_POINTER_PRINT_BYTES + 1] = {0}; + int32_t len = snprintf(name, sizeof(name) - 1, "%s.%p", pFunc->functionName, pFunc); + (void)taosCreateMD5Hash(name, len); + strncpy(pFunc->node.aliasName, name, TSDB_COL_NAME_LEN - 1); + } + } + if (TSDB_CODE_SUCCESS != code) { + terrno = code; + nodesDestroyNode((SNode*)pFunc); + pFunc = NULL; } return pFunc; } @@ -656,14 +695,20 @@ int32_t tagScanSetExecutionMode(SScanLogicNode* pScan) { return TSDB_CODE_SUCCESS; } - SNode* pCond = nodesCloneNode(pScan->node.pConditions); + SNode* pCond = NULL; + int32_t code = nodesCloneNode(pScan->node.pConditions, &pCond); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SNode* pTagCond = NULL; SNode* pTagIndexCond = NULL; - filterPartitionCond(&pCond, NULL, &pTagIndexCond, &pTagCond, NULL); - if (pTagIndexCond || tagScanNodeHasTbname(pTagCond)) { - pScan->onlyMetaCtbIdx = false; - } else { - pScan->onlyMetaCtbIdx = true; + code = filterPartitionCond(&pCond, NULL, &pTagIndexCond, &pTagCond, NULL); + if (TSDB_CODE_SUCCESS == code) { + if (pTagIndexCond || tagScanNodeHasTbname(pTagCond)) { + pScan->onlyMetaCtbIdx = false; + } else { + pScan->onlyMetaCtbIdx = true; + } } nodesDestroyNode(pCond); nodesDestroyNode(pTagIndexCond); diff --git a/source/libs/planner/src/planner.c b/source/libs/planner/src/planner.c index 78ae541166..1b53819c7b 100644 --- a/source/libs/planner/src/planner.c +++ b/source/libs/planner/src/planner.c @@ -19,22 +19,28 @@ #include "scalar.h" #include "tglobal.h" -static void debugPrintNode(SNode* pNode) { +static int32_t debugPrintNode(SNode* pNode) { char* pStr = NULL; - nodesNodeToString(pNode, false, &pStr, NULL); - printf("%s\n", pStr); - taosMemoryFree(pStr); - return; + int32_t code = nodesNodeToString(pNode, false, &pStr, NULL); + if (TSDB_CODE_SUCCESS == code) { + (void)printf("%s\n", pStr); + taosMemoryFree(pStr); + } + return code; } -static void dumpQueryPlan(SQueryPlan* pPlan) { +static int32_t dumpQueryPlan(SQueryPlan* pPlan) { + int32_t code = 0; if (!tsQueryPlannerTrace) { - return; + return code; } char* pStr = NULL; - nodesNodeToString((SNode*)pPlan, false, &pStr, NULL); - planDebugL("QID:0x%" PRIx64 " Query Plan, JsonPlan: %s", pPlan->queryId, pStr); - taosMemoryFree(pStr); + code = nodesNodeToString((SNode*)pPlan, false, &pStr, NULL); + if (TSDB_CODE_SUCCESS == code) { + planDebugL("QID:0x%" PRIx64 " Query Plan, JsonPlan: %s", pPlan->queryId, pStr); + taosMemoryFree(pStr); + } + return code; } int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNodeList) { @@ -61,9 +67,9 @@ int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNo code = validateQueryPlan(pCxt, *pPlan); } if (TSDB_CODE_SUCCESS == code) { - dumpQueryPlan(*pPlan); + code = dumpQueryPlan(*pPlan); } - nodesReleaseAllocator(pCxt->allocatorId); + (void)nodesReleaseAllocator(pCxt->allocatorId); nodesDestroyNode((SNode*)pLogicSubplan); nodesDestroyNode((SNode*)pLogicPlan); @@ -72,10 +78,15 @@ int32_t qCreateQueryPlan(SPlanContext* pCxt, SQueryPlan** pPlan, SArray* pExecNo } static int32_t setSubplanExecutionNode(SPhysiNode* pNode, int32_t groupId, SDownstreamSourceNode* pSource) { + int32_t code = 0; if (QUERY_NODE_PHYSICAL_PLAN_EXCHANGE == nodeType(pNode)) { SExchangePhysiNode* pExchange = (SExchangePhysiNode*)pNode; if (groupId >= pExchange->srcStartGroupId && groupId <= pExchange->srcEndGroupId) { - return nodesListMakeStrictAppend(&pExchange->pSrcEndPoints, nodesCloneNode((SNode*)pSource)); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pSource, &pNew); + if (TSDB_CODE_SUCCESS == code) { + return nodesListMakeStrictAppend(&pExchange->pSrcEndPoints, pNew); + } } } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE == nodeType(pNode)) { SMergePhysiNode* pMerge = (SMergePhysiNode*)pNode; @@ -87,17 +98,23 @@ static int32_t setSubplanExecutionNode(SPhysiNode* pNode, int32_t groupId, SDown } else { --(pMerge->numOfChannels); } - return nodesListMakeStrictAppend(&pExchange->pSrcEndPoints, nodesCloneNode((SNode*)pSource)); + SNode* pNew = NULL; + code = nodesCloneNode((SNode*)pSource, &pNew); + if (TSDB_CODE_SUCCESS == code) { + return nodesListMakeStrictAppend(&pExchange->pSrcEndPoints, pNew); + } } } SNode* pChild = NULL; - FOREACH(pChild, pNode->pChildren) { - if (TSDB_CODE_SUCCESS != setSubplanExecutionNode((SPhysiNode*)pChild, groupId, pSource)) { - return TSDB_CODE_OUT_OF_MEMORY; + if (TSDB_CODE_SUCCESS == code) { + FOREACH(pChild, pNode->pChildren) { + if (TSDB_CODE_SUCCESS != (code = setSubplanExecutionNode((SPhysiNode*)pChild, groupId, pSource))) { + return code; + } } } - return TSDB_CODE_SUCCESS; + return code; } int32_t qContinuePlanPostQuery(void *pPostPlan) { diff --git a/source/libs/planner/test/planStmtTest.cpp b/source/libs/planner/test/planStmtTest.cpp index df8a509d12..f9db50faf9 100644 --- a/source/libs/planner/test/planStmtTest.cpp +++ b/source/libs/planner/test/planStmtTest.cpp @@ -146,8 +146,8 @@ TEST_F(PlanStmtTest, basic) { { prepare("SELECT * FROM t1 WHERE c1 = ? AND c2 = ?"); TAOS_MULTI_BIND* pBindParams = createBindParams(2); - buildIntegerParam(pBindParams, 0, 10, TSDB_DATA_TYPE_INT); - buildStringParam(pBindParams, 1, "abc", TSDB_DATA_TYPE_VARCHAR, strlen("abc")); + (void)buildIntegerParam(pBindParams, 0, 10, TSDB_DATA_TYPE_INT); + (void)buildStringParam(pBindParams, 1, "abc", TSDB_DATA_TYPE_VARCHAR, strlen("abc")); bindParams(pBindParams, -1); exec(); destoryBindParams(pBindParams, 2); @@ -156,8 +156,8 @@ TEST_F(PlanStmtTest, basic) { { prepare("SELECT MAX(?), MAX(?) FROM t1"); TAOS_MULTI_BIND* pBindParams = createBindParams(2); - buildIntegerParam(pBindParams, 0, 10, TSDB_DATA_TYPE_TINYINT); - buildIntegerParam(pBindParams, 1, 20, TSDB_DATA_TYPE_INT); + (void)buildIntegerParam(pBindParams, 0, 10, TSDB_DATA_TYPE_TINYINT); + (void)buildIntegerParam(pBindParams, 1, 20, TSDB_DATA_TYPE_INT); bindParams(pBindParams, -1); exec(); destoryBindParams(pBindParams, 2); diff --git a/source/libs/planner/test/planTestMain.cpp b/source/libs/planner/test/planTestMain.cpp index e05fa27c1e..99f71e1bc6 100644 --- a/source/libs/planner/test/planTestMain.cpp +++ b/source/libs/planner/test/planTestMain.cpp @@ -27,13 +27,12 @@ class PlannerEnv : public testing::Environment { public: virtual void SetUp() { - // TODO(smj) : How to handle return value of fmFuncMgtInit - (void)fmFuncMgtInit(); + ASSERT_EQ(TSDB_CODE_SUCCESS, fmFuncMgtInit()); initMetaDataEnv(); generateMetaData(); initLog(TD_TMP_DIR_PATH "td"); initCfg(); - nodesInitAllocatorSet(); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesInitAllocatorSet()); } virtual void TearDown() { @@ -66,7 +65,7 @@ class PlannerEnv : public testing::Environment { tsAsyncLog = 0; taosRemoveDir(path); - taosMkDir(path); + ASSERT_EQ(TSDB_CODE_SUCCESS,taosMkDir(path)); tstrncpy(tsLogDir, path, PATH_MAX); if (taosInitLog("taoslog", 1) != 0) { std::cout << "failed to init log file" << std::endl; @@ -117,7 +116,7 @@ static void parseArg(int argc, char* argv[]) { } int main(int argc, char* argv[]) { - testing::AddGlobalTestEnvironment(new PlannerEnv()); + (void)testing::AddGlobalTestEnvironment(new PlannerEnv()); testing::InitGoogleTest(&argc, argv); parseArg(argc, argv); return RUN_ALL_TESTS(); diff --git a/source/libs/planner/test/planTestUtil.cpp b/source/libs/planner/test/planTestUtil.cpp index 3b432b9890..da38a72953 100644 --- a/source/libs/planner/test/planTestUtil.cpp +++ b/source/libs/planner/test/planTestUtil.cpp @@ -93,7 +93,7 @@ int32_t getLogLevel() { return g_logLevel; } class PlannerTestBaseImpl { public: - PlannerTestBaseImpl() : sqlNo_(0), sqlNum_(0) {} + PlannerTestBaseImpl() : sqlNo_(0), sqlNum_(0) { assert(qInitKeywordsTable() == 0); } void useDb(const string& user, const string& db) { caseEnv_.acctId_ = 0; @@ -131,8 +131,8 @@ class PlannerTestBaseImpl { void runImpl(const string& sql, int32_t queryPolicy) { int64_t allocatorId = 0; if (g_useNodeAllocator) { - nodesCreateAllocator(sqlNo_, 32 * 1024, &allocatorId); - nodesAcquireAllocator(allocatorId); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesCreateAllocator(sqlNo_, 32 * 1024, &allocatorId)); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesAcquireAllocator(allocatorId)); } reset(); @@ -166,12 +166,12 @@ class PlannerTestBaseImpl { dump(g_dumpModule); } catch (...) { dump(DUMP_MODULE_ALL); - nodesReleaseAllocator(allocatorId); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesReleaseAllocator(allocatorId)); nodesDestroyAllocator(allocatorId); throw; } - nodesReleaseAllocator(allocatorId); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesReleaseAllocator(allocatorId)); nodesDestroyAllocator(allocatorId); } @@ -448,12 +448,12 @@ class PlannerTestBaseImpl { pCmdMsg->msgLen = tSerializeSMCreateSmaReq(NULL, 0, pStmt->pReq); pCmdMsg->pMsg = taosMemoryMalloc(pCmdMsg->msgLen); if (!pCmdMsg->pMsg) FAIL(); - tSerializeSMCreateSmaReq(pCmdMsg->pMsg, pCmdMsg->msgLen, pStmt->pReq); + ASSERT_TRUE(0 < tSerializeSMCreateSmaReq(pCmdMsg->pMsg, pCmdMsg->msgLen, pStmt->pReq)); ((SQuery*)pQuery)->pCmdMsg = pCmdMsg; - tDeserializeSMCreateSmaReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req); + ASSERT_EQ(TSDB_CODE_SUCCESS, tDeserializeSMCreateSmaReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req)); g_mockCatalogService->createSmaIndex(&req); - nodesStringToNode(req.ast, &pCxt->pAstRoot); + ASSERT_EQ(TSDB_CODE_SUCCESS, nodesStringToNode(req.ast, &pCxt->pAstRoot)); pCxt->deleteMark = req.deleteMark; tFreeSMCreateSmaReq(&req); nodesDestroyNode(pQuery->pRoot); diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 19b4c521a4..29dba30669 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -3931,8 +3931,9 @@ int32_t fltSclGetOrCreateColumnRange(SColumnNode *colNode, SArray *colRangeList, } // TODO(smj):wait for nodesCloneNode change it's return value, use terrno for now. terrno = TSDB_CODE_SUCCESS; - SColumnNode *pColumnNode = (SColumnNode *)nodesCloneNode((SNode *)colNode); - FLT_ERR_RET(terrno); + SColumnNode *pColumnNode = NULL; + int32_t code = nodesCloneNode((SNode *)colNode, (SNode**)&pColumnNode); + FLT_ERR_RET(code); SFltSclColumnRange newColRange = {.colNode = pColumnNode, .points = taosArrayInit(4, sizeof(SFltSclPoint))}; if (NULL == newColRange.points) { FLT_ERR_RET(terrno); @@ -4915,16 +4916,22 @@ static int32_t fltSclCollectOperatorFromNode(SNode *pNode, SArray *sclOpList) { SValueNode *valNode = (SValueNode *)pOper->pRight; if (IS_NUMERIC_TYPE(valNode->node.resType.type) || valNode->node.resType.type == TSDB_DATA_TYPE_TIMESTAMP) { - SFltSclOperator sclOp = {.colNode = (SColumnNode *)nodesCloneNode(pOper->pLeft), - .valNode = (SValueNode *)nodesCloneNode(pOper->pRight), + SNode* pLeft = NULL, *pRight = NULL; + int32_t code = nodesCloneNode(pOper->pLeft, &pLeft); + if (TSDB_CODE_SUCCESS != code) { + FLT_ERR_RET(code); + } + code = nodesCloneNode(pOper->pRight, &pRight); + if (TSDB_CODE_SUCCESS != code) { + nodesDestroyNode(pLeft); + FLT_ERR_RET(code); + } + SFltSclOperator sclOp = {.colNode = (SColumnNode *)pLeft, + .valNode = (SValueNode *)pRight, .type = pOper->opType}; - if (NULL == sclOp.colNode) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); - } - if (NULL == sclOp.valNode) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); - } if (NULL == taosArrayPush(sclOpList, &sclOp)) { + nodesDestroyNode(pLeft); + nodesDestroyNode(pRight); FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } } @@ -5209,8 +5216,12 @@ EConditionType filterClassifyCondition(SNode *pNode) { } int32_t filterIsMultiTableColsCond(SNode *pCond, bool *res) { - SNodeList *pCondCols = nodesMakeList(); - int32_t code = nodesCollectColumnsFromNode(pCond, NULL, COLLECT_COL_TYPE_ALL, &pCondCols); + SNodeList *pCondCols = NULL; + int32_t code = nodesMakeList(&pCondCols); + if (TSDB_CODE_SUCCESS!= code) { + return code; + } + code = nodesCollectColumnsFromNode(pCond, NULL, COLLECT_COL_TYPE_ALL, &pCondCols); if (code == TSDB_CODE_SUCCESS) { if (LIST_LENGTH(pCondCols) >= 2) { SColumnNode *pFirstCol = (SColumnNode *)nodesListGetNode(pCondCols, 0); @@ -5249,32 +5260,56 @@ static int32_t partitionLogicCond(SNode **pCondition, SNode **pPrimaryKeyCond, S } if (result) { if (NULL != pOtherCond) { - code = nodesListMakeAppend(&pOtherConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pOtherConds, pNew); + } } } else { switch (filterClassifyCondition(pCond)) { case COND_TYPE_PRIMARY_KEY: if (NULL != pPrimaryKeyCond) { - code = nodesListMakeAppend(&pPrimaryKeyConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pPrimaryKeyConds, pNew); + } } break; case COND_TYPE_TAG_INDEX: if (NULL != pTagIndexCond) { - code = nodesListMakeAppend(&pTagIndexConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pTagIndexConds, pNew); + } } if (NULL != pTagCond) { - code = nodesListMakeAppend(&pTagConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pTagConds, pNew); + } } break; case COND_TYPE_TAG: if (NULL != pTagCond) { - code = nodesListMakeAppend(&pTagConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pTagConds, pNew); + } } break; case COND_TYPE_NORMAL: default: if (NULL != pOtherCond) { - code = nodesListMakeAppend(&pOtherConds, nodesCloneNode(pCond)); + SNode* pNew = NULL; + code = nodesCloneNode(pCond, &pNew); + if (TSDB_CODE_SUCCESS == code) { + code = nodesListMakeAppend(&pOtherConds, pNew); + } } break; } @@ -5361,9 +5396,10 @@ int32_t filterPartitionCond(SNode **pCondition, SNode **pPrimaryKeyCond, SNode * if (NULL != pTagCond) { SNode *pTempCond = *pCondition; if (NULL != pTagIndexCond) { - pTempCond = nodesCloneNode(*pCondition); + pTempCond = NULL; + int32_t code = nodesCloneNode(*pCondition, &pTempCond); if (NULL == pTempCond) { - return TSDB_CODE_OUT_OF_MEMORY; + return code; } } *pTagCond = pTempCond; diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 040e090661..5e9c61eac6 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -1028,10 +1028,10 @@ _return: EDealRes sclRewriteNullInOptr(SNode **pNode, SScalarCtx *ctx, EOperatorType opType) { if (opType <= OP_TYPE_CALC_MAX) { - SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *res = NULL; + ctx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { sclError("make value node failed"); - ctx->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } @@ -1040,10 +1040,10 @@ EDealRes sclRewriteNullInOptr(SNode **pNode, SScalarCtx *ctx, EOperatorType opTy nodesDestroyNode(*pNode); *pNode = (SNode *)res; } else { - SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *res = NULL; + ctx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { sclError("make value node failed"); - ctx->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } @@ -1221,11 +1221,11 @@ EDealRes sclRewriteFunction(SNode **pNode, SScalarCtx *ctx) { return DEAL_RES_ERROR; } - SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *res = NULL; + ctx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { sclError("make value node failed"); sclFreeParam(&output); - ctx->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } @@ -1295,11 +1295,11 @@ EDealRes sclRewriteLogic(SNode **pNode, SScalarCtx *ctx) { return DEAL_RES_CONTINUE; } - SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *res = NULL; + ctx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { sclError("make value node failed"); sclFreeParam(&output); - ctx->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } @@ -1345,11 +1345,11 @@ EDealRes sclRewriteOperator(SNode **pNode, SScalarCtx *ctx) { return DEAL_RES_ERROR; } - SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *res = NULL; + ctx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { sclError("make value node failed"); sclFreeParam(&output); - ctx->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } @@ -1408,11 +1408,11 @@ EDealRes sclRewriteCaseWhen(SNode **pNode, SScalarCtx *ctx) { return DEAL_RES_ERROR; } - SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE); + SValueNode *res = NULL; + ctx->code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&res); if (NULL == res) { sclError("make value node failed"); sclFreeParam(&output); - ctx->code = TSDB_CODE_OUT_OF_MEMORY; return DEAL_RES_ERROR; } diff --git a/source/libs/scalar/test/filter/filterTests.cpp b/source/libs/scalar/test/filter/filterTests.cpp index 26f9024f3e..b210e2c326 100644 --- a/source/libs/scalar/test/filter/filterTests.cpp +++ b/source/libs/scalar/test/filter/filterTests.cpp @@ -63,9 +63,10 @@ void flttInitLogFile() { } int32_t flttMakeValueNode(SNode **pNode, int32_t dataType, void *value) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_VALUE); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, &node); if (NULL == node) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_RET(code); } SValueNode *vnode = (SValueNode *)node; vnode->node.resType.type = dataType; @@ -90,9 +91,10 @@ int32_t flttMakeColumnNode(SNode **pNode, SSDataBlock **block, int32_t dataType, void *value) { static uint64_t dbidx = 0; - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_COLUMN); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, &node); if (NULL == node) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_RET(code); } SColumnNode *rnode = (SColumnNode *)node; rnode->node.resType.type = dataType; @@ -170,9 +172,10 @@ int32_t flttMakeColumnNode(SNode **pNode, SSDataBlock **block, int32_t dataType, } int32_t flttMakeOpNode(SNode **pNode, EOperatorType opType, int32_t resType, SNode *pLeft, SNode *pRight) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_OPERATOR); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, &node); if (NULL == node) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_RET(code); } SOperatorNode *onode = (SOperatorNode *)node; onode->node.resType.type = resType; @@ -187,16 +190,18 @@ int32_t flttMakeOpNode(SNode **pNode, EOperatorType opType, int32_t resType, SNo } int32_t flttMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nodeList, int32_t nodeNum) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, &node); if (NULL == node) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_RET(code); } SLogicConditionNode *onode = (SLogicConditionNode *)node; onode->condType = opType; onode->node.resType.type = TSDB_DATA_TYPE_BOOL; onode->node.resType.bytes = sizeof(bool); - onode->pParameterList = nodesMakeList(); + onode->pParameterList = NULL; + code = nodesMakeList(&onode->pParameterList); for (int32_t i = 0; i < nodeNum; ++i) { FLT_ERR_RET(nodesListAppend(onode->pParameterList, nodeList[i])); } @@ -206,9 +211,10 @@ int32_t flttMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nod } int32_t flttMakeLogicNodeFromList(SNode **pNode, ELogicConditionType opType, SNodeList *nodeList) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, &node); if (NULL == node) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_RET(code); } SLogicConditionNode *onode = (SLogicConditionNode *)node; onode->condType = opType; @@ -222,9 +228,10 @@ int32_t flttMakeLogicNodeFromList(SNode **pNode, ELogicConditionType opType, SNo } int32_t flttMakeListNode(SNode **pNode, SNodeList *list, int32_t resType) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_NODE_LIST, &node); if (NULL == node) { - FLT_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + FLT_ERR_RET(code); } SNodeListNode *lnode = (SNodeListNode *)node; lnode->node.resType.type = resType; diff --git a/source/libs/scalar/test/scalar/scalarTests.cpp b/source/libs/scalar/test/scalar/scalarTests.cpp index 41be682a65..f247eb8432 100644 --- a/source/libs/scalar/test/scalar/scalarTests.cpp +++ b/source/libs/scalar/test/scalar/scalarTests.cpp @@ -56,8 +56,8 @@ class constantTest { public: - constantTest() { InitRegexCache(); } - ~constantTest() { DestroyRegexCache(); } + constantTest() { (void)InitRegexCache(); } + ~constantTest() { (void)DestroyRegexCache(); } }; static constantTest test; namespace { @@ -143,9 +143,10 @@ int32_t scltAppendReservedSlot(SArray *pBlockList, int16_t *dataBlockId, int16_t } int32_t scltMakeValueNode(SNode **pNode, int32_t dataType, void *value) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_VALUE); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_VALUE, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } SValueNode *vnode = (SValueNode *)node; vnode->node.resType.type = dataType; @@ -168,9 +169,10 @@ int32_t scltMakeValueNode(SNode **pNode, int32_t dataType, void *value) { int32_t scltMakeColumnNode(SNode **pNode, SSDataBlock **block, int32_t dataType, int32_t dataBytes, int32_t rowNum, void *value) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_COLUMN); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_COLUMN, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } SColumnNode *rnode = (SColumnNode *)node; rnode->node.resType.type = dataType; @@ -182,7 +184,6 @@ int32_t scltMakeColumnNode(SNode **pNode, SSDataBlock **block, int32_t dataType, SCL_RET(TSDB_CODE_SUCCESS); } - int32_t code = TSDB_CODE_SUCCESS; if (NULL == *block) { SSDataBlock *res = createDataBlock(); for (int32_t i = 0; i < 2; ++i) { @@ -266,9 +267,10 @@ int32_t scltMakeColumnNode(SNode **pNode, SSDataBlock **block, int32_t dataType, int32_t scltMakeOpNode2(SNode **pNode, EOperatorType opType, int32_t resType, SNode *pLeft, SNode *pRight, bool isReverse) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_OPERATOR); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } SOperatorNode *onode = (SOperatorNode *)node; onode->node.resType.type = resType; @@ -288,9 +290,10 @@ int32_t scltMakeOpNode2(SNode **pNode, EOperatorType opType, int32_t resType, SN } int32_t scltMakeOpNode(SNode **pNode, EOperatorType opType, int32_t resType, SNode *pLeft, SNode *pRight) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_OPERATOR); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_OPERATOR, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } SOperatorNode *onode = (SOperatorNode *)node; onode->node.resType.type = resType; @@ -305,9 +308,10 @@ int32_t scltMakeOpNode(SNode **pNode, EOperatorType opType, int32_t resType, SNo } int32_t scltMakeListNode(SNode **pNode, SNodeList *list, int32_t resType) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_NODE_LIST, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } SNodeListNode *lnode = (SNodeListNode *)node; lnode->node.resType.type = resType; @@ -318,16 +322,21 @@ int32_t scltMakeListNode(SNode **pNode, SNodeList *list, int32_t resType) { } int32_t scltMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nodeList, int32_t nodeNum) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } SLogicConditionNode *onode = (SLogicConditionNode *)node; onode->condType = opType; onode->node.resType.type = TSDB_DATA_TYPE_BOOL; onode->node.resType.bytes = sizeof(bool); - onode->pParameterList = nodesMakeList(); + onode->pParameterList = NULL; + code = nodesMakeList(&onode->pParameterList); + if (TSDB_CODE_SUCCESS != code) { + SCL_ERR_RET(code); + } for (int32_t i = 0; i < nodeNum; ++i) { SCL_ERR_RET(nodesListAppend(onode->pParameterList, nodeList[i])); } @@ -337,9 +346,10 @@ int32_t scltMakeLogicNode(SNode **pNode, ELogicConditionType opType, SNode **nod } int32_t scltMakeTargetNode(SNode **pNode, int16_t dataBlockId, int16_t slotId, SNode *snode) { - SNode *node = (SNode *)nodesMakeNode(QUERY_NODE_TARGET); + SNode *node = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_TARGET, &node); if (NULL == node) { - SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); + SCL_ERR_RET(code); } STargetNode *onode = (STargetNode *)node; onode->pExpr = snode; @@ -632,7 +642,8 @@ TEST(constantTest, int_in_smallint1) { int32_t code = TSDB_CODE_SUCCESS; code = scltMakeValueNode(&pLeft, TSDB_DATA_TYPE_INT, &leftv); ASSERT_EQ(code, TSDB_CODE_SUCCESS); - SNodeList *list = nodesMakeList(); + SNodeList *list = NULL; + code = nodesMakeList(&list); ASSERT_NE(list, nullptr); code = scltMakeValueNode(&pRight, TSDB_DATA_TYPE_SMALLINT, &rightv1); ASSERT_EQ(code, TSDB_CODE_SUCCESS); @@ -669,7 +680,8 @@ TEST(constantTest, int_in_smallint2) { int32_t code = TSDB_CODE_SUCCESS; code = scltMakeValueNode(&pLeft, TSDB_DATA_TYPE_INT, &leftv); ASSERT_EQ(code, TSDB_CODE_SUCCESS); - SNodeList *list = nodesMakeList(); + SNodeList* list = NULL; + code = nodesMakeList(&list); ASSERT_NE(list, nullptr); code = scltMakeValueNode(&pRight, TSDB_DATA_TYPE_SMALLINT, &rightv1); ASSERT_EQ(code, TSDB_CODE_SUCCESS); @@ -704,7 +716,8 @@ TEST(constantTest, int_not_in_smallint1) { int32_t code = TSDB_CODE_SUCCESS; code = scltMakeValueNode(&pLeft, TSDB_DATA_TYPE_INT, &leftv); ASSERT_EQ(code, TSDB_CODE_SUCCESS); - SNodeList *list = nodesMakeList(); + SNodeList *list = NULL; + code = nodesMakeList(&list); ASSERT_NE(list, nullptr); code = scltMakeValueNode(&pRight, TSDB_DATA_TYPE_SMALLINT, &rightv1); ASSERT_EQ(code, TSDB_CODE_SUCCESS); @@ -741,7 +754,8 @@ TEST(constantTest, int_not_in_smallint2) { int32_t code = TSDB_CODE_SUCCESS; code = scltMakeValueNode(&pLeft, TSDB_DATA_TYPE_INT, &leftv); ASSERT_EQ(code, TSDB_CODE_SUCCESS); - SNodeList *list = nodesMakeList(); + SNodeList *list = NULL; + code = nodesMakeList(&list); ASSERT_NE(list, nullptr); code = scltMakeValueNode(&pRight, TSDB_DATA_TYPE_SMALLINT, &rightv1); ASSERT_EQ(code, TSDB_CODE_SUCCESS); @@ -2084,7 +2098,8 @@ TEST(columnTest, int_column_in_double_list) { int32_t code = TSDB_CODE_SUCCESS; code = scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_INT, sizeof(int32_t), rowNum, leftv); ASSERT_EQ(code, TSDB_CODE_SUCCESS); - SNodeList *list = nodesMakeList(); + SNodeList *list = NULL; + code = nodesMakeList(&list); ASSERT_NE(list, nullptr); code = scltMakeValueNode(&pRight, TSDB_DATA_TYPE_DOUBLE, &rightv1); ASSERT_EQ(code, TSDB_CODE_SUCCESS); @@ -2157,7 +2172,8 @@ TEST(columnTest, binary_column_in_binary_list) { int32_t code = TSDB_CODE_SUCCESS; code = scltMakeColumnNode(&pLeft, &src, TSDB_DATA_TYPE_BINARY, 3, rowNum, leftv); ASSERT_EQ(code, TSDB_CODE_SUCCESS); - SNodeList *list = nodesMakeList(); + SNodeList *list = NULL; + code = nodesMakeList(&list); ASSERT_NE(list, nullptr); code = scltMakeValueNode(&pRight, TSDB_DATA_TYPE_BINARY, rightv[0]); ASSERT_EQ(code, TSDB_CODE_SUCCESS); diff --git a/source/libs/scheduler/test/schedulerTests.cpp b/source/libs/scheduler/test/schedulerTests.cpp index 37860ac202..f7c3fb8847 100644 --- a/source/libs/scheduler/test/schedulerTests.cpp +++ b/source/libs/scheduler/test/schedulerTests.cpp @@ -154,24 +154,29 @@ void schtBuildQueryDag(SQueryPlan *dag) { dag->queryId = qId; dag->numOfSubplans = 2; - dag->pSubplans = nodesMakeList(); + dag->pSubplans = NULL; + int32_t code = nodesMakeList(&dag->pSubplans); if (NULL == dag->pSubplans) { return; } - SNodeListNode *scan = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNodeListNode *scan = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&scan); if (NULL == scan) { return; } - SNodeListNode *merge = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNodeListNode *merge = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&merge); if (NULL == merge) { return; } - SSubplan *scanPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); + SSubplan *scanPlan = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&scanPlan); if (NULL == scanPlan) { return; } - SSubplan *mergePlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); + SSubplan *mergePlan = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&mergePlan); if (NULL == mergePlan) { return; } @@ -187,11 +192,13 @@ void schtBuildQueryDag(SQueryPlan *dag) { scanPlan->pChildren = NULL; scanPlan->level = 1; - scanPlan->pParents = nodesMakeList(); + scanPlan->pParents = NULL; + code = nodesMakeList(&scanPlan->pParents); if (NULL == scanPlan->pParents) { return; } - scanPlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN); + scanPlan->pNode = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, (SNode**)&scanPlan->pNode); if (NULL == scanPlan->pNode) { return; } @@ -204,22 +211,26 @@ void schtBuildQueryDag(SQueryPlan *dag) { mergePlan->level = 0; mergePlan->execNode.epSet.numOfEps = 0; - mergePlan->pChildren = nodesMakeList(); + mergePlan->pChildren = NULL; + code = nodesMakeList(&mergePlan->pChildren); if (NULL == mergePlan->pChildren) { return; } mergePlan->pParents = NULL; - mergePlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE); + mergePlan->pNode = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE, (SNode**)&mergePlan->pNode); if (NULL == mergePlan->pNode) { return; } mergePlan->msgType = TDMT_SCH_QUERY; - merge->pNodeList = nodesMakeList(); + merge->pNodeList = NULL; + code = nodesMakeList(&merge->pNodeList); if (NULL == merge->pNodeList) { return; } - scan->pNodeList = nodesMakeList(); + scan->pNodeList = NULL; + code = nodesMakeList(&scan->pNodeList); if (NULL == scan->pNodeList) { return; } @@ -240,40 +251,48 @@ void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) { dag->queryId = qId; dag->numOfSubplans = 2; - dag->pSubplans = nodesMakeList(); + dag->pSubplans = NULL; + int32_t code = nodesMakeList(&dag->pSubplans); if (NULL == dag->pSubplans) { return; } - SNodeListNode *scan = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNodeListNode *scan = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&scan); if (NULL == scan) { return; } - SNodeListNode *merge = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNodeListNode *merge = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&merge); if (NULL == merge) { return; } - SSubplan *mergePlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); + SSubplan *mergePlan = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&mergePlan); if (NULL == mergePlan) { return; } - merge->pNodeList = nodesMakeList(); + merge->pNodeList = NULL; + code = nodesMakeList(&merge->pNodeList); if (NULL == merge->pNodeList) { return; } - scan->pNodeList = nodesMakeList(); + scan->pNodeList = NULL; + code = nodesMakeList(&scan->pNodeList); if (NULL == scan->pNodeList) { return; } - mergePlan->pChildren = nodesMakeList(); + mergePlan->pChildren = NULL; + code = nodesMakeList(&mergePlan->pChildren); if (NULL == mergePlan->pChildren) { return; } for (int32_t i = 0; i < scanPlanNum; ++i) { - SSubplan *scanPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); + SSubplan *scanPlan = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&scanPlan); if (NULL == scanPlan) { return; } @@ -292,11 +311,13 @@ void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) { scanPlan->pChildren = NULL; scanPlan->level = 1; - scanPlan->pParents = nodesMakeList(); + scanPlan->pParents = NULL; + code = nodesMakeList(&scanPlan->pParents); if (NULL == scanPlan->pParents) { return; } - scanPlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN); + scanPlan->pNode = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, (SNode**)&scanPlan->pNode); if (NULL == scanPlan->pNode) { return; } @@ -316,7 +337,8 @@ void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) { mergePlan->execNode.epSet.numOfEps = 0; mergePlan->pParents = NULL; - mergePlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE); + mergePlan->pNode = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE, (SNode**)&mergePlan->pNode); if (NULL == mergePlan->pNode) { return; } @@ -335,20 +357,24 @@ void schtBuildInsertDag(SQueryPlan *dag) { dag->queryId = qId; dag->numOfSubplans = 2; - dag->pSubplans = nodesMakeList(); + dag->pSubplans = NULL; + int32_t code = nodesMakeList(&dag->pSubplans); if (NULL == dag->pSubplans) { return; } - SNodeListNode *inserta = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST); + SNodeListNode *inserta = NULL; + code = nodesMakeNode(QUERY_NODE_NODE_LIST, (SNode**)&inserta); if (NULL == inserta) { return; } - inserta->pNodeList = nodesMakeList(); + inserta->pNodeList = NULL; + code = nodesMakeList(&inserta->pNodeList); if (NULL == inserta->pNodeList) { return; } - SSubplan *insertPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); + SSubplan *insertPlan = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&insertPlan); if (NULL == insertPlan) { return; } @@ -366,7 +392,8 @@ void schtBuildInsertDag(SQueryPlan *dag) { insertPlan->pChildren = NULL; insertPlan->pParents = NULL; insertPlan->pNode = NULL; - insertPlan->pDataSink = (SDataSinkNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT); + insertPlan->pDataSink = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT, (SNode**)&insertPlan->pDataSink); if (NULL == insertPlan->pDataSink) { return; } @@ -379,7 +406,8 @@ void schtBuildInsertDag(SQueryPlan *dag) { (void)nodesListAppend(inserta->pNodeList, (SNode *)insertPlan); - insertPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN); + insertPlan = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN, (SNode**)&insertPlan); if (NULL == insertPlan) { return; } @@ -397,7 +425,8 @@ void schtBuildInsertDag(SQueryPlan *dag) { insertPlan->pChildren = NULL; insertPlan->pParents = NULL; insertPlan->pNode = NULL; - insertPlan->pDataSink = (SDataSinkNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT); + insertPlan->pDataSink = NULL; + code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT, (SNode**)&insertPlan->pDataSink); if (NULL == insertPlan->pDataSink) { return; } @@ -640,11 +669,12 @@ void *schtRunJobThread(void *aa) { char *dbname = "1.db1"; char *tablename = "table1"; SVgroupInfo vgInfo = {0}; - SQueryPlan *dag = (SQueryPlan *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); - + SQueryPlan *dag = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN, (SNode**)&dag); + assert(code == 0); schtInitLogFile(); - int32_t code = schedulerInit(); + code = schedulerInit(); assert(code == 0); schtSetPlanToString(); @@ -828,7 +858,9 @@ TEST(queryTest, normalCase) { char *tablename = "table1"; SVgroupInfo vgInfo = {0}; int64_t job = 0; - SQueryPlan *dag = (SQueryPlan *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); + SQueryPlan *dag = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN, (SNode**)&dag); + ASSERT_EQ(code, TSDB_CODE_SUCCESS); SArray *qnodeList = taosArrayInit(1, sizeof(SQueryNodeLoad)); @@ -838,7 +870,7 @@ TEST(queryTest, normalCase) { load.addr.epSet.eps[0].port = 6031; assert(taosArrayPush(qnodeList, &load) != NULL); - int32_t code = schedulerInit(); + code = schedulerInit(); ASSERT_EQ(code, 0); schtBuildQueryDag(dag); @@ -942,7 +974,9 @@ TEST(queryTest, readyFirstCase) { char *tablename = "table1"; SVgroupInfo vgInfo = {0}; int64_t job = 0; - SQueryPlan *dag = (SQueryPlan *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); + SQueryPlan *dag = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN, (SNode**)&dag); + ASSERT_EQ(TSDB_CODE_SUCCESS, code); SArray *qnodeList = taosArrayInit(1, sizeof(SQueryNodeLoad)); @@ -952,7 +986,7 @@ TEST(queryTest, readyFirstCase) { load.addr.epSet.eps[0].port = 6031; assert(NULL != taosArrayPush(qnodeList, &load)); - int32_t code = schedulerInit(); + code = schedulerInit(); ASSERT_EQ(code, 0); schtBuildQueryDag(dag); @@ -1055,7 +1089,9 @@ TEST(queryTest, flowCtrlCase) { char *tablename = "table1"; SVgroupInfo vgInfo = {0}; int64_t job = 0; - SQueryPlan *dag = (SQueryPlan *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); + SQueryPlan *dag = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN, (SNode**)&dag); + ASSERT_EQ(TSDB_CODE_SUCCESS, code); schtInitLogFile(); @@ -1069,7 +1105,7 @@ TEST(queryTest, flowCtrlCase) { load.addr.epSet.eps[0].port = 6031; assert(NULL != taosArrayPush(qnodeList, &load)); - int32_t code = schedulerInit(); + code = schedulerInit(); ASSERT_EQ(code, 0); schtBuildQueryFlowCtrlDag(dag); @@ -1151,7 +1187,9 @@ TEST(insertTest, normalCase) { char *dbname = "1.db1"; char *tablename = "table1"; SVgroupInfo vgInfo = {0}; - SQueryPlan *dag = (SQueryPlan *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN); + SQueryPlan *dag = NULL; + int32_t code = nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN, (SNode**)&dag); + ASSERT_EQ(TSDB_CODE_SUCCESS, code); uint64_t numOfRows = 0; SArray *qnodeList = taosArrayInit(1, sizeof(SQueryNodeLoad)); @@ -1162,7 +1200,7 @@ TEST(insertTest, normalCase) { load.addr.epSet.eps[0].port = 6031; assert(NULL != taosArrayPush(qnodeList, &load)); - int32_t code = schedulerInit(); + code = schedulerInit(); ASSERT_EQ(code, 0); schtBuildInsertDag(dag); diff --git a/source/libs/sync/inc/syncPipeline.h b/source/libs/sync/inc/syncPipeline.h index ddc036b606..ea85b796d5 100644 --- a/source/libs/sync/inc/syncPipeline.h +++ b/source/libs/sync/inc/syncPipeline.h @@ -77,7 +77,7 @@ static FORCE_INLINE int32_t syncLogReplGetNextRetryBackoff(SSyncLogReplMgr* pMgr return TMIN(pMgr->retryBackoff + 1, SYNC_MAX_RETRY_BACKOFF); } -SyncTerm syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index); +int32_t syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pSyncTerm); int32_t syncLogReplStart(SSyncLogReplMgr* pMgr, SSyncNode* pNode); int32_t syncLogReplAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode); @@ -93,10 +93,10 @@ int32_t syncLogReplContinue(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendE int32_t syncLogReplProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg); // SSyncLogBuffer -SSyncLogBuffer* syncLogBufferCreate(); -void syncLogBufferDestroy(SSyncLogBuffer* pBuf); -int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); -int32_t syncLogBufferReInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); +int32_t syncLogBufferCreate(SSyncLogBuffer** ppBuf); +void syncLogBufferDestroy(SSyncLogBuffer* pBuf); +int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); +int32_t syncLogBufferReInit(SSyncLogBuffer* pBuf, SSyncNode* pNode); // access int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf); @@ -110,9 +110,10 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode); // private -SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf); -int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); -int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex); +int32_t syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf, + SSyncRaftEntry** ppEntry); +int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf); +int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex); int32_t syncFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry, int32_t applyCode, bool force); diff --git a/source/libs/sync/inc/syncRaftEntry.h b/source/libs/sync/inc/syncRaftEntry.h index b13c69e471..7f8cb78ea1 100644 --- a/source/libs/sync/inc/syncRaftEntry.h +++ b/source/libs/sync/inc/syncRaftEntry.h @@ -43,7 +43,7 @@ SSyncRaftEntry* syncEntryBuildFromRpcMsg(const SRpcMsg* pMsg, SyncTerm term, Syn SSyncRaftEntry* syncEntryBuildFromAppendEntries(const SyncAppendEntries* pMsg); SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId); void syncEntryDestroy(SSyncRaftEntry* pEntry); -void syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg); // step 7 +int32_t syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg); // step 7 static FORCE_INLINE bool syncLogReplBarrier(SSyncRaftEntry* pEntry) { return pEntry->originalRpcType == TDMT_SYNC_NOOP || pEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE; diff --git a/source/libs/sync/inc/syncReplication.h b/source/libs/sync/inc/syncReplication.h index ecd2b5163e..36c4599527 100644 --- a/source/libs/sync/inc/syncReplication.h +++ b/source/libs/sync/inc/syncReplication.h @@ -58,7 +58,7 @@ int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, S int32_t syncSnapSendMsg(SSyncSnapshotSender* pSender, int32_t seq, void* pBlock, int32_t len, int32_t typ); int32_t syncSnapSendRsp(SSyncSnapshotReceiver* pReceiver, SyncSnapshotSend* pMsg, void* pBlock, int32_t len, - int32_t typ, int32_t code); + int32_t typ, int32_t rspCode); #ifdef __cplusplus } diff --git a/source/libs/sync/inc/syncRespMgr.h b/source/libs/sync/inc/syncRespMgr.h index 1d41c0a85f..611c6575c1 100644 --- a/source/libs/sync/inc/syncRespMgr.h +++ b/source/libs/sync/inc/syncRespMgr.h @@ -35,14 +35,14 @@ typedef struct SSyncRespMgr { uint64_t seqNum; } SSyncRespMgr; -SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl); -void syncRespMgrDestroy(SSyncRespMgr *pObj); -uint64_t syncRespMgrAdd(SSyncRespMgr *pObj, const SRespStub *pStub); -int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t seq); -int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t seq, SRespStub *pStub); -int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t seq, SRpcHandleInfo *pInfo); -void syncRespClean(SSyncRespMgr *pObj); -void syncRespCleanRsp(SSyncRespMgr *pObj); +int32_t syncRespMgrCreate(void *data, int64_t ttl, SSyncRespMgr **ppObj); +void syncRespMgrDestroy(SSyncRespMgr *pObj); +uint64_t syncRespMgrAdd(SSyncRespMgr *pObj, const SRespStub *pStub); +int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t seq); +int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t seq, SRespStub *pStub); +int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t seq, SRpcHandleInfo *pInfo); +void syncRespClean(SSyncRespMgr *pObj); +void syncRespCleanRsp(SSyncRespMgr *pObj); #ifdef __cplusplus } diff --git a/source/libs/sync/inc/syncSnapshot.h b/source/libs/sync/inc/syncSnapshot.h index 66d8edfdfc..540255c200 100644 --- a/source/libs/sync/inc/syncSnapshot.h +++ b/source/libs/sync/inc/syncSnapshot.h @@ -74,12 +74,12 @@ typedef struct SSyncSnapshotSender { int32_t replicaIndex; } SSyncSnapshotSender; -SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaIndex); -void snapshotSenderDestroy(SSyncSnapshotSender *pSender); -bool snapshotSenderIsStart(SSyncSnapshotSender *pSender); -int32_t snapshotSenderStart(SSyncSnapshotSender *pSender); -void snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish); -int32_t snapshotReSend(SSyncSnapshotSender *pSender); +int32_t snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaIndex, SSyncSnapshotSender **ppSender); +void snapshotSenderDestroy(SSyncSnapshotSender *pSender); +bool snapshotSenderIsStart(SSyncSnapshotSender *pSender); +int32_t snapshotSenderStart(SSyncSnapshotSender *pSender); +void snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish); +int32_t snapshotReSend(SSyncSnapshotSender *pSender); typedef struct SSyncSnapshotReceiver { // update when prep snapshot @@ -101,11 +101,11 @@ typedef struct SSyncSnapshotReceiver { SSyncNode *pSyncNode; } SSyncSnapshotReceiver; -SSyncSnapshotReceiver *snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId fromId); -void snapshotReceiverDestroy(SSyncSnapshotReceiver *pReceiver); -void snapshotReceiverStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg); -void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver); -bool snapshotReceiverIsStart(SSyncSnapshotReceiver *pReceiver); +int32_t snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId fromId, SSyncSnapshotReceiver **ppReceiver); +void snapshotReceiverDestroy(SSyncSnapshotReceiver *pReceiver); +void snapshotReceiverStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg); +void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver); +bool snapshotReceiverIsStart(SSyncSnapshotReceiver *pReceiver); // on message // int32_t syncNodeOnSnapshot(SSyncNode *ths, const SRpcMsg *pMsg); diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index b455e3355f..d6a1efc05f 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -949,6 +949,7 @@ int32_t syncNodeLogStoreRestoreOnNeed(SSyncNode* pNode) { // open/close -------------- SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion) { + int32_t code = 0; SSyncNode* pSyncNode = taosMemoryCalloc(1, sizeof(SSyncNode)); if (pSyncNode == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -1041,7 +1042,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion) { pSyncNode->syncEqCtrlMsg = pSyncInfo->syncEqCtrlMsg; // create raft log ring buffer - pSyncNode->pLogBuf = syncLogBufferCreate(); + (void)syncLogBufferCreate(&pSyncNode->pLogBuf); // TODO: check return value if (pSyncNode->pLogBuf == NULL) { sError("failed to init sync log buffer since %s. vgId:%d", terrstr(), pSyncNode->vgId); goto _error; @@ -1218,7 +1219,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion) { } // tools - pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, SYNC_RESP_TTL_MS); + (void)syncRespMgrCreate(pSyncNode, SYNC_RESP_TTL_MS, &pSyncNode->pSyncRespMgr); // TODO: check return value if (pSyncNode->pSyncRespMgr == NULL) { sError("vgId:%d, failed to create SyncRespMgr", pSyncNode->vgId); goto _error; @@ -1229,7 +1230,8 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion) { // snapshot senders for (int32_t i = 0; i < TSDB_MAX_REPLICA + TSDB_MAX_LEARNER_REPLICA; ++i) { - SSyncSnapshotSender* pSender = snapshotSenderCreate(pSyncNode, i); + SSyncSnapshotSender* pSender = NULL; + code = snapshotSenderCreate(pSyncNode, i, &pSender); if (pSender == NULL) return NULL; pSyncNode->senders[i] = pSender; @@ -1237,7 +1239,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion) { } // snapshot receivers - pSyncNode->pNewNodeReceiver = snapshotReceiverCreate(pSyncNode, EMPTY_RAFT_ID); + code = snapshotReceiverCreate(pSyncNode, EMPTY_RAFT_ID, &pSyncNode->pNewNodeReceiver); if (pSyncNode->pNewNodeReceiver == NULL) return NULL; sRDebug(pSyncNode->pNewNodeReceiver, "snapshot receiver create while open sync node, data:%p", pSyncNode->pNewNodeReceiver); @@ -1810,7 +1812,7 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde // create new for (int32_t i = 0; i < TSDB_MAX_REPLICA + TSDB_MAX_LEARNER_REPLICA; ++i) { if (pSyncNode->senders[i] == NULL) { - pSyncNode->senders[i] = snapshotSenderCreate(pSyncNode, i); + snapshotSenderCreate(pSyncNode, i, &pSyncNode->senders[i]); if (pSyncNode->senders[i] == NULL) { // will be created later while send snapshot sSError(pSyncNode->senders[i], "snapshot sender create failed while reconfig"); @@ -2840,8 +2842,9 @@ int32_t syncNodeRebuildAndCopyIfExist(SSyncNode* ths, int32_t oldtotalReplicaNum } for (int32_t i = 0; i < TSDB_MAX_REPLICA + TSDB_MAX_LEARNER_REPLICA; ++i) { - SSyncSnapshotSender* pSender = snapshotSenderCreate(ths, i); - if (pSender == NULL) return -1; + SSyncSnapshotSender* pSender = NULL; + int32_t code = snapshotSenderCreate(ths, i, &pSender); + if (pSender == NULL) return terrno = code; ths->senders[i] = pSender; sSDebug(pSender, "snapshot sender create while open sync node, data:%p", pSender); diff --git a/source/libs/sync/src/syncPipeline.c b/source/libs/sync/src/syncPipeline.c index 796a45d997..8b6092e839 100644 --- a/source/libs/sync/src/syncPipeline.c +++ b/source/libs/sync/src/syncPipeline.c @@ -19,13 +19,13 @@ #include "syncCommit.h" #include "syncIndexMgr.h" #include "syncInt.h" +#include "syncRaftCfg.h" #include "syncRaftEntry.h" #include "syncRaftStore.h" #include "syncReplication.h" #include "syncRespMgr.h" #include "syncSnapshot.h" #include "syncUtil.h" -#include "syncRaftCfg.h" #include "syncVoteMgr.h" static bool syncIsMsgBlock(tmsg_t type) { @@ -38,35 +38,36 @@ FORCE_INLINE static int64_t syncGetRetryMaxWaitMs() { } int64_t syncLogBufferGetEndIndex(SSyncLogBuffer* pBuf) { - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); int64_t index = pBuf->endIndex; - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); return index; } int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); + int32_t code = 0; + (void)taosThreadMutexLock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); SyncIndex index = pEntry->index; if (index - pBuf->startIndex >= pBuf->size) { - terrno = TSDB_CODE_SYN_BUFFER_FULL; - sError("vgId:%d, failed to append since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + code = TSDB_CODE_SYN_BUFFER_FULL; + sError("vgId:%d, failed to append since %s. index:%" PRId64 "", pNode->vgId, tstrerror(code), index); goto _err; } if (pNode->restoreFinish && index - pBuf->commitIndex >= TSDB_SYNC_NEGOTIATION_WIN) { - terrno = TSDB_CODE_SYN_NEGOTIATION_WIN_FULL; - sError("vgId:%d, failed to append since %s, index:%" PRId64 ", commit-index:%" PRId64, pNode->vgId, terrstr(), + code = TSDB_CODE_SYN_NEGOTIATION_WIN_FULL; + sError("vgId:%d, failed to append since %s, index:%" PRId64 ", commit-index:%" PRId64, pNode->vgId, tstrerror(code), index, pBuf->commitIndex); goto _err; } SyncIndex appliedIndex = pNode->pFsm->FpAppliedIndexCb(pNode->pFsm); if (pNode->restoreFinish && pBuf->commitIndex - appliedIndex >= TSDB_SYNC_APPLYQ_SIZE_LIMIT) { - terrno = TSDB_CODE_SYN_WRITE_STALL; + code = TSDB_CODE_SYN_WRITE_STALL; sError("vgId:%d, failed to append since %s. index:%" PRId64 ", commit-index:%" PRId64 ", applied-index:%" PRId64, - pNode->vgId, terrstr(), index, pBuf->commitIndex, appliedIndex); + pNode->vgId, tstrerror(code), index, pBuf->commitIndex, appliedIndex); goto _err; } @@ -85,29 +86,32 @@ int32_t syncLogBufferAppend(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt pBuf->entries[index % pBuf->size] = tmp; pBuf->endIndex = index + 1; - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); return 0; _err: - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); taosMsleep(1); - return -1; + TAOS_RETURN(code); } -SyncTerm syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index) { +int32_t syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pSyncTerm) { SSyncLogBuffer* pBuf = pNode->pLogBuf; SSyncRaftEntry* pEntry = NULL; SyncIndex prevIndex = index - 1; SyncTerm prevLogTerm = -1; - terrno = TSDB_CODE_SUCCESS; + int32_t code = 0; - if (prevIndex == -1 && pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore) == 0) return 0; + if (prevIndex == -1 && pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore) == 0) { + *pSyncTerm = 0; + return 0; + } if (prevIndex > pBuf->matchIndex) { - terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; - return -1; + *pSyncTerm = -1; + TAOS_RETURN(TSDB_CODE_WAL_LOG_NOT_EXIST); } ASSERT(index - 1 == prevIndex); @@ -116,7 +120,8 @@ SyncTerm syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync pEntry = pBuf->entries[(prevIndex + pBuf->size) % pBuf->size].pItem; ASSERTS(pEntry != NULL, "no log entry found"); prevLogTerm = pEntry->term; - return prevLogTerm; + *pSyncTerm = prevLogTerm; + return 0; } if (pMgr && pMgr->startIndex <= prevIndex && prevIndex < pMgr->endIndex) { @@ -124,25 +129,28 @@ SyncTerm syncLogReplGetPrevLogTerm(SSyncLogReplMgr* pMgr, SSyncNode* pNode, Sync ASSERTS(timeMs != 0, "no log entry found"); prevLogTerm = pMgr->states[(prevIndex + pMgr->size) % pMgr->size].term; ASSERT(prevIndex == 0 || prevLogTerm != 0); - return prevLogTerm; + *pSyncTerm = prevLogTerm; + return 0; } SSnapshot snapshot = {0}; - pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot); + (void)pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot); // TODO: check the return code if (prevIndex == snapshot.lastApplyIndex) { - return snapshot.lastApplyTerm; + *pSyncTerm = snapshot.lastApplyTerm; + return 0; } - if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, prevIndex, &pEntry) == 0) { + if ((code = pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, prevIndex, &pEntry)) == 0) { prevLogTerm = pEntry->term; syncEntryDestroy(pEntry); pEntry = NULL; - return prevLogTerm; + *pSyncTerm = prevLogTerm; + return 0; } - sInfo("vgId:%d, failed to get log term since %s. index:%" PRId64, pNode->vgId, terrstr(), prevIndex); - terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; - return -1; + *pSyncTerm = -1; + sInfo("vgId:%d, failed to get log term since %s. index:%" PRId64, pNode->vgId, tstrerror(code), prevIndex); + TAOS_RETURN(code); } SSyncRaftEntry* syncEntryBuildDummy(SyncTerm term, SyncIndex index, int32_t vgId) { @@ -155,7 +163,7 @@ int32_t syncLogValidateAlignmentOfCommit(SSyncNode* pNode, SyncIndex commitIndex sError("vgId:%d, firstVer of WAL log greater than tsdb commit version + 1. firstVer:%" PRId64 ", tsdb commit version:%" PRId64 "", pNode->vgId, firstVer, commitIndex); - return -1; + return TSDB_CODE_WAL_LOG_INCOMPLETE; } SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); @@ -163,7 +171,7 @@ int32_t syncLogValidateAlignmentOfCommit(SSyncNode* pNode, SyncIndex commitIndex sError("vgId:%d, lastVer of WAL log less than tsdb commit version. lastVer:%" PRId64 ", tsdb commit version:%" PRId64 "", pNode->vgId, lastVer, commitIndex); - return -1; + return TSDB_CODE_WAL_LOG_INCOMPLETE; } return 0; @@ -174,15 +182,13 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { ASSERTS(pNode->pFsm != NULL, "pFsm not registered"); ASSERTS(pNode->pFsm->FpGetSnapshotInfo != NULL, "FpGetSnapshotInfo not registered"); + int32_t code = 0, lino = 0; SSnapshot snapshot = {0}; pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot); SyncIndex commitIndex = snapshot.lastApplyIndex; SyncTerm commitTerm = TMAX(snapshot.lastApplyTerm, 0); - if (syncLogValidateAlignmentOfCommit(pNode, commitIndex)) { - terrno = TSDB_CODE_WAL_LOG_INCOMPLETE; - goto _err; - } + TAOS_CHECK_EXIT(syncLogValidateAlignmentOfCommit(pNode, commitIndex)); SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); ASSERT(lastVer >= commitIndex); @@ -206,7 +212,7 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { } if (pLogStore->syncLogGetEntry(pLogStore, index, &pEntry) < 0) { - sWarn("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + sWarn("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, tstrerror(code), index); break; } @@ -237,8 +243,7 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { SSyncRaftEntry* pDummy = syncEntryBuildDummy(commitTerm, commitIndex, pNode->vgId); if (pDummy == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); } SSyncLogBufEntry tmp = {.pItem = pDummy, .prevLogIndex = commitIndex - 1, .prevLogTerm = commitTerm}; pBuf->entries[(commitIndex + pBuf->size) % pBuf->size] = tmp; @@ -258,38 +263,41 @@ int32_t syncLogBufferInitWithoutLock(SSyncLogBuffer* pBuf, SSyncNode* pNode) { pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); // validate - syncLogBufferValidate(pBuf); + (void)syncLogBufferValidate(pBuf); return 0; -_err: - return -1; +_exit: + if (code != 0) { + sError("vgId:%d, failed to initialize sync log buffer at line %d since %s.", pNode->vgId, lino, tstrerror(code)); + } + TAOS_RETURN(code); } int32_t syncLogBufferInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); int32_t ret = syncLogBufferInitWithoutLock(pBuf, pNode); - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); return ret; } int32_t syncLogBufferReInit(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); + (void)taosThreadMutexLock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); for (SyncIndex index = pBuf->startIndex; index < pBuf->endIndex; index++) { SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; if (pEntry == NULL) continue; syncEntryDestroy(pEntry); pEntry = NULL; - memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + (void)memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); } pBuf->startIndex = pBuf->commitIndex = pBuf->matchIndex = pBuf->endIndex = 0; - int32_t ret = syncLogBufferInitWithoutLock(pBuf, pNode); - if (ret < 0) { - sError("vgId:%d, failed to re-initialize sync log buffer since %s.", pNode->vgId, terrstr()); + int32_t code = syncLogBufferInitWithoutLock(pBuf, pNode); + if (code < 0) { + sError("vgId:%d, failed to re-initialize sync log buffer since %s.", pNode->vgId, tstrerror(code)); } - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return ret; + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); + return code; } FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTermWithoutLock(SSyncLogBuffer* pBuf) { @@ -300,23 +308,23 @@ FORCE_INLINE SyncTerm syncLogBufferGetLastMatchTermWithoutLock(SSyncLogBuffer* p } SyncTerm syncLogBufferGetLastMatchTerm(SSyncLogBuffer* pBuf) { - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); SyncTerm term = syncLogBufferGetLastMatchTermWithoutLock(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); return term; } bool syncLogBufferIsEmpty(SSyncLogBuffer* pBuf) { - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); bool empty = (pBuf->endIndex <= pBuf->startIndex); - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); return empty; } int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEntry* pEntry, SyncTerm prevTerm) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); - int32_t ret = -1; + (void)taosThreadMutexLock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); + int32_t code = 0; SyncIndex index = pEntry->index; SyncIndex prevIndex = pEntry->index - 1; SyncTerm lastMatchTerm = syncLogBufferGetLastMatchTermWithoutLock(pBuf); @@ -328,21 +336,22 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - SyncTerm term = syncLogReplGetPrevLogTerm(NULL, pNode, index + 1); + SyncTerm term = -1; + code = syncLogReplGetPrevLogTerm(NULL, pNode, index + 1, &term); ASSERT(pEntry->term >= 0); if (term == pEntry->term) { - ret = 0; + code = 0; } goto _out; } - if(pNode->raftCfg.cfg.nodeInfo[pNode->raftCfg.cfg.myIndex].nodeRole == TAOS_SYNC_ROLE_LEARNER && - index > 0 && index > pBuf->totalIndex){ + if (pNode->raftCfg.cfg.nodeInfo[pNode->raftCfg.cfg.myIndex].nodeRole == TAOS_SYNC_ROLE_LEARNER && index > 0 && + index > pBuf->totalIndex) { pBuf->totalIndex = index; sTrace("vgId:%d, update learner progress. index:%" PRId64 ", term:%" PRId64 ": prevterm:%" PRId64 - " != lastmatch:%" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", - pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, - pBuf->matchIndex, pBuf->endIndex); + " != lastmatch:%" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", + pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, + pBuf->matchIndex, pBuf->endIndex); } if (index - pBuf->startIndex >= pBuf->size) { @@ -350,6 +359,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + code = TSDB_CODE_OUT_OF_RANGE; goto _out; } @@ -358,11 +368,12 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt " != lastmatch:%" PRId64 ". log buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, prevTerm, lastMatchTerm, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); + code = TSDB_CODE_ACTION_IN_PROGRESS; goto _out; } // check current in buffer - pExist = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + code = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf, &pExist); if (pExist != NULL) { ASSERT(pEntry->index == pExist->index); if (pEntry->term != pExist->term) { @@ -372,9 +383,10 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt " %" PRId64 " %" PRId64 ", %" PRId64 ")", pNode->vgId, pEntry->index, pEntry->term, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); - SyncTerm existPrevTerm = syncLogReplGetPrevLogTerm(NULL, pNode, index); + SyncTerm existPrevTerm = -1; + (void)syncLogReplGetPrevLogTerm(NULL, pNode, index, &existPrevTerm); ASSERT(pEntry->term == pExist->term && (pEntry->index > pBuf->matchIndex || prevTerm == existPrevTerm)); - ret = 0; + code = 0; goto _out; } } @@ -391,7 +403,7 @@ int32_t syncLogBufferAccept(SSyncLogBuffer* pBuf, SSyncNode* pNode, SSyncRaftEnt pBuf->endIndex = TMAX(index + 1, pBuf->endIndex); // success - ret = 0; + code = 0; _out: syncEntryDestroy(pEntry); @@ -399,9 +411,9 @@ _out: syncEntryDestroy(pExist); pExist = NULL; } - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return ret; + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); + TAOS_RETURN(code); } static inline bool syncLogStoreNeedFlush(SSyncRaftEntry* pEntry, int32_t replicaNum) { @@ -409,20 +421,21 @@ static inline bool syncLogStoreNeedFlush(SSyncRaftEntry* pEntry, int32_t replica } int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncNode* pNode, SSyncRaftEntry* pEntry) { + int32_t code = 0; ASSERT(pEntry->index >= 0); SyncIndex lastVer = pLogStore->syncLogLastIndex(pLogStore); - if (lastVer >= pEntry->index && pLogStore->syncLogTruncate(pLogStore, pEntry->index) < 0) { - sError("failed to truncate log store since %s. from index:%" PRId64 "", terrstr(), pEntry->index); - return -1; + if (lastVer >= pEntry->index && (code = pLogStore->syncLogTruncate(pLogStore, pEntry->index)) < 0) { + sError("failed to truncate log store since %s. from index:%" PRId64 "", tstrerror(code), pEntry->index); + TAOS_RETURN(code); } lastVer = pLogStore->syncLogLastIndex(pLogStore); ASSERT(pEntry->index == lastVer + 1); bool doFsync = syncLogStoreNeedFlush(pEntry, pNode->replicaNum); - if (pLogStore->syncLogAppendEntry(pLogStore, pEntry, doFsync) < 0) { - sError("failed to append sync log entry since %s. index:%" PRId64 ", term:%" PRId64 "", terrstr(), pEntry->index, - pEntry->term); - return -1; + if ((code = pLogStore->syncLogAppendEntry(pLogStore, pEntry, doFsync)) < 0) { + sError("failed to append sync log entry since %s. index:%" PRId64 ", term:%" PRId64 "", tstrerror(code), + pEntry->index, pEntry->term); + TAOS_RETURN(code); } lastVer = pLogStore->syncLogLastIndex(pLogStore); @@ -430,12 +443,13 @@ int32_t syncLogStorePersist(SSyncLogStore* pLogStore, SSyncNode* pNode, SSyncRaf return 0; } -int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* pMatchTerm, char *str) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); +int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* pMatchTerm, char* str) { + (void)taosThreadMutexLock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); SSyncLogStore* pLogStore = pNode->pLogStore; int64_t matchIndex = pBuf->matchIndex; + int32_t code = 0; while (pBuf->matchIndex + 1 < pBuf->endIndex) { int64_t index = pBuf->matchIndex + 1; @@ -478,39 +492,40 @@ int64_t syncLogBufferProceed(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncTerm* p pNode->vgId, pBuf->startIndex, pBuf->matchIndex, pBuf->endIndex); // persist - if (syncLogStorePersist(pLogStore, pNode, pEntry) < 0) { - sError("vgId:%d, failed to persist sync log entry from buffer since %s. index:%" PRId64, pNode->vgId, terrstr(), - pEntry->index); + if ((code = syncLogStorePersist(pLogStore, pNode, pEntry)) < 0) { + sError("vgId:%d, failed to persist sync log entry from buffer since %s. index:%" PRId64, pNode->vgId, + tstrerror(code), pEntry->index); taosMsleep(1); goto _out; } - if(pEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE){ - if(pNode->pLogBuf->commitIndex == pEntry->index -1){ - sInfo("vgId:%d, to change config at %s. " - "current entry, index:%" PRId64 ", term:%" PRId64", " - "node, restore:%d, commitIndex:%" PRId64 ", " - "cond: (pre entry index:%" PRId64 "== buf commit index:%" PRId64 ")", - pNode->vgId, str, - pEntry->index, pEntry->term, - pNode->restoreFinish, pNode->commitIndex, - pEntry->index - 1, pNode->pLogBuf->commitIndex); - if(syncNodeChangeConfig(pNode, pEntry, str) != 0){ - sError("vgId:%d, failed to change config from Append since %s. index:%" PRId64, pNode->vgId, terrstr(), - pEntry->index); + if (pEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE) { + if (pNode->pLogBuf->commitIndex == pEntry->index - 1) { + sInfo( + "vgId:%d, to change config at %s. " + "current entry, index:%" PRId64 ", term:%" PRId64 + ", " + "node, restore:%d, commitIndex:%" PRId64 + ", " + "cond: (pre entry index:%" PRId64 "== buf commit index:%" PRId64 ")", + pNode->vgId, str, pEntry->index, pEntry->term, pNode->restoreFinish, pNode->commitIndex, pEntry->index - 1, + pNode->pLogBuf->commitIndex); + if ((code = syncNodeChangeConfig(pNode, pEntry, str)) != 0) { + sError("vgId:%d, failed to change config from Append since %s. index:%" PRId64, pNode->vgId, tstrerror(code), + pEntry->index); goto _out; } - } - else{ - sInfo("vgId:%d, delay change config from Node %s. " - "curent entry, index:%" PRId64 ", term:%" PRId64 ", " - "node, commitIndex:%" PRId64 ", pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 "), " - "cond:( pre entry index:%" PRId64" != buf commit index:%" PRId64 ")", - pNode->vgId, str, - pEntry->index, pEntry->term, - pNode->commitIndex, pNode->pLogBuf->startIndex, pNode->pLogBuf->commitIndex, - pNode->pLogBuf->matchIndex, pNode->pLogBuf->endIndex, - pEntry->index - 1, pNode->pLogBuf->commitIndex); + } else { + sInfo( + "vgId:%d, delay change config from Node %s. " + "curent entry, index:%" PRId64 ", term:%" PRId64 + ", " + "node, commitIndex:%" PRId64 ", pBuf: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 + "), " + "cond:( pre entry index:%" PRId64 " != buf commit index:%" PRId64 ")", + pNode->vgId, str, pEntry->index, pEntry->term, pNode->commitIndex, pNode->pLogBuf->startIndex, + pNode->pLogBuf->commitIndex, pNode->pLogBuf->matchIndex, pNode->pLogBuf->endIndex, pEntry->index - 1, + pNode->pLogBuf->commitIndex); } } @@ -529,22 +544,22 @@ _out: if (pMatchTerm) { *pMatchTerm = pBuf->entries[(matchIndex + pBuf->size) % pBuf->size].pItem->term; } - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); return matchIndex; } int32_t syncFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTerm term, SSyncRaftEntry* pEntry, - int32_t applyCode, bool force) { - //learner need to execute fsm when it catch up entry log - //if force is true, keep all contition check to execute fsm - if (pNode->replicaNum == 1 && pNode->restoreFinish && pNode->vgId != 1 - && pNode->raftCfg.cfg.nodeInfo[pNode->raftCfg.cfg.myIndex].nodeRole != TAOS_SYNC_ROLE_LEARNER - && force == false) { - sDebug("vgId:%d, not to execute fsm, index:%" PRId64 ", term:%" PRId64 ", type:%s code:0x%x, replicaNum:%d," - "role:%d, restoreFinish:%d", - pNode->vgId, pEntry->index, pEntry->term, TMSG_INFO(pEntry->originalRpcType), applyCode, - pNode->replicaNum, pNode->raftCfg.cfg.nodeInfo[pNode->raftCfg.cfg.myIndex].nodeRole, pNode->restoreFinish); + int32_t applyCode, bool force) { + // learner need to execute fsm when it catch up entry log + // if force is true, keep all contition check to execute fsm + if (pNode->replicaNum == 1 && pNode->restoreFinish && pNode->vgId != 1 && + pNode->raftCfg.cfg.nodeInfo[pNode->raftCfg.cfg.myIndex].nodeRole != TAOS_SYNC_ROLE_LEARNER && force == false) { + sDebug("vgId:%d, not to execute fsm, index:%" PRId64 ", term:%" PRId64 + ", type:%s code:0x%x, replicaNum:%d," + "role:%d, restoreFinish:%d", + pNode->vgId, pEntry->index, pEntry->term, TMSG_INFO(pEntry->originalRpcType), applyCode, pNode->replicaNum, + pNode->raftCfg.cfg.nodeInfo[pNode->raftCfg.cfg.myIndex].nodeRole, pNode->restoreFinish); return 0; } @@ -558,11 +573,11 @@ int32_t syncFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTe pEntry->term); } - int32_t code = 0; + int32_t code = 0, lino = 0; bool retry = false; do { SRpcMsg rpcMsg = {.code = applyCode}; - syncEntry2OriginalRpc(pEntry, &rpcMsg); + TAOS_CHECK_EXIT(syncEntry2OriginalRpc(pEntry, &rpcMsg)); SFsmCbMeta cbMeta = {0}; cbMeta.index = pEntry->index; @@ -580,9 +595,15 @@ int32_t syncFsmExecute(SSyncNode* pNode, SSyncFSM* pFsm, ESyncState role, SyncTe retry = (code != 0) && (terrno == TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE); if (retry) { taosMsleep(10); - sError("vgId:%d, retry on fsm commit since %s. index:%" PRId64, pNode->vgId, terrstr(), pEntry->index); + sError("vgId:%d, retry on fsm commit since %s. index:%" PRId64, pNode->vgId, tstrerror(code), pEntry->index); } } while (retry); + +_exit: + if (code < 0) { + sError("vgId:%d, failed to execute fsm at line %d since %s. index:%" PRId64 ", term:%" PRId64 ", type:%s", + pNode->vgId, lino, tstrerror(code), pEntry->index, pEntry->term, TMSG_INFO(pEntry->originalRpcType)); + } return code; } @@ -596,15 +617,15 @@ int32_t syncLogBufferValidate(SSyncLogBuffer* pBuf) { } int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t commitIndex) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); + (void)taosThreadMutexLock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); SSyncLogStore* pLogStore = pNode->pLogStore; SSyncFSM* pFsm = pNode->pFsm; ESyncState role = pNode->state; SyncTerm currentTerm = raftStoreGetTerm(pNode); SyncGroupId vgId = pNode->vgId; - int32_t ret = -1; + int32_t code = 0; int64_t upperIndex = TMIN(commitIndex, pBuf->matchIndex); SSyncRaftEntry* pEntry = NULL; bool inBuf = false; @@ -614,7 +635,6 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm if (commitIndex <= pBuf->commitIndex) { sDebug("vgId:%d, stale commit index. current:%" PRId64 ", notified:%" PRId64 "", vgId, pBuf->commitIndex, commitIndex); - ret = 0; goto _out; } @@ -624,7 +644,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm // execute in fsm for (int64_t index = pBuf->commitIndex + 1; index <= upperIndex; index++) { // get a log entry - pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + code = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf, &pEntry); if (pEntry == NULL) { goto _out; } @@ -635,7 +655,7 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm pEntry->term, TMSG_INFO(pEntry->originalRpcType)); } - if (syncFsmExecute(pNode, pFsm, role, currentTerm, pEntry, 0, false) != 0) { + if ((code = syncFsmExecute(pNode, pFsm, role, currentTerm, pEntry, 0, false)) != 0) { sError("vgId:%d, failed to execute sync log entry. index:%" PRId64 ", term:%" PRId64 ", role:%d, current term:%" PRId64, vgId, pEntry->index, pEntry->term, role, currentTerm); @@ -646,39 +666,40 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm sTrace("vgId:%d, committed index:%" PRId64 ", term:%" PRId64 ", role:%d, current term:%" PRId64 "", pNode->vgId, pEntry->index, pEntry->term, role, currentTerm); - pNextEntry = syncLogBufferGetOneEntry(pBuf, pNode, index + 1, &nextInBuf); + code = syncLogBufferGetOneEntry(pBuf, pNode, index + 1, &nextInBuf, &pNextEntry); if (pNextEntry != NULL) { - if(pNextEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE){ - sInfo("vgId:%d, to change config at Commit. " - "current entry, index:%" PRId64 ", term:%" PRId64", " - "node, role:%d, current term:%" PRId64 ", restore:%d, " - "cond, next entry index:%" PRId64 ", msgType:%s", - vgId, - pEntry->index, pEntry->term, - role, currentTerm, pNode->restoreFinish, - pNextEntry->index, TMSG_INFO(pNextEntry->originalRpcType)); + if (pNextEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE) { + sInfo( + "vgId:%d, to change config at Commit. " + "current entry, index:%" PRId64 ", term:%" PRId64 + ", " + "node, role:%d, current term:%" PRId64 + ", restore:%d, " + "cond, next entry index:%" PRId64 ", msgType:%s", + vgId, pEntry->index, pEntry->term, role, currentTerm, pNode->restoreFinish, pNextEntry->index, + TMSG_INFO(pNextEntry->originalRpcType)); - if(syncNodeChangeConfig(pNode, pNextEntry, "Commit") != 0){ + if ((code = syncNodeChangeConfig(pNode, pNextEntry, "Commit")) != 0) { sError("vgId:%d, failed to change config from Commit. index:%" PRId64 ", term:%" PRId64 - ", role:%d, current term:%" PRId64, - vgId, pNextEntry->index, pNextEntry->term, role, currentTerm); - goto _out; + ", role:%d, current term:%" PRId64, + vgId, pNextEntry->index, pNextEntry->term, role, currentTerm); + goto _out; } - //for 2->1, need to apply config change entry in sync thread, - if(pNode->replicaNum == 1){ - if (syncFsmExecute(pNode, pFsm, role, currentTerm, pNextEntry, 0, true) != 0) { + // for 2->1, need to apply config change entry in sync thread, + if (pNode->replicaNum == 1) { + if ((code = syncFsmExecute(pNode, pFsm, role, currentTerm, pNextEntry, 0, true)) != 0) { sError("vgId:%d, failed to execute sync log entry. index:%" PRId64 ", term:%" PRId64 - ", role:%d, current term:%" PRId64, - vgId, pNextEntry->index, pNextEntry->term, role, currentTerm); + ", role:%d, current term:%" PRId64, + vgId, pNextEntry->index, pNextEntry->term, role, currentTerm); goto _out; } index++; pBuf->commitIndex = index; - sTrace("vgId:%d, committed index:%" PRId64 ", term:%" PRId64 ", role:%d, current term:%" PRId64 "", pNode->vgId, - pNextEntry->index, pNextEntry->term, role, currentTerm); + sTrace("vgId:%d, committed index:%" PRId64 ", term:%" PRId64 ", role:%d, current term:%" PRId64 "", + pNode->vgId, pNextEntry->index, pNextEntry->term, role, currentTerm); } } if (!nextInBuf) { @@ -699,11 +720,11 @@ int32_t syncLogBufferCommit(SSyncLogBuffer* pBuf, SSyncNode* pNode, int64_t comm SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; ASSERT(pEntry != NULL); syncEntryDestroy(pEntry); - memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + (void)memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); pBuf->startIndex = index + 1; } - ret = 0; + code = 0; _out: // mark as restored if needed if (!pNode->restoreFinish && pBuf->commitIndex >= pNode->commitIndex && pEntry != NULL && @@ -722,9 +743,9 @@ _out: syncEntryDestroy(pNextEntry); pNextEntry = NULL; } - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); - return ret; + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); + TAOS_RETURN(code); } void syncLogReplReset(SSyncLogReplMgr* pMgr) { @@ -732,7 +753,7 @@ void syncLogReplReset(SSyncLogReplMgr* pMgr) { ASSERT(pMgr->startIndex >= 0); for (SyncIndex index = pMgr->startIndex; index < pMgr->endIndex; index++) { - memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); + (void)memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); } pMgr->startIndex = 0; pMgr->matchIndex = 0; @@ -751,10 +772,10 @@ int32_t syncLogReplRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { syncLogReplReset(pMgr); sWarn("vgId:%d, reset sync log repl since retry backoff exceeding limit. peer:%" PRIx64, pNode->vgId, pDestId->addr); - return -1; + return TSDB_CODE_OUT_OF_RANGE; } - int32_t ret = -1; + int32_t code = 0; bool retried = false; int64_t retryWaitMs = syncLogReplGetRetryBackoffTimeMs(pMgr); int64_t nowMs = taosGetMonoTimestampMs(); @@ -776,15 +797,16 @@ int32_t syncLogReplRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { syncLogReplReset(pMgr); sWarn("vgId:%d, reset sync log repl since stagnation. index:%" PRId64 ", peer:%" PRIx64, pNode->vgId, index, pDestId->addr); + code = TSDB_CODE_ACTION_IN_PROGRESS; goto _out; } continue; } bool barrier = false; - if (syncLogReplSendTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { + if ((code = syncLogReplSendTo(pMgr, pNode, index, &term, pDestId, &barrier)) < 0) { sError("vgId:%d, failed to replicate sync log entry since %s. index:%" PRId64 ", dest:%" PRIx64 "", pNode->vgId, - terrstr(), index, pDestId->addr); + tstrerror(code), index, pDestId->addr); goto _out; } ASSERT(barrier == pMgr->states[pos].barrier); @@ -800,7 +822,6 @@ int32_t syncLogReplRetryOnNeed(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { } } - ret = 0; _out: if (retried) { pMgr->retryBackoff = syncLogReplGetNextRetryBackoff(pMgr); @@ -811,12 +832,13 @@ _out: pNode->vgId, count, pDestId->addr, firstIndex, term, retryWaitMs, pMgr->startIndex, pMgr->matchIndex, pMgr->endIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); } - return ret; + TAOS_RETURN(code); } int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { SSyncLogBuffer* pBuf = pNode->pLogBuf; SRaftId destId = pMsg->srcId; + int32_t code = 0; ASSERT(pMgr->restored == false); if (pMgr->endIndex == 0) { @@ -832,7 +854,7 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn } } else { if (pMsg->lastSendIndex < pMgr->startIndex || pMsg->lastSendIndex >= pMgr->endIndex) { - syncLogReplRetryOnNeed(pMgr, pNode); + (void)syncLogReplRetryOnNeed(pMgr, pNode); return 0; } @@ -854,9 +876,9 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn sInfo("vgId:%d, snapshot replication to dnode:%d. reason:%s, match index:%" PRId64 ", last sent:%" PRId64, pNode->vgId, DID(&destId), (pMsg->fsmState == SYNC_FSM_STATE_INCOMPLETE ? msg2 : msg1), pMsg->matchIndex, pMsg->lastSendIndex); - if (syncNodeStartSnapshot(pNode, &destId) < 0) { + if ((code = syncNodeStartSnapshot(pNode, &destId)) < 0) { sError("vgId:%d, failed to start snapshot for peer dnode:%d", pNode->vgId, DID(&destId)); - return -1; + TAOS_RETURN(code); } return 0; } @@ -869,10 +891,10 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn errno = 0; if (pMsg->matchIndex < pNode->pLogBuf->matchIndex) { - term = syncLogReplGetPrevLogTerm(pMgr, pNode, index + 1); + code = syncLogReplGetPrevLogTerm(pMgr, pNode, index + 1, &term); if (term < 0 && (errno == ENFILE || errno == EMFILE)) { - sError("vgId:%d, failed to get prev log term since %s. index:%" PRId64, pNode->vgId, terrstr(), index + 1); - return -1; + sError("vgId:%d, failed to get prev log term since %s. index:%" PRId64, pNode->vgId, tstrerror(code), index + 1); + TAOS_RETURN(code); } if (pMsg->matchIndex == -1) { @@ -888,9 +910,9 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn if ((index + 1 < firstVer) || (term < 0) || (term != pMsg->lastMatchTerm && (index + 1 == firstVer || index == firstVer))) { ASSERT(term >= 0 || terrno == TSDB_CODE_WAL_LOG_NOT_EXIST); - if (syncNodeStartSnapshot(pNode, &destId) < 0) { + if ((code = syncNodeStartSnapshot(pNode, &destId)) < 0) { sError("vgId:%d, failed to start snapshot for peer dnode:%d", pNode->vgId, DID(&destId)); - return -1; + TAOS_RETURN(code); } sInfo("vgId:%d, snapshot replication to peer dnode:%d", pNode->vgId, DID(&destId)); return 0; @@ -913,20 +935,20 @@ int32_t syncLogReplRecover(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEn int32_t syncLogReplProcessHeartbeatReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncHeartbeatReply* pMsg) { SSyncLogBuffer* pBuf = pNode->pLogBuf; - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); if (pMsg->startTime != 0 && pMsg->startTime != pMgr->peerStartTime) { sInfo("vgId:%d, reset sync log repl in heartbeat. peer:%" PRIx64 ", start time:%" PRId64 ", old:%" PRId64 "", pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime); syncLogReplReset(pMgr); pMgr->peerStartTime = pMsg->startTime; } - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); return 0; } int32_t syncLogReplProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendEntriesReply* pMsg) { SSyncLogBuffer* pBuf = pNode->pLogBuf; - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); if (pMsg->startTime != pMgr->peerStartTime) { sInfo("vgId:%d, reset sync log repl in appendlog reply. peer:%" PRIx64 ", start time:%" PRId64 ", old:%" PRId64, pNode->vgId, pMsg->srcId.addr, pMsg->startTime, pMgr->peerStartTime); @@ -939,7 +961,7 @@ int32_t syncLogReplProcessReply(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncApp } else { (void)syncLogReplRecover(pMgr, pNode, pMsg); } - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); return 0; } @@ -957,6 +979,7 @@ int32_t syncLogReplProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex inde ASSERT(pMgr->startIndex >= 0); int64_t retryMaxWaitMs = syncGetRetryMaxWaitMs(); int64_t nowMs = taosGetMonoTimestampMs(); + int32_t code = 0; if (pMgr->endIndex > pMgr->startIndex && nowMs < pMgr->states[pMgr->startIndex % pMgr->size].timeMs + retryMaxWaitMs) { @@ -967,10 +990,10 @@ int32_t syncLogReplProbe(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex inde SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; bool barrier = false; SyncTerm term = -1; - if (syncLogReplSendTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { + if ((code = syncLogReplSendTo(pMgr, pNode, index, &term, pDestId, &barrier)) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index:%" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, pDestId->addr); - return -1; + tstrerror(code), index, pDestId->addr); + TAOS_RETURN(code); } ASSERT(index >= 0); @@ -995,6 +1018,7 @@ int32_t syncLogReplAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; int32_t batchSize = TMAX(1, pMgr->size >> (4 + pMgr->retryBackoff)); + int32_t code = 0; int32_t count = 0; int64_t nowMs = taosGetMonoTimestampMs(); int64_t limit = pMgr->size >> 1; @@ -1012,10 +1036,10 @@ int32_t syncLogReplAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { SRaftId* pDestId = &pNode->replicasId[pMgr->peerId]; bool barrier = false; SyncTerm term = -1; - if (syncLogReplSendTo(pMgr, pNode, index, &term, pDestId, &barrier) < 0) { + if ((code = syncLogReplSendTo(pMgr, pNode, index, &term, pDestId, &barrier)) < 0) { sError("vgId:%d, failed to replicate log entry since %s. index:%" PRId64 ", dest: 0x%016" PRIx64 "", pNode->vgId, - terrstr(), index, pDestId->addr); - return -1; + tstrerror(code), index, pDestId->addr); + TAOS_RETURN(code); } pMgr->states[pos].barrier = barrier; pMgr->states[pos].timeMs = nowMs; @@ -1034,7 +1058,7 @@ int32_t syncLogReplAttempt(SSyncLogReplMgr* pMgr, SSyncNode* pNode) { } } - syncLogReplRetryOnNeed(pMgr, pNode); + (void)syncLogReplRetryOnNeed(pMgr, pNode); SSyncLogBuffer* pBuf = pNode->pLogBuf; sTrace("vgId:%d, replicated %d msgs to peer:%" PRIx64 ". indexes:%" PRId64 "..., terms: ...%" PRId64 @@ -1059,7 +1083,7 @@ int32_t syncLogReplContinue(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncAppendE pMgr->states[pMsg->lastSendIndex % pMgr->size].acked = true; pMgr->matchIndex = TMAX(pMgr->matchIndex, pMsg->matchIndex); for (SyncIndex index = pMgr->startIndex; index < pMgr->matchIndex; index++) { - memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); + (void)memset(&pMgr->states[index % pMgr->size], 0, sizeof(pMgr->states[0])); } pMgr->startIndex = pMgr->matchIndex; } @@ -1094,8 +1118,7 @@ int32_t syncNodeLogReplInit(SSyncNode* pNode) { ASSERT(pNode->logReplMgrs[i] == NULL); pNode->logReplMgrs[i] = syncLogReplCreate(); if (pNode->logReplMgrs[i] == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } pNode->logReplMgrs[i]->peerId = i; } @@ -1109,11 +1132,11 @@ void syncNodeLogReplDestroy(SSyncNode* pNode) { } } -SSyncLogBuffer* syncLogBufferCreate() { +int32_t syncLogBufferCreate(SSyncLogBuffer** ppBuf) { + int32_t code = 0; SSyncLogBuffer* pBuf = taosMemoryCalloc(1, sizeof(SSyncLogBuffer)); if (pBuf == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, NULL, _exit); } pBuf->size = sizeof(pBuf->entries) / sizeof(pBuf->entries[0]); @@ -1121,41 +1144,41 @@ SSyncLogBuffer* syncLogBufferCreate() { ASSERT(pBuf->size == TSDB_SYNC_LOG_BUFFER_SIZE); if (taosThreadMutexAttrInit(&pBuf->attr) < 0) { - sError("failed to init log buffer mutexattr due to %s", strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - goto _err; + code = TAOS_SYSTEM_ERROR(errno); + sError("failed to init log buffer mutexattr due to %s", tstrerror(code)); + goto _exit; } if (taosThreadMutexAttrSetType(&pBuf->attr, PTHREAD_MUTEX_RECURSIVE) < 0) { - sError("failed to set log buffer mutexattr type due to %s", strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - goto _err; + code = TAOS_SYSTEM_ERROR(errno); + sError("failed to set log buffer mutexattr type due to %s", tstrerror(code)); + goto _exit; } if (taosThreadMutexInit(&pBuf->mutex, &pBuf->attr) < 0) { - sError("failed to init log buffer mutex due to %s", strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); - goto _err; + code = TAOS_SYSTEM_ERROR(errno); + sError("failed to init log buffer mutex due to %s", tstrerror(code)); + goto _exit; } - - return pBuf; - -_err: - taosMemoryFree(pBuf); - return NULL; +_exit: + if (code != 0) { + taosMemoryFreeClear(pBuf); + } + *ppBuf = pBuf; + TAOS_RETURN(code); } void syncLogBufferClear(SSyncLogBuffer* pBuf) { - taosThreadMutexLock(&pBuf->mutex); + (void)taosThreadMutexLock(&pBuf->mutex); for (SyncIndex index = pBuf->startIndex; index < pBuf->endIndex; index++) { SSyncRaftEntry* pEntry = pBuf->entries[(index + pBuf->size) % pBuf->size].pItem; if (pEntry == NULL) continue; syncEntryDestroy(pEntry); pEntry = NULL; - memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); + (void)memset(&pBuf->entries[(index + pBuf->size) % pBuf->size], 0, sizeof(pBuf->entries[0])); } pBuf->startIndex = pBuf->commitIndex = pBuf->matchIndex = pBuf->endIndex = 0; - taosThreadMutexUnlock(&pBuf->mutex); + (void)taosThreadMutexUnlock(&pBuf->mutex); } void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { @@ -1170,14 +1193,15 @@ void syncLogBufferDestroy(SSyncLogBuffer* pBuf) { } int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex toIndex) { + int32_t code = 0; ASSERT(pBuf->commitIndex < toIndex && toIndex <= pBuf->endIndex); if (toIndex == pBuf->endIndex) { return 0; } - sInfo("vgId:%d, rollback sync log buffer. toindex:%" PRId64 ", buffer: [%" PRId64 " %" PRId64 " %" PRId64 - ", %" PRId64 ")", + sInfo("vgId:%d, rollback sync log buffer. toindex:%" PRId64 ", buffer: [%" PRId64 " %" PRId64 " %" PRId64 ", %" PRId64 + ")", pNode->vgId, toIndex, pBuf->startIndex, pBuf->commitIndex, pBuf->matchIndex, pBuf->endIndex); // trunc buffer @@ -1187,7 +1211,7 @@ int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex if (pEntry != NULL) { (void)syncEntryDestroy(pEntry); pEntry = NULL; - memset(&pBuf->entries[index % pBuf->size], 0, sizeof(pBuf->entries[0])); + (void)memset(&pBuf->entries[index % pBuf->size], 0, sizeof(pBuf->entries[0])); } index--; } @@ -1197,30 +1221,30 @@ int32_t syncLogBufferRollback(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex // trunc wal SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); - if (lastVer >= toIndex && pNode->pLogStore->syncLogTruncate(pNode->pLogStore, toIndex) < 0) { - sError("vgId:%d, failed to truncate log store since %s. from index:%" PRId64 "", pNode->vgId, terrstr(), toIndex); - return -1; + if (lastVer >= toIndex && (code = pNode->pLogStore->syncLogTruncate(pNode->pLogStore, toIndex)) < 0) { + sError("vgId:%d, failed to truncate log store since %s. from index:%" PRId64 "", pNode->vgId, tstrerror(code), + toIndex); + TAOS_RETURN(code); } lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); ASSERT(toIndex == lastVer + 1); // refill buffer on need if (toIndex <= pBuf->startIndex) { - int32_t ret = syncLogBufferInitWithoutLock(pBuf, pNode); - if (ret < 0) { - sError("vgId:%d, failed to refill sync log buffer since %s", pNode->vgId, terrstr()); - return -1; + if ((code = syncLogBufferInitWithoutLock(pBuf, pNode)) < 0) { + sError("vgId:%d, failed to refill sync log buffer since %s", pNode->vgId, tstrerror(code)); + TAOS_RETURN(code); } } ASSERT(pBuf->endIndex == toIndex); - syncLogBufferValidate(pBuf); + (void)syncLogBufferValidate(pBuf); return 0; } int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { - taosThreadMutexLock(&pBuf->mutex); - syncLogBufferValidate(pBuf); + (void)taosThreadMutexLock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); SyncIndex lastVer = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore); ASSERT(lastVer == pBuf->matchIndex); SyncIndex index = pBuf->endIndex - 1; @@ -1237,26 +1261,32 @@ int32_t syncLogBufferReset(SSyncLogBuffer* pBuf, SSyncNode* pNode) { SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; syncLogReplReset(pMgr); } - syncLogBufferValidate(pBuf); - taosThreadMutexUnlock(&pBuf->mutex); + (void)syncLogBufferValidate(pBuf); + (void)taosThreadMutexUnlock(&pBuf->mutex); return 0; } -SSyncRaftEntry* syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf) { - SSyncRaftEntry* pEntry = NULL; +int32_t syncLogBufferGetOneEntry(SSyncLogBuffer* pBuf, SSyncNode* pNode, SyncIndex index, bool* pInBuf, + SSyncRaftEntry** ppEntry) { + int32_t code = 0; + + *ppEntry = NULL; + if (index >= pBuf->endIndex) { - return NULL; + return TSDB_CODE_OUT_OF_RANGE; } + if (index > pBuf->startIndex) { // startIndex might be dummy *pInBuf = true; - pEntry = pBuf->entries[index % pBuf->size].pItem; + *ppEntry = pBuf->entries[index % pBuf->size].pItem; } else { *pInBuf = false; - if (pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, index, &pEntry) < 0) { - sWarn("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + + if ((code = pNode->pLogStore->syncLogGetEntry(pNode->pLogStore, index, ppEntry)) < 0) { + sWarn("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", pNode->vgId, tstrerror(code), index); } } - return pEntry; + TAOS_RETURN(code); } int32_t syncLogReplSendTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex index, SyncTerm* pTerm, SRaftId* pDestId, @@ -1266,15 +1296,16 @@ int32_t syncLogReplSendTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex ind bool inBuf = false; SyncTerm prevLogTerm = -1; SSyncLogBuffer* pBuf = pNode->pLogBuf; + int32_t code = 0; - pEntry = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf); + code = syncLogBufferGetOneEntry(pBuf, pNode, index, &inBuf, &pEntry); if (pEntry == NULL) { sWarn("vgId:%d, failed to get raft entry for index:%" PRId64 "", pNode->vgId, index); - if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) { + if (code == TSDB_CODE_WAL_LOG_NOT_EXIST) { SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId); if (pMgr) { sInfo("vgId:%d, reset sync log repl of peer:%" PRIx64 " since %s. index:%" PRId64, pNode->vgId, pDestId->addr, - terrstr(), index); + tstrerror(code), index); (void)syncLogReplReset(pMgr); } } @@ -1282,14 +1313,14 @@ int32_t syncLogReplSendTo(SSyncLogReplMgr* pMgr, SSyncNode* pNode, SyncIndex ind } *pBarrier = syncLogReplBarrier(pEntry); - prevLogTerm = syncLogReplGetPrevLogTerm(pMgr, pNode, index); + code = syncLogReplGetPrevLogTerm(pMgr, pNode, index, &prevLogTerm); if (prevLogTerm < 0) { - sError("vgId:%d, failed to get prev log term since %s. index:%" PRId64 "", pNode->vgId, terrstr(), index); + sError("vgId:%d, failed to get prev log term since %s. index:%" PRId64 "", pNode->vgId, tstrerror(code), index); goto _err; } if (pTerm) *pTerm = pEntry->term; - int32_t code = syncBuildAppendEntriesFromRaftEntry(pNode, pEntry, prevLogTerm, &msgOut); + code = syncBuildAppendEntriesFromRaftEntry(pNode, pEntry, prevLogTerm, &msgOut); if (code < 0) { sError("vgId:%d, failed to get append entries for index:%" PRId64 "", pNode->vgId, index); goto _err; @@ -1313,5 +1344,5 @@ _err: syncEntryDestroy(pEntry); pEntry = NULL; } - return -1; + TAOS_RETURN(code); } diff --git a/source/libs/sync/src/syncRaftCfg.c b/source/libs/sync/src/syncRaftCfg.c index 0e98fe94eb..b0e6abffc6 100644 --- a/source/libs/sync/src/syncRaftCfg.c +++ b/source/libs/sync/src/syncRaftCfg.c @@ -18,7 +18,7 @@ #include "syncUtil.h" #include "tjson.h" -const char* syncRoleToStr(ESyncRole role) { +const char *syncRoleToStr(ESyncRole role) { switch (role) { case TAOS_SYNC_ROLE_VOTER: return "true"; @@ -29,11 +29,11 @@ const char* syncRoleToStr(ESyncRole role) { } } -const ESyncRole syncStrToRole(char* str) { - if(strcmp(str, "true") == 0){ +const ESyncRole syncStrToRole(char *str) { + if (strcmp(str, "true") == 0) { return TAOS_SYNC_ROLE_VOTER; } - if(strcmp(str, "false") == 0){ + if (strcmp(str, "false") == 0) { return TAOS_SYNC_ROLE_LEARNER; } @@ -42,92 +42,130 @@ const ESyncRole syncStrToRole(char* str) { static int32_t syncEncodeSyncCfg(const void *pObj, SJson *pJson) { SSyncCfg *pCfg = (SSyncCfg *)pObj; - if (tjsonAddDoubleToObject(pJson, "replicaNum", pCfg->replicaNum) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "myIndex", pCfg->myIndex) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "changeVersion", pCfg->changeVersion) < 0) return -1; + int32_t code = 0, lino = 0; + + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "replicaNum", pCfg->replicaNum)); + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "myIndex", pCfg->myIndex)); + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "changeVersion", pCfg->changeVersion)); SJson *nodeInfo = tjsonCreateArray(); - if (nodeInfo == NULL) return -1; - if (tjsonAddItemToObject(pJson, "nodeInfo", nodeInfo) < 0) return -1; + if (nodeInfo == NULL) { + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); + } + if ((code = tjsonAddItemToObject(pJson, "nodeInfo", nodeInfo)) < 0) { + tjsonDelete(nodeInfo); + TAOS_CHECK_EXIT(code); + } for (int32_t i = 0; i < pCfg->totalReplicaNum; ++i) { SJson *info = tjsonCreateObject(); - if (info == NULL) return -1; - if (tjsonAddDoubleToObject(info, "nodePort", pCfg->nodeInfo[i].nodePort) < 0) return -1; - if (tjsonAddStringToObject(info, "nodeFqdn", pCfg->nodeInfo[i].nodeFqdn) < 0) return -1; - if (tjsonAddIntegerToObject(info, "nodeId", pCfg->nodeInfo[i].nodeId) < 0) return -1; - if (tjsonAddIntegerToObject(info, "clusterId", pCfg->nodeInfo[i].clusterId) < 0) return -1; - if (tjsonAddStringToObject(info, "isReplica", syncRoleToStr(pCfg->nodeInfo[i].nodeRole)) < 0) return -1; - if (tjsonAddItemToArray(nodeInfo, info) < 0) return -1; + if (info == NULL) { + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); + } + TAOS_CHECK_GOTO(tjsonAddDoubleToObject(info, "nodePort", pCfg->nodeInfo[i].nodePort), NULL, _err); + TAOS_CHECK_GOTO(tjsonAddStringToObject(info, "nodeFqdn", pCfg->nodeInfo[i].nodeFqdn), NULL, _err); + TAOS_CHECK_GOTO(tjsonAddIntegerToObject(info, "nodeId", pCfg->nodeInfo[i].nodeId), NULL, _err); + TAOS_CHECK_GOTO(tjsonAddIntegerToObject(info, "clusterId", pCfg->nodeInfo[i].clusterId), NULL, _err); + TAOS_CHECK_GOTO(tjsonAddStringToObject(info, "isReplica", syncRoleToStr(pCfg->nodeInfo[i].nodeRole)), NULL, _err); + TAOS_CHECK_GOTO(tjsonAddItemToArray(nodeInfo, info), NULL, _err); + continue; + _err: + tjsonDelete(info); + break; } - - return 0; +_exit: + if (code < 0) { + sError("failed to encode sync cfg at line %d since %s", lino, tstrerror(code)); + } + TAOS_RETURN(code); } static int32_t syncEncodeRaftCfg(const void *pObj, SJson *pJson) { SRaftCfg *pCfg = (SRaftCfg *)pObj; - if (tjsonAddObject(pJson, "SSyncCfg", syncEncodeSyncCfg, (void *)&pCfg->cfg) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "isStandBy", pCfg->isStandBy) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "snapshotStrategy", pCfg->snapshotStrategy) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "batchSize", pCfg->batchSize) < 0) return -1; - if (tjsonAddIntegerToObject(pJson, "lastConfigIndex", pCfg->lastConfigIndex) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "configIndexCount", pCfg->configIndexCount) < 0) return -1; + int32_t code = 0, lino = 0; + TAOS_CHECK_EXIT(tjsonAddObject(pJson, "SSyncCfg", syncEncodeSyncCfg, (void *)&pCfg->cfg)); + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "isStandBy", pCfg->isStandBy)); + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "snapshotStrategy", pCfg->snapshotStrategy)); + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "batchSize", pCfg->batchSize)); + TAOS_CHECK_EXIT(tjsonAddIntegerToObject(pJson, "lastConfigIndex", pCfg->lastConfigIndex)); + TAOS_CHECK_EXIT(tjsonAddDoubleToObject(pJson, "configIndexCount", pCfg->configIndexCount)); SJson *configIndexArr = tjsonCreateArray(); - if (configIndexArr == NULL) return -1; - if (tjsonAddItemToObject(pJson, "configIndexArr", configIndexArr) < 0) return -1; + if (configIndexArr == NULL) { + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); + } + if ((code = tjsonAddItemToObject(pJson, "configIndexArr", configIndexArr)) < 0) { + tjsonDelete(configIndexArr); + TAOS_CHECK_EXIT(code); + } for (int32_t i = 0; i < pCfg->configIndexCount; ++i) { SJson *configIndex = tjsonCreateObject(); - if (configIndex == NULL) return -1; - if (tjsonAddIntegerToObject(configIndex, "index", pCfg->configIndexArr[i]) < 0) return -1; - if (tjsonAddItemToArray(configIndexArr, configIndex) < 0) return -1; + if (configIndex == NULL) { + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); + } + TAOS_CHECK_EXIT(tjsonAddIntegerToObject(configIndex, "index", pCfg->configIndexArr[i])); + TAOS_CHECK_EXIT(tjsonAddItemToArray(configIndexArr, configIndex)); + continue; + _err: + tjsonDelete(configIndex); + break; } - - return 0; +_exit: + if (code < 0) { + sError("failed to encode raft cfg at line %d since %s", lino, tstrerror(code)); + } + TAOS_RETURN(code); } int32_t syncWriteCfgFile(SSyncNode *pNode) { - int32_t code = -1; + int32_t code = 0, lino = 0; char *buffer = NULL; SJson *pJson = NULL; TdFilePtr pFile = NULL; const char *realfile = pNode->configPath; SRaftCfg *pCfg = &pNode->raftCfg; char file[PATH_MAX] = {0}; - snprintf(file, sizeof(file), "%s.bak", realfile); + (void)snprintf(file, sizeof(file), "%s.bak", realfile); - terrno = TSDB_CODE_OUT_OF_MEMORY; - pJson = tjsonCreateObject(); - if (pJson == NULL) goto _OVER; - if (tjsonAddObject(pJson, "RaftCfg", syncEncodeRaftCfg, pCfg) < 0) goto _OVER; + if ((pJson = tjsonCreateObject()) == NULL) { + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); + } + TAOS_CHECK_EXIT(tjsonAddObject(pJson, "RaftCfg", syncEncodeRaftCfg, pCfg)); buffer = tjsonToString(pJson); - if (buffer == NULL) goto _OVER; - terrno = 0; + if (buffer == NULL) { + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); + } pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH); - if (pFile == NULL) goto _OVER; + if (pFile == NULL) { + code = terrno ? terrno : TAOS_SYSTEM_ERROR(errno); + TAOS_CHECK_EXIT(code); + } int32_t len = strlen(buffer); - if (taosWriteFile(pFile, buffer, len) <= 0) goto _OVER; - if (taosFsyncFile(pFile) < 0) goto _OVER; + if (taosWriteFile(pFile, buffer, len) <= 0) { + TAOS_CHECK_EXIT(TAOS_SYSTEM_ERROR(errno)); + } + if (taosFsyncFile(pFile) < 0) { + TAOS_CHECK_EXIT(TAOS_SYSTEM_ERROR(errno)); + } - taosCloseFile(&pFile); - if (taosRenameFile(file, realfile) != 0) goto _OVER; + (void)taosCloseFile(&pFile); + if (taosRenameFile(file, realfile) != 0) { + TAOS_CHECK_EXIT(TAOS_SYSTEM_ERROR(errno)); + } - code = 0; - sInfo("vgId:%d, succeed to write sync cfg file:%s, len:%d, lastConfigIndex:%" PRId64 ", " - "changeVersion:%d", pNode->vgId, - realfile, len, pNode->raftCfg.lastConfigIndex, pNode->raftCfg.cfg.changeVersion); + sInfo("vgId:%d, succeed to write sync cfg file:%s, len:%d, lastConfigIndex:%" PRId64 ", changeVersion:%d", + pNode->vgId, realfile, len, pNode->raftCfg.lastConfigIndex, pNode->raftCfg.cfg.changeVersion); -_OVER: +_exit: if (pJson != NULL) tjsonDelete(pJson); if (buffer != NULL) taosMemoryFree(buffer); if (pFile != NULL) taosCloseFile(&pFile); if (code != 0) { - if (terrno == 0) terrno = TAOS_SYSTEM_ERROR(errno); - sError("vgId:%d, failed to write sync cfg file:%s since %s", pNode->vgId, realfile, terrstr()); + sError("vgId:%d, failed to write sync cfg file:%s since %s", pNode->vgId, realfile, tstrerror(code)); } - return code; + TAOS_RETURN(code); } static int32_t syncDecodeSyncCfg(const SJson *pJson, void *pObj) { @@ -135,32 +173,31 @@ static int32_t syncDecodeSyncCfg(const SJson *pJson, void *pObj) { int32_t code = 0; tjsonGetInt32ValueFromDouble(pJson, "replicaNum", pCfg->replicaNum, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetInt32ValueFromDouble(pJson, "myIndex", pCfg->myIndex, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetInt32ValueFromDouble(pJson, "changeVersion", pCfg->changeVersion, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; SJson *nodeInfo = tjsonGetObjectItem(pJson, "nodeInfo"); - if (nodeInfo == NULL) return -1; + if (nodeInfo == NULL) return TSDB_CODE_INVALID_JSON_FORMAT; pCfg->totalReplicaNum = tjsonGetArraySize(nodeInfo); for (int32_t i = 0; i < pCfg->totalReplicaNum; ++i) { SJson *info = tjsonGetArrayItem(nodeInfo, i); - if (info == NULL) return -1; + if (info == NULL) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetUInt16ValueFromDouble(info, "nodePort", pCfg->nodeInfo[i].nodePort, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; code = tjsonGetStringValue(info, "nodeFqdn", pCfg->nodeInfo[i].nodeFqdn); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetNumberValue(info, "nodeId", pCfg->nodeInfo[i].nodeId, code); tjsonGetNumberValue(info, "clusterId", pCfg->nodeInfo[i].clusterId, code); char role[10] = {0}; code = tjsonGetStringValue(info, "isReplica", role); - if(code < 0) return -1; - if(strlen(role) != 0){ + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; + if (strlen(role) != 0) { pCfg->nodeInfo[i].nodeRole = syncStrToRole(role); - } - else{ + } else { pCfg->nodeInfo[i].nodeRole = TAOS_SYNC_ROLE_VOTER; } } @@ -172,34 +209,34 @@ static int32_t syncDecodeRaftCfg(const SJson *pJson, void *pObj) { SRaftCfg *pCfg = (SRaftCfg *)pObj; int32_t code = 0; - if (tjsonToObject(pJson, "SSyncCfg", syncDecodeSyncCfg, (void *)&pCfg->cfg) < 0) return -1; + TAOS_CHECK_RETURN(tjsonToObject(pJson, "SSyncCfg", syncDecodeSyncCfg, (void *)&pCfg->cfg)); tjsonGetInt8ValueFromDouble(pJson, "isStandBy", pCfg->isStandBy, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetInt8ValueFromDouble(pJson, "snapshotStrategy", pCfg->snapshotStrategy, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetInt32ValueFromDouble(pJson, "batchSize", pCfg->batchSize, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetNumberValue(pJson, "lastConfigIndex", pCfg->lastConfigIndex, code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetInt32ValueFromDouble(pJson, "configIndexCount", pCfg->configIndexCount, code); + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; SJson *configIndexArr = tjsonGetObjectItem(pJson, "configIndexArr"); - if (configIndexArr == NULL) return -1; + if (configIndexArr == NULL) return TSDB_CODE_INVALID_JSON_FORMAT; pCfg->configIndexCount = tjsonGetArraySize(configIndexArr); for (int32_t i = 0; i < pCfg->configIndexCount; ++i) { SJson *configIndex = tjsonGetArrayItem(configIndexArr, i); - if (configIndex == NULL) return -1; + if (configIndex == NULL) return TSDB_CODE_INVALID_JSON_FORMAT; tjsonGetNumberValue(configIndex, "index", pCfg->configIndexArr[i], code); - if (code < 0) return -1; + if (code < 0) return TSDB_CODE_INVALID_JSON_FORMAT; } - return 0; } int32_t syncReadCfgFile(SSyncNode *pNode) { - int32_t code = -1; + int32_t code = 0; TdFilePtr pFile = NULL; char *pData = NULL; SJson *pJson = NULL; @@ -208,27 +245,27 @@ int32_t syncReadCfgFile(SSyncNode *pNode) { pFile = taosOpenFile(file, TD_FILE_READ); if (pFile == NULL) { - terrno = TAOS_SYSTEM_ERROR(errno); - sError("vgId:%d, failed to open sync cfg file:%s since %s", pNode->vgId, file, terrstr()); + code = TAOS_SYSTEM_ERROR(errno); + sError("vgId:%d, failed to open sync cfg file:%s since %s", pNode->vgId, file, tstrerror(code)); goto _OVER; } int64_t size = 0; if (taosFStatFile(pFile, &size, NULL) < 0) { - terrno = TAOS_SYSTEM_ERROR(errno); - sError("vgId:%d, failed to fstat sync cfg file:%s since %s", pNode->vgId, file, terrstr()); + code = TAOS_SYSTEM_ERROR(errno); + sError("vgId:%d, failed to fstat sync cfg file:%s since %s", pNode->vgId, file, tstrerror(code)); goto _OVER; } pData = taosMemoryMalloc(size + 1); if (pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; + code = TSDB_CODE_OUT_OF_MEMORY; goto _OVER; } if (taosReadFile(pFile, pData, size) != size) { - terrno = TAOS_SYSTEM_ERROR(errno); - sError("vgId:%d, failed to read sync cfg file:%s since %s", pNode->vgId, file, terrstr()); + code = TAOS_SYSTEM_ERROR(errno); + sError("vgId:%d, failed to read sync cfg file:%s since %s", pNode->vgId, file, tstrerror(code)); goto _OVER; } @@ -236,18 +273,16 @@ int32_t syncReadCfgFile(SSyncNode *pNode) { pJson = tjsonParse(pData); if (pJson == NULL) { - terrno = TSDB_CODE_INVALID_JSON_FORMAT; + code = TSDB_CODE_INVALID_JSON_FORMAT; goto _OVER; } if (tjsonToObject(pJson, "RaftCfg", syncDecodeRaftCfg, (void *)pCfg) < 0) { - terrno = TSDB_CODE_INVALID_JSON_FORMAT; + code = TSDB_CODE_INVALID_JSON_FORMAT; goto _OVER; } - code = 0; - sInfo("vgId:%d, succceed to read sync cfg file %s, changeVersion:%d", - pNode->vgId, file, pCfg->cfg.changeVersion); + sInfo("vgId:%d, succceed to read sync cfg file %s, changeVersion:%d", pNode->vgId, file, pCfg->cfg.changeVersion); _OVER: if (pData != NULL) taosMemoryFree(pData); @@ -255,15 +290,15 @@ _OVER: if (pFile != NULL) taosCloseFile(&pFile); if (code != 0) { - sError("vgId:%d, failed to read sync cfg file:%s since %s", pNode->vgId, file, terrstr()); + sError("vgId:%d, failed to read sync cfg file:%s since %s", pNode->vgId, file, tstrerror(code)); } - return code; + TAOS_RETURN(code); } int32_t syncAddCfgIndex(SSyncNode *pNode, SyncIndex cfgIndex) { SRaftCfg *pCfg = &pNode->raftCfg; - if (pCfg->configIndexCount < MAX_CONFIG_INDEX_COUNT) { - return -1; + if (pCfg->configIndexCount >= MAX_CONFIG_INDEX_COUNT) { + return TSDB_CODE_OUT_OF_RANGE; } pCfg->configIndexArr[pCfg->configIndexCount] = cfgIndex; diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c index 8f42780eb9..fd6781f354 100644 --- a/source/libs/sync/src/syncRaftEntry.c +++ b/source/libs/sync/src/syncRaftEntry.c @@ -99,9 +99,14 @@ void syncEntryDestroy(SSyncRaftEntry* pEntry) { } } -void syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg) { +int32_t syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg) { pRpcMsg->msgType = pEntry->originalRpcType; pRpcMsg->contLen = (int32_t)(pEntry->dataLen); pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen); + if (pRpcMsg->pCont == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } memcpy(pRpcMsg->pCont, pEntry->data, pRpcMsg->contLen); + + return 0; } diff --git a/source/libs/sync/src/syncRespMgr.c b/source/libs/sync/src/syncRespMgr.c index 3506d477d3..4663a1f6e9 100644 --- a/source/libs/sync/src/syncRespMgr.c +++ b/source/libs/sync/src/syncRespMgr.c @@ -19,25 +19,33 @@ #include "syncRaftStore.h" #include "syncUtil.h" -SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl) { - SSyncRespMgr *pObj = taosMemoryCalloc(1, sizeof(SSyncRespMgr)); - if (pObj == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; +int32_t syncRespMgrCreate(void *data, int64_t ttl, SSyncRespMgr **ppObj) { + SSyncRespMgr *pObj = NULL; + + *ppObj = NULL; + + if ((pObj = taosMemoryCalloc(1, sizeof(SSyncRespMgr))) == NULL) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } pObj->pRespHash = taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); - if (pObj->pRespHash == NULL) return NULL; + if (pObj->pRespHash == NULL) { + taosMemoryFree(pObj); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } pObj->ttl = ttl; pObj->data = data; pObj->seqNum = 0; - taosThreadMutexInit(&(pObj->mutex), NULL); + (void)taosThreadMutexInit(&(pObj->mutex), NULL); SSyncNode *pNode = pObj->data; sDebug("vgId:%d, resp manager create", pNode->vgId); - return pObj; + + *ppObj = pObj; + + TAOS_RETURN(0); } void syncRespMgrDestroy(SSyncRespMgr *pObj) { @@ -46,82 +54,84 @@ void syncRespMgrDestroy(SSyncRespMgr *pObj) { SSyncNode *pNode = pObj->data; sDebug("vgId:%d, resp manager destroy", pNode->vgId); - taosThreadMutexLock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); taosHashCleanup(pObj->pRespHash); - taosThreadMutexUnlock(&pObj->mutex); - taosThreadMutexDestroy(&(pObj->mutex)); + (void)taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexDestroy(&(pObj->mutex)); taosMemoryFree(pObj); } uint64_t syncRespMgrAdd(SSyncRespMgr *pObj, const SRespStub *pStub) { - taosThreadMutexLock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); uint64_t seq = ++(pObj->seqNum); int32_t code = taosHashPut(pObj->pRespHash, &seq, sizeof(uint64_t), pStub, sizeof(SRespStub)); sNTrace(pObj->data, "save message handle:%p, type:%s seq:%" PRIu64 " code:0x%x", pStub->rpcMsg.info.handle, TMSG_INFO(pStub->rpcMsg.msgType), seq, code); - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return seq; } int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t seq) { - taosThreadMutexLock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); int32_t code = taosHashRemove(pObj->pRespHash, &seq, sizeof(seq)); sNTrace(pObj->data, "remove message handle, seq:%" PRIu64 " code:%d", seq, code); - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return code; } int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t seq, SRespStub *pStub) { - taosThreadMutexLock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); SRespStub *pTmp = taosHashGet(pObj->pRespHash, &seq, sizeof(uint64_t)); if (pTmp != NULL) { - memcpy(pStub, pTmp, sizeof(SRespStub)); + (void)memcpy(pStub, pTmp, sizeof(SRespStub)); sNTrace(pObj->data, "get message handle, type:%s seq:%" PRIu64 " handle:%p", TMSG_INFO(pStub->rpcMsg.msgType), seq, pStub->rpcMsg.info.handle); - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return 1; // get one object } else { sNError(pObj->data, "get message handle, no object of seq:%" PRIu64, seq); } - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return 0; // get none object } int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t seq, SRpcHandleInfo *pInfo) { - taosThreadMutexLock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); SRespStub *pStub = taosHashGet(pObj->pRespHash, &seq, sizeof(uint64_t)); if (pStub != NULL) { *pInfo = pStub->rpcMsg.info; sNTrace(pObj->data, "get-and-del message handle:%p, type:%s seq:%" PRIu64, pStub->rpcMsg.info.handle, TMSG_INFO(pStub->rpcMsg.msgType), seq); - taosHashRemove(pObj->pRespHash, &seq, sizeof(uint64_t)); + (void)taosHashRemove(pObj->pRespHash, &seq, sizeof(uint64_t)); - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return 1; // get one object } else { sNTrace(pObj->data, "get-and-del message handle, no object of seq:%" PRIu64, seq); } - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexUnlock(&pObj->mutex); return 0; // get none object } -static void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) { +static int32_t syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) { SRespStub *pStub = (SRespStub *)taosHashIterate(pObj->pRespHash, NULL); int cnt = 0; int sum = 0; SSyncNode *pNode = pObj->data; SArray *delIndexArray = taosArrayInit(4, sizeof(uint64_t)); - if (delIndexArray == NULL) return; + if (delIndexArray == NULL) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } sDebug("vgId:%d, resp manager begin clean by ttl", pNode->vgId); while (pStub) { @@ -153,7 +163,7 @@ static void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) { SRpcMsg rpcMsg = {.info = pStub->rpcMsg.info, .code = TSDB_CODE_SYN_TIMEOUT}; sInfo("vgId:%d, message handle:%p expired, type:%s ahandle:%p", pNode->vgId, rpcMsg.info.handle, TMSG_INFO(pStub->rpcMsg.msgType), rpcMsg.info.ahandle); - rpcSendResponse(&rpcMsg); + (void)rpcSendResponse(&rpcMsg); } pStub = taosHashIterate(pObj->pRespHash, pStub); @@ -164,10 +174,12 @@ static void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) { for (int32_t i = 0; i < arraySize; ++i) { uint64_t *pSeqNum = taosArrayGet(delIndexArray, i); - taosHashRemove(pObj->pRespHash, pSeqNum, sizeof(uint64_t)); + (void)taosHashRemove(pObj->pRespHash, pSeqNum, sizeof(uint64_t)); sDebug("vgId:%d, resp manager clean by ttl, seq:%" PRId64, pNode->vgId, *pSeqNum); } taosArrayDestroy(delIndexArray); + + return 0; } void syncRespCleanRsp(SSyncRespMgr *pObj) { @@ -176,16 +188,16 @@ void syncRespCleanRsp(SSyncRespMgr *pObj) { SSyncNode *pNode = pObj->data; sTrace("vgId:%d, clean all resp", pNode->vgId); - taosThreadMutexLock(&pObj->mutex); - syncRespCleanByTTL(pObj, -1, true); - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); + (void)syncRespCleanByTTL(pObj, -1, true); + (void)taosThreadMutexUnlock(&pObj->mutex); } void syncRespClean(SSyncRespMgr *pObj) { SSyncNode *pNode = pObj->data; sTrace("vgId:%d, clean resp by ttl", pNode->vgId); - taosThreadMutexLock(&pObj->mutex); - syncRespCleanByTTL(pObj, pObj->ttl, false); - taosThreadMutexUnlock(&pObj->mutex); + (void)taosThreadMutexLock(&pObj->mutex); + (void)syncRespCleanByTTL(pObj, pObj->ttl, false); + (void)taosThreadMutexUnlock(&pObj->mutex); } diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c index 8dab694975..450d22528d 100644 --- a/source/libs/sync/src/syncSnapshot.c +++ b/source/libs/sync/src/syncSnapshot.c @@ -44,33 +44,37 @@ static void syncSnapBufferDestroy(SSyncSnapBuffer **ppBuf) { syncSnapBufferReset(pBuf); - taosThreadMutexDestroy(&pBuf->mutex); + (void)taosThreadMutexDestroy(&pBuf->mutex); taosMemoryFree(ppBuf[0]); ppBuf[0] = NULL; return; } -static SSyncSnapBuffer *syncSnapBufferCreate() { +static int32_t syncSnapBufferCreate(SSyncSnapBuffer **ppBuf) { SSyncSnapBuffer *pBuf = taosMemoryCalloc(1, sizeof(SSyncSnapBuffer)); if (pBuf == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + *ppBuf = NULL; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } pBuf->size = sizeof(pBuf->entries) / sizeof(void *); ASSERT(pBuf->size == TSDB_SYNC_SNAP_BUFFER_SIZE); - taosThreadMutexInit(&pBuf->mutex, NULL); - return pBuf; + (void)taosThreadMutexInit(&pBuf->mutex, NULL); + *ppBuf = pBuf; + TAOS_RETURN(0); } -SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaIndex) { +int32_t snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaIndex, SSyncSnapshotSender **ppSender) { + int32_t code = 0; + *ppSender = NULL; bool condition = (pSyncNode->pFsm->FpSnapshotStartRead != NULL) && (pSyncNode->pFsm->FpSnapshotStopRead != NULL) && (pSyncNode->pFsm->FpSnapshotDoRead != NULL); - if (!condition) return NULL; + if (!condition) { + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); + } SSyncSnapshotSender *pSender = taosMemoryCalloc(1, sizeof(SSyncSnapshotSender)); if (pSender == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } pSender->start = false; @@ -85,17 +89,19 @@ SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaI pSender->pSyncNode->pFsm->FpGetSnapshotInfo(pSender->pSyncNode->pFsm, &pSender->snapshot); pSender->finish = false; - SSyncSnapBuffer *pSndBuf = syncSnapBufferCreate(); + SSyncSnapBuffer *pSndBuf = NULL; + code = syncSnapBufferCreate(&pSndBuf); if (pSndBuf == NULL) { taosMemoryFree(pSender); pSender = NULL; - return NULL; + TAOS_RETURN(code); } pSndBuf->entryDeleteCb = syncSnapBlockDestroy; pSender->pSndBuf = pSndBuf; syncSnapBufferReset(pSender->pSndBuf); - return pSender; + *ppSender = pSender; + TAOS_RETURN(code); } void syncSnapBlockDestroy(void *ptr) { @@ -135,7 +141,7 @@ void snapshotSenderDestroy(SSyncSnapshotSender *pSender) { syncSnapBufferDestroy(&pSender->pSndBuf); } - snapshotSenderClearInfoData(pSender); + (void)snapshotSenderClearInfoData(pSender); // free sender taosMemoryFree(pSender); @@ -144,7 +150,7 @@ void snapshotSenderDestroy(SSyncSnapshotSender *pSender) { bool snapshotSenderIsStart(SSyncSnapshotSender *pSender) { return atomic_load_8(&pSender->start); } int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) { - int32_t code = -1; + int32_t code = 0; int8_t started = atomic_val_compare_exchange_8(&pSender->start, false, true); if (started) return 0; @@ -160,7 +166,7 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) { pSender->snapshot.lastApplyTerm = SYNC_TERM_INVALID; pSender->snapshot.lastConfigIndex = SYNC_INDEX_INVALID; - memset(&pSender->lastConfig, 0, sizeof(pSender->lastConfig)); + (void)memset(&pSender->lastConfig, 0, sizeof(pSender->lastConfig)); pSender->sendingMS = 0; pSender->term = raftStoreGetTerm(pSender->pSyncNode); pSender->startTime = taosGetMonoTimestampMs(); @@ -170,8 +176,8 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) { // Get snapshot info SSyncNode *pSyncNode = pSender->pSyncNode; SSnapshot snapInfo = {.type = TDMT_SYNC_PREP_SNAPSHOT}; - if (pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapInfo) != 0) { - sSError(pSender, "snapshot get info failure since %s", terrstr()); + if ((code = pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapInfo)) != 0) { + sSError(pSender, "snapshot get info failure since %s", tstrerror(code)); goto _out; } @@ -182,25 +188,24 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) { SSyncTLV *datHead = pData; if (datHead->typ != TDMT_SYNC_PREP_SNAPSHOT) { sSError(pSender, "unexpected data typ in data of snapshot info. typ: %d", datHead->typ); - terrno = TSDB_CODE_INVALID_DATA_FMT; + code = TSDB_CODE_INVALID_DATA_FMT; goto _out; } dataLen = sizeof(SSyncTLV) + datHead->len; } - if (syncSnapSendMsg(pSender, pSender->seq, pData, dataLen, type) != 0) { + if ((code = syncSnapSendMsg(pSender, pSender->seq, pData, dataLen, type)) != 0) { goto _out; } SRaftId destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; sSInfo(pSender, "snapshot sender start, to dnode:%d.", DID(&destId)); - code = 0; _out: if (snapInfo.data) { taosMemoryFree(snapInfo.data); snapInfo.data = NULL; } - return code; + TAOS_RETURN(code); } void snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish) { @@ -209,7 +214,7 @@ void snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish) { // update flag int8_t stopped = !atomic_val_compare_exchange_8(&pSender->start, true, false); if (stopped) return; - taosThreadMutexLock(&pSender->pSndBuf->mutex); + (void)taosThreadMutexLock(&pSender->pSndBuf->mutex); { pSender->finish = finish; @@ -221,20 +226,20 @@ void snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish) { syncSnapBufferReset(pSender->pSndBuf); - snapshotSenderClearInfoData(pSender); + (void)snapshotSenderClearInfoData(pSender); SRaftId destId = pSender->pSyncNode->replicasId[pSender->replicaIndex]; sSInfo(pSender, "snapshot sender stop, to dnode:%d, finish:%d", DID(&destId), finish); } - taosThreadMutexUnlock(&pSender->pSndBuf->mutex); + (void)taosThreadMutexUnlock(&pSender->pSndBuf->mutex); } int32_t syncSnapSendMsg(SSyncSnapshotSender *pSender, int32_t seq, void *pBlock, int32_t blockLen, int32_t typ) { - int32_t code = -1; + int32_t code = 0; SRpcMsg rpcMsg = {0}; - if (syncBuildSnapshotSend(&rpcMsg, blockLen, pSender->pSyncNode->vgId) != 0) { - sSError(pSender, "failed to build snap replication msg since %s", terrstr()); + if ((code = syncBuildSnapshotSend(&rpcMsg, blockLen, pSender->pSyncNode->vgId)) != 0) { + sSError(pSender, "failed to build snap replication msg since %s", tstrerror(code)); goto _OUT; } @@ -251,25 +256,24 @@ int32_t syncSnapSendMsg(SSyncSnapshotSender *pSender, int32_t seq, void *pBlock, pMsg->seq = seq; if (pBlock != NULL && blockLen > 0) { - memcpy(pMsg->data, pBlock, blockLen); + (void)memcpy(pMsg->data, pBlock, blockLen); } pMsg->payloadType = typ; // send msg - if (syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg) != 0) { - sSError(pSender, "failed to send snap replication msg since %s. seq:%d", terrstr(), seq); + if ((code = syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg)) != 0) { + sSError(pSender, "failed to send snap replication msg since %s. seq:%d", tstrerror(code), seq); goto _OUT; } - code = 0; _OUT: - return code; + TAOS_RETURN(code); } // when sender receive ack, call this function to send msg from seq // seq = ack + 1, already updated static int32_t snapshotSend(SSyncSnapshotSender *pSender) { - int32_t code = -1; + int32_t code = 0; SyncSnapBlock *pBlk = NULL; if (pSender->seq < SYNC_SNAPSHOT_SEQ_END) { @@ -278,7 +282,7 @@ static int32_t snapshotSend(SSyncSnapshotSender *pSender) { if (pSender->seq > SYNC_SNAPSHOT_SEQ_BEGIN) { pBlk = taosMemoryCalloc(1, sizeof(SyncSnapBlock)); if (pBlk == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; + code = TSDB_CODE_OUT_OF_MEMORY; goto _OUT; } @@ -288,7 +292,6 @@ static int32_t snapshotSend(SSyncSnapshotSender *pSender) { code = pSender->pSyncNode->pFsm->FpSnapshotDoRead(pSender->pSyncNode->pFsm, pSender->pReader, &pBlk->pBlock, &pBlk->blockLen); if (code != 0) { - terrno = code; sSError(pSender, "snapshot sender read failed since %s", tstrerror(code)); goto _OUT; } @@ -300,7 +303,6 @@ static int32_t snapshotSend(SSyncSnapshotSender *pSender) { // read finish, update seq to end pSender->seq = SYNC_SNAPSHOT_SEQ_END; sSInfo(pSender, "snapshot sender read to the end"); - code = 0; goto _OUT; } } @@ -311,7 +313,7 @@ static int32_t snapshotSend(SSyncSnapshotSender *pSender) { // send msg int32_t blockLen = (pBlk) ? pBlk->blockLen : 0; void *pBlock = (pBlk) ? pBlk->pBlock : NULL; - if (syncSnapSendMsg(pSender, pSender->seq, pBlock, blockLen, 0) != 0) { + if ((code = syncSnapSendMsg(pSender, pSender->seq, pBlock, blockLen, 0)) != 0) { goto _OUT; } @@ -325,22 +327,22 @@ static int32_t snapshotSend(SSyncSnapshotSender *pSender) { pSender->pSndBuf->end = TMAX(pSender->seq + 1, pSender->pSndBuf->end); } pSender->lastSendTime = nowMs; - code = 0; _OUT:; if (pBlk != NULL) { syncSnapBlockDestroy(pBlk); pBlk = NULL; } - return code; + TAOS_RETURN(code); } // send snapshot data from cache int32_t snapshotReSend(SSyncSnapshotSender *pSender) { SSyncSnapBuffer *pSndBuf = pSender->pSndBuf; - int32_t code = -1; - taosThreadMutexLock(&pSndBuf->mutex); + int32_t code = 0; + (void)taosThreadMutexLock(&pSndBuf->mutex); if (pSender->pReader == NULL || pSender->finish || !snapshotSenderIsStart(pSender)) { + code = TSDB_CODE_SYN_INTERNAL_ERROR; goto _out; } @@ -351,7 +353,7 @@ int32_t snapshotReSend(SSyncSnapshotSender *pSender) { if (pBlk->acked || nowMs < pBlk->sendTimeMs + SYNC_SNAP_RESEND_MS) { continue; } - if (syncSnapSendMsg(pSender, pBlk->seq, pBlk->pBlock, pBlk->blockLen, 0) != 0) { + if ((code = syncSnapSendMsg(pSender, pBlk->seq, pBlk->pBlock, pBlk->blockLen, 0)) != 0) { goto _out; } pBlk->sendTimeMs = nowMs; @@ -364,21 +366,20 @@ int32_t snapshotReSend(SSyncSnapshotSender *pSender) { } if (pSender->seq == SYNC_SNAPSHOT_SEQ_END && pSndBuf->end <= pSndBuf->start) { - if (syncSnapSendMsg(pSender, pSender->seq, NULL, 0, 0) != 0) { + if ((code = syncSnapSendMsg(pSender, pSender->seq, NULL, 0, 0)) != 0) { goto _out; } } - code = 0; _out:; - taosThreadMutexUnlock(&pSndBuf->mutex); - return code; + (void)taosThreadMutexUnlock(&pSndBuf->mutex); + TAOS_RETURN(code); } int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId) { SSyncSnapshotSender *pSender = syncNodeGetSnapshotSender(pSyncNode, pDestId); if (pSender == NULL) { sNError(pSyncNode, "snapshot sender start error since get failed"); - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); } if (snapshotSenderIsStart(pSender)) { @@ -390,23 +391,26 @@ int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId) { int32_t code = snapshotSenderStart(pSender); if (code != 0) { - sSError(pSender, "snapshot sender start error since %s", terrstr()); - return -1; + sSError(pSender, "snapshot sender start error since %s", tstrerror(code)); + TAOS_RETURN(code); } return 0; } // receiver -SSyncSnapshotReceiver *snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId fromId) { +int32_t snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId fromId, SSyncSnapshotReceiver **ppReceiver) { + int32_t code = 0; + *ppReceiver = NULL; bool condition = (pSyncNode->pFsm->FpSnapshotStartWrite != NULL) && (pSyncNode->pFsm->FpSnapshotStopWrite != NULL) && (pSyncNode->pFsm->FpSnapshotDoWrite != NULL); - if (!condition) return NULL; + if (!condition) { + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); + } SSyncSnapshotReceiver *pReceiver = taosMemoryCalloc(1, sizeof(SSyncSnapshotReceiver)); if (pReceiver == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } pReceiver->start = false; @@ -421,17 +425,19 @@ SSyncSnapshotReceiver *snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId from pReceiver->snapshot.lastApplyTerm = 0; pReceiver->snapshot.lastConfigIndex = SYNC_INDEX_INVALID; - SSyncSnapBuffer *pRcvBuf = syncSnapBufferCreate(); + SSyncSnapBuffer *pRcvBuf = NULL; + code = syncSnapBufferCreate(&pRcvBuf); if (pRcvBuf == NULL) { taosMemoryFree(pReceiver); pReceiver = NULL; - return NULL; + TAOS_RETURN(code); } pRcvBuf->entryDeleteCb = rpcFreeCont; pReceiver->pRcvBuf = pRcvBuf; syncSnapBufferReset(pReceiver->pRcvBuf); - return pReceiver; + *ppReceiver = pReceiver; + TAOS_RETURN(code); } static int32_t snapshotReceiverClearInfoData(SSyncSnapshotReceiver *pReceiver) { @@ -452,10 +458,11 @@ void snapshotReceiverDestroy(SSyncSnapshotReceiver *pReceiver) { // close writer if (pReceiver->pWriter != NULL) { - int32_t ret = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, false, - &pReceiver->snapshot); - if (ret != 0) { - sError("vgId:%d, snapshot receiver stop failed while destroy since %s", pReceiver->pSyncNode->vgId, terrstr()); + int32_t code = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, + false, &pReceiver->snapshot); + if (code != 0) { + sError("vgId:%d, snapshot receiver stop failed while destroy since %s", pReceiver->pSyncNode->vgId, + tstrerror(code)); } pReceiver->pWriter = NULL; } @@ -486,8 +493,7 @@ static int32_t snapshotReceiverSignatureCmp(SSyncSnapshotReceiver *pReceiver, Sy static int32_t snapshotReceiverStartWriter(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg) { if (pReceiver->pWriter != NULL) { sRError(pReceiver, "vgId:%d, snapshot receiver writer is not null", pReceiver->pSyncNode->vgId); - terrno = TSDB_CODE_SYN_INTERNAL_ERROR; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); } // update ack @@ -501,11 +507,11 @@ static int32_t snapshotReceiverStartWriter(SSyncSnapshotReceiver *pReceiver, Syn pReceiver->snapshotParam.end = pBeginMsg->lastIndex; // start writer - int32_t ret = pReceiver->pSyncNode->pFsm->FpSnapshotStartWrite(pReceiver->pSyncNode->pFsm, &pReceiver->snapshotParam, - &pReceiver->pWriter); - if (ret != 0) { - sRError(pReceiver, "snapshot receiver start write failed since %s", terrstr()); - return -1; + int32_t code = pReceiver->pSyncNode->pFsm->FpSnapshotStartWrite(pReceiver->pSyncNode->pFsm, &pReceiver->snapshotParam, + &pReceiver->pWriter); + if (code != 0) { + sRError(pReceiver, "snapshot receiver start write failed since %s", tstrerror(code)); + TAOS_RETURN(code); } // event log @@ -538,13 +544,13 @@ void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver) { int8_t stopped = !atomic_val_compare_exchange_8(&pReceiver->start, true, false); if (stopped) return; - taosThreadMutexLock(&pReceiver->pRcvBuf->mutex); + (void)taosThreadMutexLock(&pReceiver->pRcvBuf->mutex); { if (pReceiver->pWriter != NULL) { - int32_t ret = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, - false, &pReceiver->snapshot); - if (ret != 0) { - sRError(pReceiver, "snapshot receiver stop write failed since %s", terrstr()); + int32_t code = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, + false, &pReceiver->snapshot); + if (code != 0) { + sRError(pReceiver, "snapshot receiver stop write failed since %s", tstrerror(code)); } pReceiver->pWriter = NULL; } else { @@ -553,9 +559,9 @@ void snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver) { syncSnapBufferReset(pReceiver->pRcvBuf); - snapshotReceiverClearInfoData(pReceiver); + (void)snapshotReceiverClearInfoData(pReceiver); } - taosThreadMutexUnlock(&pReceiver->pRcvBuf->mutex); + (void)taosThreadMutexUnlock(&pReceiver->pRcvBuf->mutex); } static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg) { @@ -567,8 +573,8 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap code = pReceiver->pSyncNode->pFsm->FpSnapshotDoWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, pMsg->data, pMsg->dataLen); if (code != 0) { - sRError(pReceiver, "failed to finish snapshot receiver write since %s", terrstr()); - return -1; + sRError(pReceiver, "failed to finish snapshot receiver write since %s", tstrerror(code)); + TAOS_RETURN(code); } } @@ -586,8 +592,8 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap code = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, true, &pReceiver->snapshot); if (code != 0) { - sRError(pReceiver, "snapshot receiver apply failed since %s", terrstr()); - return -1; + sRError(pReceiver, "snapshot receiver apply failed since %s", tstrerror(code)); + TAOS_RETURN(code); } pReceiver->pWriter = NULL; sRInfo(pReceiver, "snapshot receiver write stopped"); @@ -604,13 +610,14 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap code = pReceiver->pSyncNode->pLogStore->syncLogRestoreFromSnapshot(pReceiver->pSyncNode->pLogStore, pMsg->lastIndex); if (code != 0) { - sRError(pReceiver, "failed to snapshot receiver log restore since %s", terrstr()); - return -1; + sRError(pReceiver, "failed to snapshot receiver log restore since %s", tstrerror(code)); + TAOS_RETURN(code); } sRInfo(pReceiver, "wal log restored from snapshot"); } else { + code = TSDB_CODE_SYN_INTERNAL_ERROR; sRError(pReceiver, "snapshot receiver finish error since writer is null"); - return -1; + TAOS_RETURN(code); } return 0; @@ -619,14 +626,12 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap static int32_t snapshotReceiverGotData(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg) { if (pMsg->seq != pReceiver->ack + 1) { sRError(pReceiver, "snapshot receiver invalid seq, ack:%d seq:%d", pReceiver->ack, pMsg->seq); - terrno = TSDB_CODE_SYN_INVALID_SNAPSHOT_MSG; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INVALID_SNAPSHOT_MSG); } if (pReceiver->pWriter == NULL) { sRError(pReceiver, "snapshot receiver failed to write data since writer is null"); - terrno = TSDB_CODE_SYN_INTERNAL_ERROR; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); } sRDebug(pReceiver, "snapshot receiver continue to write, blockLen:%d seq:%d", pMsg->dataLen, pMsg->seq); @@ -636,8 +641,8 @@ static int32_t snapshotReceiverGotData(SSyncSnapshotReceiver *pReceiver, SyncSna int32_t code = pReceiver->pSyncNode->pFsm->FpSnapshotDoWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, pMsg->data, pMsg->dataLen); if (code != 0) { - sRError(pReceiver, "snapshot receiver continue write failed since %s", terrstr()); - return -1; + sRError(pReceiver, "snapshot receiver continue write failed since %s", tstrerror(code)); + TAOS_RETURN(code); } } @@ -671,29 +676,27 @@ SyncIndex syncNodeGetSnapBeginIndex(SSyncNode *ths) { static int32_t syncSnapReceiverExchgSnapInfo(SSyncNode *pSyncNode, SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg, SSnapshot *pInfo) { ASSERT(pMsg->payloadType == TDMT_SYNC_PREP_SNAPSHOT); - int32_t code = 0; + int32_t code = 0, lino = 0; // copy snap info from leader void *data = taosMemoryCalloc(1, pMsg->dataLen); if (data == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = terrno; - goto _out; + TAOS_CHECK_EXIT(TSDB_CODE_OUT_OF_MEMORY); } pInfo->data = data; data = NULL; - memcpy(pInfo->data, pMsg->data, pMsg->dataLen); + (void)memcpy(pInfo->data, pMsg->data, pMsg->dataLen); // exchange snap info - if (pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, pInfo) != 0) { + if ((code = pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, pInfo)) != 0) { sRError(pReceiver, "failed to get snapshot info. type: %d", pMsg->payloadType); - goto _out; + goto _exit; } SSyncTLV *datHead = pInfo->data; if (datHead->typ != TDMT_SYNC_PREP_SNAPSHOT_REPLY) { sRError(pReceiver, "unexpected data typ in data of snapshot info. typ: %d", datHead->typ); code = TSDB_CODE_INVALID_DATA_FMT; - goto _out; + goto _exit; } int32_t dataLen = sizeof(SSyncTLV) + datHead->len; @@ -701,18 +704,17 @@ static int32_t syncSnapReceiverExchgSnapInfo(SSyncNode *pSyncNode, SSyncSnapshot SSnapshotParam *pParam = &pReceiver->snapshotParam; data = taosMemoryRealloc(pParam->data, dataLen); if (data == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; sError("vgId:%d, failed to realloc memory for snapshot prep due to %s. dataLen:%d", pSyncNode->vgId, - strerror(errno), dataLen); - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = terrno; - goto _out; + tstrerror(code), dataLen); + goto _exit; } pParam->data = data; data = NULL; - memcpy(pParam->data, pInfo->data, dataLen); + (void)memcpy(pParam->data, pInfo->data, dataLen); -_out: - return code; +_exit: + TAOS_RETURN(code); } static int32_t syncNodeOnSnapshotPrep(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) { @@ -741,8 +743,7 @@ static int32_t syncNodeOnSnapshotPrep(SSyncNode *pSyncNode, SyncSnapshotSend *pM "received a stale snapshot preparation. ignore." " msg signature:(%" PRId64 ", %" PRId64 ")", pMsg->term, pMsg->startTime); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - code = terrno; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; goto _SEND_REPLY; } } else { @@ -764,7 +765,7 @@ _SEND_REPLY:; SSnapshot snapInfo = {.type = TDMT_SYNC_PREP_SNAPSHOT_REPLY}; int32_t dataLen = 0; if (pMsg->payloadType == TDMT_SYNC_PREP_SNAPSHOT) { - if (syncSnapReceiverExchgSnapInfo(pSyncNode, pReceiver, pMsg, &snapInfo) != 0) { + if ((code = syncSnapReceiverExchgSnapInfo(pSyncNode, pReceiver, pMsg, &snapInfo)) != 0) { goto _out; } SSyncTLV *datHead = snapInfo.data; @@ -773,8 +774,7 @@ _SEND_REPLY:; // send response int32_t type = (snapInfo.data) ? snapInfo.type : 0; - if (syncSnapSendRsp(pReceiver, pMsg, snapInfo.data, dataLen, type, code) != 0) { - code = terrno; + if ((code = syncSnapSendRsp(pReceiver, pMsg, snapInfo.data, dataLen, type, code)) != 0) { goto _out; } @@ -783,7 +783,7 @@ _out: taosMemoryFree(snapInfo.data); snapInfo.data = NULL; } - return code; + TAOS_RETURN(code); } static int32_t syncNodeOnSnapshotBegin(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) { @@ -797,14 +797,14 @@ static int32_t syncNodeOnSnapshotBegin(SSyncNode *pSyncNode, SyncSnapshotSend *p } if (snapshotReceiverSignatureCmp(pReceiver, pMsg) != 0) { - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - sRError(pReceiver, "failed to begin snapshot receiver since %s", terrstr()); + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + sRError(pReceiver, "failed to begin snapshot receiver since %s", tstrerror(code)); goto _SEND_REPLY; } // start writer - if (snapshotReceiverStartWriter(pReceiver, pMsg) != 0) { - sRError(pReceiver, "failed to start snapshot writer since %s", terrstr()); + if ((code = snapshotReceiverStartWriter(pReceiver, pMsg)) != 0) { + sRError(pReceiver, "failed to start snapshot writer since %s", tstrerror(code)); goto _SEND_REPLY; } @@ -817,26 +817,22 @@ static int32_t syncNodeOnSnapshotBegin(SSyncNode *pSyncNode, SyncSnapshotSend *p code = 0; _SEND_REPLY: - if (code != 0 && terrno != 0) { - code = terrno; - } // send response - if (syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, code) != 0) { - return -1; - } + TAOS_CHECK_RETURN(syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, code)); - return code; + TAOS_RETURN(code); } int32_t syncSnapSendRsp(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg, void *pBlock, int32_t blockLen, - int32_t type, int32_t code) { + int32_t type, int32_t rspCode) { + int32_t code = 0; SSyncNode *pSyncNode = pReceiver->pSyncNode; // build msg SRpcMsg rpcMsg = {0}; - if (syncBuildSnapshotSendRsp(&rpcMsg, blockLen, pSyncNode->vgId)) { - sRError(pReceiver, "failed to build snapshot receiver resp since %s", terrstr()); - return -1; + if ((code = syncBuildSnapshotSendRsp(&rpcMsg, blockLen, pSyncNode->vgId)) != 0) { + sRError(pReceiver, "failed to build snapshot receiver resp since %s", tstrerror(code)); + TAOS_RETURN(code); } SyncSnapshotRsp *pRspMsg = rpcMsg.pCont; @@ -847,18 +843,18 @@ int32_t syncSnapSendRsp(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg pRspMsg->lastTerm = pMsg->lastTerm; pRspMsg->startTime = pMsg->startTime; pRspMsg->ack = pMsg->seq; - pRspMsg->code = code; + pRspMsg->code = rspCode; pRspMsg->snapBeginIndex = pReceiver->snapshotParam.start; pRspMsg->payloadType = type; if (pBlock != NULL && blockLen > 0) { - memcpy(pRspMsg->data, pBlock, blockLen); + (void)memcpy(pRspMsg->data, pBlock, blockLen); } // send msg - if (syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg) != 0) { - sRError(pReceiver, "failed to send snapshot receiver resp since %s", terrstr()); - return -1; + if ((code = syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg)) != 0) { + sRError(pReceiver, "failed to send snapshot receiver resp since %s", tstrerror(code)); + TAOS_RETURN(code); } return 0; } @@ -867,13 +863,11 @@ static int32_t syncSnapBufferRecv(SSyncSnapshotReceiver *pReceiver, SyncSnapshot int32_t code = 0; SSyncSnapBuffer *pRcvBuf = pReceiver->pRcvBuf; SyncSnapshotSend *pMsg = ppMsg[0]; - terrno = TSDB_CODE_SUCCESS; - taosThreadMutexLock(&pRcvBuf->mutex); + (void)taosThreadMutexLock(&pRcvBuf->mutex); if (pMsg->seq - pRcvBuf->start >= pRcvBuf->size) { - terrno = TSDB_CODE_SYN_BUFFER_FULL; - code = terrno; + code = TSDB_CODE_SYN_BUFFER_FULL; goto _out; } @@ -887,7 +881,7 @@ static int32_t syncSnapBufferRecv(SSyncSnapshotReceiver *pReceiver, SyncSnapshot ppMsg[0] = NULL; pRcvBuf->end = TMAX(pMsg->seq + 1, pRcvBuf->end); } else if (pMsg->seq < pRcvBuf->start) { - syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, code); + code = syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, code); goto _out; } @@ -900,22 +894,21 @@ static int32_t syncSnapBufferRecv(SSyncSnapshotReceiver *pReceiver, SyncSnapshot } for (int64_t seq = pRcvBuf->start; seq <= pRcvBuf->cursor; ++seq) { - if (snapshotReceiverGotData(pReceiver, pRcvBuf->entries[seq % pRcvBuf->size]) != 0) { - code = terrno; + if ((code = snapshotReceiverGotData(pReceiver, pRcvBuf->entries[seq % pRcvBuf->size])) != 0) { if (code >= SYNC_SNAPSHOT_SEQ_INVALID) { code = TSDB_CODE_SYN_INTERNAL_ERROR; } } pRcvBuf->start = seq + 1; - syncSnapSendRsp(pReceiver, pRcvBuf->entries[seq % pRcvBuf->size], NULL, 0, 0, code); + (void)syncSnapSendRsp(pReceiver, pRcvBuf->entries[seq % pRcvBuf->size], NULL, 0, 0, code); pRcvBuf->entryDeleteCb(pRcvBuf->entries[seq % pRcvBuf->size]); pRcvBuf->entries[seq % pRcvBuf->size] = NULL; if (code) goto _out; } _out: - taosThreadMutexUnlock(&pRcvBuf->mutex); - return code; + (void)taosThreadMutexUnlock(&pRcvBuf->mutex); + TAOS_RETURN(code); } static int32_t syncNodeOnSnapshotReceive(SSyncNode *pSyncNode, SyncSnapshotSend **ppMsg) { @@ -928,9 +921,9 @@ static int32_t syncNodeOnSnapshotReceive(SSyncNode *pSyncNode, SyncSnapshotSend int32_t code = 0; if (snapshotReceiverSignatureCmp(pReceiver, pMsg) != 0) { - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - sRError(pReceiver, "failed to receive snapshot data since %s.", terrstr()); - return syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, terrno); + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + sRError(pReceiver, "failed to receive snapshot data since %s.", tstrerror(code)); + return syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, code); } return syncSnapBufferRecv(pReceiver, ppMsg); @@ -940,14 +933,13 @@ static int32_t syncNodeOnSnapshotEnd(SSyncNode *pSyncNode, SyncSnapshotSend *pMs // condition 2 // end, finish FSM SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver; - int64_t timeNow = taosGetTimestampMs(); + int64_t timeNow = taosGetTimestampMs(); int32_t code = 0; if (snapshotReceiverSignatureCmp(pReceiver, pMsg) != 0) { sRError(pReceiver, "snapshot end failed since startTime:%" PRId64 " not equal to msg startTime:%" PRId64, pReceiver->startTime, pMsg->startTime); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - code = terrno; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; goto _SEND_REPLY; } @@ -960,9 +952,9 @@ _SEND_REPLY:; // build msg SRpcMsg rpcMsg = {0}; - if (syncBuildSnapshotSendRsp(&rpcMsg, 0, pSyncNode->vgId) != 0) { - sRError(pReceiver, "snapshot receiver build rsp failed since %s", terrstr()); - return -1; + if ((code = syncBuildSnapshotSendRsp(&rpcMsg, 0, pSyncNode->vgId)) != 0) { + sRError(pReceiver, "snapshot receiver build rsp failed since %s", tstrerror(code)); + TAOS_RETURN(code); } SyncSnapshotRsp *pRspMsg = rpcMsg.pCont; @@ -978,16 +970,16 @@ _SEND_REPLY:; // send msg syncLogSendSyncSnapshotRsp(pSyncNode, pRspMsg, "snapshot receiver end"); - if (syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg) != 0) { - sRError(pReceiver, "snapshot receiver send rsp failed since %s", terrstr()); - return -1; + if ((code = syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg)) != 0) { + sRError(pReceiver, "snapshot receiver send rsp failed since %s", tstrerror(code)); + TAOS_RETURN(code); } - return code; + TAOS_RETURN(code); } int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { - SyncSnapshotSend **ppMsg = (SyncSnapshotSend **)&pRpcMsg->pCont; + SyncSnapshotSend **ppMsg = (SyncSnapshotSend **)&pRpcMsg->pCont; SyncSnapshotSend *pMsg = ppMsg[0]; SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver; int32_t code = 0; @@ -995,35 +987,36 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { // if already drop replica, do not process if (!syncNodeInRaftGroup(pSyncNode, &pMsg->srcId)) { syncLogRecvSyncSnapshotSend(pSyncNode, pMsg, "not in my config"); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - return -1; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + TAOS_RETURN(code); } if (pMsg->term < raftStoreGetTerm(pSyncNode)) { sRError(pReceiver, "reject snap replication with smaller term. msg term:%" PRId64 ", seq:%d", pMsg->term, pMsg->seq); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, terrno); - return -1; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + (void)syncSnapSendRsp(pReceiver, pMsg, NULL, 0, 0, code); + TAOS_RETURN(code); } - if(pSyncNode->raftCfg.cfg.nodeInfo[pSyncNode->raftCfg.cfg.myIndex].nodeRole != TAOS_SYNC_ROLE_LEARNER){ + if (pSyncNode->raftCfg.cfg.nodeInfo[pSyncNode->raftCfg.cfg.myIndex].nodeRole != TAOS_SYNC_ROLE_LEARNER) { if (pMsg->term > raftStoreGetTerm(pSyncNode)) { syncNodeStepDown(pSyncNode, pMsg->term); } - } - else{ + } else { syncNodeUpdateTermWithoutStepDown(pSyncNode, pMsg->term); } if (pSyncNode->state != TAOS_SYNC_STATE_FOLLOWER && pSyncNode->state != TAOS_SYNC_STATE_LEARNER) { sRError(pReceiver, "snapshot receiver not a follower or learner"); - return -1; + code = TSDB_CODE_SYN_INTERNAL_ERROR; + TAOS_RETURN(code); } if (pMsg->seq < SYNC_SNAPSHOT_SEQ_PREP || pMsg->seq > SYNC_SNAPSHOT_SEQ_END) { sRError(pReceiver, "snap replication msg with invalid seq:%d", pMsg->seq); - return -1; + code = TSDB_CODE_SYN_INVALID_SNAPSHOT_MSG; + TAOS_RETURN(code); } // prepare @@ -1060,14 +1053,14 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { code = syncLogBufferReInit(pSyncNode->pLogBuf, pSyncNode); if (code != 0) { - sRError(pReceiver, "failed to reinit log buffer since %s", terrstr()); + sRError(pReceiver, "failed to reinit log buffer since %s", tstrerror(code)); } goto _out; } _out:; syncNodeResetElectTimer(pSyncNode); - return code; + TAOS_RETURN(code); } static int32_t syncSnapSenderExchgSnapInfo(SSyncNode *pSyncNode, SSyncSnapshotSender *pSender, SyncSnapshotRsp *pMsg) { @@ -1076,18 +1069,16 @@ static int32_t syncSnapSenderExchgSnapInfo(SSyncNode *pSyncNode, SSyncSnapshotSe SSyncTLV *datHead = (void *)pMsg->data; if (datHead->typ != pMsg->payloadType) { sSError(pSender, "unexpected data type in data of SyncSnapshotRsp. typ: %d", datHead->typ); - terrno = TSDB_CODE_INVALID_DATA_FMT; - return -1; + TAOS_RETURN(TSDB_CODE_INVALID_DATA_FMT); } int32_t dataLen = sizeof(SSyncTLV) + datHead->len; SSnapshotParam *pParam = &pSender->snapshotParam; void *data = taosMemoryRealloc(pParam->data, dataLen); if (data == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } - memcpy(data, pMsg->data, dataLen); + (void)memcpy(data, pMsg->data, dataLen); pParam->data = data; data = NULL; @@ -1097,19 +1088,18 @@ static int32_t syncSnapSenderExchgSnapInfo(SSyncNode *pSyncNode, SSyncSnapshotSe // sender static int32_t syncNodeOnSnapshotPrepRsp(SSyncNode *pSyncNode, SSyncSnapshotSender *pSender, SyncSnapshotRsp *pMsg) { - int32_t code = -1; + int32_t code = 0; SSnapshot snapshot = {0}; if (pMsg->snapBeginIndex > pSyncNode->commitIndex) { sSError(pSender, "snapshot begin index is greater than commit index. snapBeginIndex:%" PRId64 ", commitIndex:%" PRId64, pMsg->snapBeginIndex, pSyncNode->commitIndex); - terrno = TSDB_CODE_SYN_INVALID_SNAPSHOT_MSG; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INVALID_SNAPSHOT_MSG); } - taosThreadMutexLock(&pSender->pSndBuf->mutex); - pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot); + (void)taosThreadMutexLock(&pSender->pSndBuf->mutex); + TAOS_CHECK_GOTO(pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot), NULL, _out); // prepare pSender->snapshotParam.start = pMsg->snapBeginIndex; @@ -1123,14 +1113,12 @@ static int32_t syncNodeOnSnapshotPrepRsp(SSyncNode *pSyncNode, SSyncSnapshotSend // start reader if (pMsg->payloadType == TDMT_SYNC_PREP_SNAPSHOT_REPLY) { - if (syncSnapSenderExchgSnapInfo(pSyncNode, pSender, pMsg) != 0) { - goto _out; - } + TAOS_CHECK_GOTO(syncSnapSenderExchgSnapInfo(pSyncNode, pSender, pMsg), NULL, _out); } code = pSyncNode->pFsm->FpSnapshotStartRead(pSyncNode->pFsm, &pSender->snapshotParam, &pSender->pReader); if (code != 0) { - sSError(pSender, "prepare snapshot failed since %s", terrstr()); + sSError(pSender, "prepare snapshot failed since %s", tstrerror(code)); goto _out; } @@ -1140,8 +1128,8 @@ static int32_t syncNodeOnSnapshotPrepRsp(SSyncNode *pSyncNode, SSyncSnapshotSend code = snapshotSend(pSender); _out: - taosThreadMutexUnlock(&pSender->pSndBuf->mutex); - return code; + (void)taosThreadMutexUnlock(&pSender->pSndBuf->mutex); + TAOS_RETURN(code); } static int32_t snapshotSenderSignatureCmp(SSyncSnapshotSender *pSender, SyncSnapshotRsp *pMsg) { @@ -1157,19 +1145,19 @@ static int32_t syncSnapBufferSend(SSyncSnapshotSender *pSender, SyncSnapshotRsp SSyncSnapBuffer *pSndBuf = pSender->pSndBuf; SyncSnapshotRsp *pMsg = ppMsg[0]; - taosThreadMutexLock(&pSndBuf->mutex); + (void)taosThreadMutexLock(&pSndBuf->mutex); if (snapshotSenderSignatureCmp(pSender, pMsg) != 0) { - code = terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; goto _out; } if (pSender->pReader == NULL || pSender->finish || !snapshotSenderIsStart(pSender)) { - code = terrno = TSDB_CODE_SYN_INTERNAL_ERROR; + code = TSDB_CODE_SYN_INTERNAL_ERROR; goto _out; } if (pMsg->ack - pSndBuf->start >= pSndBuf->size) { - code = terrno = TSDB_CODE_SYN_BUFFER_FULL; + code = TSDB_CODE_SYN_BUFFER_FULL; goto _out; } @@ -1208,50 +1196,48 @@ static int32_t syncSnapBufferSend(SSyncSnapshotSender *pSender, SyncSnapshotRsp } } _out: - taosThreadMutexUnlock(&pSndBuf->mutex); - return code; + (void)taosThreadMutexUnlock(&pSndBuf->mutex); + TAOS_RETURN(code); } int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { SyncSnapshotRsp **ppMsg = (SyncSnapshotRsp **)&pRpcMsg->pCont; SyncSnapshotRsp *pMsg = ppMsg[0]; + int32_t code = 0; // if already drop replica, do not process if (!syncNodeInRaftGroup(pSyncNode, &pMsg->srcId)) { syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "maybe replica already dropped"); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_MISMATCHED_SIGNATURE); } // get sender SSyncSnapshotSender *pSender = syncNodeGetSnapshotSender(pSyncNode, &pMsg->srcId); if (pSender == NULL) { syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "sender is null"); - terrno = TSDB_CODE_SYN_INTERNAL_ERROR; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); } if (!snapshotSenderIsStart(pSender)) { sSError(pSender, "snapshot sender stopped. sender startTime:%" PRId64 ", msg startTime:%" PRId64, pSender->startTime, pMsg->startTime); - return -1; + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); } // check signature int32_t order = 0; if ((order = snapshotSenderSignatureCmp(pSender, pMsg)) > 0) { sSWarn(pSender, "ignore a stale snap rsp, msg signature:(%" PRId64 ", %" PRId64 ").", pMsg->term, pMsg->startTime); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; - return -1; + TAOS_RETURN(TSDB_CODE_SYN_MISMATCHED_SIGNATURE); } else if (order < 0) { sSError(pSender, "snapshot sender is stale. stop"); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; goto _ERROR; } if (pSyncNode->state != TAOS_SYNC_STATE_LEADER && pSyncNode->state != TAOS_SYNC_STATE_ASSIGNED_LEADER) { sSError(pSender, "snapshot sender not leader"); - terrno = TSDB_CODE_SYN_NOT_LEADER; + code = TSDB_CODE_SYN_NOT_LEADER; goto _ERROR; } @@ -1259,29 +1245,29 @@ int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { if (pMsg->term != currentTerm) { sSError(pSender, "snapshot sender term mismatch, msg term:%" PRId64 " currentTerm:%" PRId64, pMsg->term, currentTerm); - terrno = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; + code = TSDB_CODE_SYN_MISMATCHED_SIGNATURE; goto _ERROR; } if (pMsg->code != 0) { sSError(pSender, "snapshot sender receive error:%s 0x%x and stop sender", tstrerror(pMsg->code), pMsg->code); - terrno = pMsg->code; + code = pMsg->code; goto _ERROR; } // send begin if (pMsg->ack == SYNC_SNAPSHOT_SEQ_PREP) { sSInfo(pSender, "process prepare rsp"); - if (syncNodeOnSnapshotPrepRsp(pSyncNode, pSender, pMsg) != 0) { + if ((code = syncNodeOnSnapshotPrepRsp(pSyncNode, pSender, pMsg)) != 0) { goto _ERROR; } } // send msg of data or end if (pMsg->ack >= SYNC_SNAPSHOT_SEQ_BEGIN && pMsg->ack < SYNC_SNAPSHOT_SEQ_END) { - if (syncSnapBufferSend(pSender, ppMsg) != 0) { - sSError(pSender, "failed to replicate snap since %s. seq:%d, pReader:%p, finish:%d", terrstr(), pSender->seq, - pSender->pReader, pSender->finish); + if ((code = syncSnapBufferSend(pSender, ppMsg)) != 0) { + sSError(pSender, "failed to replicate snap since %s. seq:%d, pReader:%p, finish:%d", tstrerror(code), + pSender->seq, pSender->pReader, pSender->finish); goto _ERROR; } } @@ -1298,5 +1284,5 @@ int32_t syncNodeOnSnapshotRsp(SSyncNode *pSyncNode, SRpcMsg *pRpcMsg) { _ERROR: snapshotSenderStop(pSender, false); syncNodeReplicateReset(pSyncNode, &pMsg->srcId); - return -1; + TAOS_RETURN(code); } diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index dbbd914041..b2233ae664 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -65,7 +65,7 @@ static int32_t syncNodeTimerRoutine(SSyncNode* ths) { } // timer replicate - syncNodeReplicate(ths); + (void)syncNodeReplicate(ths); // clean mnode index if (syncNodeIsMnode(ths)) { @@ -89,7 +89,7 @@ static int32_t syncNodeTimerRoutine(SSyncNode* ths) { snapshotSenderStop(pSender, false); } else { sSWarn(pSender, "snap replication resend."); - snapshotReSend(pSender); + (void)snapshotReSend(pSender); } } } @@ -112,14 +112,14 @@ int32_t syncNodeOnTimeout(SSyncNode* ths, const SRpcMsg* pRpc) { if (atomic_load_64(&ths->pingTimerLogicClockUser) <= pMsg->logicClock) { ++(ths->pingTimerCounter); - syncNodeTimerRoutine(ths); + (void)syncNodeTimerRoutine(ths); } } else if (pMsg->timeoutType == SYNC_TIMEOUT_ELECTION) { if (atomic_load_64(&ths->electTimerLogicClock) <= pMsg->logicClock) { ++(ths->electTimerCounter); - syncNodeElect(ths); + (void)syncNodeElect(ths); } } else if (pMsg->timeoutType == SYNC_TIMEOUT_HEARTBEAT) { diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c index 66b7938440..2076de6ec7 100644 --- a/source/libs/sync/src/syncUtil.c +++ b/source/libs/sync/src/syncUtil.c @@ -48,8 +48,8 @@ bool syncUtilNodeInfo2RaftId(const SNodeInfo* pInfo, SyncGroupId vgId, SRaftId* "dnode:%d cluster:%" PRId64 " fqdn:%s port:%u ", vgId, tsResolveFQDNRetryTime, pInfo->nodeId, pInfo->clusterId, pInfo->nodeFqdn, pInfo->nodePort); for (int i = 0; i < tsResolveFQDNRetryTime; i++) { - ipv4 = taosGetIpv4FromFqdn(pInfo->nodeFqdn); - if (ipv4 == 0xFFFFFFFF || ipv4 == 1) { + int32_t code = taosGetIpv4FromFqdn(pInfo->nodeFqdn, &ipv4); + if (code) { sError("failed to resolve ipv4 addr, fqdn:%s, wait one second", pInfo->nodeFqdn); taosSsleep(1); } else { @@ -103,10 +103,10 @@ bool syncUtilUserPreCommit(tmsg_t msgType) { return msgType != TDMT_SYNC_NOOP && bool syncUtilUserRollback(tmsg_t msgType) { return msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_LEADER_TRANSFER; } void syncUtilGenerateArbToken(int32_t nodeId, int32_t groupId, char* buf) { - memset(buf, 0, TSDB_ARB_TOKEN_SIZE); + (void)memset(buf, 0, TSDB_ARB_TOKEN_SIZE); int32_t randVal = taosSafeRand() % 1000; int64_t currentMs = taosGetTimestampMs(); - snprintf(buf, TSDB_ARB_TOKEN_SIZE, "d%d#g%d#%" PRId64 "#%d", nodeId, groupId, currentMs, randVal); + (void)snprintf(buf, TSDB_ARB_TOKEN_SIZE, "d%d#g%d#%" PRId64 "#%d", nodeId, groupId, currentMs, randVal); } // for leader diff --git a/source/libs/sync/src/syncVoteMgr.c b/source/libs/sync/src/syncVoteMgr.c index 83b0dde8e0..64f66c27a4 100644 --- a/source/libs/sync/src/syncVoteMgr.c +++ b/source/libs/sync/src/syncVoteMgr.c @@ -19,7 +19,7 @@ #include "syncUtil.h" static void voteGrantedClearVotes(SVotesGranted *pVotesGranted) { - memset(pVotesGranted->isGranted, 0, sizeof(pVotesGranted->isGranted)); + (void)memset(pVotesGranted->isGranted, 0, sizeof(pVotesGranted->isGranted)); pVotesGranted->votes = 0; } @@ -165,5 +165,5 @@ void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *p void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) { pVotesRespond->term = term; - memset(pVotesRespond->isRespond, 0, sizeof(pVotesRespond->isRespond)); + (void)memset(pVotesRespond->isRespond, 0, sizeof(pVotesRespond->isRespond)); } diff --git a/source/libs/sync/test/syncRespMgrTest.cpp b/source/libs/sync/test/syncRespMgrTest.cpp index 74246abf62..714f42a836 100644 --- a/source/libs/sync/test/syncRespMgrTest.cpp +++ b/source/libs/sync/test/syncRespMgrTest.cpp @@ -77,7 +77,7 @@ SSyncNode *createSyncNode() { void test1() { printf("------- test1 ---------\n"); - pMgr = syncRespMgrCreate(createSyncNode(), 0); + (void)syncRespMgrCreate(createSyncNode(), 0, &pMgr); assert(pMgr != NULL); syncRespMgrInsert(10); @@ -102,7 +102,7 @@ void test1() { void test2() { printf("------- test2 ---------\n"); - pMgr = syncRespMgrCreate(createSyncNode(), 0); + (void)syncRespMgrCreate(createSyncNode(), 0, &pMgr); assert(pMgr != NULL); syncRespMgrInsert(10); @@ -119,7 +119,7 @@ void test2() { void test3() { printf("------- test3 ---------\n"); - pMgr = syncRespMgrCreate(createSyncNode(), 0); + (void)syncRespMgrCreate(createSyncNode(), 0, &pMgr); assert(pMgr != NULL); syncRespMgrInsert(10); @@ -136,7 +136,7 @@ void test3() { void test4() { printf("------- test4 ---------\n"); - pMgr = syncRespMgrCreate(createSyncNode(), 2); + (void)syncRespMgrCreate(createSyncNode(), 2, &pMgr); assert(pMgr != NULL); syncRespMgrInsert(5); diff --git a/source/libs/sync/test/syncSnapshotReceiverTest.cpp b/source/libs/sync/test/syncSnapshotReceiverTest.cpp index 1fca04a1ad..112c145a45 100644 --- a/source/libs/sync/test/syncSnapshotReceiverTest.cpp +++ b/source/libs/sync/test/syncSnapshotReceiverTest.cpp @@ -42,7 +42,8 @@ SSyncSnapshotReceiver* createReceiver() { id.addr = syncUtilAddr2U64("1.2.3.4", 99); id.vgId = 100; - SSyncSnapshotReceiver* pReceiver = snapshotReceiverCreate(pSyncNode, id); + SSyncSnapshotReceiver* pReceiver = NULL; + (void)snapshotReceiverCreate(pSyncNode, id, &pReceiver); pReceiver->start = true; pReceiver->ack = 20; pReceiver->pWriter = (void*)0x11; diff --git a/source/libs/sync/test/syncSnapshotSenderTest.cpp b/source/libs/sync/test/syncSnapshotSenderTest.cpp index a1768c2ce5..be31df30e9 100644 --- a/source/libs/sync/test/syncSnapshotSenderTest.cpp +++ b/source/libs/sync/test/syncSnapshotSenderTest.cpp @@ -39,7 +39,8 @@ SSyncSnapshotSender* createSender() { pSyncNode->pFsm->FpGetSnapshotInfo = GetSnapshot; #endif - SSyncSnapshotSender* pSender = snapshotSenderCreate(pSyncNode, 2); + SSyncSnapshotSender* pSender = NULL; + (void)snapshotSenderCreate(pSyncNode, 2, &pSender); pSender->start = true; pSender->seq = 10; pSender->ack = 20; diff --git a/source/libs/sync/test/sync_test_lib/src/syncIO.c b/source/libs/sync/test/sync_test_lib/src/syncIO.c index 4f8ae59348..11894f7853 100644 --- a/source/libs/sync/test/sync_test_lib/src/syncIO.c +++ b/source/libs/sync/test/sync_test_lib/src/syncIO.c @@ -525,8 +525,9 @@ void syncUtilU642Addr(uint64_t u64, char *host, int64_t len, uint16_t *port) { } uint64_t syncUtilAddr2U64(const char *host, uint16_t port) { - uint32_t hostU32 = taosGetIpv4FromFqdn(host); - if (hostU32 == (uint32_t)-1) { + uint32_t hostU32 = 0; + int32_t code = taosGetIpv4FromFqdn(host, &hostU32); + if (code) { sError("failed to resolve ipv4 addr, host:%s", host); terrno = TSDB_CODE_TSC_INVALID_FQDN; return -1; diff --git a/source/libs/tfs/src/tfs.c b/source/libs/tfs/src/tfs.c index 81c853e546..ede7636011 100644 --- a/source/libs/tfs/src/tfs.c +++ b/source/libs/tfs/src/tfs.c @@ -81,7 +81,7 @@ void tfsClose(STfs *pTfs) { } taosHashCleanup(pTfs->hash); - taosThreadSpinDestroy(&pTfs->lock); + (void)taosThreadSpinDestroy(&pTfs->lock); taosMemoryFree(pTfs); } @@ -96,15 +96,15 @@ void tfsUpdateSize(STfs *pTfs) { size.used += pTier->size.used; } - tfsLock(pTfs); + (void)tfsLock(pTfs); pTfs->size = size; - tfsUnLock(pTfs); + (void)tfsUnLock(pTfs); } SDiskSize tfsGetSize(STfs *pTfs) { - tfsLock(pTfs); + (void)tfsLock(pTfs); SDiskSize size = pTfs->size; - tfsUnLock(pTfs); + (void)tfsUnLock(pTfs); return size; } @@ -190,7 +190,7 @@ void tfsInitFile(STfs *pTfs, STfsFile *pFile, SDiskID diskId, const char *rname) tstrncpy(pFile->rname, rname, TSDB_FILENAME_LEN); char tmpName[TMPNAME_LEN] = {0}; - snprintf(tmpName, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); + (void)snprintf(tmpName, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); tstrncpy(pFile->aname, tmpName, TSDB_FILENAME_LEN); pFile->pTfs = pTfs; } @@ -200,12 +200,12 @@ bool tfsIsSameFile(const STfsFile *pFile1, const STfsFile *pFile2) { if (pFile1->did.level != pFile2->did.level) return false; if (pFile1->did.id != pFile2->did.id) return false; char nameBuf1[TMPNAME_LEN], nameBuf2[TMPNAME_LEN]; - strncpy(nameBuf1, pFile1->rname, TMPNAME_LEN); - strncpy(nameBuf2, pFile2->rname, TMPNAME_LEN); + (void)strncpy(nameBuf1, pFile1->rname, TMPNAME_LEN); + (void)strncpy(nameBuf2, pFile2->rname, TMPNAME_LEN); nameBuf1[TMPNAME_LEN - 1] = 0; nameBuf2[TMPNAME_LEN - 1] = 0; - taosRealPath(nameBuf1, NULL, TMPNAME_LEN); - taosRealPath(nameBuf2, NULL, TMPNAME_LEN); + (void)taosRealPath(nameBuf1, NULL, TMPNAME_LEN); + (void)taosRealPath(nameBuf2, NULL, TMPNAME_LEN); if (strncmp(nameBuf1, nameBuf2, TMPNAME_LEN) != 0) return false; return true; } @@ -251,7 +251,7 @@ void tfsDirname(const STfsFile *pFile, char *dest) { void tfsAbsoluteName(STfs *pTfs, SDiskID diskId, const char *rname, char *aname) { STfsDisk *pDisk = TFS_DISK_AT(pTfs, diskId); - snprintf(aname, TSDB_FILENAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); + (void)snprintf(aname, TSDB_FILENAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); } int32_t tfsRemoveFile(const STfsFile *pFile) { return taosRemoveFile(pFile->aname); } @@ -267,7 +267,7 @@ int32_t tfsMkdirAt(STfs *pTfs, const char *rname, SDiskID diskId) { if (pDisk == NULL) { TAOS_RETURN(TSDB_CODE_FS_INVLD_CFG); } - snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); + (void)snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); if (taosMkDir(aname) != 0) { TAOS_RETURN(TAOS_SYSTEM_ERROR(errno)); } @@ -347,7 +347,7 @@ bool tfsDirExistAt(STfs *pTfs, const char *rname, SDiskID diskId) { STfsDisk *pDisk = TFS_DISK_AT(pTfs, diskId); char aname[TMPNAME_LEN]; - snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); + (void)snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); return taosDirExist(aname); } @@ -362,7 +362,7 @@ int32_t tfsRmdir(STfs *pTfs, const char *rname) { STfsTier *pTier = TFS_TIER_AT(pTfs, level); for (int32_t id = 0; id < pTier->ndisk; id++) { STfsDisk *pDisk = pTier->disks[id]; - snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); + (void)snprintf(aname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, rname); uInfo("tfs remove dir:%s aname:%s rname:[%s]", pDisk->path, aname, rname); taosRemoveDir(aname); } @@ -379,8 +379,8 @@ static int32_t tfsRenameAt(STfs *pTfs, SDiskID diskId, const char *orname, const int32_t id = diskId.id; STfsTier *pTier = TFS_TIER_AT(pTfs, level); STfsDisk *pDisk = pTier->disks[id]; - snprintf(oaname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, orname); - snprintf(naname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, nrname); + (void)snprintf(oaname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, orname); + (void)snprintf(naname, TMPNAME_LEN, "%s%s%s", pDisk->path, TD_DIRSEP, nrname); if (taosRenameFile(oaname, naname) != 0 && errno != ENOENT) { int32_t code = TAOS_SYSTEM_ERROR(errno); // TODO: use return value of taosRenameFile directly @@ -417,7 +417,7 @@ int32_t tfsSearch(STfs *pTfs, int32_t level, const char *fname) { for (int32_t id = 0; id < pTier->ndisk; id++) { STfsDisk *pDisk = pTier->disks[id]; - snprintf(path, TMPNAME_LEN - 1, "%s%s%s", pDisk->path, TD_DIRSEP, fname); + (void)snprintf(path, TMPNAME_LEN - 1, "%s%s%s", pDisk->path, TD_DIRSEP, fname); if (taosCheckExistFile(path)) { return id; } @@ -460,9 +460,9 @@ const STfsFile *tfsReaddir(STfsDir *pTfsDir) { if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue; if (pTfsDir->dirName[0] == 0) { - snprintf(bname, TMPNAME_LEN * 2, "%s", name); + (void)snprintf(bname, TMPNAME_LEN * 2, "%s", name); } else { - snprintf(bname, TMPNAME_LEN * 2, "%s%s%s", pTfsDir->dirName, TD_DIRSEP, name); + (void)snprintf(bname, TMPNAME_LEN * 2, "%s%s%s", pTfsDir->dirName, TD_DIRSEP, name); } tfsInitFile(pTfsDir->pTfs, &pTfsDir->tfile, pTfsDir->did, bname); @@ -655,9 +655,9 @@ static int32_t tfsOpendirImpl(STfs *pTfs, STfsDir *pTfsDir) { pTfsDir->did.id = pDisk->id; if (pDisk->path == NULL || pDisk->path[0] == 0) { - snprintf(adir, TMPNAME_LEN * 2, "%s", pTfsDir->dirName); + (void)snprintf(adir, TMPNAME_LEN * 2, "%s", pTfsDir->dirName); } else { - snprintf(adir, TMPNAME_LEN * 2, "%s%s%s", pDisk->path, TD_DIRSEP, pTfsDir->dirName); + (void)snprintf(adir, TMPNAME_LEN * 2, "%s%s%s", pDisk->path, TD_DIRSEP, pTfsDir->dirName); } pTfsDir->pDir = taosOpenDir(adir); if (pTfsDir->pDir != NULL) break; @@ -698,7 +698,7 @@ int32_t tfsGetMonitorInfo(STfs *pTfs, SMonDiskInfo *pInfo) { tfsUpdateSize(pTfs); - tfsLock(pTfs); + (void)tfsLock(pTfs); for (int32_t level = 0; level < pTfs->nlevel; level++) { STfsTier *pTier = &pTfs->tiers[level]; for (int32_t disk = 0; disk < pTier->ndisk; ++disk) { @@ -708,14 +708,14 @@ int32_t tfsGetMonitorInfo(STfs *pTfs, SMonDiskInfo *pInfo) { dinfo.level = pDisk->level; tstrncpy(dinfo.name, pDisk->path, sizeof(dinfo.name)); if (taosArrayPush(pInfo->datadirs, &dinfo) == NULL) { - tfsUnLock(pTfs); + (void)tfsUnLock(pTfs); taosArrayDestroy(pInfo->datadirs); pInfo->datadirs = NULL; TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } } } - tfsUnLock(pTfs); + (void)tfsUnLock(pTfs); TAOS_RETURN(0); } diff --git a/source/libs/tfs/src/tfsTier.c b/source/libs/tfs/src/tfsTier.c index 685f95c517..0733e3c76a 100644 --- a/source/libs/tfs/src/tfsTier.c +++ b/source/libs/tfs/src/tfsTier.c @@ -19,7 +19,7 @@ extern int64_t tsMinDiskFreeSize; int32_t tfsInitTier(STfsTier *pTier, int32_t level) { - memset(pTier, 0, sizeof(STfsTier)); + (void)memset(pTier, 0, sizeof(STfsTier)); if (taosThreadSpinInit(&pTier->lock, 0) != 0) { TAOS_RETURN(TAOS_SYSTEM_ERROR(errno)); @@ -35,7 +35,7 @@ void tfsDestroyTier(STfsTier *pTier) { } pTier->ndisk = 0; - taosThreadSpinDestroy(&pTier->lock); + (void)taosThreadSpinDestroy(&pTier->lock); } int32_t tfsMountDiskToTier(STfsTier *pTier, SDiskCfg *pCfg, STfsDisk **ppDisk) { @@ -88,7 +88,7 @@ void tfsUpdateTierSize(STfsTier *pTier) { SDiskSize size = {0}; int32_t nAvailDisks = 0; - tfsLockTier(pTier); + (void)tfsLockTier(pTier); for (int32_t id = 0; id < pTier->ndisk; id++) { STfsDisk *pDisk = pTier->disks[id]; @@ -104,15 +104,15 @@ void tfsUpdateTierSize(STfsTier *pTier) { pTier->size = size; pTier->nAvailDisks = nAvailDisks; - tfsUnLockTier(pTier); + (void)tfsUnLockTier(pTier); } // Round-Robin to allocate disk on a tier int32_t tfsAllocDiskOnTier(STfsTier *pTier) { - tfsLockTier(pTier); + (void)tfsLockTier(pTier); if (pTier->ndisk <= 0 || pTier->nAvailDisks <= 0) { - tfsUnLockTier(pTier); + (void)tfsUnLockTier(pTier); TAOS_RETURN(TSDB_CODE_FS_NO_VALID_DISK); } @@ -155,7 +155,7 @@ int32_t tfsAllocDiskOnTier(STfsTier *pTier) { #endif } - tfsUnLockTier(pTier); + (void)tfsUnLockTier(pTier); if (retId < 0) { TAOS_RETURN(TSDB_CODE_FS_NO_VALID_DISK); } diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index ba12774c18..2a538a416c 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -190,8 +190,9 @@ _OVER: } static FORCE_INLINE int32_t taosBuildDstAddr(const char* server, uint16_t port, struct sockaddr_in* dest) { - uint32_t ip = taosGetIpv4FromFqdn(server); - if (ip == 0xffffffff) { + uint32_t ip = 0; + int32_t code = taosGetIpv4FromFqdn(server, &ip); + if (code) { tError("http-report failed to resolving domain names: %s", server); return TSDB_CODE_RPC_FQDN_ERROR; } diff --git a/source/libs/transport/src/trans.c b/source/libs/transport/src/trans.c index 5ed2e00acd..c35f147fc5 100644 --- a/source/libs/transport/src/trans.c +++ b/source/libs/transport/src/trans.c @@ -26,8 +26,8 @@ void (*taosUnRefHandle[])(void* handle) = {transUnrefSrvHandle, transUnrefCliHan int (*transReleaseHandle[])(void* handle) = {transReleaseSrvHandle, transReleaseCliHandle}; static int32_t transValidLocalFqdn(const char* localFqdn, uint32_t* ip) { - *ip = taosGetIpv4FromFqdn(localFqdn); - if (*ip == 0xFFFFFFFF) { + int32_t code = taosGetIpv4FromFqdn(localFqdn, ip); + if (code) { terrno = TSDB_CODE_RPC_FQDN_ERROR; return -1; } diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index cf466f3cd9..19af63b24f 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -196,7 +196,7 @@ static FORCE_INLINE void cliMayCvtFqdnToIp(SEpSet* pEpSet, SCvtAddr* pCvtAddr); static FORCE_INLINE int32_t cliBuildExceptResp(SCliMsg* pMsg, STransMsg* resp); -static FORCE_INLINE uint32_t cliGetIpFromFqdnCache(SHashObj* cache, char* fqdn); +static FORCE_INLINE int32_t cliGetIpFromFqdnCache(SHashObj* cache, char* fqdn, uint32_t* ip); static FORCE_INLINE void cliUpdateFqdnCache(SHashObj* cache, char* fqdn); static FORCE_INLINE void cliMayUpdateFqdnCache(SHashObj* cache, char* dst); @@ -1253,8 +1253,9 @@ static void cliHandleBatchReq(SCliBatch* pBatch, SCliThrd* pThrd) { conn->pBatch = pBatch; conn->dstAddr = taosStrdup(pList->dst); - uint32_t ipaddr = cliGetIpFromFqdnCache(pThrd->fqdn2ipCache, pList->ip); - if (ipaddr == 0xffffffff) { + uint32_t ipaddr = 0; + int32_t code = cliGetIpFromFqdnCache(pThrd->fqdn2ipCache, pList->ip, &ipaddr); + if (code) { uv_timer_stop(conn->timer); conn->timer->data = NULL; taosArrayPush(pThrd->timerList, &conn->timer); @@ -1561,28 +1562,28 @@ FORCE_INLINE int32_t cliBuildExceptResp(SCliMsg* pMsg, STransMsg* pResp) { return 0; } -static FORCE_INLINE uint32_t cliGetIpFromFqdnCache(SHashObj* cache, char* fqdn) { - uint32_t addr = 0; +static FORCE_INLINE int32_t cliGetIpFromFqdnCache(SHashObj* cache, char* fqdn, uint32_t* ip) { size_t len = strlen(fqdn); uint32_t* v = taosHashGet(cache, fqdn, len); if (v == NULL) { - addr = taosGetIpv4FromFqdn(fqdn); - if (addr == 0xffffffff) { - terrno = TSDB_CODE_RPC_FQDN_ERROR; + int32_t code = taosGetIpv4FromFqdn(fqdn, ip); + if (code) { tError("failed to get ip from fqdn:%s since %s", fqdn, terrstr()); - return addr; + return code; } - taosHashPut(cache, fqdn, len, &addr, sizeof(addr)); + taosHashPut(cache, fqdn, len, ip, sizeof(*ip)); } else { - addr = *v; + *ip = *v; } - return addr; + + return TSDB_CODE_SUCCESS; } static FORCE_INLINE void cliUpdateFqdnCache(SHashObj* cache, char* fqdn) { // impl later - uint32_t addr = taosGetIpv4FromFqdn(fqdn); - if (addr != 0xffffffff) { + uint32_t addr = 0; + int32_t code = taosGetIpv4FromFqdn(fqdn, &addr); + if (TSDB_CODE_SUCCESS == code) { size_t len = strlen(fqdn); uint32_t* v = taosHashGet(cache, fqdn, len); if (addr != *v) { @@ -1671,8 +1672,9 @@ void cliHandleReq(SCliMsg* pMsg, SCliThrd* pThrd) { conn->dstAddr = taosStrdup(addr); - uint32_t ipaddr = cliGetIpFromFqdnCache(pThrd->fqdn2ipCache, fqdn); - if (ipaddr == 0xffffffff) { + uint32_t ipaddr = 0; + int32_t code = cliGetIpFromFqdnCache(pThrd->fqdn2ipCache, fqdn, &ipaddr); + if (code) { uv_timer_stop(conn->timer); conn->timer->data = NULL; taosArrayPush(pThrd->timerList, &conn->timer); diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index ef1c2dcdc8..821488c90c 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -695,18 +695,21 @@ int taosOpenFileNotStream(const char *path, int32_t tdFileOptions) { int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count) { #if FILE_WITH_LOCK - taosThreadRwlockRdlock(&(pFile->rwlock)); + (void)taosThreadRwlockRdlock(&(pFile->rwlock)); #endif - ASSERT(pFile->fd >= 0); // Please check if you have closed the file. + if (pFile->fd < 0) { #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + int64_t leftbytes = count; int64_t readbytes; char *tbuf = (char *)buf; + int32_t code = 0; while (leftbytes > 0) { #ifdef WINDOWS @@ -718,14 +721,16 @@ int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count) { if (errno == EINTR) { continue; } else { + code = TAOS_SYSTEM_ERROR(errno); #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif - return -1; + terrno = code; + return terrno; } } else if (readbytes == 0) { #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif return (int64_t)(count - leftbytes); } @@ -735,28 +740,32 @@ int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count) { } #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + return count; } int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count) { if (pFile == NULL) { + terrno = TSDB_CODE_INVALID_PARA; return 0; } #if FILE_WITH_LOCK - taosThreadRwlockWrlock(&(pFile->rwlock)); + (void)taosThreadRwlockWrlock(&(pFile->rwlock)); #endif if (pFile->fd < 0) { #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + terrno = TSDB_CODE_INVALID_PARA; return 0; } int64_t nleft = count; int64_t nwritten = 0; char *tbuf = (char *)buf; + int32_t code = 0; while (nleft > 0) { nwritten = write(pFile->fd, (void *)tbuf, (uint32_t)nleft); @@ -764,9 +773,11 @@ int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count) { if (errno == EINTR) { continue; } + code = TAOS_SYSTEM_ERROR(errno); #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + terrno = code; return -1; } nleft -= nwritten; @@ -774,25 +785,30 @@ int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count) { } #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + return count; } int64_t taosPWriteFile(TdFilePtr pFile, const void *buf, int64_t count, int64_t offset) { if (pFile == NULL) { + terrno = TSDB_CODE_INVALID_PARA; return 0; } + + int32_t code = 0; #if FILE_WITH_LOCK - taosThreadRwlockWrlock(&(pFile->rwlock)); + (void)taosThreadRwlockWrlock(&(pFile->rwlock)); #endif - ASSERT(pFile->fd >= 0); // Please check if you have closed the file. + +#if FILE_WITH_LOCK if (pFile->fd < 0) { -#if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); -#endif + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); return 0; } +#endif + #ifdef WINDOWS DWORD ret = 0; OVERLAPPED ol = {0}; @@ -808,39 +824,63 @@ int64_t taosPWriteFile(TdFilePtr pFile, const void *buf, int64_t count, int64_t } #else int64_t ret = pwrite(pFile->fd, buf, count, offset); + if (-1 == ret) { + code = TAOS_SYSTEM_ERROR(errno); + } #endif #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + + if (code) { + terrno = code; + } + return ret; } int64_t taosLSeekFile(TdFilePtr pFile, int64_t offset, int32_t whence) { if (pFile == NULL || pFile->fd < 0) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } #if FILE_WITH_LOCK - taosThreadRwlockRdlock(&(pFile->rwlock)); + (void)taosThreadRwlockRdlock(&(pFile->rwlock)); #endif + + int32_t code = 0; ASSERT(pFile->fd >= 0); // Please check if you have closed the file. + #ifdef WINDOWS int64_t ret = _lseeki64(pFile->fd, offset, whence); #else int64_t ret = lseek(pFile->fd, offset, whence); + if (-1 == ret) { + code = TAOS_SYSTEM_ERROR(errno); + } #endif + #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + + if (code) { + terrno = code; + return terrno; + } + return ret; } int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime) { if (pFile == NULL) { - return 0; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } - ASSERT(pFile->fd >= 0); // Please check if you have closed the file. + if (pFile->fd < 0) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } #ifdef WINDOWS @@ -850,7 +890,8 @@ int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime) { struct stat fileStat; int32_t code = fstat(pFile->fd, &fileStat); #endif - if (code < 0) { + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); return code; } @@ -866,10 +907,11 @@ int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime) { } int32_t taosLockFile(TdFilePtr pFile) { - ASSERT(pFile->fd >= 0); // Please check if you have closed the file. - if (pFile->fd < 0) { - return -1; + if (NULL == pFile || pFile->fd < 0) { + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + #ifdef WINDOWS BOOL fSuccess = FALSE; LARGE_INTEGER fileSize; @@ -888,15 +930,21 @@ int32_t taosLockFile(TdFilePtr pFile) { } return 0; #else - return (int32_t)flock(pFile->fd, LOCK_EX | LOCK_NB); + int32_t code = (int32_t)flock(pFile->fd, LOCK_EX | LOCK_NB); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return code; #endif } int32_t taosUnLockFile(TdFilePtr pFile) { - ASSERT(pFile->fd >= 0); - if (pFile->fd < 0) { - return 0; + if (NULL == pFile || pFile->fd < 0) { + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + #ifdef WINDOWS BOOL fSuccess = FALSE; OVERLAPPED overlapped = {0}; @@ -908,18 +956,21 @@ int32_t taosUnLockFile(TdFilePtr pFile) { } return 0; #else - return (int32_t)flock(pFile->fd, LOCK_UN | LOCK_NB); + int32_t code = (int32_t)flock(pFile->fd, LOCK_UN | LOCK_NB); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return code; #endif } int32_t taosFtruncateFile(TdFilePtr pFile, int64_t l_size) { - if (pFile == NULL) { - return 0; - } - if (pFile->fd < 0) { - printf("Ftruncate file error, fd arg was negative\n"); - return -1; + if (NULL == pFile || pFile->fd < 0) { + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + #ifdef WINDOWS HANDLE h = (HANDLE)_get_osfhandle(pFile->fd); @@ -965,17 +1016,23 @@ int32_t taosFtruncateFile(TdFilePtr pFile, int64_t l_size) { return 0; #else - return ftruncate(pFile->fd, l_size); + int32_t code = ftruncate(pFile->fd, l_size); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return code; #endif } int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, int64_t size) { if (pFileOut == NULL || pFileIn == NULL) { - return 0; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } - ASSERT(pFileIn->fd >= 0 && pFileOut->fd >= 0); - if (pFileIn->fd < 0 || pFileOut->fd < 0) { - return 0; + if (pFileIn->fd < 0 || pFileOut->fd < 0) { + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } #ifdef WINDOWS @@ -1055,7 +1112,8 @@ int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, in if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) { continue; } else { - return -1; + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } } else if (sentbytes == 0) { return (int64_t)(size - leftbytes); @@ -1068,7 +1126,7 @@ int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, in #endif } -bool lastErrorIsFileNotExist() { return errno == ENOENT; } +bool lastErrorIsFileNotExist() { return terrno == TAOS_SYSTEM_ERROR(ENOENT); } #endif // WINDOWS @@ -1100,6 +1158,7 @@ TdFilePtr taosOpenFile(const char *path, int32_t tdFileOptions) { if (fd >= 0) (void)close(fd); #endif if (fp != NULL) (void)fclose(fp); + terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } @@ -1175,22 +1234,26 @@ int32_t taosCloseFile(TdFilePtr *ppFile) { int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset) { if (pFile == NULL) { - return 0; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } int32_t code = 0; #ifdef WINDOWS #if FILE_WITH_LOCK - taosThreadRwlockRdlock(&(pFile->rwlock)); + (void)taosThreadRwlockRdlock(&(pFile->rwlock)); #endif - ASSERT(pFile->hFile != NULL); // Please check if you have closed the file. + if (pFile->hFile == NULL) { #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif - return -1; + + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + DWORD ret = 0; OVERLAPPED ol = {0}; ol.OffsetHigh = (uint32_t)((offset & 0xFFFFFFFF00000000LL) >> 0x20); @@ -1206,13 +1269,13 @@ int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset) #if FILE_WITH_LOCK (void)taosThreadRwlockRdlock(&(pFile->rwlock)); #endif - ASSERT(pFile->fd >= 0); // Please check if you have closed the file. + if (pFile->fd < 0) { #if FILE_WITH_LOCK (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif terrno = TSDB_CODE_INVALID_PARA; - return -1; + return terrno; } int64_t ret = pread(pFile->fd, buf, count, offset); if (-1 == ret) { @@ -1223,7 +1286,10 @@ int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset) (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif - terrno = code; + if (code) { + terrno = code; + return code; + } return ret; } @@ -1243,7 +1309,7 @@ int32_t taosFsyncFile(TdFilePtr pFile) { return terrno; } - return code; + return 0; } #ifdef WINDOWS @@ -1272,7 +1338,7 @@ void taosFprintfFile(TdFilePtr pFile, const char *format, ...) { } va_list ap; va_start(ap, format); - vfprintf(pFile->fp, format, ap); + (void)vfprintf(pFile->fp, format, ap); va_end(ap); } @@ -1292,22 +1358,26 @@ int32_t taosUmaskFile(int32_t maskVal) { #endif } -int32_t taosGetErrorFile(TdFilePtr pFile) { return errno; } int64_t taosGetLineFile(TdFilePtr pFile, char **__restrict ptrBuf) { int64_t ret = -1; + int32_t code = 0; + #if FILE_WITH_LOCK - taosThreadRwlockRdlock(&(pFile->rwlock)); + (void)taosThreadRwlockRdlock(&(pFile->rwlock)); #endif if (pFile == NULL || ptrBuf == NULL) { + terrno = TSDB_CODE_INVALID_PARA; goto END; } if (*ptrBuf != NULL) { taosMemoryFreeClear(*ptrBuf); } - ASSERT(pFile->fp != NULL); + if (pFile->fp == NULL) { + terrno = TSDB_CODE_INVALID_PARA; goto END; } + #ifdef WINDOWS size_t bufferSize = 512; *ptrBuf = taosMemoryMalloc(bufferSize); @@ -1344,35 +1414,55 @@ int64_t taosGetLineFile(TdFilePtr pFile, char **__restrict ptrBuf) { #else size_t len = 0; ret = getline(ptrBuf, &len, pFile->fp); + if (-1 == ret) { + code = TAOS_SYSTEM_ERROR(errno); + } #endif END: + #if FILE_WITH_LOCK - taosThreadRwlockUnlock(&(pFile->rwlock)); + (void)taosThreadRwlockUnlock(&(pFile->rwlock)); #endif + + if (code) { + terrno = code; + } + return ret; } int64_t taosGetsFile(TdFilePtr pFile, int32_t maxSize, char *__restrict buf) { if (pFile == NULL || buf == NULL) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } - ASSERT(pFile->fp != NULL); + if (pFile->fp == NULL) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + if (fgets(buf, maxSize, pFile->fp) == NULL) { - return -1; + if (feof(pFile->fp)) { + return 0; + } else { + terrno = TAOS_SYSTEM_ERROR(ferror(pFile->fp)); + return terrno; + } } + return strlen(buf); } int32_t taosEOFFile(TdFilePtr pFile) { if (pFile == NULL) { + terrno = TSDB_CODE_INVALID_PARA; return -1; } ASSERT(pFile->fp != NULL); if (pFile->fp == NULL) { + terrno = TSDB_CODE_INVALID_PARA; return -1; } @@ -1406,14 +1496,17 @@ int32_t taosCompressFile(char *srcFileName, char *destFileName) { int32_t compressSize = 163840; int32_t ret = 0; int32_t len = 0; - char *data = taosMemoryMalloc(compressSize); gzFile dstFp = NULL; - TdFilePtr pSrcFile = NULL; + char *data = taosMemoryMalloc(compressSize); + if (NULL == data) { + return terrno; + } + pSrcFile = taosOpenFile(srcFileName, TD_FILE_READ | TD_FILE_STREAM); if (pSrcFile == NULL) { - ret = -1; + ret = terrno; goto cmp_end; } @@ -1424,39 +1517,45 @@ int32_t taosCompressFile(char *srcFileName, char *destFileName) { int32_t pmode = S_IRWXU | S_IRWXG | S_IRWXO; #endif int fd = open(destFileName, access, pmode); - if (fd < 0) { - ret = -2; + if (-1 == fd) { + terrno = TAOS_SYSTEM_ERROR(errno); + ret = terrno; goto cmp_end; } // Both gzclose() and fclose() will close the associated fd, so they need to have different fds. FileFd gzFd = dup(fd); - if (gzFd < 0) { - ret = -4; + if (-1 == gzFd) { + terrno = TAOS_SYSTEM_ERROR(errno); + ret = terrno; goto cmp_end; } dstFp = gzdopen(gzFd, "wb6f"); if (dstFp == NULL) { - ret = -3; - close(gzFd); + terrno = TAOS_SYSTEM_ERROR(errno); + ret = terrno; + (void)close(gzFd); goto cmp_end; } while (!feof(pSrcFile->fp)) { len = (int32_t)fread(data, 1, compressSize, pSrcFile->fp); - (void)gzwrite(dstFp, data, len); + if (len > 0) { + (void)gzwrite(dstFp, data, len); + } } cmp_end: + if (fd >= 0) { - close(fd); + (void)close(fd); } if (pSrcFile) { - taosCloseFile(&pSrcFile); + (void)taosCloseFile(&pSrcFile); } if (dstFp) { - gzclose(dstFp); + (void)gzclose(dstFp); } taosMemoryFree(data); @@ -1475,23 +1574,31 @@ int32_t taosSetFileHandlesLimit() { int32_t taosLinkFile(char *src, char *dst) { #ifndef WINDOWS - if (link(src, dst) != 0) { - if (errno == EXDEV || errno == ENOTSUP) { - return -1; - } - return errno; + if (-1 == link(src, dst)) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } #endif return 0; } -FILE *taosOpenCFile(const char *filename, const char *mode) { return fopen(filename, mode); } +FILE *taosOpenCFile(const char *filename, const char *mode) { + FILE* f = fopen(filename, mode); + if (NULL == f) { + terrno = TAOS_SYSTEM_ERROR(errno); + } + return f; +} int taosSeekCFile(FILE *file, int64_t offset, int whence) { #ifdef WINDOWS return _fseeki64(file, offset, whence); #else - return fseeko(file, offset, whence); + int code = fseeko(file, offset, whence); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + } + return terrno; #endif } @@ -1509,6 +1616,10 @@ int taosSetAutoDelFile(char *path) { #ifdef WINDOWS return SetFileAttributes(path, FILE_ATTRIBUTE_TEMPORARY); #else - return unlink(path); + if (-1 == unlink(path)) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return 0; #endif } diff --git a/source/os/src/osLocale.c b/source/os/src/osLocale.c index 136b8cf022..c846ca82a3 100644 --- a/source/os/src/osLocale.c +++ b/source/os/src/osLocale.c @@ -75,18 +75,18 @@ char *taosCharsetReplace(char *charsetstr) { * * In case that the setLocale failed to be executed, the right charset needs to be set. */ -void taosSetSystemLocale(const char *inLocale, const char *inCharSet) { - char *locale = setlocale(LC_CTYPE, inLocale); - - // default locale or user specified locale is not valid, abort launch - if (inLocale == NULL || strlen(inLocale) == 0) { - // printf("Invalid locale:%s, please set the valid locale in config file\n", inLocale); - } - +int32_t taosSetSystemLocale(const char *inLocale, const char *inCharSet) {\ if (!taosValidateEncodec(inCharSet)) { - printf("Invalid charset:%s, please set the valid charset in config file\n", inCharSet); - exit(-1); + return terrno; } + + char *locale = setlocale(LC_CTYPE, inLocale); + if (NULL == locale) { + terrno = TSDB_CODE_INVALID_PARA; + return terrno; + } + + return 0; } void taosGetSystemLocale(char *outLocale, char *outCharset) { @@ -168,7 +168,7 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) { locale = setlocale(LC_CTYPE, ""); if (locale == NULL) { // printf("can't get locale from system, set it to en_US.UTF-8 since error:%d:%s", errno, strerror(errno)); - strcpy(outLocale, "en_US.UTF-8"); + (void)strcpy(outLocale, "en_US.UTF-8"); } else { tstrncpy(outLocale, locale, TD_LOCALE_LEN); //printf("locale not configured, set to system default:%s\n", outLocale); @@ -180,12 +180,16 @@ void taosGetSystemLocale(char *outLocale, char *outCharset) { str++; char *revisedCharset = taosCharsetReplace(str); - tstrncpy(outCharset, revisedCharset, TD_LOCALE_LEN); + if (NULL == revisedCharset) { + (void)strcpy(outCharset, "UTF-8"); + } else { + tstrncpy(outCharset, revisedCharset, TD_LOCALE_LEN); - taosMemoryFree(revisedCharset); + taosMemoryFree(revisedCharset); + } // printf("charset not configured, set to system default:%s", outCharset); } else { - strcpy(outCharset, "UTF-8"); + (void)strcpy(outCharset, "UTF-8"); // printf("can't get locale and charset from system, set it to UTF-8"); } diff --git a/source/os/src/osMemory.c b/source/os/src/osMemory.c index 25567dfde0..761815aa2c 100644 --- a/source/os/src/osMemory.c +++ b/source/os/src/osMemory.c @@ -342,12 +342,7 @@ char *taosStrdup(const char *ptr) { return (char *)tmp + sizeof(TdMemoryInfo); #else - char *p = tstrdup(ptr); - if (ptr != NULL && NULL == p) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - } - return p; - + return tstrdup(ptr); #endif } diff --git a/source/os/src/osSemaphore.c b/source/os/src/osSemaphore.c index dd962a157f..e959174f11 100644 --- a/source/os/src/osSemaphore.c +++ b/source/os/src/osSemaphore.c @@ -194,18 +194,19 @@ int32_t taosGetAppName(char* name, int32_t* len) { const char* self = "/proc/self/exe"; char path[PATH_MAX] = {0}; - if (readlink(self, path, PATH_MAX) <= 0) { - return -1; + if (-1 == readlink(self, path, PATH_MAX)) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } path[PATH_MAX - 1] = 0; char* end = strrchr(path, '/'); if (end == NULL) { - return -1; + end = path; + } else { + ++end; } - - ++end; - + tstrncpy(name, end, TSDB_APP_NAME_LEN); if (len != NULL) { @@ -221,14 +222,22 @@ int32_t tsem_timewait(tsem_t* sem, int64_t ms) { struct timespec ts = {0}; if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { - return -1; + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } ts.tv_nsec += ms * 1000000; ts.tv_sec += ts.tv_nsec / 1000000000; ts.tv_nsec %= 1000000000; - while ((ret = sem_timedwait(sem, &ts)) == -1 && errno == EINTR) continue; + while ((ret = sem_timedwait(sem, &ts)) == -1 && errno == EINTR) { + continue; + } + + if (-1 == ret) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } return ret; } @@ -237,78 +246,113 @@ int32_t tsem_wait(tsem_t* sem) { int ret = 0; do { ret = sem_wait(sem); - } while (ret != 0 && errno == EINTR); + } while (-1 == ret && errno == EINTR); + + if (-1 == ret) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return ret; } int tsem2_init(tsem2_t* sem, int pshared, unsigned int value) { int ret = taosThreadMutexInit(&sem->mutex, NULL); if (ret != 0) return ret; + ret = taosThreadCondAttrInit(&sem->attr); - if (ret != 0) - { - taosThreadMutexDestroy(&sem->mutex); + if (ret != 0) { + (void)taosThreadMutexDestroy(&sem->mutex); return ret; } + ret = taosThreadCondAttrSetclock(&sem->attr, CLOCK_MONOTONIC); - if (ret != 0) - { - taosThreadMutexDestroy(&sem->mutex); - taosThreadCondAttrDestroy(&sem->attr); + if (ret != 0) { + (void)taosThreadMutexDestroy(&sem->mutex); + (void)taosThreadCondAttrDestroy(&sem->attr); return ret; } + ret = taosThreadCondInit(&sem->cond, &sem->attr); - if (ret != 0) - { - taosThreadMutexDestroy(&sem->mutex); - taosThreadCondAttrDestroy(&sem->attr); + if (ret != 0) { + (void)taosThreadMutexDestroy(&sem->mutex); + (void)taosThreadCondAttrDestroy(&sem->attr); return ret; } sem->count = value; + return 0; } int tsem2_post(tsem2_t *sem) { - taosThreadMutexLock(&sem->mutex); + int32_t code = taosThreadMutexLock(&sem->mutex); + if (code) { + return code; + } + sem->count++; - taosThreadCondSignal(&sem->cond); - taosThreadMutexUnlock(&sem->mutex); + code = taosThreadCondSignal(&sem->cond); + if (code) { + return code; + } + + code = taosThreadMutexUnlock(&sem->mutex); + if (code) { + return code; + } + return 0; } int tsem2_destroy(tsem2_t* sem) { - taosThreadMutexDestroy(&sem->mutex); - taosThreadCondDestroy(&sem->cond); - taosThreadCondAttrDestroy(&sem->attr); + (void)taosThreadMutexDestroy(&sem->mutex); + (void)taosThreadCondDestroy(&sem->cond); + (void)taosThreadCondAttrDestroy(&sem->attr); + return 0; } int32_t tsem2_wait(tsem2_t* sem) { - taosThreadMutexLock(&sem->mutex); + int32_t code = taosThreadMutexLock(&sem->mutex); + if (code) { + return code; + } + while (sem->count <= 0) { int ret = taosThreadCondWait(&sem->cond, &sem->mutex); if (0 == ret) { continue; } else { - taosThreadMutexUnlock(&sem->mutex); + (void)taosThreadMutexUnlock(&sem->mutex); return ret; } } sem->count--; - taosThreadMutexUnlock(&sem->mutex); + + code = taosThreadMutexUnlock(&sem->mutex); + if (code) { + return code; + } + return 0; } int32_t tsem2_timewait(tsem2_t* sem, int64_t ms) { int ret = 0; - taosThreadMutexLock(&sem->mutex); + ret = taosThreadMutexLock(&sem->mutex); + if (ret) { + return ret; + } + if (sem->count <= 0) { struct timespec ts = {0}; if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1) { - taosThreadMutexUnlock(&sem->mutex); - return -1; + ret = TAOS_SYSTEM_ERROR(errno); + (void)taosThreadMutexUnlock(&sem->mutex); + terrno = ret; + return ret; } ts.tv_sec += ms / 1000; @@ -319,14 +363,15 @@ int32_t tsem2_timewait(tsem2_t* sem, int64_t ms) { while (sem->count <= 0) { ret = taosThreadCondTimedWait(&sem->cond, &sem->mutex, &ts); if (ret != 0) { - taosThreadMutexUnlock(&sem->mutex); + (void)taosThreadMutexUnlock(&sem->mutex); return ret; } } } sem->count--; - taosThreadMutexUnlock(&sem->mutex); + + ret = taosThreadMutexUnlock(&sem->mutex); return ret; } diff --git a/source/os/src/osSignal.c b/source/os/src/osSignal.c index cb13523b24..7060b408ca 100644 --- a/source/os/src/osSignal.c +++ b/source/os/src/osSignal.c @@ -26,8 +26,8 @@ typedef void (*FWinSignalHandler)(int32_t signum); -void taosSetSignal(int32_t signum, FSignalHandler sigfp) { - if (signum == SIGUSR1) return; +int32_t taosSetSignal(int32_t signum, FSignalHandler sigfp) { + if (signum == SIGUSR1) return 0; // SIGHUP doesn't exist in windows, we handle it in the way of ctrlhandler if (signum == SIGHUP) { @@ -35,19 +35,26 @@ void taosSetSignal(int32_t signum, FSignalHandler sigfp) { } else { signal(signum, (FWinSignalHandler)sigfp); } + return 0; } -void taosIgnSignal(int32_t signum) { - if (signum == SIGUSR1 || signum == SIGHUP) return; +int32_t taosIgnSignal(int32_t signum) { + if (signum == SIGUSR1 || signum == SIGHUP) return 0; signal(signum, SIG_IGN); + + return 0; } -void taosDflSignal(int32_t signum) { - if (signum == SIGUSR1 || signum == SIGHUP) return; +int32_t taosDflSignal(int32_t signum) { + if (signum == SIGUSR1 || signum == SIGHUP) return 0; signal(signum, SIG_DFL); + + return 0; } -void taosKillChildOnParentStopped() {} +int32_t taosKillChildOnParentStopped() { + return 0; +} #else @@ -57,26 +64,55 @@ void taosKillChildOnParentStopped() {} typedef void (*FLinuxSignalHandler)(int32_t signum, siginfo_t *sigInfo, void *context); -void taosSetSignal(int32_t signum, FSignalHandler sigfp) { +int32_t taosSetSignal(int32_t signum, FSignalHandler sigfp) { struct sigaction act; - memset(&act, 0, sizeof(act)); + (void)memset(&act, 0, sizeof(act)); #if 1 act.sa_flags = SA_SIGINFO | SA_RESTART; act.sa_sigaction = (FLinuxSignalHandler)sigfp; #else act.sa_handler = sigfp; #endif - sigaction(signum, &act, NULL); + int32_t code = sigaction(signum, &act, NULL); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + + return code; } -void taosIgnSignal(int32_t signum) { signal(signum, SIG_IGN); } +int32_t taosIgnSignal(int32_t signum) { + sighandler_t h = signal(signum, SIG_IGN); + if (SIG_ERR == h) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } -void taosDflSignal(int32_t signum) { signal(signum, SIG_DFL); } + return 0; +} -void taosKillChildOnParentStopped() { +int32_t taosDflSignal(int32_t signum) { + sighandler_t h = signal(signum, SIG_DFL); + if (SIG_ERR == h) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + + return 0; +} + +int32_t taosKillChildOnParentStopped() { #ifndef _TD_DARWIN_64 - prctl(PR_SET_PDEATHSIG, SIGKILL); + int32_t code = prctl(PR_SET_PDEATHSIG, SIGKILL); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + + return code; #endif + return 0; } #endif diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c index faf1ecbfc7..1b0deb1819 100644 --- a/source/os/src/osSocket.c +++ b/source/os/src/osSocket.c @@ -122,18 +122,25 @@ int32_t taosCloseSocketNoCheck1(SocketFd fd) { #ifdef WINDOWS return closesocket(fd); #else - return close(fd); + int32_t code = close(fd); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return code; #endif } int32_t taosCloseSocket(TdSocketPtr *ppSocket) { int32_t code; if (ppSocket == NULL || *ppSocket == NULL || (*ppSocket)->fd < 0) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } code = taosCloseSocketNoCheck1((*ppSocket)->fd); (*ppSocket)->fd = -1; taosMemoryFree(*ppSocket); + return code; } @@ -259,8 +266,10 @@ int32_t taosSetNonblocking(TdSocketPtr pSocket, int32_t on) { int32_t taosSetSockOpt(TdSocketPtr pSocket, int32_t level, int32_t optname, void *optval, int32_t optlen) { if (pSocket == NULL || pSocket->fd < 0) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } + #ifdef WINDOWS #ifdef TCP_KEEPCNT if (level == SOL_SOCKET && optname == TCP_KEEPCNT) { @@ -288,7 +297,12 @@ int32_t taosSetSockOpt(TdSocketPtr pSocket, int32_t level, int32_t optname, void return setsockopt(pSocket->fd, level, optname, optval, optlen); #else - return setsockopt(pSocket->fd, level, optname, optval, (int)optlen); + int32_t code = setsockopt(pSocket->fd, level, optname, optval, (int)optlen); + if (-1 == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return code; #endif } @@ -321,7 +335,12 @@ uint32_t taosInetAddr(const char *ipAddr) { #endif } const char *taosInetNtoa(struct in_addr ipInt, char *dstStr, int32_t len) { - return inet_ntop(AF_INET, &ipInt, dstStr, len); + const char* r = inet_ntop(AF_INET, &ipInt, dstStr, len); + if (NULL == r) { + terrno = TAOS_SYSTEM_ERROR(errno); + } + + return r; } #ifndef SIGPIPE @@ -733,6 +752,7 @@ bool taosValidIpAndPort(uint32_t ip, uint16_t port) { struct sockaddr_in serverAdd; SocketFd fd; int32_t reuse; + int32_t code = 0; // printf("open tcp server socket:0x%x:%hu", ip, port); @@ -746,16 +766,17 @@ bool taosValidIpAndPort(uint32_t ip, uint16_t port) { serverAdd.sin_port = (uint16_t)htons(port); fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (fd < 0) { // exception - return false; - } else if (fd <= 2) { // in, out, err - taosCloseSocketNoCheck1(fd); + if (-1 == fd) { // exception + terrno = TAOS_SYSTEM_ERROR(errno); return false; } TdSocketPtr pSocket = (TdSocketPtr)taosMemoryMalloc(sizeof(TdSocket)); if (pSocket == NULL) { - taosCloseSocketNoCheck1(fd); + code = terrno; + (void)taosCloseSocketNoCheck1(fd); + terrno = code; + return false; } pSocket->refId = 0; @@ -764,19 +785,24 @@ bool taosValidIpAndPort(uint32_t ip, uint16_t port) { /* set REUSEADDR option, so the portnumber can be re-used */ reuse = 1; if (taosSetSockOpt(pSocket, SOL_SOCKET, SO_REUSEADDR, (void *)&reuse, sizeof(reuse)) < 0) { - // printf("setsockopt SO_REUSEADDR failed: %d (%s)", errno, strerror(errno)); - taosCloseSocket(&pSocket); + code = terrno; + (void)taosCloseSocket(&pSocket); + terrno = code; + return false; } + /* bind socket to server address */ - if (bind(pSocket->fd, (struct sockaddr *)&serverAdd, sizeof(serverAdd)) < 0) { - // printf("bind tcp server socket failed, 0x%x:%hu(%s)", ip, port, strerror(errno)); - taosCloseSocket(&pSocket); + if (-1 == bind(pSocket->fd, (struct sockaddr *)&serverAdd, sizeof(serverAdd))) { + code = TAOS_SYSTEM_ERROR(errno); + (void)taosCloseSocket(&pSocket); + terrno = code; return false; } - taosCloseSocket(&pSocket); + + (void)taosCloseSocket(&pSocket); + return true; - // return 0 == taosValidIp(ip) ? true : false; } #if 0 @@ -898,21 +924,24 @@ int64_t taosCopyFds(TdSocketPtr pSrcSocket, TdSocketPtr pDestSocket, int64_t len #endif // endif 0 -void taosBlockSIGPIPE() { +int32_t taosBlockSIGPIPE() { #ifdef WINDOWS - // ASSERT(0); + return 0; #else sigset_t signal_mask; - sigemptyset(&signal_mask); - sigaddset(&signal_mask, SIGPIPE); + (void)sigemptyset(&signal_mask); + (void)sigaddset(&signal_mask, SIGPIPE); int32_t rc = pthread_sigmask(SIG_BLOCK, &signal_mask, NULL); if (rc != 0) { - // printf("failed to block SIGPIPE"); + terrno = TAOS_SYSTEM_ERROR(rc); + return terrno; } + + return 0; #endif } -uint32_t taosGetIpv4FromFqdn(const char *fqdn) { +int32_t taosGetIpv4FromFqdn(const char *fqdn, uint32_t* ip) { #ifdef WINDOWS // Initialize Winsock WSADATA wsaData; @@ -923,6 +952,41 @@ uint32_t taosGetIpv4FromFqdn(const char *fqdn) { return 0xFFFFFFFF; } #endif + +#if defined(LINUX) + struct addrinfo hints = {0}; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + struct addrinfo *result = NULL; + bool inRetry = false; + + while (true) { + int32_t ret = getaddrinfo(fqdn, NULL, &hints, &result); + if (ret) { + if (EAI_AGAIN == ret && !inRetry) { + inRetry = true; + continue; + } else if (EAI_SYSTEM == ret) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + + terrno = TAOS_SYSTEM_ERROR(ret); + return terrno; + } + + struct sockaddr *sa = result->ai_addr; + struct sockaddr_in *si = (struct sockaddr_in *)sa; + struct in_addr ia = si->sin_addr; + + *ip = ia.s_addr; + + freeaddrinfo(result); + + return 0; + } +#else struct addrinfo hints = {0}; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; @@ -934,9 +998,9 @@ uint32_t taosGetIpv4FromFqdn(const char *fqdn) { struct sockaddr *sa = result->ai_addr; struct sockaddr_in *si = (struct sockaddr_in *)sa; struct in_addr ia = si->sin_addr; - uint32_t ip = ia.s_addr; + *ip = ia.s_addr; freeaddrinfo(result); - return ip; + return 0; } else { #ifdef EAI_SYSTEM if (ret == EAI_SYSTEM) { @@ -947,8 +1011,11 @@ uint32_t taosGetIpv4FromFqdn(const char *fqdn) { #else // printf("failed to get the ip address, fqdn:%s, ret:%d, since:%s", fqdn, ret, gai_strerror(ret)); #endif + + *ip = 0xFFFFFFFF; return 0xFFFFFFFF; } +#endif } int32_t taosGetFqdn(char *fqdn) { @@ -964,14 +1031,9 @@ int32_t taosGetFqdn(char *fqdn) { #endif char hostname[1024]; hostname[1023] = '\0'; - if (taosGetlocalhostname(hostname, 1023) == -1) { -#ifdef WINDOWS - printf("failed to get hostname, reason:%s\n", strerror(WSAGetLastError())); -#else - printf("failed to get hostname, reason:%s\n", strerror(errno)); -#endif - ASSERT(0); - return -1; + int32_t code = taosGetlocalhostname(hostname, 1023); + if (code) { + return code; } #ifdef __APPLE__ @@ -983,6 +1045,37 @@ int32_t taosGetFqdn(char *fqdn) { strcpy(fqdn, hostname); strcpy(fqdn + strlen(hostname), ".local"); #else // linux + +#endif // linux + +#if defined(LINUX) + + struct addrinfo hints = {0}; + struct addrinfo *result = NULL; + hints.ai_flags = AI_CANONNAME; + + while (true) { + int32_t ret = getaddrinfo(hostname, NULL, &hints, &result); + if (ret) { + if (EAI_AGAIN == ret) { + continue; + } else if (EAI_SYSTEM == ret) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + + terrno = TAOS_SYSTEM_ERROR(ret); + return terrno; + } + + break; + } + + (void)strcpy(fqdn, result->ai_canonname); + + freeaddrinfo(result); + +#else struct addrinfo hints = {0}; struct addrinfo *result = NULL; hints.ai_flags = AI_CANONNAME; @@ -994,24 +1087,36 @@ int32_t taosGetFqdn(char *fqdn) { } strcpy(fqdn, result->ai_canonname); freeaddrinfo(result); -#endif // linux + +#endif return 0; } void tinet_ntoa(char *ipstr, uint32_t ip) { - sprintf(ipstr, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24); + (void)sprintf(ipstr, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24); } -void taosIgnSIGPIPE() { signal(SIGPIPE, SIG_IGN); } +int32_t taosIgnSIGPIPE() { + sighandler_t h = signal(SIGPIPE, SIG_IGN); + if (SIG_ERR == h) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } -void taosSetMaskSIGPIPE() { + return 0; +} + +#if 0 + +int32_t taosSetMaskSIGPIPE() { #ifdef WINDOWS // ASSERT(0); #else sigset_t signal_mask; - sigemptyset(&signal_mask); - sigaddset(&signal_mask, SIGPIPE); + (void)sigemptyset(&signal_mask); + (void)sigaddset(&signal_mask, SIGPIPE); + int32_t rc = pthread_sigmask(SIG_SETMASK, &signal_mask, NULL); if (rc != 0) { // printf("failed to setmask SIGPIPE"); @@ -1019,7 +1124,6 @@ void taosSetMaskSIGPIPE() { #endif } -#if 0 int32_t taosGetSocketName(TdSocketPtr pSocket, struct sockaddr *destAddr, int *addrLen) { if (pSocket == NULL || pSocket->fd < 0) { return -1; @@ -1038,9 +1142,12 @@ int32_t taosCreateSocketWithTimeout(uint32_t timeout) { #else int fd; #endif + if ((fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { + terrno = TAOS_SYSTEM_ERROR(errno); return -1; } + #if defined(WINDOWS) if (0 != setsockopt(fd, IPPROTO_TCP, TCP_MAXRT, (char *)&timeout, sizeof(timeout))) { taosCloseSocketNoCheck1(fd); @@ -1055,8 +1162,10 @@ int32_t taosCreateSocketWithTimeout(uint32_t timeout) { //} #else // Linux like systems uint32_t conn_timeout_ms = timeout; - if (0 != setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, (char *)&conn_timeout_ms, sizeof(conn_timeout_ms))) { - taosCloseSocketNoCheck1(fd); + if (-1 == setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, (char *)&conn_timeout_ms, sizeof(conn_timeout_ms))) { + int32_t code = TAOS_SYSTEM_ERROR(errno); + (void)taosCloseSocketNoCheck1(fd); + terrno = code; return -1; } #endif diff --git a/source/os/src/osString.c b/source/os/src/osString.c index 99a3cdd03d..b0a3615ee5 100644 --- a/source/os/src/osString.c +++ b/source/os/src/osString.c @@ -28,7 +28,12 @@ char *tstrdup(const char *str) { #ifdef WINDOWS return _strdup(str); #else - return strdup(str); + char* p = strdup(str); + if (str != NULL && NULL == p) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + } + return p; + #endif } @@ -119,9 +124,15 @@ int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes) { //#endif } -TdUcs4 *tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4) { - ASSERT(taosMemorySize(target_ucs4) >= len_ucs4 * sizeof(TdUcs4)); - return memcpy(target_ucs4, source_ucs4, len_ucs4 * sizeof(TdUcs4)); +int32_t tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4) { + if (taosMemorySize(target_ucs4) < len_ucs4 * sizeof(TdUcs4)) { + terrno = TSDB_CODE_INVALID_PARA; + return terrno; + } + + (void)memcpy(target_ucs4, source_ucs4, len_ucs4 * sizeof(TdUcs4)); + + return TSDB_CODE_SUCCESS; } typedef struct { @@ -141,23 +152,28 @@ int32_t taosConvInit(void) { gConvMaxNum[1 - M2C] = 512; gConv[M2C] = taosMemoryCalloc(gConvMaxNum[M2C], sizeof(SConv)); + if (gConv[M2C] == NULL) { + return terrno; + } + gConv[1 - M2C] = taosMemoryCalloc(gConvMaxNum[1 - M2C], sizeof(SConv)); - if (gConv[M2C] == NULL || gConv[1 - M2C] == NULL) { + if (gConv[1 - M2C] == NULL) { taosMemoryFree(gConv[M2C]); - taosMemoryFree(gConv[1 - M2C]); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } for (int32_t i = 0; i < gConvMaxNum[M2C]; ++i) { gConv[M2C][i].conv = iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset); if ((iconv_t)-1 == gConv[M2C][i].conv || (iconv_t)0 == gConv[M2C][i].conv) { - return TAOS_SYSTEM_ERROR(errno); + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } } for (int32_t i = 0; i < gConvMaxNum[1 - M2C]; ++i) { gConv[1 - M2C][i].conv = iconv_open(tsCharset, DEFAULT_UNICODE_ENCODEC); if ((iconv_t)-1 == gConv[1 - M2C][i].conv || (iconv_t)0 == gConv[1 - M2C][i].conv) { - return TAOS_SYSTEM_ERROR(errno); + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } } @@ -167,10 +183,10 @@ int32_t taosConvInit(void) { void taosConvDestroy() { int8_t M2C = 0; for (int32_t i = 0; i < gConvMaxNum[M2C]; ++i) { - iconv_close(gConv[M2C][i].conv); + (void)iconv_close(gConv[M2C][i].conv); } for (int32_t i = 0; i < gConvMaxNum[1 - M2C]; ++i) { - iconv_close(gConv[1 - M2C][i].conv); + (void)iconv_close(gConv[1 - M2C][i].conv); } taosMemoryFreeClear(gConv[M2C]); taosMemoryFreeClear(gConv[1 - M2C]); @@ -182,9 +198,17 @@ iconv_t taosAcquireConv(int32_t *idx, ConvType type) { if (gConvMaxNum[type] <= 0) { *idx = -1; if (type == M2C) { - return iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset); + iconv_t c = iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset); + if ((iconv_t)-1 == c || (iconv_t)0 == c) { + terrno = TAOS_SYSTEM_ERROR(errno); + } + return c; } else { - return iconv_open(tsCharset, DEFAULT_UNICODE_ENCODEC); + iconv_t c = iconv_open(tsCharset, DEFAULT_UNICODE_ENCODEC); + if ((iconv_t)-1 == c || (iconv_t)0 == c) { + terrno = TAOS_SYSTEM_ERROR(errno); + } + return c; } } @@ -192,7 +216,7 @@ iconv_t taosAcquireConv(int32_t *idx, ConvType type) { int32_t used = atomic_add_fetch_32(&convUsed[type], 1); if (used > gConvMaxNum[type]) { used = atomic_sub_fetch_32(&convUsed[type], 1); - sched_yield(); + (void)sched_yield(); continue; } @@ -218,12 +242,12 @@ iconv_t taosAcquireConv(int32_t *idx, ConvType type) { void taosReleaseConv(int32_t idx, iconv_t conv, ConvType type) { if (idx < 0) { - iconv_close(conv); + (void)iconv_close(conv); return; } atomic_store_8(&gConv[type][idx].inUse, 0); - atomic_sub_fetch_32(&convUsed[type], 1); + (void)atomic_sub_fetch_32(&convUsed[type], 1); } bool taosMbsToUcs4(const char *mbs, size_t mbsLength, TdUcs4 *ucs4, int32_t ucs4_max_len, int32_t *len) { @@ -231,14 +255,21 @@ bool taosMbsToUcs4(const char *mbs, size_t mbsLength, TdUcs4 *ucs4, int32_t ucs4 printf("Nchar cannot be read and written without iconv, please install iconv library and recompile.\n"); return -1; #else - memset(ucs4, 0, ucs4_max_len); + (void)memset(ucs4, 0, ucs4_max_len); int32_t idx = -1; + int32_t code = 0; iconv_t conv = taosAcquireConv(&idx, M2C); + if ((iconv_t)-1 == conv || (iconv_t)0 == conv) { + return false; + } + size_t ucs4_input_len = mbsLength; size_t outLeft = ucs4_max_len; if (iconv(conv, (char **)&mbs, &ucs4_input_len, (char **)&ucs4, &outLeft) == -1) { + code = TAOS_SYSTEM_ERROR(errno); taosReleaseConv(idx, conv, M2C); + terrno = code; return false; } @@ -261,14 +292,23 @@ int32_t taosUcs4ToMbs(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs) { #else int32_t idx = -1; + int32_t code = 0; iconv_t conv = taosAcquireConv(&idx, C2M); + if ((iconv_t)-1 == conv || (iconv_t)0 == conv) { + return false; + } + size_t ucs4_input_len = ucs4_max_len; size_t outLen = ucs4_max_len; if (iconv(conv, (char **)&ucs4, &ucs4_input_len, &mbs, &outLen) == -1) { + code = TAOS_SYSTEM_ERROR(errno); taosReleaseConv(idx, conv, C2M); - return -1; + terrno = code; + return code; } + taosReleaseConv(idx, conv, C2M); + return (int32_t)(ucs4_max_len - outLen); #endif } @@ -282,8 +322,10 @@ int32_t taosUcs4ToMbsEx(TdUcs4 *ucs4, int32_t ucs4_max_len, char *mbs, iconv_t c size_t ucs4_input_len = ucs4_max_len; size_t outLen = ucs4_max_len; if (iconv(conv, (char **)&ucs4, &ucs4_input_len, &mbs, &outLen) == -1) { - return -1; + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } + return (int32_t)(ucs4_max_len - outLen); #endif } @@ -295,10 +337,11 @@ bool taosValidateEncodec(const char *encodec) { #else iconv_t cd = iconv_open(encodec, DEFAULT_UNICODE_ENCODEC); if (cd == (iconv_t)(-1)) { + terrno = TAOS_SYSTEM_ERROR(errno); return false; } - iconv_close(cd); + (void)iconv_close(cd); return true; #endif } @@ -323,11 +366,12 @@ int32_t taosUcs4len(TdUcs4 *ucs4) { // dst buffer size should be at least 2*len + 1 int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len) { if (!dst) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } for (int32_t i = 0; i < len; ++i) { - sprintf(dst + i * 2, "%02x", src[i]); + (void)sprintf(dst + i * 2, "%02x", src[i]); } return 0; @@ -335,7 +379,8 @@ int32_t taosHexEncode(const unsigned char *src, char *dst, int32_t len) { int32_t taosHexDecode(const char *src, char *dst, int32_t len) { if (!dst) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } uint8_t hn, ln, out; @@ -344,7 +389,7 @@ int32_t taosHexDecode(const char *src, char *dst, int32_t len) { ln = src[i + 1] > '9' ? src[i + 1] - 'a' + 10 : src[i + 1] - '0'; out = (hn << 4) | ln; - memcpy(dst + j, &out, 1); + (void)memcpy(dst + j, &out, 1); } return 0; @@ -518,11 +563,17 @@ int32_t taosHex2Ascii(const char *z, uint32_t n, void **data, uint32_t *size) { z += HEX_PREFIX_LEN; *size = n / HEX_PREFIX_LEN; if (*size == 0) { - if (!(*data = taosStrdup(""))) return -1; + if (!(*data = taosStrdup(""))) { + return terrno; + } return 0; } + uint8_t *tmp = (uint8_t *)taosMemoryCalloc(*size, 1); - if (tmp == NULL) return -1; + if (tmp == NULL) { + return terrno; + } + int8_t num = 0; uint8_t *byte = tmp + *size - 1; @@ -542,6 +593,7 @@ int32_t taosHex2Ascii(const char *z, uint32_t n, void **data, uint32_t *size) { } } *data = tmp; + return 0; } @@ -614,7 +666,10 @@ static char valueOf(uint8_t symbol) { int32_t taosAscii2Hex(const char *z, uint32_t n, void **data, uint32_t *size) { *size = n * 2 + HEX_PREFIX_LEN; uint8_t *tmp = (uint8_t *)taosMemoryCalloc(*size + 1, 1); - if (tmp == NULL) return -1; + if (tmp == NULL) { + return terrno; + } + *data = tmp; *(tmp++) = '\\'; *(tmp++) = 'x'; @@ -623,5 +678,6 @@ int32_t taosAscii2Hex(const char *z, uint32_t n, void **data, uint32_t *size) { tmp[i * 2] = valueOf(val >> 4); tmp[i * 2 + 1] = valueOf(val & 0x0F); } + return 0; } diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index 9bd60be2b6..aaaa9e2c2d 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -139,13 +139,14 @@ static void taosGetProcIOnfos() { tsStreamMax = TMAX(sysconf(_SC_STREAM_MAX), 0); tsProcId = (pid_t)syscall(SYS_gettid); - snprintf(tsProcMemFile, sizeof(tsProcMemFile), "/proc/%d/status", tsProcId); - snprintf(tsProcCpuFile, sizeof(tsProcCpuFile), "/proc/%d/stat", tsProcId); - snprintf(tsProcIOFile, sizeof(tsProcIOFile), "/proc/%d/io", tsProcId); + (void)snprintf(tsProcMemFile, sizeof(tsProcMemFile), "/proc/%d/status", tsProcId); + (void)snprintf(tsProcCpuFile, sizeof(tsProcCpuFile), "/proc/%d/stat", tsProcId); + (void)snprintf(tsProcIOFile, sizeof(tsProcIOFile), "/proc/%d/io", tsProcId); } #endif static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { + int32_t code = 0; #ifdef WINDOWS FILETIME pre_idleTime = {0}; FILETIME pre_kernelTime = {0}; @@ -168,29 +169,38 @@ static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) { #else TdFilePtr pFile = taosOpenFile(tsSysCpuFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - return -1; + return terrno; } char line[1024]; ssize_t bytes = taosGetsFile(pFile, sizeof(line), line); if (bytes < 0) { - taosCloseFile(&pFile); - return -1; + code = terrno; + (void)taosCloseFile(&pFile); + terrno = code; + return code; } char cpu[10] = {0}; - sscanf(line, + code = sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system, &cpuInfo->idle, &cpuInfo->wa, &cpuInfo->hi, &cpuInfo->si, &cpuInfo->st, &cpuInfo->guest, &cpuInfo->guest_nice); - - taosCloseFile(&pFile); + if (EOF == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + + (void)taosCloseFile(&pFile); #endif + return 0; } static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { + int32_t code = 0; + #ifdef WINDOWS FILETIME pre_krnlTm = {0}; FILETIME pre_usrTm = {0}; @@ -210,27 +220,35 @@ static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) { #else TdFilePtr pFile = taosOpenFile(tsProcCpuFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { - return -1; + return terrno; } char line[1024] = {0}; ssize_t bytes = taosGetsFile(pFile, sizeof(line), line); if (bytes < 0) { - taosCloseFile(&pFile); - return -1; + code = terrno; + (void)taosCloseFile(&pFile); + terrno = code; + return code; } for (int i = 0, blank = 0; line[i] != 0; ++i) { if (line[i] == ' ') blank++; if (blank == PROCESS_ITEM) { - sscanf(line + i + 1, "%" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, &cpuInfo->utime, &cpuInfo->stime, + code = sscanf(line + i + 1, "%" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, &cpuInfo->utime, &cpuInfo->stime, &cpuInfo->cutime, &cpuInfo->cstime); + if (EOF == code) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + break; } } - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); #endif + return 0; } @@ -256,10 +274,10 @@ void taosGetSystemInfo() { tsNumOfCores = sysconf(_SC_NPROCESSORS_ONLN); #else taosGetProcIOnfos(); - taosGetCpuCores(&tsNumOfCores, false); - taosGetTotalMemory(&tsTotalMemoryKB); - taosGetCpuUsage(NULL, NULL); - taosGetCpuInstructions(&tsSSE42Supported, &tsAVXSupported, &tsAVX2Supported, &tsFMASupported, &tsAVX512Supported); + (void)taosGetCpuCores(&tsNumOfCores, false); + (void)taosGetTotalMemory(&tsTotalMemoryKB); + (void)taosGetCpuUsage(NULL, NULL); + (void)taosGetCpuInstructions(&tsSSE42Supported, &tsAVXSupported, &tsAVX2Supported, &tsFMASupported, &tsAVX512Supported); #endif } @@ -291,14 +309,16 @@ int32_t taosGetEmail(char *email, int32_t maxLen) { #endif // CUS_PROMPT TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ); - if (pFile == NULL) return false; + if (pFile == NULL) return terrno; if (taosReadFile(pFile, (void *)email, maxLen) < 0) { - taosCloseFile(&pFile); - return -1; + int32_t code = terrno; + (void)taosCloseFile(&pFile); + return code; } - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); + return 0; #endif } @@ -372,13 +392,15 @@ int32_t taosGetOsReleaseName(char *releaseName, char* sName, char* ver, int32_t char line[1024]; char *dest = NULL; size_t size = 0; - int32_t code = -1; + int32_t code = 0; int32_t cnt = 0; TdFilePtr pFile = taosOpenFile("/etc/os-release", TD_FILE_READ | TD_FILE_STREAM); - if (pFile == NULL) return code; + if (pFile == NULL) { + return terrno; + } - while ((size = taosGetsFile(pFile, sizeof(line), line)) != -1) { + while ((size = taosGetsFile(pFile, sizeof(line), line)) > 0) { line[size - 1] = '\0'; if (strncmp(line, "NAME", 4) == 0) { dest = sName; @@ -401,7 +423,7 @@ int32_t taosGetOsReleaseName(char *releaseName, char* sName, char* ver, int32_t if (++cnt >= 3) break; } - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); return code; #endif } @@ -450,13 +472,13 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { char line[1024] = {0}; size_t size = 0; int32_t done = 0; - int32_t code = -1; + int32_t code = 0; float coreCount = 0; TdFilePtr pFile = taosOpenFile("/proc/cpuinfo", TD_FILE_READ | TD_FILE_STREAM); - if (pFile == NULL) return code; + if (pFile == NULL) return terrno; - while (done != 3 && (size = taosGetsFile(pFile, sizeof(line), line)) != -1) { + while (done != 3 && (size = taosGetsFile(pFile, sizeof(line), line)) > 0) { line[size - 1] = '\0'; if (((done & 1) == 0) && strncmp(line, "model name", 10) == 0) { const char *v = strchr(line, ':') + 2; @@ -471,13 +493,13 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { if (strncmp(line, "processor", 9) == 0) coreCount += 1; } - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); if (code != 0 && (done & 1) == 0) { TdFilePtr pFile1 = taosOpenFile("/proc/device-tree/model", TD_FILE_READ | TD_FILE_STREAM); if (pFile1 != NULL) { ssize_t bytes = taosGetsFile(pFile1, maxLen, cpuModel); - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); if (bytes > 0) { code = 0; done |= 1; @@ -487,7 +509,9 @@ int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) { if (code != 0 && (done & 1) == 0) { TdCmdPtr pCmd = taosOpenCmd("uname -a"); - if (pCmd == NULL) return code; + if (pCmd == NULL) { + return terrno; + } if (taosGetsCmd(pCmd, maxLen, cpuModel) > 0) { code = 0; done |= 1; @@ -516,11 +540,12 @@ static int32_t taosCntrGetCpuCores(float *numOfCores) { goto _sys; } char qline[32] = {0}; - if (taosGetsFile(pFile, sizeof(qline), qline) < 0) { - taosCloseFile(&pFile); + if (taosGetsFile(pFile, sizeof(qline), qline) <= 0) { + (void)taosCloseFile(&pFile); goto _sys; } - taosCloseFile(&pFile); + + (void)taosCloseFile(&pFile); float quota = taosStr2Float(qline, NULL); if (quota < 0) { goto _sys; @@ -529,12 +554,14 @@ static int32_t taosCntrGetCpuCores(float *numOfCores) { if (!(pFile = taosOpenFile(tsCpuPeriodFile, TD_FILE_READ | TD_FILE_STREAM))) { goto _sys; } + char pline[32] = {0}; - if (taosGetsFile(pFile, sizeof(pline), pline) < 0) { - taosCloseFile(&pFile); + if (taosGetsFile(pFile, sizeof(pline), pline) <= 0) { + (void)taosCloseFile(&pFile); goto _sys; } - taosCloseFile(&pFile); + + (void)taosCloseFile(&pFile); float period = taosStr2Float(pline, NULL); float quotaCores = quota / period; @@ -545,10 +572,13 @@ static int32_t taosCntrGetCpuCores(float *numOfCores) { *numOfCores = sysCores; } goto _end; + _sys: *numOfCores = sysconf(_SC_NPROCESSORS_ONLN); + _end: return 0; + #endif } @@ -565,7 +595,7 @@ int32_t taosGetCpuCores(float *numOfCores, bool physical) { if (physical) { *numOfCores = sysconf(_SC_NPROCESSORS_ONLN); } else { - taosCntrGetCpuCores(numOfCores); + (void)taosCntrGetCpuCores(numOfCores); } return 0; #endif @@ -684,14 +714,14 @@ int32_t taosGetProcMemory(int64_t *usedKB) { TdFilePtr pFile = taosOpenFile(tsProcMemFile, TD_FILE_READ | TD_FILE_STREAM); if (pFile == NULL) { // printf("open file:%s failed", tsProcMemFile); - return -1; + return terrno; } ssize_t bytes = 0; char line[1024] = {0}; while (!taosEOFFile(pFile)) { bytes = taosGetsFile(pFile, sizeof(line), line); - if (bytes < 0) { + if (bytes <= 0) { break; } if (strstr(line, "VmRSS:") != NULL) { @@ -700,9 +730,10 @@ int32_t taosGetProcMemory(int64_t *usedKB) { } char tmp[10]; - sscanf(line, "%s %" PRId64, tmp, usedKB); + (void)sscanf(line, "%s %" PRId64, tmp, usedKB); - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); + return 0; #endif } @@ -761,13 +792,14 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { } #else struct statvfs info; - if (statvfs(dataDir, &info)) { - // terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + if (-1 == statvfs(dataDir, &info)) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } else { diskSize->total = info.f_blocks * info.f_frsize; diskSize->avail = info.f_bavail * info.f_frsize; diskSize->used = diskSize->total - diskSize->avail; + return 0; } #endif @@ -792,7 +824,9 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int return 0; #else TdFilePtr pFile = taosOpenFile(tsProcIOFile, TD_FILE_READ | TD_FILE_STREAM); - if (pFile == NULL) return -1; + if (pFile == NULL) { + return terrno; + } ssize_t bytes = 0; char line[1024] = {0}; @@ -805,16 +839,16 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int break; } if (strstr(line, "rchar:") != NULL) { - sscanf(line, "%s %" PRId64, tmp, rchars); + (void)sscanf(line, "%s %" PRId64, tmp, rchars); readIndex++; } else if (strstr(line, "wchar:") != NULL) { - sscanf(line, "%s %" PRId64, tmp, wchars); + (void)sscanf(line, "%s %" PRId64, tmp, wchars); readIndex++; } else if (strstr(line, "read_bytes:") != NULL) { // read_bytes - sscanf(line, "%s %" PRId64, tmp, read_bytes); + (void)sscanf(line, "%s %" PRId64, tmp, read_bytes); readIndex++; } else if (strstr(line, "write_bytes:") != NULL) { // write_bytes - sscanf(line, "%s %" PRId64, tmp, write_bytes); + (void)sscanf(line, "%s %" PRId64, tmp, write_bytes); readIndex++; } else { } @@ -822,7 +856,7 @@ int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int if (readIndex >= 4) break; } - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); if (readIndex < 4) { return -1; @@ -876,7 +910,9 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { return 0; #else TdFilePtr pFile = taosOpenFile(tsSysNetFile, TD_FILE_READ | TD_FILE_STREAM); - if (pFile == NULL) return -1; + if (pFile == NULL) { + return terrno; + } ssize_t _bytes = 0; char line[1024]; @@ -895,7 +931,7 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { char nouse0[200] = {0}; _bytes = taosGetsFile(pFile, sizeof(line), line); - if (_bytes < 0) { + if (_bytes <= 0) { break; } @@ -905,7 +941,7 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { continue; } - sscanf(line, + (void)sscanf(line, "%s %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64, nouse0, &o_rbytes, &rpackts, &nouse1, &nouse2, &nouse3, &nouse4, &nouse5, &nouse6, &o_tbytes, &tpackets); @@ -913,7 +949,7 @@ int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes) { *transmit_bytes += o_tbytes; } - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); return 0; #endif @@ -951,8 +987,8 @@ void taosKillSystem() { exit(0); #else // SIGINT - printf("taosd will shut down soon"); - kill(tsProcId, 2); + (void)printf("taosd will shut down soon"); + (void)kill(tsProcId, 2); #endif } @@ -973,10 +1009,6 @@ int32_t taosGetSystemUUID(char *uid, int32_t uidlen) { // it's caller's responsibility to make enough space for `uid`, that's 36-char + 1-null uuid_unparse_lower(uuid, buf); int n = snprintf(uid, uidlen, "%.*s", (int)sizeof(buf), buf); // though less performance, much safer - if (n >= uidlen) { - // target buffer is too small - return -1; - } return 0; #else int len = 0; @@ -984,10 +1016,13 @@ int32_t taosGetSystemUUID(char *uid, int32_t uidlen) { // fd = open("/proc/sys/kernel/random/uuid", 0); TdFilePtr pFile = taosOpenFile("/proc/sys/kernel/random/uuid", TD_FILE_READ); if (pFile == NULL) { - return -1; + return terrno; } else { len = taosReadFile(pFile, uid, uidlen); - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); + if (len < 0) { + return len; + } } if (len >= 36) { @@ -1015,7 +1050,7 @@ char *taosGetCmdlineByPID(int pid) { return cmdline; #else static char cmdline[1024]; - sprintf(cmdline, "/proc/%d/cmdline", pid); + (void)sprintf(cmdline, "/proc/%d/cmdline", pid); // int fd = open(cmdline, O_RDONLY); TdFilePtr pFile = taosOpenFile(cmdline, TD_FILE_READ); @@ -1027,7 +1062,7 @@ char *taosGetCmdlineByPID(int pid) { cmdline[n] = 0; - taosCloseFile(&pFile); + (void)taosCloseFile(&pFile); } else { cmdline[0] = 0; } @@ -1041,9 +1076,13 @@ int64_t taosGetOsUptime() { #elif defined(_TD_DARWIN_64) #else struct sysinfo info; - if (0 == sysinfo(&info)) { - return (int64_t)info.uptime * 1000; + if (-1 == sysinfo(&info)) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } + + return (int64_t)info.uptime * 1000; + #endif return 0; } @@ -1093,7 +1132,7 @@ void taosSetCoreDump(bool enable) { int name[] = {CTL_KERN, KERN_CORE_USES_PID}; - memset(&args, 0, sizeof(struct __sysctl_args)); + (void)memset(&args, 0, sizeof(struct __sysctl_args)); args.name = name; args.nlen = sizeof(name) / sizeof(name[0]); args.oldval = &old_usespid; @@ -1113,7 +1152,7 @@ void taosSetCoreDump(bool enable) { old_usespid = 0; old_len = 0; - memset(&args, 0, sizeof(struct __sysctl_args)); + (void)memset(&args, 0, sizeof(struct __sysctl_args)); args.name = name; args.nlen = sizeof(name) / sizeof(name[0]); args.oldval = &old_usespid; @@ -1176,6 +1215,8 @@ SysNameInfo taosGetSysNameInfo() { tstrncpy(info.release, uts.release, sizeof(info.release)); tstrncpy(info.version, uts.version, sizeof(info.version)); tstrncpy(info.machine, uts.machine, sizeof(info.machine)); + } else { + terrno = TAOS_SYSTEM_ERROR(errno); } return info; @@ -1240,6 +1281,11 @@ int taosGetlocalhostname(char *hostname, size_t maxLen) { return 0; } #else - return gethostname(hostname, maxLen); + int r = gethostname(hostname, maxLen); + if (-1 == r) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return r; #endif } diff --git a/source/os/src/osSystem.c b/source/os/src/osSystem.c index 17d211a5ab..843ee20d5b 100644 --- a/source/os/src/osSystem.c +++ b/source/os/src/osSystem.c @@ -162,8 +162,8 @@ int taosSetConsoleEcho(bool on) { struct termios term; if (tcgetattr(STDIN_FILENO, &term) == -1) { - /*perror("Cannot get the attribution of the terminal");*/ - return -1; + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } if (on) @@ -172,18 +172,18 @@ int taosSetConsoleEcho(bool on) { term.c_lflag &= ~ECHOFLAGS; err = tcsetattr(STDIN_FILENO, TCSAFLUSH, &term); - if (err == -1 || err == EINTR) { - /*printf("Cannot set the attribution of the terminal");*/ - return -1; + if (err == -1) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } return 0; #endif } -void taosSetTerminalMode() { +int32_t taosSetTerminalMode() { #if defined(WINDOWS) - + return 0; #else struct termios newtio; @@ -192,7 +192,7 @@ void taosSetTerminalMode() { /* exit(EXIT_FAILURE); */ /* } */ - memcpy(&newtio, &oldtio, sizeof(oldtio)); + (void)memcpy(&newtio, &oldtio, sizeof(oldtio)); // Set new terminal attributes. newtio.c_iflag &= ~(IXON | IXOFF | ICRNL | INLCR | IGNCR | IMAXBEL | ISTRIP); @@ -207,10 +207,13 @@ void taosSetTerminalMode() { newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 0; - if (tcsetattr(0, TCSANOW, &newtio) != 0) { - fprintf(stderr, "Fail to set terminal properties!\n"); - exit(EXIT_FAILURE); + if (-1 == tcsetattr(0, TCSANOW, &newtio)) { + terrno = TAOS_SYSTEM_ERROR(errno); + (void)fprintf(stderr, "Fail to set terminal properties!\n"); + return terrno; } + + return 0; #endif } @@ -219,54 +222,75 @@ int32_t taosGetOldTerminalMode() { #else /* Make sure stdin is a terminal. */ if (!isatty(STDIN_FILENO)) { - return -1; + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } // Get the parameter of current terminal - if (tcgetattr(0, &oldtio) != 0) { - return -1; + if (-1 == tcgetattr(0, &oldtio)) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; } - return 1; + return 0; #endif } -void taosResetTerminalMode() { +int32_t taosResetTerminalMode() { #if defined(WINDOWS) #else - if (tcsetattr(0, TCSANOW, &oldtio) != 0) { - fprintf(stderr, "Fail to reset the terminal properties!\n"); - exit(EXIT_FAILURE); + if (-1 == tcsetattr(0, TCSANOW, &oldtio)) { + terrno = TAOS_SYSTEM_ERROR(errno); + (void)fprintf(stderr, "Fail to reset the terminal properties!\n"); + return terrno; } #endif + return 0; } TdCmdPtr taosOpenCmd(const char* cmd) { - if (cmd == NULL) return NULL; + if (cmd == NULL) { + terrno = TSDB_CODE_INVALID_PARA; + return NULL; + } + #ifdef WINDOWS return (TdCmdPtr)_popen(cmd, "r"); #else - return (TdCmdPtr)popen(cmd, "r"); + TdCmdPtr p = (TdCmdPtr)popen(cmd, "r"); + if (NULL == p) { + terrno = TAOS_SYSTEM_ERROR(errno); + } + return p; #endif } int64_t taosGetsCmd(TdCmdPtr pCmd, int32_t maxSize, char* __restrict buf) { if (pCmd == NULL || buf == NULL) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } if (fgets(buf, maxSize, (FILE*)pCmd) == NULL) { - return -1; + if (feof((FILE*)pCmd)) { + return 0; + } + + terrno = TAOS_SYSTEM_ERROR(ferror((FILE*)pCmd)); + return terrno; } + return strlen(buf); } int64_t taosGetLineCmd(TdCmdPtr pCmd, char** __restrict ptrBuf) { if (pCmd == NULL || ptrBuf == NULL) { - return -1; + terrno = TSDB_CODE_INVALID_PARA; + return terrno; } if (*ptrBuf != NULL) { taosMemoryFreeClear(*ptrBuf); } + #ifdef WINDOWS *ptrBuf = taosMemoryMalloc(1024); if (*ptrBuf == NULL) return -1; @@ -277,8 +301,13 @@ int64_t taosGetLineCmd(TdCmdPtr pCmd, char** __restrict ptrBuf) { (*ptrBuf)[1023] = 0; return strlen(*ptrBuf); #else - size_t len = 0; - return getline(ptrBuf, &len, (FILE*)pCmd); + ssize_t len = 0; + len = getline(ptrBuf, (size_t*)&len, (FILE*)pCmd); + if (-1 == len) { + terrno = TAOS_SYSTEM_ERROR(errno); + return terrno; + } + return len; #endif } @@ -289,15 +318,14 @@ int32_t taosEOFCmd(TdCmdPtr pCmd) { return feof((FILE*)pCmd); } -int64_t taosCloseCmd(TdCmdPtr* ppCmd) { +void taosCloseCmd(TdCmdPtr* ppCmd) { if (ppCmd == NULL || *ppCmd == NULL) { - return 0; + return; } #ifdef WINDOWS _pclose((FILE*)(*ppCmd)); #else - pclose((FILE*)(*ppCmd)); + (void)pclose((FILE*)(*ppCmd)); #endif *ppCmd = NULL; - return 0; } diff --git a/source/os/src/osThread.c b/source/os/src/osThread.c index d2519d06c1..133623ca3c 100644 --- a/source/os/src/osThread.c +++ b/source/os/src/osThread.c @@ -18,68 +18,159 @@ #include "os.h" int32_t taosThreadCreate(TdThread *tid, const TdThreadAttr *attr, void *(*start)(void *), void *arg) { - return pthread_create(tid, attr, start, arg); + int32_t code = pthread_create(tid, attr, start, arg); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } -int32_t taosThreadAttrDestroy(TdThreadAttr *attr) { return pthread_attr_destroy(attr); } +int32_t taosThreadAttrDestroy(TdThreadAttr *attr) { + int32_t code = pthread_attr_destroy(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} int32_t taosThreadAttrGetDetachState(const TdThreadAttr *attr, int32_t *detachstate) { - return pthread_attr_getdetachstate(attr, detachstate); + int32_t code = pthread_attr_getdetachstate(attr, detachstate); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrGetInheritSched(const TdThreadAttr *attr, int32_t *inheritsched) { - return pthread_attr_getinheritsched(attr, inheritsched); + int32_t code = pthread_attr_getinheritsched(attr, inheritsched); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrGetSchedParam(const TdThreadAttr *attr, struct sched_param *param) { - return pthread_attr_getschedparam(attr, param); + int32_t code = pthread_attr_getschedparam(attr, param); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrGetSchedPolicy(const TdThreadAttr *attr, int32_t *policy) { - return pthread_attr_getschedpolicy(attr, policy); + int32_t code = pthread_attr_getschedpolicy(attr, policy); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrGetScope(const TdThreadAttr *attr, int32_t *contentionscope) { - return pthread_attr_getscope(attr, contentionscope); + int32_t code = pthread_attr_getscope(attr, contentionscope); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrGetStackSize(const TdThreadAttr *attr, size_t *stacksize) { - return pthread_attr_getstacksize(attr, stacksize); + int32_t code = pthread_attr_getstacksize(attr, stacksize); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } -int32_t taosThreadAttrInit(TdThreadAttr *attr) { return pthread_attr_init(attr); } +int32_t taosThreadAttrInit(TdThreadAttr *attr) { + int32_t code = pthread_attr_init(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} int32_t taosThreadAttrSetDetachState(TdThreadAttr *attr, int32_t detachstate) { - return pthread_attr_setdetachstate(attr, detachstate); + int32_t code = pthread_attr_setdetachstate(attr, detachstate); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrSetInheritSched(TdThreadAttr *attr, int32_t inheritsched) { - return pthread_attr_setinheritsched(attr, inheritsched); + int32_t code = pthread_attr_setinheritsched(attr, inheritsched); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrSetSchedParam(TdThreadAttr *attr, const struct sched_param *param) { - return pthread_attr_setschedparam(attr, param); + int32_t code = pthread_attr_setschedparam(attr, param); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrSetSchedPolicy(TdThreadAttr *attr, int32_t policy) { - return pthread_attr_setschedpolicy(attr, policy); + int32_t code = pthread_attr_setschedpolicy(attr, policy); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrSetScope(TdThreadAttr *attr, int32_t contentionscope) { - return pthread_attr_setscope(attr, contentionscope); + int32_t code = pthread_attr_setscope(attr, contentionscope); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadAttrSetStackSize(TdThreadAttr *attr, size_t stacksize) { - return pthread_attr_setstacksize(attr, stacksize); + int32_t code = pthread_attr_setstacksize(attr, stacksize); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } -int32_t taosThreadCancel(TdThread thread) { return pthread_cancel(thread); } +int32_t taosThreadCancel(TdThread thread) { + int32_t code = pthread_cancel(thread); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} int32_t taosThreadCondDestroy(TdThreadCond *cond) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_cond_destroy(cond); + int32_t code = pthread_cond_destroy(cond); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -88,7 +179,12 @@ int32_t taosThreadCondInit(TdThreadCond *cond, const TdThreadCondAttr *attr) { InitializeConditionVariable(cond); return 0; #else - return pthread_cond_init(cond, attr); + int32_t code = pthread_cond_init(cond, attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -97,7 +193,12 @@ int32_t taosThreadCondSignal(TdThreadCond *cond) { WakeConditionVariable(cond); return 0; #else - return pthread_cond_signal(cond); + int32_t code = pthread_cond_signal(cond); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -106,7 +207,12 @@ int32_t taosThreadCondBroadcast(TdThreadCond *cond) { WakeAllConditionVariable(cond); return 0; #else - return pthread_cond_broadcast(cond); + int32_t code = pthread_cond_broadcast(cond); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -117,7 +223,12 @@ int32_t taosThreadCondWait(TdThreadCond *cond, TdThreadMutex *mutex) { } return 0; #else - return pthread_cond_wait(cond, mutex); + int32_t code = pthread_cond_wait(cond, mutex); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -130,7 +241,12 @@ int32_t taosThreadCondTimedWait(TdThreadCond *cond, TdThreadMutex *mutex, const } return EINVAL; #else - return pthread_cond_timedwait(cond, mutex, abstime); + int32_t code = pthread_cond_timedwait(cond, mutex, abstime); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -138,7 +254,12 @@ int32_t taosThreadCondAttrDestroy(TdThreadCondAttr *attr) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_condattr_destroy(attr); + int32_t code = pthread_condattr_destroy(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -147,7 +268,12 @@ int32_t taosThreadCondAttrGetPshared(const TdThreadCondAttr *attr, int32_t *psha if (pshared) *pshared = PTHREAD_PROCESS_PRIVATE; return 0; #else - return pthread_condattr_getpshared(attr, pshared); + int32_t code = pthread_condattr_getpshared(attr, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -155,7 +281,12 @@ int32_t taosThreadCondAttrInit(TdThreadCondAttr *attr) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_condattr_init(attr); + int32_t code = pthread_condattr_init(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -165,7 +296,12 @@ int32_t taosThreadCondAttrSetclock(TdThreadCondAttr *attr, int clockId) { #elif defined(__APPLE__) return 0; #else - return pthread_condattr_setclock(attr, clockId); + int32_t code = pthread_condattr_setclock(attr, clockId); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -173,31 +309,80 @@ int32_t taosThreadCondAttrSetPshared(TdThreadCondAttr *attr, int32_t pshared) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_condattr_setpshared(attr, pshared); + int32_t code = pthread_condattr_setpshared(attr, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } -int32_t taosThreadDetach(TdThread thread) { return pthread_detach(thread); } +int32_t taosThreadDetach(TdThread thread) { + int32_t code = pthread_detach(thread); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} -int32_t taosThreadEqual(TdThread t1, TdThread t2) { return pthread_equal(t1, t2); } +int32_t taosThreadEqual(TdThread t1, TdThread t2) { + return pthread_equal(t1, t2); +} -void taosThreadExit(void *valuePtr) { return pthread_exit(valuePtr); } +void taosThreadExit(void *valuePtr) { + return pthread_exit(valuePtr); +} int32_t taosThreadGetSchedParam(TdThread thread, int32_t *policy, struct sched_param *param) { - return pthread_getschedparam(thread, policy, param); + int32_t code = pthread_getschedparam(thread, policy, param); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } -void *taosThreadGetSpecific(TdThreadKey key) { return pthread_getspecific(key); } +void *taosThreadGetSpecific(TdThreadKey key) { + return pthread_getspecific(key); +} -int32_t taosThreadJoin(TdThread thread, void **valuePtr) { return pthread_join(thread, valuePtr); } +int32_t taosThreadJoin(TdThread thread, void **valuePtr) { + int32_t code = pthread_join(thread, valuePtr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} int32_t taosThreadKeyCreate(TdThreadKey *key, void (*destructor)(void *)) { - return pthread_key_create(key, destructor); + int32_t code = pthread_key_create(key, destructor); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } -int32_t taosThreadKeyDelete(TdThreadKey key) { return pthread_key_delete(key); } +int32_t taosThreadKeyDelete(TdThreadKey key) { + int32_t code = pthread_key_delete(key); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} -int32_t taosThreadKill(TdThread thread, int32_t sig) { return pthread_kill(thread, sig); } +int32_t taosThreadKill(TdThread thread, int32_t sig) { + int32_t code = pthread_kill(thread, sig); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} // int32_t taosThreadMutexConsistent(TdThreadMutex* mutex) { // return pthread_mutex_consistent(mutex); @@ -208,7 +393,12 @@ int32_t taosThreadMutexDestroy(TdThreadMutex *mutex) { DeleteCriticalSection(mutex); return 0; #else - return pthread_mutex_destroy(mutex); + int32_t code = pthread_mutex_destroy(mutex); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -222,7 +412,12 @@ int32_t taosThreadMutexInit(TdThreadMutex *mutex, const TdThreadMutexAttr *attr) InitializeCriticalSection(mutex); return 0; #else - return pthread_mutex_init(mutex, attr); + int32_t code = pthread_mutex_init(mutex, attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -231,7 +426,12 @@ int32_t taosThreadMutexLock(TdThreadMutex *mutex) { EnterCriticalSection(mutex); return 0; #else - return pthread_mutex_lock(mutex); + int32_t code = pthread_mutex_lock(mutex); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -244,7 +444,12 @@ int32_t taosThreadMutexTryLock(TdThreadMutex *mutex) { if (TryEnterCriticalSection(mutex)) return 0; return EBUSY; #else - return pthread_mutex_trylock(mutex); + int32_t code = pthread_mutex_trylock(mutex); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -253,7 +458,12 @@ int32_t taosThreadMutexUnlock(TdThreadMutex *mutex) { LeaveCriticalSection(mutex); return 0; #else - return pthread_mutex_unlock(mutex); + int32_t code = pthread_mutex_unlock(mutex); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -261,7 +471,12 @@ int32_t taosThreadMutexAttrDestroy(TdThreadMutexAttr *attr) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_mutexattr_destroy(attr); + int32_t code = pthread_mutexattr_destroy(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -270,7 +485,12 @@ int32_t taosThreadMutexAttrGetPshared(const TdThreadMutexAttr *attr, int32_t *ps if (pshared) *pshared = PTHREAD_PROCESS_PRIVATE; return 0; #else - return pthread_mutexattr_getpshared(attr, pshared); + int32_t code = pthread_mutexattr_getpshared(attr, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -283,7 +503,12 @@ int32_t taosThreadMutexAttrGetType(const TdThreadMutexAttr *attr, int32_t *kind) if (kind) *kind = PTHREAD_MUTEX_NORMAL; return 0; #else - return pthread_mutexattr_gettype(attr, kind); + int32_t code = pthread_mutexattr_gettype(attr, kind); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -291,7 +516,12 @@ int32_t taosThreadMutexAttrInit(TdThreadMutexAttr *attr) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_mutexattr_init(attr); + int32_t code = pthread_mutexattr_init(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -299,7 +529,12 @@ int32_t taosThreadMutexAttrSetPshared(TdThreadMutexAttr *attr, int32_t pshared) #ifdef __USE_WIN_THREAD return 0; #else - return pthread_mutexattr_setpshared(attr, pshared); + int32_t code = pthread_mutexattr_setpshared(attr, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -311,12 +546,22 @@ int32_t taosThreadMutexAttrSetType(TdThreadMutexAttr *attr, int32_t kind) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_mutexattr_settype(attr, kind); + int32_t code = pthread_mutexattr_settype(attr, kind); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } int32_t taosThreadOnce(TdThreadOnce *onceControl, void (*initRoutine)(void)) { - return pthread_once(onceControl, initRoutine); + int32_t code = pthread_once(onceControl, initRoutine); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } int32_t taosThreadRwlockDestroy(TdThreadRwlock *rwlock) { @@ -326,7 +571,12 @@ int32_t taosThreadRwlockDestroy(TdThreadRwlock *rwlock) { */ return 0; #else - return pthread_rwlock_destroy(rwlock); + int32_t code = pthread_rwlock_destroy(rwlock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -336,7 +586,12 @@ int32_t taosThreadRwlockInit(TdThreadRwlock *rwlock, const TdThreadRwlockAttr *a InitializeSRWLock(&rwlock->lock); return 0; #else - return pthread_rwlock_init(rwlock, attr); + int32_t code = pthread_rwlock_init(rwlock, attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -345,7 +600,12 @@ int32_t taosThreadRwlockRdlock(TdThreadRwlock *rwlock) { AcquireSRWLockShared(&rwlock->lock); return 0; #else - return pthread_rwlock_rdlock(rwlock); + int32_t code = pthread_rwlock_rdlock(rwlock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -362,7 +622,12 @@ int32_t taosThreadRwlockTryRdlock(TdThreadRwlock *rwlock) { if (!TryAcquireSRWLockShared(&rwlock->lock)) return EBUSY; return 0; #else - return pthread_rwlock_tryrdlock(rwlock); + int32_t code = pthread_rwlock_tryrdlock(rwlock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -372,7 +637,12 @@ int32_t taosThreadRwlockTryWrlock(TdThreadRwlock *rwlock) { atomic_store_8(&rwlock->excl, 1); return 0; #else - return pthread_rwlock_trywrlock(rwlock); + int32_t code = pthread_rwlock_trywrlock(rwlock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -385,7 +655,12 @@ int32_t taosThreadRwlockUnlock(TdThreadRwlock *rwlock) { } return 0; #else - return pthread_rwlock_unlock(rwlock); + int32_t code = pthread_rwlock_unlock(rwlock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -395,7 +670,12 @@ int32_t taosThreadRwlockWrlock(TdThreadRwlock *rwlock) { atomic_store_8(&rwlock->excl, 1); return 0; #else - return pthread_rwlock_wrlock(rwlock); + int32_t code = pthread_rwlock_wrlock(rwlock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -403,7 +683,12 @@ int32_t taosThreadRwlockAttrDestroy(TdThreadRwlockAttr *attr) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_rwlockattr_destroy(attr); + int32_t code = pthread_rwlockattr_destroy(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -412,7 +697,12 @@ int32_t taosThreadRwlockAttrGetPshared(const TdThreadRwlockAttr *attr, int32_t * if (pshared) *pshared = PTHREAD_PROCESS_PRIVATE; return 0; #else - return pthread_rwlockattr_getpshared(attr, pshared); + int32_t code = pthread_rwlockattr_getpshared(attr, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -420,7 +710,12 @@ int32_t taosThreadRwlockAttrInit(TdThreadRwlockAttr *attr) { #ifdef __USE_WIN_THREAD return 0; #else - return pthread_rwlockattr_init(attr); + int32_t code = pthread_rwlockattr_init(attr); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -428,27 +723,63 @@ int32_t taosThreadRwlockAttrSetPshared(TdThreadRwlockAttr *attr, int32_t pshared #ifdef __USE_WIN_THREAD return 0; #else - return pthread_rwlockattr_setpshared(attr, pshared); + int32_t code = pthread_rwlockattr_setpshared(attr, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } TdThread taosThreadSelf(void) { return pthread_self(); } -int32_t taosThreadSetCancelState(int32_t state, int32_t *oldstate) { return pthread_setcancelstate(state, oldstate); } - -int32_t taosThreadSetCancelType(int32_t type, int32_t *oldtype) { return pthread_setcanceltype(type, oldtype); } - -int32_t taosThreadSetSchedParam(TdThread thread, int32_t policy, const struct sched_param *param) { - return pthread_setschedparam(thread, policy, param); +int32_t taosThreadSetCancelState(int32_t state, int32_t *oldstate) { + int32_t code = pthread_setcancelstate(state, oldstate); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; } -int32_t taosThreadSetSpecific(TdThreadKey key, const void *value) { return pthread_setspecific(key, value); } +int32_t taosThreadSetCancelType(int32_t type, int32_t *oldtype) { + int32_t code = pthread_setcanceltype(type, oldtype); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} + +int32_t taosThreadSetSchedParam(TdThread thread, int32_t policy, const struct sched_param *param) { + int32_t code = pthread_setschedparam(thread, policy, param); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} + +int32_t taosThreadSetSpecific(TdThreadKey key, const void *value) { + int32_t code = pthread_setspecific(key, value); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; +} int32_t taosThreadSpinDestroy(TdThreadSpinlock *lock) { #ifdef TD_USE_SPINLOCK_AS_MUTEX return pthread_mutex_destroy((pthread_mutex_t *)lock); #else - return pthread_spin_destroy((pthread_spinlock_t *)lock); + int32_t code = pthread_spin_destroy((pthread_spinlock_t *)lock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -458,7 +789,12 @@ int32_t taosThreadSpinInit(TdThreadSpinlock *lock, int32_t pshared) { if (pshared != 0) return -1; return pthread_mutex_init((pthread_mutex_t *)lock, NULL); #else - return pthread_spin_init((pthread_spinlock_t *)lock, pshared); + int32_t code = pthread_spin_init((pthread_spinlock_t *)lock, pshared); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -466,7 +802,12 @@ int32_t taosThreadSpinLock(TdThreadSpinlock *lock) { #ifdef TD_USE_SPINLOCK_AS_MUTEX return pthread_mutex_lock((pthread_mutex_t *)lock); #else - return pthread_spin_lock((pthread_spinlock_t *)lock); + int32_t code = pthread_spin_lock((pthread_spinlock_t *)lock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -474,7 +815,12 @@ int32_t taosThreadSpinTrylock(TdThreadSpinlock *lock) { #ifdef TD_USE_SPINLOCK_AS_MUTEX return pthread_mutex_trylock((pthread_mutex_t *)lock); #else - return pthread_spin_trylock((pthread_spinlock_t *)lock); + int32_t code = pthread_spin_trylock((pthread_spinlock_t *)lock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } @@ -482,10 +828,19 @@ int32_t taosThreadSpinUnlock(TdThreadSpinlock *lock) { #ifdef TD_USE_SPINLOCK_AS_MUTEX return pthread_mutex_unlock((pthread_mutex_t *)lock); #else - return pthread_spin_unlock((pthread_spinlock_t *)lock); + int32_t code = pthread_spin_unlock((pthread_spinlock_t *)lock); + if (code) { + terrno = TAOS_SYSTEM_ERROR(code); + return terrno; + } + return code; #endif } -void taosThreadTestCancel(void) { return pthread_testcancel(); } +void taosThreadTestCancel(void) { + return pthread_testcancel(); +} -void taosThreadClear(TdThread *thread) { memset(thread, 0, sizeof(TdThread)); } +void taosThreadClear(TdThread *thread) { + (void)memset(thread, 0, sizeof(TdThread)); +} diff --git a/source/os/src/osTimezone.c b/source/os/src/osTimezone.c index 8780fb2bc2..ef45b773e8 100644 --- a/source/os/src/osTimezone.c +++ b/source/os/src/osTimezone.c @@ -945,7 +945,7 @@ void taosGetSystemTimezone(char *outTimezoneStr, enum TdTimezone *tsTimezone) { char buf[68] = {0}; if (pFile != NULL) { int len = taosReadFile(pFile, buf, 64); - if (len < 64 && taosGetErrorFile(pFile)) { + if (len < 0) { (void)taosCloseFile(&pFile); (void)printf("read /etc/timezone error, reason:%s", strerror(errno)); return; diff --git a/source/os/test/osTests.cpp b/source/os/test/osTests.cpp index 4d9ad9b5bd..f5a2394bbd 100644 --- a/source/os/test/osTests.cpp +++ b/source/os/test/osTests.cpp @@ -40,7 +40,8 @@ TEST(osTest, osFQDNSuccess) { char fqdn[1024]; char ipString[INET_ADDRSTRLEN]; int code = taosGetFqdn(fqdn); - uint32_t ipv4 = taosGetIpv4FromFqdn(fqdn); + uint32_t ipv4 = 0; + code = taosGetIpv4FromFqdn(fqdn, &ipv4); ASSERT_NE(ipv4, 0xffffffff); struct in_addr addr; @@ -54,8 +55,9 @@ TEST(osTest, osFQDNSuccess) { TEST(osTest, osFQDNFailed) { char fqdn[1024] = "fqdn_test_not_found"; char ipString[24]; - uint32_t ipv4 = taosGetIpv4FromFqdn(fqdn); - ASSERT_EQ(ipv4, 0xffffffff); + uint32_t ipv4 = 0; + int32_t code = taosGetIpv4FromFqdn(fqdn, &ipv4); + ASSERT_NE(code, 0); terrno = TSDB_CODE_RPC_FQDN_ERROR; printf("fqdn:%s transfer to ip failed!\n", fqdn); diff --git a/source/util/src/tbase58.c b/source/util/src/tbase58.c index 274249badf..b5d873f5ea 100644 --- a/source/util/src/tbase58.c +++ b/source/util/src/tbase58.c @@ -67,7 +67,7 @@ int32_t base58_encode(const uint8_t *value, int32_t vlen, char **result) { if (bfree) taosMemoryFree(pbuf); return TSDB_CODE_OUT_OF_MEMORY; } - memset(pResult, '1', nz); + (void)memset(pResult, '1', nz); while (pi != pbuf + size) pResult[nz++] = basis_58[*pi++]; if (bfree) taosMemoryFree(pbuf); @@ -152,7 +152,7 @@ int32_t base58_decode(const char *value, size_t inlen, int32_t *outlen, uint8_t return TSDB_CODE_OUT_OF_MEMORY; } - memset(pResult, 0, nz); + (void)memset(pResult, 0, nz); while (it != pbuf + size) pResult[nz++] = *it++; if (outlen) *outlen = nz; diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index b3e1da5f1c..42bedf01b7 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1219,7 +1219,7 @@ static RegexCache sRegexCache; #define REGEX_CACHE_CLEAR_TIME 30 static void checkRegexCache(void* param, void* tmrId) { - taosTmrReset(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, param, sRegexCache.regexCacheTmr, &tmrId); + (void)taosTmrReset(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, param, sRegexCache.regexCacheTmr, &tmrId); if (taosHashGetSize(sRegexCache.regexHash) < MAX_REGEX_CACHE_SIZE) { return; } @@ -1230,7 +1230,7 @@ static void checkRegexCache(void* param, void* tmrId) { if (taosGetTimestampSec() - (*ppUsingRegex)->lastUsedTime > REGEX_CACHE_CLEAR_TIME) { size_t len = 0; char* key = (char*)taosHashGetKey(ppUsingRegex, &len); - taosHashRemove(sRegexCache.regexHash, key, len); + (void)taosHashRemove(sRegexCache.regexHash, key, len); } ppUsingRegex = taosHashIterate(sRegexCache.regexHash, ppUsingRegex); } @@ -1267,7 +1267,7 @@ int32_t InitRegexCache() { void DestroyRegexCache(){ uInfo("[regex cache] destory regex cache"); - taosTmrStopA(&sRegexCache.timer); + (void)taosTmrStopA(&sRegexCache.timer); taosHashCleanup(sRegexCache.regexHash); taosTmrCleanUp(sRegexCache.regexCacheTmr); } @@ -1364,12 +1364,23 @@ static int32_t doExecRegexMatch(const char *pString, const char *pPattern) { int32_t comparestrRegexMatch(const void *pLeft, const void *pRight) { size_t sz = varDataLen(pRight); char *pattern = taosMemoryMalloc(sz + 1); - memcpy(pattern, varDataVal(pRight), varDataLen(pRight)); + if (NULL == pattern) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return 1; + } + + (void)memcpy(pattern, varDataVal(pRight), varDataLen(pRight)); pattern[sz] = 0; sz = varDataLen(pLeft); char *str = taosMemoryMalloc(sz + 1); - memcpy(str, varDataVal(pLeft), sz); + if (NULL == str) { + taosMemoryFree(pattern); + terrno = TSDB_CODE_OUT_OF_MEMORY; + return 1; + } + + (void)memcpy(str, varDataVal(pLeft), sz); str[sz] = 0; int32_t ret = doExecRegexMatch(str, pattern); @@ -1383,23 +1394,32 @@ int32_t comparestrRegexMatch(const void *pLeft, const void *pRight) { int32_t comparewcsRegexMatch(const void *pString, const void *pPattern) { size_t len = varDataLen(pPattern); char *pattern = taosMemoryMalloc(len + 1); + if (NULL == pattern) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + return 1; + } int convertLen = taosUcs4ToMbs((TdUcs4 *)varDataVal(pPattern), len, pattern); if (convertLen < 0) { taosMemoryFree(pattern); - return TSDB_CODE_APP_ERROR; + return (terrno = TSDB_CODE_APP_ERROR); } pattern[convertLen] = 0; len = varDataLen(pString); char *str = taosMemoryMalloc(len + 1); + if (NULL == str) { + taosMemoryFree(pattern); + terrno = TSDB_CODE_OUT_OF_MEMORY; + return 1; + } + convertLen = taosUcs4ToMbs((TdUcs4 *)varDataVal(pString), len, str); if (convertLen < 0) { taosMemoryFree(str); taosMemoryFree(pattern); - - return TSDB_CODE_APP_ERROR; + return (terrno = TSDB_CODE_APP_ERROR); } str[convertLen] = 0; diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c index 83a185adae..55bf9a5df2 100644 --- a/source/util/src/tconfig.c +++ b/source/util/src/tconfig.c @@ -1241,13 +1241,14 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { TAOS_RETURN(TAOS_SYSTEM_ERROR(errno)); } size_t fileSize = taosLSeekFile(pFile, 0, SEEK_END); - char *buf = taosMemoryMalloc(fileSize); + char *buf = taosMemoryMalloc(fileSize + 1); if (!buf) { taosCloseFile(&pFile); uError("load json file error: %s, failed to alloc memory", filepath); TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } + buf[fileSize] = 0; taosLSeekFile(pFile, 0, SEEK_SET); if (taosReadFile(pFile, buf, fileSize) <= 0) { taosCloseFile(&pFile); @@ -1277,7 +1278,7 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { if (itemValueString != NULL && itemName != NULL) { size_t itemNameLen = strlen(itemName); size_t itemValueStringLen = strlen(itemValueString); - cfgLineBuf = taosMemoryMalloc(itemNameLen + itemValueStringLen + 2); + cfgLineBuf = taosMemoryRealloc(cfgLineBuf, itemNameLen + itemValueStringLen + 3); if (NULL == cfgLineBuf) { code = TSDB_CODE_OUT_OF_MEMORY; goto _err_json; @@ -1286,7 +1287,6 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { memcpy(cfgLineBuf, itemName, itemNameLen); cfgLineBuf[itemNameLen] = ' '; memcpy(&cfgLineBuf[itemNameLen + 1], itemValueString, itemValueStringLen); - cfgLineBuf[itemNameLen + itemValueStringLen + 1] = '\0'; paGetToken(cfgLineBuf, &name, &olen); if (olen == 0) continue; @@ -1325,6 +1325,7 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) { TAOS_RETURN(TSDB_CODE_INVALID_PARA); } + taosMemoryFree(cfgLineBuf); uInfo("load from apoll url not implemented yet"); TAOS_RETURN(TSDB_CODE_SUCCESS); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 3801ae9ffd..61672478c9 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -156,6 +156,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_TSC_ENCODE_PARAM_ERROR, "Invalid encode param" TAOS_DEFINE_ERROR(TSDB_CODE_TSC_ENCODE_PARAM_NULL, "Not found compress param") TAOS_DEFINE_ERROR(TSDB_CODE_TSC_COMPRESS_PARAM_ERROR, "Invalid compress param") TAOS_DEFINE_ERROR(TSDB_CODE_TSC_COMPRESS_LEVEL_ERROR, "Invalid compress level param") +TAOS_DEFINE_ERROR(TSDB_CODE_TSC_FAIL_GENERATE_JSON, "failed to generate JSON") TAOS_DEFINE_ERROR(TSDB_CODE_TSC_INTERNAL_ERROR, "Internal error") diff --git a/source/util/src/tlist.c b/source/util/src/tlist.c index d4b7335832..5c59a33b40 100644 --- a/source/util/src/tlist.c +++ b/source/util/src/tlist.c @@ -163,4 +163,4 @@ SListNode *tdListNext(SListIter *pIter) { } return node; -} \ No newline at end of file +} diff --git a/source/util/src/tlosertree.c b/source/util/src/tlosertree.c index f85ab0ecad..0e24d54565 100644 --- a/source/util/src/tlosertree.c +++ b/source/util/src/tlosertree.c @@ -125,10 +125,10 @@ void tMergeTreeRebuild(SMultiwayMergeTreeInfo* pTree) { * display whole loser tree on screen for debug purpose only. */ void tMergeTreePrint(const SMultiwayMergeTreeInfo* pTree) { - printf("the value of loser tree:\t"); + (void)printf("the value of loser tree:\t"); for (int32_t i = 0; i < pTree->totalSources; ++i) { - printf("%d\t", pTree->pNode[i].index); + (void)printf("%d\t", pTree->pNode[i].index); } - printf("\n"); + (void)printf("\n"); } diff --git a/source/util/src/tmempool.c b/source/util/src/tmempool.c index 8a57715c22..2e8fdc2b17 100644 --- a/source/util/src/tmempool.c +++ b/source/util/src/tmempool.c @@ -42,7 +42,7 @@ mpool_h taosMemPoolInit(int32_t numOfBlock, int32_t blockSize) { uError("mempool malloc failed\n"); return NULL; } else { - memset(pool_p, 0, sizeof(pool_t)); + (void)memset(pool_p, 0, sizeof(pool_t)); } pool_p->blockSize = blockSize; @@ -58,9 +58,9 @@ mpool_h taosMemPoolInit(int32_t numOfBlock, int32_t blockSize) { return NULL; } - taosThreadMutexInit(&(pool_p->mutex), NULL); + (void)taosThreadMutexInit(&(pool_p->mutex), NULL); - memset(pool_p->pool, 0, (size_t)(blockSize * numOfBlock)); + (void)memset(pool_p->pool, 0, (size_t)(blockSize * numOfBlock)); for (i = 0; i < pool_p->numOfBlock; ++i) pool_p->freeList[i] = i; pool_p->first = 0; @@ -73,7 +73,7 @@ char *taosMemPoolMalloc(mpool_h handle) { char *pos = NULL; pool_t *pool_p = (pool_t *)handle; - taosThreadMutexLock(&(pool_p->mutex)); + (void)taosThreadMutexLock(&(pool_p->mutex)); if (pool_p->numOfFree > 0) { pos = pool_p->pool + pool_p->blockSize * (pool_p->freeList[pool_p->first]); @@ -82,7 +82,7 @@ char *taosMemPoolMalloc(mpool_h handle) { pool_p->numOfFree--; } - taosThreadMutexUnlock(&(pool_p->mutex)); + (void)taosThreadMutexUnlock(&(pool_p->mutex)); if (pos == NULL) uDebug("mempool: out of memory"); return pos; @@ -106,22 +106,22 @@ void taosMemPoolFree(mpool_h handle, char *pMem) { return; } - memset(pMem, 0, (size_t)pool_p->blockSize); + (void)memset(pMem, 0, (size_t)pool_p->blockSize); - taosThreadMutexLock(&pool_p->mutex); + (void)taosThreadMutexLock(&pool_p->mutex); pool_p->freeList[(pool_p->first + pool_p->numOfFree) % pool_p->numOfBlock] = index; pool_p->numOfFree++; - taosThreadMutexUnlock(&pool_p->mutex); + (void)taosThreadMutexUnlock(&pool_p->mutex); } void taosMemPoolCleanUp(mpool_h handle) { pool_t *pool_p = (pool_t *)handle; - taosThreadMutexDestroy(&pool_p->mutex); + (void)taosThreadMutexDestroy(&pool_p->mutex); if (pool_p->pool) taosMemoryFree(pool_p->pool); if (pool_p->freeList) taosMemoryFree(pool_p->freeList); - memset(pool_p, 0, sizeof(*pool_p)); + (void)memset(pool_p, 0, sizeof(*pool_p)); taosMemoryFree(pool_p); } diff --git a/source/util/src/tpagedbuf.c b/source/util/src/tpagedbuf.c index 8f3a80ded4..76cf067842 100644 --- a/source/util/src/tpagedbuf.c +++ b/source/util/src/tpagedbuf.c @@ -82,17 +82,20 @@ static char* doCompressData(void* data, int32_t srcSize, int32_t* dst, SDiskbase return data; } -static char* doDecompressData(void* data, int32_t srcSize, int32_t* dst, SDiskbasedBuf* pBuf) { // do nothing +static int32_t doDecompressData(void* data, int32_t srcSize, int32_t* dst, SDiskbasedBuf* pBuf) { // do nothing + int32_t code = 0; if (!pBuf->comp) { *dst = srcSize; - return data; + return code; } *dst = tsDecompressString(data, srcSize, 1, pBuf->assistBuf, pBuf->pageSize, ONE_STAGE_COMP, NULL, 0); if (*dst > 0) { memcpy(data, pBuf->assistBuf, *dst); + } else if (*dst < 0) { + return terrno; } - return data; + return code;; } static uint64_t allocateNewPositionInFile(SDiskbasedBuf* pBuf, size_t size) { @@ -189,7 +192,9 @@ static char* doFlushBufPage(SDiskbasedBuf* pBuf, SPageInfo* pg) { if (pg->length < size) { // 1. add current space to free list SPageDiskInfo dinfo = {.length = pg->length, .offset = offset}; - taosArrayPush(pBuf->pFree, &dinfo); + if (NULL == taosArrayPush(pBuf->pFree, &dinfo)) { + return NULL; + } // 2. allocate new position, and update the info offset = allocateNewPositionInFile(pBuf, size); @@ -258,8 +263,7 @@ static int32_t loadPageFromDisk(SDiskbasedBuf* pBuf, SPageInfo* pg) { pBuf->statis.loadPages += 1; int32_t fullSize = 0; - doDecompressData(pPage, pg->length, &fullSize, pBuf); - return 0; + return doDecompressData(pPage, pg->length, &fullSize, pBuf); } static SPageInfo* registerNewPageInfo(SDiskbasedBuf* pBuf, int32_t pageId) { @@ -279,7 +283,12 @@ static SPageInfo* registerNewPageInfo(SDiskbasedBuf* pBuf, int32_t pageId) { ppi->pn = NULL; ppi->dirty = false; - return *(SPageInfo**)taosArrayPush(pBuf->pIdList, &ppi); + SPageInfo** pRet = taosArrayPush(pBuf->pIdList, &ppi); + if (NULL == pRet) { + taosMemoryFree(ppi); + return NULL; + } + return *pRet; } static SListNode* getEldestUnrefedPage(SDiskbasedBuf* pBuf) { @@ -309,7 +318,7 @@ static char* evictBufPage(SDiskbasedBuf* pBuf) { } terrno = 0; - tdListPopNode(pBuf->lruList, pn); + (void)tdListPopNode(pBuf->lruList, pn); SPageInfo* d = *(SPageInfo**)pn->data; @@ -319,14 +328,18 @@ static char* evictBufPage(SDiskbasedBuf* pBuf) { return flushBufPage(pBuf, d); } -static void lruListPushFront(SList* pList, SPageInfo* pi) { - tdListPrepend(pList, &pi); +static int32_t lruListPushFront(SList* pList, SPageInfo* pi) { + int32_t code = tdListPrepend(pList, &pi); + if (TSDB_CODE_SUCCESS != code) { + return code; + } SListNode* front = tdListGetHead(pList); pi->pn = front; + return TSDB_CODE_SUCCESS; } static void lruListMoveToFront(SList* pList, SPageInfo* pi) { - tdListPopNode(pList, pi->pn); + (void)tdListPopNode(pList, pi->pn); tdListPrependNode(pList, pi->pn); } @@ -421,12 +434,22 @@ void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) { } SPageInfo* pi = NULL; + int32_t code = 0; if (listNEles(pBuf->freePgList) != 0) { SListNode* pItem = tdListPopHead(pBuf->freePgList); pi = *(SPageInfo**)pItem->data; pi->used = true; *pageId = pi->pageId; taosMemoryFreeClear(pItem); + code = lruListPushFront(pBuf->lruList, pi); + if (TSDB_CODE_SUCCESS != code) { + taosMemoryFree(pi); + if (newPage) { + taosMemoryFree(availablePage); + } + terrno = code; + return NULL; + } } else { // create a new pageinfo // register new id in this group *pageId = (++pBuf->allocateId); @@ -441,12 +464,24 @@ void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) { } // add to hash map - tSimpleHashPut(pBuf->all, pageId, sizeof(int32_t), &pi, POINTER_BYTES); - pBuf->totalBufSize += pBuf->pageSize; + int32_t code = tSimpleHashPut(pBuf->all, pageId, sizeof(int32_t), &pi, POINTER_BYTES); + + if (TSDB_CODE_SUCCESS == code) { + // add to LRU list + code = lruListPushFront(pBuf->lruList, pi); + } + if (TSDB_CODE_SUCCESS == code) { + pBuf->totalBufSize += pBuf->pageSize; + } else { + if (newPage) taosMemoryFree(availablePage); + (void)taosArrayPop(pBuf->pIdList); + (void)tSimpleHashRemove(pBuf->all, pageId, sizeof(int32_t)); + taosMemoryFree(pi); + terrno = code; + return NULL; + } } - // add to LRU list - lruListPushFront(pBuf->lruList, pi); pi->pData = availablePage; ((void**)pi->pData)[0] = pi; @@ -509,7 +544,12 @@ void* getBufPage(SDiskbasedBuf* pBuf, int32_t id) { // set the ptr to the new SPageInfo ((void**)((*pi)->pData))[0] = (*pi); - lruListPushFront(pBuf->lruList, *pi); + int32_t code = lruListPushFront(pBuf->lruList, *pi); + if (TSDB_CODE_SUCCESS != code) { + if (newPage) taosMemoryFree((*pi)->pData); + terrno = code; + return NULL; + } (*pi)->used = true; // some data has been flushed to disk, and needs to be loaded into buffer again. @@ -578,7 +618,10 @@ void destroyDiskbasedBuf(SDiskbasedBuf* pBuf) { pBuf->totalBufSize / 1024.0, pBuf->numOfPages, listNEles(pBuf->lruList) * pBuf->pageSize / 1024.0, listNEles(pBuf->lruList), pBuf->fileSize / 1024.0, pBuf->pageSize / 1024.0f, pBuf->id); - taosCloseFile(&pBuf->pFile); + int32_t code = taosCloseFile(&pBuf->pFile); + if (TSDB_CODE_SUCCESS != code) { + uDebug("WARNING tPage failed to close file when destroy disk basebuf: %s", pBuf->path); + } } else { uDebug("Paged buffer closed, total:%.2f Kb, no file created, %s", pBuf->totalBufSize / 1024.0, pBuf->id); } @@ -615,8 +658,8 @@ void destroyDiskbasedBuf(SDiskbasedBuf* pBuf) { taosArrayDestroy(pBuf->pIdList); - tdListFree(pBuf->lruList); - tdListFree(pBuf->freePgList); + (void)tdListFree(pBuf->lruList); + (void)tdListFree(pBuf->freePgList); taosArrayDestroy(pBuf->emptyDummyIdList); taosArrayDestroy(pBuf->pFree); @@ -654,9 +697,14 @@ void setBufPageCompressOnDisk(SDiskbasedBuf* pBuf, bool comp) { } } -void dBufSetBufPageRecycled(SDiskbasedBuf* pBuf, void* pPage) { +int32_t dBufSetBufPageRecycled(SDiskbasedBuf* pBuf, void* pPage) { SPageInfo* ppi = getPageInfoFromPayload(pPage); + int32_t code = tdListAppend(pBuf->freePgList, &ppi); + if (TSDB_CODE_SUCCESS != code) { + return code; + } + ppi->used = false; ppi->dirty = false; @@ -665,8 +713,7 @@ void dBufSetBufPageRecycled(SDiskbasedBuf* pBuf, void* pPage) { taosMemoryFreeClear(ppi->pData); taosMemoryFreeClear(pNode); ppi->pn = NULL; - - tdListAppend(pBuf->freePgList, &ppi); + return TSDB_CODE_SUCCESS; } void dBufSetPrintInfo(SDiskbasedBuf* pBuf) { pBuf->printStatis = true; } @@ -689,7 +736,7 @@ void dBufPrintStatis(const SDiskbasedBuf* pBuf) { #endif if (ps->loadPages > 0) { - printf( + (void)printf( "Get/Release pages:%d/%d, flushToDisk:%.2f Kb (%d Pages), loadFromDisk:%.2f Kb (%d Pages), avgPageSize:%.2f " "Kb\n", ps->getPages, ps->releasePages, ps->flushBytes / 1024.0f, ps->flushPages, ps->loadBytes / 1024.0f, diff --git a/source/util/src/tsimplehash.c b/source/util/src/tsimplehash.c index 4c7983a983..fddb3f354d 100644 --- a/source/util/src/tsimplehash.c +++ b/source/util/src/tsimplehash.c @@ -66,7 +66,6 @@ SSHashObj *tSimpleHashInit(size_t capacity, _hash_fn_t fn) { SSHashObj *pHashObj = (SSHashObj *)taosMemoryMalloc(sizeof(SSHashObj)); if (!pHashObj) { - terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } @@ -82,7 +81,6 @@ SSHashObj *tSimpleHashInit(size_t capacity, _hash_fn_t fn) { pHashObj->hashList = (SHNode **)taosMemoryCalloc(pHashObj->capacity, sizeof(void *)); if (!pHashObj->hashList) { taosMemoryFree(pHashObj); - terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } @@ -131,7 +129,6 @@ static SHNode *doCreateHashNode(SSHashObj *pHashObj, const void *key, size_t key uint32_t hashVal) { SHNode *pNewNode = doInternalAlloc(pHashObj, sizeof(SHNode) + keyLen + dataLen); if (!pNewNode) { - terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } @@ -148,23 +145,24 @@ static SHNode *doCreateHashNode(SSHashObj *pHashObj, const void *key, size_t key return pNewNode; } -static void tSimpleHashTableResize(SSHashObj *pHashObj) { +static int32_t tSimpleHashTableResize(SSHashObj *pHashObj) { + int32_t code = 0; if (!SHASH_NEED_RESIZE(pHashObj)) { - return; + return code; } int32_t newCapacity = (int32_t)(pHashObj->capacity << 1u); if (newCapacity > HASH_MAX_CAPACITY) { uDebug("current capacity:%" PRIzu ", maximum capacity:%" PRId32 ", no resize applied due to limitation is reached", pHashObj->capacity, (int32_t)HASH_MAX_CAPACITY); - return; + return code; } // int64_t st = taosGetTimestampUs(); void *pNewEntryList = taosMemoryRealloc(pHashObj->hashList, POINTER_BYTES * newCapacity); if (!pNewEntryList) { uWarn("hash resize failed due to out of memory, capacity remain:%zu", pHashObj->capacity); - return; + return terrno; } size_t inc = newCapacity - pHashObj->capacity; @@ -206,18 +204,22 @@ static void tSimpleHashTableResize(SSHashObj *pHashObj) { // uDebug("hash table resize completed, new capacity:%d, load factor:%f, elapsed time:%fms", // (int32_t)pHashObj->capacity, // ((double)pHashObj->size) / pHashObj->capacity, (et - st) / 1000.0); + return code; } int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, const void *data, size_t dataLen) { if (!pHashObj || !key) { - return -1; + return TSDB_CODE_FAILED; } uint32_t hashVal = (*pHashObj->hashFp)(key, (uint32_t)keyLen); // need the resize process, write lock applied if (SHASH_NEED_RESIZE(pHashObj)) { - tSimpleHashTableResize(pHashObj); + int32_t code = tSimpleHashTableResize(pHashObj); + if (TSDB_CODE_SUCCESS != code) { + return code; + } } int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); @@ -226,7 +228,7 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons if (!pNode) { SHNode *pNewNode = doCreateHashNode(pHashObj, key, keyLen, data, dataLen, hashVal); if (!pNewNode) { - return -1; + return terrno; } pHashObj->hashList[slot] = pNewNode; @@ -244,7 +246,7 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons if (!pNode) { SHNode *pNewNode = doCreateHashNode(pHashObj, key, keyLen, data, dataLen, hashVal); if (!pNewNode) { - return -1; + return terrno; } pNewNode->next = pHashObj->hashList[slot]; pHashObj->hashList[slot] = pNewNode; diff --git a/source/util/src/tstrbuild.c b/source/util/src/tstrbuild.c index 915f877fe8..54e815ee13 100644 --- a/source/util/src/tstrbuild.c +++ b/source/util/src/tstrbuild.c @@ -47,7 +47,7 @@ void taosStringBuilderDestroy(SStringBuilder* sb) { void taosStringBuilderAppend(SStringBuilder* sb, const void* data, size_t len) { taosStringBuilderEnsureCapacity(sb, len); - memcpy(sb->buf + sb->pos, data, len); + (void)memcpy(sb->buf + sb->pos, data, len); sb->pos += len; } @@ -59,7 +59,7 @@ void taosStringBuilderAppendChar(SStringBuilder* sb, char c) { void taosStringBuilderAppendStringLen(SStringBuilder* sb, const char* str, size_t len) { taosStringBuilderEnsureCapacity(sb, len); if(!sb->buf) return; - memcpy(sb->buf + sb->pos, str, len); + (void)memcpy(sb->buf + sb->pos, str, len); sb->pos += len; } diff --git a/tests/system-test/2-query/db.py b/tests/system-test/2-query/db.py index e2c056cd5b..588609e524 100644 --- a/tests/system-test/2-query/db.py +++ b/tests/system-test/2-query/db.py @@ -2,10 +2,12 @@ import taos import sys import datetime import inspect +import threading from util.log import * from util.sql import * from util.cases import * +from util.common import tdCom import random @@ -60,6 +62,33 @@ class TDTestCase: tdSql.query("show dnode 1 variables like '____debugFlag'") tdSql.checkRows(2) + def threadTest(self, threadID): + print(f"Thread {threadID} starting...") + tdsqln = tdCom.newTdSql() + for i in range(100): + tdsqln.query(f"desc db1.stb_1") + tdsqln.checkRows(3) + + print(f"Thread {threadID} finished.") + + def case3(self): + tdSql.execute("create database db1") + tdSql.execute("create table db1.stb (ts timestamp, c1 varchar(100)) tags(t1 int)") + tdSql.execute("create table db1.stb_1 using db1.stb tags(1)") + + threads = [] + for i in range(10): + t = threading.Thread(target=self.threadTest, args=(i,)) + threads.append(t) + t.start() + + for thread in threads: + print(f"Thread waitting for finish...") + thread.join() + + print(f"Mutithread test finished.") + + def run(self): # sourcery skip: extract-duplicate-method, remove-redundant-fstring tdSql.prepare(replica = self.replicaVar) @@ -70,6 +99,10 @@ class TDTestCase: tdLog.printNoPrefix("==========start case2 run ...............") self.case2() tdLog.printNoPrefix("==========end case2 run ...............") + + tdLog.printNoPrefix("==========start case3 run ...............") + self.case3() + tdLog.printNoPrefix("==========end case3 run ...............") def stop(self): tdSql.close() diff --git a/tools/shell/src/shellEngine.c b/tools/shell/src/shellEngine.c index e04566aadb..dbaf108e6a 100644 --- a/tools/shell/src/shellEngine.c +++ b/tools/shell/src/shellEngine.c @@ -1118,7 +1118,7 @@ void shellSourceFile(const char *file) { } char *line = taosMemoryMalloc(TSDB_MAX_ALLOWED_SQL_LEN + 1); - while ((read_len = taosGetsFile(pFile, TSDB_MAX_ALLOWED_SQL_LEN, line)) != -1) { + while ((read_len = taosGetsFile(pFile, TSDB_MAX_ALLOWED_SQL_LEN, line)) > 0) { if ( cmd_len + read_len >= TSDB_MAX_ALLOWED_SQL_LEN) { printf("read command line too long over 1M, ignore this line. cmd_len = %d read_len=%d \n", (int32_t)cmd_len, read_len); cmd_len = 0; diff --git a/utils/tsim/src/simParse.c b/utils/tsim/src/simParse.c index fbaf08bf3b..951a3ee903 100644 --- a/utils/tsim/src/simParse.c +++ b/utils/tsim/src/simParse.c @@ -198,7 +198,7 @@ SScript *simParseScript(char *fileName) { simResetParser(); while (!taosEOFFile(pFile)) { - if (taosGetsFile(pFile, sizeof(buffer) - 1, buffer) == -1) continue; + if (taosGetsFile(pFile, sizeof(buffer) - 1, buffer) <= 0) continue; lineNum++; int32_t cmdlen = (int32_t)strlen(buffer);