From 8c1c2a2f976fd49657ea1ff7beb5642e3c86a1bb Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 23 May 2023 17:47:17 +0800 Subject: [PATCH 01/62] fix:add grammar support --- source/libs/parser/inc/sql.y | 4 ++-- source/libs/parser/src/parAstCreater.c | 27 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 5918b488b4..4a457838d4 100755 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -530,9 +530,9 @@ cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) AS DATABASE db_name(C). cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) WITH META AS DATABASE db_name(C). { pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, A, &B, &C, true); } cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) - AS STABLE full_table_name(C). { pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, A, &B, C, false); } + AS STABLE full_table_name(C) where_clause_opt(D). { pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, A, &B, C, false, D); } cmd ::= CREATE TOPIC not_exists_opt(A) topic_name(B) - WITH META AS STABLE full_table_name(C). { pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, A, &B, C, true); } + WITH META AS STABLE full_table_name(C) where_clause_opt(D). { pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, A, &B, C, true, D); } cmd ::= DROP TOPIC exists_opt(A) topic_name(B). { pCxt->pRootNode = createDropTopicStmt(pCxt, A, &B); } cmd ::= DROP CONSUMER GROUP exists_opt(A) cgroup_name(B) ON topic_name(C). { pCxt->pRootNode = createDropCGroupStmt(pCxt, A, &B, &C); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 5a47ed731d..7258f6c415 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -1713,6 +1713,33 @@ SNode* createCreateTopicStmtUseTable(SAstCreateContext* pCxt, bool ignoreExists, COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); pStmt->ignoreExists = ignoreExists; pStmt->withMeta = withMeta; + +// SSelectStmt* pSelect = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); +// if (NULL == pSelect) { +// return TSDB_CODE_OUT_OF_MEMORY; +// } +// sprintf(pSelect->stmtName, "%p", pSelect); +// +// SRealTableNode* pRealTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); +// if (NULL == pRealTable) { +// nodesDestroyNode((SNode*)pSelect); +// return TSDB_CODE_OUT_OF_MEMORY; +// } +// snprintf(pRealTable->table.dbName, sizeof(pRealTable->table.dbName), "%s", pDb); +// snprintf(pRealTable->table.tableName, sizeof(pRealTable->table.tableName), "%s", pTable); +// snprintf(pRealTable->table.tableAlias, sizeof(pRealTable->table.tableAlias), "%s", pTable); +// pSelect->pFromTable = (SNode*)pRealTable; +// +// if (numOfProjs >= 0) { +// pSelect->pProjectionList = createProjectCols(numOfProjs, pProjCol); +// if (NULL == pSelect->pProjectionList) { +// nodesDestroyNode((SNode*)pSelect); +// return TSDB_CODE_OUT_OF_MEMORY; +// } +// } +// +// pStmt->pQuery = pSelect; + strcpy(pStmt->subDbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->subSTbName, ((SRealTableNode*)pRealTable)->table.tableName); nodesDestroyNode(pRealTable); From 8537e4e80e0bb24a11cc911a2d36a53e4438ef15 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 24 May 2023 18:26:55 +0800 Subject: [PATCH 02/62] feat:add tag filter for stable subscribe --- include/common/tmsg.h | 3 ++ include/libs/executor/executor.h | 2 ++ source/common/src/tmsg.c | 15 ++++++++++ source/dnode/mnode/impl/src/mndScheduler.c | 2 ++ source/dnode/mnode/impl/src/mndTopic.c | 2 ++ source/dnode/vnode/src/inc/tq.h | 2 ++ source/dnode/vnode/src/tq/tq.c | 27 +++++++++++------ source/dnode/vnode/src/tq/tqMeta.c | 20 +++++++++---- source/dnode/vnode/src/tq/tqRead.c | 35 +++++----------------- source/libs/executor/src/executil.c | 16 +++++++++- source/libs/parser/src/parTranslater.c | 1 + 11 files changed, 82 insertions(+), 43 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 1ea9714bf9..8fd09afb90 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1949,6 +1949,7 @@ typedef struct { char* ast; char subStbName[TSDB_TABLE_FNAME_LEN]; }; + char* subStbFilterAst; } SCMCreateTopicReq; int32_t tSerializeSCMCreateTopicReq(void* buf, int32_t bufLen, const SCMCreateTopicReq* pReq); @@ -2758,6 +2759,7 @@ static FORCE_INLINE int32_t tEncodeSMqRebVgReq(void** buf, const SMqRebVgReq* pR tlen += taosEncodeString(buf, pReq->qmsg); } else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) { tlen += taosEncodeFixedI64(buf, pReq->suid); + tlen += taosEncodeString(buf, pReq->qmsg); } return tlen; } @@ -2773,6 +2775,7 @@ static FORCE_INLINE void* tDecodeSMqRebVgReq(const void* buf, SMqRebVgReq* pReq) if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) { buf = taosDecodeString(buf, &pReq->qmsg); } else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) { + buf = taosDecodeString(buf, &pReq->qmsg); buf = taosDecodeFixedI64(buf, &pReq->suid); } return (void*)buf; diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index b7e6c42e3b..e3a75ecabc 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -82,6 +82,8 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers, int32_t v qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, uint64_t id); +int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* pTagCond, void* pTagIndexCond, SArray **tableList); + /** * set the task Id, usually used by message queue process * @param tinfo diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 7102e556cc..1eb73ab842 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -3841,6 +3841,10 @@ int32_t tSerializeSCMCreateTopicReq(void *buf, int32_t bufLen, const SCMCreateTo if (tEncodeI32(&encoder, strlen(pReq->sql)) < 0) return -1; if (tEncodeCStr(&encoder, pReq->sql) < 0) return -1; + if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { + if (tEncodeI32(&encoder, strlen(pReq->subStbFilterAst)) < 0) return -1; + if (tEncodeCStr(&encoder, pReq->subStbFilterAst) < 0) return -1; + } tEndEncode(&encoder); int32_t tlen = encoder.pos; @@ -3879,6 +3883,15 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR if (tDecodeCStrTo(&decoder, pReq->sql) < 0) return -1; } + if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { + if (tDecodeI32(&decoder, &astLen) < 0) return -1; + if (astLen > 0) { + pReq->subStbFilterAst = taosMemoryCalloc(1, astLen + 1); + if (pReq->subStbFilterAst == NULL) return -1; + if (tDecodeCStrTo(&decoder, pReq->subStbFilterAst) < 0) return -1; + } + } + tEndDecode(&decoder); tDecoderClear(&decoder); @@ -3889,6 +3902,8 @@ void tFreeSCMCreateTopicReq(SCMCreateTopicReq *pReq) { taosMemoryFreeClear(pReq->sql); if (TOPIC_SUB_TYPE__COLUMN == pReq->subType) { taosMemoryFreeClear(pReq->ast); + }else if(TOPIC_SUB_TYPE__TABLE == pReq->subType) { + taosMemoryFreeClear(pReq->subStbFilterAst); } } diff --git a/source/dnode/mnode/impl/src/mndScheduler.c b/source/dnode/mnode/impl/src/mndScheduler.c index 734f624be0..0248a195db 100644 --- a/source/dnode/mnode/impl/src/mndScheduler.c +++ b/source/dnode/mnode/impl/src/mndScheduler.c @@ -591,6 +591,8 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib terrno = TSDB_CODE_QRY_INVALID_INPUT; return -1; } + } else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE){ + pVgEp->qmsg = taosStrdup(pTopic->ast); } else { pVgEp->qmsg = taosStrdup(""); } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index f6da370916..7d71aae3f4 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -462,6 +462,8 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * topicObj.stbUid = pStb->uid; mndReleaseStb(pMnode, pStb); + topicObj.ast = taosStrdup(pCreate->ast); + topicObj.astLen = strlen(pCreate->ast) + 1; } /*} else if (pCreate->subType == TOPIC_SUB_TYPE__DB) {*/ /*topicObj.ast = NULL;*/ diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h index e431ca4a01..7895690f94 100644 --- a/source/dnode/vnode/src/inc/tq.h +++ b/source/dnode/vnode/src/inc/tq.h @@ -72,6 +72,8 @@ typedef struct { typedef struct { int64_t suid; + char* qmsg; // SubPlanToString + SNode* node; } STqExecTb; typedef struct { diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 311d637be8..be3d6bc614 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -70,6 +70,8 @@ static void destroyTqHandle(void* data) { } else if (pData->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { walCloseReader(pData->pWalReader); tqCloseReader(pData->execHandle.pTqReader); + taosMemoryFreeClear(pData->execHandle.execTb.qmsg); + nodesDestroyNode(pData->execHandle.execTb.node); } if(pData->msg != NULL) { rpcFreeCont(pData->msg->pCont); @@ -470,7 +472,6 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg STqHandle tqHandle = {0}; pHandle = &tqHandle; - uint64_t oldConsumerId = pHandle->consumerId; memcpy(pHandle->subKey, req.subKey, TSDB_SUBSCRIBE_KEY_LEN); pHandle->consumerId = req.newConsumerId; pHandle->epoch = -1; @@ -514,14 +515,22 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { pHandle->pWalReader = walOpenReader(pVnode->pWal, NULL); pHandle->execHandle.execTb.suid = req.suid; + pHandle->execHandle.execTb.qmsg = req.qmsg; + req.qmsg = NULL; - SArray* tbUidList = taosArrayInit(0, sizeof(int64_t)); - vnodeGetCtbIdList(pVnode, req.suid, tbUidList); - tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pVnode->config.vgId, req.suid); - for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) { - int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i); - tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid); + if (nodesStringToNode(pHandle->execHandle.execTb.qmsg, &pHandle->execHandle.execTb.node) != 0) { + tqError("nodesStringToNode error in sub stable, since %s", terrstr()); + return -1; } + + SArray* tbUidList = NULL; + ret = qGetTableList(req.suid, pVnode->pMeta, pVnode, pHandle->execHandle.execTb.node, NULL, &tbUidList); + if(ret != TDB_CODE_SUCCESS) { + tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, req.subKey, pHandle->consumerId); + taosArrayDestroy(tbUidList); + goto end; + } + tqDebug("vgId:%d, tq try to get ctb for stb subscribe, suid:%" PRId64, pVnode->config.vgId, req.suid); pHandle->execHandle.pTqReader = tqReaderOpen(pVnode); tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList); taosArrayDestroy(tbUidList); @@ -532,8 +541,8 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg } taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle)); - tqDebug("try to persist handle %s consumer:0x%" PRIx64 " , old consumer:0x%" PRIx64, req.subKey, - pHandle->consumerId, oldConsumerId); + tqDebug("try to persist handle %s consumer:0x%" PRIx64, req.subKey, + pHandle->consumerId); ret = tqMetaSaveHandle(pTq, req.subKey, pHandle); goto end; } else { diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index f3ecaa08f6..ee7af5b2bf 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -37,6 +37,7 @@ int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) { } } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (tEncodeI64(pEncoder, pHandle->execHandle.execTb.suid) < 0) return -1; + if (tEncodeCStr(pEncoder, pHandle->execHandle.execTb.qmsg) < 0) return -1; } tEndEncode(pEncoder); return pEncoder->pos; @@ -64,6 +65,7 @@ int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) { } } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (tDecodeI64(pDecoder, &pHandle->execHandle.execTb.suid) < 0) return -1; + if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.execTb.qmsg) < 0) return -1; } tEndDecode(pDecoder); return 0; @@ -336,13 +338,19 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { } else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) { handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL); - SArray* tbUidList = taosArrayInit(0, sizeof(int64_t)); - vnodeGetCtbIdList(pTq->pVnode, handle.execHandle.execTb.suid, tbUidList); - tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pTq->pVnode->config.vgId, handle.execHandle.execTb.suid); - for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) { - int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i); - tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid); + if (nodesStringToNode(handle.execHandle.execTb.qmsg, &handle.execHandle.execTb.node) != 0) { + tqError("nodesStringToNode error in sub stable, since %s", terrstr()); + return -1; } + + SArray* tbUidList = NULL; + int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, handle.execHandle.execTb.node, NULL, &tbUidList); + if(ret != TDB_CODE_SUCCESS) { + tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, handle.subKey, handle.consumerId); + taosArrayDestroy(tbUidList); + goto end; + } + tqDebug("vgId:%d, tq try to get ctb for stb subscribe, suid:%" PRId64, pTq->pVnode->config.vgId, handle.execHandle.execTb.suid); handle.execHandle.pTqReader = tqReaderOpen(pTq->pVnode); tqReaderSetTbUidList(handle.execHandle.pTqReader, tbUidList); taosArrayDestroy(tbUidList); diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index 1fbdb25528..38f5307384 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -1040,34 +1040,15 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) { } } else if (pTqHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (isAdd) { - SArray* qa = taosArrayInit(4, sizeof(tb_uid_t)); - SMetaReader mr = {0}; - metaReaderInit(&mr, pTq->pVnode->pMeta, 0); - for (int32_t i = 0; i < taosArrayGetSize(tbUidList); ++i) { - uint64_t* id = (uint64_t*)taosArrayGet(tbUidList, i); - - int32_t code = metaGetTableEntryByUidCache(&mr, *id); - if (code != TSDB_CODE_SUCCESS) { - tqError("failed to get table meta, uid:%" PRIu64 " code:%s", *id, tstrerror(terrno)); - continue; - } - - tDecoderClear(&mr.coder); - if (mr.me.type != TSDB_CHILD_TABLE || mr.me.ctbEntry.suid != pTqHandle->execHandle.execTb.suid) { - tqDebug("table uid %" PRId64 " does not add to tq handle", *id); - continue; - } - - tqDebug("table uid %" PRId64 " add to tq handle", *id); - taosArrayPush(qa, id); + SArray* list = NULL; + int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, pTqHandle->execHandle.execTb.node, NULL, &list); + if(ret != TDB_CODE_SUCCESS) { + tqError("qGetTableList in tqUpdateTbUidList error:%d handle %s consumer:0x%" PRIx64, ret, pTqHandle->subKey, pTqHandle->consumerId); + taosArrayDestroy(list); + return ret; } - - metaReaderClear(&mr); - if (taosArrayGetSize(qa) > 0) { - tqReaderAddTbUidList(pTqHandle->execHandle.pTqReader, qa); - } - - taosArrayDestroy(qa); + tqReaderSetTbUidList(pTqHandle->execHandle.pTqReader, list); + taosArrayDestroy(list); } else { tqReaderRemoveTbUidList(pTqHandle->execHandle.pTqReader, tbUidList); } diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index c51dc39b5b..1fb35ae271 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -935,6 +935,7 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN SArray* pBlockList = NULL; SSDataBlock* pResBlock = NULL; SScalarParam output = {0}; + SArray* pUidTagList = NULL; tagFilterAssist ctx = {0}; ctx.colHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK); @@ -954,7 +955,7 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)}; // int64_t stt = taosGetTimestampUs(); - SArray* pUidTagList = taosArrayInit(10, sizeof(STUidTagInfo)); + pUidTagList = taosArrayInit(10, sizeof(STUidTagInfo)); copyExistedUids(pUidTagList, pUidList); FilterCondType condType = checkTagCond(pTagCond); @@ -1121,6 +1122,19 @@ _end: return code; } +int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* pTagCond, void* pTagIndexCond, SArray **tableList){ + SScanPhysiNode node = {0}; + node.suid = suid; + node.uid = suid; + node.tableType = TSDB_SUPER_TABLE; + STableListInfo* pTableListInfo = tableListCreate(); + int code = getTableList(metaHandle, pVnode, &node, pTagCond, pTagIndexCond, pTableListInfo, "qGetTableList"); + *tableList = pTableListInfo->pTableList; + pTableListInfo->pTableList = NULL; + tableListDestroy(pTableListInfo); + return code; +} + size_t getTableTagsBufLen(const SNodeList* pGroups) { size_t keyLen = 0; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index f4c86d4849..f90fe59908 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -5764,6 +5764,7 @@ static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pS toName(pCxt->pParseCxt->acctId, pStmt->subDbName, pStmt->subSTbName, &name); tNameGetFullDbName(&name, pReq->subDbName); tNameExtractFullName(&name, pReq->subStbName); + code = nodesNodeToString(pStmt->pQuery, false, &pReq->subStbFilterAst, NULL); } else if ('\0' != pStmt->subDbName[0]) { pReq->subType = TOPIC_SUB_TYPE__DB; tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->subDbName, strlen(pStmt->subDbName)); From 357e86b9945c6a2765da47ddad6f6d82708a06ad Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 24 May 2023 18:59:47 +0800 Subject: [PATCH 03/62] feat:add tag filter for stable subscribe --- include/common/tmsg.h | 7 ++----- source/common/src/tmsg.c | 27 +++++++------------------- source/libs/parser/src/parTranslater.c | 4 +++- 3 files changed, 12 insertions(+), 26 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 8fd09afb90..a7de03fbce 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1945,11 +1945,8 @@ typedef struct { int8_t withMeta; char* sql; char subDbName[TSDB_DB_FNAME_LEN]; - union { - char* ast; - char subStbName[TSDB_TABLE_FNAME_LEN]; - }; - char* subStbFilterAst; + char* ast; + char subStbName[TSDB_TABLE_FNAME_LEN]; } SCMCreateTopicReq; int32_t tSerializeSCMCreateTopicReq(void* buf, int32_t bufLen, const SCMCreateTopicReq* pReq); diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index 1eb73ab842..cb4d0c9034 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -3832,19 +3832,16 @@ int32_t tSerializeSCMCreateTopicReq(void *buf, int32_t bufLen, const SCMCreateTo if (tEncodeI8(&encoder, pReq->withMeta) < 0) return -1; if (tEncodeCStr(&encoder, pReq->subDbName) < 0) return -1; if (TOPIC_SUB_TYPE__DB == pReq->subType) { - } else if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { - if (tEncodeCStr(&encoder, pReq->subStbName) < 0) return -1; } else { + if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { + if (tEncodeCStr(&encoder, pReq->subStbName) < 0) return -1; + } if (tEncodeI32(&encoder, strlen(pReq->ast)) < 0) return -1; if (tEncodeCStr(&encoder, pReq->ast) < 0) return -1; } if (tEncodeI32(&encoder, strlen(pReq->sql)) < 0) return -1; if (tEncodeCStr(&encoder, pReq->sql) < 0) return -1; - if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { - if (tEncodeI32(&encoder, strlen(pReq->subStbFilterAst)) < 0) return -1; - if (tEncodeCStr(&encoder, pReq->subStbFilterAst) < 0) return -1; - } tEndEncode(&encoder); int32_t tlen = encoder.pos; @@ -3866,9 +3863,10 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR if (tDecodeI8(&decoder, &pReq->withMeta) < 0) return -1; if (tDecodeCStrTo(&decoder, pReq->subDbName) < 0) return -1; if (TOPIC_SUB_TYPE__DB == pReq->subType) { - } else if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { - if (tDecodeCStrTo(&decoder, pReq->subStbName) < 0) return -1; } else { + if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { + if (tDecodeCStrTo(&decoder, pReq->subStbName) < 0) return -1; + } if (tDecodeI32(&decoder, &astLen) < 0) return -1; if (astLen > 0) { pReq->ast = taosMemoryCalloc(1, astLen + 1); @@ -3883,15 +3881,6 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR if (tDecodeCStrTo(&decoder, pReq->sql) < 0) return -1; } - if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { - if (tDecodeI32(&decoder, &astLen) < 0) return -1; - if (astLen > 0) { - pReq->subStbFilterAst = taosMemoryCalloc(1, astLen + 1); - if (pReq->subStbFilterAst == NULL) return -1; - if (tDecodeCStrTo(&decoder, pReq->subStbFilterAst) < 0) return -1; - } - } - tEndDecode(&decoder); tDecoderClear(&decoder); @@ -3900,10 +3889,8 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR void tFreeSCMCreateTopicReq(SCMCreateTopicReq *pReq) { taosMemoryFreeClear(pReq->sql); - if (TOPIC_SUB_TYPE__COLUMN == pReq->subType) { + if (TOPIC_SUB_TYPE__DB != pReq->subType) { taosMemoryFreeClear(pReq->ast); - }else if(TOPIC_SUB_TYPE__TABLE == pReq->subType) { - taosMemoryFreeClear(pReq->subStbFilterAst); } } diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index f90fe59908..7c11443acb 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -5764,7 +5764,9 @@ static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pS toName(pCxt->pParseCxt->acctId, pStmt->subDbName, pStmt->subSTbName, &name); tNameGetFullDbName(&name, pReq->subDbName); tNameExtractFullName(&name, pReq->subStbName); - code = nodesNodeToString(pStmt->pQuery, false, &pReq->subStbFilterAst, NULL); + if(pStmt->pQuery != NULL) { + code = nodesNodeToString(pStmt->pQuery, false, &pReq->ast, NULL); + } } else if ('\0' != pStmt->subDbName[0]) { pReq->subType = TOPIC_SUB_TYPE__DB; tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->subDbName, strlen(pStmt->subDbName)); From 2713f4f6d44eb0ed996995a43943dc66b913e024 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Thu, 25 May 2023 19:01:58 +0800 Subject: [PATCH 04/62] feat: support create topic as stable with conditions --- include/common/ttokendef.h | 1 + include/libs/nodes/cmdnodes.h | 1 + include/libs/qcom/query.h | 7 + source/common/src/tmsg.c | 8 +- source/libs/parser/inc/parAst.h | 2 +- source/libs/parser/inc/parUtil.h | 1 + source/libs/parser/src/parAstCreater.c | 40 +- source/libs/parser/src/parAstParser.c | 5 + source/libs/parser/src/parTranslater.c | 106 +- source/libs/parser/src/parUtil.c | 16 + source/libs/parser/src/sql.c | 1764 +++++++++---------- source/libs/parser/test/parInitialCTest.cpp | 9 + source/libs/qcom/src/queryUtil.c | 12 + tests/script/tsim/tmq/topic.sim | 10 + 14 files changed, 1059 insertions(+), 923 deletions(-) diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index 10b5328e6d..d1a8f6d0c6 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -347,6 +347,7 @@ #define TK_WAL 329 + #define TK_NK_SPACE 600 #define TK_NK_COMMENT 601 #define TK_NK_ILLEGAL 602 diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 2323d044ec..0c1946163a 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -358,6 +358,7 @@ typedef struct SCreateTopicStmt { bool ignoreExists; bool withMeta; SNode* pQuery; + SNode* pWhere; } SCreateTopicStmt; typedef struct SDropTopicStmt { diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h index 3841210076..5abb491d3e 100644 --- a/include/libs/qcom/query.h +++ b/include/libs/qcom/query.h @@ -51,6 +51,12 @@ typedef enum { TARGET_TYPE_OTHER, } ETargetType; +typedef enum { + TCOL_TYPE_COLUMN = 1, + TCOL_TYPE_TAG, + TCOL_TYPE_NONE, +} ETableColumnType; + #define QUERY_POLICY_VNODE 1 #define QUERY_POLICY_HYBRID 2 #define QUERY_POLICY_QNODE 3 @@ -257,6 +263,7 @@ void destroyQueryExecRes(SExecResult* pRes); int32_t dataConverToStr(char* str, int type, void* buf, int32_t bufSize, int32_t* len); char* parseTagDatatoJson(void* p); int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst); +void getColumnTypeFromMeta(STableMeta* pMeta, char* pName, ETableColumnType* pType); int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst); int32_t cloneSVreateTbReq(SVCreateTbReq* pSrc, SVCreateTbReq** pDst); void freeVgInfo(SDBVgInfo* vgInfo); diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c index cb4d0c9034..bc826b38da 100644 --- a/source/common/src/tmsg.c +++ b/source/common/src/tmsg.c @@ -3836,8 +3836,12 @@ int32_t tSerializeSCMCreateTopicReq(void *buf, int32_t bufLen, const SCMCreateTo if (TOPIC_SUB_TYPE__TABLE == pReq->subType) { if (tEncodeCStr(&encoder, pReq->subStbName) < 0) return -1; } - if (tEncodeI32(&encoder, strlen(pReq->ast)) < 0) return -1; - if (tEncodeCStr(&encoder, pReq->ast) < 0) return -1; + if (pReq->ast && strlen(pReq->ast) > 0) { + if (tEncodeI32(&encoder, strlen(pReq->ast)) < 0) return -1; + if (tEncodeCStr(&encoder, pReq->ast) < 0) return -1; + } else { + if (tEncodeI32(&encoder, 0) < 0) return -1; + } } if (tEncodeI32(&encoder, strlen(pReq->sql)) < 0) return -1; if (tEncodeCStr(&encoder, pReq->sql) < 0) return -1; diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index e08b77e681..9cfb469e68 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -206,7 +206,7 @@ SNode* createCreateTopicStmtUseQuery(SAstCreateContext* pCxt, bool ignoreExists, SNode* createCreateTopicStmtUseDb(SAstCreateContext* pCxt, bool ignoreExists, SToken* pTopicName, SToken* pSubDbName, bool withMeta); SNode* createCreateTopicStmtUseTable(SAstCreateContext* pCxt, bool ignoreExists, SToken* pTopicName, SNode* pRealTable, - bool withMeta); + bool withMeta, SNode* pWhere); SNode* createDropTopicStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SToken* pTopicName); SNode* createDropCGroupStmt(SAstCreateContext* pCxt, bool ignoreNotExists, const SToken* pCGroupId, SToken* pTopicName); SNode* createAlterLocalStmt(SAstCreateContext* pCxt, const SToken* pConfig, const SToken* pValue); diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h index 850571eea1..9632ccf0fb 100644 --- a/source/libs/parser/inc/parUtil.h +++ b/source/libs/parser/inc/parUtil.h @@ -115,6 +115,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); #ifdef __cplusplus } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 7258f6c415..5ebafaa9f9 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -822,16 +822,9 @@ SNode* addFillClause(SAstCreateContext* pCxt, SNode* pStmt, SNode* pFill) { SNode* createSelectStmt(SAstCreateContext* pCxt, bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { CHECK_PARSER_STATUS(pCxt); - SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); + SNode* select = createSelectStmtImpl(isDistinct, pProjectionList, pTable); CHECK_OUT_OF_MEM(select); - select->isDistinct = isDistinct; - select->pProjectionList = pProjectionList; - select->pFromTable = pTable; - sprintf(select->stmtName, "%p", select); - select->isTimeLineResult = true; - select->onlyHasKeepOrderFunc = true; - select->timeRange = TSWINDOW_INITIALIZER; - return (SNode*)select; + return select; } static void setSubquery(SNode* pStmt) { @@ -1703,7 +1696,7 @@ SNode* createCreateTopicStmtUseDb(SAstCreateContext* pCxt, bool ignoreExists, ST } SNode* createCreateTopicStmtUseTable(SAstCreateContext* pCxt, bool ignoreExists, SToken* pTopicName, SNode* pRealTable, - bool withMeta) { + bool withMeta, SNode* pWhere) { CHECK_PARSER_STATUS(pCxt); if (!checkTopicName(pCxt, pTopicName)) { return NULL; @@ -1713,32 +1706,7 @@ SNode* createCreateTopicStmtUseTable(SAstCreateContext* pCxt, bool ignoreExists, COPY_STRING_FORM_ID_TOKEN(pStmt->topicName, pTopicName); pStmt->ignoreExists = ignoreExists; pStmt->withMeta = withMeta; - -// SSelectStmt* pSelect = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); -// if (NULL == pSelect) { -// return TSDB_CODE_OUT_OF_MEMORY; -// } -// sprintf(pSelect->stmtName, "%p", pSelect); -// -// SRealTableNode* pRealTable = (SRealTableNode*)nodesMakeNode(QUERY_NODE_REAL_TABLE); -// if (NULL == pRealTable) { -// nodesDestroyNode((SNode*)pSelect); -// return TSDB_CODE_OUT_OF_MEMORY; -// } -// snprintf(pRealTable->table.dbName, sizeof(pRealTable->table.dbName), "%s", pDb); -// snprintf(pRealTable->table.tableName, sizeof(pRealTable->table.tableName), "%s", pTable); -// snprintf(pRealTable->table.tableAlias, sizeof(pRealTable->table.tableAlias), "%s", pTable); -// pSelect->pFromTable = (SNode*)pRealTable; -// -// if (numOfProjs >= 0) { -// pSelect->pProjectionList = createProjectCols(numOfProjs, pProjCol); -// if (NULL == pSelect->pProjectionList) { -// nodesDestroyNode((SNode*)pSelect); -// return TSDB_CODE_OUT_OF_MEMORY; -// } -// } -// -// pStmt->pQuery = pSelect; + pStmt->pWhere = pWhere; strcpy(pStmt->subDbName, ((SRealTableNode*)pRealTable)->table.dbName); strcpy(pStmt->subSTbName, ((SRealTableNode*)pRealTable)->table.tableName); diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index 5db1f5dbdb..dea0c4bd50 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -355,6 +355,11 @@ static int32_t collectMetaKeyFromCreateTopic(SCollectMetaKeyCxt* pCxt, SCreateTo if (NULL != pStmt->pQuery) { return collectMetaKeyFromQuery(pCxt, pStmt->pQuery); } + if (NULL != pStmt->pWhere) { + int32_t code = collectMetaKeyFromRealTableImpl(pCxt, pStmt->subDbName, pStmt->subSTbName, + AUTH_TYPE_READ); + return code; + } return TSDB_CODE_SUCCESS; } diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 7c11443acb..6de1bd4b85 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -55,6 +55,13 @@ typedef struct STranslateContext { bool showRewrite; } STranslateContext; +typedef struct SBuildTopicContext { + bool colExists; + bool colNotFound; + STableMeta* pMeta; + SNodeList* pTags; +} SBuildTopicContext; + typedef struct SFullDatabaseName { char fullDbName[TSDB_DB_FNAME_LEN]; } SFullDatabaseName; @@ -5789,12 +5796,107 @@ static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pS return code; } +static int32_t addTagList(SNodeList** ppList, SNode* pNode) { + if (NULL == *ppList) { + *ppList = nodesMakeList(); + } + + nodesListStrictAppend(*ppList, pNode); + + return TSDB_CODE_SUCCESS; +} + +static EDealRes checkColumnTagsInCond(SNode* pNode, void* pContext) { + SBuildTopicContext* pCxt = (SBuildTopicContext*)pContext; + if (QUERY_NODE_COLUMN == nodeType(pNode)) { + ETableColumnType type; + getColumnTypeFromMeta(pCxt->pMeta, ((SColumnNode*)pNode)->colName, &type); + if (type == TCOL_TYPE_COLUMN) { + pCxt->colExists = true; + return DEAL_RES_ERROR; + } else if (type == TCOL_TYPE_TAG) { + addTagList(&pCxt->pTags, nodesCloneNode(pNode)); + } else { + pCxt->colNotFound = true; + return DEAL_RES_ERROR; + } + } else if (QUERY_NODE_FUNCTION == nodeType(pNode)) { + SFunctionNode* pFunc = (SFunctionNode*)pNode; + if (0 == strcasecmp(pFunc->functionName, "tbname")) { + addTagList(&pCxt->pTags, nodesCloneNode(pNode)); + } + } + + return DEAL_RES_CONTINUE; +} + +static int32_t checkCollectTopicTags(STranslateContext* pCxt, SCreateTopicStmt* pStmt, STableMeta* pMeta, SNodeList** ppProjection) { + SBuildTopicContext colCxt = {.colExists = false, .colNotFound = false, .pMeta = pMeta, .pTags = NULL}; + nodesWalkExprPostOrder(pStmt->pWhere, checkColumnTagsInCond, &colCxt); + if (colCxt.colNotFound) { + nodesDestroyList(colCxt.pTags); + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, "Invalid column name"); + } else if (colCxt.colExists) { + nodesDestroyList(colCxt.pTags); + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, "Columns are forbidden in where clause"); + } + if (NULL == colCxt.pTags) { + for (int32_t i = 0; i < pMeta->tableInfo.numOfTags; ++i) { + SSchema* tag = &pMeta->schema[pMeta->tableInfo.numOfColumns + i]; + SColumnNode* col = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN); + strcpy(col->colName, tag->name); + strcpy(col->node.aliasName, col->colName); + strcpy(col->node.userAlias, col->colName); + addTagList(&colCxt.pTags, (SNode*)col); + } + } + + *ppProjection = colCxt.pTags; + return TSDB_CODE_SUCCESS; +} + +static int32_t buildQueryForTableTopic(STranslateContext* pCxt, SCreateTopicStmt* pStmt, SNode** pSelect) { + SParseContext* pParCxt = pCxt->pParseCxt; + SRequestConnInfo connInfo = {.pTrans = pParCxt->pTransporter, + .requestId = pParCxt->requestId, + .requestObjRefId = pParCxt->requestRid, + .mgmtEps = pParCxt->mgmtEpSet}; + SName name; + STableMeta* pMeta = NULL; + int32_t code = getTableMetaImpl(pCxt, toName(pParCxt->acctId, pStmt->subDbName, pStmt->subSTbName, &name), &pMeta); + if (code) { + taosMemoryFree(pMeta); + return code; + } + if (TSDB_SUPER_TABLE != pMeta->tableType) { + taosMemoryFree(pMeta); + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, "Only supertable table can be used"); + } + + SNodeList* pProjection = 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); + ((SSelectStmt*)*pSelect)->pWhere = nodesCloneNode(pStmt->pWhere); + code = translateQuery(pCxt, *pSelect); + } + + taosMemoryFree(pMeta); + return code; +} + static int32_t checkCreateTopic(STranslateContext* pCxt, SCreateTopicStmt* pStmt) { - if (NULL == pStmt->pQuery) { + if (NULL == pStmt->pQuery && NULL == pStmt->pWhere) { return TSDB_CODE_SUCCESS; } - if (QUERY_NODE_SELECT_STMT == nodeType(pStmt->pQuery)) { + if (pStmt->pWhere) { + return buildQueryForTableTopic(pCxt, pStmt, &pStmt->pQuery); + } else if (QUERY_NODE_SELECT_STMT == nodeType(pStmt->pQuery)) { SSelectStmt* pSelect = (SSelectStmt*)pStmt->pQuery; if (!pSelect->isDistinct && (NULL != pSelect->pFromTable && QUERY_NODE_REAL_TABLE == nodeType(pSelect->pFromTable)) && diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c index 14da6f8aab..644d1cca05 100644 --- a/source/libs/parser/src/parUtil.c +++ b/source/libs/parser/src/parUtil.c @@ -666,6 +666,22 @@ int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalog return code; } + +SNode* createSelectStmtImpl(bool isDistinct, SNodeList* pProjectionList, SNode* pTable) { + SSelectStmt* select = (SSelectStmt*)nodesMakeNode(QUERY_NODE_SELECT_STMT); + if (NULL == select) { + return NULL; + } + select->isDistinct = isDistinct; + select->pProjectionList = pProjectionList; + select->pFromTable = pTable; + sprintf(select->stmtName, "%p", select); + select->isTimeLineResult = true; + select->onlyHasKeepOrderFunc = true; + select->timeRange = TSWINDOW_INITIALIZER; + return (SNode*)select; +} + static int32_t putMetaDataToHash(const char* pKey, int32_t len, const SArray* pData, int32_t index, SHashObj** pHash) { if (NULL == *pHash) { *pHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index 2e473455e4..41a4327842 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -140,18 +140,18 @@ typedef union { #define ParseCTX_FETCH #define ParseCTX_STORE #define YYFALLBACK 1 -#define YYNSTATE 762 +#define YYNSTATE 764 #define YYNRULE 583 #define YYNRULE_WITH_ACTION 583 #define YYNTOKEN 330 -#define YY_MAX_SHIFT 761 -#define YY_MIN_SHIFTREDUCE 1136 -#define YY_MAX_SHIFTREDUCE 1718 -#define YY_ERROR_ACTION 1719 -#define YY_ACCEPT_ACTION 1720 -#define YY_NO_ACTION 1721 -#define YY_MIN_REDUCE 1722 -#define YY_MAX_REDUCE 2304 +#define YY_MAX_SHIFT 763 +#define YY_MIN_SHIFTREDUCE 1138 +#define YY_MAX_SHIFTREDUCE 1720 +#define YY_ERROR_ACTION 1721 +#define YY_ACCEPT_ACTION 1722 +#define YY_NO_ACTION 1723 +#define YY_MIN_REDUCE 1724 +#define YY_MAX_REDUCE 2306 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -218,609 +218,609 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2904) +#define YY_ACTTAB_COUNT (2902) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 2116, 2010, 1881, 396, 434, 168, 636, 1734, 433, 1989, - /* 10 */ 672, 162, 46, 44, 1646, 1723, 2008, 642, 374, 1894, - /* 20 */ 393, 506, 1495, 440, 39, 38, 1942, 503, 45, 43, - /* 30 */ 42, 41, 40, 1576, 1791, 1493, 123, 2134, 1520, 122, - /* 40 */ 121, 120, 119, 118, 117, 116, 115, 114, 2279, 2084, - /* 50 */ 593, 671, 593, 2275, 194, 2275, 39, 38, 167, 1571, - /* 60 */ 45, 43, 42, 41, 40, 19, 1833, 340, 2281, 186, - /* 70 */ 2281, 186, 1501, 2276, 619, 2276, 619, 45, 43, 42, - /* 80 */ 41, 40, 2115, 501, 654, 2151, 502, 1758, 169, 2117, - /* 90 */ 675, 2119, 2120, 670, 182, 665, 1520, 758, 36, 298, - /* 100 */ 15, 735, 734, 733, 732, 405, 1931, 731, 730, 144, - /* 110 */ 725, 724, 723, 722, 721, 720, 719, 157, 715, 714, - /* 120 */ 713, 404, 403, 710, 709, 708, 175, 174, 594, 2241, - /* 130 */ 509, 654, 1320, 502, 1758, 123, 1578, 1579, 122, 121, - /* 140 */ 120, 119, 118, 117, 116, 115, 114, 1311, 697, 696, - /* 150 */ 695, 1315, 694, 1317, 1318, 693, 690, 179, 1326, 687, - /* 160 */ 1328, 1329, 684, 681, 49, 640, 1551, 1561, 654, 2219, - /* 170 */ 655, 1892, 1577, 1580, 1720, 39, 38, 360, 1993, 45, - /* 180 */ 43, 42, 41, 40, 1409, 1410, 1496, 1523, 1494, 133, - /* 190 */ 655, 1892, 387, 62, 1715, 2216, 539, 39, 38, 280, - /* 200 */ 165, 45, 43, 42, 41, 40, 39, 38, 1894, 191, - /* 210 */ 45, 43, 42, 41, 40, 1499, 1500, 1868, 1550, 1553, - /* 220 */ 1554, 1555, 1556, 1557, 1558, 1559, 1560, 667, 663, 1569, - /* 230 */ 1570, 1572, 1573, 1574, 1575, 2, 46, 44, 1722, 179, - /* 240 */ 62, 343, 93, 1518, 393, 408, 1495, 62, 49, 407, - /* 250 */ 471, 2116, 2280, 485, 352, 2275, 484, 1576, 1989, 1493, - /* 260 */ 1994, 672, 132, 131, 130, 129, 128, 127, 126, 125, - /* 270 */ 124, 2279, 454, 1522, 486, 2276, 2278, 456, 432, 396, - /* 280 */ 431, 707, 2280, 1571, 1275, 2275, 211, 165, 2134, 19, - /* 290 */ 504, 593, 1765, 1714, 2275, 1894, 1501, 1274, 1605, 1685, - /* 300 */ 2084, 2279, 671, 196, 2010, 2276, 2277, 430, 618, 2281, - /* 310 */ 186, 2275, 518, 2116, 2276, 619, 386, 621, 66, 2007, - /* 320 */ 642, 758, 361, 672, 15, 1767, 617, 186, 1264, 655, - /* 330 */ 1892, 2276, 619, 2115, 444, 257, 2151, 655, 1892, 110, - /* 340 */ 2117, 675, 2119, 2120, 670, 189, 665, 1521, 133, 143, - /* 350 */ 2134, 150, 2175, 2204, 1606, 544, 55, 389, 2200, 487, - /* 360 */ 1578, 1579, 2084, 482, 671, 1266, 476, 475, 474, 473, - /* 370 */ 470, 469, 468, 467, 466, 462, 461, 460, 459, 342, - /* 380 */ 451, 450, 449, 613, 446, 445, 359, 1650, 1520, 1521, - /* 390 */ 1551, 1561, 189, 1520, 545, 2115, 1577, 1580, 2151, 189, - /* 400 */ 189, 110, 2117, 675, 2119, 2120, 670, 707, 665, 1191, - /* 410 */ 1496, 1190, 1494, 2295, 62, 2204, 1262, 630, 140, 389, - /* 420 */ 2200, 279, 50, 608, 641, 630, 140, 1745, 35, 391, - /* 430 */ 1600, 1601, 1602, 1603, 1604, 1608, 1609, 1610, 1611, 1499, - /* 440 */ 1500, 1192, 1550, 1553, 1554, 1555, 1556, 1557, 1558, 1559, - /* 450 */ 1560, 667, 663, 1569, 1570, 1572, 1573, 1574, 1575, 2, - /* 460 */ 12, 46, 44, 1354, 1355, 1495, 402, 401, 62, 393, - /* 470 */ 1279, 1495, 557, 556, 555, 516, 2084, 2003, 1493, 547, - /* 480 */ 137, 551, 1576, 1278, 1493, 550, 2280, 2116, 32, 1502, - /* 490 */ 549, 554, 368, 367, 39, 38, 548, 672, 45, 43, - /* 500 */ 42, 41, 40, 1522, 1523, 1426, 1427, 2116, 1571, 614, - /* 510 */ 609, 602, 1674, 699, 19, 1501, 1935, 669, 185, 2212, - /* 520 */ 2213, 1501, 138, 2217, 2134, 632, 184, 2212, 2213, 398, - /* 530 */ 138, 2217, 1937, 1939, 2051, 1191, 2084, 1190, 671, 1552, - /* 540 */ 758, 1425, 1428, 1519, 2134, 489, 758, 39, 38, 15, - /* 550 */ 228, 45, 43, 42, 41, 40, 2084, 153, 671, 605, - /* 560 */ 604, 1672, 1673, 1675, 1676, 1677, 189, 1192, 166, 2115, - /* 570 */ 1744, 580, 2151, 318, 189, 170, 2117, 675, 2119, 2120, - /* 580 */ 670, 246, 665, 28, 1708, 1578, 1579, 316, 73, 2115, - /* 590 */ 12, 72, 2151, 2094, 562, 334, 2117, 675, 2119, 2120, - /* 600 */ 670, 668, 665, 656, 2169, 655, 1892, 2102, 107, 572, - /* 610 */ 209, 497, 495, 492, 54, 1551, 1561, 2098, 612, 2084, - /* 620 */ 189, 1577, 1580, 242, 438, 141, 620, 2296, 213, 1496, - /* 630 */ 478, 1494, 504, 1884, 1765, 1496, 1794, 1494, 165, 565, - /* 640 */ 1944, 1944, 1505, 641, 559, 2134, 1895, 358, 373, 241, - /* 650 */ 62, 279, 195, 2100, 376, 1942, 1942, 1501, 1499, 1500, - /* 660 */ 1169, 289, 290, 665, 1499, 1500, 288, 1550, 1553, 1554, - /* 670 */ 1555, 1556, 1557, 1558, 1559, 1560, 667, 663, 1569, 1570, - /* 680 */ 1572, 1573, 1574, 1575, 2, 46, 44, 1581, 109, 70, - /* 690 */ 202, 201, 69, 393, 639, 1495, 2003, 2116, 611, 1171, - /* 700 */ 1974, 1174, 1175, 557, 556, 555, 1576, 633, 1493, 365, - /* 710 */ 547, 137, 551, 477, 641, 698, 550, 618, 655, 1892, - /* 720 */ 2275, 549, 554, 368, 367, 630, 140, 548, 81, 80, - /* 730 */ 437, 1643, 1571, 193, 2134, 617, 186, 439, 1938, 1939, - /* 740 */ 2276, 619, 717, 244, 1944, 1501, 2084, 243, 671, 655, - /* 750 */ 1892, 383, 14, 13, 341, 655, 1892, 423, 1877, 1942, - /* 760 */ 421, 417, 413, 410, 430, 650, 1743, 2003, 448, 1944, - /* 770 */ 758, 106, 2077, 47, 463, 366, 388, 364, 363, 2115, - /* 780 */ 541, 103, 2151, 2116, 1942, 110, 2117, 675, 2119, 2120, - /* 790 */ 670, 1944, 665, 672, 1869, 655, 1892, 183, 397, 2204, - /* 800 */ 101, 543, 189, 389, 2200, 542, 1942, 90, 347, 1578, - /* 810 */ 1579, 372, 87, 573, 464, 2084, 188, 2078, 593, 1735, - /* 820 */ 2134, 2275, 553, 552, 2230, 1885, 277, 2212, 629, 362, - /* 830 */ 134, 628, 2084, 2275, 671, 1742, 2281, 186, 1887, 1551, - /* 840 */ 1561, 2276, 619, 630, 140, 1577, 1580, 245, 617, 186, - /* 850 */ 655, 1892, 1619, 2276, 619, 458, 1586, 2219, 12, 1496, - /* 860 */ 10, 1494, 1520, 593, 457, 2115, 2275, 1741, 2151, 517, - /* 870 */ 1879, 111, 2117, 675, 2119, 2120, 670, 657, 665, 2176, - /* 880 */ 622, 2281, 186, 2215, 2084, 2204, 2276, 619, 1499, 1500, - /* 890 */ 2201, 1550, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, - /* 900 */ 667, 663, 1569, 1570, 1572, 1573, 1574, 1575, 2, 46, - /* 910 */ 44, 659, 1523, 2176, 1468, 1469, 2084, 393, 427, 1495, - /* 920 */ 52, 2116, 3, 705, 155, 154, 702, 701, 700, 152, - /* 930 */ 1576, 633, 1493, 39, 38, 655, 1892, 45, 43, 42, - /* 940 */ 41, 40, 429, 425, 187, 2212, 2213, 2116, 138, 2217, - /* 950 */ 198, 1875, 655, 1892, 1889, 578, 1571, 672, 2134, 2238, - /* 960 */ 705, 155, 154, 702, 701, 700, 152, 399, 1520, 1501, - /* 970 */ 2084, 247, 671, 655, 1892, 165, 42, 41, 40, 2219, - /* 980 */ 1642, 39, 38, 1894, 2134, 45, 43, 42, 41, 40, - /* 990 */ 84, 543, 589, 83, 758, 542, 2084, 47, 671, 655, - /* 1000 */ 1892, 593, 1740, 2115, 2275, 2214, 2151, 2116, 1552, 110, - /* 1010 */ 2117, 675, 2119, 2120, 670, 2067, 665, 672, 634, 2281, - /* 1020 */ 186, 183, 9, 2204, 2276, 619, 1739, 389, 2200, 2115, - /* 1030 */ 1867, 87, 2151, 1578, 1579, 110, 2117, 675, 2119, 2120, - /* 1040 */ 670, 2094, 665, 254, 2134, 1738, 571, 2295, 2231, 2204, - /* 1050 */ 146, 2084, 135, 389, 2200, 1883, 2084, 1888, 671, 569, - /* 1060 */ 256, 567, 1989, 1551, 1561, 2098, 34, 655, 1892, 1577, - /* 1070 */ 1580, 1607, 39, 38, 1662, 2084, 45, 43, 42, 41, - /* 1080 */ 40, 729, 727, 1496, 1896, 1494, 638, 655, 1892, 2115, - /* 1090 */ 655, 1892, 2151, 164, 2084, 169, 2117, 675, 2119, 2120, - /* 1100 */ 670, 2100, 665, 1174, 1175, 312, 293, 200, 1921, 652, - /* 1110 */ 623, 665, 1499, 1500, 1552, 1550, 1553, 1554, 1555, 1556, - /* 1120 */ 1557, 1558, 1559, 1560, 667, 663, 1569, 1570, 1572, 1573, - /* 1130 */ 1574, 1575, 2, 46, 44, 1737, 2242, 2116, 655, 1892, - /* 1140 */ 1736, 393, 1733, 1495, 2094, 33, 1732, 672, 1731, 2251, - /* 1150 */ 655, 1892, 655, 1892, 1576, 1612, 1493, 653, 2102, 705, - /* 1160 */ 155, 154, 702, 701, 700, 152, 1730, 142, 2098, 299, - /* 1170 */ 2175, 400, 2224, 1639, 2134, 1944, 703, 1177, 704, 1935, - /* 1180 */ 1571, 1935, 1729, 1519, 2084, 2094, 2084, 1728, 671, 2084, - /* 1190 */ 1943, 2084, 2094, 1501, 1870, 2084, 625, 2084, 1727, 2102, - /* 1200 */ 1726, 1725, 2070, 251, 2100, 377, 2103, 718, 234, 2098, - /* 1210 */ 1854, 232, 74, 592, 665, 2084, 2098, 236, 758, 2115, - /* 1220 */ 235, 15, 2151, 2116, 422, 110, 2117, 675, 2119, 2120, - /* 1230 */ 670, 2084, 665, 672, 1639, 600, 2084, 2295, 148, 2204, - /* 1240 */ 153, 441, 546, 389, 2200, 2100, 390, 2084, 1781, 2084, - /* 1250 */ 2084, 415, 2100, 238, 442, 665, 237, 1578, 1579, 1774, - /* 1260 */ 2134, 82, 665, 240, 1260, 153, 239, 1772, 711, 575, - /* 1270 */ 558, 574, 2084, 662, 671, 64, 255, 64, 261, 1717, - /* 1280 */ 1718, 560, 14, 13, 666, 2105, 1834, 1551, 1561, 563, - /* 1290 */ 1240, 2244, 274, 1577, 1580, 227, 268, 1463, 606, 1832, - /* 1300 */ 1504, 1503, 712, 1831, 153, 2115, 48, 1496, 2151, 1494, - /* 1310 */ 2135, 110, 2117, 675, 2119, 2120, 670, 286, 665, 91, - /* 1320 */ 71, 151, 1466, 2295, 1238, 2204, 406, 64, 48, 389, - /* 1330 */ 2200, 1998, 1671, 53, 1670, 263, 1499, 1500, 2107, 1550, - /* 1340 */ 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 667, 663, - /* 1350 */ 1569, 1570, 1572, 1573, 1574, 1575, 2, 2116, 402, 401, - /* 1360 */ 1221, 637, 153, 1423, 48, 679, 1768, 672, 1509, 2269, - /* 1370 */ 151, 1764, 153, 1759, 291, 1932, 2234, 647, 295, 1576, - /* 1380 */ 136, 1502, 631, 2116, 1613, 1562, 276, 151, 273, 1, - /* 1390 */ 5, 409, 356, 672, 2134, 2223, 414, 1222, 1446, 306, - /* 1400 */ 199, 443, 1523, 1999, 480, 1571, 2084, 447, 671, 452, - /* 1410 */ 1518, 490, 465, 1991, 479, 472, 753, 491, 1501, 1305, - /* 1420 */ 2134, 311, 1332, 1597, 481, 488, 203, 1336, 626, 1343, - /* 1430 */ 2116, 204, 2084, 493, 671, 494, 206, 1341, 496, 2115, - /* 1440 */ 672, 498, 2151, 661, 156, 110, 2117, 675, 2119, 2120, - /* 1450 */ 670, 2116, 665, 1507, 1506, 1524, 4, 2295, 499, 2204, - /* 1460 */ 507, 672, 1526, 389, 2200, 2115, 500, 2134, 2151, 508, - /* 1470 */ 510, 110, 2117, 675, 2119, 2120, 670, 1521, 665, 2084, - /* 1480 */ 1525, 671, 214, 2295, 511, 2204, 512, 216, 2134, 389, - /* 1490 */ 2200, 1527, 513, 1194, 219, 515, 221, 85, 86, 519, - /* 1500 */ 2084, 536, 671, 225, 538, 537, 112, 346, 540, 1882, - /* 1510 */ 231, 1878, 2115, 2060, 577, 2151, 2057, 2056, 170, 2117, - /* 1520 */ 675, 2119, 2120, 670, 579, 665, 233, 89, 149, 307, - /* 1530 */ 158, 159, 1510, 2115, 1505, 248, 2151, 1880, 1876, 110, - /* 1540 */ 2117, 675, 2119, 2120, 670, 160, 665, 161, 583, 252, - /* 1550 */ 582, 2179, 1453, 2204, 584, 2116, 597, 389, 2200, 607, - /* 1560 */ 587, 1513, 1515, 250, 2250, 672, 590, 645, 259, 588, - /* 1570 */ 2297, 2235, 2245, 603, 663, 1569, 1570, 1572, 1573, 1574, - /* 1580 */ 1575, 262, 2249, 8, 616, 378, 610, 2226, 598, 596, - /* 1590 */ 595, 267, 2134, 379, 139, 272, 1639, 2298, 627, 1522, - /* 1600 */ 624, 2220, 382, 635, 2084, 269, 671, 1528, 2004, 308, - /* 1610 */ 643, 281, 96, 309, 644, 648, 98, 2018, 2017, 2016, - /* 1620 */ 649, 2116, 173, 385, 270, 1893, 271, 100, 61, 102, - /* 1630 */ 2185, 672, 1936, 313, 1855, 310, 754, 2115, 302, 755, - /* 1640 */ 2151, 757, 348, 110, 2117, 675, 2119, 2120, 670, 2116, - /* 1650 */ 665, 2274, 677, 275, 337, 2177, 51, 2204, 2134, 672, - /* 1660 */ 322, 389, 2200, 336, 326, 317, 2076, 2075, 349, 2074, - /* 1670 */ 2084, 315, 671, 78, 2071, 411, 412, 1486, 1487, 192, - /* 1680 */ 416, 2116, 2069, 418, 419, 420, 2134, 2068, 357, 2066, - /* 1690 */ 424, 672, 426, 2064, 428, 79, 1449, 1448, 2084, 2065, - /* 1700 */ 671, 2030, 2029, 2115, 2028, 435, 2151, 436, 2027, 110, - /* 1710 */ 2117, 675, 2119, 2120, 670, 2026, 665, 1982, 2134, 1400, - /* 1720 */ 1981, 658, 1979, 2204, 1978, 145, 1977, 389, 2200, 1980, - /* 1730 */ 2084, 2115, 671, 1976, 2151, 1975, 1973, 111, 2117, 675, - /* 1740 */ 2119, 2120, 670, 1972, 665, 1971, 197, 453, 1970, 455, - /* 1750 */ 1984, 2204, 2116, 1969, 1968, 2203, 2200, 483, 147, 1954, - /* 1760 */ 1953, 1952, 672, 2115, 1967, 1966, 2151, 1965, 1964, 111, - /* 1770 */ 2117, 675, 2119, 2120, 670, 1963, 665, 1962, 1961, 1960, - /* 1780 */ 2116, 1959, 1958, 2204, 1957, 1956, 1955, 660, 2200, 2134, - /* 1790 */ 672, 1983, 1951, 1950, 1402, 1949, 1948, 1947, 1946, 2116, - /* 1800 */ 1945, 2084, 1276, 671, 344, 1280, 345, 1797, 205, 669, - /* 1810 */ 1796, 1272, 1795, 1793, 207, 2116, 1754, 2134, 180, 1176, - /* 1820 */ 2104, 208, 1753, 2047, 2037, 672, 76, 2025, 77, 2084, - /* 1830 */ 210, 671, 2024, 218, 673, 220, 2134, 2151, 2002, 1871, - /* 1840 */ 111, 2117, 675, 2119, 2120, 670, 181, 665, 2084, 505, - /* 1850 */ 671, 212, 2134, 1792, 2204, 1790, 1214, 384, 351, 2200, - /* 1860 */ 520, 1788, 2115, 521, 2084, 2151, 671, 522, 328, 2117, - /* 1870 */ 675, 2119, 2120, 670, 526, 665, 2116, 524, 525, 1786, - /* 1880 */ 528, 2115, 529, 530, 2151, 1784, 672, 334, 2117, 675, - /* 1890 */ 2119, 2120, 670, 532, 665, 533, 2170, 2115, 581, 2116, - /* 1900 */ 2151, 534, 1771, 335, 2117, 675, 2119, 2120, 670, 672, - /* 1910 */ 665, 615, 1770, 2134, 1750, 1873, 761, 63, 392, 1348, - /* 1920 */ 1347, 1872, 230, 1263, 1261, 2084, 1259, 671, 1258, 1257, - /* 1930 */ 305, 1256, 1250, 1782, 1255, 369, 2134, 561, 1252, 726, - /* 1940 */ 1251, 394, 1249, 1775, 728, 370, 178, 1773, 2084, 371, - /* 1950 */ 671, 564, 751, 747, 743, 739, 303, 566, 2115, 1749, - /* 1960 */ 1748, 2151, 1747, 568, 335, 2117, 675, 2119, 2120, 670, - /* 1970 */ 570, 665, 113, 1473, 1475, 1472, 1477, 27, 2046, 1455, - /* 1980 */ 67, 2115, 2036, 1457, 2151, 56, 585, 335, 2117, 675, - /* 1990 */ 2119, 2120, 670, 2116, 665, 163, 108, 2023, 586, 296, - /* 2000 */ 2021, 253, 1459, 672, 375, 2280, 29, 20, 17, 591, - /* 2010 */ 1687, 258, 59, 6, 7, 599, 601, 60, 265, 260, - /* 2020 */ 1669, 31, 266, 2105, 171, 2116, 264, 21, 65, 30, - /* 2030 */ 2134, 651, 1661, 1707, 92, 672, 1708, 22, 1702, 278, - /* 2040 */ 1701, 380, 2084, 2116, 671, 1706, 1705, 381, 176, 2022, - /* 2050 */ 1636, 1635, 58, 672, 2020, 2019, 2001, 18, 94, 95, - /* 2060 */ 284, 646, 2134, 2000, 103, 97, 283, 23, 57, 297, - /* 2070 */ 285, 282, 1667, 294, 2084, 576, 671, 24, 2151, 287, - /* 2080 */ 2134, 330, 2117, 675, 2119, 2120, 670, 292, 665, 68, - /* 2090 */ 2116, 249, 2084, 11, 671, 99, 1588, 1587, 13, 1511, - /* 2100 */ 672, 1543, 1598, 678, 177, 190, 395, 2115, 1566, 2154, - /* 2110 */ 2151, 682, 1325, 319, 2117, 675, 2119, 2120, 670, 664, - /* 2120 */ 665, 685, 1564, 37, 16, 2115, 676, 2134, 2151, 1563, - /* 2130 */ 25, 320, 2117, 675, 2119, 2120, 670, 2116, 665, 2084, - /* 2140 */ 1535, 671, 674, 26, 688, 1333, 680, 672, 1330, 1327, - /* 2150 */ 683, 686, 691, 1321, 1319, 300, 1324, 1323, 1322, 2116, - /* 2160 */ 689, 692, 104, 1342, 105, 75, 1338, 1212, 706, 672, - /* 2170 */ 1244, 1243, 2115, 301, 2134, 2151, 1242, 1241, 321, 2117, - /* 2180 */ 675, 2119, 2120, 670, 2116, 665, 2084, 1239, 671, 1237, - /* 2190 */ 1236, 1235, 1270, 716, 672, 1233, 2134, 1232, 1231, 1230, - /* 2200 */ 1229, 1228, 1227, 1267, 1265, 1224, 2116, 1223, 2084, 1220, - /* 2210 */ 671, 1219, 1218, 1217, 1789, 736, 672, 737, 738, 2115, - /* 2220 */ 1787, 2134, 2151, 740, 741, 327, 2117, 675, 2119, 2120, - /* 2230 */ 670, 742, 665, 2084, 1785, 671, 744, 746, 745, 1783, - /* 2240 */ 748, 2115, 749, 2134, 2151, 750, 1769, 331, 2117, 675, - /* 2250 */ 2119, 2120, 670, 752, 665, 2084, 1166, 671, 304, 756, - /* 2260 */ 1721, 1721, 1497, 314, 759, 760, 2115, 1746, 1721, 2151, - /* 2270 */ 2116, 1721, 323, 2117, 675, 2119, 2120, 670, 1721, 665, - /* 2280 */ 672, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 2115, 1721, - /* 2290 */ 2116, 2151, 1721, 1721, 332, 2117, 675, 2119, 2120, 670, - /* 2300 */ 672, 665, 1721, 1721, 1721, 2116, 1721, 2134, 1721, 1721, - /* 2310 */ 1721, 1721, 1721, 1721, 1721, 672, 1721, 1721, 1721, 2084, - /* 2320 */ 1721, 671, 1721, 1721, 1721, 1721, 1721, 2134, 1721, 1721, - /* 2330 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 2116, 1721, 2084, - /* 2340 */ 1721, 671, 2134, 1721, 1721, 1721, 1721, 672, 1721, 1721, - /* 2350 */ 1721, 1721, 2115, 1721, 2084, 2151, 671, 1721, 324, 2117, - /* 2360 */ 675, 2119, 2120, 670, 1721, 665, 1721, 1721, 1721, 1721, - /* 2370 */ 1721, 1721, 2115, 1721, 2134, 2151, 1721, 1721, 333, 2117, - /* 2380 */ 675, 2119, 2120, 670, 1721, 665, 2084, 2115, 671, 1721, - /* 2390 */ 2151, 1721, 1721, 325, 2117, 675, 2119, 2120, 670, 1721, - /* 2400 */ 665, 1721, 1721, 1721, 1721, 2116, 1721, 1721, 1721, 1721, - /* 2410 */ 1721, 1721, 1721, 1721, 1721, 672, 1721, 1721, 1721, 2115, - /* 2420 */ 1721, 1721, 2151, 1721, 2116, 338, 2117, 675, 2119, 2120, - /* 2430 */ 670, 1721, 665, 1721, 672, 1721, 1721, 1721, 1721, 1721, - /* 2440 */ 1721, 1721, 2134, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2450 */ 1721, 1721, 2116, 1721, 2084, 1721, 671, 1721, 1721, 1721, - /* 2460 */ 1721, 2134, 672, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2470 */ 1721, 2116, 1721, 2084, 1721, 671, 1721, 1721, 1721, 1721, - /* 2480 */ 1721, 672, 1721, 1721, 1721, 1721, 1721, 2115, 1721, 2134, - /* 2490 */ 2151, 1721, 1721, 339, 2117, 675, 2119, 2120, 670, 1721, - /* 2500 */ 665, 2084, 1721, 671, 1721, 1721, 2115, 1721, 2134, 2151, - /* 2510 */ 1721, 1721, 2128, 2117, 675, 2119, 2120, 670, 2116, 665, - /* 2520 */ 2084, 1721, 671, 1721, 1721, 1721, 1721, 1721, 672, 1721, - /* 2530 */ 1721, 1721, 1721, 1721, 2115, 1721, 1721, 2151, 1721, 1721, - /* 2540 */ 2127, 2117, 675, 2119, 2120, 670, 1721, 665, 1721, 1721, - /* 2550 */ 1721, 1721, 1721, 2115, 1721, 2134, 2151, 1721, 1721, 2126, - /* 2560 */ 2117, 675, 2119, 2120, 670, 1721, 665, 2084, 1721, 671, - /* 2570 */ 1721, 1721, 1721, 1721, 1721, 2116, 1721, 1721, 1721, 1721, - /* 2580 */ 1721, 1721, 1721, 1721, 1721, 672, 1721, 1721, 1721, 1721, - /* 2590 */ 1721, 2116, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2600 */ 2115, 672, 1721, 2151, 1721, 1721, 353, 2117, 675, 2119, - /* 2610 */ 2120, 670, 2134, 665, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2620 */ 1721, 1721, 1721, 1721, 2084, 1721, 671, 1721, 2134, 1721, - /* 2630 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2640 */ 2084, 2116, 671, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2650 */ 1721, 672, 1721, 1721, 1721, 1721, 1721, 2115, 1721, 1721, - /* 2660 */ 2151, 2116, 1721, 354, 2117, 675, 2119, 2120, 670, 1721, - /* 2670 */ 665, 672, 1721, 2115, 1721, 1721, 2151, 1721, 2134, 350, - /* 2680 */ 2117, 675, 2119, 2120, 670, 1721, 665, 1721, 1721, 1721, - /* 2690 */ 2084, 1721, 671, 1721, 1721, 1721, 1721, 1721, 2134, 1721, - /* 2700 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 2116, 1721, - /* 2710 */ 2084, 1721, 671, 1721, 1721, 1721, 1721, 1721, 672, 1721, - /* 2720 */ 1721, 1721, 1721, 2115, 1721, 1721, 2151, 1721, 1721, 355, - /* 2730 */ 2117, 675, 2119, 2120, 670, 1721, 665, 1721, 1721, 1721, - /* 2740 */ 1721, 1721, 229, 673, 1721, 2134, 2151, 1721, 1721, 330, - /* 2750 */ 2117, 675, 2119, 2120, 670, 1721, 665, 2084, 172, 671, - /* 2760 */ 1721, 1721, 1721, 1721, 535, 531, 527, 523, 226, 1721, - /* 2770 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2780 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2790 */ 2115, 1721, 1721, 2151, 1721, 1721, 329, 2117, 675, 2119, - /* 2800 */ 2120, 670, 1721, 665, 1721, 1721, 1721, 1721, 88, 1721, - /* 2810 */ 1721, 224, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2820 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2830 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2840 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2850 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2860 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2870 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 223, 217, - /* 2880 */ 1721, 1721, 1721, 222, 1721, 514, 1721, 1721, 1721, 1721, - /* 2890 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - /* 2900 */ 1721, 1721, 1721, 215, + /* 0 */ 503, 2118, 2282, 504, 1760, 2277, 36, 300, 1883, 442, + /* 10 */ 66, 674, 46, 44, 1648, 45, 43, 42, 41, 40, + /* 20 */ 395, 2281, 1497, 39, 38, 2278, 2280, 45, 43, 42, + /* 30 */ 41, 40, 1976, 1578, 1793, 1495, 657, 1894, 2136, 39, + /* 40 */ 38, 632, 140, 45, 43, 42, 41, 40, 657, 1894, + /* 50 */ 2086, 1724, 673, 342, 2012, 191, 39, 38, 573, 1573, + /* 60 */ 45, 43, 42, 41, 40, 19, 388, 133, 520, 2009, + /* 70 */ 644, 571, 1503, 569, 541, 132, 131, 130, 129, 128, + /* 80 */ 127, 126, 125, 124, 2117, 168, 2153, 1736, 198, 170, + /* 90 */ 2119, 677, 2121, 2122, 672, 511, 667, 760, 504, 1760, + /* 100 */ 15, 737, 736, 735, 734, 407, 62, 733, 732, 144, + /* 110 */ 727, 726, 725, 724, 723, 722, 721, 157, 717, 716, + /* 120 */ 715, 406, 405, 712, 711, 710, 175, 174, 84, 404, + /* 130 */ 403, 83, 1687, 656, 709, 1722, 1580, 1581, 1946, 1511, + /* 140 */ 622, 2298, 278, 2214, 631, 375, 134, 630, 1522, 2277, + /* 150 */ 1578, 123, 1504, 1944, 122, 121, 120, 119, 118, 117, + /* 160 */ 116, 115, 114, 2012, 619, 186, 1553, 1563, 1946, 2278, + /* 170 */ 621, 2282, 1579, 1582, 2277, 360, 1573, 400, 2010, 644, + /* 180 */ 1939, 1941, 656, 1944, 398, 1522, 1498, 460, 1496, 1503, + /* 190 */ 2281, 87, 162, 1717, 2278, 2279, 459, 39, 38, 376, + /* 200 */ 1896, 45, 43, 42, 41, 40, 410, 1944, 364, 582, + /* 210 */ 1522, 409, 62, 49, 663, 1501, 1502, 1889, 1552, 1555, + /* 220 */ 1556, 1557, 1558, 1559, 1560, 1561, 1562, 669, 665, 1571, + /* 230 */ 1572, 1574, 1575, 1576, 1577, 2, 46, 44, 632, 140, + /* 240 */ 1171, 345, 1523, 1520, 395, 620, 1497, 480, 2277, 12, + /* 250 */ 473, 10, 595, 487, 354, 2277, 486, 1578, 189, 1495, + /* 260 */ 443, 508, 229, 619, 186, 62, 2096, 505, 2278, 621, + /* 270 */ 2283, 186, 456, 444, 488, 2278, 621, 458, 172, 1173, + /* 280 */ 2104, 1176, 1177, 1573, 537, 533, 529, 525, 226, 19, + /* 290 */ 2100, 1523, 1716, 559, 558, 557, 1503, 1193, 1607, 1192, + /* 300 */ 549, 137, 553, 1512, 1747, 1507, 552, 202, 201, 14, + /* 310 */ 13, 551, 556, 370, 369, 50, 642, 550, 2282, 404, + /* 320 */ 403, 760, 363, 615, 15, 182, 2102, 378, 88, 1194, + /* 330 */ 479, 224, 1515, 1517, 446, 1524, 667, 1933, 634, 184, + /* 340 */ 2214, 2215, 1504, 138, 2219, 665, 1571, 1572, 1574, 1575, + /* 350 */ 1576, 1577, 664, 2086, 1608, 1746, 1411, 1412, 1428, 1429, + /* 360 */ 1580, 1581, 179, 484, 189, 189, 478, 477, 476, 475, + /* 370 */ 472, 471, 470, 469, 468, 464, 463, 462, 461, 344, + /* 380 */ 453, 452, 451, 1996, 448, 447, 361, 657, 1894, 1277, + /* 390 */ 1553, 1563, 657, 1894, 1427, 1430, 1579, 1582, 223, 217, + /* 400 */ 2221, 610, 1276, 222, 2086, 516, 133, 1356, 1357, 1621, + /* 410 */ 1498, 55, 1496, 546, 39, 38, 1710, 189, 45, 43, + /* 420 */ 42, 41, 40, 215, 1796, 1871, 2218, 1676, 35, 393, + /* 430 */ 1602, 1603, 1604, 1605, 1606, 1610, 1611, 1612, 1613, 1501, + /* 440 */ 1502, 1745, 1552, 1555, 1556, 1557, 1558, 1559, 1560, 1561, + /* 450 */ 1562, 669, 665, 1571, 1572, 1574, 1575, 1576, 1577, 2, + /* 460 */ 12, 46, 44, 2107, 489, 167, 1652, 189, 1497, 395, + /* 470 */ 367, 1497, 1522, 1835, 607, 606, 1674, 1675, 1677, 1678, + /* 480 */ 1679, 1495, 1578, 280, 1495, 179, 2118, 616, 611, 604, + /* 490 */ 2086, 559, 558, 557, 643, 1507, 671, 1588, 549, 137, + /* 500 */ 553, 1725, 1599, 1522, 552, 362, 1995, 1664, 1573, 551, + /* 510 */ 556, 370, 369, 211, 19, 550, 2109, 506, 1503, 1767, + /* 520 */ 1870, 1503, 123, 2136, 2053, 122, 121, 120, 119, 118, + /* 530 */ 117, 116, 115, 114, 614, 2086, 368, 673, 366, 365, + /* 540 */ 429, 543, 1524, 760, 213, 518, 760, 2005, 506, 15, + /* 550 */ 1767, 657, 1894, 2118, 707, 155, 154, 704, 703, 702, + /* 560 */ 152, 2136, 545, 674, 431, 427, 544, 656, 166, 2117, + /* 570 */ 247, 2153, 246, 320, 336, 2119, 677, 2121, 2122, 672, + /* 580 */ 670, 667, 658, 2171, 709, 1580, 1581, 318, 73, 2281, + /* 590 */ 2136, 72, 39, 38, 1940, 1941, 45, 43, 42, 41, + /* 600 */ 40, 389, 2086, 1521, 673, 101, 42, 41, 40, 165, + /* 610 */ 209, 499, 497, 494, 613, 1553, 1563, 1896, 1554, 39, + /* 620 */ 38, 1579, 1582, 45, 43, 42, 41, 40, 28, 1266, + /* 630 */ 1887, 1525, 1498, 12, 1496, 1498, 2117, 1496, 2153, 657, + /* 640 */ 1894, 110, 2119, 677, 2121, 2122, 672, 49, 667, 1554, + /* 650 */ 62, 143, 436, 150, 2177, 2206, 700, 435, 440, 391, + /* 660 */ 2202, 1501, 1502, 1879, 1501, 1502, 1268, 1552, 1555, 1556, + /* 670 */ 1557, 1558, 1559, 1560, 1561, 1562, 669, 665, 1571, 1572, + /* 680 */ 1574, 1575, 1576, 1577, 2, 46, 44, 1583, 109, 1946, + /* 690 */ 280, 643, 1281, 395, 87, 1497, 385, 2118, 595, 142, + /* 700 */ 620, 2277, 2177, 2277, 1944, 1280, 1578, 635, 1495, 707, + /* 710 */ 155, 154, 704, 703, 702, 152, 2283, 186, 619, 186, + /* 720 */ 1890, 2278, 621, 2278, 621, 282, 555, 554, 81, 80, + /* 730 */ 439, 1503, 1573, 193, 2136, 2096, 1946, 1193, 659, 1192, + /* 740 */ 2178, 2096, 641, 390, 2005, 1503, 2086, 701, 673, 2104, + /* 750 */ 1937, 1944, 228, 1991, 343, 1885, 1946, 425, 2221, 2100, + /* 760 */ 423, 419, 415, 412, 432, 2100, 62, 491, 93, 1194, + /* 770 */ 760, 1945, 643, 47, 2221, 398, 291, 292, 1744, 258, + /* 780 */ 2117, 290, 2153, 165, 2217, 110, 2119, 677, 2121, 2122, + /* 790 */ 672, 1896, 667, 1869, 1223, 2102, 379, 183, 194, 2206, + /* 800 */ 2216, 2102, 189, 391, 2202, 667, 1743, 32, 1742, 1580, + /* 810 */ 1581, 667, 8, 39, 38, 1741, 188, 45, 43, 42, + /* 820 */ 41, 40, 34, 652, 2232, 2005, 545, 2086, 39, 38, + /* 830 */ 544, 1224, 45, 43, 42, 41, 40, 657, 1894, 1553, + /* 840 */ 1563, 657, 1894, 39, 38, 1579, 1582, 45, 43, 42, + /* 850 */ 41, 40, 1322, 731, 729, 2086, 519, 2086, 623, 1498, + /* 860 */ 441, 1496, 2226, 1641, 2086, 657, 1894, 1313, 699, 698, + /* 870 */ 697, 1317, 696, 1319, 1320, 695, 692, 1609, 1328, 689, + /* 880 */ 1330, 1331, 686, 683, 450, 2069, 632, 140, 1501, 1502, + /* 890 */ 1740, 1552, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, + /* 900 */ 669, 665, 1571, 1572, 1574, 1575, 1576, 1577, 2, 46, + /* 910 */ 44, 245, 107, 1176, 1177, 62, 638, 395, 189, 1497, + /* 920 */ 719, 2118, 707, 155, 154, 704, 703, 702, 152, 141, + /* 930 */ 1578, 635, 1495, 657, 1894, 657, 1894, 1886, 661, 2086, + /* 940 */ 2178, 657, 1894, 1179, 1881, 657, 1894, 2118, 1946, 1521, + /* 950 */ 1739, 33, 465, 1645, 466, 399, 1573, 674, 2136, 1769, + /* 960 */ 1891, 1614, 595, 1944, 255, 2277, 1525, 1877, 165, 1503, + /* 970 */ 2086, 1738, 673, 1735, 632, 140, 1897, 1734, 1470, 1471, + /* 980 */ 2283, 186, 1733, 627, 2136, 2278, 621, 185, 2214, 2215, + /* 990 */ 314, 138, 2219, 1923, 760, 1898, 2086, 47, 673, 2086, + /* 1000 */ 434, 2096, 433, 164, 2117, 1991, 2153, 2118, 1732, 110, + /* 1010 */ 2119, 677, 2121, 2122, 672, 2104, 667, 674, 1525, 1731, + /* 1020 */ 2086, 183, 2086, 2206, 1641, 2100, 2086, 391, 2202, 432, + /* 1030 */ 2117, 2086, 2153, 1580, 1581, 110, 2119, 677, 2121, 2122, + /* 1040 */ 672, 244, 667, 401, 2136, 243, 1522, 2297, 2233, 2206, + /* 1050 */ 196, 165, 1730, 391, 2202, 1729, 2086, 2086, 673, 1896, + /* 1060 */ 547, 2102, 392, 1553, 1563, 657, 1894, 189, 2086, 1579, + /* 1070 */ 1582, 667, 657, 1894, 624, 187, 2214, 2215, 705, 138, + /* 1080 */ 2219, 1937, 1264, 1498, 281, 1496, 1719, 1720, 657, 1894, + /* 1090 */ 2117, 640, 2153, 1728, 424, 169, 2119, 677, 2121, 2122, + /* 1100 */ 672, 2086, 667, 251, 2086, 90, 349, 295, 1991, 374, + /* 1110 */ 668, 575, 1501, 1502, 195, 1552, 1555, 1556, 1557, 1558, + /* 1120 */ 1559, 1560, 1561, 1562, 669, 665, 1571, 1572, 1574, 1575, + /* 1130 */ 1576, 1577, 2, 46, 44, 596, 2243, 2118, 2096, 657, + /* 1140 */ 1894, 395, 2086, 1497, 657, 1894, 2072, 674, 74, 2253, + /* 1150 */ 657, 1894, 2105, 200, 1578, 1727, 1495, 153, 654, 657, + /* 1160 */ 1894, 564, 2100, 655, 706, 1872, 257, 1937, 720, 301, + /* 1170 */ 52, 1856, 3, 146, 2136, 135, 574, 577, 402, 576, + /* 1180 */ 1573, 234, 236, 548, 232, 235, 2086, 1836, 673, 153, + /* 1190 */ 242, 1783, 1554, 1503, 153, 417, 64, 82, 2102, 2079, + /* 1200 */ 238, 2080, 1644, 237, 2086, 1262, 567, 240, 667, 148, + /* 1210 */ 239, 561, 1776, 560, 54, 628, 241, 1506, 760, 1774, + /* 1220 */ 2117, 15, 2153, 2118, 64, 110, 2119, 677, 2121, 2122, + /* 1230 */ 672, 580, 667, 674, 562, 602, 256, 2297, 594, 2206, + /* 1240 */ 262, 565, 153, 391, 2202, 595, 1465, 595, 2277, 1505, + /* 1250 */ 2277, 1468, 1770, 1673, 254, 1737, 70, 1580, 1581, 69, + /* 1260 */ 2136, 14, 13, 2283, 186, 2283, 186, 48, 2278, 621, + /* 1270 */ 2278, 621, 2086, 106, 673, 288, 71, 595, 151, 91, + /* 1280 */ 2277, 1672, 608, 103, 2246, 1834, 275, 1553, 1563, 227, + /* 1290 */ 269, 1833, 2137, 1579, 1582, 2283, 186, 264, 408, 639, + /* 1300 */ 2278, 621, 755, 153, 625, 64, 2117, 1498, 2153, 1496, + /* 1310 */ 2000, 110, 2119, 677, 2121, 2122, 672, 48, 667, 48, + /* 1320 */ 681, 151, 153, 2297, 1425, 2206, 1761, 1766, 1934, 391, + /* 1330 */ 2202, 633, 293, 649, 2236, 297, 1501, 1502, 277, 1552, + /* 1340 */ 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 669, 665, + /* 1350 */ 1571, 1572, 1574, 1575, 1576, 1577, 2, 2118, 53, 136, + /* 1360 */ 1307, 274, 1615, 713, 151, 1, 714, 674, 9, 2271, + /* 1370 */ 1509, 411, 416, 358, 1564, 308, 313, 1334, 1338, 1345, + /* 1380 */ 199, 1448, 445, 2118, 1525, 1242, 2001, 482, 1240, 449, + /* 1390 */ 454, 1520, 481, 674, 2136, 2225, 467, 1993, 474, 483, + /* 1400 */ 492, 490, 1508, 493, 203, 204, 2086, 495, 673, 496, + /* 1410 */ 206, 498, 500, 1526, 501, 4, 1343, 509, 1528, 502, + /* 1420 */ 2136, 156, 510, 214, 512, 1523, 513, 1527, 514, 1529, + /* 1430 */ 515, 216, 2086, 517, 673, 219, 221, 85, 86, 521, + /* 1440 */ 2117, 225, 2153, 1196, 540, 110, 2119, 677, 2121, 2122, + /* 1450 */ 672, 538, 667, 539, 2062, 2118, 2059, 2297, 2058, 2206, + /* 1460 */ 542, 112, 1884, 391, 2202, 674, 2117, 2240, 2153, 231, + /* 1470 */ 1880, 110, 2119, 677, 2121, 2122, 672, 233, 667, 348, + /* 1480 */ 158, 2118, 159, 2297, 579, 2206, 1882, 1878, 160, 391, + /* 1490 */ 2202, 674, 2136, 161, 89, 248, 585, 584, 1455, 589, + /* 1500 */ 592, 252, 609, 2237, 2086, 586, 673, 149, 581, 309, + /* 1510 */ 250, 599, 2252, 590, 2118, 647, 2247, 605, 2136, 380, + /* 1520 */ 2251, 612, 591, 260, 674, 7, 2228, 263, 618, 268, + /* 1530 */ 2086, 173, 673, 600, 598, 597, 273, 2300, 2117, 626, + /* 1540 */ 2153, 381, 629, 110, 2119, 677, 2121, 2122, 672, 1641, + /* 1550 */ 667, 2136, 139, 1524, 384, 2297, 271, 2206, 2222, 637, + /* 1560 */ 1530, 391, 2202, 2086, 2117, 673, 2153, 2006, 636, 110, + /* 1570 */ 2119, 677, 2121, 2122, 672, 283, 667, 2276, 96, 312, + /* 1580 */ 270, 2181, 310, 2206, 645, 272, 646, 391, 2202, 2020, + /* 1590 */ 2019, 2118, 311, 2018, 650, 276, 98, 2117, 387, 2153, + /* 1600 */ 651, 674, 110, 2119, 677, 2121, 2122, 672, 61, 667, + /* 1610 */ 102, 1895, 2187, 100, 2179, 1938, 2206, 679, 304, 756, + /* 1620 */ 391, 2202, 2118, 757, 315, 759, 51, 339, 2136, 1857, + /* 1630 */ 319, 2078, 674, 350, 351, 324, 338, 317, 328, 2077, + /* 1640 */ 2086, 2076, 673, 78, 2073, 413, 414, 1488, 1489, 192, + /* 1650 */ 2118, 418, 2071, 420, 421, 422, 2070, 359, 2068, 2136, + /* 1660 */ 674, 426, 2067, 2066, 428, 430, 79, 1451, 1450, 2032, + /* 1670 */ 2031, 2086, 2030, 673, 2117, 437, 2153, 438, 2029, 110, + /* 1680 */ 2119, 677, 2121, 2122, 672, 2118, 667, 2136, 2028, 1984, + /* 1690 */ 1402, 660, 1983, 2206, 1981, 674, 145, 391, 2202, 2086, + /* 1700 */ 1980, 673, 1979, 1982, 1978, 2117, 1977, 2153, 1975, 1974, + /* 1710 */ 111, 2119, 677, 2121, 2122, 672, 1973, 667, 455, 197, + /* 1720 */ 1972, 457, 2136, 1986, 2206, 1971, 1970, 1969, 2205, 2202, + /* 1730 */ 1968, 1967, 1966, 2117, 2086, 2153, 673, 1965, 111, 2119, + /* 1740 */ 677, 2121, 2122, 672, 1964, 667, 1963, 1962, 1961, 1960, + /* 1750 */ 1959, 1958, 2206, 1957, 147, 1956, 662, 2202, 1955, 1954, + /* 1760 */ 1985, 1953, 1952, 1404, 1951, 1950, 1949, 485, 675, 346, + /* 1770 */ 2153, 1948, 1947, 111, 2119, 677, 2121, 2122, 672, 2118, + /* 1780 */ 667, 347, 1799, 205, 1798, 1278, 1797, 2206, 207, 674, + /* 1790 */ 1282, 353, 2202, 1795, 208, 1756, 210, 1178, 1755, 2118, + /* 1800 */ 180, 2049, 1274, 2039, 2106, 2027, 220, 2026, 2004, 674, + /* 1810 */ 2118, 1873, 76, 1794, 1792, 212, 2136, 181, 77, 218, + /* 1820 */ 674, 507, 522, 1790, 524, 526, 523, 527, 2086, 1788, + /* 1830 */ 673, 528, 530, 532, 1786, 534, 2136, 531, 535, 1773, + /* 1840 */ 1772, 536, 1216, 1752, 1875, 63, 230, 2136, 2086, 1349, + /* 1850 */ 673, 1350, 1874, 1265, 1263, 1261, 1260, 1259, 1252, 2086, + /* 1860 */ 1258, 673, 2117, 1257, 2153, 1254, 1784, 111, 2119, 677, + /* 1870 */ 2121, 2122, 672, 1253, 667, 371, 728, 730, 1777, 372, + /* 1880 */ 1251, 2206, 2117, 1775, 2153, 373, 2203, 169, 2119, 677, + /* 1890 */ 2121, 2122, 672, 2117, 667, 2153, 2118, 563, 330, 2119, + /* 1900 */ 677, 2121, 2122, 672, 566, 667, 674, 2118, 1751, 568, + /* 1910 */ 1750, 570, 1749, 572, 113, 1475, 1477, 674, 1479, 1474, + /* 1920 */ 2048, 1461, 2118, 1459, 27, 1457, 67, 2038, 2244, 163, + /* 1930 */ 2025, 587, 671, 2136, 2023, 2282, 20, 17, 1689, 601, + /* 1940 */ 59, 617, 29, 5, 2136, 2086, 6, 673, 259, 386, + /* 1950 */ 603, 253, 261, 267, 2107, 60, 2086, 1671, 673, 2136, + /* 1960 */ 171, 265, 30, 266, 56, 1663, 593, 588, 92, 31, + /* 1970 */ 21, 2086, 377, 673, 1709, 65, 1710, 22, 18, 2117, + /* 1980 */ 1704, 2153, 1703, 382, 170, 2119, 677, 2121, 2122, 672, + /* 1990 */ 2117, 667, 2153, 2118, 1708, 337, 2119, 677, 2121, 2122, + /* 2000 */ 672, 1707, 667, 674, 383, 2117, 1638, 2153, 2118, 279, + /* 2010 */ 336, 2119, 677, 2121, 2122, 672, 583, 667, 674, 2172, + /* 2020 */ 58, 176, 1637, 2024, 2022, 2021, 2003, 95, 94, 286, + /* 2030 */ 2136, 23, 2002, 97, 763, 394, 2299, 287, 1669, 289, + /* 2040 */ 294, 648, 2086, 68, 673, 2136, 296, 299, 307, 99, + /* 2050 */ 396, 103, 24, 1590, 1589, 13, 57, 2086, 1513, 673, + /* 2060 */ 2156, 666, 1600, 37, 178, 1568, 1566, 2118, 1565, 177, + /* 2070 */ 753, 749, 745, 741, 305, 16, 2117, 674, 2153, 25, + /* 2080 */ 190, 337, 2119, 677, 2121, 2122, 672, 11, 667, 1545, + /* 2090 */ 1537, 2117, 26, 2153, 678, 680, 337, 2119, 677, 2121, + /* 2100 */ 2122, 672, 2118, 667, 2136, 397, 676, 1335, 1332, 682, + /* 2110 */ 684, 685, 674, 1329, 108, 687, 2086, 298, 673, 688, + /* 2120 */ 690, 693, 1323, 1327, 1326, 1325, 302, 691, 1344, 1321, + /* 2130 */ 694, 104, 1324, 1340, 105, 1214, 708, 75, 1246, 2136, + /* 2140 */ 1245, 1244, 1243, 1241, 1239, 1238, 1272, 1237, 718, 653, + /* 2150 */ 578, 2086, 2153, 673, 1232, 332, 2119, 677, 2121, 2122, + /* 2160 */ 672, 303, 667, 1235, 2118, 1234, 1233, 1269, 1231, 1230, + /* 2170 */ 1229, 1267, 1226, 1225, 674, 1222, 1221, 1220, 1219, 1791, + /* 2180 */ 738, 740, 1789, 742, 285, 2117, 1787, 2153, 739, 284, + /* 2190 */ 321, 2119, 677, 2121, 2122, 672, 743, 667, 744, 746, + /* 2200 */ 747, 2136, 748, 1785, 750, 751, 752, 1771, 754, 249, + /* 2210 */ 1168, 1748, 306, 2086, 758, 673, 1499, 316, 761, 762, + /* 2220 */ 1723, 2118, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2230 */ 1723, 674, 2118, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2240 */ 1723, 1723, 674, 1723, 1723, 1723, 1723, 2117, 1723, 2153, + /* 2250 */ 1723, 2118, 322, 2119, 677, 2121, 2122, 672, 2136, 667, + /* 2260 */ 1723, 674, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 2136, + /* 2270 */ 2086, 1723, 673, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2280 */ 1723, 2086, 1723, 673, 1723, 1723, 1723, 1723, 2136, 1723, + /* 2290 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2300 */ 2086, 1723, 673, 1723, 2117, 1723, 2153, 1723, 1723, 323, + /* 2310 */ 2119, 677, 2121, 2122, 672, 2117, 667, 2153, 2118, 1723, + /* 2320 */ 329, 2119, 677, 2121, 2122, 672, 1723, 667, 674, 1723, + /* 2330 */ 1723, 1723, 1723, 1723, 2117, 1723, 2153, 2118, 1723, 333, + /* 2340 */ 2119, 677, 2121, 2122, 672, 1723, 667, 674, 1723, 1723, + /* 2350 */ 1723, 1723, 1723, 2118, 1723, 2136, 1723, 1723, 1723, 1723, + /* 2360 */ 1723, 1723, 1723, 674, 1723, 1723, 1723, 2086, 2118, 673, + /* 2370 */ 1723, 1723, 1723, 1723, 2136, 1723, 1723, 1723, 674, 1723, + /* 2380 */ 1723, 1723, 1723, 1723, 2118, 1723, 2086, 1723, 673, 1723, + /* 2390 */ 2136, 1723, 1723, 1723, 674, 1723, 1723, 1723, 1723, 1723, + /* 2400 */ 1723, 2117, 2086, 2153, 673, 2136, 325, 2119, 677, 2121, + /* 2410 */ 2122, 672, 1723, 667, 1723, 1723, 1723, 2086, 1723, 673, + /* 2420 */ 2117, 2136, 2153, 1723, 1723, 334, 2119, 677, 2121, 2122, + /* 2430 */ 672, 1723, 667, 2086, 1723, 673, 2117, 1723, 2153, 1723, + /* 2440 */ 1723, 326, 2119, 677, 2121, 2122, 672, 1723, 667, 1723, + /* 2450 */ 1723, 2117, 2118, 2153, 1723, 1723, 335, 2119, 677, 2121, + /* 2460 */ 2122, 672, 674, 667, 1723, 1723, 1723, 2117, 1723, 2153, + /* 2470 */ 1723, 1723, 327, 2119, 677, 2121, 2122, 672, 1723, 667, + /* 2480 */ 1723, 1723, 1723, 2118, 1723, 1723, 1723, 1723, 1723, 2136, + /* 2490 */ 1723, 1723, 1723, 674, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2500 */ 1723, 2086, 1723, 673, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2510 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 2118, 1723, + /* 2520 */ 2136, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 674, 1723, + /* 2530 */ 1723, 1723, 2086, 1723, 673, 2117, 1723, 2153, 1723, 1723, + /* 2540 */ 340, 2119, 677, 2121, 2122, 672, 1723, 667, 1723, 2118, + /* 2550 */ 1723, 1723, 1723, 1723, 1723, 2136, 1723, 1723, 1723, 674, + /* 2560 */ 1723, 1723, 1723, 1723, 1723, 1723, 2117, 2086, 2153, 673, + /* 2570 */ 1723, 341, 2119, 677, 2121, 2122, 672, 1723, 667, 1723, + /* 2580 */ 1723, 1723, 1723, 1723, 1723, 1723, 2136, 1723, 1723, 1723, + /* 2590 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 2086, 1723, + /* 2600 */ 673, 2117, 1723, 2153, 1723, 1723, 2130, 2119, 677, 2121, + /* 2610 */ 2122, 672, 1723, 667, 1723, 2118, 1723, 1723, 1723, 1723, + /* 2620 */ 1723, 1723, 1723, 1723, 1723, 674, 1723, 1723, 1723, 1723, + /* 2630 */ 1723, 1723, 2117, 1723, 2153, 1723, 2118, 2129, 2119, 677, + /* 2640 */ 2121, 2122, 672, 1723, 667, 1723, 674, 1723, 1723, 1723, + /* 2650 */ 1723, 1723, 2136, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2660 */ 1723, 1723, 2118, 1723, 2086, 1723, 673, 1723, 1723, 1723, + /* 2670 */ 1723, 1723, 674, 2136, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2680 */ 1723, 2118, 1723, 1723, 1723, 2086, 1723, 673, 1723, 1723, + /* 2690 */ 1723, 674, 1723, 1723, 1723, 1723, 1723, 1723, 2117, 2136, + /* 2700 */ 2153, 1723, 1723, 2128, 2119, 677, 2121, 2122, 672, 1723, + /* 2710 */ 667, 2086, 2118, 673, 1723, 1723, 1723, 1723, 2136, 2117, + /* 2720 */ 1723, 2153, 674, 1723, 355, 2119, 677, 2121, 2122, 672, + /* 2730 */ 2086, 667, 673, 1723, 1723, 1723, 1723, 1723, 2118, 1723, + /* 2740 */ 1723, 1723, 1723, 1723, 1723, 2117, 1723, 2153, 674, 2136, + /* 2750 */ 356, 2119, 677, 2121, 2122, 672, 1723, 667, 1723, 1723, + /* 2760 */ 1723, 2086, 1723, 673, 2117, 1723, 2153, 1723, 1723, 352, + /* 2770 */ 2119, 677, 2121, 2122, 672, 2136, 667, 1723, 1723, 1723, + /* 2780 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 2086, 1723, 673, + /* 2790 */ 1723, 1723, 1723, 1723, 1723, 2117, 1723, 2153, 1723, 1723, + /* 2800 */ 357, 2119, 677, 2121, 2122, 672, 2118, 667, 1723, 1723, + /* 2810 */ 1723, 1723, 1723, 1723, 1723, 1723, 674, 1723, 1723, 1723, + /* 2820 */ 1723, 675, 1723, 2153, 1723, 1723, 332, 2119, 677, 2121, + /* 2830 */ 2122, 672, 1723, 667, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2840 */ 1723, 1723, 1723, 2136, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2850 */ 1723, 1723, 1723, 1723, 1723, 2086, 1723, 673, 1723, 1723, + /* 2860 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2870 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, + /* 2880 */ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 2117, + /* 2890 */ 1723, 2153, 1723, 1723, 331, 2119, 677, 2121, 2122, 672, + /* 2900 */ 1723, 667, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 333, 384, 371, 362, 401, 332, 401, 334, 405, 343, - /* 10 */ 343, 370, 12, 13, 14, 0, 399, 400, 377, 378, - /* 20 */ 20, 14, 22, 342, 8, 9, 385, 20, 12, 13, - /* 30 */ 14, 15, 16, 33, 0, 35, 21, 370, 20, 24, - /* 40 */ 25, 26, 27, 28, 29, 30, 31, 32, 3, 382, - /* 50 */ 447, 384, 447, 450, 388, 450, 8, 9, 351, 59, - /* 60 */ 12, 13, 14, 15, 16, 65, 359, 386, 465, 466, - /* 70 */ 465, 466, 72, 470, 471, 470, 471, 12, 13, 14, - /* 80 */ 15, 16, 415, 337, 20, 418, 340, 341, 421, 422, - /* 90 */ 423, 424, 425, 426, 369, 428, 20, 97, 436, 437, - /* 100 */ 100, 67, 68, 69, 70, 71, 381, 73, 74, 75, + /* 0 */ 337, 333, 447, 340, 341, 450, 436, 437, 371, 342, + /* 10 */ 4, 343, 12, 13, 14, 12, 13, 14, 15, 16, + /* 20 */ 20, 466, 22, 8, 9, 470, 471, 12, 13, 14, + /* 30 */ 15, 16, 0, 33, 0, 35, 342, 343, 370, 8, + /* 40 */ 9, 342, 343, 12, 13, 14, 15, 16, 342, 343, + /* 50 */ 382, 0, 384, 386, 384, 361, 8, 9, 21, 59, + /* 60 */ 12, 13, 14, 15, 16, 65, 396, 361, 64, 399, + /* 70 */ 400, 34, 72, 36, 368, 24, 25, 26, 27, 28, + /* 80 */ 29, 30, 31, 32, 416, 332, 418, 334, 59, 421, + /* 90 */ 422, 423, 424, 425, 426, 337, 428, 97, 340, 341, + /* 100 */ 100, 67, 68, 69, 70, 71, 100, 73, 74, 75, /* 110 */ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, - /* 120 */ 86, 87, 88, 89, 90, 91, 92, 93, 461, 462, - /* 130 */ 337, 20, 97, 340, 341, 21, 136, 137, 24, 25, - /* 140 */ 26, 27, 28, 29, 30, 31, 32, 112, 113, 114, - /* 150 */ 115, 116, 117, 118, 119, 120, 121, 370, 123, 124, - /* 160 */ 125, 126, 127, 128, 100, 20, 166, 167, 20, 420, - /* 170 */ 342, 343, 172, 173, 330, 8, 9, 390, 391, 12, - /* 180 */ 13, 14, 15, 16, 166, 167, 186, 20, 188, 361, - /* 190 */ 342, 343, 362, 100, 178, 446, 368, 8, 9, 59, - /* 200 */ 370, 12, 13, 14, 15, 16, 8, 9, 378, 361, - /* 210 */ 12, 13, 14, 15, 16, 215, 216, 0, 218, 219, + /* 120 */ 86, 87, 88, 89, 90, 91, 92, 93, 99, 12, + /* 130 */ 13, 102, 101, 20, 64, 330, 136, 137, 370, 22, + /* 140 */ 472, 473, 443, 444, 445, 377, 447, 448, 20, 450, + /* 150 */ 33, 21, 35, 385, 24, 25, 26, 27, 28, 29, + /* 160 */ 30, 31, 32, 384, 465, 466, 166, 167, 370, 470, + /* 170 */ 471, 447, 172, 173, 450, 377, 59, 380, 399, 400, + /* 180 */ 383, 384, 20, 385, 362, 20, 186, 155, 188, 72, + /* 190 */ 466, 350, 370, 178, 470, 471, 164, 8, 9, 377, + /* 200 */ 378, 12, 13, 14, 15, 16, 401, 385, 367, 111, + /* 210 */ 20, 406, 100, 100, 97, 215, 216, 376, 218, 219, /* 220 */ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - /* 230 */ 230, 231, 232, 233, 234, 235, 12, 13, 0, 370, - /* 240 */ 100, 18, 102, 20, 20, 401, 22, 100, 100, 405, - /* 250 */ 27, 333, 447, 30, 65, 450, 33, 33, 343, 35, - /* 260 */ 391, 343, 24, 25, 26, 27, 28, 29, 30, 31, - /* 270 */ 32, 466, 49, 20, 51, 470, 471, 54, 185, 362, - /* 280 */ 187, 64, 447, 59, 22, 450, 338, 370, 370, 65, - /* 290 */ 342, 447, 344, 277, 450, 378, 72, 35, 109, 101, - /* 300 */ 382, 466, 384, 388, 384, 470, 471, 214, 447, 465, - /* 310 */ 466, 450, 64, 333, 470, 471, 396, 272, 4, 399, - /* 320 */ 400, 97, 99, 343, 100, 345, 465, 466, 35, 342, - /* 330 */ 343, 470, 471, 415, 111, 168, 418, 342, 343, 421, - /* 340 */ 422, 423, 424, 425, 426, 252, 428, 20, 361, 431, - /* 350 */ 370, 433, 434, 435, 165, 368, 361, 439, 440, 97, - /* 360 */ 136, 137, 382, 140, 384, 72, 143, 144, 145, 146, + /* 230 */ 230, 231, 232, 233, 234, 235, 12, 13, 342, 343, + /* 240 */ 4, 18, 20, 20, 20, 447, 22, 81, 450, 236, + /* 250 */ 27, 238, 447, 30, 65, 450, 33, 33, 252, 35, + /* 260 */ 22, 14, 33, 465, 466, 100, 358, 20, 470, 471, + /* 270 */ 465, 466, 49, 35, 51, 470, 471, 54, 49, 43, + /* 280 */ 372, 45, 46, 59, 55, 56, 57, 58, 59, 65, + /* 290 */ 382, 20, 277, 67, 68, 69, 72, 20, 109, 22, + /* 300 */ 74, 75, 76, 186, 333, 188, 80, 141, 142, 1, + /* 310 */ 2, 85, 86, 87, 88, 100, 20, 91, 3, 12, + /* 320 */ 13, 97, 99, 20, 100, 369, 418, 419, 99, 52, + /* 330 */ 164, 102, 215, 216, 111, 20, 428, 381, 442, 443, + /* 340 */ 444, 445, 35, 447, 448, 228, 229, 230, 231, 232, + /* 350 */ 233, 234, 65, 382, 165, 333, 166, 167, 136, 137, + /* 360 */ 136, 137, 370, 140, 252, 252, 143, 144, 145, 146, /* 370 */ 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - /* 380 */ 157, 158, 159, 20, 161, 162, 163, 14, 20, 20, - /* 390 */ 166, 167, 252, 20, 13, 415, 172, 173, 418, 252, - /* 400 */ 252, 421, 422, 423, 424, 425, 426, 64, 428, 20, - /* 410 */ 186, 22, 188, 433, 100, 435, 35, 342, 343, 439, - /* 420 */ 440, 168, 100, 171, 342, 342, 343, 333, 239, 240, + /* 380 */ 157, 158, 159, 391, 161, 162, 163, 342, 343, 22, + /* 390 */ 166, 167, 342, 343, 172, 173, 172, 173, 169, 170, + /* 400 */ 420, 171, 35, 174, 382, 176, 361, 136, 137, 101, + /* 410 */ 186, 361, 188, 368, 8, 9, 101, 252, 12, 13, + /* 420 */ 14, 15, 16, 194, 0, 0, 446, 215, 239, 240, /* 430 */ 241, 242, 243, 244, 245, 246, 247, 248, 249, 215, - /* 440 */ 216, 52, 218, 219, 220, 221, 222, 223, 224, 225, + /* 440 */ 216, 333, 218, 219, 220, 221, 222, 223, 224, 225, /* 450 */ 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, - /* 460 */ 236, 12, 13, 136, 137, 22, 12, 13, 100, 20, - /* 470 */ 22, 22, 67, 68, 69, 393, 382, 395, 35, 74, - /* 480 */ 75, 76, 33, 35, 35, 80, 3, 333, 2, 35, - /* 490 */ 85, 86, 87, 88, 8, 9, 91, 343, 12, 13, - /* 500 */ 14, 15, 16, 20, 20, 136, 137, 333, 59, 257, - /* 510 */ 258, 259, 215, 379, 65, 72, 382, 343, 443, 444, - /* 520 */ 445, 72, 447, 448, 370, 442, 443, 444, 445, 380, - /* 530 */ 447, 448, 383, 384, 366, 20, 382, 22, 384, 166, - /* 540 */ 97, 172, 173, 20, 370, 97, 97, 8, 9, 100, - /* 550 */ 35, 12, 13, 14, 15, 16, 382, 44, 384, 262, - /* 560 */ 263, 264, 265, 266, 267, 268, 252, 52, 18, 415, - /* 570 */ 333, 111, 418, 23, 252, 421, 422, 423, 424, 425, - /* 580 */ 426, 413, 428, 44, 101, 136, 137, 37, 38, 415, - /* 590 */ 236, 41, 418, 358, 4, 421, 422, 423, 424, 425, - /* 600 */ 426, 427, 428, 429, 430, 342, 343, 372, 348, 19, - /* 610 */ 60, 61, 62, 63, 101, 166, 167, 382, 343, 382, - /* 620 */ 252, 172, 173, 33, 361, 365, 472, 473, 338, 186, - /* 630 */ 81, 188, 342, 373, 344, 186, 0, 188, 370, 49, - /* 640 */ 370, 370, 188, 342, 54, 370, 378, 377, 377, 59, - /* 650 */ 100, 168, 168, 418, 419, 385, 385, 72, 215, 216, - /* 660 */ 4, 130, 131, 428, 215, 216, 135, 218, 219, 220, + /* 460 */ 236, 12, 13, 47, 97, 351, 14, 252, 22, 20, + /* 470 */ 37, 22, 20, 359, 262, 263, 264, 265, 266, 267, + /* 480 */ 268, 35, 33, 168, 35, 370, 333, 257, 258, 259, + /* 490 */ 382, 67, 68, 69, 342, 188, 343, 14, 74, 75, + /* 500 */ 76, 0, 215, 20, 80, 390, 391, 101, 59, 85, + /* 510 */ 86, 87, 88, 338, 65, 91, 100, 342, 72, 344, + /* 520 */ 0, 72, 21, 370, 366, 24, 25, 26, 27, 28, + /* 530 */ 29, 30, 31, 32, 343, 382, 103, 384, 105, 106, + /* 540 */ 181, 108, 20, 97, 338, 393, 97, 395, 342, 100, + /* 550 */ 344, 342, 343, 333, 129, 130, 131, 132, 133, 134, + /* 560 */ 135, 370, 129, 343, 205, 206, 133, 20, 18, 416, + /* 570 */ 361, 418, 414, 23, 421, 422, 423, 424, 425, 426, + /* 580 */ 427, 428, 429, 430, 64, 136, 137, 37, 38, 3, + /* 590 */ 370, 41, 8, 9, 383, 384, 12, 13, 14, 15, + /* 600 */ 16, 362, 382, 20, 384, 348, 14, 15, 16, 370, + /* 610 */ 60, 61, 62, 63, 423, 166, 167, 378, 166, 8, + /* 620 */ 9, 172, 173, 12, 13, 14, 15, 16, 44, 35, + /* 630 */ 373, 20, 186, 236, 188, 186, 416, 188, 418, 342, + /* 640 */ 343, 421, 422, 423, 424, 425, 426, 100, 428, 166, + /* 650 */ 100, 431, 401, 433, 434, 435, 111, 406, 361, 439, + /* 660 */ 440, 215, 216, 371, 215, 216, 72, 218, 219, 220, /* 670 */ 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - /* 680 */ 231, 232, 233, 234, 235, 12, 13, 14, 138, 99, - /* 690 */ 141, 142, 102, 20, 393, 22, 395, 333, 423, 43, - /* 700 */ 0, 45, 46, 67, 68, 69, 33, 343, 35, 37, - /* 710 */ 74, 75, 76, 164, 342, 111, 80, 447, 342, 343, - /* 720 */ 450, 85, 86, 87, 88, 342, 343, 91, 178, 179, - /* 730 */ 180, 4, 59, 183, 370, 465, 466, 361, 383, 384, - /* 740 */ 470, 471, 72, 131, 370, 72, 382, 135, 384, 342, - /* 750 */ 343, 377, 1, 2, 204, 342, 343, 207, 371, 385, - /* 760 */ 210, 211, 212, 213, 214, 393, 333, 395, 361, 370, - /* 770 */ 97, 100, 401, 100, 361, 103, 377, 105, 106, 415, - /* 780 */ 108, 110, 418, 333, 385, 421, 422, 423, 424, 425, - /* 790 */ 426, 370, 428, 343, 0, 342, 343, 433, 377, 435, - /* 800 */ 348, 129, 252, 439, 440, 133, 385, 195, 196, 136, - /* 810 */ 137, 199, 350, 201, 361, 382, 452, 401, 447, 334, - /* 820 */ 370, 450, 355, 356, 460, 373, 443, 444, 445, 367, - /* 830 */ 447, 448, 382, 450, 384, 333, 465, 466, 376, 166, - /* 840 */ 167, 470, 471, 342, 343, 172, 173, 130, 465, 466, - /* 850 */ 342, 343, 101, 470, 471, 155, 14, 420, 236, 186, - /* 860 */ 238, 188, 20, 447, 164, 415, 450, 333, 418, 361, - /* 870 */ 371, 421, 422, 423, 424, 425, 426, 432, 428, 434, - /* 880 */ 44, 465, 466, 446, 382, 435, 470, 471, 215, 216, - /* 890 */ 440, 218, 219, 220, 221, 222, 223, 224, 225, 226, + /* 680 */ 231, 232, 233, 234, 235, 12, 13, 14, 138, 370, + /* 690 */ 168, 342, 22, 20, 350, 22, 377, 333, 447, 431, + /* 700 */ 447, 450, 434, 450, 385, 35, 33, 343, 35, 129, + /* 710 */ 130, 131, 132, 133, 134, 135, 465, 466, 465, 466, + /* 720 */ 376, 470, 471, 470, 471, 59, 355, 356, 178, 179, + /* 730 */ 180, 72, 59, 183, 370, 358, 370, 20, 432, 22, + /* 740 */ 434, 358, 393, 377, 395, 72, 382, 379, 384, 372, + /* 750 */ 382, 385, 35, 343, 204, 372, 370, 207, 420, 382, + /* 760 */ 210, 211, 212, 213, 214, 382, 100, 97, 102, 52, + /* 770 */ 97, 385, 342, 100, 420, 362, 130, 131, 333, 168, + /* 780 */ 416, 135, 418, 370, 446, 421, 422, 423, 424, 425, + /* 790 */ 426, 378, 428, 0, 35, 418, 419, 433, 388, 435, + /* 800 */ 446, 418, 252, 439, 440, 428, 333, 2, 333, 136, + /* 810 */ 137, 428, 39, 8, 9, 333, 452, 12, 13, 14, + /* 820 */ 15, 16, 2, 393, 460, 395, 129, 382, 8, 9, + /* 830 */ 133, 72, 12, 13, 14, 15, 16, 342, 343, 166, + /* 840 */ 167, 342, 343, 8, 9, 172, 173, 12, 13, 14, + /* 850 */ 15, 16, 97, 355, 356, 382, 361, 382, 272, 186, + /* 860 */ 361, 188, 250, 251, 382, 342, 343, 112, 113, 114, + /* 870 */ 115, 116, 117, 118, 119, 120, 121, 165, 123, 124, + /* 880 */ 125, 126, 127, 128, 361, 0, 342, 343, 215, 216, + /* 890 */ 333, 218, 219, 220, 221, 222, 223, 224, 225, 226, /* 900 */ 227, 228, 229, 230, 231, 232, 233, 234, 235, 12, - /* 910 */ 13, 432, 20, 434, 197, 198, 382, 20, 181, 22, - /* 920 */ 42, 333, 44, 129, 130, 131, 132, 133, 134, 135, - /* 930 */ 33, 343, 35, 8, 9, 342, 343, 12, 13, 14, - /* 940 */ 15, 16, 205, 206, 443, 444, 445, 333, 447, 448, - /* 950 */ 59, 371, 342, 343, 361, 401, 59, 343, 370, 345, - /* 960 */ 129, 130, 131, 132, 133, 134, 135, 362, 20, 72, - /* 970 */ 382, 361, 384, 342, 343, 370, 14, 15, 16, 420, - /* 980 */ 253, 8, 9, 378, 370, 12, 13, 14, 15, 16, - /* 990 */ 99, 129, 361, 102, 97, 133, 382, 100, 384, 342, - /* 1000 */ 343, 447, 333, 415, 450, 446, 418, 333, 166, 421, - /* 1010 */ 422, 423, 424, 425, 426, 0, 428, 343, 361, 465, - /* 1020 */ 466, 433, 39, 435, 470, 471, 333, 439, 440, 415, - /* 1030 */ 0, 350, 418, 136, 137, 421, 422, 423, 424, 425, - /* 1040 */ 426, 358, 428, 406, 370, 333, 21, 433, 460, 435, - /* 1050 */ 42, 382, 44, 439, 440, 372, 382, 376, 384, 34, - /* 1060 */ 168, 36, 343, 166, 167, 382, 2, 342, 343, 172, - /* 1070 */ 173, 165, 8, 9, 101, 382, 12, 13, 14, 15, - /* 1080 */ 16, 355, 356, 186, 371, 188, 361, 342, 343, 415, - /* 1090 */ 342, 343, 418, 168, 382, 421, 422, 423, 424, 425, - /* 1100 */ 426, 418, 428, 45, 46, 363, 361, 388, 366, 361, - /* 1110 */ 274, 428, 215, 216, 166, 218, 219, 220, 221, 222, + /* 910 */ 13, 130, 348, 45, 46, 100, 401, 20, 252, 22, + /* 920 */ 72, 333, 129, 130, 131, 132, 133, 134, 135, 365, + /* 930 */ 33, 343, 35, 342, 343, 342, 343, 373, 432, 382, + /* 940 */ 434, 342, 343, 14, 371, 342, 343, 333, 370, 20, + /* 950 */ 333, 239, 361, 4, 361, 377, 59, 343, 370, 345, + /* 960 */ 361, 249, 447, 385, 361, 450, 20, 371, 370, 72, + /* 970 */ 382, 333, 384, 333, 342, 343, 378, 333, 197, 198, + /* 980 */ 465, 466, 333, 44, 370, 470, 471, 443, 444, 445, + /* 990 */ 363, 447, 448, 366, 97, 371, 382, 100, 384, 382, + /* 1000 */ 185, 358, 187, 168, 416, 343, 418, 333, 333, 421, + /* 1010 */ 422, 423, 424, 425, 426, 372, 428, 343, 20, 333, + /* 1020 */ 382, 433, 382, 435, 251, 382, 382, 439, 440, 214, + /* 1030 */ 416, 382, 418, 136, 137, 421, 422, 423, 424, 425, + /* 1040 */ 426, 131, 428, 362, 370, 135, 20, 433, 460, 435, + /* 1050 */ 388, 370, 333, 439, 440, 333, 382, 382, 384, 378, + /* 1060 */ 13, 418, 419, 166, 167, 342, 343, 252, 382, 172, + /* 1070 */ 173, 428, 342, 343, 44, 443, 444, 445, 379, 447, + /* 1080 */ 448, 382, 35, 186, 361, 188, 136, 137, 342, 343, + /* 1090 */ 416, 361, 418, 333, 209, 421, 422, 423, 424, 425, + /* 1100 */ 426, 382, 428, 371, 382, 195, 196, 361, 343, 199, + /* 1110 */ 371, 201, 215, 216, 168, 218, 219, 220, 221, 222, /* 1120 */ 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - /* 1130 */ 233, 234, 235, 12, 13, 333, 462, 333, 342, 343, - /* 1140 */ 333, 20, 333, 22, 358, 239, 333, 343, 333, 345, - /* 1150 */ 342, 343, 342, 343, 33, 249, 35, 361, 372, 129, - /* 1160 */ 130, 131, 132, 133, 134, 135, 333, 431, 382, 361, - /* 1170 */ 434, 361, 250, 251, 370, 370, 379, 14, 379, 382, - /* 1180 */ 59, 382, 333, 20, 382, 358, 382, 333, 384, 382, - /* 1190 */ 385, 382, 358, 72, 0, 382, 44, 382, 333, 372, - /* 1200 */ 333, 333, 0, 371, 418, 419, 372, 357, 104, 382, - /* 1210 */ 360, 107, 111, 48, 428, 382, 382, 104, 97, 415, - /* 1220 */ 107, 100, 418, 333, 209, 421, 422, 423, 424, 425, - /* 1230 */ 426, 382, 428, 343, 251, 345, 382, 433, 44, 435, - /* 1240 */ 44, 22, 13, 439, 440, 418, 419, 382, 0, 382, - /* 1250 */ 382, 49, 418, 104, 35, 428, 107, 136, 137, 0, - /* 1260 */ 370, 160, 428, 104, 35, 44, 107, 0, 13, 200, - /* 1270 */ 22, 202, 382, 65, 384, 44, 59, 44, 44, 136, - /* 1280 */ 137, 22, 1, 2, 371, 47, 359, 166, 167, 22, - /* 1290 */ 35, 392, 474, 172, 173, 346, 457, 101, 463, 358, - /* 1300 */ 35, 35, 13, 358, 44, 415, 44, 186, 418, 188, - /* 1310 */ 370, 421, 422, 423, 424, 425, 426, 44, 428, 102, - /* 1320 */ 44, 44, 101, 433, 35, 435, 346, 44, 44, 439, - /* 1330 */ 440, 392, 101, 168, 101, 101, 215, 216, 100, 218, + /* 1130 */ 233, 234, 235, 12, 13, 461, 462, 333, 358, 342, + /* 1140 */ 343, 20, 382, 22, 342, 343, 0, 343, 111, 345, + /* 1150 */ 342, 343, 372, 388, 33, 333, 35, 44, 361, 342, + /* 1160 */ 343, 4, 382, 361, 379, 0, 168, 382, 357, 361, + /* 1170 */ 42, 360, 44, 42, 370, 44, 19, 200, 361, 202, + /* 1180 */ 59, 104, 104, 13, 107, 107, 382, 359, 384, 44, + /* 1190 */ 33, 0, 166, 72, 44, 49, 44, 160, 418, 401, + /* 1200 */ 104, 401, 253, 107, 382, 35, 49, 104, 428, 44, + /* 1210 */ 107, 54, 0, 22, 101, 276, 59, 35, 97, 0, + /* 1220 */ 416, 100, 418, 333, 44, 421, 422, 423, 424, 425, + /* 1230 */ 426, 401, 428, 343, 22, 345, 59, 433, 48, 435, + /* 1240 */ 44, 22, 44, 439, 440, 447, 101, 447, 450, 35, + /* 1250 */ 450, 101, 0, 101, 407, 334, 99, 136, 137, 102, + /* 1260 */ 370, 1, 2, 465, 466, 465, 466, 44, 470, 471, + /* 1270 */ 470, 471, 382, 100, 384, 44, 44, 447, 44, 102, + /* 1280 */ 450, 101, 463, 110, 392, 358, 474, 166, 167, 346, + /* 1290 */ 457, 358, 370, 172, 173, 465, 466, 101, 346, 101, + /* 1300 */ 470, 471, 50, 44, 274, 44, 416, 186, 418, 188, + /* 1310 */ 392, 421, 422, 423, 424, 425, 426, 44, 428, 44, + /* 1320 */ 44, 44, 44, 433, 101, 435, 341, 343, 381, 439, + /* 1330 */ 440, 449, 101, 101, 392, 101, 215, 216, 467, 218, /* 1340 */ 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - /* 1350 */ 229, 230, 231, 232, 233, 234, 235, 333, 12, 13, - /* 1360 */ 35, 101, 44, 101, 44, 44, 0, 343, 22, 345, - /* 1370 */ 44, 343, 44, 341, 101, 381, 392, 101, 101, 33, - /* 1380 */ 44, 35, 449, 333, 101, 101, 467, 44, 441, 451, - /* 1390 */ 254, 417, 416, 343, 370, 345, 49, 72, 184, 403, - /* 1400 */ 42, 389, 20, 392, 165, 59, 382, 389, 384, 387, - /* 1410 */ 20, 98, 342, 342, 387, 389, 50, 354, 72, 101, - /* 1420 */ 370, 101, 101, 215, 387, 96, 353, 101, 276, 101, - /* 1430 */ 333, 342, 382, 95, 384, 352, 342, 101, 342, 415, - /* 1440 */ 343, 342, 418, 97, 101, 421, 422, 423, 424, 425, - /* 1450 */ 426, 333, 428, 188, 188, 20, 48, 433, 335, 435, - /* 1460 */ 335, 343, 20, 439, 440, 415, 339, 370, 418, 339, - /* 1470 */ 410, 421, 422, 423, 424, 425, 426, 20, 428, 382, - /* 1480 */ 20, 384, 350, 433, 384, 435, 344, 350, 370, 439, - /* 1490 */ 440, 20, 402, 53, 350, 344, 350, 350, 350, 342, - /* 1500 */ 382, 347, 384, 350, 335, 347, 342, 335, 370, 370, - /* 1510 */ 370, 370, 415, 382, 203, 418, 382, 382, 421, 422, - /* 1520 */ 423, 424, 425, 426, 414, 428, 370, 100, 412, 410, - /* 1530 */ 370, 370, 186, 415, 188, 348, 418, 370, 370, 421, - /* 1540 */ 422, 423, 424, 425, 426, 370, 428, 370, 192, 348, - /* 1550 */ 191, 433, 190, 435, 409, 333, 382, 439, 440, 261, - /* 1560 */ 384, 215, 216, 408, 456, 343, 342, 260, 397, 407, - /* 1570 */ 473, 392, 392, 382, 228, 229, 230, 231, 232, 233, - /* 1580 */ 234, 397, 456, 269, 177, 382, 382, 459, 271, 270, - /* 1590 */ 255, 458, 370, 278, 343, 417, 251, 475, 275, 20, - /* 1600 */ 273, 420, 344, 342, 382, 455, 384, 20, 395, 397, - /* 1610 */ 382, 348, 348, 397, 382, 170, 348, 382, 382, 382, - /* 1620 */ 394, 333, 456, 382, 454, 343, 453, 348, 100, 100, - /* 1630 */ 438, 343, 382, 342, 360, 366, 36, 415, 348, 336, - /* 1640 */ 418, 335, 398, 421, 422, 423, 424, 425, 426, 333, - /* 1650 */ 428, 469, 374, 468, 411, 433, 404, 435, 370, 343, - /* 1660 */ 364, 439, 440, 364, 364, 331, 0, 0, 398, 0, - /* 1670 */ 382, 349, 384, 42, 0, 35, 208, 35, 35, 35, - /* 1680 */ 208, 333, 0, 35, 35, 208, 370, 0, 208, 0, - /* 1690 */ 35, 343, 22, 0, 35, 195, 188, 186, 382, 0, - /* 1700 */ 384, 0, 0, 415, 0, 182, 418, 181, 0, 421, - /* 1710 */ 422, 423, 424, 425, 426, 0, 428, 0, 370, 47, - /* 1720 */ 0, 433, 0, 435, 0, 42, 0, 439, 440, 0, - /* 1730 */ 382, 415, 384, 0, 418, 0, 0, 421, 422, 423, - /* 1740 */ 424, 425, 426, 0, 428, 0, 155, 35, 0, 155, - /* 1750 */ 0, 435, 333, 0, 0, 439, 440, 139, 42, 0, - /* 1760 */ 0, 0, 343, 415, 0, 0, 418, 0, 0, 421, - /* 1770 */ 422, 423, 424, 425, 426, 0, 428, 0, 0, 0, - /* 1780 */ 333, 0, 0, 435, 0, 0, 0, 439, 440, 370, - /* 1790 */ 343, 0, 0, 0, 22, 0, 0, 0, 0, 333, - /* 1800 */ 0, 382, 22, 384, 48, 22, 48, 0, 59, 343, - /* 1810 */ 0, 35, 0, 0, 59, 333, 0, 370, 44, 14, - /* 1820 */ 47, 59, 0, 0, 0, 343, 39, 0, 39, 382, - /* 1830 */ 42, 384, 0, 39, 415, 177, 370, 418, 0, 0, - /* 1840 */ 421, 422, 423, 424, 425, 426, 47, 428, 382, 47, - /* 1850 */ 384, 40, 370, 0, 435, 0, 66, 375, 439, 440, - /* 1860 */ 35, 0, 415, 49, 382, 418, 384, 39, 421, 422, - /* 1870 */ 423, 424, 425, 426, 39, 428, 333, 35, 49, 0, - /* 1880 */ 35, 415, 49, 39, 418, 0, 343, 421, 422, 423, - /* 1890 */ 424, 425, 426, 35, 428, 49, 430, 415, 1, 333, - /* 1900 */ 418, 39, 0, 421, 422, 423, 424, 425, 426, 343, - /* 1910 */ 428, 464, 0, 370, 0, 0, 19, 109, 375, 35, - /* 1920 */ 22, 0, 107, 35, 35, 382, 35, 384, 35, 35, - /* 1930 */ 33, 35, 22, 0, 35, 22, 370, 51, 35, 44, - /* 1940 */ 35, 375, 35, 0, 44, 22, 49, 0, 382, 22, - /* 1950 */ 384, 35, 55, 56, 57, 58, 59, 35, 415, 0, - /* 1960 */ 0, 418, 0, 35, 421, 422, 423, 424, 425, 426, - /* 1970 */ 22, 428, 20, 35, 35, 35, 101, 100, 0, 35, - /* 1980 */ 100, 415, 0, 22, 418, 168, 22, 421, 422, 423, - /* 1990 */ 424, 425, 426, 333, 428, 189, 99, 0, 168, 102, - /* 2000 */ 0, 170, 193, 343, 168, 3, 100, 44, 256, 175, - /* 2010 */ 101, 100, 44, 48, 48, 98, 96, 44, 44, 101, - /* 2020 */ 101, 44, 47, 47, 100, 333, 100, 256, 3, 100, - /* 2030 */ 370, 134, 101, 101, 100, 343, 101, 44, 35, 47, - /* 2040 */ 35, 35, 382, 333, 384, 35, 35, 35, 47, 0, - /* 2050 */ 101, 101, 44, 343, 0, 0, 0, 256, 100, 39, - /* 2060 */ 47, 171, 370, 0, 110, 39, 169, 100, 250, 47, - /* 2070 */ 101, 174, 101, 169, 382, 415, 384, 44, 418, 100, - /* 2080 */ 370, 421, 422, 423, 424, 425, 426, 100, 428, 100, - /* 2090 */ 333, 194, 382, 237, 384, 100, 98, 98, 2, 22, - /* 2100 */ 343, 22, 215, 35, 47, 47, 35, 415, 101, 100, - /* 2110 */ 418, 35, 122, 421, 422, 423, 424, 425, 426, 100, - /* 2120 */ 428, 35, 101, 100, 100, 415, 111, 370, 418, 101, - /* 2130 */ 100, 421, 422, 423, 424, 425, 426, 333, 428, 382, - /* 2140 */ 101, 384, 217, 100, 35, 101, 100, 343, 101, 101, - /* 2150 */ 100, 100, 35, 101, 101, 44, 122, 122, 122, 333, - /* 2160 */ 100, 100, 100, 35, 100, 100, 22, 66, 65, 343, - /* 2170 */ 35, 35, 415, 44, 370, 418, 35, 35, 421, 422, - /* 2180 */ 423, 424, 425, 426, 333, 428, 382, 35, 384, 35, - /* 2190 */ 35, 35, 72, 94, 343, 35, 370, 35, 35, 22, - /* 2200 */ 35, 35, 35, 72, 35, 35, 333, 35, 382, 35, - /* 2210 */ 384, 35, 22, 35, 0, 35, 343, 49, 39, 415, - /* 2220 */ 0, 370, 418, 35, 49, 421, 422, 423, 424, 425, - /* 2230 */ 426, 39, 428, 382, 0, 384, 35, 39, 49, 0, - /* 2240 */ 35, 415, 49, 370, 418, 39, 0, 421, 422, 423, - /* 2250 */ 424, 425, 426, 35, 428, 382, 35, 384, 22, 21, - /* 2260 */ 476, 476, 22, 22, 21, 20, 415, 0, 476, 418, - /* 2270 */ 333, 476, 421, 422, 423, 424, 425, 426, 476, 428, - /* 2280 */ 343, 476, 476, 476, 476, 476, 476, 476, 415, 476, - /* 2290 */ 333, 418, 476, 476, 421, 422, 423, 424, 425, 426, - /* 2300 */ 343, 428, 476, 476, 476, 333, 476, 370, 476, 476, - /* 2310 */ 476, 476, 476, 476, 476, 343, 476, 476, 476, 382, - /* 2320 */ 476, 384, 476, 476, 476, 476, 476, 370, 476, 476, - /* 2330 */ 476, 476, 476, 476, 476, 476, 476, 333, 476, 382, - /* 2340 */ 476, 384, 370, 476, 476, 476, 476, 343, 476, 476, - /* 2350 */ 476, 476, 415, 476, 382, 418, 384, 476, 421, 422, - /* 2360 */ 423, 424, 425, 426, 476, 428, 476, 476, 476, 476, - /* 2370 */ 476, 476, 415, 476, 370, 418, 476, 476, 421, 422, - /* 2380 */ 423, 424, 425, 426, 476, 428, 382, 415, 384, 476, - /* 2390 */ 418, 476, 476, 421, 422, 423, 424, 425, 426, 476, - /* 2400 */ 428, 476, 476, 476, 476, 333, 476, 476, 476, 476, - /* 2410 */ 476, 476, 476, 476, 476, 343, 476, 476, 476, 415, - /* 2420 */ 476, 476, 418, 476, 333, 421, 422, 423, 424, 425, - /* 2430 */ 426, 476, 428, 476, 343, 476, 476, 476, 476, 476, - /* 2440 */ 476, 476, 370, 476, 476, 476, 476, 476, 476, 476, - /* 2450 */ 476, 476, 333, 476, 382, 476, 384, 476, 476, 476, - /* 2460 */ 476, 370, 343, 476, 476, 476, 476, 476, 476, 476, - /* 2470 */ 476, 333, 476, 382, 476, 384, 476, 476, 476, 476, - /* 2480 */ 476, 343, 476, 476, 476, 476, 476, 415, 476, 370, - /* 2490 */ 418, 476, 476, 421, 422, 423, 424, 425, 426, 476, - /* 2500 */ 428, 382, 476, 384, 476, 476, 415, 476, 370, 418, - /* 2510 */ 476, 476, 421, 422, 423, 424, 425, 426, 333, 428, - /* 2520 */ 382, 476, 384, 476, 476, 476, 476, 476, 343, 476, - /* 2530 */ 476, 476, 476, 476, 415, 476, 476, 418, 476, 476, - /* 2540 */ 421, 422, 423, 424, 425, 426, 476, 428, 476, 476, - /* 2550 */ 476, 476, 476, 415, 476, 370, 418, 476, 476, 421, - /* 2560 */ 422, 423, 424, 425, 426, 476, 428, 382, 476, 384, - /* 2570 */ 476, 476, 476, 476, 476, 333, 476, 476, 476, 476, - /* 2580 */ 476, 476, 476, 476, 476, 343, 476, 476, 476, 476, - /* 2590 */ 476, 333, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2600 */ 415, 343, 476, 418, 476, 476, 421, 422, 423, 424, - /* 2610 */ 425, 426, 370, 428, 476, 476, 476, 476, 476, 476, - /* 2620 */ 476, 476, 476, 476, 382, 476, 384, 476, 370, 476, - /* 2630 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2640 */ 382, 333, 384, 476, 476, 476, 476, 476, 476, 476, - /* 2650 */ 476, 343, 476, 476, 476, 476, 476, 415, 476, 476, - /* 2660 */ 418, 333, 476, 421, 422, 423, 424, 425, 426, 476, - /* 2670 */ 428, 343, 476, 415, 476, 476, 418, 476, 370, 421, - /* 2680 */ 422, 423, 424, 425, 426, 476, 428, 476, 476, 476, - /* 2690 */ 382, 476, 384, 476, 476, 476, 476, 476, 370, 476, - /* 2700 */ 476, 476, 476, 476, 476, 476, 476, 476, 333, 476, - /* 2710 */ 382, 476, 384, 476, 476, 476, 476, 476, 343, 476, - /* 2720 */ 476, 476, 476, 415, 476, 476, 418, 476, 476, 421, - /* 2730 */ 422, 423, 424, 425, 426, 476, 428, 476, 476, 476, - /* 2740 */ 476, 476, 33, 415, 476, 370, 418, 476, 476, 421, - /* 2750 */ 422, 423, 424, 425, 426, 476, 428, 382, 49, 384, - /* 2760 */ 476, 476, 476, 476, 55, 56, 57, 58, 59, 476, - /* 2770 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2780 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2790 */ 415, 476, 476, 418, 476, 476, 421, 422, 423, 424, - /* 2800 */ 425, 426, 476, 428, 476, 476, 476, 476, 99, 476, - /* 2810 */ 476, 102, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2820 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2830 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2840 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2850 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + /* 1350 */ 229, 230, 231, 232, 233, 234, 235, 333, 168, 44, + /* 1360 */ 101, 441, 101, 13, 44, 451, 13, 343, 254, 345, + /* 1370 */ 188, 402, 49, 417, 101, 404, 101, 101, 101, 101, + /* 1380 */ 42, 184, 389, 333, 20, 35, 392, 165, 35, 389, + /* 1390 */ 387, 20, 387, 343, 370, 345, 342, 342, 389, 387, + /* 1400 */ 98, 96, 188, 354, 353, 342, 382, 95, 384, 352, + /* 1410 */ 342, 342, 342, 20, 335, 48, 101, 335, 20, 339, + /* 1420 */ 370, 101, 339, 350, 411, 20, 384, 20, 344, 20, + /* 1430 */ 403, 350, 382, 344, 384, 350, 350, 350, 350, 342, + /* 1440 */ 416, 350, 418, 53, 335, 421, 422, 423, 424, 425, + /* 1450 */ 426, 347, 428, 347, 382, 333, 382, 433, 382, 435, + /* 1460 */ 370, 342, 370, 439, 440, 343, 416, 345, 418, 370, + /* 1470 */ 370, 421, 422, 423, 424, 425, 426, 370, 428, 335, + /* 1480 */ 370, 333, 370, 433, 203, 435, 370, 370, 370, 439, + /* 1490 */ 440, 343, 370, 370, 100, 348, 192, 191, 190, 384, + /* 1500 */ 342, 348, 261, 392, 382, 410, 384, 413, 415, 411, + /* 1510 */ 409, 382, 456, 408, 333, 260, 392, 382, 370, 382, + /* 1520 */ 456, 382, 402, 397, 343, 269, 459, 397, 177, 458, + /* 1530 */ 382, 456, 384, 271, 270, 255, 402, 475, 416, 273, + /* 1540 */ 418, 278, 275, 421, 422, 423, 424, 425, 426, 251, + /* 1550 */ 428, 370, 343, 20, 344, 433, 454, 435, 420, 342, + /* 1560 */ 20, 439, 440, 382, 416, 384, 418, 395, 402, 421, + /* 1570 */ 422, 423, 424, 425, 426, 348, 428, 469, 348, 366, + /* 1580 */ 455, 433, 397, 435, 382, 453, 382, 439, 440, 382, + /* 1590 */ 382, 333, 397, 382, 170, 468, 348, 416, 382, 418, + /* 1600 */ 394, 343, 421, 422, 423, 424, 425, 426, 100, 428, + /* 1610 */ 100, 343, 438, 348, 433, 382, 435, 374, 348, 36, + /* 1620 */ 439, 440, 333, 336, 342, 335, 405, 412, 370, 360, + /* 1630 */ 331, 0, 343, 398, 398, 364, 364, 349, 364, 0, + /* 1640 */ 382, 0, 384, 42, 0, 35, 208, 35, 35, 35, + /* 1650 */ 333, 208, 0, 35, 35, 208, 0, 208, 0, 370, + /* 1660 */ 343, 35, 0, 0, 22, 35, 195, 188, 186, 0, + /* 1670 */ 0, 382, 0, 384, 416, 182, 418, 181, 0, 421, + /* 1680 */ 422, 423, 424, 425, 426, 333, 428, 370, 0, 0, + /* 1690 */ 47, 433, 0, 435, 0, 343, 42, 439, 440, 382, + /* 1700 */ 0, 384, 0, 0, 0, 416, 0, 418, 0, 0, + /* 1710 */ 421, 422, 423, 424, 425, 426, 0, 428, 35, 155, + /* 1720 */ 0, 155, 370, 0, 435, 0, 0, 0, 439, 440, + /* 1730 */ 0, 0, 0, 416, 382, 418, 384, 0, 421, 422, + /* 1740 */ 423, 424, 425, 426, 0, 428, 0, 0, 0, 0, + /* 1750 */ 0, 0, 435, 0, 42, 0, 439, 440, 0, 0, + /* 1760 */ 0, 0, 0, 22, 0, 0, 0, 139, 416, 48, + /* 1770 */ 418, 0, 0, 421, 422, 423, 424, 425, 426, 333, + /* 1780 */ 428, 48, 0, 59, 0, 22, 0, 435, 59, 343, + /* 1790 */ 22, 439, 440, 0, 59, 0, 42, 14, 0, 333, + /* 1800 */ 44, 0, 35, 0, 47, 0, 177, 0, 0, 343, + /* 1810 */ 333, 0, 39, 0, 0, 40, 370, 47, 39, 39, + /* 1820 */ 343, 47, 35, 0, 39, 35, 49, 49, 382, 0, + /* 1830 */ 384, 39, 35, 39, 0, 35, 370, 49, 49, 0, + /* 1840 */ 0, 39, 66, 0, 0, 109, 107, 370, 382, 22, + /* 1850 */ 384, 35, 0, 35, 35, 35, 35, 35, 22, 382, + /* 1860 */ 35, 384, 416, 35, 418, 35, 0, 421, 422, 423, + /* 1870 */ 424, 425, 426, 35, 428, 22, 44, 44, 0, 22, + /* 1880 */ 35, 435, 416, 0, 418, 22, 440, 421, 422, 423, + /* 1890 */ 424, 425, 426, 416, 428, 418, 333, 51, 421, 422, + /* 1900 */ 423, 424, 425, 426, 35, 428, 343, 333, 0, 35, + /* 1910 */ 0, 35, 0, 22, 20, 35, 35, 343, 101, 35, + /* 1920 */ 0, 193, 333, 22, 100, 35, 100, 0, 462, 189, + /* 1930 */ 0, 22, 343, 370, 0, 3, 44, 256, 101, 98, + /* 1940 */ 44, 464, 100, 48, 370, 382, 48, 384, 100, 375, + /* 1950 */ 96, 170, 101, 47, 47, 44, 382, 101, 384, 370, + /* 1960 */ 100, 100, 100, 44, 168, 101, 175, 168, 100, 44, + /* 1970 */ 256, 382, 168, 384, 101, 3, 101, 44, 256, 416, + /* 1980 */ 35, 418, 35, 35, 421, 422, 423, 424, 425, 426, + /* 1990 */ 416, 428, 418, 333, 35, 421, 422, 423, 424, 425, + /* 2000 */ 426, 35, 428, 343, 35, 416, 101, 418, 333, 47, + /* 2010 */ 421, 422, 423, 424, 425, 426, 1, 428, 343, 430, + /* 2020 */ 44, 47, 101, 0, 0, 0, 0, 39, 100, 47, + /* 2030 */ 370, 100, 0, 39, 19, 375, 473, 101, 101, 100, + /* 2040 */ 100, 171, 382, 100, 384, 370, 169, 47, 33, 100, + /* 2050 */ 375, 110, 44, 98, 98, 2, 250, 382, 22, 384, + /* 2060 */ 100, 100, 215, 100, 49, 101, 101, 333, 101, 47, + /* 2070 */ 55, 56, 57, 58, 59, 100, 416, 343, 418, 100, + /* 2080 */ 47, 421, 422, 423, 424, 425, 426, 237, 428, 22, + /* 2090 */ 101, 416, 100, 418, 111, 35, 421, 422, 423, 424, + /* 2100 */ 425, 426, 333, 428, 370, 35, 217, 101, 101, 100, + /* 2110 */ 35, 100, 343, 101, 99, 35, 382, 102, 384, 100, + /* 2120 */ 35, 35, 101, 122, 122, 122, 44, 100, 35, 101, + /* 2130 */ 100, 100, 122, 22, 100, 66, 65, 100, 35, 370, + /* 2140 */ 35, 35, 35, 35, 35, 35, 72, 35, 94, 134, + /* 2150 */ 416, 382, 418, 384, 22, 421, 422, 423, 424, 425, + /* 2160 */ 426, 44, 428, 35, 333, 35, 35, 72, 35, 35, + /* 2170 */ 35, 35, 35, 35, 343, 35, 35, 22, 35, 0, + /* 2180 */ 35, 39, 0, 35, 169, 416, 0, 418, 49, 174, + /* 2190 */ 421, 422, 423, 424, 425, 426, 49, 428, 39, 35, + /* 2200 */ 49, 370, 39, 0, 35, 49, 39, 0, 35, 194, + /* 2210 */ 35, 0, 22, 382, 21, 384, 22, 22, 21, 20, + /* 2220 */ 476, 333, 476, 476, 476, 476, 476, 476, 476, 476, + /* 2230 */ 476, 343, 333, 476, 476, 476, 476, 476, 476, 476, + /* 2240 */ 476, 476, 343, 476, 476, 476, 476, 416, 476, 418, + /* 2250 */ 476, 333, 421, 422, 423, 424, 425, 426, 370, 428, + /* 2260 */ 476, 343, 476, 476, 476, 476, 476, 476, 476, 370, + /* 2270 */ 382, 476, 384, 476, 476, 476, 476, 476, 476, 476, + /* 2280 */ 476, 382, 476, 384, 476, 476, 476, 476, 370, 476, + /* 2290 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + /* 2300 */ 382, 476, 384, 476, 416, 476, 418, 476, 476, 421, + /* 2310 */ 422, 423, 424, 425, 426, 416, 428, 418, 333, 476, + /* 2320 */ 421, 422, 423, 424, 425, 426, 476, 428, 343, 476, + /* 2330 */ 476, 476, 476, 476, 416, 476, 418, 333, 476, 421, + /* 2340 */ 422, 423, 424, 425, 426, 476, 428, 343, 476, 476, + /* 2350 */ 476, 476, 476, 333, 476, 370, 476, 476, 476, 476, + /* 2360 */ 476, 476, 476, 343, 476, 476, 476, 382, 333, 384, + /* 2370 */ 476, 476, 476, 476, 370, 476, 476, 476, 343, 476, + /* 2380 */ 476, 476, 476, 476, 333, 476, 382, 476, 384, 476, + /* 2390 */ 370, 476, 476, 476, 343, 476, 476, 476, 476, 476, + /* 2400 */ 476, 416, 382, 418, 384, 370, 421, 422, 423, 424, + /* 2410 */ 425, 426, 476, 428, 476, 476, 476, 382, 476, 384, + /* 2420 */ 416, 370, 418, 476, 476, 421, 422, 423, 424, 425, + /* 2430 */ 426, 476, 428, 382, 476, 384, 416, 476, 418, 476, + /* 2440 */ 476, 421, 422, 423, 424, 425, 426, 476, 428, 476, + /* 2450 */ 476, 416, 333, 418, 476, 476, 421, 422, 423, 424, + /* 2460 */ 425, 426, 343, 428, 476, 476, 476, 416, 476, 418, + /* 2470 */ 476, 476, 421, 422, 423, 424, 425, 426, 476, 428, + /* 2480 */ 476, 476, 476, 333, 476, 476, 476, 476, 476, 370, + /* 2490 */ 476, 476, 476, 343, 476, 476, 476, 476, 476, 476, + /* 2500 */ 476, 382, 476, 384, 476, 476, 476, 476, 476, 476, + /* 2510 */ 476, 476, 476, 476, 476, 476, 476, 476, 333, 476, + /* 2520 */ 370, 476, 476, 476, 476, 476, 476, 476, 343, 476, + /* 2530 */ 476, 476, 382, 476, 384, 416, 476, 418, 476, 476, + /* 2540 */ 421, 422, 423, 424, 425, 426, 476, 428, 476, 333, + /* 2550 */ 476, 476, 476, 476, 476, 370, 476, 476, 476, 343, + /* 2560 */ 476, 476, 476, 476, 476, 476, 416, 382, 418, 384, + /* 2570 */ 476, 421, 422, 423, 424, 425, 426, 476, 428, 476, + /* 2580 */ 476, 476, 476, 476, 476, 476, 370, 476, 476, 476, + /* 2590 */ 476, 476, 476, 476, 476, 476, 476, 476, 382, 476, + /* 2600 */ 384, 416, 476, 418, 476, 476, 421, 422, 423, 424, + /* 2610 */ 425, 426, 476, 428, 476, 333, 476, 476, 476, 476, + /* 2620 */ 476, 476, 476, 476, 476, 343, 476, 476, 476, 476, + /* 2630 */ 476, 476, 416, 476, 418, 476, 333, 421, 422, 423, + /* 2640 */ 424, 425, 426, 476, 428, 476, 343, 476, 476, 476, + /* 2650 */ 476, 476, 370, 476, 476, 476, 476, 476, 476, 476, + /* 2660 */ 476, 476, 333, 476, 382, 476, 384, 476, 476, 476, + /* 2670 */ 476, 476, 343, 370, 476, 476, 476, 476, 476, 476, + /* 2680 */ 476, 333, 476, 476, 476, 382, 476, 384, 476, 476, + /* 2690 */ 476, 343, 476, 476, 476, 476, 476, 476, 416, 370, + /* 2700 */ 418, 476, 476, 421, 422, 423, 424, 425, 426, 476, + /* 2710 */ 428, 382, 333, 384, 476, 476, 476, 476, 370, 416, + /* 2720 */ 476, 418, 343, 476, 421, 422, 423, 424, 425, 426, + /* 2730 */ 382, 428, 384, 476, 476, 476, 476, 476, 333, 476, + /* 2740 */ 476, 476, 476, 476, 476, 416, 476, 418, 343, 370, + /* 2750 */ 421, 422, 423, 424, 425, 426, 476, 428, 476, 476, + /* 2760 */ 476, 382, 476, 384, 416, 476, 418, 476, 476, 421, + /* 2770 */ 422, 423, 424, 425, 426, 370, 428, 476, 476, 476, + /* 2780 */ 476, 476, 476, 476, 476, 476, 476, 382, 476, 384, + /* 2790 */ 476, 476, 476, 476, 476, 416, 476, 418, 476, 476, + /* 2800 */ 421, 422, 423, 424, 425, 426, 333, 428, 476, 476, + /* 2810 */ 476, 476, 476, 476, 476, 476, 343, 476, 476, 476, + /* 2820 */ 476, 416, 476, 418, 476, 476, 421, 422, 423, 424, + /* 2830 */ 425, 426, 476, 428, 476, 476, 476, 476, 476, 476, + /* 2840 */ 476, 476, 476, 370, 476, 476, 476, 476, 476, 476, + /* 2850 */ 476, 476, 476, 476, 476, 382, 476, 384, 476, 476, /* 2860 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2870 */ 476, 476, 476, 476, 476, 476, 476, 476, 169, 170, - /* 2880 */ 476, 476, 476, 174, 476, 176, 476, 476, 476, 476, - /* 2890 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2900 */ 476, 476, 476, 194, 476, 476, 476, 476, 476, 476, - /* 2910 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2920 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2930 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2940 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2950 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2960 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2970 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2980 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 2990 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3000 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3010 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3020 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3030 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3040 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3050 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3060 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, - /* 3070 */ 476, 476, 476, 330, 330, 330, 330, 330, 330, 330, + /* 2870 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + /* 2880 */ 476, 476, 476, 476, 476, 476, 476, 476, 476, 416, + /* 2890 */ 476, 418, 476, 476, 421, 422, 423, 424, 425, 426, + /* 2900 */ 476, 428, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2910 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2920 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2930 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2940 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2950 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2960 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2970 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2980 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 2990 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3000 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3010 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3020 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3030 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3040 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3050 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3060 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + /* 3070 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, /* 3080 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, /* 3090 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, /* 3100 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, @@ -836,205 +836,205 @@ static const YYCODETYPE yy_lookahead[] = { /* 3200 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, /* 3210 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, /* 3220 */ 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - /* 3230 */ 330, 330, 330, 330, + /* 3230 */ 330, 330, }; -#define YY_SHIFT_COUNT (761) +#define YY_SHIFT_COUNT (763) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2709) +#define YY_SHIFT_MAX (2211) static const unsigned short int yy_shift_ofst[] = { /* 0 */ 550, 0, 224, 0, 449, 449, 449, 449, 449, 449, /* 10 */ 449, 449, 449, 449, 449, 449, 673, 897, 897, 1121, /* 20 */ 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, /* 30 */ 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, - /* 40 */ 897, 897, 897, 897, 897, 897, 897, 897, 897, 148, - /* 50 */ 368, 93, 64, 140, 147, 322, 147, 64, 64, 1346, - /* 60 */ 1346, 1346, 147, 1346, 1346, 314, 147, 76, 369, 111, - /* 70 */ 111, 369, 656, 656, 18, 327, 7, 7, 111, 111, - /* 80 */ 111, 111, 111, 111, 111, 145, 111, 111, 248, 76, - /* 90 */ 111, 111, 363, 111, 76, 111, 145, 111, 145, 76, - /* 100 */ 111, 111, 76, 111, 76, 76, 76, 111, 343, 223, - /* 110 */ 189, 189, 405, 114, 443, 443, 443, 443, 443, 443, - /* 120 */ 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, - /* 130 */ 443, 443, 443, 672, 483, 18, 327, 293, 253, 253, - /* 140 */ 253, 217, 622, 622, 293, 523, 523, 523, 248, 460, - /* 150 */ 354, 76, 585, 76, 585, 585, 604, 670, 35, 35, - /* 160 */ 35, 35, 35, 35, 35, 35, 1897, 636, 15, 167, - /* 170 */ 16, 297, 515, 252, 454, 454, 373, 842, 389, 484, - /* 180 */ 1058, 1163, 862, 892, 922, 983, 45, 922, 878, 727, - /* 190 */ 948, 1136, 1347, 1214, 1358, 1382, 1358, 1239, 1390, 1390, - /* 200 */ 1358, 1239, 1239, 1313, 1329, 1390, 1338, 1390, 1390, 1390, - /* 210 */ 1435, 1408, 1435, 1408, 1442, 248, 1457, 248, 1460, 1471, - /* 220 */ 248, 1460, 248, 248, 248, 1390, 248, 1440, 1440, 1435, - /* 230 */ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - /* 240 */ 76, 1390, 1435, 585, 585, 585, 1311, 1427, 1442, 343, - /* 250 */ 1356, 1359, 1457, 343, 1362, 1390, 1382, 1382, 585, 1298, - /* 260 */ 1307, 585, 1298, 1307, 585, 585, 76, 1314, 1407, 1298, - /* 270 */ 1317, 1319, 1335, 1136, 1315, 1323, 1327, 1345, 523, 1579, - /* 280 */ 1390, 1460, 343, 343, 1587, 1307, 585, 585, 585, 585, - /* 290 */ 585, 1307, 585, 1445, 343, 604, 343, 523, 1528, 1529, - /* 300 */ 585, 670, 1390, 343, 1600, 1435, 2904, 2904, 2904, 2904, - /* 310 */ 2904, 2904, 2904, 2904, 2904, 34, 2709, 238, 590, 198, - /* 320 */ 539, 973, 794, 486, 1064, 925, 1030, 48, 48, 48, - /* 330 */ 48, 48, 48, 48, 48, 48, 831, 612, 65, 65, - /* 340 */ 549, 737, 700, 891, 262, 448, 1025, 717, 531, 531, - /* 350 */ 962, 751, 906, 962, 962, 962, 1202, 1015, 513, 1219, - /* 360 */ 1008, 1101, 1194, 1104, 1113, 1149, 1159, 381, 1229, 1248, - /* 370 */ 1259, 1267, 1069, 1196, 1221, 1217, 1231, 1233, 1234, 1143, - /* 380 */ 836, 1152, 1165, 1260, 1262, 1273, 1276, 1277, 1318, 1281, - /* 390 */ 1283, 1208, 1284, 1238, 1320, 1321, 1326, 1328, 1336, 1343, - /* 400 */ 671, 1265, 1266, 1255, 1289, 1325, 1366, 1666, 1667, 1669, - /* 410 */ 1631, 1674, 1640, 1468, 1642, 1643, 1644, 1472, 1682, 1648, - /* 420 */ 1649, 1477, 1687, 1480, 1689, 1655, 1699, 1670, 1693, 1659, - /* 430 */ 1500, 1508, 1511, 1701, 1702, 1704, 1523, 1526, 1708, 1715, - /* 440 */ 1672, 1717, 1720, 1722, 1683, 1724, 1726, 1729, 1733, 1735, - /* 450 */ 1736, 1743, 1745, 1591, 1712, 1748, 1594, 1750, 1753, 1754, - /* 460 */ 1764, 1765, 1767, 1768, 1775, 1777, 1778, 1779, 1781, 1782, - /* 470 */ 1784, 1785, 1786, 1716, 1759, 1760, 1761, 1791, 1792, 1793, - /* 480 */ 1772, 1795, 1796, 1797, 1618, 1798, 1800, 1780, 1756, 1783, - /* 490 */ 1758, 1807, 1749, 1776, 1810, 1755, 1812, 1762, 1813, 1816, - /* 500 */ 1788, 1787, 1774, 1773, 1799, 1805, 1802, 1822, 1811, 1789, - /* 510 */ 1823, 1824, 1827, 1794, 1658, 1832, 1838, 1839, 1790, 1853, - /* 520 */ 1855, 1825, 1814, 1828, 1861, 1842, 1829, 1835, 1879, 1845, - /* 530 */ 1833, 1844, 1885, 1858, 1846, 1862, 1902, 1912, 1914, 1915, - /* 540 */ 1808, 1815, 1884, 1898, 1921, 1888, 1889, 1891, 1893, 1894, - /* 550 */ 1896, 1899, 1895, 1900, 1903, 1905, 1910, 1907, 1933, 1913, - /* 560 */ 1943, 1923, 1886, 1947, 1927, 1916, 1959, 1922, 1960, 1928, - /* 570 */ 1962, 1948, 1952, 1938, 1939, 1940, 1875, 1877, 1978, 1817, - /* 580 */ 1880, 1809, 1944, 1961, 1982, 1806, 1964, 1830, 1831, 1997, - /* 590 */ 2000, 1836, 1834, 2002, 1963, 1752, 1906, 1909, 1911, 1965, - /* 600 */ 1917, 1966, 1920, 1918, 1968, 1973, 1919, 1924, 1926, 1929, - /* 610 */ 1931, 1974, 1975, 1976, 1934, 1977, 1771, 1932, 1935, 2025, - /* 620 */ 1993, 1801, 2003, 2005, 2006, 2010, 2011, 2012, 1949, 1950, - /* 630 */ 1992, 1818, 2008, 2001, 2049, 2054, 2055, 2056, 1958, 2020, - /* 640 */ 1773, 2013, 1967, 1969, 1971, 1979, 1987, 1890, 1989, 2063, - /* 650 */ 2026, 1904, 1995, 1954, 1773, 2022, 2033, 1998, 1856, 1999, - /* 660 */ 2096, 2077, 1887, 2009, 2007, 2019, 2021, 2023, 2028, 2057, - /* 670 */ 2024, 2030, 2058, 2039, 2079, 1925, 2043, 2015, 2044, 2068, - /* 680 */ 2071, 2046, 2047, 2076, 2050, 2048, 2086, 2051, 2052, 2109, - /* 690 */ 2060, 2053, 2117, 2061, 1990, 2034, 2035, 2036, 2062, 2111, - /* 700 */ 2064, 2128, 2065, 2111, 2111, 2144, 2101, 2103, 2135, 2136, - /* 710 */ 2141, 2142, 2152, 2154, 2155, 2156, 2120, 2099, 2129, 2160, - /* 720 */ 2162, 2163, 2177, 2165, 2166, 2167, 2131, 1895, 2169, 1900, - /* 730 */ 2170, 2172, 2174, 2176, 2190, 2178, 2214, 2180, 2168, 2179, - /* 740 */ 2220, 2188, 2175, 2192, 2234, 2201, 2189, 2198, 2239, 2205, - /* 750 */ 2193, 2206, 2246, 2218, 2221, 2267, 2236, 2238, 2240, 2241, - /* 760 */ 2243, 2245, + /* 40 */ 897, 897, 897, 897, 897, 897, 897, 897, 897, 113, + /* 50 */ 165, 815, 547, 666, 112, 215, 112, 547, 547, 117, + /* 60 */ 117, 117, 112, 117, 117, 6, 112, 128, 222, 162, + /* 70 */ 162, 222, 236, 236, 190, 271, 247, 247, 162, 162, + /* 80 */ 162, 162, 162, 162, 162, 296, 162, 162, 4, 128, + /* 90 */ 162, 162, 303, 162, 128, 162, 296, 162, 296, 128, + /* 100 */ 162, 162, 128, 162, 128, 128, 128, 162, 70, 223, + /* 110 */ 189, 189, 226, 130, 446, 446, 446, 446, 446, 446, + /* 120 */ 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, + /* 130 */ 446, 446, 446, 433, 315, 190, 271, 594, 522, 522, + /* 140 */ 522, 520, 13, 13, 594, 583, 583, 583, 4, 98, + /* 150 */ 397, 128, 659, 128, 659, 659, 545, 848, 755, 755, + /* 160 */ 755, 755, 755, 755, 755, 755, 2015, 424, 501, 611, + /* 170 */ 15, 212, 717, 230, 307, 307, 452, 483, 277, 946, + /* 180 */ 868, 929, 697, 998, 612, 773, 586, 612, 1128, 949, + /* 190 */ 1026, 1114, 1323, 1197, 1338, 1364, 1338, 1222, 1371, 1371, + /* 200 */ 1338, 1222, 1222, 1302, 1305, 1371, 1312, 1371, 1371, 1371, + /* 210 */ 1393, 1367, 1393, 1367, 1398, 4, 1405, 4, 1407, 1409, + /* 220 */ 4, 1407, 4, 4, 4, 1371, 4, 1390, 1390, 1393, + /* 230 */ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + /* 240 */ 128, 1371, 1393, 659, 659, 659, 1281, 1394, 1398, 70, + /* 250 */ 1304, 1306, 1405, 70, 1308, 1114, 1371, 1364, 1364, 659, + /* 260 */ 1241, 1255, 659, 1241, 1255, 659, 659, 128, 1256, 1351, + /* 270 */ 1241, 1262, 1264, 1280, 1114, 1263, 1267, 1266, 1298, 583, + /* 280 */ 1533, 1114, 1371, 1407, 70, 70, 1540, 1255, 659, 659, + /* 290 */ 659, 659, 659, 1255, 659, 1424, 70, 545, 70, 583, + /* 300 */ 1508, 1510, 659, 848, 1371, 70, 1583, 1393, 2902, 2902, + /* 310 */ 2902, 2902, 2902, 2902, 2902, 2902, 2902, 34, 229, 51, + /* 320 */ 1157, 31, 584, 406, 425, 805, 820, 835, 793, 48, + /* 330 */ 48, 48, 48, 48, 48, 48, 48, 48, 580, 910, + /* 340 */ 3, 3, 166, 359, 32, 29, 367, 670, 37, 781, + /* 350 */ 646, 646, 592, 308, 712, 592, 592, 592, 1146, 885, + /* 360 */ 1113, 238, 1131, 1037, 1165, 1077, 1078, 1096, 1103, 1047, + /* 370 */ 1170, 1191, 1212, 1219, 977, 1145, 1150, 1177, 1152, 1180, + /* 380 */ 1196, 950, 1030, 939, 1190, 1198, 1223, 1231, 1232, 1234, + /* 390 */ 1259, 1260, 1261, 287, 1273, 416, 1275, 1276, 1277, 1278, + /* 400 */ 1315, 1320, 1173, 1182, 1214, 1350, 1353, 759, 1252, 1631, + /* 410 */ 1639, 1641, 1601, 1644, 1610, 1438, 1612, 1613, 1614, 1443, + /* 420 */ 1652, 1618, 1619, 1447, 1656, 1449, 1658, 1626, 1662, 1642, + /* 430 */ 1663, 1630, 1471, 1479, 1482, 1669, 1670, 1672, 1493, 1496, + /* 440 */ 1678, 1688, 1643, 1689, 1692, 1694, 1654, 1700, 1702, 1703, + /* 450 */ 1704, 1706, 1708, 1709, 1716, 1564, 1683, 1720, 1566, 1723, + /* 460 */ 1725, 1726, 1727, 1730, 1731, 1732, 1737, 1744, 1746, 1747, + /* 470 */ 1748, 1749, 1750, 1751, 1753, 1712, 1755, 1758, 1759, 1760, + /* 480 */ 1761, 1762, 1741, 1764, 1765, 1766, 1628, 1771, 1772, 1763, + /* 490 */ 1721, 1768, 1733, 1782, 1724, 1767, 1784, 1729, 1786, 1735, + /* 500 */ 1793, 1795, 1754, 1773, 1756, 1757, 1770, 1783, 1774, 1798, + /* 510 */ 1775, 1779, 1801, 1803, 1805, 1780, 1629, 1807, 1808, 1811, + /* 520 */ 1776, 1813, 1814, 1787, 1777, 1785, 1823, 1790, 1778, 1792, + /* 530 */ 1829, 1797, 1788, 1794, 1834, 1800, 1789, 1802, 1839, 1840, + /* 540 */ 1843, 1844, 1736, 1739, 1816, 1827, 1852, 1818, 1819, 1820, + /* 550 */ 1821, 1822, 1825, 1828, 1832, 1833, 1830, 1838, 1836, 1845, + /* 560 */ 1866, 1853, 1878, 1857, 1846, 1883, 1863, 1869, 1908, 1874, + /* 570 */ 1910, 1876, 1912, 1891, 1894, 1880, 1881, 1884, 1817, 1824, + /* 580 */ 1920, 1796, 1826, 1728, 1890, 1901, 1927, 1740, 1909, 1799, + /* 590 */ 1781, 1930, 1934, 1804, 1791, 1932, 1892, 1681, 1842, 1837, + /* 600 */ 1848, 1895, 1841, 1898, 1854, 1851, 1896, 1911, 1856, 1860, + /* 610 */ 1861, 1862, 1864, 1919, 1906, 1907, 1868, 1925, 1714, 1873, + /* 620 */ 1875, 1972, 1933, 1722, 1945, 1947, 1948, 1959, 1966, 1969, + /* 630 */ 1905, 1921, 1962, 1806, 1976, 1974, 2023, 2024, 2025, 2026, + /* 640 */ 1928, 1988, 1757, 1982, 1931, 1936, 1937, 1939, 1940, 1870, + /* 650 */ 1943, 2032, 1994, 1877, 1949, 1941, 1757, 2000, 2008, 1955, + /* 660 */ 1850, 1956, 2053, 2036, 1847, 1960, 1964, 1961, 1965, 1963, + /* 670 */ 1967, 2022, 1975, 1979, 2033, 1989, 2067, 1889, 1992, 1983, + /* 680 */ 2006, 2060, 2070, 2009, 2007, 2075, 2011, 2012, 2080, 2019, + /* 690 */ 2021, 2085, 2027, 2028, 2086, 2030, 2001, 2002, 2003, 2010, + /* 700 */ 2031, 2082, 2034, 2093, 2037, 2082, 2082, 2111, 2069, 2071, + /* 710 */ 2103, 2105, 2106, 2107, 2108, 2109, 2110, 2112, 2074, 2054, + /* 720 */ 2117, 2128, 2130, 2131, 2132, 2133, 2134, 2135, 2095, 1832, + /* 730 */ 2136, 1833, 2137, 2138, 2140, 2141, 2155, 2143, 2179, 2145, + /* 740 */ 2139, 2142, 2182, 2148, 2147, 2159, 2186, 2164, 2151, 2163, + /* 750 */ 2203, 2169, 2156, 2167, 2207, 2173, 2175, 2211, 2190, 2193, + /* 760 */ 2194, 2195, 2197, 2199, }; -#define YY_REDUCE_COUNT (314) -#define YY_REDUCE_MIN (-397) -#define YY_REDUCE_MAX (2375) +#define YY_REDUCE_COUNT (316) +#define YY_REDUCE_MIN (-445) +#define YY_REDUCE_MAX (2473) static const short yy_reduce_ofst[] = { - /* 0 */ -156, 364, -82, 588, -20, 614, 804, 890, 1024, 1050, - /* 10 */ 1118, 1222, 1288, 1316, 1348, 1419, 174, -333, 154, 450, - /* 20 */ 674, 1447, 1097, 1482, 1466, 1543, 1566, 1660, 1692, 1710, - /* 30 */ 1757, 1804, 1826, 1851, 1873, 1937, 1957, 1972, 2004, 2072, - /* 40 */ 2091, 2119, 2138, 2185, 2242, 2258, 2308, 2328, 2375, 383, - /* 50 */ 270, -397, 83, -395, 371, 416, 554, 75, 501, 235, - /* 60 */ 786, 827, -139, 683, 834, -195, -165, -359, -80, -172, - /* 70 */ -13, -383, -254, -207, -213, 149, -52, 290, -152, -5, - /* 80 */ 263, 376, 407, 413, 453, 82, 508, 593, 462, 271, - /* 90 */ 610, 631, 275, 657, 374, 725, 301, 745, 372, -170, - /* 100 */ 748, 796, 399, 808, -83, 421, 605, 810, 260, -319, - /* 110 */ -338, -338, -293, -327, 94, 237, 433, 502, 534, 669, - /* 120 */ 693, 712, 802, 807, 809, 813, 815, 833, 849, 854, - /* 130 */ 865, 867, 868, -275, -251, -131, 355, 467, -251, 437, - /* 140 */ 559, 452, 445, 479, 726, -334, -85, 719, 681, 168, - /* 150 */ 736, 268, 134, 805, 797, 799, 742, 850, -369, 387, - /* 160 */ 499, 580, 713, 832, 913, 713, 637, 927, 485, 899, - /* 170 */ 818, 835, 949, 839, 941, 945, 940, 940, 980, 939, - /* 180 */ 1032, 1028, 994, 984, 933, 933, 919, 933, 947, 938, - /* 190 */ 940, 974, 976, 996, 1012, 1011, 1018, 1022, 1070, 1071, - /* 200 */ 1026, 1027, 1037, 1063, 1073, 1089, 1083, 1094, 1096, 1099, - /* 210 */ 1123, 1127, 1125, 1130, 1060, 1132, 1100, 1137, 1142, 1090, - /* 220 */ 1144, 1151, 1146, 1147, 1148, 1157, 1153, 1154, 1158, 1169, - /* 230 */ 1138, 1139, 1140, 1141, 1156, 1160, 1161, 1167, 1168, 1175, - /* 240 */ 1177, 1164, 1172, 1131, 1134, 1135, 1110, 1116, 1119, 1187, - /* 250 */ 1145, 1155, 1176, 1201, 1162, 1224, 1179, 1180, 1174, 1108, - /* 260 */ 1171, 1191, 1126, 1184, 1203, 1204, 940, 1128, 1133, 1166, - /* 270 */ 1150, 1170, 1173, 1178, 1122, 1182, 1185, 933, 1251, 1181, - /* 280 */ 1261, 1258, 1263, 1264, 1213, 1212, 1228, 1232, 1235, 1236, - /* 290 */ 1237, 1216, 1241, 1226, 1268, 1269, 1279, 1282, 1192, 1278, - /* 300 */ 1250, 1274, 1291, 1290, 1303, 1306, 1252, 1243, 1244, 1270, - /* 310 */ 1296, 1299, 1300, 1322, 1334, + /* 0 */ -195, 364, 220, 588, 614, 804, 890, 1024, 1050, 1122, + /* 10 */ 1148, 1181, 1258, 1289, 1317, 1352, 153, 674, -332, 1446, + /* 20 */ 1466, 1477, 1563, 1574, 1589, 1660, 1675, 1734, 1769, 1831, + /* 30 */ 1888, 1899, 1918, 1985, 2004, 2020, 2035, 2051, 2119, 2150, + /* 40 */ 2185, 2216, 2282, 2303, 2329, 2348, 2379, 2405, 2473, -301, + /* 50 */ -202, 251, -104, 515, 798, 800, 830, 544, 632, -92, + /* 60 */ 377, 643, 253, 383, 780, -445, -276, -178, -330, -294, + /* 70 */ 45, -221, -337, -242, 115, -203, 175, 206, -306, 50, + /* 80 */ 297, 499, 523, 591, 593, 152, 495, 599, -159, -232, + /* 90 */ 209, 603, 191, 723, 319, 730, 349, 746, 430, 239, + /* 100 */ 797, 802, 366, 808, 413, 578, 681, 817, 564, -333, + /* 110 */ -430, -430, 114, -247, -29, 22, 108, 445, 473, 475, + /* 120 */ 482, 557, 617, 638, 640, 644, 649, 675, 686, 719, + /* 130 */ 722, 760, 822, -44, -20, -8, 211, 371, -20, 338, + /* 140 */ 354, 257, 306, 506, 498, 410, 662, 765, 344, 158, + /* 150 */ 268, 598, 368, 386, 699, 785, 627, 811, -363, 292, + /* 160 */ 573, 596, 624, 732, 739, 624, 847, 828, 921, 892, + /* 170 */ 812, 819, 943, 833, 927, 933, 922, 922, 952, 918, + /* 180 */ 985, 984, 947, 942, 882, 882, 871, 882, 920, 914, + /* 190 */ 922, 969, 956, 971, 993, 994, 1000, 1003, 1054, 1055, + /* 200 */ 1009, 1005, 1012, 1049, 1051, 1063, 1057, 1068, 1069, 1070, + /* 210 */ 1079, 1080, 1082, 1083, 1013, 1073, 1042, 1081, 1084, 1027, + /* 220 */ 1085, 1089, 1086, 1087, 1088, 1097, 1091, 1104, 1106, 1109, + /* 230 */ 1090, 1092, 1099, 1100, 1107, 1110, 1112, 1116, 1117, 1118, + /* 240 */ 1123, 1119, 1144, 1072, 1074, 1076, 1093, 1094, 1098, 1147, + /* 250 */ 1095, 1101, 1115, 1153, 1105, 1120, 1158, 1111, 1124, 1129, + /* 260 */ 1056, 1126, 1135, 1064, 1130, 1137, 1139, 922, 1067, 1071, + /* 270 */ 1075, 1125, 1102, 1132, 1134, 1062, 1108, 1127, 882, 1209, + /* 280 */ 1138, 1166, 1217, 1210, 1227, 1230, 1172, 1185, 1202, 1204, + /* 290 */ 1207, 1208, 1211, 1195, 1216, 1206, 1248, 1213, 1265, 1268, + /* 300 */ 1174, 1243, 1233, 1269, 1282, 1270, 1287, 1290, 1221, 1215, + /* 310 */ 1235, 1236, 1271, 1272, 1274, 1288, 1299, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 10 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 20 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 30 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 40 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 50 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 60 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 70 */ 1719, 1719, 1719, 1719, 1992, 1719, 1719, 1719, 1719, 1719, - /* 80 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1801, 1719, - /* 90 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 100 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1799, 1985, - /* 110 */ 2206, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 120 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 130 */ 1719, 1719, 1719, 1719, 2218, 1719, 1719, 1719, 2218, 2218, - /* 140 */ 2218, 1799, 2178, 2178, 1719, 1719, 1719, 1719, 1801, 2050, - /* 150 */ 1719, 1719, 1719, 1719, 1719, 1719, 1920, 1719, 1719, 1719, - /* 160 */ 1719, 1719, 1944, 1719, 1719, 1719, 2044, 1719, 1719, 2243, - /* 170 */ 2299, 1719, 1719, 2246, 1719, 1719, 1719, 1719, 1719, 1997, - /* 180 */ 1719, 1719, 1874, 2233, 2210, 2224, 2283, 2211, 2208, 2227, - /* 190 */ 1719, 2237, 1719, 2031, 1990, 1719, 1990, 1987, 1719, 1719, - /* 200 */ 1990, 1987, 1987, 1863, 1859, 1719, 1857, 1719, 1719, 1719, - /* 210 */ 1719, 1766, 1719, 1766, 1719, 1801, 1719, 1801, 1719, 1719, - /* 220 */ 1801, 1719, 1801, 1801, 1801, 1719, 1801, 1779, 1779, 1719, - /* 230 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 240 */ 1719, 1719, 1719, 1719, 1719, 1719, 2062, 2048, 1719, 1799, - /* 250 */ 2042, 2040, 1719, 1799, 2038, 1719, 1719, 1719, 1719, 2254, - /* 260 */ 2252, 1719, 2254, 2252, 1719, 1719, 1719, 2268, 2264, 2254, - /* 270 */ 2272, 2270, 2239, 2237, 2302, 2289, 2285, 2224, 1719, 1719, - /* 280 */ 1719, 1719, 1799, 1799, 1719, 2252, 1719, 1719, 1719, 1719, - /* 290 */ 1719, 2252, 1719, 1719, 1799, 1719, 1799, 1719, 1719, 1890, - /* 300 */ 1719, 1719, 1719, 1799, 1751, 1719, 2033, 2053, 2015, 2015, - /* 310 */ 1923, 1923, 1923, 1802, 1724, 1719, 1719, 1719, 1719, 1719, - /* 320 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 2267, 2266, 2133, - /* 330 */ 1719, 2182, 2181, 2180, 2171, 2132, 1886, 1719, 2131, 2130, - /* 340 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 2006, 2005, - /* 350 */ 2124, 1719, 1719, 2125, 2123, 2122, 1719, 1719, 1719, 1719, - /* 360 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 370 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 380 */ 2286, 2290, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 2207, - /* 390 */ 1719, 1719, 1719, 2106, 1719, 1719, 1719, 1719, 1719, 1719, - /* 400 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 410 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 420 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 430 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 440 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 450 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 460 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 470 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 480 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 490 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 500 */ 1719, 1719, 1756, 2111, 1719, 1719, 1719, 1719, 1719, 1719, - /* 510 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 520 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 530 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 540 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 550 */ 1719, 1719, 1840, 1839, 1719, 1719, 1719, 1719, 1719, 1719, - /* 560 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 570 */ 1719, 1719, 1719, 1719, 1719, 1719, 2115, 1719, 1719, 1719, - /* 580 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 590 */ 1719, 1719, 1719, 2282, 2240, 1719, 1719, 1719, 1719, 1719, - /* 600 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 610 */ 1719, 1719, 1719, 2106, 1719, 2265, 1719, 1719, 2280, 1719, - /* 620 */ 2284, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 2217, 2213, - /* 630 */ 1719, 1719, 2209, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 640 */ 2114, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 650 */ 1719, 1719, 1719, 1719, 2105, 1719, 2168, 1719, 1719, 1719, - /* 660 */ 2202, 1719, 1719, 2153, 1719, 1719, 1719, 1719, 1719, 1719, - /* 670 */ 1719, 1719, 1719, 2115, 1719, 2118, 1719, 1719, 1719, 1719, - /* 680 */ 1719, 1917, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 690 */ 1719, 1719, 1719, 1719, 1902, 1900, 1899, 1898, 1719, 1930, - /* 700 */ 1719, 1719, 1719, 1926, 1925, 1719, 1719, 1719, 1719, 1719, - /* 710 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1820, 1719, - /* 720 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1812, 1719, 1811, - /* 730 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 740 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 750 */ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, - /* 760 */ 1719, 1719, + /* 0 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 10 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 20 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 30 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 40 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 50 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 60 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 70 */ 1721, 1721, 1721, 1721, 1994, 1721, 1721, 1721, 1721, 1721, + /* 80 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1803, 1721, + /* 90 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 100 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1801, 1987, + /* 110 */ 2208, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 120 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 130 */ 1721, 1721, 1721, 1721, 2220, 1721, 1721, 1721, 2220, 2220, + /* 140 */ 2220, 1801, 2180, 2180, 1721, 1721, 1721, 1721, 1803, 2052, + /* 150 */ 1721, 1721, 1721, 1721, 1721, 1721, 1922, 1721, 1721, 1721, + /* 160 */ 1721, 1721, 1946, 1721, 1721, 1721, 2046, 1721, 1721, 2245, + /* 170 */ 2301, 1721, 1721, 2248, 1721, 1721, 1721, 1721, 1721, 1999, + /* 180 */ 1721, 1721, 1876, 2235, 2212, 2226, 2285, 2213, 2210, 2229, + /* 190 */ 1721, 2239, 1721, 2033, 1992, 1721, 1992, 1989, 1721, 1721, + /* 200 */ 1992, 1989, 1989, 1865, 1861, 1721, 1859, 1721, 1721, 1721, + /* 210 */ 1721, 1768, 1721, 1768, 1721, 1803, 1721, 1803, 1721, 1721, + /* 220 */ 1803, 1721, 1803, 1803, 1803, 1721, 1803, 1781, 1781, 1721, + /* 230 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 240 */ 1721, 1721, 1721, 1721, 1721, 1721, 2064, 2050, 1721, 1801, + /* 250 */ 2044, 2042, 1721, 1801, 2040, 2239, 1721, 1721, 1721, 1721, + /* 260 */ 2256, 2254, 1721, 2256, 2254, 1721, 1721, 1721, 2270, 2266, + /* 270 */ 2256, 2274, 2272, 2241, 2239, 2304, 2291, 2287, 2226, 1721, + /* 280 */ 1721, 2239, 1721, 1721, 1801, 1801, 1721, 2254, 1721, 1721, + /* 290 */ 1721, 1721, 1721, 2254, 1721, 1721, 1801, 1721, 1801, 1721, + /* 300 */ 1721, 1892, 1721, 1721, 1721, 1801, 1753, 1721, 2035, 2055, + /* 310 */ 2017, 2017, 1925, 1925, 1925, 1804, 1726, 1721, 1721, 1721, + /* 320 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 2269, + /* 330 */ 2268, 2135, 1721, 2184, 2183, 2182, 2173, 2134, 1888, 1721, + /* 340 */ 2133, 2132, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 350 */ 2008, 2007, 2126, 1721, 1721, 2127, 2125, 2124, 1721, 1721, + /* 360 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 370 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 380 */ 1721, 1721, 2288, 2292, 1721, 1721, 1721, 1721, 1721, 1721, + /* 390 */ 1721, 2209, 1721, 1721, 1721, 2108, 1721, 1721, 1721, 1721, + /* 400 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 410 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 420 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 430 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 440 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 450 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 460 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 470 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 480 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 490 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 500 */ 1721, 1721, 1721, 1721, 1758, 2113, 1721, 1721, 1721, 1721, + /* 510 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 520 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 530 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 540 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 550 */ 1721, 1721, 1721, 1721, 1842, 1841, 1721, 1721, 1721, 1721, + /* 560 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 570 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 2117, 1721, + /* 580 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 590 */ 1721, 1721, 1721, 1721, 1721, 2284, 2242, 1721, 1721, 1721, + /* 600 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 610 */ 1721, 1721, 1721, 1721, 1721, 2108, 1721, 2267, 1721, 1721, + /* 620 */ 2282, 1721, 2286, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 630 */ 2219, 2215, 1721, 1721, 2211, 1721, 1721, 1721, 1721, 1721, + /* 640 */ 1721, 1721, 2116, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 650 */ 1721, 1721, 1721, 1721, 1721, 1721, 2107, 1721, 2170, 1721, + /* 660 */ 1721, 1721, 2204, 1721, 1721, 2155, 1721, 1721, 1721, 1721, + /* 670 */ 1721, 1721, 1721, 1721, 1721, 2117, 1721, 2120, 1721, 1721, + /* 680 */ 1721, 1721, 1721, 1919, 1721, 1721, 1721, 1721, 1721, 1721, + /* 690 */ 1721, 1721, 1721, 1721, 1721, 1721, 1904, 1902, 1901, 1900, + /* 700 */ 1721, 1932, 1721, 1721, 1721, 1928, 1927, 1721, 1721, 1721, + /* 710 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 720 */ 1822, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1814, + /* 730 */ 1721, 1813, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 740 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 750 */ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + /* 760 */ 1721, 1721, 1721, 1721, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1873,22 +1873,22 @@ static const char *const yyTokenName[] = { /* 399 */ "func", /* 400 */ "sma_func_name", /* 401 */ "query_or_subquery", - /* 402 */ "cgroup_name", - /* 403 */ "analyze_opt", - /* 404 */ "explain_options", - /* 405 */ "insert_query", - /* 406 */ "or_replace_opt", - /* 407 */ "agg_func_opt", - /* 408 */ "bufsize_opt", - /* 409 */ "language_opt", - /* 410 */ "stream_name", - /* 411 */ "stream_options", - /* 412 */ "col_list_opt", - /* 413 */ "tag_def_or_ref_opt", - /* 414 */ "subtable_opt", - /* 415 */ "expression", - /* 416 */ "dnode_list", - /* 417 */ "where_clause_opt", + /* 402 */ "where_clause_opt", + /* 403 */ "cgroup_name", + /* 404 */ "analyze_opt", + /* 405 */ "explain_options", + /* 406 */ "insert_query", + /* 407 */ "or_replace_opt", + /* 408 */ "agg_func_opt", + /* 409 */ "bufsize_opt", + /* 410 */ "language_opt", + /* 411 */ "stream_name", + /* 412 */ "stream_options", + /* 413 */ "col_list_opt", + /* 414 */ "tag_def_or_ref_opt", + /* 415 */ "subtable_opt", + /* 416 */ "expression", + /* 417 */ "dnode_list", /* 418 */ "literal_func", /* 419 */ "literal_list", /* 420 */ "table_alias", @@ -2254,8 +2254,8 @@ static const char *const yyRuleName[] = { /* 297 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery", /* 298 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name", /* 299 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name", - /* 300 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name", - /* 301 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name", + /* 300 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name where_clause_opt", + /* 301 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name where_clause_opt", /* 302 */ "cmd ::= DROP TOPIC exists_opt topic_name", /* 303 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name", /* 304 */ "cmd ::= DESC full_table_name", @@ -2695,12 +2695,12 @@ static void yy_destructor( case 398: /* sma_stream_opt */ case 399: /* func */ case 401: /* query_or_subquery */ - case 404: /* explain_options */ - case 405: /* insert_query */ - case 411: /* stream_options */ - case 414: /* subtable_opt */ - case 415: /* expression */ - case 417: /* where_clause_opt */ + case 402: /* where_clause_opt */ + case 405: /* explain_options */ + case 406: /* insert_query */ + case 412: /* stream_options */ + case 415: /* subtable_opt */ + case 416: /* expression */ case 418: /* literal_func */ case 421: /* expr_or_subquery */ case 422: /* pseudo_column */ @@ -2745,7 +2745,7 @@ static void yy_destructor( case 332: /* alter_account_options */ case 334: /* alter_account_option */ case 352: /* speed_opt */ - case 408: /* bufsize_opt */ + case 409: /* bufsize_opt */ { } @@ -2760,9 +2760,9 @@ static void yy_destructor( case 392: /* column_alias */ case 395: /* index_name */ case 400: /* sma_func_name */ - case 402: /* cgroup_name */ - case 409: /* language_opt */ - case 410: /* stream_name */ + case 403: /* cgroup_name */ + case 410: /* language_opt */ + case 411: /* stream_name */ case 420: /* table_alias */ case 426: /* star_func */ case 428: /* noarg_func */ @@ -2791,9 +2791,9 @@ static void yy_destructor( case 347: /* force_opt */ case 348: /* not_exists_opt */ case 350: /* exists_opt */ - case 403: /* analyze_opt */ - case 406: /* or_replace_opt */ - case 407: /* agg_func_opt */ + case 404: /* analyze_opt */ + case 407: /* or_replace_opt */ + case 408: /* agg_func_opt */ case 451: /* set_quantifier_opt */ { @@ -2814,9 +2814,9 @@ static void yy_destructor( case 380: /* rollup_func_list */ case 390: /* tag_list_opt */ case 396: /* func_list */ - case 412: /* col_list_opt */ - case 413: /* tag_def_or_ref_opt */ - case 416: /* dnode_list */ + case 413: /* col_list_opt */ + case 414: /* tag_def_or_ref_opt */ + case 417: /* dnode_list */ case 419: /* literal_list */ case 427: /* star_func_para_list */ case 429: /* other_para_list */ @@ -3455,8 +3455,8 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 330, /* (297) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ 330, /* (298) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ 330, /* (299) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - 330, /* (300) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - 330, /* (301) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + 330, /* (300) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name where_clause_opt */ + 330, /* (301) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name where_clause_opt */ 330, /* (302) cmd ::= DROP TOPIC exists_opt topic_name */ 330, /* (303) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ 330, /* (304) cmd ::= DESC full_table_name */ @@ -3464,39 +3464,39 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 330, /* (306) cmd ::= RESET QUERY CACHE */ 330, /* (307) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */ 330, /* (308) cmd ::= EXPLAIN analyze_opt explain_options insert_query */ - 403, /* (309) analyze_opt ::= */ - 403, /* (310) analyze_opt ::= ANALYZE */ - 404, /* (311) explain_options ::= */ - 404, /* (312) explain_options ::= explain_options VERBOSE NK_BOOL */ - 404, /* (313) explain_options ::= explain_options RATIO NK_FLOAT */ + 404, /* (309) analyze_opt ::= */ + 404, /* (310) analyze_opt ::= ANALYZE */ + 405, /* (311) explain_options ::= */ + 405, /* (312) explain_options ::= explain_options VERBOSE NK_BOOL */ + 405, /* (313) explain_options ::= explain_options RATIO NK_FLOAT */ 330, /* (314) cmd ::= CREATE or_replace_opt agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt language_opt */ 330, /* (315) cmd ::= DROP FUNCTION exists_opt function_name */ - 407, /* (316) agg_func_opt ::= */ - 407, /* (317) agg_func_opt ::= AGGREGATE */ - 408, /* (318) bufsize_opt ::= */ - 408, /* (319) bufsize_opt ::= BUFSIZE NK_INTEGER */ - 409, /* (320) language_opt ::= */ - 409, /* (321) language_opt ::= LANGUAGE NK_STRING */ - 406, /* (322) or_replace_opt ::= */ - 406, /* (323) or_replace_opt ::= OR REPLACE */ + 408, /* (316) agg_func_opt ::= */ + 408, /* (317) agg_func_opt ::= AGGREGATE */ + 409, /* (318) bufsize_opt ::= */ + 409, /* (319) bufsize_opt ::= BUFSIZE NK_INTEGER */ + 410, /* (320) language_opt ::= */ + 410, /* (321) language_opt ::= LANGUAGE NK_STRING */ + 407, /* (322) or_replace_opt ::= */ + 407, /* (323) or_replace_opt ::= OR REPLACE */ 330, /* (324) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name col_list_opt tag_def_or_ref_opt subtable_opt AS query_or_subquery */ 330, /* (325) cmd ::= DROP STREAM exists_opt stream_name */ - 412, /* (326) col_list_opt ::= */ - 412, /* (327) col_list_opt ::= NK_LP col_name_list NK_RP */ - 413, /* (328) tag_def_or_ref_opt ::= */ - 413, /* (329) tag_def_or_ref_opt ::= tags_def */ - 413, /* (330) tag_def_or_ref_opt ::= TAGS NK_LP col_name_list NK_RP */ - 411, /* (331) stream_options ::= */ - 411, /* (332) stream_options ::= stream_options TRIGGER AT_ONCE */ - 411, /* (333) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - 411, /* (334) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - 411, /* (335) stream_options ::= stream_options WATERMARK duration_literal */ - 411, /* (336) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ - 411, /* (337) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ - 411, /* (338) stream_options ::= stream_options DELETE_MARK duration_literal */ - 411, /* (339) stream_options ::= stream_options IGNORE UPDATE NK_INTEGER */ - 414, /* (340) subtable_opt ::= */ - 414, /* (341) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ + 413, /* (326) col_list_opt ::= */ + 413, /* (327) col_list_opt ::= NK_LP col_name_list NK_RP */ + 414, /* (328) tag_def_or_ref_opt ::= */ + 414, /* (329) tag_def_or_ref_opt ::= tags_def */ + 414, /* (330) tag_def_or_ref_opt ::= TAGS NK_LP col_name_list NK_RP */ + 412, /* (331) stream_options ::= */ + 412, /* (332) stream_options ::= stream_options TRIGGER AT_ONCE */ + 412, /* (333) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + 412, /* (334) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + 412, /* (335) stream_options ::= stream_options WATERMARK duration_literal */ + 412, /* (336) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + 412, /* (337) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */ + 412, /* (338) stream_options ::= stream_options DELETE_MARK duration_literal */ + 412, /* (339) stream_options ::= stream_options IGNORE UPDATE NK_INTEGER */ + 415, /* (340) subtable_opt ::= */ + 415, /* (341) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */ 330, /* (342) cmd ::= KILL CONNECTION NK_INTEGER */ 330, /* (343) cmd ::= KILL QUERY NK_STRING */ 330, /* (344) cmd ::= KILL TRANSACTION NK_INTEGER */ @@ -3505,13 +3505,13 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 330, /* (347) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ 330, /* (348) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ 330, /* (349) cmd ::= SPLIT VGROUP NK_INTEGER */ - 416, /* (350) dnode_list ::= DNODE NK_INTEGER */ - 416, /* (351) dnode_list ::= dnode_list DNODE NK_INTEGER */ + 417, /* (350) dnode_list ::= DNODE NK_INTEGER */ + 417, /* (351) dnode_list ::= dnode_list DNODE NK_INTEGER */ 330, /* (352) cmd ::= DELETE FROM full_table_name where_clause_opt */ 330, /* (353) cmd ::= query_or_subquery */ 330, /* (354) cmd ::= insert_query */ - 405, /* (355) insert_query ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ - 405, /* (356) insert_query ::= INSERT INTO full_table_name query_or_subquery */ + 406, /* (355) insert_query ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */ + 406, /* (356) insert_query ::= INSERT INTO full_table_name query_or_subquery */ 333, /* (357) literal ::= NK_INTEGER */ 333, /* (358) literal ::= NK_FLOAT */ 333, /* (359) literal ::= NK_STRING */ @@ -3545,26 +3545,26 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 392, /* (387) column_alias ::= NK_ID */ 335, /* (388) user_name ::= NK_ID */ 344, /* (389) topic_name ::= NK_ID */ - 410, /* (390) stream_name ::= NK_ID */ - 402, /* (391) cgroup_name ::= NK_ID */ + 411, /* (390) stream_name ::= NK_ID */ + 403, /* (391) cgroup_name ::= NK_ID */ 395, /* (392) index_name ::= NK_ID */ 421, /* (393) expr_or_subquery ::= expression */ - 415, /* (394) expression ::= literal */ - 415, /* (395) expression ::= pseudo_column */ - 415, /* (396) expression ::= column_reference */ - 415, /* (397) expression ::= function_expression */ - 415, /* (398) expression ::= case_when_expression */ - 415, /* (399) expression ::= NK_LP expression NK_RP */ - 415, /* (400) expression ::= NK_PLUS expr_or_subquery */ - 415, /* (401) expression ::= NK_MINUS expr_or_subquery */ - 415, /* (402) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ - 415, /* (403) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ - 415, /* (404) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ - 415, /* (405) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ - 415, /* (406) expression ::= expr_or_subquery NK_REM expr_or_subquery */ - 415, /* (407) expression ::= column_reference NK_ARROW NK_STRING */ - 415, /* (408) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ - 415, /* (409) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ + 416, /* (394) expression ::= literal */ + 416, /* (395) expression ::= pseudo_column */ + 416, /* (396) expression ::= column_reference */ + 416, /* (397) expression ::= function_expression */ + 416, /* (398) expression ::= case_when_expression */ + 416, /* (399) expression ::= NK_LP expression NK_RP */ + 416, /* (400) expression ::= NK_PLUS expr_or_subquery */ + 416, /* (401) expression ::= NK_MINUS expr_or_subquery */ + 416, /* (402) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */ + 416, /* (403) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */ + 416, /* (404) expression ::= expr_or_subquery NK_STAR expr_or_subquery */ + 416, /* (405) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */ + 416, /* (406) expression ::= expr_or_subquery NK_REM expr_or_subquery */ + 416, /* (407) expression ::= column_reference NK_ARROW NK_STRING */ + 416, /* (408) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */ + 416, /* (409) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */ 375, /* (410) expression_list ::= expr_or_subquery */ 375, /* (411) expression_list ::= expression_list NK_COMMA expr_or_subquery */ 423, /* (412) column_reference ::= column_name */ @@ -3670,8 +3670,8 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 460, /* (512) select_item ::= common_expression column_alias */ 460, /* (513) select_item ::= common_expression AS column_alias */ 460, /* (514) select_item ::= table_name NK_DOT NK_STAR */ - 417, /* (515) where_clause_opt ::= */ - 417, /* (516) where_clause_opt ::= WHERE search_condition */ + 402, /* (515) where_clause_opt ::= */ + 402, /* (516) where_clause_opt ::= WHERE search_condition */ 453, /* (517) partition_by_clause_opt ::= */ 453, /* (518) partition_by_clause_opt ::= PARTITION BY partition_list */ 461, /* (519) partition_list ::= partition_item */ @@ -4043,8 +4043,8 @@ static const signed char yyRuleInfoNRhs[] = { -6, /* (297) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */ -7, /* (298) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -9, /* (299) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ - -7, /* (300) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ - -9, /* (301) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ + -8, /* (300) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name where_clause_opt */ + -10, /* (301) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name where_clause_opt */ -4, /* (302) cmd ::= DROP TOPIC exists_opt topic_name */ -7, /* (303) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -2, /* (304) cmd ::= DESC full_table_name */ @@ -5390,11 +5390,11 @@ static YYACTIONTYPE yy_reduce( case 299: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ { pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy369, &yymsp[-5].minor.yy113, &yymsp[0].minor.yy113, true); } break; - case 300: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy369, &yymsp[-3].minor.yy113, yymsp[0].minor.yy448, false); } + case 300: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name where_clause_opt */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-5].minor.yy369, &yymsp[-4].minor.yy113, yymsp[-1].minor.yy448, false, yymsp[0].minor.yy448); } break; - case 301: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy369, &yymsp[-5].minor.yy113, yymsp[0].minor.yy448, true); } + case 301: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name where_clause_opt */ +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-7].minor.yy369, &yymsp[-6].minor.yy113, yymsp[-1].minor.yy448, true, yymsp[0].minor.yy448); } break; case 302: /* cmd ::= DROP TOPIC exists_opt topic_name */ { pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy369, &yymsp[0].minor.yy113); } diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index 6a08193a39..a4e8bdd87a 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -1145,6 +1145,15 @@ TEST_F(ParserInitialCTest, createTopic) { setCreateTopicReq("tp1", 1, "create topic if not exists tp1 with meta as stable st1", nullptr, "test", "st1", 1); run("CREATE TOPIC IF NOT EXISTS tp1 WITH META AS STABLE st1"); clearCreateTopicReq(); + + setCreateTopicReq("tp1", 1, "create topic if not exists tp1 as stable st1 where tag1 > 0", nullptr, "test", "st1"); + run("CREATE TOPIC IF NOT EXISTS tp1 AS STABLE st1 WHERE tag1 > 0"); + clearCreateTopicReq(); + + setCreateTopicReq("tp1", 1, "create topic if not exists tp1 with meta as stable st1 where tag1 > 0", nullptr, "test", "st1", 1); + run("CREATE TOPIC IF NOT EXISTS tp1 WITH META AS STABLE st1 WHERE tag1 > 0"); + clearCreateTopicReq(); + } /* diff --git a/source/libs/qcom/src/queryUtil.c b/source/libs/qcom/src/queryUtil.c index 9d8c170003..1260ea336c 100644 --- a/source/libs/qcom/src/queryUtil.c +++ b/source/libs/qcom/src/queryUtil.c @@ -449,6 +449,18 @@ int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) { return TSDB_CODE_SUCCESS; } +void getColumnTypeFromMeta(STableMeta* pMeta, char* pName, ETableColumnType* pType) { + int32_t nums = pMeta->tableInfo.numOfTags + pMeta->tableInfo.numOfColumns; + for (int32_t i = 0; i < nums; ++i) { + if (0 == strcmp(pName, pMeta->schema[i].name)) { + *pType = (i < pMeta->tableInfo.numOfColumns) ? TCOL_TYPE_COLUMN : TCOL_TYPE_TAG; + return; + } + } + + *pType = TCOL_TYPE_NONE; +} + void freeVgInfo(SDBVgInfo* vgInfo) { if (NULL == vgInfo) { return; diff --git a/tests/script/tsim/tmq/topic.sim b/tests/script/tsim/tmq/topic.sim index 0bf0873e9f..85a23055a3 100644 --- a/tests/script/tsim/tmq/topic.sim +++ b/tests/script/tsim/tmq/topic.sim @@ -108,4 +108,14 @@ if $rows != 6 then return -1 endi +return -1 +sql create topic topic_stable_1 as stable stb where t1 > 0 +sql create topic topic_stable_1 as stable stb where t1 > 0 and t1 < 0 +sql create topic topic_stable_1 as stable stb where 1 > 0 +sql create topic topic_stable_1 as stable stb where last(t1) > 0 +sql create topic topic_stable_1 as stable stb where tbname is not null +sql create topic topic_stable_1 as stable stb where tbname > 'a' +sql create topic topic_stable_1 as stable stb where tbname > 0 and xx < 0 +sql create topic topic_stable_1 as stable stb where tbname > 0 and c1 < 0 + system sh/exec.sh -n dnode1 -s stop -x SIGINT From a71878d07fb94e184991259a3fd18a5745e4afd9 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 29 May 2023 11:46:59 +0800 Subject: [PATCH 05/62] feat: support create topic as stable with conditions --- include/common/tmsg.h | 2 +- include/libs/executor/executor.h | 2 +- source/dnode/mnode/impl/src/mndScheduler.c | 20 +++++++++++++++++--- source/dnode/mnode/impl/src/mndStb.c | 4 ++-- source/dnode/mnode/impl/src/mndTopic.c | 10 ++++++++-- source/dnode/vnode/src/tq/tq.c | 15 +++++++++------ source/dnode/vnode/src/tq/tqMeta.c | 10 ++++++---- source/dnode/vnode/src/tq/tqRead.c | 2 +- source/libs/executor/src/executil.c | 13 +++++++------ 9 files changed, 52 insertions(+), 26 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index a7de03fbce..db46858cec 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -2772,8 +2772,8 @@ static FORCE_INLINE void* tDecodeSMqRebVgReq(const void* buf, SMqRebVgReq* pReq) if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) { buf = taosDecodeString(buf, &pReq->qmsg); } else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) { - buf = taosDecodeString(buf, &pReq->qmsg); buf = taosDecodeFixedI64(buf, &pReq->suid); + buf = taosDecodeString(buf, &pReq->qmsg); } return (void*)buf; } diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index e3a75ecabc..d64b3dd193 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -82,7 +82,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers, int32_t v qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, uint64_t id); -int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* pTagCond, void* pTagIndexCond, SArray **tableList); +int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* node, SArray **tableList); /** * set the task Id, usually used by message queue process diff --git a/source/dnode/mnode/impl/src/mndScheduler.c b/source/dnode/mnode/impl/src/mndScheduler.c index 0248a195db..39c771d111 100644 --- a/source/dnode/mnode/impl/src/mndScheduler.c +++ b/source/dnode/mnode/impl/src/mndScheduler.c @@ -538,7 +538,23 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib terrno = TSDB_CODE_QRY_INVALID_INPUT; return -1; } + }else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE && pTopic->ast != NULL){ + SNode *pAst = NULL; + if (nodesStringToNode(pTopic->ast, &pAst) != 0) { + mError("topic:%s, failed to create since %s", pTopic->name, terrstr()); + return -1; + } + SPlanContext cxt = {.pAstRoot = pAst, .topicQuery = true}; + if (qCreateQueryPlan(&cxt, &pPlan, NULL) != 0) { + mError("failed to create topic:%s since %s", pTopic->name, terrstr()); + nodesDestroyNode(pAst); + return -1; + } + nodesDestroyNode(pAst); + } + + if(pPlan){ int32_t levelNum = LIST_LENGTH(pPlan->pSubplans); if (levelNum != 1) { qDestroyQueryPlan(pPlan); @@ -579,7 +595,7 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib mDebug("init subscription %s for topic:%s assign vgId:%d", pSub->key, pTopic->name, pVgEp->vgId); - if (pTopic->subType == TOPIC_SUB_TYPE__COLUMN) { + if (pSubplan) { int32_t msgLen; pSubplan->execNode.epSet = pVgEp->epSet; @@ -591,8 +607,6 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib terrno = TSDB_CODE_QRY_INVALID_INPUT; return -1; } - } else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE){ - pVgEp->qmsg = taosStrdup(pTopic->ast); } else { pVgEp->qmsg = taosStrdup(""); } diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index 8b708c3e0f..2b54eb6389 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -1205,7 +1205,7 @@ static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName, mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s", pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql); - if (pTopic->subType != TOPIC_SUB_TYPE__COLUMN) { + if (pTopic->ast == NULL) { sdbRelease(pSdb, pTopic); continue; } @@ -2247,7 +2247,7 @@ static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName, } } - if (pTopic->subType != TOPIC_SUB_TYPE__COLUMN) { + if (pTopic->ast == NULL) { sdbRelease(pSdb, pTopic); continue; } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index 7d71aae3f4..863055922a 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -420,6 +420,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * mError("failed to create topic:%s since %s", pCreate->name, terrstr()); taosMemoryFree(topicObj.ast); taosMemoryFree(topicObj.sql); + nodesDestroyNode(pAst); return -1; } @@ -427,6 +428,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * if (topicObj.ntbColIds == NULL) { taosMemoryFree(topicObj.ast); taosMemoryFree(topicObj.sql); + nodesDestroyNode(pAst); terrno = TSDB_CODE_OUT_OF_MEMORY; return -1; } @@ -442,6 +444,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * mError("topic:%s, failed to create since %s", pCreate->name, terrstr()); taosMemoryFree(topicObj.ast); taosMemoryFree(topicObj.sql); + nodesDestroyNode(pAst); return -1; } @@ -462,8 +465,11 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq * topicObj.stbUid = pStb->uid; mndReleaseStb(pMnode, pStb); - topicObj.ast = taosStrdup(pCreate->ast); - topicObj.astLen = strlen(pCreate->ast) + 1; + if(pCreate->ast != NULL){ + qDebugL("topic:%s ast %s", topicObj.name, pCreate->ast); + topicObj.ast = taosStrdup(pCreate->ast); + topicObj.astLen = strlen(pCreate->ast) + 1; + } } /*} else if (pCreate->subType == TOPIC_SUB_TYPE__DB) {*/ /*topicObj.ast = NULL;*/ diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index be3d6bc614..30c52d9fc2 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -518,19 +518,22 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg pHandle->execHandle.execTb.qmsg = req.qmsg; req.qmsg = NULL; - if (nodesStringToNode(pHandle->execHandle.execTb.qmsg, &pHandle->execHandle.execTb.node) != 0) { - tqError("nodesStringToNode error in sub stable, since %s", terrstr()); - return -1; + if(strcmp(pHandle->execHandle.execTb.qmsg, "") != 0) { + if (nodesStringToNode(pHandle->execHandle.execTb.qmsg, &pHandle->execHandle.execTb.node) != 0) { + tqError("nodesStringToNode error in sub stable, since %s, vgId:%d, subkey:%s consumer:0x%" PRIx64, terrstr(), + pVnode->config.vgId, req.subKey, pHandle->consumerId); + return -1; + } } SArray* tbUidList = NULL; - ret = qGetTableList(req.suid, pVnode->pMeta, pVnode, pHandle->execHandle.execTb.node, NULL, &tbUidList); + ret = qGetTableList(req.suid, pVnode->pMeta, pVnode, pHandle->execHandle.execTb.node, &tbUidList); if(ret != TDB_CODE_SUCCESS) { - tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, req.subKey, pHandle->consumerId); + tqError("qGetTableList error:%d vgId:%d, subkey:%s consumer:0x%" PRIx64, ret, pVnode->config.vgId, req.subKey, pHandle->consumerId); taosArrayDestroy(tbUidList); goto end; } - tqDebug("vgId:%d, tq try to get ctb for stb subscribe, suid:%" PRId64, pVnode->config.vgId, req.suid); + tqDebug("tq try to get ctb for stb subscribe, vgId:%d, subkey:%s consumer:0x%" PRIx64 " suid:%" PRId64, pVnode->config.vgId, req.subKey, pHandle->consumerId, req.suid); pHandle->execHandle.pTqReader = tqReaderOpen(pVnode); tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList); taosArrayDestroy(tbUidList); diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index ee7af5b2bf..e93efcd3cc 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -338,13 +338,15 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { } else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) { handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL); - if (nodesStringToNode(handle.execHandle.execTb.qmsg, &handle.execHandle.execTb.node) != 0) { - tqError("nodesStringToNode error in sub stable, since %s", terrstr()); - return -1; + if(strcmp(handle.execHandle.execTb.qmsg, "") != 0) { + if (nodesStringToNode(handle.execHandle.execTb.qmsg, &handle.execHandle.execTb.node) != 0) { + tqError("nodesStringToNode error in sub stable, since %s", terrstr()); + return -1; + } } SArray* tbUidList = NULL; - int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, handle.execHandle.execTb.node, NULL, &tbUidList); + int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, handle.execHandle.execTb.node, &tbUidList); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, handle.subKey, handle.consumerId); taosArrayDestroy(tbUidList); diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index 38f5307384..820a8b0eba 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -1041,7 +1041,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) { } else if (pTqHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (isAdd) { SArray* list = NULL; - int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, pTqHandle->execHandle.execTb.node, NULL, &list); + int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, pTqHandle->execHandle.execTb.node, &list); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList in tqUpdateTbUidList error:%d handle %s consumer:0x%" PRIx64, ret, pTqHandle->subKey, pTqHandle->consumerId); taosArrayDestroy(list); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 1fb35ae271..fb889692ef 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1122,13 +1122,14 @@ _end: return code; } -int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* pTagCond, void* pTagIndexCond, SArray **tableList){ - SScanPhysiNode node = {0}; - node.suid = suid; - node.uid = suid; - node.tableType = TSDB_SUPER_TABLE; +int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* node, SArray **tableList){ + SSubplan *pSubplan = (SSubplan *)node; + SScanPhysiNode pNode = {0}; + pNode.suid = suid; + pNode.uid = suid; + pNode.tableType = TSDB_SUPER_TABLE; STableListInfo* pTableListInfo = tableListCreate(); - int code = getTableList(metaHandle, pVnode, &node, pTagCond, pTagIndexCond, pTableListInfo, "qGetTableList"); + int code = getTableList(metaHandle, pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, "qGetTableList"); *tableList = pTableListInfo->pTableList; pTableListInfo->pTableList = NULL; tableListDestroy(pTableListInfo); From 60588af69476567940b6668e3c526c650a772104 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Mon, 29 May 2023 13:33:51 +0800 Subject: [PATCH 06/62] fix: add topic query --- source/libs/parser/src/parTranslater.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 6de1bd4b85..b858658709 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -5882,6 +5882,7 @@ static int32_t buildQueryForTableTopic(STranslateContext* pCxt, SCreateTopicStmt strcpy(realTable->table.tableAlias, pStmt->subSTbName); *pSelect = createSelectStmtImpl(true, pProjection, (SNode*)realTable); ((SSelectStmt*)*pSelect)->pWhere = nodesCloneNode(pStmt->pWhere); + pCxt->pParseCxt->topicQuery = true; code = translateQuery(pCxt, *pSelect); } From 97e0e0ea0da6e709d36b98e92017c7aef5b61ca6 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 29 May 2023 14:35:59 +0800 Subject: [PATCH 07/62] fix:add test case --- tests/system-test/7-tmq/stbFilterWhere.py | 159 ++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 tests/system-test/7-tmq/stbFilterWhere.py diff --git a/tests/system-test/7-tmq/stbFilterWhere.py b/tests/system-test/7-tmq/stbFilterWhere.py new file mode 100644 index 0000000000..baf042d71c --- /dev/null +++ b/tests/system-test/7-tmq/stbFilterWhere.py @@ -0,0 +1,159 @@ + +import taos +import sys +import time +import socket +import os +import threading + +from util.log import * +from util.sql import * +from util.cases import * +from util.dnodes import * +from util.common import * +sys.path.append("./7-tmq") +from tmqCommon import * + +class TDTestCase: + def init(self, conn, logSql, replicaVar=1): + self.replicaVar = int(replicaVar) + tdLog.debug(f"start to excute {__file__}") + tdSql.init(conn.cursor()) + #tdSql.init(conn.cursor(), logSql) # output sql.txt file + + def prepareTestEnv(self): + tdLog.printNoPrefix("======== prepare test env include database, stable, ctables, and insert data: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'replica': 1, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':2}, {'type': 'binary', 'len':20, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 10, + 'rowsPerTbl': 10000, + 'batchNum': 100, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 2, + 'showMsg': 1, + 'showRow': 1} + + tmqCom.initConsumerTable() + tmqCom.create_database(tsql=tdSql, dbName=paraDict["dbName"],dropFlag=paraDict["dropFlag"], vgroups=paraDict['vgroups'],replica=paraDict['replica']) + tdSql.execute("alter database %s wal_retention_period 3600"%(paraDict["dbName"])) + tdLog.info("create stb") + tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"]) + tdLog.info("create ctb") + tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'], ctbNum=paraDict['ctbNum']) + tdLog.info("insert data") + tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"], + ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"], + startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) + return + + def tmqCaseError(self, topicName, condition): + tdLog.printNoPrefix("======== test case error: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'replica': 1, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':2}, {'type': 'binary', 'len':20, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 10, + 'rowsPerTbl': 10000, + 'batchNum': 100, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 2, + 'showMsg': 1, + 'showRow': 1} + + tdLog.info("create topics from stb with column filter") + topicString = "create topic %s as stable %s.%s where %s" %(topicName, paraDict['dbName'], paraDict['stbName'], condition) + tdLog.info("create topic sql: %s"%topicString) + tdSql.error(topicString) + + def tmqCase(self, topicName, condition): + tdLog.printNoPrefix("======== test case: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'replica': 1, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':2}, {'type': 'binary', 'len':20, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 10, + 'rowsPerTbl': 10000, + 'batchNum': 100, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 2, + 'showMsg': 1, + 'showRow': 1} + + expectRowsList = [] + tmqCom.initConsumerTable() + + tdLog.info("create topics from stb with tag filter") + topicString = "create topic %s as stable %s.%s where %s" %(topicName, paraDict['dbName'], paraDict['stbName'], condition) + tdLog.info("create topic sql: %s"%topicString) + tdSql.execute(topicString) + + queryString = "select * from %s.%s where %s" %(paraDict['dbName'], paraDict['stbName'], condition) + tdSql.query(queryString) + expectRowsList.append(tdSql.getRows()) + + # init consume info, and start tmq_sim, then check consume result + tdLog.info("insert consume info to consume processor") + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] + topicList = topicName + ifcheckdata = 0 + ifManualCommit = 1 + keyList = 'group.id:cgrp1, enable.auto.commit:false, auto.commit.interval.ms:6000, auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow']) + + tdLog.info("wait the consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + + if expectRowsList[0] != resultList[0]: + tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[0], resultList[0])) + tdLog.exit("0 tmq consume rows error!") + + tdLog.printNoPrefix("======== test case end ...... ") + + def run(self): + tdSql.prepare() + self.prepareTestEnv() + self.tmqCaseError("t1", "c1 = 4 and t1 = 3") + self.tmqCase("t2", "2 > 1") + self.tmqCase("t3", "t4 = 'beijing'") + self.tmqCase("t4", "t4 > t3") + self.tmqCase("t5", "t3 = t4") + + def stop(self): + tdSql.close() + tdLog.success(f"{__file__} successfully executed") + +event = threading.Event() + +tdCases.addLinux(__file__, TDTestCase()) +tdCases.addWindows(__file__, TDTestCase()) From e36acd0a63b2396da2a277d944a441085bf92cec Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 29 May 2023 14:45:06 +0800 Subject: [PATCH 08/62] fix:add test case --- tests/parallel_test/cases.task | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 4065ac5bee..44a08da90e 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -75,6 +75,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/db.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqError.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/schema.py +,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilterWhere.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilter.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData.py ,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData1.py From 07bdb95b1a36f8b999d5466dee54d6d21cdc58df Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 29 May 2023 17:10:11 +0800 Subject: [PATCH 09/62] fix:compile error --- include/libs/executor/executor.h | 2 +- source/dnode/vnode/src/tq/tq.c | 2 +- source/dnode/vnode/src/tq/tqMeta.c | 2 +- source/dnode/vnode/src/tq/tqRead.c | 2 +- source/libs/executor/src/executil.c | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 5225a7a644..66418e6841 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -82,7 +82,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers, int32_t v qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, uint64_t id); -int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* node, SArray **tableList); +int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList); /** * set the task Id, usually used by message queue process diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index fb9f620c20..01a60a99e4 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -713,7 +713,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg } SArray* tbUidList = NULL; - ret = qGetTableList(req.suid, pVnode->pMeta, pVnode, pHandle->execHandle.execTb.node, &tbUidList); + ret = qGetTableList(req.suid, pVnode, pHandle->execHandle.execTb.node, &tbUidList); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList error:%d vgId:%d, subkey:%s consumer:0x%" PRIx64, ret, pVnode->config.vgId, req.subKey, pHandle->consumerId); taosArrayDestroy(tbUidList); diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index 32f4931fae..d4371f1264 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -347,7 +347,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { } SArray* tbUidList = NULL; - int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, handle.execHandle.execTb.node, &tbUidList); + int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode, handle.execHandle.execTb.node, &tbUidList); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, handle.subKey, handle.consumerId); taosArrayDestroy(tbUidList); diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index fea5104017..a5ec0d4def 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -1084,7 +1084,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) { } else if (pTqHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (isAdd) { SArray* list = NULL; - int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode->pMeta, pTq->pVnode, pTqHandle->execHandle.execTb.node, &list); + int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode, pTqHandle->execHandle.execTb.node, &list); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList in tqUpdateTbUidList error:%d handle %s consumer:0x%" PRIx64, ret, pTqHandle->subKey, pTqHandle->consumerId); taosArrayDestroy(list); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index e359cf51e3..19b64d9833 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1152,14 +1152,14 @@ _end: return code; } -int32_t qGetTableList(int64_t suid, void* metaHandle, void* pVnode, void* node, SArray **tableList){ +int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList){ SSubplan *pSubplan = (SSubplan *)node; SScanPhysiNode pNode = {0}; pNode.suid = suid; pNode.uid = suid; pNode.tableType = TSDB_SUPER_TABLE; STableListInfo* pTableListInfo = tableListCreate(); - int code = getTableList(metaHandle, pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, "qGetTableList"); + int code = getTableList(pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, "qGetTableList"); *tableList = pTableListInfo->pTableList; pTableListInfo->pTableList = NULL; tableListDestroy(pTableListInfo); From 41ed0138b437630f0b6cd0d08701c1ad0e85463c Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 29 May 2023 17:25:11 +0800 Subject: [PATCH 10/62] fix:compile error --- include/libs/executor/executor.h | 2 +- source/dnode/vnode/src/tq/tq.c | 10 +++++----- source/dnode/vnode/src/tq/tqMeta.c | 9 ++++----- source/dnode/vnode/src/tq/tqRead.c | 2 +- source/libs/executor/src/executil.c | 4 ++-- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/include/libs/executor/executor.h b/include/libs/executor/executor.h index 66418e6841..e46757f6f8 100644 --- a/include/libs/executor/executor.h +++ b/include/libs/executor/executor.h @@ -82,7 +82,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers, int32_t v qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, uint64_t id); -int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList); +int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList, void* pTaskInfo); /** * set the task Id, usually used by message queue process diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 01a60a99e4..f8116f49ef 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -712,8 +712,12 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg } } + buildSnapContext(handle.vnode, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta, + (SSnapContext**)(&handle.sContext)); + pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, req.newConsumerId); + SArray* tbUidList = NULL; - ret = qGetTableList(req.suid, pVnode, pHandle->execHandle.execTb.node, &tbUidList); + ret = qGetTableList(req.suid, pVnode, pHandle->execHandle.execTb.node, &tbUidList, pHandle->execHandle.task); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList error:%d vgId:%d, subkey:%s consumer:0x%" PRIx64, ret, pVnode->config.vgId, req.subKey, pHandle->consumerId); taosArrayDestroy(tbUidList); @@ -723,10 +727,6 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg pHandle->execHandle.pTqReader = tqReaderOpen(pVnode); tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList); taosArrayDestroy(tbUidList); - - buildSnapContext(handle.vnode, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta, - (SSnapContext**)(&handle.sContext)); - pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, req.newConsumerId); } taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle)); diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index d4371f1264..0edffd7f05 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -345,9 +345,12 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { return -1; } } + buildSnapContext(reader.vnode, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType, + handle.fetchMeta, (SSnapContext**)(&reader.sContext)); + handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0); SArray* tbUidList = NULL; - int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode, handle.execHandle.execTb.node, &tbUidList); + int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode, handle.execHandle.execTb.node, &tbUidList, handle.execHandle.task); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, handle.subKey, handle.consumerId); taosArrayDestroy(tbUidList); @@ -357,10 +360,6 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { handle.execHandle.pTqReader = tqReaderOpen(pTq->pVnode); tqReaderSetTbUidList(handle.execHandle.pTqReader, tbUidList); taosArrayDestroy(tbUidList); - - buildSnapContext(reader.vnode, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType, - handle.fetchMeta, (SSnapContext**)(&reader.sContext)); - handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0); } tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, vgId); taosWLockLatch(&pTq->lock); diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index a5ec0d4def..6ef232995a 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -1084,7 +1084,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) { } else if (pTqHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (isAdd) { SArray* list = NULL; - int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode, pTqHandle->execHandle.execTb.node, &list); + int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode, pTqHandle->execHandle.execTb.node, &list, pTqHandle->execHandle.task); if(ret != TDB_CODE_SUCCESS) { tqError("qGetTableList in tqUpdateTbUidList error:%d handle %s consumer:0x%" PRIx64, ret, pTqHandle->subKey, pTqHandle->consumerId); taosArrayDestroy(list); diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index 19b64d9833..a168050645 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1152,14 +1152,14 @@ _end: return code; } -int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList){ +int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList, void* pTaskInfo){ SSubplan *pSubplan = (SSubplan *)node; SScanPhysiNode pNode = {0}; pNode.suid = suid; pNode.uid = suid; pNode.tableType = TSDB_SUPER_TABLE; STableListInfo* pTableListInfo = tableListCreate(); - int code = getTableList(pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, "qGetTableList"); + int code = getTableList(pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, "qGetTableList", &((SExecTaskInfo*)pTaskInfo)->storageAPI); *tableList = pTableListInfo->pTableList; pTableListInfo->pTableList = NULL; tableListDestroy(pTableListInfo); From 16e14b1c828a75a6ad739b41d601b0dd34acb795 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Mon, 29 May 2023 17:27:35 +0800 Subject: [PATCH 11/62] fix:compile error --- source/libs/executor/src/executil.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index a168050645..f4531729c4 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1159,7 +1159,8 @@ int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList pNode.uid = suid; pNode.tableType = TSDB_SUPER_TABLE; STableListInfo* pTableListInfo = tableListCreate(); - int code = getTableList(pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, "qGetTableList", &((SExecTaskInfo*)pTaskInfo)->storageAPI); + uint8_t digest[17] = {0}; + int code = getTableList(pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, digest, "qGetTableList", &((SExecTaskInfo*)pTaskInfo)->storageAPI); *tableList = pTableListInfo->pTableList; pTableListInfo->pTableList = NULL; tableListDestroy(pTableListInfo); From 88350280020e952e7c1d7a04aa044943da6355c8 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 30 May 2023 10:21:18 +0800 Subject: [PATCH 12/62] fix:deal with node is null --- source/libs/executor/src/executil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index c7677878bf..3752a56b92 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -1160,7 +1160,7 @@ int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList pNode.tableType = TSDB_SUPER_TABLE; STableListInfo* pTableListInfo = tableListCreate(); uint8_t digest[17] = {0}; - int code = getTableList(pVnode, &pNode, pSubplan->pTagCond, pSubplan->pTagIndexCond, pTableListInfo, digest, "qGetTableList", &((SExecTaskInfo*)pTaskInfo)->storageAPI); + int code = getTableList(pVnode, &pNode, pSubplan ? pSubplan->pTagCond : NULL, pSubplan ? pSubplan->pTagIndexCond : NULL, pTableListInfo, digest, "qGetTableList", &((SExecTaskInfo*)pTaskInfo)->storageAPI); *tableList = pTableListInfo->pTableList; pTableListInfo->pTableList = NULL; tableListDestroy(pTableListInfo); From 5d2c78ba6b5d37e3224d2d3f6587de43cdec23bd Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 30 May 2023 10:39:00 +0800 Subject: [PATCH 13/62] fix:memory leak --- source/libs/nodes/src/nodesUtilFuncs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c index 17a5677987..70fc45e07a 100644 --- a/source/libs/nodes/src/nodesUtilFuncs.c +++ b/source/libs/nodes/src/nodesUtilFuncs.c @@ -921,6 +921,7 @@ void nodesDestroyNode(SNode* pNode) { break; case QUERY_NODE_CREATE_TOPIC_STMT: nodesDestroyNode(((SCreateTopicStmt*)pNode)->pQuery); + nodesDestroyNode(((SCreateTopicStmt*)pNode)->pWhere); break; case QUERY_NODE_DROP_TOPIC_STMT: // no pointer field case QUERY_NODE_DROP_CGROUP_STMT: // no pointer field From 757ac9b1d9749be7a2d52de06bcc67e4b7af8419 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 30 May 2023 14:20:21 +0800 Subject: [PATCH 14/62] fix:add test cases --- tests/system-test/7-tmq/stbFilterWhere.py | 72 ++++++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/tests/system-test/7-tmq/stbFilterWhere.py b/tests/system-test/7-tmq/stbFilterWhere.py index baf042d71c..8d8d046cef 100644 --- a/tests/system-test/7-tmq/stbFilterWhere.py +++ b/tests/system-test/7-tmq/stbFilterWhere.py @@ -56,7 +56,7 @@ class TDTestCase: startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx']) return - def tmqCaseError(self, topicName, condition): + def tmqCase_columnError(self, topicName, condition): tdLog.printNoPrefix("======== test case error: ") paraDict = {'dbName': 'dbt', 'dropFlag': 1, @@ -140,14 +140,82 @@ class TDTestCase: tdLog.printNoPrefix("======== test case end ...... ") + def tmqCase_addNewTable_dropTag(self, topicName, condition): + tdLog.printNoPrefix("======== test case1: ") + paraDict = {'dbName': 'dbt', + 'dropFlag': 1, + 'event': '', + 'vgroups': 4, + 'replica': 1, + 'stbName': 'stb', + 'colPrefix': 'c', + 'tagPrefix': 't', + 'colSchema': [{'type': 'INT', 'count':2}, {'type': 'binary', 'len':20, 'count':1}], + 'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}], + 'ctbPrefix': 'ctb', + 'ctbStartIdx': 0, + 'ctbNum': 10, + 'rowsPerTbl': 10000, + 'batchNum': 100, + 'startTs': 1640966400000, # 2022-01-01 00:00:00.000 + 'pollDelay': 2, + 'showMsg': 1, + 'showRow': 1} + + expectRowsList = [] + tmqCom.initConsumerTable() + + tdLog.info("create topics from stb with tag filter") + topicString = "create topic %s as stable %s.%s where %s" %(topicName, paraDict['dbName'], paraDict['stbName'], condition) + tdLog.info("create topic sql: %s"%topicString) + tdSql.execute(topicString) + + queryString = "select * from %s.%s where %s" %(paraDict['dbName'], paraDict['stbName'], condition) + tdSql.query(queryString) + expectRowsList.append(tdSql.getRows() + 1) + + # init consume info, and start tmq_sim, then check consume result + tdLog.info("insert consume info to consume processor") + consumerId = 0 + expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"] + topicList = topicName + ifcheckdata = 0 + ifManualCommit = 1 + keyList = 'group.id:cgrp1, enable.auto.commit:false, auto.commit.interval.ms:6000, auto.offset.reset:earliest' + tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit) + + tdLog.info("start consume processor") + tmqCom.startTmqSimProcess(paraDict['pollDelay'],paraDict["dbName"],paraDict['showMsg'], paraDict['showRow']) + + #add new table with one data + tdLog.info("start insert data") + insertString = "insert into %s.tmp using %s.%s tags(1, 1, 1, 't4', 't5') values(now, 1, 1, 1, 'c4', 'c5', now)" %(paraDict['dbName'], paraDict['dbName'], paraDict['stbName']) + tdSql.execute(insertString) + + #test drop tag + tdSql.error("alter stable %s.%s drop tag t1" %(paraDict['dbName'], paraDict['stbName'])) + tdSql.execute("alter stable %s.%s drop tag t2" %(paraDict['dbName'], paraDict['stbName'])) + tdSql.execute("alter stable %s.%s drop column c2" %(paraDict['dbName'], paraDict['stbName'])) + + tdLog.info("wait the consume result") + expectRows = 1 + resultList = tmqCom.selectConsumeResult(expectRows) + + if expectRowsList[0] != resultList[0]: + tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[0], resultList[0])) + tdLog.exit("0 tmq consume rows error!") + + tdLog.printNoPrefix("======== test case1 end ...... ") + def run(self): tdSql.prepare() self.prepareTestEnv() - self.tmqCaseError("t1", "c1 = 4 and t1 = 3") + self.tmqCase_columnError("t1", "c1 = 4 and t1 = 3") self.tmqCase("t2", "2 > 1") self.tmqCase("t3", "t4 = 'beijing'") self.tmqCase("t4", "t4 > t3") self.tmqCase("t5", "t3 = t4") + self.tmqCase_addNewTable_dropTag("t6", "t1 = 1") def stop(self): tdSql.close() From b8a4df414699a94e0c4a2c775d101ae8df3c6123 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 30 May 2023 16:50:20 +0800 Subject: [PATCH 15/62] fix:avoid put tag to select if where condition is always true or false --- source/libs/parser/src/parTranslater.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 102b7479be..c10ee5d988 100644 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -5899,15 +5899,15 @@ static int32_t checkCollectTopicTags(STranslateContext* pCxt, SCreateTopicStmt* nodesDestroyList(colCxt.pTags); return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_SYNTAX_ERROR, "Columns are forbidden in where clause"); } - if (NULL == colCxt.pTags) { - for (int32_t i = 0; i < pMeta->tableInfo.numOfTags; ++i) { - SSchema* tag = &pMeta->schema[pMeta->tableInfo.numOfColumns + i]; + 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); - strcpy(col->colName, tag->name); + strcpy(col->colName, column->name); strcpy(col->node.aliasName, col->colName); strcpy(col->node.userAlias, col->colName); addTagList(&colCxt.pTags, (SNode*)col); - } +// } } *ppProjection = colCxt.pTags; From fcdf25793b5890b7f39d2f47ab1b004a43194877 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 30 May 2023 16:52:53 +0800 Subject: [PATCH 16/62] fix:remove useless code --- tests/script/tsim/tmq/topic.sim | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/script/tsim/tmq/topic.sim b/tests/script/tsim/tmq/topic.sim index 85a23055a3..073c8c2532 100644 --- a/tests/script/tsim/tmq/topic.sim +++ b/tests/script/tsim/tmq/topic.sim @@ -108,7 +108,6 @@ if $rows != 6 then return -1 endi -return -1 sql create topic topic_stable_1 as stable stb where t1 > 0 sql create topic topic_stable_1 as stable stb where t1 > 0 and t1 < 0 sql create topic topic_stable_1 as stable stb where 1 > 0 From e4866d1803c6987a377ab3eb8dfd96a9cdbe2422 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 31 May 2023 10:38:22 +0800 Subject: [PATCH 17/62] fix:ci test cases error --- tests/script/tsim/tmq/topic.sim | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/script/tsim/tmq/topic.sim b/tests/script/tsim/tmq/topic.sim index 073c8c2532..78c4c561af 100644 --- a/tests/script/tsim/tmq/topic.sim +++ b/tests/script/tsim/tmq/topic.sim @@ -109,12 +109,14 @@ if $rows != 6 then endi sql create topic topic_stable_1 as stable stb where t1 > 0 -sql create topic topic_stable_1 as stable stb where t1 > 0 and t1 < 0 -sql create topic topic_stable_1 as stable stb where 1 > 0 -sql create topic topic_stable_1 as stable stb where last(t1) > 0 -sql create topic topic_stable_1 as stable stb where tbname is not null -sql create topic topic_stable_1 as stable stb where tbname > 'a' -sql create topic topic_stable_1 as stable stb where tbname > 0 and xx < 0 -sql create topic topic_stable_1 as stable stb where tbname > 0 and c1 < 0 +sql create topic topic_stable_2 as stable stb where t1 > 0 and t1 < 0 +sql create topic topic_stable_3 as stable stb where 1 > 0 +sql create topic topic_stable_4 as stable stb where abs(t1) > 0 +sql_error create topic topic_stable_5 as stable stb where last(t1) > 0 +sql_error create topic topic_stable_5 as stable stb where sum(t1) > 0 +sql create topic topic_stable_6 as stable stb where tbname is not null +sql create topic topic_stable_7 as stable stb where tbname > 'a' +sql_error create topic topic_stable_8 as stable stb where tbname > 0 and xx < 0 +sql_error create topic topic_stable_9 as stable stb where tbname > 0 and c1 < 0 system sh/exec.sh -n dnode1 -s stop -x SIGINT From 04f3784696cc11f534451196b2aee4a9f2ea9d98 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Wed, 31 May 2023 11:05:03 +0000 Subject: [PATCH 18/62] change log level --- source/libs/stream/src/streamBackendRocksdb.c | 14 +++++++------- source/libs/stream/src/streamDispatch.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index c8a6597bad..9d94a28c8a 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -1026,10 +1026,10 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa rocksdb_put_cf(db, opts, pHandle, (const char*)buf, klen, (const char*)ttlV, (size_t)ttlVLen, &err); \ if (err != NULL) { \ taosMemoryFree(err); \ - qDebug("streamState str: %s failed to write to %s, err: %s", toString, funcname, err); \ + qError("streamState str: %s failed to write to %s, err: %s", toString, funcname, err); \ code = -1; \ } else { \ - qDebug("streamState str:%s succ to write to %s, valLen:%d", toString, funcname, vLen); \ + qTrace("streamState str:%s succ to write to %s, valLen:%d", toString, funcname, vLen); \ } \ taosMemoryFree(ttlV); \ } while (0); @@ -1056,10 +1056,10 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa char* val = rocksdb_get_cf(db, opts, pHandle, (const char*)buf, klen, (size_t*)&len, &err); \ if (val == NULL) { \ if (err == NULL) { \ - qDebug("streamState str: %s failed to read from %s_%s, err: not exist", toString, pState->pTdbState->idstr, \ + qTrace("streamState str: %s failed to read from %s_%s, err: not exist", toString, pState->pTdbState->idstr, \ funcname); \ } else { \ - qDebug("streamState str: %s failed to read from %s_%s, err: %s", toString, pState->pTdbState->idstr, funcname, \ + qError("streamState str: %s failed to read from %s_%s, err: %s", toString, pState->pTdbState->idstr, funcname, \ err); \ taosMemoryFreeClear(err); \ } \ @@ -1068,11 +1068,11 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa char* p = NULL; \ int32_t len = ginitDict[i].deValueFunc(val, len, NULL, (char**)pVal); \ if (len < 0) { \ - qDebug("streamState str: %s failed to read from %s_%s, err: already ttl ", toString, pState->pTdbState->idstr, \ + qError("streamState str: %s failed to read from %s_%s, err: already ttl ", toString, pState->pTdbState->idstr, \ funcname); \ code = -1; \ } else { \ - qDebug("streamState str: %s succ to read from %s_%s, valLen:%d", toString, pState->pTdbState->idstr, funcname, \ + qTrace("streamState str: %s succ to read from %s_%s, valLen:%d", toString, pState->pTdbState->idstr, funcname, \ len); \ } \ taosMemoryFree(val); \ @@ -1107,7 +1107,7 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa taosMemoryFree(err); \ code = -1; \ } else { \ - qDebug("streamState str: %s succ to del from %s_%s", toString, pState->pTdbState->idstr, funcname); \ + qTrace("streamState str: %s succ to del from %s_%s", toString, pState->pTdbState->idstr, funcname); \ } \ } while (0); diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index 401a8b9e74..042ea373a1 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -157,7 +157,7 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock) tEncodeStreamRetrieveReq(&encoder, &req); tEncoderClear(&encoder); - SRpcMsg rpcMsg = { .code = 0, .msgType = TDMT_STREAM_RETRIEVE, .pCont = buf, .contLen = sizeof(SMsgHead) + len }; + SRpcMsg rpcMsg = {.code = 0, .msgType = TDMT_STREAM_RETRIEVE, .pCont = buf, .contLen = sizeof(SMsgHead) + len}; if (tmsgSendReq(&pEpInfo->epSet, &rpcMsg) < 0) { ASSERT(0); goto CLEAR; From 91de00597d64d89b41acb254eb09f30fdf67c874 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Wed, 31 May 2023 22:12:14 +0800 Subject: [PATCH 19/62] refactor: do some internal refactor. --- source/libs/stream/src/streamExec.c | 36 ++++++++++++++++++----------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index 716b939e5f..c3dd848bc7 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -17,7 +17,7 @@ // maximum allowed processed block batches. One block may include several submit blocks #define MAX_STREAM_EXEC_BATCH_NUM 32 -#define MIN_STREAM_EXEC_BATCH_NUM 8 +#define MIN_STREAM_EXEC_BATCH_NUM 4 #define MAX_STREAM_RESULT_DUMP_THRESHOLD 100 static int32_t updateCheckPointInfo (SStreamTask* pTask); @@ -44,6 +44,7 @@ static int32_t doDumpResult(SStreamTask* pTask, SStreamQueueItem* pItem, SArray* if (numOfBlocks > 0) { SStreamDataBlock* pStreamBlocks = createStreamBlockFromResults(pItem, pTask, size, pRes); if (pStreamBlocks == NULL) { + qError("s-task:%s failed to create result stream data block, code:%s", pTask->id.idStr, tstrerror(terrno)); taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes); return -1; } @@ -314,8 +315,13 @@ int32_t updateCheckPointInfo (SStreamTask* pTask) { return TSDB_CODE_SUCCESS; } +/** + * todo: the batch of blocks should be tuned dynamic, according to the total elapsed time of each batch of blocks, the + * appropriate batch of blocks should be handled in 5 to 10 sec. + */ int32_t streamExecForAll(SStreamTask* pTask) { - int32_t code = 0; + const char* id = pTask->id.idStr; + while (1) { int32_t batchSize = 1; int16_t times = 0; @@ -323,7 +329,7 @@ int32_t streamExecForAll(SStreamTask* pTask) { SStreamQueueItem* pInput = NULL; // merge multiple input data if possible in the input queue. - qDebug("s-task:%s start to extract data block from inputQ", pTask->id.idStr); + qDebug("s-task:%s start to extract data block from inputQ", id); while (1) { if (streamTaskShouldPause(&pTask->status)) { @@ -338,7 +344,7 @@ int32_t streamExecForAll(SStreamTask* pTask) { if (qItem == NULL) { if (pTask->taskLevel == TASK_LEVEL__SOURCE && batchSize < MIN_STREAM_EXEC_BATCH_NUM && times < 5) { times++; - taosMsleep(1); + taosMsleep(10); qDebug("===stream===try again batchSize:%d", batchSize); continue; } @@ -363,8 +369,10 @@ int32_t streamExecForAll(SStreamTask* pTask) { batchSize++; pInput = newRet; streamQueueProcessSuccess(pTask->inputQueue); + if (batchSize > MAX_STREAM_EXEC_BATCH_NUM) { - qDebug("maximum batch limit:%d reached, processing, %s", MAX_STREAM_EXEC_BATCH_NUM, pTask->id.idStr); + qDebug("s-task:%s maximum batch limit:%d reached, processing this batch of blocks", id, + MAX_STREAM_EXEC_BATCH_NUM); break; } } @@ -375,7 +383,6 @@ int32_t streamExecForAll(SStreamTask* pTask) { if (pInput) { streamFreeQitem(pInput); } - return 0; } @@ -385,7 +392,7 @@ int32_t streamExecForAll(SStreamTask* pTask) { if (pTask->taskLevel == TASK_LEVEL__SINK) { ASSERT(pInput->type == STREAM_INPUT__DATA_BLOCK); - qDebug("s-task:%s sink task start to sink %d blocks", pTask->id.idStr, batchSize); + qDebug("s-task:%s sink task start to sink %d blocks", id, batchSize); streamTaskOutputResultBlock(pTask, (SStreamDataBlock*)pInput); continue; } @@ -394,16 +401,16 @@ int32_t streamExecForAll(SStreamTask* pTask) { while (pTask->taskLevel == TASK_LEVEL__SOURCE) { int8_t status = atomic_load_8(&pTask->status.taskStatus); if (status != TASK_STATUS__NORMAL && status != TASK_STATUS__PAUSE) { - qError("stream task wait for the end of fill history, s-task:%s, status:%d", pTask->id.idStr, + qError("stream task wait for the end of fill history, s-task:%s, status:%d", id, atomic_load_8(&pTask->status.taskStatus)); - taosMsleep(2); + taosMsleep(100); } else { break; } } int64_t st = taosGetTimestampMs(); - qDebug("s-task:%s start to execute, block batches:%d", pTask->id.idStr, batchSize); + qDebug("s-task:%s start to process batch of blocks, num:%d", id, batchSize); { // set input @@ -417,21 +424,21 @@ int32_t streamExecForAll(SStreamTask* pTask) { ASSERT(pTask->taskLevel == TASK_LEVEL__SOURCE); const SStreamDataSubmit* pSubmit = (const SStreamDataSubmit*)pInput; qSetMultiStreamInput(pExecutor, &pSubmit->submit, 1, STREAM_INPUT__DATA_SUBMIT); - qDebug("s-task:%s set submit blocks as source block completed, %p %p len:%d ver:%" PRId64, pTask->id.idStr, pSubmit, + qDebug("s-task:%s set submit blocks as source block completed, %p %p len:%d ver:%" PRId64, id, pSubmit, pSubmit->submit.msgStr, pSubmit->submit.msgLen, pSubmit->submit.ver); } else if (pItem->type == STREAM_INPUT__DATA_BLOCK || pItem->type == STREAM_INPUT__DATA_RETRIEVE) { const SStreamDataBlock* pBlock = (const SStreamDataBlock*)pInput; SArray* pBlockList = pBlock->blocks; int32_t numOfBlocks = taosArrayGetSize(pBlockList); - qDebug("s-task:%s set sdata blocks as input num:%d, ver:%" PRId64, pTask->id.idStr, numOfBlocks, pBlock->sourceVer); + qDebug("s-task:%s set sdata blocks as input num:%d, ver:%" PRId64, id, numOfBlocks, pBlock->sourceVer); qSetMultiStreamInput(pExecutor, pBlockList->pData, numOfBlocks, STREAM_INPUT__DATA_BLOCK); } else if (pItem->type == STREAM_INPUT__MERGED_SUBMIT) { const SStreamMergedSubmit* pMerged = (const SStreamMergedSubmit*)pInput; SArray* pBlockList = pMerged->submits; int32_t numOfBlocks = taosArrayGetSize(pBlockList); - qDebug("s-task:%s %p set submit input (merged), batch num:%d", pTask->id.idStr, pTask, numOfBlocks); + qDebug("s-task:%s %p set submit input (merged), batch num:%d", id, pTask, numOfBlocks); qSetMultiStreamInput(pExecutor, pBlockList->pData, numOfBlocks, STREAM_INPUT__MERGED_SUBMIT); } else if (pItem->type == STREAM_INPUT__REF_DATA_BLOCK) { const SStreamRefDataBlock* pRefBlock = (const SStreamRefDataBlock*)pInput; @@ -446,7 +453,8 @@ int32_t streamExecForAll(SStreamTask* pTask) { streamTaskExecImpl(pTask, pInput, &resSize, &totalBlocks); double el = (taosGetTimestampMs() - st) / 1000.0; - qDebug("s-task:%s exec end, elapsed time:%.2fs, result size:%.2fMiB, numOfBlocks:%d", pTask->id.idStr, el, resSize / 1048576.0, totalBlocks); + qDebug("s-task:%s batch of input blocks exec end, elapsed time:%.2fs, result size:%.2fMiB, numOfBlocks:%d", + id, el, resSize / 1048576.0, totalBlocks); streamFreeQitem(pInput); } From 6517ede04461b5f471c1859fbbd7d3963e0010df Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 1 Jun 2023 11:23:31 +0800 Subject: [PATCH 20/62] fix: fix interval operator ensure capacity logic --- source/libs/executor/src/executorInt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/executorInt.c b/source/libs/executor/src/executorInt.c index e18906ad18..5872d019fa 100644 --- a/source/libs/executor/src/executorInt.c +++ b/source/libs/executor/src/executorInt.c @@ -827,7 +827,7 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS } if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) { - uint32_t newSize = pBlock->info.rows + pRow->numOfRows + (numOfRows - i) > 1 ? 1 : 0; + uint32_t newSize = pBlock->info.rows + pRow->numOfRows + ((numOfRows - i) > 1 ? 1 : 0); blockDataEnsureCapacity(pBlock, newSize); qDebug("datablock capacity not sufficient, expand to required:%d, current capacity:%d, %s", newSize, pBlock->info.capacity, GET_TASKID(pTaskInfo)); From 21920721f3b7c34924d6c9971a8e8677618eb413 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Jun 2023 15:10:08 +0800 Subject: [PATCH 21/62] fix:make version compatible --- source/dnode/mnode/impl/src/mndTopic.c | 8 +++++--- source/dnode/vnode/src/tq/tqMeta.c | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index 10bd7a7a8d..a2c0014245 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -28,7 +28,7 @@ #include "parser.h" #include "tname.h" -#define MND_TOPIC_VER_NUMBER 2 +#define MND_TOPIC_VER_NUMBER 3 #define MND_TOPIC_RESERVE_SIZE 64 SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic); @@ -170,7 +170,7 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) { int8_t sver = 0; if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto TOPIC_DECODE_OVER; - if (sver != 1 && sver != 2) { + if (sver < 1 || sver > MND_TOPIC_VER_NUMBER) { terrno = TSDB_CODE_SDB_INVALID_DATA_VER; goto TOPIC_DECODE_OVER; } @@ -197,7 +197,9 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) { SDB_GET_INT8(pRaw, dataPos, &pTopic->withMeta, TOPIC_DECODE_OVER); SDB_GET_INT64(pRaw, dataPos, &pTopic->stbUid, TOPIC_DECODE_OVER); - SDB_GET_BINARY(pRaw, dataPos, pTopic->stbName, TSDB_TABLE_FNAME_LEN, TOPIC_DECODE_OVER); + if (sver >= 3) { + SDB_GET_BINARY(pRaw, dataPos, pTopic->stbName, TSDB_TABLE_FNAME_LEN, TOPIC_DECODE_OVER); + } SDB_GET_INT32(pRaw, dataPos, &pTopic->sqlLen, TOPIC_DECODE_OVER); pTopic->sql = taosMemoryCalloc(pTopic->sqlLen, sizeof(char)); if (pTopic->sql == NULL) { diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index 0edffd7f05..0021aa6ba7 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -65,7 +65,9 @@ int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) { } } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (tDecodeI64(pDecoder, &pHandle->execHandle.execTb.suid) < 0) return -1; - if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.execTb.qmsg) < 0) return -1; + if (!tDecodeIsEnd(pDecoder)){ + if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.execTb.qmsg) < 0) return -1; + } } tEndDecode(pDecoder); return 0; From 64edab63025818aa807737cab687f31d0c9206c9 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 1 Jun 2023 07:51:52 +0000 Subject: [PATCH 22/62] refactor code --- source/libs/stream/src/streamBackendRocksdb.c | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index 9d94a28c8a..eabec058d7 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -1134,31 +1134,29 @@ int32_t streamStateDel_rocksdb(SStreamState* pState, const SWinKey* key) { int32_t streamStateClear_rocksdb(SStreamState* pState) { qDebug("streamStateClear_rocksdb"); - SStateKey sKey = {.key = {.ts = 0, .groupId = 0}, .opNum = pState->number}; - SStateKey eKey = {.key = {.ts = INT64_MAX, .groupId = UINT64_MAX}, .opNum = pState->number}; char sKeyStr[128] = {0}; char eKeyStr[128] = {0}; + SStateKey sKey = {.key = {.ts = 0, .groupId = 0}, .opNum = pState->number}; + SStateKey eKey = {.key = {.ts = INT64_MAX, .groupId = UINT64_MAX}, .opNum = pState->number}; int sLen = stateKeyEncode(&sKey, sKeyStr); int eLen = stateKeyEncode(&eKey, eKeyStr); - char toStringStart[128] = {0}; - char toStringEnd[128] = {0}; - if (qDebugFlag & DEBUG_TRACE) { - stateKeyToString(&sKey, toStringStart); - stateKeyToString(&eKey, toStringEnd); - } - - char* err = NULL; if (pState->pTdbState->pHandle[1] != NULL) { + char* err = NULL; rocksdb_delete_range_cf(pState->pTdbState->rocksdb, pState->pTdbState->writeOpts, pState->pTdbState->pHandle[1], sKeyStr, sLen, eKeyStr, eLen, &err); - } - // rocksdb_compact_range_cf(pState->pTdbState->rocksdb, pState->pTdbState->pHandle[0], sKeyStr, sLen, eKeyStr, - // eLen); - if (err != NULL) { - qWarn("failed to delete range cf(state) start: %s, end:%s, reason:%s", toStringStart, toStringEnd, err); - taosMemoryFree(err); + if (err != NULL) { + char toStringStart[128] = {0}; + char toStringEnd[128] = {0}; + stateKeyToString(&sKey, toStringStart); + stateKeyToString(&eKey, toStringEnd); + + qWarn("failed to delete range cf(state) start: %s, end:%s, reason:%s", toStringStart, toStringEnd, err); + taosMemoryFree(err); + } else { + rocksdb_compact_range_cf(pState->pTdbState->rocksdb, pState->pTdbState->pHandle[1], sKeyStr, sLen, eKeyStr, eLen); + } } return 0; From d20e0a06f6849e40bcfd74346729084009bfc3af Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Jun 2023 16:04:45 +0800 Subject: [PATCH 23/62] fix:make version compatible --- source/dnode/vnode/src/tq/tqMeta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index 0021aa6ba7..25cfad4b36 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -341,7 +341,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { } else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) { handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL); - if(strcmp(handle.execHandle.execTb.qmsg, "") != 0) { + if(handle.execHandle.execTb.qmsg != NULL && strcmp(handle.execHandle.execTb.qmsg, "") != 0) { if (nodesStringToNode(handle.execHandle.execTb.qmsg, &handle.execHandle.execTb.node) != 0) { tqError("nodesStringToNode error in sub stable, since %s", terrstr()); return -1; From 69499b95826c9c973cb67a023a7ba8f67a6f17e4 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Jun 2023 16:09:17 +0800 Subject: [PATCH 24/62] fix:make version compatible --- source/dnode/vnode/src/tq/tqMeta.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index 25cfad4b36..239d65fdb7 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -37,7 +37,9 @@ int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) { } } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { if (tEncodeI64(pEncoder, pHandle->execHandle.execTb.suid) < 0) return -1; - if (tEncodeCStr(pEncoder, pHandle->execHandle.execTb.qmsg) < 0) return -1; + if (pHandle->execHandle.execTb.qmsg != NULL){ + if (tEncodeCStr(pEncoder, pHandle->execHandle.execTb.qmsg) < 0) return -1; + } } tEndEncode(pEncoder); return pEncoder->pos; From 64656a59d9a9f4fb45d3355cd927093900c75620 Mon Sep 17 00:00:00 2001 From: liuyao <54liuyao@163.com> Date: Thu, 1 Jun 2023 16:28:32 +0800 Subject: [PATCH 25/62] reset sream fill block index --- source/libs/executor/src/filloperator.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/libs/executor/src/filloperator.c b/source/libs/executor/src/filloperator.c index 90b7f4a77e..519ddc1916 100644 --- a/source/libs/executor/src/filloperator.c +++ b/source/libs/executor/src/filloperator.c @@ -1002,9 +1002,10 @@ static void doStreamFillImpl(SOperatorInfo* pOperator) { SSDataBlock* pBlock = pInfo->pSrcBlock; uint64_t groupId = pBlock->info.id.groupId; SSDataBlock* pRes = pInfo->pRes; + SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol); + TSKEY* tsCol = (TSKEY*)pTsCol->pData; pRes->info.id.groupId = groupId; - SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol); - TSKEY* tsCol = (TSKEY*)pTsCol->pData; + pInfo->srcRowIndex++; if (pInfo->srcRowIndex == 0) { keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize); @@ -1242,7 +1243,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { SSDataBlock* fillResult = NULL; SOperatorInfo* downstream = pOperator->pDownstream[0]; while (1) { - if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows) { + if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows || pInfo->pSrcBlock->info.rows == 0) { // If there are delete datablocks, we receive them first. SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); if (pBlock == NULL) { @@ -1281,7 +1282,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { case STREAM_PULL_DATA: { doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock); memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN); - pInfo->srcRowIndex = 0; + pInfo->srcRowIndex = -1; } break; case STREAM_CREATE_CHILD_TABLE: { return pBlock; @@ -1497,7 +1498,7 @@ SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFi goto _error; } - pInfo->srcRowIndex = 0; + pInfo->srcRowIndex = -1; setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo); pOperator->fpSet = From bb772e2062c5b17e73a7944dbe67600868aedb2e Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Jun 2023 17:03:02 +0800 Subject: [PATCH 26/62] fix:make version compatible --- source/dnode/mnode/impl/src/mndTopic.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index a2c0014245..f1ee7bca3b 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -924,13 +924,12 @@ static int32_t mndRetrieveTopic(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl }else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE){ SStbObj *pStb = mndAcquireStb(pMnode, pTopic->stbName); if (pStb == NULL) { - terrno = TSDB_CODE_MND_STB_NOT_EXIST; - taosMemoryFree(schemaJson); - return -1; + STR_TO_VARSTR(schemaJson, "NULL"); + mError("mndRetrieveTopic mndAcquireStb null stbName:%s", pTopic->stbName); + }else{ + schemaToJson(pStb->pColumns, pStb->numOfColumns, schemaJson); + mndReleaseStb(pMnode, pStb); } - schemaToJson(pStb->pColumns, pStb->numOfColumns, schemaJson); - - mndReleaseStb(pMnode, pStb); }else{ STR_TO_VARSTR(schemaJson, "NULL"); } From 2935ebcfc4d48d3ade0737f87fa7381872a34b06 Mon Sep 17 00:00:00 2001 From: jiajingbin Date: Thu, 1 Jun 2023 17:26:03 +0800 Subject: [PATCH 27/62] set session update info --- source/libs/executor/src/timewindowoperator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index 2cdf9bb15c..2eb8d297ac 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -2904,7 +2904,7 @@ void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uin SStreamScanInfo* pScanInfo = downstream->info; pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type}; pScanInfo->pState = pAggSup->pState; - if ((!pScanInfo->igCheckUpdate || type == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) && !pScanInfo->pUpdateInfo) { + if (!pScanInfo->pUpdateInfo) { pScanInfo->pUpdateInfo = pAggSup->stateStore.updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, pTwSup->waterMark); } pScanInfo->twAggSup = *pTwSup; From 56782a5d41eca1b85bf66ec1c48362188c351c43 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 1 Jun 2023 18:29:16 +0800 Subject: [PATCH 28/62] fix:open task case & modify mqRebVgReq encode/decode style --- include/common/tmsg.h | 60 +++++++++++++--------- source/dnode/mnode/impl/src/mndSubscribe.c | 19 +++++-- source/dnode/vnode/src/tq/tq.c | 19 ++++--- tests/parallel_test/cases.task | 2 +- 4 files changed, 65 insertions(+), 35 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index b4674aba54..d78e771fcf 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -2807,39 +2807,49 @@ typedef struct { int64_t suid; } SMqRebVgReq; -static FORCE_INLINE int32_t tEncodeSMqRebVgReq(void** buf, const SMqRebVgReq* pReq) { - int32_t tlen = 0; - tlen += taosEncodeFixedI64(buf, pReq->leftForVer); - tlen += taosEncodeFixedI32(buf, pReq->vgId); - tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId); - tlen += taosEncodeFixedI64(buf, pReq->newConsumerId); - tlen += taosEncodeString(buf, pReq->subKey); - tlen += taosEncodeFixedI8(buf, pReq->subType); - tlen += taosEncodeFixedI8(buf, pReq->withMeta); +static FORCE_INLINE int tEncodeSMqRebVgReq(SEncoder *pCoder, const SMqRebVgReq* pReq) { + if (tStartEncode(pCoder) < 0) return -1; + if (tEncodeI64(pCoder, pReq->leftForVer) < 0) return -1; + if (tEncodeI32(pCoder, pReq->vgId) < 0) return -1; + if (tEncodeI64(pCoder, pReq->oldConsumerId) < 0) return -1; + if (tEncodeI64(pCoder, pReq->newConsumerId) < 0) return -1; + if (tEncodeCStr(pCoder, pReq->subKey) < 0) return -1; + if (tEncodeI8(pCoder, pReq->subType) < 0) return -1; + if (tEncodeI8(pCoder, pReq->withMeta) < 0) return -1; + if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) { - tlen += taosEncodeString(buf, pReq->qmsg); + if (tEncodeCStr(pCoder, pReq->qmsg) < 0) return -1; } else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) { - tlen += taosEncodeFixedI64(buf, pReq->suid); - tlen += taosEncodeString(buf, pReq->qmsg); + if (tEncodeI64(pCoder, pReq->suid) < 0) return -1; + if (tEncodeCStr(pCoder, pReq->qmsg) < 0) return -1; } - return tlen; + tEndEncode(pCoder); + return 0; } -static FORCE_INLINE void* tDecodeSMqRebVgReq(const void* buf, SMqRebVgReq* pReq) { - buf = taosDecodeFixedI64(buf, &pReq->leftForVer); - buf = taosDecodeFixedI32(buf, &pReq->vgId); - buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId); - buf = taosDecodeFixedI64(buf, &pReq->newConsumerId); - buf = taosDecodeStringTo(buf, pReq->subKey); - buf = taosDecodeFixedI8(buf, &pReq->subType); - buf = taosDecodeFixedI8(buf, &pReq->withMeta); +static FORCE_INLINE int tDecodeSMqRebVgReq(SDecoder *pCoder, SMqRebVgReq* pReq) { + if (tStartDecode(pCoder) < 0) return -1; + + if (tDecodeI64(pCoder, &pReq->leftForVer) < 0) return -1; + + if (tDecodeI32(pCoder, &pReq->vgId) < 0) return -1; + if (tDecodeI64(pCoder, &pReq->oldConsumerId) < 0) return -1; + if (tDecodeI64(pCoder, &pReq->newConsumerId) < 0) return -1; + if (tDecodeCStrTo(pCoder, pReq->subKey) < 0) return -1; + if (tDecodeI8(pCoder, &pReq->subType) < 0) return -1; + if (tDecodeI8(pCoder, &pReq->withMeta) < 0) return -1; + if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) { - buf = taosDecodeString(buf, &pReq->qmsg); + if (tDecodeCStr(pCoder, &pReq->qmsg) < 0) return -1; } else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) { - buf = taosDecodeFixedI64(buf, &pReq->suid); - buf = taosDecodeString(buf, &pReq->qmsg); + if (tDecodeI64(pCoder, &pReq->suid) < 0) return -1; + if (!tDecodeIsEnd(pCoder)){ + if (tDecodeCStr(pCoder, &pReq->qmsg) < 0) return -1; + } } - return (void*)buf; + + tEndDecode(pCoder); + return 0; } typedef struct { diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index e62102fa77..74421afa33 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -111,7 +111,14 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscri req.suid = pSub->stbUid; tstrncpy(req.subKey, pSub->key, TSDB_SUBSCRIBE_KEY_LEN); - int32_t tlen = sizeof(SMsgHead) + tEncodeSMqRebVgReq(NULL, &req); + int32_t tlen = 0; + int32_t ret = 0; + tEncodeSize(tEncodeSMqRebVgReq, &req, tlen, ret); + if (ret < 0) { + return -1; + } + + tlen += sizeof(SMsgHead); void *buf = taosMemoryMalloc(tlen); if (buf == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -123,8 +130,14 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscri pMsgHead->contLen = htonl(tlen); pMsgHead->vgId = htonl(pRebVg->pVgEp->vgId); - void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead)); - tEncodeSMqRebVgReq(&abuf, &req); + SEncoder encoder = {0}; + tEncoderInit(&encoder, POINTER_SHIFT(buf, sizeof(SMsgHead)), tlen); + if (tEncodeSMqRebVgReq(&encoder, &req) < 0) { + taosMemoryFreeClear(buf); + tEncoderClear(&encoder); + return -1; + } + tEncoderClear(&encoder); *pBuf = buf; *pLen = tlen; diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 11760b5fd0..35055a00e3 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -633,7 +633,16 @@ int32_t tqProcessDelCheckInfoReq(STQ* pTq, int64_t sversion, char* msg, int32_t int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) { int ret = 0; SMqRebVgReq req = {0}; - tDecodeSMqRebVgReq(msg, &req); + SDecoder dc = {0}; + + tDecoderInit(&dc, msg, msgLen); + + // decode req + if (tDecodeSMqRebVgReq(&dc, &req) < 0) { + terrno = TSDB_CODE_INVALID_MSG; + tDecoderClear(&dc); + return -1; + } SVnode* pVnode = pTq->pVnode; int32_t vgId = TD_VID(pVnode); @@ -680,8 +689,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg pHandle->snapshotVer = ver; if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) { - pHandle->execHandle.execCol.qmsg = req.qmsg; - req.qmsg = NULL; + pHandle->execHandle.execCol.qmsg = taosStrdup(req.qmsg);; pHandle->execHandle.task = qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, vgId, &pHandle->execHandle.numOfCols, req.newConsumerId); @@ -701,8 +709,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg } else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) { pHandle->pWalReader = walOpenReader(pVnode->pWal, NULL); pHandle->execHandle.execTb.suid = req.suid; - pHandle->execHandle.execTb.qmsg = req.qmsg; - req.qmsg = NULL; + pHandle->execHandle.execTb.qmsg = taosStrdup(req.qmsg); if(strcmp(pHandle->execHandle.execTb.qmsg, "") != 0) { if (nodesStringToNode(pHandle->execHandle.execTb.qmsg, &pHandle->execHandle.execTb.node) != 0) { @@ -766,7 +773,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg end: taosWUnLockLatch(&pTq->lock); - taosMemoryFree(req.qmsg); + tDecoderClear(&dc); return ret; } diff --git a/tests/parallel_test/cases.task b/tests/parallel_test/cases.task index 6a9a2b609a..0b235d0dc8 100644 --- a/tests/parallel_test/cases.task +++ b/tests/parallel_test/cases.task @@ -564,7 +564,7 @@ ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/user_privilege.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/fsync.py ,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/multilevel.py -#,,n,system-test,python3 ./test.py -f 0-others/compatibility.py +,,n,system-test,python3 ./test.py -f 0-others/compatibility.py ,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py ,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py ,,n,system-test,python3 ./test.py -N 3 -f 0-others/walRetention.py From 0315e895918de6cad123a1e136c45dbbbbe38402 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 1 Jun 2023 11:13:01 +0000 Subject: [PATCH 29/62] Avoid creating the same ID task multiple times --- source/libs/stream/src/streamBackendRocksdb.c | 2 +- source/libs/stream/src/streamMeta.c | 48 ++++++++++--------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index eabec058d7..bd72566e5a 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -719,7 +719,7 @@ int32_t streamStateOpenBackendCf(void* backend, char* name, char** cfs, int32_t qDebug("succ to open rocksdb cf"); } // close default cf - rocksdb_column_family_handle_destroy(cfHandle[0]); + if (((rocksdb_column_family_handle_t**)cfHandle)[0] != 0) rocksdb_column_family_handle_destroy(cfHandle[0]); rocksdb_options_destroy(cfOpts[0]); handle->db = db; diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c index 98e63f7f51..e3f8b12367 100644 --- a/source/libs/stream/src/streamMeta.c +++ b/source/libs/stream/src/streamMeta.c @@ -205,24 +205,25 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) { // add to the ready tasks hash map, not the restored tasks hash map int32_t streamMetaAddDeployedTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask) { - if (pMeta->expandFunc(pMeta->ahandle, pTask, ver) < 0) { - tFreeStreamTask(pTask); - return -1; - } - - if (streamMetaSaveTask(pMeta, pTask) < 0) { - tFreeStreamTask(pTask); - return -1; - } - - if (streamMetaCommit(pMeta) < 0) { - tFreeStreamTask(pTask); - return -1; - } - void* p = taosHashGet(pMeta->pTasks, &pTask->id.taskId, sizeof(pTask->id.taskId)); if (p == NULL) { + if (pMeta->expandFunc(pMeta->ahandle, pTask, ver) < 0) { + tFreeStreamTask(pTask); + return -1; + } + + if (streamMetaSaveTask(pMeta, pTask) < 0) { + tFreeStreamTask(pTask); + return -1; + } + + if (streamMetaCommit(pMeta) < 0) { + tFreeStreamTask(pTask); + return -1; + } taosArrayPush(pMeta->pTaskList, &pTask->id.taskId); + } else { + return 0; } taosHashPut(pMeta->pTasks, &pTask->id.taskId, sizeof(pTask->id.taskId), &pTask, POINTER_BYTES); @@ -359,18 +360,19 @@ int32_t streamLoadTasks(SStreamMeta* pMeta, int64_t ver) { tDecodeStreamTask(&decoder, pTask); tDecoderClear(&decoder); - if (pMeta->expandFunc(pMeta->ahandle, pTask, pTask->chkInfo.version) < 0) { - tdbFree(pKey); - tdbFree(pVal); - tdbTbcClose(pCur); - return -1; - } - + // remove duplicate void* p = taosHashGet(pMeta->pTasks, &pTask->id.taskId, sizeof(pTask->id.taskId)); if (p == NULL) { + if (pMeta->expandFunc(pMeta->ahandle, pTask, pTask->chkInfo.version) < 0) { + tdbFree(pKey); + tdbFree(pVal); + tdbTbcClose(pCur); + return -1; + } taosArrayPush(pMeta->pTaskList, &pTask->id.taskId); + } else { + continue; } - if (taosHashPut(pMeta->pTasks, &pTask->id.taskId, sizeof(pTask->id.taskId), &pTask, sizeof(void*)) < 0) { tdbFree(pKey); tdbFree(pVal); From 32c3cfd51a767baea59c756e4302c5410f36ad03 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 1 Jun 2023 11:13:27 +0000 Subject: [PATCH 30/62] Avoid creating the same ID task multiple times --- include/libs/stream/tstream.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h index 1d4bbf073e..8316e6ef50 100644 --- a/include/libs/stream/tstream.h +++ b/include/libs/stream/tstream.h @@ -206,7 +206,7 @@ static FORCE_INLINE void streamQueueProcessFail(SStreamQueue* queue) { void* streamQueueNextItem(SStreamQueue* queue); SStreamDataSubmit* streamDataSubmitNew(SPackedData* pData, int32_t type); -void streamDataSubmitDestroy(SStreamDataSubmit* pDataSubmit); +void streamDataSubmitDestroy(SStreamDataSubmit* pDataSubmit); SStreamDataSubmit* streamSubmitBlockClone(SStreamDataSubmit* pSubmit); @@ -284,7 +284,7 @@ struct SStreamTask { int16_t dispatchMsgType; SStreamStatus status; int32_t selfChildId; - int32_t nodeId; // vgroup id + int32_t nodeId; // vgroup id SEpSet epSet; SCheckpointInfo chkInfo; STaskExec exec; @@ -346,12 +346,14 @@ typedef struct SStreamMeta { void* streamBackend; int32_t streamBackendId; int64_t streamBackendRid; + SHashObj* pTaskBackendUnique; } SStreamMeta; int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo); int32_t tDecodeStreamEpInfo(SDecoder* pDecoder, SStreamChildEpInfo* pInfo); -SStreamTask* tNewStreamTask(int64_t streamId, int8_t taskLevel, int8_t fillHistory, int64_t triggerParam, SArray* pTaskList); +SStreamTask* tNewStreamTask(int64_t streamId, int8_t taskLevel, int8_t fillHistory, int64_t triggerParam, + SArray* pTaskList); int32_t tEncodeStreamTask(SEncoder* pEncoder, const SStreamTask* pTask); int32_t tDecodeStreamTask(SDecoder* pDecoder, SStreamTask* pTask); void tFreeStreamTask(SStreamTask* pTask); From 1571ea844af5bdc52407326b37d081b1c9d55d24 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 1 Jun 2023 11:25:55 +0000 Subject: [PATCH 31/62] Avoid creating the same ID task multiple times --- source/libs/stream/src/streamMeta.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c index e3f8b12367..8c26052fdb 100644 --- a/source/libs/stream/src/streamMeta.c +++ b/source/libs/stream/src/streamMeta.c @@ -367,16 +367,22 @@ int32_t streamLoadTasks(SStreamMeta* pMeta, int64_t ver) { tdbFree(pKey); tdbFree(pVal); tdbTbcClose(pCur); + taosMemoryFree(pTask); return -1; } taosArrayPush(pMeta->pTaskList, &pTask->id.taskId); } else { + tdbFree(pKey); + tdbFree(pVal); + tdbTbcClose(pCur); + taosMemoryFree(pTask); continue; } if (taosHashPut(pMeta->pTasks, &pTask->id.taskId, sizeof(pTask->id.taskId), &pTask, sizeof(void*)) < 0) { tdbFree(pKey); tdbFree(pVal); tdbTbcClose(pCur); + taosMemoryFree(pTask); return -1; } From 420ae73728044b13fa51743adebfba303240e480 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 00:35:45 +0000 Subject: [PATCH 32/62] Avoid creating the same ID task multiple times --- source/libs/stream/src/streamBackendRocksdb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index bd72566e5a..c743ecf7f7 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -128,7 +128,9 @@ void* streamBackendInit(const char* path) { */ streamStateOpenBackendCf(pHandle, (char*)path, cfs, nCf); } - rocksdb_list_column_families_destroy(cfs, nCf); + if (cfs != NULL) { + rocksdb_list_column_families_destroy(cfs, nCf); + } return (void*)pHandle; _EXIT: From 274771d7b4cb5329ba1267633e99d527b5a42846 Mon Sep 17 00:00:00 2001 From: liuyao <54liuyao@163.com> Date: Fri, 2 Jun 2023 08:59:00 +0800 Subject: [PATCH 33/62] TD-24565 --- source/libs/executor/src/scanoperator.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 28abee4342..39907be6d2 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1072,6 +1072,7 @@ static void setGroupId(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t grou void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin, uint64_t ver) { pTableScanInfo->base.cond.twindows = *pWin; + pTableScanInfo->base.cond.startVersion = 0; pTableScanInfo->base.cond.endVersion = ver; pTableScanInfo->scanTimes = 0; pTableScanInfo->currentGroupId = -1; @@ -1194,6 +1195,7 @@ static bool prepareRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_ } STableScanInfo* pTScanInfo = pInfo->pTableScanOp->info; + qDebug("prepare range scan start:%" PRId64 ",end:%" PRId64 ",maxVer:%" PRIu64, win.skey, win.ekey, pInfo->pUpdateInfo->maxDataVersion); resetTableScanInfo(pInfo->pTableScanOp->info, &win, pInfo->pUpdateInfo->maxDataVersion); pInfo->pTableScanOp->status = OP_OPENED; return true; @@ -1889,6 +1891,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { TSKEY maxTs = pAPI->stateStore.updateInfoFillBlockData(pInfo->pUpdateInfo, pInfo->pRecoverRes, pInfo->primaryTsIndex); pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs); } else { + pInfo->pUpdateInfo->maxDataVersion = pTaskInfo->streamInfo.fillHistoryVer2; doCheckUpdate(pInfo, pInfo->pRecoverRes->info.window.ekey, pInfo->pRecoverRes); } } From becc5c51a40c1d1e9f14b65f54eef9e3f939f33a Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 02:35:15 +0000 Subject: [PATCH 34/62] fix compatibility --- source/libs/stream/src/streamBackendRocksdb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index c8a6597bad..c54f055e6a 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -1924,17 +1924,17 @@ int32_t streamStateGetParName_rocksdb(SStreamState* pState, int64_t groupId, voi int32_t streamDefaultPut_rocksdb(SStreamState* pState, const void* key, void* pVal, int32_t pVLen) { int code = 0; - STREAM_STATE_PUT_ROCKSDB(pState, "default", &key, pVal, pVLen); + STREAM_STATE_PUT_ROCKSDB(pState, "default", key, pVal, pVLen); return code; } int32_t streamDefaultGet_rocksdb(SStreamState* pState, const void* key, void** pVal, int32_t* pVLen) { int code = 0; - STREAM_STATE_GET_ROCKSDB(pState, "default", &key, pVal, pVLen); + STREAM_STATE_GET_ROCKSDB(pState, "default", key, pVal, pVLen); return code; } int32_t streamDefaultDel_rocksdb(SStreamState* pState, const void* key) { int code = 0; - STREAM_STATE_DEL_ROCKSDB(pState, "default", &key); + STREAM_STATE_DEL_ROCKSDB(pState, "default", key); return code; } From 27f791ac7fc071bc7899d0a0188137686529eaf0 Mon Sep 17 00:00:00 2001 From: liuyao <54liuyao@163.com> Date: Fri, 2 Jun 2023 11:04:02 +0800 Subject: [PATCH 35/62] reset ud table name --- source/dnode/vnode/src/tq/tqSink.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c index 6e02d5e21b..db1b5ed902 100644 --- a/source/dnode/vnode/src/tq/tqSink.c +++ b/source/dnode/vnode/src/tq/tqSink.c @@ -294,6 +294,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d char* ctbName = pDataBlock->info.parTbName; if (!ctbName[0]) { + memset(ctbName, 0, TSDB_TABLE_NAME_LEN); if (res == TSDB_CODE_SUCCESS) { memcpy(ctbName, pTableSinkInfo->tbName, strlen(pTableSinkInfo->tbName)); } else { From 5c64a730a9668f2768a13c9255f4a73e6b087046 Mon Sep 17 00:00:00 2001 From: xleili Date: Fri, 2 Jun 2023 11:17:38 +0800 Subject: [PATCH 36/62] enchance: change goes as static link --- cmake/cmake.options | 2 +- cmake/cmake.platform | 10 ---------- packaging/tools/makepkg.sh | 3 +++ 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/cmake/cmake.options b/cmake/cmake.options index b00ae14715..555b72cbdf 100644 --- a/cmake/cmake.options +++ b/cmake/cmake.options @@ -80,7 +80,7 @@ ENDIF () option( BUILD_GEOS "If build geos on Windows" - OFF + ON ) option( diff --git a/cmake/cmake.platform b/cmake/cmake.platform index f9faf7316c..ba747c6134 100644 --- a/cmake/cmake.platform +++ b/cmake/cmake.platform @@ -56,17 +56,7 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin SET(TD_DARWIN TRUE) SET(OSTYPE "macOS") - execute_process(COMMAND geos-config --cflags OUTPUT_VARIABLE GEOS_CFLAGS) - execute_process(COMMAND geos-config --ldflags OUTPUT_VARIABLE GEOS_LDFLAGS) - string(SUBSTRING ${GEOS_CFLAGS} 2 -1 GEOS_CFLAGS) - string(REGEX REPLACE "\n" "" GEOS_CFLAGS ${GEOS_CFLAGS}) - string(SUBSTRING ${GEOS_LDFLAGS} 2 -1 GEOS_LDFLAGS) - string(REGEX REPLACE "\n" "" GEOS_LDFLAGS ${GEOS_LDFLAGS}) - MESSAGE("GEOS_CFLAGS "${GEOS_CFLAGS}) - MESSAGE("GEOS_LDFLAGS "${GEOS_LDFLAGS}) ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare") - INCLUDE_DIRECTORIES(${GEOS_CFLAGS}) - LINK_DIRECTORIES(${GEOS_LDFLAGS}) IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") MESSAGE("Current system arch is arm64") diff --git a/packaging/tools/makepkg.sh b/packaging/tools/makepkg.sh index 2f1e803689..7cfd9aa664 100755 --- a/packaging/tools/makepkg.sh +++ b/packaging/tools/makepkg.sh @@ -112,9 +112,11 @@ fi if [ "$osType" == "Darwin" ]; then lib_files="${build_dir}/lib/libtaos.${version}.dylib" wslib_files="${build_dir}/lib/libtaosws.dylib" + rocksdb_lib_files="${build_dir}/lib/librocksdb.dylib.8.1.1" else lib_files="${build_dir}/lib/libtaos.so.${version}" wslib_files="${build_dir}/lib/libtaosws.so" + rocksdb_lib_files="${build_dir}/lib/librocksdb.so.8.1.1" fi header_files="${code_dir}/include/client/taos.h ${code_dir}/include/common/taosdef.h ${code_dir}/include/util/taoserror.h ${code_dir}/include/libs/function/taosudf.h" @@ -337,6 +339,7 @@ fi # Copy driver mkdir -p ${install_dir}/driver && cp ${lib_files} ${install_dir}/driver && echo "${versionComp}" >${install_dir}/driver/vercomp.txt [ -f ${wslib_files} ] && cp ${wslib_files} ${install_dir}/driver || : +[ -f ${rocksdb_lib_files} ] && cp ${rocksdb_lib_files} ${install_dir}/driver || : # Copy connector if [ "$verMode" == "cluster" ]; then From 27b7d1ec8818672d93e6e0d5c47c084b0b140ae1 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 11:17:44 +0800 Subject: [PATCH 37/62] refactor: do some internal refactor. --- source/dnode/vnode/src/tq/tq.c | 2 +- source/libs/executor/src/scanoperator.c | 4 ++-- source/libs/stream/src/stream.c | 10 +++++----- source/libs/stream/src/streamDispatch.c | 6 +++--- source/libs/stream/src/streamExec.c | 12 ++++++------ 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 8cc791d1a6..5e7e21e7bd 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -1086,7 +1086,7 @@ int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t sversion, char* msg, int32_t return -1; } - qDebug("s-task:%s set the start wal offset to be:%"PRId64, pTask->id.idStr, sversion); + qDebug("s-task:%s set start wal scan start ver:%"PRId64, pTask->id.idStr, sversion); walReaderSeekVer(pTask->exec.pWalReader, sversion); pTask->chkInfo.currentVer = sversion; diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 88f5642ef9..80a7505c77 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2005,7 +2005,7 @@ FETCH_NEXT_BLOCK: // printDataBlock(pBlock, "stream scan recv"); return pBlock; } else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) { - qDebug("scan mode %d", pInfo->scanMode); + qDebug("stream scan mode:%d, %s", pInfo->scanMode, id); switch (pInfo->scanMode) { case STREAM_SCAN_FROM_RES: { pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; @@ -2122,7 +2122,7 @@ FETCH_NEXT_BLOCK: pInfo->numOfExec++; pOperator->resultInfo.totalRows += pBlockInfo->rows; - qDebug("stream scan get source rows:%" PRId64", %s", pBlockInfo->rows, id); + qDebug("stream scan completed, and return source rows:%" PRId64", %s", pBlockInfo->rows, id); if (pBlockInfo->rows > 0) { return pBlock; } diff --git a/source/libs/stream/src/stream.c b/source/libs/stream/src/stream.c index acc69c5a2b..7457b2197e 100644 --- a/source/libs/stream/src/stream.c +++ b/source/libs/stream/src/stream.c @@ -296,11 +296,8 @@ int32_t tAppendDataToInputQueue(SStreamTask* pTask, SStreamQueueItem* pItem) { if (type == STREAM_INPUT__DATA_SUBMIT) { SStreamDataSubmit* px = (SStreamDataSubmit*)pItem; - qDebug("s-task:%s submit enqueue msgLen:%d ver:%" PRId64 ", total in queue:%d, size:%.2fMiB", pTask->id.idStr, - px->submit.msgLen, px->submit.ver, total, size); - if ((pTask->taskLevel == TASK_LEVEL__SOURCE) && tInputQueueIsFull(pTask)) { - qError("s-task:%s input queue is full, capacity(size:%d num:%dMiB), current(blocks:%d, size:%.2fMiB) abort", + qError("s-task:%s input queue is full, capacity(size:%d num:%dMiB), current(blocks:%d, size:%.2fMiB) stop to push data", pTask->id.idStr, STREAM_TASK_INPUT_QUEUEU_CAPACITY, STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE, total, size); streamDataSubmitDestroy(px); @@ -314,9 +311,12 @@ int32_t tAppendDataToInputQueue(SStreamTask* pTask, SStreamQueueItem* pItem) { taosFreeQitem(pItem); return code; } + + qDebug("s-task:%s submit enqueue msgLen:%d ver:%" PRId64 ", total in queue:%d, size:%.2fMiB", pTask->id.idStr, + px->submit.msgLen, px->submit.ver, total, size + px->submit.msgLen/1048576.0); } else if (type == STREAM_INPUT__DATA_BLOCK || type == STREAM_INPUT__DATA_RETRIEVE || type == STREAM_INPUT__REF_DATA_BLOCK) { - if (/*(pTask->taskLevel == TASK_LEVEL__SOURCE) && */(tInputQueueIsFull(pTask))) { + if ((pTask->taskLevel == TASK_LEVEL__SOURCE) && (tInputQueueIsFull(pTask))) { qError("s-task:%s input queue is full, capacity:%d size:%d MiB, current(blocks:%d, size:%.2fMiB) abort", pTask->id.idStr, STREAM_TASK_INPUT_QUEUEU_CAPACITY, STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE, total, size); diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index 1e939cb071..bd6a013de2 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -283,7 +283,7 @@ int32_t streamDispatchOneRecoverFinishReq(SStreamTask* pTask, const SStreamRecov msg.info.noResp = 1; tmsgSendReq(pEpSet, &msg); - qDebug("s-task:%s dispatch recover finish msg to taskId:%d node %d: recover finish msg", pTask->id.idStr, + qDebug("s-task:%s dispatch recover finish msg to downstream taskId:0x%x node %d: recover finish msg", pTask->id.idStr, pReq->taskId, vgId); return 0; @@ -414,7 +414,7 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat req.taskId = downstreamTaskId; - qDebug("s-task:%s (child taskId:%d) fix-dispatch blocks:%d to down stream s-task:%d in vgId:%d", pTask->id.idStr, + qDebug("s-task:%s (child taskId:%d) fix-dispatch %d block(s) to down stream s-task:0x%x in vgId:%d", pTask->id.idStr, pTask->selfChildId, numOfBlocks, downstreamTaskId, vgId); code = doSendDispatchMsg(pTask, &req, vgId, pEpSet); @@ -514,7 +514,7 @@ int32_t streamDispatchStreamBlock(SStreamTask* pTask) { return 0; } - qDebug("s-task:%s start to dispatch msg, output status:%d", pTask->id.idStr, pTask->outputStatus); + qDebug("s-task:%s start to dispatch msg, set output status:%d", pTask->id.idStr, pTask->outputStatus); SStreamDataBlock* pDispatchedBlock = streamQueueNextItem(pTask->outputQueue); if (pDispatchedBlock == NULL) { diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index c3dd848bc7..813bc50b87 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -236,11 +236,11 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) { taosFreeQitem(qRes); return code; } - - if (pTask->outputType == TASK_OUTPUT__FIXED_DISPATCH || pTask->outputType == TASK_OUTPUT__SHUFFLE_DISPATCH) { - qDebug("s-task:%s scan exec dispatch blocks:%d", pTask->id.idStr, batchCnt); - streamDispatchStreamBlock(pTask); - } +// +// if (pTask->outputType == TASK_OUTPUT__FIXED_DISPATCH || pTask->outputType == TASK_OUTPUT__SHUFFLE_DISPATCH) { +// qDebug("s-task:%s scan exec dispatch blocks:%d", pTask->id.idStr, batchCnt); +// streamDispatchStreamBlock(pTask); +// } if (finished) { break; @@ -438,7 +438,7 @@ int32_t streamExecForAll(SStreamTask* pTask) { SArray* pBlockList = pMerged->submits; int32_t numOfBlocks = taosArrayGetSize(pBlockList); - qDebug("s-task:%s %p set submit input (merged), batch num:%d", id, pTask, numOfBlocks); + qDebug("s-task:%s %p set (merged) submit blocks as a batch, numOfBlocks:%d", id, pTask, numOfBlocks); qSetMultiStreamInput(pExecutor, pBlockList->pData, numOfBlocks, STREAM_INPUT__MERGED_SUBMIT); } else if (pItem->type == STREAM_INPUT__REF_DATA_BLOCK) { const SStreamRefDataBlock* pRefBlock = (const SStreamRefDataBlock*)pInput; From 63d9a5dcf37220262e11db2c3a96c2626fa798d7 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 04:08:08 +0000 Subject: [PATCH 38/62] avoid mem leak --- source/libs/stream/src/tstreamFileState.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/libs/stream/src/tstreamFileState.c b/source/libs/stream/src/tstreamFileState.c index f531f65565..54832b042a 100644 --- a/source/libs/stream/src/tstreamFileState.c +++ b/source/libs/stream/src/tstreamFileState.c @@ -16,12 +16,12 @@ #include "tstreamFileState.h" #include "query.h" +#include "storageapi.h" #include "streamBackendRocksdb.h" #include "taos.h" #include "tcommon.h" #include "thash.h" #include "tsimplehash.h" -#include "storageapi.h" #define FLUSH_RATIO 0.5 #define FLUSH_NUM 4 @@ -420,6 +420,7 @@ int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) { return TSDB_CODE_FAILED; } sscanf(val, "%" PRId64 "", &maxCheckPointId); + taosMemoryFree(val); } for (int64_t i = maxCheckPointId; i > 0; i--) { char buf[128] = {0}; @@ -435,9 +436,11 @@ int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) { if (ts < mark) { // statekey winkey.ts < mark forceRemoveCheckpoint(pFileState, i); + taosMemoryFreeClear(val); break; } else { } + taosMemoryFree(val); } return code; } From f1bd829977b43a0bbb12b4f9acdfb13d57f4a87d Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 13:10:54 +0800 Subject: [PATCH 39/62] refactor: do some internal refactor. --- source/dnode/vnode/inc/vnode.h | 2 +- source/dnode/vnode/src/tq/tq.c | 3 ++- source/dnode/vnode/src/tq/tqMeta.c | 3 ++- source/dnode/vnode/src/tq/tqRead.c | 19 +++++++++++-------- source/libs/executor/src/executor.c | 2 +- source/libs/executor/src/scanoperator.c | 5 +++-- source/libs/stream/src/streamDispatch.c | 2 +- source/libs/stream/src/streamExec.c | 4 ++-- 8 files changed, 23 insertions(+), 17 deletions(-) diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h index fbe2f4809c..8003419ec9 100644 --- a/source/dnode/vnode/inc/vnode.h +++ b/source/dnode/vnode/inc/vnode.h @@ -200,7 +200,7 @@ STqReader *tqReaderOpen(SVnode *pVnode); void tqReaderClose(STqReader *); void tqReaderSetColIdList(STqReader *pReader, SArray *pColIdList); -int32_t tqReaderSetTbUidList(STqReader *pReader, const SArray *tbUidList); +int32_t tqReaderSetTbUidList(STqReader *pReader, const SArray *tbUidList, const char* id); int32_t tqReaderAddTbUidList(STqReader *pReader, const SArray *pTableUidList); int32_t tqReaderRemoveTbUidList(STqReader *pReader, const SArray *tbUidList); diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c index 5e7e21e7bd..a6bed26884 100644 --- a/source/dnode/vnode/src/tq/tq.c +++ b/source/dnode/vnode/src/tq/tq.c @@ -708,8 +708,9 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i); tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid); } + pHandle->execHandle.pTqReader = tqReaderOpen(pVnode); - tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList); + tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList, NULL); taosArrayDestroy(tbUidList); buildSnapContext(handle.vnode, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta, diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c index be5b5706e2..a720e556e6 100644 --- a/source/dnode/vnode/src/tq/tqMeta.c +++ b/source/dnode/vnode/src/tq/tqMeta.c @@ -344,8 +344,9 @@ int32_t tqMetaRestoreHandle(STQ* pTq) { int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i); tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid); } + handle.execHandle.pTqReader = tqReaderOpen(pTq->pVnode); - tqReaderSetTbUidList(handle.execHandle.pTqReader, tbUidList); + tqReaderSetTbUidList(handle.execHandle.pTqReader, tbUidList, NULL); taosArrayDestroy(tbUidList); buildSnapContext(reader.vnode, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType, diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c index dbb7d564f8..f15a9898b5 100644 --- a/source/dnode/vnode/src/tq/tqRead.c +++ b/source/dnode/vnode/src/tq/tqRead.c @@ -394,8 +394,8 @@ bool tqNextBlockInWal(STqReader* pReader, const char* id) { SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk); if (pReader->tbIdHash == NULL) { - SSDataBlock* pRes = NULL; - int32_t code = tqRetrieveDataBlock(pReader, &pRes, NULL); + SSDataBlock* pRes = NULL; + int32_t code = tqRetrieveDataBlock(pReader, &pRes, NULL); if (code == TSDB_CODE_SUCCESS && pRes->info.rows > 0) { return true; } @@ -457,7 +457,7 @@ bool tqNextBlockImpl(STqReader* pReader, const char* idstr) { int32_t numOfBlocks = taosArrayGetSize(pReader->submit.aSubmitTbData); while (pReader->nextBlk < numOfBlocks) { - tqDebug("tq reader next data block, len:%d ver:%" PRId64 " index:%d/%d, %s", pReader->msg.msgLen, pReader->msg.ver, + tqDebug("try next data block, len:%d ver:%" PRId64 " index:%d/%d, %s", pReader->msg.msgLen, pReader->msg.ver, pReader->nextBlk, numOfBlocks, idstr); SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk); @@ -467,10 +467,11 @@ bool tqNextBlockImpl(STqReader* pReader, const char* idstr) { void* ret = taosHashGet(pReader->tbIdHash, &pSubmitTbData->uid, sizeof(int64_t)); if (ret != NULL) { - tqDebug("tq reader block found, ver:%" PRId64 ", uid:%" PRId64, pReader->msg.ver, pSubmitTbData->uid); + tqDebug("block found, ver:%" PRId64 ", uid:%" PRId64", %s", pReader->msg.ver, pSubmitTbData->uid, idstr); return true; } else { - tqDebug("tq reader discard submit block, uid:%" PRId64 ", continue", pSubmitTbData->uid); + tqDebug("discard submit block, uid:%" PRId64 ", total queried tables:%d continue %s", pSubmitTbData->uid, + taosHashGetSize(pReader->tbIdHash), idstr); } pReader->nextBlk++; @@ -604,7 +605,6 @@ static int32_t doSetVal(SColumnInfoData* pColumnInfoData, int32_t rowIndex, SCol int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* id) { tqDebug("tq reader retrieve data block %p, index:%d", pReader->msg.msgStr, pReader->nextBlk); - SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk++); SSDataBlock* pBlock = pReader->pResBlock; @@ -612,6 +612,7 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* blockDataCleanup(pBlock); + int32_t vgId = pReader->pWalReader->pWal->cfg.vgId; int32_t sversion = pSubmitTbData->sver; int64_t suid = pSubmitTbData->suid; int64_t uid = pSubmitTbData->uid; @@ -628,7 +629,7 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* if (pReader->pSchemaWrapper == NULL) { tqWarn("vgId:%d, cannot found schema wrapper for table: suid:%" PRId64 ", uid:%" PRId64 "version %d, possibly dropped table", - pReader->pWalReader->pWal->cfg.vgId, suid, uid, pReader->cachedSchemaVer); + vgId, suid, uid, pReader->cachedSchemaVer); pReader->cachedSchemaSuid = 0; terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND; return -1; @@ -642,6 +643,7 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* if (blockDataGetNumOfCols(pBlock) == 0) { int32_t code = buildResSDataBlock(pReader->pResBlock, pReader->pSchemaWrapper, pReader->pColIdList); if (code != TSDB_CODE_SUCCESS) { + tqError("vgId:%d failed to build data block, code:%s", vgId, tstrerror(code)); return code; } } @@ -998,7 +1000,7 @@ FAIL: void tqReaderSetColIdList(STqReader* pReader, SArray* pColIdList) { pReader->pColIdList = pColIdList; } -int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) { +int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList, const char* id) { if (pReader->tbIdHash) { taosHashClear(pReader->tbIdHash); } else { @@ -1015,6 +1017,7 @@ int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) { taosHashPut(pReader->tbIdHash, pKey, sizeof(int64_t), NULL, 0); } + tqDebug("s-task:%s %d tables are set to be queried target table", id, (int32_t) taosArrayGetSize(tbUidList)); return 0; } diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c index ed8a4f3a3b..4d02362904 100644 --- a/source/libs/executor/src/executor.c +++ b/source/libs/executor/src/executor.c @@ -401,7 +401,7 @@ int32_t qUpdateTableListForStreamScanner(qTaskInfo_t tinfo, const SArray* tableI int32_t code = 0; if (isAdd) { - qDebug("add %d tables id into query list, %s", (int32_t)taosArrayGetSize(tableIdList), id); + qDebug("try to add %d tables id into query list, %s", (int32_t)taosArrayGetSize(tableIdList), id); } // traverse to the stream scanner node to add this table id diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 80a7505c77..5f09b0c67a 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2308,7 +2308,8 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys SArray* pColIds = NULL; SStreamScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamScanInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); - SStorageAPI* pAPI = &pTaskInfo->storageAPI; + SStorageAPI* pAPI = &pTaskInfo->storageAPI; + const char* idstr = pTaskInfo->id.str; if (pInfo == NULL || pOperator == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -2419,7 +2420,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys // set the extract column id to streamHandle pAPI->tqReaderFn.tqReaderSetColIdList(pInfo->tqReader, pColIds); SArray* tableIdList = extractTableIdList(((STableScanInfo*)(pInfo->pTableScanOp->info))->base.pTableListInfo); - code = pAPI->tqReaderFn.tqReaderSetQueryTableList(pInfo->tqReader, tableIdList); + code = pAPI->tqReaderFn.tqReaderSetQueryTableList(pInfo->tqReader, tableIdList, idstr); if (code != 0) { taosArrayDestroy(tableIdList); goto _error; diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c index bd6a013de2..9501718416 100644 --- a/source/libs/stream/src/streamDispatch.c +++ b/source/libs/stream/src/streamDispatch.c @@ -318,7 +318,7 @@ int32_t doSendDispatchMsg(SStreamTask* pTask, const SStreamDispatchReq* pReq, in msg.pCont = buf; msg.msgType = pTask->dispatchMsgType; - qDebug("dispatch from s-task:%s to taskId:0x%x vgId:%d data msg", pTask->id.idStr, pReq->taskId, vgId); + qDebug("s-task:%s dispatch msg to taskId:0x%x vgId:%d data msg", pTask->id.idStr, pReq->taskId, vgId); tmsgSendReq(pEpSet, &msg); code = 0; diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index 813bc50b87..c28cd6f334 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -133,7 +133,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i taosArrayPush(pRes, &block); - qDebug("s-task:%s (child %d) executed and get block, total blocks:%d, size:%.2fMiB", pTask->id.idStr, + qDebug("s-task:%s (child %d) executed and get %d result blocks, size:%.2fMiB", pTask->id.idStr, pTask->selfChildId, numOfBlocks, size / 1048576.0); // current output should be dispatched to down stream nodes @@ -371,7 +371,7 @@ int32_t streamExecForAll(SStreamTask* pTask) { streamQueueProcessSuccess(pTask->inputQueue); if (batchSize > MAX_STREAM_EXEC_BATCH_NUM) { - qDebug("s-task:%s maximum batch limit:%d reached, processing this batch of blocks", id, + qDebug("s-task:%s batch size limit:%d reached, start to process blocks", id, MAX_STREAM_EXEC_BATCH_NUM); break; } From dca2abd8d1fccd7688f0df6bec66db368fe59ffb Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Fri, 2 Jun 2023 13:57:54 +0800 Subject: [PATCH 40/62] feat: change get taos-tools with 3.0 branch --- cmake/taostools_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index d9d2f12069..9a6a5329ae 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG 4378702 + GIT_TAG 3.0 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 3b69027325f59d03ed7893fdbb326e3392244c13 Mon Sep 17 00:00:00 2001 From: xleili Date: Fri, 2 Jun 2023 14:01:25 +0800 Subject: [PATCH 41/62] enhance: supply librocksdb.so install and uninstall --- packaging/tools/install.sh | 9 +++++++++ packaging/tools/post.sh | 6 ++++++ packaging/tools/remove.sh | 3 +++ 3 files changed, 18 insertions(+) diff --git a/packaging/tools/install.sh b/packaging/tools/install.sh index 1b47b10520..9452e48d33 100755 --- a/packaging/tools/install.sh +++ b/packaging/tools/install.sh @@ -250,18 +250,27 @@ function install_lib() { # Remove links ${csudo}rm -f ${lib_link_dir}/libtaos.* || : ${csudo}rm -f ${lib64_link_dir}/libtaos.* || : + ${csudo}rm -f ${lib_link_dir}/librocksdb.* || : + ${csudo}rm -f ${lib64_link_dir}/librocksdb.* || : #${csudo}rm -rf ${v15_java_app_dir} || : ${csudo}cp -rf ${script_dir}/driver/* ${install_main_dir}/driver && ${csudo}chmod 777 ${install_main_dir}/driver/* ${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.so.1 ${csudo}ln -sf ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so + ${csudo}ln -sf ${install_main_dir}/driver/librocksdb.* ${lib_link_dir}/librocksdb.so.8 + ${csudo}ln -sf ${lib_link_dir}/librocksdb.so.8 ${lib_link_dir}/librocksdb.so + + [ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.so ${lib_link_dir}/libtaosws.so || : if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then ${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib64_link_dir}/libtaos.so.1 || : ${csudo}ln -sf ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || : + ${csudo}ln -sf ${install_main_dir}/driver/librocksdb.* ${lib64_link_dir}/librocksdb.so.8 || : + ${csudo}ln -sf ${lib64_link_dir}/librocksdb.so.8 ${lib64_link_dir}/librocksdb.so || : + [ -f ${install_main_dir}/libtaosws.so ] && ${csudo}ln -sf ${install_main_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || : fi diff --git a/packaging/tools/post.sh b/packaging/tools/post.sh index fc392c9684..4a8dda1d30 100755 --- a/packaging/tools/post.sh +++ b/packaging/tools/post.sh @@ -202,10 +202,15 @@ function install_lib() { log_print "start install lib from ${lib_dir} to ${lib_link_dir}" ${csudo}rm -f ${lib_link_dir}/libtaos* || : ${csudo}rm -f ${lib64_link_dir}/libtaos* || : + + #rocksdb + [ -f ${lib_link_dir}/librocksdb* ] && ${csudo}rm -f ${lib_link_dir}/librocksdb* || : + [ -f ${lib64_link_dir}/librocksdb* ] && ${csudo}rm -f ${lib64_link_dir}/librocksdb* || : [ -f ${lib_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.${lib_file_ext} || : [ -f ${lib64_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.${lib_file_ext} || : + ${csudo}ln -s ${lib_dir}/librocksdb.* ${lib_link_dir}/librocksdb.${lib_file_ext_1} 2>>${install_log_path} || return 1 ${csudo}ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.${lib_file_ext_1} 2>>${install_log_path} || return 1 ${csudo}ln -s ${lib_link_dir}/libtaos.${lib_file_ext_1} ${lib_link_dir}/libtaos.${lib_file_ext} 2>>${install_log_path} || return 1 @@ -214,6 +219,7 @@ function install_lib() { if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.${lib_file_ext} ]]; then ${csudo}ln -s ${lib_dir}/libtaos.* ${lib64_link_dir}/libtaos.${lib_file_ext_1} 2>>${install_log_path} || return 1 ${csudo}ln -s ${lib64_link_dir}/libtaos.${lib_file_ext_1} ${lib64_link_dir}/libtaos.${lib_file_ext} 2>>${install_log_path} || return 1 + ${csudo}ln -s ${lib_dir}/librocksdb.* ${lib64_link_dir}/librocksdb.${lib_file_ext_1} 2>>${install_log_path} || return 1 [ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib64_link_dir}/libtaosws.${lib_file_ext} 2>>${install_log_path} fi diff --git a/packaging/tools/remove.sh b/packaging/tools/remove.sh index 6c671473bf..a17b29983c 100755 --- a/packaging/tools/remove.sh +++ b/packaging/tools/remove.sh @@ -142,11 +142,14 @@ function clean_local_bin() { function clean_lib() { # Remove link ${csudo}rm -f ${lib_link_dir}/libtaos.* || : + ${csudo}rm -f ${lib_link_dir}/librocksdb.* || : [ -f ${lib_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.* || : ${csudo}rm -f ${lib64_link_dir}/libtaos.* || : + ${csudo}rm -f ${lib64_link_dir}/librocksdb.* || : [ -f ${lib64_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.* || : #${csudo}rm -rf ${v15_java_app_dir} || : + } function clean_header() { From f59161464d7f596418b34915d3bd51368675e50c Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 06:48:26 +0000 Subject: [PATCH 42/62] avoid mem leak --- source/libs/executor/src/scanoperator.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 146552b058..6d17672513 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -13,6 +13,8 @@ * along with this program. If not, see . */ +// clang-format off + #include "executorInt.h" #include "filter.h" #include "function.h" @@ -2444,6 +2446,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys int32_t len = 0; pAPI->stateStore.streamStateGetInfo(pTaskInfo->streamInfo.pState, STREAM_SCAN_OP_NAME, strlen(STREAM_SCAN_OP_NAME), &buff, &len); streamScanOperatorDecode(buff, len, pInfo); + taosMemoryFree(buff); } setOperatorInfo(pOperator, STREAM_SCAN_OP_NAME, QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN, false, OP_NOT_OPENED, pInfo, @@ -3458,3 +3461,5 @@ static void destoryTableCountScanOperator(void* param) { taosArrayDestroy(pTableCountScanInfo->stbUidList); taosMemoryFreeClear(param); } + +// clang-format on From 76106165daf887be46463b78f49cc21a1d3c59f9 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 15:13:25 +0800 Subject: [PATCH 43/62] other: add some logs. --- source/libs/executor/src/scanoperator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index cea1e6361d..83a4f91034 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2090,7 +2090,9 @@ FETCH_NEXT_BLOCK: while (pAPI->tqReaderFn.tqNextBlockImpl(pInfo->tqReader, id)) { SSDataBlock* pRes = NULL; int32_t code = pAPI->tqReaderFn.tqRetrieveBlock(pInfo->tqReader, &pRes, id); + if (code != TSDB_CODE_SUCCESS || pRes->info.rows == 0) { + qDebug("failed to retrieve data from block, code:%s, rows:%"PRId64 " try next block in submit block", tstrerror(code), pRes->info.rows); continue; } From bcd8867fb2010892bdae2b3fa92edef8b4e60fd0 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 15:27:14 +0800 Subject: [PATCH 44/62] refactor: do some internal refactor. --- source/libs/executor/src/scanoperator.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 83a4f91034..8151c459e5 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -1897,6 +1897,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { printDataBlock(pInfo->pCreateTbRes, "recover createTbl"); return pInfo->pCreateTbRes; } + qDebug("stream recover scan get block, rows %" PRId64, pInfo->pRecoverRes->info.rows); printDataBlock(pInfo->pRecoverRes, "scan recover"); return pInfo->pRecoverRes; @@ -2089,10 +2090,13 @@ FETCH_NEXT_BLOCK: while (pAPI->tqReaderFn.tqNextBlockImpl(pInfo->tqReader, id)) { SSDataBlock* pRes = NULL; + int32_t code = pAPI->tqReaderFn.tqRetrieveBlock(pInfo->tqReader, &pRes, id); + qDebug("retrieve data from submit completed code:%s, rows:%" PRId64 " %s", + tstrerror(code), pRes->info.rows, id); if (code != TSDB_CODE_SUCCESS || pRes->info.rows == 0) { - qDebug("failed to retrieve data from block, code:%s, rows:%"PRId64 " try next block in submit block", tstrerror(code), pRes->info.rows); + qDebug("retrieve data failed, try next block in submit block, %s", id); continue; } @@ -2100,6 +2104,7 @@ FETCH_NEXT_BLOCK: if (pInfo->pCreateTbRes->info.rows > 0) { pInfo->scanMode = STREAM_SCAN_FROM_RES; + qDebug("create table res exists, rows:%"PRId64" return from stream scan, %s", pInfo->pCreateTbRes->info.rows, id); return pInfo->pCreateTbRes; } From 2edba85efe930fe324c1c008799c1a7bfa8cadef Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 15:27:44 +0800 Subject: [PATCH 45/62] refactor: do some internal refactor. --- source/libs/executor/src/scanoperator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 8151c459e5..0ed41aeea1 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2092,8 +2092,8 @@ FETCH_NEXT_BLOCK: SSDataBlock* pRes = NULL; int32_t code = pAPI->tqReaderFn.tqRetrieveBlock(pInfo->tqReader, &pRes, id); - qDebug("retrieve data from submit completed code:%s, rows:%" PRId64 " %s", - tstrerror(code), pRes->info.rows, id); + qDebug("retrieve data from submit completed code:%s, rows:%" PRId64 " %s", tstrerror(code), pRes->info.rows, + id); if (code != TSDB_CODE_SUCCESS || pRes->info.rows == 0) { qDebug("retrieve data failed, try next block in submit block, %s", id); From 822f2673990766daf5d6403ecc054ea4c73e255f Mon Sep 17 00:00:00 2001 From: xleili Date: Fri, 2 Jun 2023 15:36:36 +0800 Subject: [PATCH 46/62] enhance: install and uninstall rocksb.so in deb and rpm --- packaging/deb/DEBIAN/preinst | 1 + packaging/deb/DEBIAN/prerm | 1 + packaging/deb/makedeb.sh | 1 + packaging/rpm/tdengine.spec | 2 ++ 4 files changed, 5 insertions(+) diff --git a/packaging/deb/DEBIAN/preinst b/packaging/deb/DEBIAN/preinst index 904a946e20..d9951fc4d4 100644 --- a/packaging/deb/DEBIAN/preinst +++ b/packaging/deb/DEBIAN/preinst @@ -80,4 +80,5 @@ fi # there can not libtaos.so*, otherwise ln -s error ${csudo}rm -f ${install_main_dir}/driver/libtaos.* || : +${csudo}rm -f ${install_main_dir}/driver/librocksdb.* || : [ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}rm -f ${install_main_dir}/driver/libtaosws.so || : diff --git a/packaging/deb/DEBIAN/prerm b/packaging/deb/DEBIAN/prerm index 0d63115a04..80799ae0e5 100644 --- a/packaging/deb/DEBIAN/prerm +++ b/packaging/deb/DEBIAN/prerm @@ -40,6 +40,7 @@ else ${csudo}rm -f ${inc_link_dir}/taosudf.h || : [ -f ${inc_link_dir}/taosws.h ] && ${csudo}rm -f ${inc_link_dir}/taosws.h || : ${csudo}rm -f ${lib_link_dir}/libtaos.* || : + ${csudo}rm -f ${lib_link_dir}/librocksdb.* || : [ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || : ${csudo}rm -f ${log_link_dir} || : diff --git a/packaging/deb/makedeb.sh b/packaging/deb/makedeb.sh index 9f49cf345a..624ccb0e3b 100755 --- a/packaging/deb/makedeb.sh +++ b/packaging/deb/makedeb.sh @@ -94,6 +94,7 @@ fi cp ${compile_dir}/build/bin/taos ${pkg_dir}${install_home_path}/bin cp ${compile_dir}/build/lib/${libfile} ${pkg_dir}${install_home_path}/driver +cp ${compile_dir}/build/lib/librocksdb.8 ${pkg_dir}${install_home_path}/driver [ -f ${compile_dir}/build/lib/${wslibfile} ] && cp ${compile_dir}/build/lib/${wslibfile} ${pkg_dir}${install_home_path}/driver ||: cp ${compile_dir}/../include/client/taos.h ${pkg_dir}${install_home_path}/include cp ${compile_dir}/../include/common/taosdef.h ${pkg_dir}${install_home_path}/include diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec index 52d5335003..31d597785e 100644 --- a/packaging/rpm/tdengine.spec +++ b/packaging/rpm/tdengine.spec @@ -174,6 +174,7 @@ fi # there can not libtaos.so*, otherwise ln -s error ${csudo}rm -f %{homepath}/driver/libtaos* || : +${csudo}rm -f %{homepath}/driver/librocksdb* || : #Scripts executed after installation %post @@ -219,6 +220,7 @@ if [ $1 -eq 0 ];then ${csudo}rm -f ${inc_link_dir}/taoserror.h || : ${csudo}rm -f ${inc_link_dir}/taosudf.h || : ${csudo}rm -f ${lib_link_dir}/libtaos.* || : + ${csudo}rm -f ${lib_link_dir}/librocksdb.* || : ${csudo}rm -f ${log_link_dir} || : ${csudo}rm -f ${data_link_dir} || : From 3d7defa881d8f8a146ffa6cba663d2ffe9a3677f Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 15:43:38 +0800 Subject: [PATCH 47/62] refactor: do some internal refactor. --- source/libs/executor/src/scanoperator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 0ed41aeea1..df2062afe6 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -2113,6 +2113,8 @@ FETCH_NEXT_BLOCK: pBlock->info.dataLoad = 1; blockDataUpdateTsWindow(pBlock, pInfo->primaryTsIndex); + qDebug("%" PRId64 " rows in datablock, update res:%" PRId64 " %s", pBlockInfo->rows, + pInfo->pUpdateDataRes->info.rows, id); if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) { break; } From 53696caabf16b91c1e621d6d1e11f1083fd1f9df Mon Sep 17 00:00:00 2001 From: xleili Date: Fri, 2 Jun 2023 16:52:36 +0800 Subject: [PATCH 48/62] fix: rpm and deb librocksdb.so install and unintall --- packaging/deb/DEBIAN/preinst | 2 +- packaging/deb/DEBIAN/prerm | 2 +- packaging/deb/makedeb.sh | 3 ++- packaging/rpm/tdengine.spec | 2 ++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packaging/deb/DEBIAN/preinst b/packaging/deb/DEBIAN/preinst index d9951fc4d4..d6558d5b3b 100644 --- a/packaging/deb/DEBIAN/preinst +++ b/packaging/deb/DEBIAN/preinst @@ -80,5 +80,5 @@ fi # there can not libtaos.so*, otherwise ln -s error ${csudo}rm -f ${install_main_dir}/driver/libtaos.* || : -${csudo}rm -f ${install_main_dir}/driver/librocksdb.* || : +[ -f ${install_main_dir}/driver/librocksdb.* ] && ${csudo}rm -f ${install_main_dir}/driver/librocksdb.* || : [ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}rm -f ${install_main_dir}/driver/libtaosws.so || : diff --git a/packaging/deb/DEBIAN/prerm b/packaging/deb/DEBIAN/prerm index 80799ae0e5..8f8d472867 100644 --- a/packaging/deb/DEBIAN/prerm +++ b/packaging/deb/DEBIAN/prerm @@ -40,7 +40,7 @@ else ${csudo}rm -f ${inc_link_dir}/taosudf.h || : [ -f ${inc_link_dir}/taosws.h ] && ${csudo}rm -f ${inc_link_dir}/taosws.h || : ${csudo}rm -f ${lib_link_dir}/libtaos.* || : - ${csudo}rm -f ${lib_link_dir}/librocksdb.* || : + [ -f ${lib_link_dir}/librocksdb.* ] && ${csudo}rm -f ${lib_link_dir}/librocksdb.* || : [ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || : ${csudo}rm -f ${log_link_dir} || : diff --git a/packaging/deb/makedeb.sh b/packaging/deb/makedeb.sh index 624ccb0e3b..024c69deb1 100755 --- a/packaging/deb/makedeb.sh +++ b/packaging/deb/makedeb.sh @@ -31,6 +31,7 @@ cd ${pkg_dir} libfile="libtaos.so.${tdengine_ver}" wslibfile="libtaosws.so" +rocksdblib="librocksdb.so.8" # create install dir install_home_path="/usr/local/taos" @@ -94,7 +95,7 @@ fi cp ${compile_dir}/build/bin/taos ${pkg_dir}${install_home_path}/bin cp ${compile_dir}/build/lib/${libfile} ${pkg_dir}${install_home_path}/driver -cp ${compile_dir}/build/lib/librocksdb.8 ${pkg_dir}${install_home_path}/driver +[ -f ${compile_dir}/build/lib/${rocksdblib} ] && cp ${compile_dir}/build/lib/${rocksdblib} ${pkg_dir}${install_home_path}/driver ||: [ -f ${compile_dir}/build/lib/${wslibfile} ] && cp ${compile_dir}/build/lib/${wslibfile} ${pkg_dir}${install_home_path}/driver ||: cp ${compile_dir}/../include/client/taos.h ${pkg_dir}${install_home_path}/include cp ${compile_dir}/../include/common/taosdef.h ${pkg_dir}${install_home_path}/include diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec index 31d597785e..2b056c376a 100644 --- a/packaging/rpm/tdengine.spec +++ b/packaging/rpm/tdengine.spec @@ -45,6 +45,7 @@ echo buildroot: %{buildroot} libfile="libtaos.so.%{_version}" wslibfile="libtaosws.so" +rocksdblib="librocksdb.so.8" # create install path, and cp file mkdir -p %{buildroot}%{homepath}/bin @@ -92,6 +93,7 @@ if [ -f %{_compiledir}/build/bin/taosadapter ]; then fi cp %{_compiledir}/build/lib/${libfile} %{buildroot}%{homepath}/driver [ -f %{_compiledir}/build/lib/${wslibfile} ] && cp %{_compiledir}/build/lib/${wslibfile} %{buildroot}%{homepath}/driver ||: +[ -f %{_compiledir}/build/lib/${rocksdblib} ] && cp %{_compiledir}/build/lib/${rocksdblib} %{buildroot}%{homepath}/driver ||: cp %{_compiledir}/../include/client/taos.h %{buildroot}%{homepath}/include cp %{_compiledir}/../include/common/taosdef.h %{buildroot}%{homepath}/include cp %{_compiledir}/../include/util/taoserror.h %{buildroot}%{homepath}/include From 9f8f5374aaecd3f07f461240e2bc42ce35a56a8f Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 16:56:20 +0800 Subject: [PATCH 49/62] fix: num_of_records_per_req item in json config need less than 32768. current = 100000 --- tests/system-test/1-insert/manyVgroups.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system-test/1-insert/manyVgroups.json b/tests/system-test/1-insert/manyVgroups.json index 3b0fa96b08..8c6f39cf96 100644 --- a/tests/system-test/1-insert/manyVgroups.json +++ b/tests/system-test/1-insert/manyVgroups.json @@ -11,7 +11,7 @@ "confirm_parameter_prompt": "no", "insert_interval": 0, "interlace_rows": 0, - "num_of_records_per_req": 100000, + "num_of_records_per_req": 10000, "databases": [ { "dbinfo": { @@ -73,4 +73,4 @@ ] } ] -} \ No newline at end of file +} From 27d8870e182a6f31a4590869f3a7ec3166e29fd2 Mon Sep 17 00:00:00 2001 From: t_max <1172915550@qq.com> Date: Fri, 2 Jun 2023 17:09:03 +0800 Subject: [PATCH 50/62] fix: no data after seek --- source/client/src/clientTmq.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c index ccb09e3584..e1b2b9c48b 100644 --- a/source/client/src/clientTmq.c +++ b/source/client/src/clientTmq.c @@ -1868,7 +1868,10 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) { // update the local offset value only for the returned values, only when the local offset is NOT updated // by tmq_offset_seek function if (!pVg->seekUpdated) { + tscDebug("consumer:0x%" PRIx64" local offset is update, since seekupdate not set", tmq->consumerId); pVg->offsetInfo.currentOffset = pDataRsp->rspOffset; + } else { + tscDebug("consumer:0x%" PRIx64" local offset is NOT update, since seekupdate is set", tmq->consumerId); } // update the status @@ -1952,8 +1955,15 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) { return NULL; } - if(pollRspWrapper->taosxRsp.rspOffset.type != 0){ // if offset is validate - pVg->offsetInfo.currentOffset = pollRspWrapper->taosxRsp.rspOffset; + // update the local offset value only for the returned values, only when the local offset is NOT updated + // by tmq_offset_seek function + if (!pVg->seekUpdated) { + if(pollRspWrapper->taosxRsp.rspOffset.type != 0) { // if offset is validate + tscDebug("consumer:0x%" PRIx64" local offset is update, since seekupdate not set", tmq->consumerId); + pVg->offsetInfo.currentOffset = pollRspWrapper->taosxRsp.rspOffset; + } + } else { + tscDebug("consumer:0x%" PRIx64" local offset is NOT update, since seekupdate is set", tmq->consumerId); } atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE); From 449051cda67aff90ccb2e690b5521025803b78b0 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 10:05:32 +0000 Subject: [PATCH 51/62] avoid mem leak --- source/libs/stream/src/streamBackendRocksdb.c | 4 ++-- source/libs/stream/src/tstreamFileState.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index b8af05c86d..30a7cefc9c 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -1056,7 +1056,7 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa rocksdb_readoptions_t* opts = pState->pTdbState->readOpts; \ size_t len = 0; \ char* val = rocksdb_get_cf(db, opts, pHandle, (const char*)buf, klen, (size_t*)&len, &err); \ - if (val == NULL) { \ + if (val == NULL || len == 0) { \ if (err == NULL) { \ qTrace("streamState str: %s failed to read from %s_%s, err: not exist", toString, pState->pTdbState->idstr, \ funcname); \ @@ -1069,7 +1069,7 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa } else { \ char* p = NULL; \ int32_t len = ginitDict[i].deValueFunc(val, len, NULL, (char**)pVal); \ - if (len < 0) { \ + if (len <= 0) { \ qError("streamState str: %s failed to read from %s_%s, err: already ttl ", toString, pState->pTdbState->idstr, \ funcname); \ code = -1; \ diff --git a/source/libs/stream/src/tstreamFileState.c b/source/libs/stream/src/tstreamFileState.c index 54832b042a..7ea1a41925 100644 --- a/source/libs/stream/src/tstreamFileState.c +++ b/source/libs/stream/src/tstreamFileState.c @@ -416,7 +416,7 @@ int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) { int32_t len = 0; memcpy(buf, taskKey, strlen(taskKey)); code = streamDefaultGet_rocksdb(pFileState->pFileStore, buf, &val, &len); - if (code != 0) { + if (code != 0 || len == 0 || val == NULL) { return TSDB_CODE_FAILED; } sscanf(val, "%" PRId64 "", &maxCheckPointId); From 17f2c3f88249b07ed79c5888bdf505c1322d9f20 Mon Sep 17 00:00:00 2001 From: liuyao <54liuyao@163.com> Date: Fri, 2 Jun 2023 16:51:44 +0800 Subject: [PATCH 52/62] reset wind info --- source/libs/executor/inc/executorInt.h | 1 + source/libs/executor/src/timewindowoperator.c | 25 +++++++++++++++++++ source/libs/stream/src/tstreamFileState.c | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/source/libs/executor/inc/executorInt.h b/source/libs/executor/inc/executorInt.h index 79391bc1c5..ffc63a22a8 100644 --- a/source/libs/executor/inc/executorInt.h +++ b/source/libs/executor/inc/executorInt.h @@ -456,6 +456,7 @@ typedef struct SStreamIntervalOperatorInfo { SSHashObj* pUpdatedMap; int64_t dataVersion; SStateStore statestore; + bool recvGetAll; } SStreamIntervalOperatorInfo; typedef struct SDataGroupInfo { diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index fc08f827a5..3a83472079 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -2439,6 +2439,15 @@ static inline int winPosCmprImpl(const void* pKey1, const void* pKey2) { return 0; } +static void resetUnCloseWinInfo(SSHashObj* winMap) { + void* pIte = NULL; + int32_t iter = 0; + while ((pIte = tSimpleHashIterate(winMap, pIte, &iter)) != NULL) { + SRowBuffPos* pPos = *(SRowBuffPos**)pIte; + pPos->beUsed = true; + } +} + static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { SStreamIntervalOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -2472,6 +2481,11 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { return pInfo->binfo.pRes; } + if (pInfo->recvGetAll) { + pInfo->recvGetAll = false; + resetUnCloseWinInfo(pInfo->aggSup.pResultRowHashTable); + } + setOperatorCompleted(pOperator); if (!IS_FINAL_OP(pInfo)) { clearFunctionContext(&pOperator->exprSupp); @@ -2565,6 +2579,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { break; } else if (pBlock->info.type == STREAM_GET_ALL && IS_FINAL_OP(pInfo)) { + pInfo->recvGetAll = true; getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pInfo->pUpdatedMap); continue; } else if (pBlock->info.type == STREAM_RETRIEVE && !IS_FINAL_OP(pInfo)) { @@ -2773,6 +2788,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, compareTs, pInfo->pState, pInfo->twAggSup.deleteMark); pInfo->dataVersion = 0; pInfo->statestore = pTaskInfo->storageAPI.stateStore; + pInfo->recvGetAll = false; pOperator->operatorType = pPhyNode->type; pOperator->blocking = true; @@ -4751,6 +4767,12 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { printDataBlock(pInfo->binfo.pRes, "single interval"); return pInfo->binfo.pRes; } + + if (pInfo->recvGetAll) { + pInfo->recvGetAll = false; + resetUnCloseWinInfo(pInfo->aggSup.pResultRowHashTable); + } + setOperatorCompleted(pOperator); if (pInfo->twAggSup.maxTs > 0 && pInfo->twAggSup.maxTs - pInfo->twAggSup.checkPointInterval > pInfo->twAggSup.checkPointTs) { @@ -4790,6 +4812,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { continue; } else if (pBlock->info.type == STREAM_GET_ALL) { qDebug("===stream===single interval recv|block type STREAM_GET_ALL"); + pInfo->recvGetAll = true; getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pInfo->pUpdatedMap); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { @@ -4960,6 +4983,8 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys destroyStreamFinalIntervalOperatorInfo, optrDefaultBufFn, NULL); pInfo->statestore = pTaskInfo->storageAPI.stateStore; + pInfo->recvGetAll = false; + initIntervalDownStream(downstream, pPhyNode->type, pInfo); code = appendDownstream(pOperator, &downstream, 1); if (code != TSDB_CODE_SUCCESS) { diff --git a/source/libs/stream/src/tstreamFileState.c b/source/libs/stream/src/tstreamFileState.c index f531f65565..e13499d87f 100644 --- a/source/libs/stream/src/tstreamFileState.c +++ b/source/libs/stream/src/tstreamFileState.c @@ -137,7 +137,7 @@ void clearExpiredRowBuff(SStreamFileState* pFileState, TSKEY ts, bool all) { SListNode* pNode = NULL; while ((pNode = tdListNext(&iter)) != NULL) { SRowBuffPos* pPos = *(SRowBuffPos**)(pNode->data); - if (all || (pFileState->getTs(pPos->pKey) < ts)) { + if (all || (pFileState->getTs(pPos->pKey) < ts && !pPos->beUsed)) { ASSERT(pPos->pRowBuff != NULL); tdListAppend(pFileState->freeBuffs, &(pPos->pRowBuff)); pPos->pRowBuff = NULL; From 6ee68331b319aefe7578a0051285ad4a7069588f Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 11:54:36 +0000 Subject: [PATCH 53/62] update DEFAULT_BUFF --- source/libs/stream/src/streamBackendRocksdb.c | 7 +++++-- source/libs/stream/src/streamUpdate.c | 12 ++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index 30a7cefc9c..e07198f6ab 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -87,8 +87,6 @@ void* streamBackendInit(const char* path) { pHandle->cfInst = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK); rocksdb_env_t* env = rocksdb_create_default_env(); // rocksdb_envoptions_create(); - rocksdb_env_set_low_priority_background_threads(env, 4); - rocksdb_env_set_high_priority_background_threads(env, 2); rocksdb_cache_t* cache = rocksdb_cache_create_lru(64 << 20); @@ -577,6 +575,11 @@ int32_t decodeValueFunc(void* value, int32_t vlen, int64_t* ttl, char** dest) { int64_t now = taosGetTimestampMs(); p = taosDecodeFixedI64(p, &key.unixTimestamp); p = taosDecodeFixedI32(p, &key.len); + if (vlen != sizeof(int64_t) + sizeof(int32_t) + key.len) { + *dest = NULL; + return -1; + } + if (key.len == 0) { key.data = NULL; } else { diff --git a/source/libs/stream/src/streamUpdate.c b/source/libs/stream/src/streamUpdate.c index fff666ec9f..85be120dbd 100644 --- a/source/libs/stream/src/streamUpdate.c +++ b/source/libs/stream/src/streamUpdate.c @@ -20,9 +20,9 @@ #include "ttime.h" #define DEFAULT_FALSE_POSITIVE 0.01 -#define DEFAULT_BUCKET_SIZE 1310720 -#define DEFAULT_MAP_CAPACITY 1310720 -#define DEFAULT_MAP_SIZE (DEFAULT_MAP_CAPACITY * 10) +#define DEFAULT_BUCKET_SIZE 131072 +#define DEFAULT_MAP_CAPACITY 131072 +#define DEFAULT_MAP_SIZE (DEFAULT_MAP_CAPACITY * 100) #define ROWS_PER_MILLISECOND 1 #define MAX_NUM_SCALABLE_BF 100000 #define MIN_NUM_SCALABLE_BF 10 @@ -44,8 +44,8 @@ static void windowSBfAdd(SUpdateInfo *pInfo, uint64_t count) { } } -static void clearItemHelper(void* p) { - SScalableBf** pBf = p; +static void clearItemHelper(void *p) { + SScalableBf **pBf = p; tScalableBfDestroy(*pBf); } @@ -274,7 +274,7 @@ void updateInfoDestoryColseWinSBF(SUpdateInfo *pInfo) { } int32_t updateInfoSerialize(void *buf, int32_t bufLen, const SUpdateInfo *pInfo) { - if(!pInfo) { + if (!pInfo) { return 0; } From e48e485b6c71165a1546cbdf4ecef37b9e599225 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 11:56:24 +0000 Subject: [PATCH 54/62] update default buffer --- source/libs/stream/src/streamBackendRocksdb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index e07198f6ab..5be6d1b003 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -572,11 +572,10 @@ int32_t decodeValueFunc(void* value, int32_t vlen, int64_t* ttl, char** dest) { *dest = NULL; return -1; } - int64_t now = taosGetTimestampMs(); p = taosDecodeFixedI64(p, &key.unixTimestamp); p = taosDecodeFixedI32(p, &key.len); if (vlen != sizeof(int64_t) + sizeof(int32_t) + key.len) { - *dest = NULL; + if (dest != NULL) *dest = NULL; return -1; } @@ -587,6 +586,7 @@ int32_t decodeValueFunc(void* value, int32_t vlen, int64_t* ttl, char** dest) { } if (ttl != NULL) { + int64_t now = taosGetTimestampMs(); *ttl = key.unixTimestamp == 0 ? 0 : key.unixTimestamp - now; } if (dest != NULL) { From 3ec700e0f7c20d036a87c50d140c08dd17b2edda Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 22:25:38 +0800 Subject: [PATCH 55/62] fix mem problem --- source/libs/stream/src/streamBackendRocksdb.c | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index 5be6d1b003..6309cb9df2 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -576,6 +576,7 @@ int32_t decodeValueFunc(void* value, int32_t vlen, int64_t* ttl, char** dest) { p = taosDecodeFixedI32(p, &key.len); if (vlen != sizeof(int64_t) + sizeof(int32_t) + key.len) { if (dest != NULL) *dest = NULL; + qError("vlen: %d, read len: %d", vlen, key.len); return -1; } @@ -1008,35 +1009,35 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa ((rocksdb_column_family_handle_t**)pState->pTdbState->pHandle)[idx]); } -#define STREAM_STATE_PUT_ROCKSDB(pState, funcname, key, value, vLen) \ - do { \ - code = 0; \ - char buf[128] = {0}; \ - char* err = NULL; \ - int i = streamGetInit(pState, funcname); \ - if (i < 0) { \ - qWarn("streamState failed to get cf name: %s", funcname); \ - code = -1; \ - break; \ - } \ - char toString[128] = {0}; \ - if (qDebugFlag & DEBUG_TRACE) ginitDict[i].toStrFunc((void*)key, toString); \ - int32_t klen = ginitDict[i].enFunc((void*)key, buf); \ - rocksdb_column_family_handle_t* pHandle = \ - ((rocksdb_column_family_handle_t**)pState->pTdbState->pHandle)[ginitDict[i].idx]; \ - rocksdb_t* db = pState->pTdbState->rocksdb; \ - rocksdb_writeoptions_t* opts = pState->pTdbState->writeOpts; \ - char* ttlV = NULL; \ - int32_t ttlVLen = ginitDict[i].enValueFunc((char*)value, vLen, 0, &ttlV); \ - rocksdb_put_cf(db, opts, pHandle, (const char*)buf, klen, (const char*)ttlV, (size_t)ttlVLen, &err); \ - if (err != NULL) { \ - taosMemoryFree(err); \ - qError("streamState str: %s failed to write to %s, err: %s", toString, funcname, err); \ - code = -1; \ - } else { \ - qTrace("streamState str:%s succ to write to %s, valLen:%d", toString, funcname, vLen); \ - } \ - taosMemoryFree(ttlV); \ +#define STREAM_STATE_PUT_ROCKSDB(pState, funcname, key, value, vLen) \ + do { \ + code = 0; \ + char buf[128] = {0}; \ + char* err = NULL; \ + int i = streamGetInit(pState, funcname); \ + if (i < 0) { \ + qWarn("streamState failed to get cf name: %s", funcname); \ + code = -1; \ + break; \ + } \ + char toString[128] = {0}; \ + if (qDebugFlag & DEBUG_TRACE) ginitDict[i].toStrFunc((void*)key, toString); \ + int32_t klen = ginitDict[i].enFunc((void*)key, buf); \ + rocksdb_column_family_handle_t* pHandle = \ + ((rocksdb_column_family_handle_t**)pState->pTdbState->pHandle)[ginitDict[i].idx]; \ + rocksdb_t* db = pState->pTdbState->rocksdb; \ + rocksdb_writeoptions_t* opts = pState->pTdbState->writeOpts; \ + char* ttlV = NULL; \ + int32_t ttlVLen = ginitDict[i].enValueFunc((char*)value, vLen, 0, &ttlV); \ + rocksdb_put_cf(db, opts, pHandle, (const char*)buf, klen, (const char*)ttlV, (size_t)ttlVLen, &err); \ + if (err != NULL) { \ + taosMemoryFree(err); \ + qError("streamState str: %s failed to write to %s, err: %s", toString, funcname, err); \ + code = -1; \ + } else { \ + qTrace("streamState str:%s succ to write to %s, rowValLen:%d, ttlValLen:%d", toString, funcname, vLen, ttlVLen); \ + } \ + taosMemoryFree(ttlV); \ } while (0); #define STREAM_STATE_GET_ROCKSDB(pState, funcname, key, pVal, vLen) \ @@ -1071,17 +1072,17 @@ rocksdb_iterator_t* streamStateIterCreate(SStreamState* pState, const char* cfNa code = -1; \ } else { \ char* p = NULL; \ - int32_t len = ginitDict[i].deValueFunc(val, len, NULL, (char**)pVal); \ - if (len <= 0) { \ + int32_t tlen = ginitDict[i].deValueFunc(val, len, NULL, (char**)pVal); \ + if (tlen <= 0) { \ qError("streamState str: %s failed to read from %s_%s, err: already ttl ", toString, pState->pTdbState->idstr, \ funcname); \ code = -1; \ } else { \ qTrace("streamState str: %s succ to read from %s_%s, valLen:%d", toString, pState->pTdbState->idstr, funcname, \ - len); \ + tlen); \ } \ taosMemoryFree(val); \ - if (vLen != NULL) *vLen = len; \ + if (vLen != NULL) *vLen = tlen; \ } \ if (code == 0) \ qDebug("streamState str: %s succ to read from %s_%s", toString, pState->pTdbState->idstr, funcname); \ From b5b4cd2a05b686ab0de277d3354fad3f62c04f86 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 23:15:27 +0800 Subject: [PATCH 56/62] fix(query): load del info with upper version limitation. --- source/dnode/vnode/src/inc/tsdb.h | 2 +- source/dnode/vnode/src/tsdb/tsdbCache.c | 2 +- source/dnode/vnode/src/tsdb/tsdbCommit.c | 2 +- source/dnode/vnode/src/tsdb/tsdbDataIter.c | 2 +- source/dnode/vnode/src/tsdb/tsdbRead.c | 17 +++++++++++++---- source/dnode/vnode/src/tsdb/tsdbReaderWriter.c | 12 ++++++++---- source/dnode/vnode/src/tsdb/tsdbSnapshot.c | 4 ++-- source/libs/wal/src/walRead.c | 2 +- 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index faf550ab75..828e0e7e3d 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -297,7 +297,7 @@ int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter); // SDelFReader int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb); int32_t tsdbDelFReaderClose(SDelFReader **ppReader); -int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData); +int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer); int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx); // tsdbRead.c ============================================================================================== int32_t tsdbTakeReadSnap(STsdbReader *pReader, _query_reseek_func_t reseek, STsdbReadSnap **ppSnap); diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 6a97ea89b3..d6c19ee18e 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -1454,7 +1454,7 @@ static int32_t getTableDelDataFromDelIdx(SDelFReader *pDelReader, SDelIdx *pDelI int32_t code = 0; if (pDelIdx) { - code = tsdbReadDelData(pDelReader, pDelIdx, aDelData); + code = tsdbReadDelData(pDelReader, pDelIdx, aDelData, INT64_MAX); } return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index d15f848cfd..ba74613bd9 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -266,7 +266,7 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel suid = pDelIdx->suid; uid = pDelIdx->uid; - code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData); + code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); } else { taosArrayClear(pCommitter->aDelData); diff --git a/source/dnode/vnode/src/tsdb/tsdbDataIter.c b/source/dnode/vnode/src/tsdb/tsdbDataIter.c index e27aec5b1b..701ad56181 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDataIter.c +++ b/source/dnode/vnode/src/tsdb/tsdbDataIter.c @@ -412,7 +412,7 @@ static int32_t tsdbTombFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* } } - code = tsdbReadDelData(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData); + code = tsdbReadDelData(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); pIter->delInfo.suid = pDelIdx->suid; diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 9cae4ad5aa..1286c2f7c4 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -2967,7 +2967,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* SDelIdx* pIdx = taosArraySearch(pReader->pDelIdx, &idx, tCmprDelIdx, TD_EQ); if (pIdx != NULL) { - code = tsdbReadDelData(pReader->pDelFReader, pIdx, pDelData); + code = tsdbReadDelData(pReader->pDelFReader, pIdx, pDelData, pReader->verRange.maxVer); } if (code != TSDB_CODE_SUCCESS) { goto _err; @@ -2978,7 +2978,10 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* if (pMemTbData != NULL) { p = pMemTbData->pHead; while (p) { - taosArrayPush(pDelData, p); + if (p->version <= pReader->verRange.maxVer) { + taosArrayPush(pDelData, p); + } + p = p->pNext; } } @@ -2986,7 +2989,9 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* if (piMemTbData != NULL) { p = piMemTbData->pHead; while (p) { - taosArrayPush(pDelData, p); + if (p->version <= pReader->verRange.maxVer) { + taosArrayPush(pDelData, p); + } p = p->pNext; } } @@ -4558,7 +4563,11 @@ int32_t tsdbReaderOpen(void* pVnode, SQueryTableDataCond* pCond, void* pTableLis pReader->pIgnoreTables = pIgnoreTables; - tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr); + tsdbDebug("%p total numOfTable:%d, window:%" PRId64 " - %" PRId64 ", verRange:%" PRId64 " - %" PRId64 + " in this query %s", + pReader, numOfTables, pReader->window.skey, pReader->window.ekey, pReader->verRange.minVer, + pReader->verRange.maxVer, pReader->idStr); + return code; _err: diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index b25ab393da..e4b8a57291 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -1488,7 +1488,7 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader) { return code; } -int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData) { +int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer) { int32_t code = 0; int64_t offset = pDelIdx->offset; int64_t size = pDelIdx->size; @@ -1510,11 +1510,15 @@ int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData SDelData delData; n += tGetDelData(pReader->aBuf[0] + n, &delData); - if (taosArrayPush(aDelData, &delData) == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + if (delData.version > maxVer) { + continue; } + if (taosArrayPush(aDelData, &delData) == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _err; + } } + ASSERT(n == size); return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index dfea125cc1..f7362b366f 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -1166,7 +1166,7 @@ static int32_t tsdbSnapWriteDelTableDataStart(STsdbSnapWriter* pWriter, TABLEID* int32_t c = tTABLEIDCmprFn(pDelIdx, &pWriter->tbid); if (c < 0) { - code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->pTIter->tIter.aDelData); + code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->pTIter->tIter.aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); SDelIdx* pDelIdxNew = taosArrayReserve(pWriter->aDelIdx, 1); @@ -1183,7 +1183,7 @@ static int32_t tsdbSnapWriteDelTableDataStart(STsdbSnapWriter* pWriter, TABLEID* pWriter->pTIter->tIter.iDelIdx++; } else if (c == 0) { - code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData); + code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); pWriter->pTIter->tIter.iDelIdx++; diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c index 0eb3d6ef09..1223e3756c 100644 --- a/source/libs/wal/src/walRead.c +++ b/source/libs/wal/src/walRead.c @@ -333,7 +333,7 @@ static int32_t walFetchBodyNew(SWalReader *pReader) { return -1; } - wDebug("vgId:%d, index:%" PRId64 " is fetched, cursor advance", pReader->pWal->cfg.vgId, ver); + wDebug("vgId:%d, index:%" PRId64 " is fetched, type:%d, cursor advance", pReader->pWal->cfg.vgId, ver, pReader->pHead->head.msgType); pReader->curVersion = ver + 1; return 0; } From becacbc84b63a181758d16a0b033a89003d240b2 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 2 Jun 2023 23:36:47 +0800 Subject: [PATCH 57/62] fix(query): fix syntax error. --- source/dnode/vnode/src/inc/tsdb.h | 3 ++- source/dnode/vnode/src/tsdb/tsdbCache.c | 2 +- source/dnode/vnode/src/tsdb/tsdbCommit.c | 2 +- source/dnode/vnode/src/tsdb/tsdbDataIter.c | 2 +- source/dnode/vnode/src/tsdb/tsdbRead.c | 2 +- source/dnode/vnode/src/tsdb/tsdbReaderWriter.c | 2 +- source/dnode/vnode/src/tsdb/tsdbSnapshot.c | 4 ++-- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 828e0e7e3d..9df95a379a 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -297,7 +297,8 @@ int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter); // SDelFReader int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb); int32_t tsdbDelFReaderClose(SDelFReader **ppReader); -int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer); +int32_t tsdbReadDelDatav1(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer); +int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData); int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx); // tsdbRead.c ============================================================================================== int32_t tsdbTakeReadSnap(STsdbReader *pReader, _query_reseek_func_t reseek, STsdbReadSnap **ppSnap); diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index d6c19ee18e..c659c8f4a2 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -1454,7 +1454,7 @@ static int32_t getTableDelDataFromDelIdx(SDelFReader *pDelReader, SDelIdx *pDelI int32_t code = 0; if (pDelIdx) { - code = tsdbReadDelData(pDelReader, pDelIdx, aDelData, INT64_MAX); + code = tsdbReadDelDatav1(pDelReader, pDelIdx, aDelData, INT64_MAX); } return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index ba74613bd9..b440d51883 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -266,7 +266,7 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel suid = pDelIdx->suid; uid = pDelIdx->uid; - code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData, INT64_MAX); + code = tsdbReadDelDatav1(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); } else { taosArrayClear(pCommitter->aDelData); diff --git a/source/dnode/vnode/src/tsdb/tsdbDataIter.c b/source/dnode/vnode/src/tsdb/tsdbDataIter.c index 701ad56181..8215c1ac29 100644 --- a/source/dnode/vnode/src/tsdb/tsdbDataIter.c +++ b/source/dnode/vnode/src/tsdb/tsdbDataIter.c @@ -412,7 +412,7 @@ static int32_t tsdbTombFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo* } } - code = tsdbReadDelData(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData, INT64_MAX); + code = tsdbReadDelDatav1(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); pIter->delInfo.suid = pDelIdx->suid; diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 1286c2f7c4..2500015ec1 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -2967,7 +2967,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader* SDelIdx* pIdx = taosArraySearch(pReader->pDelIdx, &idx, tCmprDelIdx, TD_EQ); if (pIdx != NULL) { - code = tsdbReadDelData(pReader->pDelFReader, pIdx, pDelData, pReader->verRange.maxVer); + code = tsdbReadDelDatav1(pReader->pDelFReader, pIdx, pDelData, pReader->verRange.maxVer); } if (code != TSDB_CODE_SUCCESS) { goto _err; diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index e4b8a57291..fb899fa1ce 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -1488,7 +1488,7 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader) { return code; } -int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer) { +int32_t tsdbReadDelDatav1(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer) { int32_t code = 0; int64_t offset = pDelIdx->offset; int64_t size = pDelIdx->size; diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c index f7362b366f..b5ca716701 100644 --- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c +++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c @@ -1166,7 +1166,7 @@ static int32_t tsdbSnapWriteDelTableDataStart(STsdbSnapWriter* pWriter, TABLEID* int32_t c = tTABLEIDCmprFn(pDelIdx, &pWriter->tbid); if (c < 0) { - code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->pTIter->tIter.aDelData, INT64_MAX); + code = tsdbReadDelDatav1(pWriter->pDelFReader, pDelIdx, pWriter->pTIter->tIter.aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); SDelIdx* pDelIdxNew = taosArrayReserve(pWriter->aDelIdx, 1); @@ -1183,7 +1183,7 @@ static int32_t tsdbSnapWriteDelTableDataStart(STsdbSnapWriter* pWriter, TABLEID* pWriter->pTIter->tIter.iDelIdx++; } else if (c == 0) { - code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData, INT64_MAX); + code = tsdbReadDelDatav1(pWriter->pDelFReader, pDelIdx, pWriter->aDelData, INT64_MAX); TSDB_CHECK_CODE(code, lino, _exit); pWriter->pTIter->tIter.iDelIdx++; From 5063c175f4ff62ceb210d5424d1d7bda5681d1b9 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Fri, 2 Jun 2023 23:47:14 +0800 Subject: [PATCH 58/62] fix mem problem --- source/libs/stream/src/streamBackendRocksdb.c | 2 +- source/libs/stream/src/tstreamFileState.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/source/libs/stream/src/streamBackendRocksdb.c b/source/libs/stream/src/streamBackendRocksdb.c index 6309cb9df2..b3995f020b 100644 --- a/source/libs/stream/src/streamBackendRocksdb.c +++ b/source/libs/stream/src/streamBackendRocksdb.c @@ -574,7 +574,7 @@ int32_t decodeValueFunc(void* value, int32_t vlen, int64_t* ttl, char** dest) { } p = taosDecodeFixedI64(p, &key.unixTimestamp); p = taosDecodeFixedI32(p, &key.len); - if (vlen != sizeof(int64_t) + sizeof(int32_t) + key.len) { + if (vlen != (sizeof(int64_t) + sizeof(int32_t) + key.len)) { if (dest != NULL) *dest = NULL; qError("vlen: %d, read len: %d", vlen, key.len); return -1; diff --git a/source/libs/stream/src/tstreamFileState.c b/source/libs/stream/src/tstreamFileState.c index 7ea1a41925..757b1de6b6 100644 --- a/source/libs/stream/src/tstreamFileState.c +++ b/source/libs/stream/src/tstreamFileState.c @@ -419,7 +419,9 @@ int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) { if (code != 0 || len == 0 || val == NULL) { return TSDB_CODE_FAILED; } - sscanf(val, "%" PRId64 "", &maxCheckPointId); + memcpy(val, buf, len); + buf[len] = 0; + maxCheckPointId = atol((char*)buf); taosMemoryFree(val); } for (int64_t i = maxCheckPointId; i > 0; i--) { @@ -431,16 +433,17 @@ int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) { if (code != 0) { return TSDB_CODE_FAILED; } + memcpy(val, buf, len); + buf[len] = 0; + taosMemoryFree(val); + TSKEY ts; - sscanf(val, "%" PRId64 "", &ts); + ts = atol((char*)buf); if (ts < mark) { // statekey winkey.ts < mark forceRemoveCheckpoint(pFileState, i); - taosMemoryFreeClear(val); break; - } else { } - taosMemoryFree(val); } return code; } From 4bb64292498390fd17abb5fc5e141a1c2b34920c Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Sat, 3 Jun 2023 00:20:59 +0800 Subject: [PATCH 59/62] fix(query): fix syntax error. --- source/dnode/vnode/src/tsdb/tsdbReaderWriter.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index fb899fa1ce..4b677533e7 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -1488,6 +1488,10 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader) { return code; } +int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData) { + return tsdbReadDelDatav1(pReader, pDelIdx, aDelData, INT64_MAX); +} + int32_t tsdbReadDelDatav1(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer) { int32_t code = 0; int64_t offset = pDelIdx->offset; From 81fe174aa26b0dd75ed9f805698edf919ed34ef3 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 3 Jun 2023 08:19:59 +0800 Subject: [PATCH 60/62] fix mem leak --- source/libs/stream/src/streamExec.c | 39 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index 716b939e5f..1a78607770 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -16,11 +16,11 @@ #include "streamInc.h" // maximum allowed processed block batches. One block may include several submit blocks -#define MAX_STREAM_EXEC_BATCH_NUM 32 -#define MIN_STREAM_EXEC_BATCH_NUM 8 -#define MAX_STREAM_RESULT_DUMP_THRESHOLD 100 +#define MAX_STREAM_EXEC_BATCH_NUM 32 +#define MIN_STREAM_EXEC_BATCH_NUM 8 +#define MAX_STREAM_RESULT_DUMP_THRESHOLD 100 -static int32_t updateCheckPointInfo (SStreamTask* pTask); +static int32_t updateCheckPointInfo(SStreamTask* pTask); bool streamTaskShouldStop(const SStreamStatus* pStatus) { int32_t status = atomic_load_8((int8_t*)&pStatus->taskStatus); @@ -48,10 +48,11 @@ static int32_t doDumpResult(SStreamTask* pTask, SStreamQueueItem* pItem, SArray* return -1; } - qDebug("s-task:%s dump stream result data blocks, num:%d, size:%.2fMiB", pTask->id.idStr, numOfBlocks, size/1048576.0); + qDebug("s-task:%s dump stream result data blocks, num:%d, size:%.2fMiB", pTask->id.idStr, numOfBlocks, + size / 1048576.0); code = streamTaskOutputResultBlock(pTask, pStreamBlocks); - if (code == TSDB_CODE_UTIL_QUEUE_OUT_OF_MEMORY) { // back pressure and record position + if (code == TSDB_CODE_UTIL_QUEUE_OUT_OF_MEMORY) { // back pressure and record position destroyStreamDataBlock(pStreamBlocks); return -1; } @@ -65,7 +66,8 @@ static int32_t doDumpResult(SStreamTask* pTask, SStreamQueueItem* pItem, SArray* return TSDB_CODE_SUCCESS; } -static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, int64_t* totalSize, int32_t* totalBlocks) { +static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, int64_t* totalSize, + int32_t* totalBlocks) { int32_t code = TSDB_CODE_SUCCESS; void* pExecutor = pTask->exec.pExecutor; @@ -82,7 +84,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i } if (streamTaskShouldStop(&pTask->status)) { - taosArrayDestroy(pRes); // memory leak + taosArrayDestroy(pRes); // memory leak return 0; } @@ -101,7 +103,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i if (pItem->type == STREAM_INPUT__DATA_RETRIEVE) { SSDataBlock block = {0}; - const SStreamDataBlock* pRetrieveBlock = (const SStreamDataBlock*) pItem; + const SStreamDataBlock* pRetrieveBlock = (const SStreamDataBlock*)pItem; ASSERT(taosArrayGetSize(pRetrieveBlock->blocks) == 1); assignOneDataBlock(&block, taosArrayGet(pRetrieveBlock->blocks, 0)); @@ -153,7 +155,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i ASSERT(numOfBlocks == taosArrayGetSize(pRes)); code = doDumpResult(pTask, pItem, pRes, size, totalSize, totalBlocks); } else { - taosArrayDestroy(pRes); + taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes); } return code; @@ -286,7 +288,7 @@ int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) { } #endif -int32_t updateCheckPointInfo (SStreamTask* pTask) { +int32_t updateCheckPointInfo(SStreamTask* pTask) { int64_t ckId = 0; int64_t dataVer = 0; qGetCheckpointVersion(pTask->exec.pExecutor, &dataVer, &ckId); @@ -294,7 +296,8 @@ int32_t updateCheckPointInfo (SStreamTask* pTask) { SCheckpointInfo* pCkInfo = &pTask->chkInfo; if (ckId > pCkInfo->id) { // save it since the checkpoint is updated qDebug("s-task:%s exec end, start to update check point, ver from %" PRId64 " to %" PRId64 - ", checkPoint id:%" PRId64 " -> %" PRId64, pTask->id.idStr, pCkInfo->version, dataVer, pCkInfo->id, ckId); + ", checkPoint id:%" PRId64 " -> %" PRId64, + pTask->id.idStr, pCkInfo->version, dataVer, pCkInfo->id, ckId); pTask->chkInfo = (SCheckpointInfo){.version = dataVer, .id = ckId, .currentVer = pCkInfo->currentVer}; @@ -417,14 +420,15 @@ int32_t streamExecForAll(SStreamTask* pTask) { ASSERT(pTask->taskLevel == TASK_LEVEL__SOURCE); const SStreamDataSubmit* pSubmit = (const SStreamDataSubmit*)pInput; qSetMultiStreamInput(pExecutor, &pSubmit->submit, 1, STREAM_INPUT__DATA_SUBMIT); - qDebug("s-task:%s set submit blocks as source block completed, %p %p len:%d ver:%" PRId64, pTask->id.idStr, pSubmit, - pSubmit->submit.msgStr, pSubmit->submit.msgLen, pSubmit->submit.ver); + qDebug("s-task:%s set submit blocks as source block completed, %p %p len:%d ver:%" PRId64, pTask->id.idStr, + pSubmit, pSubmit->submit.msgStr, pSubmit->submit.msgLen, pSubmit->submit.ver); } else if (pItem->type == STREAM_INPUT__DATA_BLOCK || pItem->type == STREAM_INPUT__DATA_RETRIEVE) { const SStreamDataBlock* pBlock = (const SStreamDataBlock*)pInput; SArray* pBlockList = pBlock->blocks; int32_t numOfBlocks = taosArrayGetSize(pBlockList); - qDebug("s-task:%s set sdata blocks as input num:%d, ver:%" PRId64, pTask->id.idStr, numOfBlocks, pBlock->sourceVer); + qDebug("s-task:%s set sdata blocks as input num:%d, ver:%" PRId64, pTask->id.idStr, numOfBlocks, + pBlock->sourceVer); qSetMultiStreamInput(pExecutor, pBlockList->pData, numOfBlocks, STREAM_INPUT__DATA_BLOCK); } else if (pItem->type == STREAM_INPUT__MERGED_SUBMIT) { const SStreamMergedSubmit* pMerged = (const SStreamMergedSubmit*)pInput; @@ -445,8 +449,9 @@ int32_t streamExecForAll(SStreamTask* pTask) { int32_t totalBlocks = 0; streamTaskExecImpl(pTask, pInput, &resSize, &totalBlocks); - double el = (taosGetTimestampMs() - st) / 1000.0; - qDebug("s-task:%s exec end, elapsed time:%.2fs, result size:%.2fMiB, numOfBlocks:%d", pTask->id.idStr, el, resSize / 1048576.0, totalBlocks); + double el = (taosGetTimestampMs() - st) / 1000.0; + qDebug("s-task:%s exec end, elapsed time:%.2fs, result size:%.2fMiB, numOfBlocks:%d", pTask->id.idStr, el, + resSize / 1048576.0, totalBlocks); streamFreeQitem(pInput); } From 7244ab1f6bfd28c1d5d2a9cbc4f4442a8bb50c94 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 3 Jun 2023 08:28:21 +0800 Subject: [PATCH 61/62] fix mem leak --- source/libs/stream/src/streamExec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index 1a78607770..aa2c8050de 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -84,7 +84,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i } if (streamTaskShouldStop(&pTask->status)) { - taosArrayDestroy(pRes); // memory leak + taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes); return 0; } From 9e0392ff59a1db9bcee81c01dc7b30cc2fdda8ff Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sat, 3 Jun 2023 09:17:05 +0800 Subject: [PATCH 62/62] fix mem leak --- source/libs/stream/src/streamExec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c index aa2c8050de..49b35ce8db 100644 --- a/source/libs/stream/src/streamExec.c +++ b/source/libs/stream/src/streamExec.c @@ -101,8 +101,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, SStreamQueueItem* pItem, i if (output == NULL) { if (pItem->type == STREAM_INPUT__DATA_RETRIEVE) { - SSDataBlock block = {0}; - + SSDataBlock block = {0}; const SStreamDataBlock* pRetrieveBlock = (const SStreamDataBlock*)pItem; ASSERT(taosArrayGetSize(pRetrieveBlock->blocks) == 1);