From 8c1c2a2f976fd49657ea1ff7beb5642e3c86a1bb Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Tue, 23 May 2023 17:47:17 +0800 Subject: [PATCH 01/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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