From b09ee742d557102cb32fb084cae99758c53132cf Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 15:31:48 +0800 Subject: [PATCH 01/47] refactor(query): check table in uid order when handling the last block, and some internal refactor. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 121 +++++++++++--- source/libs/executor/inc/executorimpl.h | 32 +--- source/libs/executor/src/executorimpl.c | 55 ++----- source/libs/executor/src/timewindowoperator.c | 147 +++++++++--------- 4 files changed, 193 insertions(+), 162 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index cd40a9acc2..55162d4cac 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -129,13 +129,19 @@ typedef struct SFileBlockDumpInfo { bool allDumped; } SFileBlockDumpInfo; +typedef struct SUidOrderCheckInfo { + uint64_t* tableUidList; // access table uid list in uid ascending order list + int32_t currentIndex; // index in table uid list +} SUidOrderCheckInfo; + typedef struct SReaderStatus { - bool loadFromFile; // check file stage + bool loadFromFile; // check file stage bool composedDataBlock; // the returned data block is a composed block or not - SHashObj* pTableMap; // SHash - STableBlockScanInfo* pTableIter; // table iterator used in building in-memory buffer data blocks. + SHashObj* pTableMap; // SHash + STableBlockScanInfo* pTableIter; // table iterator used in building in-memory buffer data blocks. + SUidOrderCheckInfo uidCheckInfo; // check all table in uid order SFileBlockDumpInfo fBlockDumpInfo; - SDFileSet* pCurrentFileset; // current opened file set + SDFileSet* pCurrentFileset; // current opened file set SBlockData fileBlockData; SFilesetIter fileIter; SDataBlockIter blockIter; @@ -573,7 +579,7 @@ static void cleanupTableScanInfo(SHashObj* pTableMap) { } // reset the index in last block when handing a new file - px->indexInBlockL = -1; + px->indexInBlockL = DEFAULT_ROW_INDEX_VAL; tMapDataClear(&px->mapData); taosArrayClear(px->pBlockList); } @@ -1810,7 +1816,8 @@ static void setAllRowsChecked(SLastBlockReader *pLastBlockReader) { } static bool nextRowInLastBlock(SLastBlockReader *pLastBlockReader, STableBlockScanInfo* pBlockScanInfo) { - int32_t step = (pLastBlockReader->order == TSDB_ORDER_ASC) ? 1 : -1; + bool asc = ASCENDING_TRAVERSE(pLastBlockReader->order); + int32_t step = (asc) ? 1 : -1; if (*pLastBlockReader->rowIndex == ALL_ROWS_CHECKED_INDEX) { return false; } @@ -1819,8 +1826,20 @@ static bool nextRowInLastBlock(SLastBlockReader *pLastBlockReader, STableBlockSc SBlockData* pBlockData = &pLastBlockReader->lastBlockData; for(int32_t i = *(pLastBlockReader->rowIndex); i < pBlockData->nRow && i >= 0; i += step) { - if (pBlockData->aUid != NULL && pBlockData->aUid[i] != pLastBlockReader->uid) { - continue; + if (pBlockData->aUid != NULL) { + if (asc) { + if (pBlockData->aUid[i] < pLastBlockReader->uid) { + continue; + } else if (pBlockData->aUid[i] > pLastBlockReader->uid) { + break; + } + } else { + if (pBlockData->aUid[i] > pLastBlockReader->uid) { + continue; + } else if (pBlockData->aUid[i] < pLastBlockReader->uid) { + break; + } + } } int64_t ts = pBlockData->aTSKEY[i]; @@ -2279,22 +2298,75 @@ static int32_t doLoadRelatedLastBlock(SLastBlockReader* pLastBlockReader, STable return TSDB_CODE_SUCCESS; } +static int32_t uidComparFunc(const void* p1, const void* p2) { + uint64_t pu1 = *(uint64_t*) p1; + uint64_t pu2 = *(uint64_t*) p2; + if (pu1 == pu2) { + return 0; + } else { + return (pu1 > pu2)? -1:1; + } +} + +static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderStatus* pStatus) { + if (pOrderCheckInfo->tableUidList == NULL) { + int32_t total = taosHashGetSize(pStatus->pTableMap); + + pOrderCheckInfo->currentIndex = 0; + pOrderCheckInfo->tableUidList = taosMemoryMalloc(total * sizeof(uint64_t)); + if (pOrderCheckInfo->tableUidList == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + int32_t index = 0; + void* p = taosHashIterate(pStatus->pTableMap, NULL); + while(p != NULL) { + STableBlockScanInfo* pScanInfo = p; + pOrderCheckInfo->tableUidList[index++] = pScanInfo->uid; + p = taosHashIterate(pStatus->pTableMap, p); + } + + taosSort(pOrderCheckInfo->tableUidList, total, sizeof(uint64_t), uidComparFunc); + + uint64_t uid = pOrderCheckInfo->tableUidList[0]; + pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); + } else { + if (pStatus->pTableIter == NULL) { + uint64_t uid = pOrderCheckInfo->tableUidList[pOrderCheckInfo->currentIndex]; + pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); + } + } + + return TSDB_CODE_SUCCESS; +} + +static bool moveToNextTable(SUidOrderCheckInfo *pOrderedCheckInfo, SReaderStatus* pStatus) { + pOrderedCheckInfo->currentIndex += 1; + if (pOrderedCheckInfo->currentIndex >= taosHashGetSize(pStatus->pTableMap)) { + pStatus->pTableIter = NULL; + return false; + } + + uint64_t uid = pOrderedCheckInfo->tableUidList[pOrderedCheckInfo->currentIndex]; + pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); + ASSERT(pStatus->pTableIter != NULL); + return true; +} + static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { SReaderStatus* pStatus = &pReader->status; SLastBlockReader* pLastBlockReader = pStatus->fileIter.pLastBlockReader; - while(1) { - if (pStatus->pTableIter == NULL) { - pStatus->pTableIter = taosHashIterate(pStatus->pTableMap, NULL); - if (pStatus->pTableIter == NULL) { - return TSDB_CODE_SUCCESS; - } - } + SUidOrderCheckInfo *pOrderedCheckInfo = &pStatus->uidCheckInfo; + int32_t code = initOrderCheckInfo(pOrderedCheckInfo, pStatus); + if (code != TSDB_CODE_SUCCESS) { + return code; + } + while(1) { // load the last data block of current table - // todo opt perf by avoiding load last block repeatly STableBlockScanInfo* pScanInfo = pStatus->pTableIter; - int32_t code = doLoadRelatedLastBlock(pLastBlockReader, pScanInfo, pReader); + code = doLoadRelatedLastBlock(pLastBlockReader, pScanInfo, pReader); if (code != TSDB_CODE_SUCCESS) { return code; } @@ -2302,19 +2374,20 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { if (pLastBlockReader->currentBlockIndex != -1) { initLastBlockReader(pLastBlockReader, pScanInfo->uid, &pScanInfo->indexInBlockL); int32_t index = pScanInfo->indexInBlockL; + if (index == DEFAULT_ROW_INDEX_VAL || index == pLastBlockReader->lastBlockData.nRow) { bool hasData = nextRowInLastBlock(pLastBlockReader, pScanInfo); if (!hasData) { // current table does not have rows in last block, try next table - pStatus->pTableIter = taosHashIterate(pStatus->pTableMap, pStatus->pTableIter); - if (pStatus->pTableIter == NULL) { + bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus); + if (!hasNexTable) { return TSDB_CODE_SUCCESS; } continue; } } } else { // no data in last block, try next table - pStatus->pTableIter = taosHashIterate(pStatus->pTableMap, pStatus->pTableIter); - if (pStatus->pTableIter == NULL) { + bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus); + if (!hasNexTable) { return TSDB_CODE_SUCCESS; } continue; @@ -2330,8 +2403,8 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { } // current table is exhausted, let's try next table - pStatus->pTableIter = taosHashIterate(pStatus->pTableMap, pStatus->pTableIter); - if (pStatus->pTableIter == NULL) { + bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus); + if (!hasNexTable) { return TSDB_CODE_SUCCESS; } } @@ -3343,6 +3416,8 @@ void tsdbReaderClose(STsdbReader* pReader) { tsdbDataFReaderClose(&pReader->pFileReader); } + taosMemoryFree(pReader->status.uidCheckInfo.tableUidList); + SFilesetIter* pFilesetIter = &pReader->status.fileIter; if (pFilesetIter->pLastBlockReader != NULL) { tBlockDataDestroy(&pFilesetIter->pLastBlockReader->lastBlockData, true); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index a34ba804ed..4e86333cf7 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -207,6 +207,7 @@ typedef struct SExprSupp { typedef struct SOperatorInfo { uint16_t operatorType; + int16_t resultDataBlockId; bool blocking; // block operator or not uint8_t status; // denote if current operator is completed char* name; // name, for debug purpose @@ -218,7 +219,6 @@ typedef struct SOperatorInfo { struct SOperatorInfo** pDownstream; // downstram pointer list int32_t numOfDownstream; // number of downstream. The value is always ONE expect for join operator SOperatorFpSet fpSet; - int16_t resultDataBlockId; } SOperatorInfo; typedef enum { @@ -908,21 +908,15 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhysiNode* pProjPhyNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode* pSortNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** dowStreams, size_t numStreams, SMergePhysiNode* pMergePhysiNode, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createSortedMergeOperatorInfo(SOperatorInfo** downstream, int32_t numOfDownstream, SExprInfo* pExprInfo, int32_t num, SArray* pSortInfo, SArray* pGroupInfo, SExecTaskInfo* pTaskInfo); SOperatorInfo* createLastrowScanOperator(SLastRowScanPhysiNode* pTableScanNode, SReadHandle* readHandle, SExecTaskInfo* pTaskInfo); SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId, STimeWindowAggSupp* pTwAggSupp, SIntervalPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, bool isStream); - -SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, - SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId, - bool mergeResultBlock, SExecTaskInfo* pTaskInfo); - -SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, - SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId, - SNode* pCondition, bool mergeResultBlocks, SExecTaskInfo* pTaskInfo); - +SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMergeIntervalPhysiNode* pIntervalPhyNode, + SExecTaskInfo* pTaskInfo); +SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SMergeAlignedIntervalPhysiNode* pNode, + SExecTaskInfo* pTaskInfo); SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, int32_t numOfChild); SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionWinodwPhysiNode* pSessionNode, @@ -930,22 +924,16 @@ SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionW SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock, SArray* pGroupColList, SNode* pCondition, SExprInfo* pScalarExprInfo, int32_t numOfScalarExpr, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createDataBlockInfoScanOperator(void* dataReader, SReadHandle* readHandle, uint64_t uid, SBlockDistScanPhysiNode* pBlockScanNode, - SExecTaskInfo* pTaskInfo); +SOperatorInfo* createDataBlockInfoScanOperator(void* dataReader, SReadHandle* readHandle, uint64_t uid, + SBlockDistScanPhysiNode* pBlockScanNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhysiNode* pTableScanNode, SNode* pTagCond, SExecTaskInfo* pTaskInfo); SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode* pPhyFillNode, SExecTaskInfo* pTaskInfo); - -SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfCols, - SSDataBlock* pResBlock, STimeWindowAggSupp *pTwAggSupp, int32_t tsSlotId, - SColumn* pStateKeyCol, SNode* pCondition, SExecTaskInfo* pTaskInfo); - +SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartitionPhysiNode* pPartNode, SExecTaskInfo* pTaskInfo); - SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pNode, SExecTaskInfo* pTaskInfo); - SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream, SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo); @@ -956,10 +944,6 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo); -#if 0 -SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv); -#endif - int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBlock* pSrcBlock, SqlFunctionCtx* pCtx, int32_t numOfOutput, SArray* pPseudoList); diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 893acf1bbc..18773377d9 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -4024,7 +4024,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo pTableListInfo, pTagCond, pTagIndexCond, GET_TASKID(pTaskInfo)); if (code) { pTaskInfo->code = code; - qError("failed to createScanTableListInfo, code: %s", tstrerror(code)); + qError("failed to createScanTableListInfo, code:%s, %s", tstrerror(code), GET_TASKID(pTaskInfo)); return NULL; } @@ -4162,9 +4162,9 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo if (ops[i] == NULL) { taosMemoryFree(ops); return NULL; - } else { - ops[i]->resultDataBlockId = pChildNode->pOutputDataBlockDesc->dataBlockId; } + + ops[i]->resultDataBlockId = pChildNode->pOutputDataBlockDesc->dataBlockId; } SOperatorInfo* pOptr = NULL; @@ -4216,37 +4216,10 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == type) { SMergeAlignedIntervalPhysiNode* pIntervalPhyNode = (SMergeAlignedIntervalPhysiNode*)pPhyNode; - - SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &num); - SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc); - - SInterval interval = {.interval = pIntervalPhyNode->interval, - .sliding = pIntervalPhyNode->sliding, - .intervalUnit = pIntervalPhyNode->intervalUnit, - .slidingUnit = pIntervalPhyNode->slidingUnit, - .offset = pIntervalPhyNode->offset, - .precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision}; - - int32_t tsSlotId = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId; - pOptr = createMergeAlignedIntervalOperatorInfo(ops[0], pExprInfo, num, pResBlock, &interval, tsSlotId, - pPhyNode->pConditions, pIntervalPhyNode->window.mergeDataBlock, - pTaskInfo); + pOptr = createMergeAlignedIntervalOperatorInfo(ops[0], pIntervalPhyNode, pTaskInfo); } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL == type) { SMergeIntervalPhysiNode* pIntervalPhyNode = (SMergeIntervalPhysiNode*)pPhyNode; - - SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &num); - SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc); - - SInterval interval = {.interval = pIntervalPhyNode->interval, - .sliding = pIntervalPhyNode->sliding, - .intervalUnit = pIntervalPhyNode->intervalUnit, - .slidingUnit = pIntervalPhyNode->slidingUnit, - .offset = pIntervalPhyNode->offset, - .precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision}; - - int32_t tsSlotId = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId; - pOptr = createMergeIntervalOperatorInfo(ops[0], pExprInfo, num, pResBlock, &interval, tsSlotId, - pIntervalPhyNode->window.mergeDataBlock, pTaskInfo); + pOptr = createMergeIntervalOperatorInfo(ops[0], pIntervalPhyNode, pTaskInfo); } else if (QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL == type) { int32_t children = 0; pOptr = createStreamFinalIntervalOperatorInfo(ops[0], pPhyNode, pTaskInfo, children); @@ -4275,17 +4248,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo pOptr = createPartitionOperatorInfo(ops[0], (SPartitionPhysiNode*)pPhyNode, pTaskInfo); } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE == type) { SStateWinodwPhysiNode* pStateNode = (SStateWinodwPhysiNode*)pPhyNode; - - STimeWindowAggSupp as = {.waterMark = pStateNode->window.watermark, .calTrigger = pStateNode->window.triggerType}; - - SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &num); - SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc); - int32_t tsSlotId = ((SColumnNode*)pStateNode->window.pTspk)->slotId; - - SColumnNode* pColNode = (SColumnNode*)((STargetNode*)pStateNode->pStateKey)->pExpr; - SColumn col = extractColumnFromColumnNode(pColNode); - pOptr = createStatewindowOperatorInfo(ops[0], pExprInfo, num, pResBlock, &as, tsSlotId, &col, pPhyNode->pConditions, - pTaskInfo); + pOptr = createStatewindowOperatorInfo(ops[0], pStateNode, pTaskInfo); } else if (QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE == type) { pOptr = createStreamStateAggOperatorInfo(ops[0], pPhyNode, pTaskInfo); } else if (QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN == type) { @@ -4299,8 +4262,12 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo } else { ASSERT(0); } + taosMemoryFree(ops); - if (pOptr) pOptr->resultDataBlockId = pPhyNode->pOutputDataBlockDesc->dataBlockId; + if (pOptr) { + pOptr->resultDataBlockId = pPhyNode->pOutputDataBlockDesc->dataBlockId; + } + return pOptr; } diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index d56ede49f7..b6e31f9a31 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -1900,8 +1900,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->exprSupp.numOfExprs = numOfCols; pOperator->info = pInfo; pOperator->fpSet = createOperatorFpSet(doOpenIntervalAgg, doBuildIntervalResult, doStreamIntervalAgg, NULL, @@ -2691,20 +2689,26 @@ _error: return NULL; } -SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExpr, int32_t numOfCols, - SSDataBlock* pResBlock, STimeWindowAggSupp* pTwAggSup, int32_t tsSlotId, - SColumn* pStateKeyCol, SNode* pCondition, SExecTaskInfo* pTaskInfo) { +SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWinodwPhysiNode* pStateNode, + SExecTaskInfo* pTaskInfo) { SStateWindowOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStateWindowOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { goto _error; } - pInfo->stateCol = *pStateKeyCol; + int32_t num = 0; + SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &num); + SSDataBlock* pResBlock = createResDataBlock(pStateNode->window.node.pOutputDataBlockDesc); + int32_t tsSlotId = ((SColumnNode*)pStateNode->window.pTspk)->slotId; + + SColumnNode* pColNode = (SColumnNode*)((STargetNode*)pStateNode->pStateKey)->pExpr; + + pInfo->stateCol = extractColumnFromColumnNode(pColNode); pInfo->stateKey.type = pInfo->stateCol.type; pInfo->stateKey.bytes = pInfo->stateCol.bytes; pInfo->stateKey.pData = taosMemoryCalloc(1, pInfo->stateCol.bytes); - pInfo->pCondition = pCondition; + pInfo->pCondition = pStateNode->window.node.pConditions; if (pInfo->stateKey.pData == NULL) { goto _error; } @@ -2712,16 +2716,15 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SExprInf size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES; initResultSizeInfo(&pOperator->resultInfo, 4096); - int32_t code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExpr, numOfCols, keyBufSize, pTaskInfo->id.str); + int32_t code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str); if (code != TSDB_CODE_SUCCESS) { goto _error; } initBasicInfo(&pInfo->binfo, pResBlock); - initResultRowInfo(&pInfo->binfo.resultRowInfo); - pInfo->twAggSup = *pTwAggSup; + pInfo->twAggSup = (STimeWindowAggSupp){.waterMark = pStateNode->window.watermark, .calTrigger = pStateNode->window.triggerType};; initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window); pInfo->tsSlotId = tsSlotId; @@ -2729,8 +2732,6 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SExprInf pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExpr; - pOperator->exprSupp.numOfExprs = numOfCols; pOperator->pTaskInfo = pTaskInfo; pOperator->info = pInfo; @@ -2804,8 +2805,6 @@ SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionW pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->exprSupp.numOfExprs = numOfCols; pOperator->info = pInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doSessionWindowAgg, NULL, NULL, @@ -3440,8 +3439,6 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, pOperator->operatorType = pPhyNode->type; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->exprSupp.numOfExprs = numOfCols; pOperator->info = pInfo; pOperator->fpSet = @@ -3627,8 +3624,6 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->exprSupp.numOfExprs = numOfCols; pOperator->info = pInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamSessionAgg, NULL, NULL, destroyStreamSessionAggOperatorInfo, @@ -4889,8 +4884,6 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE; pOperator->blocking = true; pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.numOfExprs = numOfCols; - pOperator->exprSupp.pExprInfo = pExprInfo; pOperator->pTaskInfo = pTaskInfo; pOperator->info = pInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamStateAgg, NULL, NULL, @@ -5106,9 +5099,7 @@ static SSDataBlock* mergeAlignedIntervalAgg(SOperatorInfo* pOperator) { return (rows == 0) ? NULL : pRes; } -SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, - int32_t numOfCols, SSDataBlock* pResBlock, SInterval* pInterval, - int32_t primaryTsSlotId, SNode* pCondition, bool mergeResultBlock, +SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SMergeAlignedIntervalPhysiNode* pNode, SExecTaskInfo* pTaskInfo) { SMergeAlignedIntervalAggOperatorInfo* miaInfo = taosMemoryCalloc(1, sizeof(SMergeAlignedIntervalAggOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); @@ -5121,24 +5112,33 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, goto _error; } + int32_t num = 0; + SExprInfo* pExprInfo = createExprInfo(pNode->window.pFuncs, NULL, &num); + SSDataBlock* pResBlock = createResDataBlock(pNode->window.node.pOutputDataBlockDesc); + + SInterval interval = {.interval = pNode->interval, + .sliding = pNode->sliding, + .intervalUnit = pNode->intervalUnit, + .slidingUnit = pNode->slidingUnit, + .offset = pNode->offset, + .precision = ((SColumnNode*)pNode->window.pTspk)->node.resType.precision}; + SIntervalAggOperatorInfo* iaInfo = miaInfo->intervalAggOperatorInfo; SExprSupp* pSup = &pOperator->exprSupp; - miaInfo->pCondition = pCondition; - miaInfo->curTs = INT64_MIN; - - iaInfo->win = pTaskInfo->window; - iaInfo->inputOrder = TSDB_ORDER_ASC; - iaInfo->interval = *pInterval; - iaInfo->execModel = pTaskInfo->execModel; - iaInfo->primaryTsIndex = primaryTsSlotId; - iaInfo->binfo.mergeResultBlock = mergeResultBlock; + miaInfo->pCondition = pNode->window.node.pConditions; + miaInfo->curTs = INT64_MIN; + iaInfo->win = pTaskInfo->window; + iaInfo->inputOrder = TSDB_ORDER_ASC; + iaInfo->interval = interval; + iaInfo->execModel = pTaskInfo->execModel; + iaInfo->primaryTsIndex = ((SColumnNode*)pNode->window.pTspk)->slotId; + iaInfo->binfo.mergeResultBlock = pNode->window.mergeDataBlock; size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES; initResultSizeInfo(&pOperator->resultInfo, 4096); - int32_t code = - initAggInfo(&pOperator->exprSupp, &iaInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str); + int32_t code = initAggInfo(&pOperator->exprSupp, &iaInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str); if (code != TSDB_CODE_SUCCESS) { goto _error; } @@ -5146,7 +5146,7 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, initBasicInfo(&iaInfo->binfo, pResBlock); initExecTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &iaInfo->win); - iaInfo->timeWindowInterpo = timeWindowinterpNeeded(pSup->pCtx, numOfCols, iaInfo); + iaInfo->timeWindowInterpo = timeWindowinterpNeeded(pSup->pCtx, num, iaInfo); if (iaInfo->timeWindowInterpo) { iaInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SResultRowPosition)); } @@ -5154,14 +5154,12 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, initResultRowInfo(&iaInfo->binfo.resultRowInfo); blockDataEnsureCapacity(iaInfo->binfo.pRes, pOperator->resultInfo.capacity); - pOperator->name = "TimeMergeAlignedIntervalAggOperator"; + pOperator->name = "TimeMergeAlignedIntervalAggOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL; - pOperator->blocking = false; - pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->pTaskInfo = pTaskInfo; - pOperator->exprSupp.numOfExprs = numOfCols; - pOperator->info = miaInfo; + pOperator->blocking = false; + pOperator->status = OP_NOT_OPENED; + pOperator->pTaskInfo = pTaskInfo; + pOperator->info = miaInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, mergeAlignedIntervalAgg, NULL, NULL, destroyMergeAlignedIntervalOperatorInfo, NULL, NULL, NULL); @@ -5418,57 +5416,64 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) { return (rows == 0) ? NULL : pRes; } -SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, - SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId, - bool mergeBlock, SExecTaskInfo* pTaskInfo) { - SMergeIntervalAggOperatorInfo* miaInfo = taosMemoryCalloc(1, sizeof(SMergeIntervalAggOperatorInfo)); +SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMergeIntervalPhysiNode* pIntervalPhyNode, + SExecTaskInfo* pTaskInfo) { + SMergeIntervalAggOperatorInfo* pMergeIntervalInfo = taosMemoryCalloc(1, sizeof(SMergeIntervalAggOperatorInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); - if (miaInfo == NULL || pOperator == NULL) { + if (pMergeIntervalInfo == NULL || pOperator == NULL) { goto _error; } - miaInfo->groupIntervals = tdListNew(sizeof(SGroupTimeWindow)); + int32_t num = 0; + SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &num); + SSDataBlock* pResBlock = createResDataBlock(pIntervalPhyNode->window.node.pOutputDataBlockDesc); - SIntervalAggOperatorInfo* iaInfo = &miaInfo->intervalAggOperatorInfo; - iaInfo->win = pTaskInfo->window; - iaInfo->inputOrder = TSDB_ORDER_ASC; - iaInfo->interval = *pInterval; - iaInfo->execModel = pTaskInfo->execModel; - iaInfo->binfo.mergeResultBlock = mergeBlock; + SInterval interval = {.interval = pIntervalPhyNode->interval, + .sliding = pIntervalPhyNode->sliding, + .intervalUnit = pIntervalPhyNode->intervalUnit, + .slidingUnit = pIntervalPhyNode->slidingUnit, + .offset = pIntervalPhyNode->offset, + .precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision}; - iaInfo->primaryTsIndex = primaryTsSlotId; + pMergeIntervalInfo->groupIntervals = tdListNew(sizeof(SGroupTimeWindow)); + + SIntervalAggOperatorInfo* pIntervalInfo = &pMergeIntervalInfo->intervalAggOperatorInfo; + pIntervalInfo->win = pTaskInfo->window; + pIntervalInfo->inputOrder = TSDB_ORDER_ASC; + pIntervalInfo->interval = interval; + pIntervalInfo->execModel = pTaskInfo->execModel; + pIntervalInfo->binfo.mergeResultBlock = pIntervalPhyNode->window.mergeDataBlock; + pIntervalInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId; SExprSupp* pExprSupp = &pOperator->exprSupp; size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES; initResultSizeInfo(&pOperator->resultInfo, 4096); - int32_t code = initAggInfo(pExprSupp, &iaInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str); + int32_t code = initAggInfo(pExprSupp, &pIntervalInfo->aggSup, pExprInfo, num, keyBufSize, pTaskInfo->id.str); if (code != TSDB_CODE_SUCCESS) { goto _error; } - initBasicInfo(&iaInfo->binfo, pResBlock); - initExecTimeWindowInfo(&iaInfo->twAggSup.timeWindowData, &iaInfo->win); + initBasicInfo(&pIntervalInfo->binfo, pResBlock); + initExecTimeWindowInfo(&pIntervalInfo->twAggSup.timeWindowData, &pIntervalInfo->win); - iaInfo->timeWindowInterpo = timeWindowinterpNeeded(pExprSupp->pCtx, numOfCols, iaInfo); - if (iaInfo->timeWindowInterpo) { - iaInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SResultRowPosition)); - if (iaInfo->binfo.resultRowInfo.openWindow == NULL) { + pIntervalInfo->timeWindowInterpo = timeWindowinterpNeeded(pExprSupp->pCtx, num, pIntervalInfo); + if (pIntervalInfo->timeWindowInterpo) { + pIntervalInfo->binfo.resultRowInfo.openWindow = tdListNew(sizeof(SResultRowPosition)); + if (pIntervalInfo->binfo.resultRowInfo.openWindow == NULL) { goto _error; } } - initResultRowInfo(&iaInfo->binfo.resultRowInfo); + initResultRowInfo(&pIntervalInfo->binfo.resultRowInfo); - pOperator->name = "TimeMergeIntervalAggOperator"; + pOperator->name = "TimeMergeIntervalAggOperator"; pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL; - pOperator->blocking = false; - pOperator->status = OP_NOT_OPENED; - pOperator->exprSupp.pExprInfo = pExprInfo; - pOperator->pTaskInfo = pTaskInfo; - pOperator->exprSupp.numOfExprs = numOfCols; - pOperator->info = miaInfo; + pOperator->blocking = false; + pOperator->status = OP_NOT_OPENED; + pOperator->pTaskInfo = pTaskInfo; + pOperator->info = pMergeIntervalInfo; pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doMergeIntervalAgg, NULL, NULL, destroyMergeIntervalOperatorInfo, NULL, NULL, NULL); @@ -5481,7 +5486,7 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SExprI return pOperator; _error: - destroyMergeIntervalOperatorInfo(miaInfo); + destroyMergeIntervalOperatorInfo(pMergeIntervalInfo); taosMemoryFreeClear(pOperator); pTaskInfo->code = code; return NULL; From 0d14fa9aad03e07ce7514d822d7e4044baf49db9 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 16:06:54 +0800 Subject: [PATCH 02/47] fix(query): reset the table accesss index. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 55162d4cac..9054db2243 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -2331,7 +2331,10 @@ static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderSt uint64_t uid = pOrderCheckInfo->tableUidList[0]; pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); } else { - if (pStatus->pTableIter == NULL) { + if (pStatus->pTableIter == NULL) { // it is the last block of a new file + ASSERT(pOrderCheckInfo->currentIndex == taosHashGetSize(pStatus->pTableMap)); + + pOrderCheckInfo->currentIndex = 0; uint64_t uid = pOrderCheckInfo->tableUidList[pOrderCheckInfo->currentIndex]; pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); } From 739457ad281c500129a88e6ce586c826bc288db4 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 16:22:22 +0800 Subject: [PATCH 03/47] refactor: do some internal refactor. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 9054db2243..479e552545 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -657,9 +657,11 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SArray* int32_t total = pBlockNum->numOfLastBlocks + pBlockNum->numOfBlocks; double el = (taosGetTimestampUs() - st) / 1000.0; - tsdbDebug("load block of %d tables completed, blocks:%d in %d tables, lastBlock:%d, size:%.2f Kb, elapsed time:%.2f ms %s", - numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastBlocks, sizeInDisk - / 1000.0, el, pReader->idStr); + tsdbDebug( + "load block of %d tables completed, blocks:%d in %d tables, lastBlock:%d, block-info-size:%.2f Kb, elapsed " + "time:%.2f ms %s", + numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastBlocks, sizeInDisk / 1000.0, el, + pReader->idStr); pReader->cost.numOfBlocks += total; pReader->cost.headFileLoadTime += el; @@ -2006,9 +2008,12 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { setComposedBlockFlag(pReader, true); int64_t et = taosGetTimestampUs(); - tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64 " rows:%d, elapsed time:%.2f ms %s", - pReader, pBlockScanInfo->uid, pResBlock->info.window.skey, pResBlock->info.window.ekey, - pResBlock->info.rows, (et - st) / 1000.0, pReader->idStr); + if (pResBlock->info.rows > 0) { + tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64 + " rows:%d, elapsed time:%.2f ms %s", + pReader, pBlockScanInfo->uid, pResBlock->info.window.skey, pResBlock->info.window.ekey, + pResBlock->info.rows, (et - st) / 1000.0, pReader->idStr); + } return TSDB_CODE_SUCCESS; } From 0ec1c52a190aa6197b5f3addf83b0492e45e4f88 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 16:34:00 +0800 Subject: [PATCH 04/47] fix(query): set ascending order of check last block. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 479e552545..ff0df3a7e2 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -2309,7 +2309,7 @@ static int32_t uidComparFunc(const void* p1, const void* p2) { if (pu1 == pu2) { return 0; } else { - return (pu1 > pu2)? -1:1; + return (pu1 < pu2)? -1:1; } } From b61bab645c15f88ced379cc31c5bf50bac018e68 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 25 Aug 2022 16:49:07 +0800 Subject: [PATCH 05/47] fix http report possible except --- source/libs/transport/src/thttp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c index 98e0b8f9c9..386ea95dd7 100644 --- a/source/libs/transport/src/thttp.c +++ b/source/libs/transport/src/thttp.c @@ -175,7 +175,7 @@ static int32_t taosBuildDstAddr(const char* server, uint16_t port, struct sockad uint32_t ip = taosGetIpv4FromFqdn(server); if (ip == 0xffffffff) { terrno = TAOS_SYSTEM_ERROR(errno); - uError("http-report failed to get http server:%s ip since %s", server, terrstr()); + uError("http-report failed to get http server:%s since %s", server, errno == 0 ? "invalid http server" : terrstr()); return -1; } char buf[128] = {0}; @@ -224,6 +224,7 @@ int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32 if (ret != 0) { uError("http-report failed to connect to server, reason:%s, dst:%s:%d", uv_strerror(ret), cli->addr, cli->port); destroyHttpClient(cli); + uv_stop(loop); } uv_run(loop, UV_RUN_DEFAULT); From d8fd0b89b135e065be4a1525cbf78f7a9f1a528e Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Thu, 25 Aug 2022 16:50:31 +0800 Subject: [PATCH 06/47] fix: user permission error with sysinfo 0 --- source/dnode/mnode/impl/src/mndSma.c | 4 +- source/libs/parser/inc/sql.y | 5 +- source/libs/parser/src/parAstParser.c | 3 + source/libs/parser/src/parAuthenticator.c | 9 +- source/libs/parser/src/sql.c | 3846 ++++++++++----------- 5 files changed, 1911 insertions(+), 1956 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 2fb934aaad..e66dabc16d 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -65,8 +65,8 @@ int32_t mndInitSma(SMnode *pMnode) { mndSetMsgHandle(pMnode, TDMT_MND_GET_INDEX, mndProcessGetSmaReq); mndSetMsgHandle(pMnode, TDMT_MND_GET_TABLE_INDEX, mndProcessGetTbSmaReq); - mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_INDEX, mndRetrieveSma); - mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_INDEX, mndCancelGetNextSma); + mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_SMAS, mndRetrieveSma); + mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_SMAS, mndCancelGetNextSma); return sdbSetTable(pMnode->pSdb, table); } diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 56e68d8374..9bff061d02 100644 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -495,12 +495,9 @@ bufsize_opt(A) ::= BUFSIZE NK_INTEGER(B). /************************************************ create/drop stream **************************************************/ cmd ::= CREATE STREAM not_exists_opt(E) stream_name(A) - stream_options(B) into_opt(C) AS query_expression(D). { pCxt->pRootNode = createCreateStreamStmt(pCxt, E, &A, C, B, D); } + stream_options(B) INTO full_table_name(C) AS query_expression(D). { pCxt->pRootNode = createCreateStreamStmt(pCxt, E, &A, C, B, D); } cmd ::= DROP STREAM exists_opt(A) stream_name(B). { pCxt->pRootNode = createDropStreamStmt(pCxt, A, &B); } -into_opt(A) ::= . { A = NULL; } -into_opt(A) ::= INTO full_table_name(B). { A = B; } - stream_options(A) ::= . { A = createStreamOptions(pCxt); } stream_options(A) ::= stream_options(B) TRIGGER AT_ONCE. { ((SStreamOptions*)B)->triggerType = STREAM_TRIGGER_AT_ONCE; A = B; } stream_options(A) ::= stream_options(B) TRIGGER WINDOW_CLOSE. { ((SStreamOptions*)B)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; A = B; } diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c index ffa7729745..82b5842663 100644 --- a/source/libs/parser/src/parAstParser.c +++ b/source/libs/parser/src/parAstParser.c @@ -464,6 +464,9 @@ static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShow if (TSDB_CODE_SUCCESS == code) { code = reserveDbCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pCxt->pMetaCache); } + if (TSDB_CODE_SUCCESS == code) { + code = reserveUserAuthInCacheExt(pCxt->pParseCxt->pUser, &name, AUTH_TYPE_READ, pCxt->pMetaCache); + } return code; } diff --git a/source/libs/parser/src/parAuthenticator.c b/source/libs/parser/src/parAuthenticator.c index fc76d8ffc6..d9a5761d99 100644 --- a/source/libs/parser/src/parAuthenticator.c +++ b/source/libs/parser/src/parAuthenticator.c @@ -96,6 +96,10 @@ static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) { return code; } +static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) { + return checkAuth(pCxt, pStmt->dbName, AUTH_TYPE_READ); +} + static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) { switch (nodeType(pStmt)) { case QUERY_NODE_SET_OPERATOR: @@ -118,11 +122,14 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) { case QUERY_NODE_SHOW_LICENCES_STMT: case QUERY_NODE_SHOW_VGROUPS_STMT: case QUERY_NODE_SHOW_VARIABLES_STMT: - case QUERY_NODE_SHOW_TRANSACTIONS_STMT: + case QUERY_NODE_SHOW_CREATE_DATABASE_STMT: case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: case QUERY_NODE_SHOW_VNODES_STMT: case QUERY_NODE_SHOW_SCORES_STMT: return !pCxt->pParseCxt->enableSysInfo ? TSDB_CODE_PAR_PERMISSION_DENIED : TSDB_CODE_SUCCESS; + case QUERY_NODE_SHOW_CREATE_TABLE_STMT: + case QUERY_NODE_SHOW_CREATE_STABLE_STMT: + return authShowCreateTable(pCxt, (SShowCreateTableStmt*)pStmt); default: break; } diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c index c820e955d7..c4bd1aff04 100644 --- a/source/libs/parser/src/sql.c +++ b/source/libs/parser/src/sql.c @@ -104,26 +104,26 @@ #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 427 +#define YYNOCODE 426 #define YYACTIONTYPE unsigned short int #define ParseTOKENTYPE SToken typedef union { int yyinit; ParseTOKENTYPE yy0; - SAlterOption yy95; - EOperatorType yy198; - EOrder yy204; - int8_t yy215; - ENullOrder yy277; - bool yy313; - int64_t yy473; - SNodeList* yy544; - SToken yy617; - EJoinType yy708; - SDataType yy784; - EFillMode yy816; - SNode* yy840; - int32_t yy844; + SAlterOption yy5; + int8_t yy59; + int64_t yy69; + EJoinType yy156; + SNodeList* yy172; + EFillMode yy186; + SToken yy209; + int32_t yy232; + SNode* yy272; + bool yy293; + EOperatorType yy392; + ENullOrder yy493; + SDataType yy616; + EOrder yy818; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -140,16 +140,16 @@ typedef union { #define ParseCTX_STORE #define YYFALLBACK 1 #define YYNSTATE 667 -#define YYNRULE 491 +#define YYNRULE 489 #define YYNTOKEN 305 #define YY_MAX_SHIFT 666 -#define YY_MIN_SHIFTREDUCE 973 -#define YY_MAX_SHIFTREDUCE 1463 -#define YY_ERROR_ACTION 1464 -#define YY_ACCEPT_ACTION 1465 -#define YY_NO_ACTION 1466 -#define YY_MIN_REDUCE 1467 -#define YY_MAX_REDUCE 1957 +#define YY_MIN_SHIFTREDUCE 972 +#define YY_MAX_SHIFTREDUCE 1460 +#define YY_ERROR_ACTION 1461 +#define YY_ACCEPT_ACTION 1462 +#define YY_NO_ACTION 1463 +#define YY_MIN_REDUCE 1464 +#define YY_MAX_REDUCE 1952 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -216,694 +216,650 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2548) +#define YY_ACTTAB_COUNT (2259) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 526, 30, 261, 526, 549, 433, 526, 434, 1502, 11, - /* 10 */ 10, 117, 39, 37, 55, 1653, 1654, 117, 471, 378, - /* 20 */ 339, 1468, 1264, 1006, 476, 1023, 1290, 1022, 1607, 1791, - /* 30 */ 1598, 1607, 127, 1340, 1607, 1262, 441, 552, 434, 1502, - /* 40 */ 469, 1775, 107, 1779, 1290, 106, 105, 104, 103, 102, - /* 50 */ 101, 100, 99, 98, 1775, 1024, 1335, 1809, 150, 64, - /* 60 */ 1935, 14, 1567, 1010, 1011, 553, 1771, 1777, 1270, 450, - /* 70 */ 1761, 125, 577, 165, 39, 37, 1403, 1932, 571, 1771, - /* 80 */ 1777, 328, 339, 1529, 1264, 551, 161, 1877, 1878, 1, - /* 90 */ 1882, 571, 1659, 479, 478, 1340, 1823, 1262, 1376, 327, - /* 100 */ 95, 1792, 580, 1794, 1795, 576, 496, 571, 1657, 344, - /* 110 */ 1869, 663, 1652, 1654, 330, 1865, 160, 513, 1335, 494, - /* 120 */ 1935, 492, 1289, 14, 325, 1342, 1343, 1705, 164, 543, - /* 130 */ 1270, 1161, 1162, 1934, 33, 32, 1895, 1932, 40, 38, - /* 140 */ 36, 35, 34, 148, 63, 1479, 640, 639, 638, 637, + /* 0 */ 433, 1930, 434, 1499, 1593, 441, 526, 434, 1499, 513, + /* 10 */ 30, 260, 39, 37, 1929, 326, 325, 117, 1927, 1702, + /* 20 */ 339, 1465, 1261, 146, 471, 40, 38, 36, 35, 34, + /* 30 */ 1786, 552, 1606, 1337, 1604, 1259, 344, 552, 1287, 1649, + /* 40 */ 1651, 378, 107, 1774, 526, 106, 105, 104, 103, 102, + /* 50 */ 101, 100, 99, 98, 1770, 117, 1332, 432, 1804, 64, + /* 60 */ 436, 14, 476, 36, 35, 34, 553, 148, 1267, 1476, + /* 70 */ 450, 1756, 1604, 577, 39, 37, 1400, 1595, 1766, 1772, + /* 80 */ 328, 1930, 339, 1526, 1261, 1804, 217, 1286, 1770, 1, + /* 90 */ 571, 1005, 1656, 542, 164, 1337, 1818, 1259, 1927, 327, + /* 100 */ 95, 1787, 580, 1789, 1790, 576, 43, 571, 1654, 158, + /* 110 */ 1864, 663, 1766, 1772, 330, 1860, 159, 513, 1332, 63, + /* 120 */ 1930, 78, 1643, 14, 571, 1339, 1340, 1703, 163, 541, + /* 130 */ 1267, 1009, 1010, 165, 33, 32, 1890, 1927, 40, 38, + /* 140 */ 36, 35, 34, 543, 63, 63, 640, 639, 638, 637, /* 150 */ 349, 2, 636, 635, 128, 630, 629, 628, 627, 626, /* 160 */ 625, 624, 139, 620, 619, 618, 348, 347, 615, 614, - /* 170 */ 1265, 107, 1263, 663, 106, 105, 104, 103, 102, 101, - /* 180 */ 100, 99, 98, 1809, 36, 35, 34, 1342, 1343, 224, - /* 190 */ 225, 542, 384, 1268, 1269, 613, 1317, 1318, 1320, 1321, - /* 200 */ 1322, 1323, 1324, 1325, 573, 569, 1333, 1334, 1336, 1337, - /* 210 */ 1338, 1339, 1341, 1344, 1467, 1288, 1434, 33, 32, 482, - /* 220 */ 481, 40, 38, 36, 35, 34, 123, 168, 541, 303, - /* 230 */ 1465, 223, 1265, 84, 1263, 1264, 477, 480, 116, 115, - /* 240 */ 114, 113, 112, 111, 110, 109, 108, 305, 1262, 1023, - /* 250 */ 516, 1022, 22, 174, 1600, 1268, 1269, 1490, 1317, 1318, - /* 260 */ 1320, 1321, 1322, 1323, 1324, 1325, 573, 569, 1333, 1334, - /* 270 */ 1336, 1337, 1338, 1339, 1341, 1344, 39, 37, 1489, 1024, - /* 280 */ 538, 1270, 168, 526, 339, 71, 1264, 1488, 70, 354, - /* 290 */ 1244, 1245, 1708, 1791, 170, 211, 512, 1340, 1761, 1262, - /* 300 */ 1119, 602, 601, 600, 1123, 599, 1125, 1126, 598, 1128, - /* 310 */ 595, 1607, 1134, 592, 1136, 1137, 589, 586, 1935, 1761, - /* 320 */ 1335, 1809, 1584, 1270, 663, 14, 1659, 1935, 1761, 553, - /* 330 */ 1935, 166, 1270, 343, 1761, 1932, 577, 1935, 39, 37, - /* 340 */ 1933, 487, 1657, 165, 1932, 552, 339, 1932, 1264, 549, - /* 350 */ 165, 76, 305, 2, 1932, 516, 497, 544, 539, 1340, - /* 360 */ 1823, 1262, 1698, 159, 95, 1792, 580, 1794, 1795, 576, - /* 370 */ 210, 571, 63, 173, 1869, 663, 1646, 127, 330, 1865, - /* 380 */ 160, 552, 1335, 1265, 490, 1263, 419, 605, 484, 1342, - /* 390 */ 1343, 33, 32, 209, 1270, 40, 38, 36, 35, 34, - /* 400 */ 1896, 634, 632, 39, 37, 1345, 1268, 1269, 1487, 91, - /* 410 */ 622, 339, 1791, 1264, 42, 8, 125, 40, 38, 36, - /* 420 */ 35, 34, 124, 611, 1340, 58, 1262, 1596, 57, 49, - /* 430 */ 1599, 162, 1877, 1878, 1265, 1882, 1263, 663, 178, 177, - /* 440 */ 1809, 352, 137, 136, 608, 607, 606, 1335, 575, 1761, - /* 450 */ 43, 1342, 1343, 1761, 316, 577, 1486, 1268, 1269, 1270, - /* 460 */ 1317, 1318, 1320, 1321, 1322, 1323, 1324, 1325, 573, 569, - /* 470 */ 1333, 1334, 1336, 1337, 1338, 1339, 1341, 1344, 63, 1823, - /* 480 */ 9, 74, 1935, 294, 1792, 580, 1794, 1795, 576, 574, - /* 490 */ 571, 568, 1841, 1289, 122, 165, 1265, 1761, 1263, 1932, - /* 500 */ 33, 32, 663, 1602, 40, 38, 36, 35, 34, 317, - /* 510 */ 168, 315, 314, 1485, 473, 351, 1342, 1343, 475, 1268, - /* 520 */ 1269, 1291, 1317, 1318, 1320, 1321, 1322, 1323, 1324, 1325, - /* 530 */ 573, 569, 1333, 1334, 1336, 1337, 1338, 1339, 1341, 1344, - /* 540 */ 474, 1010, 1011, 33, 32, 1460, 1364, 40, 38, 36, - /* 550 */ 35, 34, 168, 168, 1761, 526, 1935, 1592, 377, 146, - /* 560 */ 376, 1265, 63, 1263, 26, 1532, 382, 168, 1610, 165, - /* 570 */ 33, 32, 217, 1932, 40, 38, 36, 35, 34, 218, - /* 580 */ 1484, 1791, 1414, 1607, 1268, 1269, 1594, 1317, 1318, 1320, - /* 590 */ 1321, 1322, 1323, 1324, 1325, 573, 569, 1333, 1334, 1336, - /* 600 */ 1337, 1338, 1339, 1341, 1344, 39, 37, 77, 27, 1809, - /* 610 */ 498, 1884, 63, 339, 78, 1264, 168, 578, 1369, 1483, - /* 620 */ 505, 1761, 1761, 373, 577, 1302, 1340, 28, 1262, 482, - /* 630 */ 481, 1482, 1459, 33, 32, 1881, 123, 40, 38, 36, - /* 640 */ 35, 34, 375, 371, 438, 1590, 477, 480, 1823, 1335, - /* 650 */ 1287, 1935, 96, 1792, 580, 1794, 1795, 576, 253, 571, - /* 660 */ 1761, 1270, 1869, 513, 165, 1481, 1868, 1865, 1932, 1081, - /* 670 */ 33, 32, 1761, 1706, 40, 38, 36, 35, 34, 666, - /* 680 */ 33, 32, 9, 526, 40, 38, 36, 35, 34, 1478, - /* 690 */ 1477, 33, 32, 268, 383, 40, 38, 36, 35, 34, - /* 700 */ 168, 1704, 1083, 300, 663, 432, 1761, 157, 436, 1698, - /* 710 */ 214, 1607, 656, 652, 648, 644, 266, 1582, 1342, 1343, - /* 720 */ 176, 33, 32, 307, 572, 40, 38, 36, 35, 34, - /* 730 */ 1761, 1761, 39, 37, 526, 604, 526, 302, 1476, 1287, - /* 740 */ 339, 549, 1264, 526, 307, 389, 412, 404, 92, 424, - /* 750 */ 168, 231, 1302, 1340, 405, 1262, 440, 1585, 74, 436, - /* 760 */ 1362, 1407, 1607, 1265, 1607, 1263, 397, 1289, 425, 127, - /* 770 */ 399, 1607, 1475, 1703, 1779, 300, 1335, 1889, 1396, 1761, - /* 780 */ 1603, 1362, 44, 4, 523, 1775, 1268, 1269, 1270, 1317, - /* 790 */ 1318, 1320, 1321, 1322, 1323, 1324, 1325, 573, 569, 1333, - /* 800 */ 1334, 1336, 1337, 1338, 1339, 1341, 1344, 390, 125, 2, - /* 810 */ 1771, 1777, 334, 1761, 1363, 7, 220, 450, 611, 386, - /* 820 */ 90, 526, 571, 163, 1877, 1878, 1659, 1882, 1424, 145, - /* 830 */ 87, 663, 448, 312, 1236, 1363, 213, 137, 136, 608, - /* 840 */ 607, 606, 1657, 1480, 1884, 1342, 1343, 423, 1474, 1607, + /* 170 */ 1262, 107, 1260, 663, 106, 105, 104, 103, 102, 101, + /* 180 */ 100, 99, 98, 440, 1775, 1287, 436, 1339, 1340, 223, + /* 190 */ 224, 11, 10, 1265, 1266, 1770, 1314, 1315, 1317, 1318, + /* 200 */ 1319, 1320, 1321, 1322, 573, 569, 1330, 1331, 1333, 1334, + /* 210 */ 1335, 1336, 1338, 1341, 1464, 496, 1431, 33, 32, 1766, + /* 220 */ 1772, 40, 38, 36, 35, 34, 526, 167, 494, 150, + /* 230 */ 492, 571, 1262, 1564, 1260, 1261, 210, 55, 116, 115, + /* 240 */ 114, 113, 112, 111, 110, 109, 108, 305, 1259, 63, + /* 250 */ 516, 1701, 22, 300, 1604, 1265, 1266, 167, 1314, 1315, + /* 260 */ 1317, 1318, 1319, 1320, 1321, 1322, 573, 569, 1330, 1331, + /* 270 */ 1333, 1334, 1335, 1336, 1338, 1341, 39, 37, 1650, 1651, + /* 280 */ 1373, 1267, 167, 167, 339, 552, 1261, 613, 1286, 49, + /* 290 */ 1160, 1161, 76, 305, 1786, 1487, 516, 1337, 1421, 1259, + /* 300 */ 1118, 602, 601, 600, 1122, 599, 1124, 1125, 598, 1127, + /* 310 */ 595, 342, 1133, 592, 1135, 1136, 589, 586, 1285, 146, + /* 320 */ 1332, 1581, 1804, 173, 663, 14, 479, 478, 1606, 377, + /* 330 */ 553, 376, 1267, 1656, 1930, 1756, 1756, 577, 39, 37, + /* 340 */ 312, 535, 1419, 1420, 1422, 1423, 339, 1928, 1261, 1654, + /* 350 */ 1705, 1927, 84, 2, 42, 71, 1656, 63, 70, 1337, + /* 360 */ 1818, 1259, 1267, 343, 95, 1787, 580, 1789, 1790, 576, + /* 370 */ 605, 571, 1654, 1597, 1864, 663, 345, 1589, 330, 1860, + /* 380 */ 159, 1288, 1332, 1262, 146, 1260, 1022, 167, 1021, 1339, + /* 390 */ 1340, 33, 32, 1606, 1267, 40, 38, 36, 35, 34, + /* 400 */ 1891, 1930, 384, 39, 37, 1342, 1265, 1266, 1486, 1485, + /* 410 */ 611, 339, 1786, 1261, 165, 8, 1023, 438, 1927, 634, + /* 420 */ 632, 1080, 611, 1284, 1337, 622, 1259, 167, 549, 137, + /* 430 */ 136, 608, 607, 606, 1262, 1695, 1260, 663, 1484, 303, + /* 440 */ 1804, 137, 136, 608, 607, 606, 172, 1332, 575, 1756, + /* 450 */ 1756, 1339, 1340, 1756, 1082, 577, 127, 1265, 1266, 1267, + /* 460 */ 1314, 1315, 1317, 1318, 1319, 1320, 1321, 1322, 573, 569, + /* 470 */ 1330, 1331, 1333, 1334, 1335, 1336, 1338, 1341, 1818, 1756, + /* 480 */ 9, 1591, 293, 1787, 580, 1789, 1790, 576, 574, 571, + /* 490 */ 568, 1836, 167, 74, 125, 167, 1262, 222, 1260, 33, + /* 500 */ 32, 1529, 663, 40, 38, 36, 35, 34, 551, 160, + /* 510 */ 1872, 1873, 1587, 1877, 1483, 1600, 1339, 1340, 252, 1265, + /* 520 */ 1266, 1579, 1314, 1315, 1317, 1318, 1319, 1320, 1321, 1322, + /* 530 */ 573, 569, 1330, 1331, 1333, 1334, 1335, 1336, 1338, 1341, + /* 540 */ 1700, 526, 300, 33, 32, 1457, 91, 40, 38, 36, + /* 550 */ 35, 34, 169, 167, 316, 1756, 1241, 1242, 623, 124, + /* 560 */ 1576, 1262, 1879, 1260, 26, 482, 481, 1596, 1462, 1604, + /* 570 */ 33, 32, 123, 1582, 40, 38, 36, 35, 34, 213, + /* 580 */ 1786, 1411, 477, 480, 1265, 1266, 1876, 1314, 1315, 1317, + /* 590 */ 1318, 1319, 1320, 1321, 1322, 573, 569, 1330, 1331, 1333, + /* 600 */ 1334, 1335, 1336, 1338, 1341, 39, 37, 475, 1804, 317, + /* 610 */ 146, 315, 314, 339, 473, 1261, 578, 1361, 475, 1607, + /* 620 */ 549, 1756, 611, 577, 28, 1299, 1337, 354, 1259, 474, + /* 630 */ 33, 32, 1456, 450, 40, 38, 36, 35, 34, 538, + /* 640 */ 474, 137, 136, 608, 607, 606, 1818, 1695, 127, 1332, + /* 650 */ 96, 1787, 580, 1789, 1790, 576, 572, 571, 175, 74, + /* 660 */ 1864, 1267, 526, 609, 1863, 1860, 1647, 1930, 554, 512, + /* 670 */ 33, 32, 122, 382, 40, 38, 36, 35, 34, 27, + /* 680 */ 164, 1599, 9, 1482, 1927, 1022, 125, 1021, 7, 1366, + /* 690 */ 1604, 33, 32, 1481, 1565, 40, 38, 36, 35, 34, + /* 700 */ 469, 250, 1872, 548, 663, 547, 33, 32, 1930, 1930, + /* 710 */ 40, 38, 36, 35, 34, 1023, 544, 539, 1339, 1340, + /* 720 */ 526, 166, 164, 307, 1756, 1927, 1927, 135, 487, 1404, + /* 730 */ 526, 383, 39, 37, 1756, 1286, 1480, 302, 1879, 1284, + /* 740 */ 339, 389, 1261, 497, 307, 526, 412, 604, 1604, 424, + /* 750 */ 526, 549, 1299, 1337, 1477, 1259, 404, 209, 1604, 61, + /* 760 */ 1359, 405, 1875, 1262, 373, 1260, 397, 1479, 425, 1478, + /* 770 */ 399, 490, 255, 1604, 54, 484, 1332, 1756, 1604, 127, + /* 780 */ 208, 1359, 1475, 375, 371, 419, 1265, 1266, 1267, 1314, + /* 790 */ 1315, 1317, 1318, 1319, 1320, 1321, 1322, 573, 569, 1330, + /* 800 */ 1331, 1333, 1334, 1335, 1336, 1338, 1341, 390, 1756, 2, + /* 810 */ 1756, 1397, 58, 526, 1360, 57, 1879, 125, 505, 386, + /* 820 */ 1289, 33, 32, 1756, 448, 40, 38, 36, 35, 34, + /* 830 */ 1474, 663, 161, 1872, 1873, 1360, 1877, 177, 176, 1505, + /* 840 */ 1874, 1604, 1347, 1009, 1010, 1339, 1340, 423, 1286, 1580, /* 850 */ 418, 417, 416, 415, 414, 411, 410, 409, 408, 407, - /* 860 */ 403, 402, 401, 400, 394, 393, 392, 391, 1880, 388, - /* 870 */ 387, 535, 1422, 1423, 1425, 1426, 29, 337, 1357, 1358, - /* 880 */ 1359, 1360, 1361, 1365, 1366, 1367, 1368, 1350, 61, 1761, - /* 890 */ 1265, 609, 1263, 1289, 1650, 1935, 1400, 29, 337, 1357, - /* 900 */ 1358, 1359, 1360, 1361, 1365, 1366, 1367, 1368, 166, 1583, - /* 910 */ 1791, 1473, 1932, 1268, 1269, 1472, 1317, 1318, 1320, 1321, - /* 920 */ 1322, 1323, 1324, 1325, 573, 569, 1333, 1334, 1336, 1337, - /* 930 */ 1338, 1339, 1341, 1344, 623, 147, 1579, 1791, 1809, 526, - /* 940 */ 279, 611, 610, 256, 1319, 1650, 578, 1884, 1471, 1470, - /* 950 */ 449, 1761, 1761, 577, 277, 60, 1761, 475, 59, 1292, - /* 960 */ 137, 136, 608, 607, 606, 1809, 554, 1607, 1289, 613, - /* 970 */ 1568, 1879, 135, 578, 181, 429, 427, 1823, 1761, 474, - /* 980 */ 577, 94, 1792, 580, 1794, 1795, 576, 536, 571, 1761, - /* 990 */ 1761, 1869, 1780, 554, 468, 306, 1865, 273, 53, 509, - /* 1000 */ 1637, 1659, 1396, 1775, 1823, 526, 63, 1935, 94, 1792, - /* 1010 */ 580, 1794, 1795, 576, 526, 571, 1604, 1658, 1869, 54, - /* 1020 */ 167, 1748, 306, 1865, 1932, 1736, 1519, 202, 1771, 1777, - /* 1030 */ 200, 336, 335, 1607, 1935, 1462, 1463, 558, 526, 526, - /* 1040 */ 571, 1278, 1607, 1273, 93, 526, 526, 165, 483, 506, - /* 1050 */ 510, 1932, 1340, 561, 1271, 326, 228, 522, 526, 204, - /* 1060 */ 526, 1791, 203, 146, 499, 526, 1607, 1607, 361, 524, - /* 1070 */ 1319, 525, 1609, 1607, 1607, 1335, 262, 41, 222, 68, - /* 1080 */ 67, 381, 342, 526, 172, 1272, 1607, 1270, 1607, 1809, - /* 1090 */ 146, 131, 245, 1607, 346, 206, 233, 578, 205, 1609, - /* 1100 */ 301, 567, 1761, 369, 577, 367, 363, 359, 356, 353, - /* 1110 */ 345, 1607, 1782, 208, 134, 135, 207, 1810, 146, 1514, - /* 1120 */ 1399, 1512, 51, 1791, 1213, 226, 237, 1609, 1823, 556, - /* 1130 */ 566, 51, 95, 1792, 580, 1794, 1795, 576, 519, 571, - /* 1140 */ 41, 485, 1869, 488, 168, 1319, 330, 1865, 1948, 11, - /* 1150 */ 10, 1809, 616, 41, 617, 1784, 350, 1903, 584, 578, - /* 1160 */ 134, 230, 1112, 1503, 1761, 1647, 577, 135, 119, 1421, - /* 1170 */ 134, 1899, 550, 240, 1069, 1791, 1067, 255, 1370, 250, - /* 1180 */ 1276, 258, 260, 3, 5, 355, 313, 1326, 1050, 1279, - /* 1190 */ 1823, 1274, 360, 1229, 95, 1792, 580, 1794, 1795, 576, - /* 1200 */ 272, 571, 269, 1809, 1869, 1140, 1508, 1144, 330, 1865, - /* 1210 */ 1948, 578, 1282, 1284, 1151, 1149, 1761, 138, 577, 1926, - /* 1220 */ 175, 1051, 1275, 1287, 569, 1333, 1334, 1336, 1337, 1338, - /* 1230 */ 1339, 1791, 385, 1354, 406, 1700, 413, 421, 420, 1293, - /* 1240 */ 559, 1791, 1823, 422, 426, 431, 95, 1792, 580, 1794, - /* 1250 */ 1795, 576, 428, 571, 658, 439, 1869, 430, 562, 1809, - /* 1260 */ 330, 1865, 1948, 1295, 442, 443, 184, 578, 1294, 1809, - /* 1270 */ 186, 1888, 1761, 1296, 577, 444, 445, 578, 189, 447, - /* 1280 */ 191, 72, 1761, 73, 577, 451, 470, 554, 195, 472, - /* 1290 */ 1791, 304, 1597, 199, 118, 1593, 1741, 554, 1823, 501, - /* 1300 */ 201, 140, 286, 1792, 580, 1794, 1795, 576, 1823, 571, - /* 1310 */ 141, 1595, 286, 1792, 580, 1794, 1795, 576, 1809, 571, - /* 1320 */ 1591, 142, 143, 212, 270, 500, 578, 215, 1935, 507, - /* 1330 */ 504, 1761, 511, 577, 322, 219, 534, 514, 1935, 132, - /* 1340 */ 1740, 167, 1710, 520, 517, 1932, 133, 324, 81, 521, - /* 1350 */ 1791, 165, 1292, 530, 271, 1932, 83, 1823, 1608, 235, - /* 1360 */ 1791, 96, 1792, 580, 1794, 1795, 576, 1900, 571, 537, - /* 1370 */ 239, 1869, 532, 1910, 6, 565, 1865, 533, 1809, 546, - /* 1380 */ 329, 1909, 540, 531, 529, 244, 578, 1891, 1809, 528, - /* 1390 */ 1396, 1761, 1291, 577, 154, 126, 578, 249, 563, 560, - /* 1400 */ 246, 1761, 48, 577, 1885, 247, 331, 248, 85, 1791, - /* 1410 */ 582, 1651, 1580, 265, 274, 659, 660, 1823, 1931, 662, - /* 1420 */ 52, 149, 1792, 580, 1794, 1795, 576, 1823, 571, 1951, - /* 1430 */ 153, 96, 1792, 580, 1794, 1795, 576, 1809, 571, 557, - /* 1440 */ 1755, 1869, 323, 287, 297, 578, 1866, 1850, 296, 254, - /* 1450 */ 1761, 276, 577, 564, 1754, 278, 257, 259, 65, 1753, - /* 1460 */ 1791, 1752, 66, 1749, 357, 555, 1949, 358, 1256, 1257, - /* 1470 */ 171, 362, 1747, 364, 365, 366, 1823, 1746, 1745, 368, - /* 1480 */ 295, 1792, 580, 1794, 1795, 576, 370, 571, 1809, 1744, - /* 1490 */ 372, 1743, 374, 527, 1232, 1231, 578, 1721, 1720, 379, - /* 1500 */ 380, 1761, 1201, 577, 1719, 1718, 1693, 129, 1692, 1691, - /* 1510 */ 1690, 69, 1791, 1689, 1688, 1687, 1686, 1685, 395, 396, - /* 1520 */ 1684, 398, 1791, 130, 1669, 1668, 1667, 1823, 1683, 1682, - /* 1530 */ 1681, 295, 1792, 580, 1794, 1795, 576, 1680, 571, 1791, - /* 1540 */ 1809, 1679, 1678, 1677, 1676, 1675, 1674, 1673, 578, 1672, - /* 1550 */ 1809, 1671, 1670, 1761, 1666, 577, 1665, 1664, 578, 1663, - /* 1560 */ 1203, 1662, 1661, 1761, 1660, 577, 1534, 1809, 179, 1533, - /* 1570 */ 1531, 1499, 120, 182, 180, 575, 1498, 158, 435, 1823, - /* 1580 */ 1761, 1013, 577, 290, 1792, 580, 1794, 1795, 576, 1823, - /* 1590 */ 571, 190, 1012, 149, 1792, 580, 1794, 1795, 576, 1791, - /* 1600 */ 571, 437, 1734, 183, 121, 1728, 1823, 1717, 1716, 1702, - /* 1610 */ 294, 1792, 580, 1794, 1795, 576, 1791, 571, 188, 1842, - /* 1620 */ 1586, 545, 1043, 1530, 1528, 452, 454, 1809, 1526, 453, - /* 1630 */ 456, 457, 338, 458, 1524, 578, 460, 462, 1950, 461, - /* 1640 */ 1761, 1522, 577, 465, 1809, 464, 1511, 1510, 1495, 340, - /* 1650 */ 466, 1588, 578, 1155, 1154, 1587, 50, 1761, 631, 577, - /* 1660 */ 1080, 1077, 633, 1520, 198, 1076, 1823, 1075, 1515, 1513, - /* 1670 */ 295, 1792, 580, 1794, 1795, 576, 318, 571, 319, 320, - /* 1680 */ 486, 1494, 1493, 1823, 1791, 489, 197, 295, 1792, 580, - /* 1690 */ 1794, 1795, 576, 491, 571, 1492, 493, 495, 97, 1733, - /* 1700 */ 152, 1238, 1791, 1727, 216, 467, 463, 459, 455, 196, - /* 1710 */ 56, 502, 1809, 144, 1715, 1713, 1714, 1712, 1711, 221, - /* 1720 */ 578, 1248, 15, 1709, 227, 1761, 79, 577, 1701, 503, - /* 1730 */ 1809, 321, 508, 80, 232, 518, 41, 87, 578, 229, - /* 1740 */ 47, 75, 16, 1761, 194, 577, 243, 242, 82, 25, - /* 1750 */ 17, 1823, 1436, 23, 234, 280, 1792, 580, 1794, 1795, - /* 1760 */ 576, 1791, 571, 236, 1418, 515, 238, 1782, 151, 1823, - /* 1770 */ 1420, 252, 241, 281, 1792, 580, 1794, 1795, 576, 24, - /* 1780 */ 571, 1413, 1393, 46, 1781, 86, 18, 155, 1392, 1809, - /* 1790 */ 1448, 1453, 1442, 1447, 332, 1452, 1451, 578, 333, 10, - /* 1800 */ 45, 1280, 1761, 1330, 577, 1355, 193, 187, 13, 192, - /* 1810 */ 1791, 19, 1328, 446, 1327, 156, 1826, 169, 570, 31, - /* 1820 */ 12, 20, 1310, 21, 583, 1141, 341, 1138, 1823, 185, - /* 1830 */ 587, 1791, 282, 1792, 580, 1794, 1795, 576, 1809, 571, - /* 1840 */ 585, 588, 581, 1135, 579, 590, 578, 1129, 593, 596, - /* 1850 */ 1118, 1761, 1127, 577, 591, 594, 597, 1133, 1132, 1809, - /* 1860 */ 1131, 1130, 88, 89, 263, 603, 1150, 578, 1146, 62, - /* 1870 */ 1041, 1072, 1761, 612, 577, 1071, 1070, 1823, 1068, 1066, - /* 1880 */ 1065, 289, 1792, 580, 1794, 1795, 576, 1064, 571, 1791, - /* 1890 */ 1087, 621, 264, 1062, 1061, 1060, 1059, 1058, 1823, 1791, - /* 1900 */ 1057, 1056, 291, 1792, 580, 1794, 1795, 576, 1047, 571, - /* 1910 */ 1084, 1082, 1053, 1052, 1049, 1048, 1046, 1809, 1527, 641, - /* 1920 */ 1525, 642, 643, 645, 647, 578, 1523, 1809, 649, 646, - /* 1930 */ 1761, 651, 577, 1521, 650, 578, 653, 655, 654, 1509, - /* 1940 */ 1761, 657, 577, 1491, 1003, 267, 661, 1466, 1466, 1266, - /* 1950 */ 275, 1791, 664, 1466, 665, 1466, 1823, 1466, 1466, 1466, - /* 1960 */ 283, 1792, 580, 1794, 1795, 576, 1823, 571, 1791, 1466, - /* 1970 */ 292, 1792, 580, 1794, 1795, 576, 1466, 571, 1466, 1809, - /* 1980 */ 1466, 1466, 1466, 1466, 1466, 1466, 1466, 578, 1466, 1466, - /* 1990 */ 1466, 1466, 1761, 1466, 577, 1466, 1809, 1466, 1466, 1466, - /* 2000 */ 1466, 1466, 1466, 1466, 578, 1466, 1466, 1466, 1466, 1761, - /* 2010 */ 1466, 577, 1466, 1466, 1466, 1466, 1466, 1791, 1823, 1466, - /* 2020 */ 1466, 1466, 284, 1792, 580, 1794, 1795, 576, 1466, 571, - /* 2030 */ 1466, 1466, 1466, 1466, 1791, 1823, 1466, 1466, 1466, 293, - /* 2040 */ 1792, 580, 1794, 1795, 576, 1809, 571, 1466, 1466, 1466, - /* 2050 */ 1466, 1466, 1466, 578, 1466, 1466, 1466, 1466, 1761, 1466, - /* 2060 */ 577, 1466, 1809, 1466, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2070 */ 578, 1466, 1466, 1466, 1466, 1761, 1466, 577, 1466, 1466, - /* 2080 */ 1466, 1466, 1466, 1791, 1823, 1466, 1466, 1466, 285, 1792, - /* 2090 */ 580, 1794, 1795, 576, 1466, 571, 1466, 1466, 1466, 1466, - /* 2100 */ 1466, 1823, 1466, 1466, 1466, 298, 1792, 580, 1794, 1795, - /* 2110 */ 576, 1809, 571, 1466, 1466, 1466, 1466, 1466, 1466, 578, - /* 2120 */ 1466, 1466, 1466, 1466, 1761, 1466, 577, 1466, 1466, 1466, - /* 2130 */ 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1791, 1466, 1466, - /* 2140 */ 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1791, 1466, 1466, - /* 2150 */ 1823, 1466, 1466, 1466, 299, 1792, 580, 1794, 1795, 576, - /* 2160 */ 1466, 571, 1466, 1466, 1466, 1809, 1466, 1466, 1466, 1466, - /* 2170 */ 1466, 1466, 1466, 578, 1466, 1809, 1466, 1466, 1761, 1466, - /* 2180 */ 577, 1466, 1466, 578, 1466, 1466, 1466, 1466, 1761, 1466, - /* 2190 */ 577, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1791, 1466, - /* 2200 */ 1466, 1466, 1466, 1466, 1823, 1466, 1466, 1466, 1803, 1792, - /* 2210 */ 580, 1794, 1795, 576, 1823, 571, 1791, 1466, 1802, 1792, - /* 2220 */ 580, 1794, 1795, 576, 1466, 571, 1809, 1466, 1466, 1466, - /* 2230 */ 1466, 1466, 1466, 1466, 578, 1466, 1466, 1466, 1466, 1761, - /* 2240 */ 1466, 577, 1466, 1466, 1809, 1466, 1466, 1466, 1466, 1466, - /* 2250 */ 1466, 1466, 578, 1466, 1466, 1466, 1466, 1761, 1466, 577, - /* 2260 */ 1466, 1466, 1466, 1466, 1466, 1823, 1466, 1466, 1466, 1801, - /* 2270 */ 1792, 580, 1794, 1795, 576, 1791, 571, 1466, 1466, 1466, - /* 2280 */ 1466, 1466, 1466, 1823, 1466, 1466, 1466, 310, 1792, 580, - /* 2290 */ 1794, 1795, 576, 1466, 571, 1466, 1791, 1466, 1466, 1466, - /* 2300 */ 1466, 1466, 1466, 1809, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2310 */ 1466, 578, 1466, 1466, 1466, 1466, 1761, 1466, 577, 1466, - /* 2320 */ 1466, 1466, 1466, 1466, 1809, 1466, 1466, 1466, 1466, 1466, - /* 2330 */ 1466, 1466, 578, 1466, 1466, 1466, 1466, 1761, 1466, 577, - /* 2340 */ 1466, 1466, 1823, 1466, 1466, 1466, 309, 1792, 580, 1794, - /* 2350 */ 1795, 576, 1791, 571, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2360 */ 1466, 1466, 1791, 1823, 1466, 1466, 1466, 311, 1792, 580, - /* 2370 */ 1794, 1795, 576, 1466, 571, 1466, 1466, 1466, 1466, 1466, - /* 2380 */ 1809, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 578, 1466, - /* 2390 */ 1809, 1466, 1466, 1761, 549, 577, 1466, 1466, 578, 1466, - /* 2400 */ 1466, 1466, 1466, 1761, 1466, 577, 1466, 1466, 1466, 1466, - /* 2410 */ 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1823, - /* 2420 */ 1466, 1466, 127, 308, 1792, 580, 1794, 1795, 576, 1823, - /* 2430 */ 571, 1466, 1466, 288, 1792, 580, 1794, 1795, 576, 1466, - /* 2440 */ 571, 549, 554, 1466, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2450 */ 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2460 */ 1466, 125, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 127, - /* 2470 */ 1466, 1466, 1466, 1466, 1466, 1466, 251, 1877, 548, 1466, - /* 2480 */ 547, 1466, 1466, 1935, 1466, 1466, 1466, 1466, 1466, 554, - /* 2490 */ 1466, 1466, 1466, 1466, 1466, 1466, 167, 1466, 1466, 1466, - /* 2500 */ 1932, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 125, 1466, - /* 2510 */ 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2520 */ 1466, 1466, 1466, 251, 1877, 548, 1466, 547, 1466, 1466, - /* 2530 */ 1935, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, - /* 2540 */ 1466, 1466, 1466, 165, 1466, 1466, 1466, 1932, + /* 860 */ 403, 402, 401, 400, 394, 393, 392, 391, 549, 388, + /* 870 */ 387, 1756, 1656, 616, 1473, 1393, 29, 337, 1354, 1355, + /* 880 */ 1356, 1357, 1358, 1362, 1363, 1364, 1365, 658, 1655, 468, + /* 890 */ 1262, 610, 1260, 1286, 1647, 1068, 127, 29, 337, 1354, + /* 900 */ 1355, 1356, 1357, 1358, 1362, 1363, 1364, 1365, 272, 613, + /* 910 */ 536, 1634, 1316, 1265, 1266, 1756, 1314, 1315, 1317, 1318, + /* 920 */ 1319, 1320, 1321, 1322, 573, 569, 1330, 1331, 1333, 1334, + /* 930 */ 1335, 1336, 1338, 1341, 125, 147, 1472, 1786, 561, 352, + /* 940 */ 278, 351, 1884, 1393, 1743, 482, 481, 1516, 1774, 162, + /* 950 */ 1872, 1873, 123, 1877, 276, 60, 1805, 232, 59, 1770, + /* 960 */ 526, 526, 477, 480, 1471, 1804, 44, 4, 244, 483, + /* 970 */ 145, 449, 1601, 578, 180, 429, 427, 1756, 1756, 1930, + /* 980 */ 577, 1930, 1500, 1766, 1772, 334, 1470, 1786, 1604, 1604, + /* 990 */ 526, 361, 164, 554, 164, 571, 1927, 216, 1927, 498, + /* 1000 */ 556, 499, 1469, 1818, 1468, 1756, 63, 94, 1787, 580, + /* 1010 */ 1789, 1790, 576, 526, 571, 1804, 558, 1864, 1604, 336, + /* 1020 */ 335, 306, 1860, 578, 506, 1316, 526, 1756, 1756, 1275, + /* 1030 */ 577, 201, 77, 1930, 199, 1396, 1644, 510, 526, 1930, + /* 1040 */ 1337, 1604, 1268, 1756, 93, 1756, 166, 1511, 1467, 227, + /* 1050 */ 1927, 350, 164, 1818, 1604, 1786, 1927, 95, 1787, 580, + /* 1060 */ 1789, 1790, 576, 1332, 571, 526, 1604, 1864, 41, 485, + /* 1070 */ 1316, 330, 1860, 1943, 526, 1267, 522, 53, 509, 68, + /* 1080 */ 67, 381, 1898, 1804, 171, 524, 221, 203, 526, 1756, + /* 1090 */ 202, 578, 205, 1604, 207, 204, 1756, 206, 577, 525, + /* 1100 */ 301, 1509, 1604, 369, 1894, 367, 363, 359, 356, 353, + /* 1110 */ 1270, 554, 131, 526, 1786, 1212, 1604, 1269, 566, 567, + /* 1120 */ 526, 1818, 134, 488, 261, 94, 1787, 580, 1789, 1790, + /* 1130 */ 576, 346, 571, 225, 135, 1864, 51, 550, 666, 306, + /* 1140 */ 1860, 1604, 1804, 562, 167, 236, 51, 323, 1604, 41, + /* 1150 */ 578, 1930, 267, 90, 1786, 1756, 617, 577, 41, 519, + /* 1160 */ 1777, 11, 10, 87, 164, 249, 156, 3, 1927, 229, + /* 1170 */ 254, 656, 652, 648, 644, 265, 584, 1276, 1066, 1271, + /* 1180 */ 1818, 1111, 1804, 1418, 294, 1787, 580, 1789, 1790, 576, + /* 1190 */ 578, 571, 239, 1367, 1786, 1756, 1323, 577, 1459, 1460, + /* 1200 */ 1279, 1281, 257, 1779, 259, 271, 134, 92, 135, 5, + /* 1210 */ 230, 1049, 569, 1330, 1331, 1333, 1334, 1335, 1336, 559, + /* 1220 */ 1818, 360, 1804, 1139, 95, 1787, 580, 1789, 1790, 576, + /* 1230 */ 578, 571, 268, 355, 1864, 1756, 119, 577, 330, 1860, + /* 1240 */ 1943, 134, 549, 523, 1050, 313, 1228, 1273, 174, 1921, + /* 1250 */ 385, 1351, 1284, 1143, 1272, 1150, 406, 413, 1697, 421, + /* 1260 */ 1818, 420, 422, 1786, 95, 1787, 580, 1789, 1790, 576, + /* 1270 */ 127, 571, 426, 428, 1864, 219, 430, 1290, 330, 1860, + /* 1280 */ 1943, 431, 439, 1148, 1292, 442, 183, 443, 138, 1883, + /* 1290 */ 554, 1804, 1291, 1235, 185, 212, 444, 1293, 188, 578, + /* 1300 */ 445, 190, 447, 72, 1756, 73, 577, 451, 125, 194, + /* 1310 */ 470, 472, 1594, 198, 118, 1590, 304, 1786, 200, 554, + /* 1320 */ 140, 269, 141, 250, 1872, 548, 1592, 547, 1588, 1818, + /* 1330 */ 1930, 142, 143, 285, 1787, 580, 1789, 1790, 576, 211, + /* 1340 */ 571, 500, 1736, 164, 214, 1804, 507, 1927, 504, 511, + /* 1350 */ 218, 322, 534, 578, 514, 520, 501, 1735, 1756, 1930, + /* 1360 */ 577, 132, 1707, 517, 324, 1289, 81, 1786, 521, 133, + /* 1370 */ 270, 83, 166, 554, 537, 1605, 1927, 530, 1905, 234, + /* 1380 */ 1895, 238, 6, 1818, 1786, 532, 533, 285, 1787, 580, + /* 1390 */ 1789, 1790, 576, 329, 571, 1804, 546, 531, 540, 529, + /* 1400 */ 528, 248, 1288, 578, 1393, 126, 563, 560, 1756, 48, + /* 1410 */ 577, 1880, 1804, 1930, 1904, 85, 1648, 331, 1577, 659, + /* 1420 */ 578, 582, 264, 660, 243, 1756, 164, 577, 153, 1886, + /* 1430 */ 1927, 247, 245, 1818, 1786, 246, 253, 96, 1787, 580, + /* 1440 */ 1789, 1790, 576, 1845, 571, 273, 662, 1864, 299, 275, + /* 1450 */ 1818, 565, 1860, 256, 149, 1787, 580, 1789, 1790, 576, + /* 1460 */ 1786, 571, 1804, 52, 1946, 1926, 557, 286, 296, 258, + /* 1470 */ 578, 564, 295, 1750, 277, 1756, 1749, 577, 65, 1748, + /* 1480 */ 1747, 66, 1744, 357, 358, 1253, 1254, 170, 1804, 362, + /* 1490 */ 1742, 364, 365, 527, 366, 1741, 578, 368, 555, 1944, + /* 1500 */ 1818, 1756, 1740, 577, 96, 1787, 580, 1789, 1790, 576, + /* 1510 */ 1786, 571, 370, 1739, 1864, 372, 1738, 1230, 374, 1861, + /* 1520 */ 1231, 1718, 1786, 379, 380, 1716, 1818, 1717, 1715, 1690, + /* 1530 */ 294, 1787, 580, 1789, 1790, 576, 1786, 571, 1804, 1689, + /* 1540 */ 1200, 129, 1688, 1687, 69, 1686, 578, 395, 1681, 396, + /* 1550 */ 1804, 1756, 1685, 577, 1684, 1683, 1682, 398, 578, 1680, + /* 1560 */ 1679, 1678, 1677, 1756, 1804, 577, 1676, 1675, 1674, 1673, + /* 1570 */ 1672, 1671, 575, 1670, 1669, 1668, 1818, 1756, 1667, 577, + /* 1580 */ 289, 1787, 580, 1789, 1790, 576, 130, 571, 1818, 1786, + /* 1590 */ 1666, 1665, 149, 1787, 580, 1789, 1790, 576, 1664, 571, + /* 1600 */ 1663, 1662, 1818, 1202, 1660, 1659, 293, 1787, 580, 1789, + /* 1610 */ 1790, 576, 1661, 571, 1658, 1837, 1657, 1804, 545, 1531, + /* 1620 */ 178, 1530, 338, 120, 181, 578, 196, 1528, 179, 1496, + /* 1630 */ 1756, 157, 577, 435, 1012, 437, 1011, 1945, 1495, 182, + /* 1640 */ 152, 121, 1786, 452, 453, 467, 463, 459, 455, 195, + /* 1650 */ 1731, 1725, 1714, 189, 1786, 1818, 187, 1713, 1699, 294, + /* 1660 */ 1787, 580, 1789, 1790, 576, 1583, 571, 1527, 1786, 1042, + /* 1670 */ 1804, 1525, 454, 1523, 456, 340, 458, 457, 578, 1521, + /* 1680 */ 460, 75, 1804, 1756, 193, 577, 462, 461, 1519, 464, + /* 1690 */ 578, 465, 466, 1508, 1507, 1756, 1804, 577, 1492, 1585, + /* 1700 */ 1153, 1154, 197, 1584, 578, 1079, 1074, 50, 1818, 1756, + /* 1710 */ 1517, 577, 294, 1787, 580, 1789, 1790, 576, 631, 571, + /* 1720 */ 1818, 1076, 1786, 633, 279, 1787, 580, 1789, 1790, 576, + /* 1730 */ 1075, 571, 1512, 318, 1818, 319, 1786, 1510, 280, 1787, + /* 1740 */ 580, 1789, 1790, 576, 320, 571, 192, 186, 1786, 191, + /* 1750 */ 1804, 486, 489, 446, 1491, 491, 1490, 1489, 578, 493, + /* 1760 */ 495, 97, 1730, 1756, 1804, 577, 1237, 56, 1724, 184, + /* 1770 */ 502, 1712, 578, 1710, 508, 503, 1804, 1756, 215, 577, + /* 1780 */ 1711, 1709, 321, 1708, 578, 15, 144, 220, 1818, 1756, + /* 1790 */ 1245, 577, 281, 1787, 580, 1789, 1790, 576, 1706, 571, + /* 1800 */ 1698, 226, 1818, 518, 79, 1786, 288, 1787, 580, 1789, + /* 1810 */ 1790, 576, 228, 571, 1818, 1786, 515, 80, 290, 1787, + /* 1820 */ 580, 1789, 1790, 576, 82, 571, 87, 41, 231, 23, + /* 1830 */ 47, 1786, 1433, 1804, 233, 241, 235, 1415, 237, 242, + /* 1840 */ 1417, 578, 16, 1804, 25, 1777, 1756, 151, 577, 240, + /* 1850 */ 24, 578, 46, 1410, 86, 1786, 1756, 17, 577, 1804, + /* 1860 */ 1390, 251, 1389, 1776, 154, 1450, 45, 578, 18, 1439, + /* 1870 */ 1445, 1818, 1756, 13, 577, 282, 1787, 580, 1789, 1790, + /* 1880 */ 576, 1818, 571, 1804, 1444, 291, 1787, 580, 1789, 1790, + /* 1890 */ 576, 578, 571, 332, 1449, 1448, 1756, 1818, 577, 333, + /* 1900 */ 10, 283, 1787, 580, 1789, 1790, 576, 1277, 571, 1352, + /* 1910 */ 19, 1786, 1821, 1307, 1327, 570, 155, 1325, 31, 581, + /* 1920 */ 1324, 1818, 12, 20, 168, 292, 1787, 580, 1789, 1790, + /* 1930 */ 576, 1786, 571, 21, 583, 1140, 341, 585, 579, 1804, + /* 1940 */ 1137, 587, 588, 590, 1134, 591, 593, 578, 596, 1132, + /* 1950 */ 594, 1786, 1756, 1128, 577, 1126, 1131, 597, 1117, 1804, + /* 1960 */ 1130, 88, 1149, 603, 1129, 89, 62, 578, 262, 1145, + /* 1970 */ 612, 1786, 1756, 1071, 577, 1070, 1040, 1818, 1069, 1804, + /* 1980 */ 1067, 284, 1787, 580, 1789, 1790, 576, 578, 571, 1065, + /* 1990 */ 1064, 1786, 1756, 1063, 577, 263, 1086, 1818, 1061, 1804, + /* 2000 */ 1060, 297, 1787, 580, 1789, 1790, 576, 578, 571, 621, + /* 2010 */ 1059, 1058, 1756, 1057, 577, 1056, 1055, 1818, 1083, 1804, + /* 2020 */ 1081, 298, 1787, 580, 1789, 1790, 576, 578, 571, 1052, + /* 2030 */ 1051, 1786, 1756, 1048, 577, 1047, 1046, 1818, 1045, 1524, + /* 2040 */ 641, 1798, 1787, 580, 1789, 1790, 576, 1786, 571, 642, + /* 2050 */ 643, 1522, 645, 646, 647, 1520, 649, 1818, 651, 1804, + /* 2060 */ 650, 1797, 1787, 580, 1789, 1790, 576, 578, 571, 1518, + /* 2070 */ 653, 654, 1756, 655, 577, 1804, 1506, 657, 1002, 1488, + /* 2080 */ 266, 661, 664, 578, 1263, 274, 665, 1463, 1756, 1463, + /* 2090 */ 577, 1463, 1463, 1463, 1463, 1463, 1463, 1818, 1786, 1463, + /* 2100 */ 1463, 1796, 1787, 580, 1789, 1790, 576, 1463, 571, 1463, + /* 2110 */ 1463, 1463, 1463, 1818, 1786, 1463, 1463, 310, 1787, 580, + /* 2120 */ 1789, 1790, 576, 1463, 571, 1463, 1804, 1463, 1463, 1463, + /* 2130 */ 1463, 1463, 1463, 1463, 578, 1463, 1463, 1463, 1463, 1756, + /* 2140 */ 1463, 577, 1804, 1463, 1463, 1463, 1463, 1463, 1463, 1463, + /* 2150 */ 578, 1463, 1463, 1463, 1463, 1756, 1463, 577, 1463, 1463, + /* 2160 */ 1463, 1463, 1463, 1463, 1818, 1786, 1463, 1463, 309, 1787, + /* 2170 */ 580, 1789, 1790, 576, 1463, 571, 1463, 1463, 1463, 1463, + /* 2180 */ 1818, 1786, 1463, 1463, 311, 1787, 580, 1789, 1790, 576, + /* 2190 */ 1463, 571, 1463, 1804, 1463, 1463, 1463, 1463, 1463, 1463, + /* 2200 */ 1463, 578, 1463, 1463, 1463, 1463, 1756, 1463, 577, 1804, + /* 2210 */ 1463, 1463, 1463, 1463, 1463, 1463, 1463, 578, 1463, 1463, + /* 2220 */ 1463, 1463, 1756, 1463, 577, 1463, 1463, 1463, 1463, 1463, + /* 2230 */ 1463, 1818, 1463, 1463, 1463, 308, 1787, 580, 1789, 1790, + /* 2240 */ 576, 1463, 571, 1463, 1463, 1463, 1463, 1818, 1463, 1463, + /* 2250 */ 1463, 287, 1787, 580, 1789, 1790, 576, 1463, 571, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 316, 390, 391, 316, 316, 312, 316, 314, 315, 1, - /* 10 */ 2, 327, 12, 13, 327, 350, 351, 327, 334, 364, - /* 20 */ 20, 0, 22, 4, 334, 20, 20, 22, 344, 308, - /* 30 */ 338, 344, 344, 33, 344, 35, 312, 20, 314, 315, - /* 40 */ 35, 349, 21, 338, 20, 24, 25, 26, 27, 28, - /* 50 */ 29, 30, 31, 32, 349, 50, 56, 336, 321, 4, - /* 60 */ 405, 61, 325, 44, 45, 344, 374, 375, 68, 60, - /* 70 */ 349, 383, 351, 418, 12, 13, 14, 422, 386, 374, - /* 80 */ 375, 376, 20, 0, 22, 397, 398, 399, 400, 89, - /* 90 */ 402, 386, 336, 322, 323, 33, 375, 35, 90, 343, - /* 100 */ 379, 380, 381, 382, 383, 384, 21, 386, 352, 347, - /* 110 */ 389, 111, 350, 351, 393, 394, 395, 351, 56, 34, - /* 120 */ 405, 36, 20, 61, 358, 125, 126, 361, 407, 20, - /* 130 */ 68, 125, 126, 418, 8, 9, 415, 422, 12, 13, - /* 140 */ 14, 15, 16, 307, 89, 309, 63, 64, 65, 66, + /* 0 */ 312, 404, 314, 315, 337, 312, 316, 314, 315, 351, + /* 10 */ 389, 390, 12, 13, 417, 328, 358, 327, 421, 361, + /* 20 */ 20, 0, 22, 336, 334, 12, 13, 14, 15, 16, + /* 30 */ 308, 20, 345, 33, 344, 35, 347, 20, 20, 350, + /* 40 */ 351, 364, 21, 338, 316, 24, 25, 26, 27, 28, + /* 50 */ 29, 30, 31, 32, 349, 327, 56, 313, 336, 4, + /* 60 */ 316, 61, 334, 14, 15, 16, 344, 307, 68, 309, + /* 70 */ 60, 349, 344, 351, 12, 13, 14, 338, 373, 374, + /* 80 */ 375, 404, 20, 0, 22, 336, 56, 20, 349, 89, + /* 90 */ 385, 4, 336, 344, 417, 33, 374, 35, 421, 343, + /* 100 */ 378, 379, 380, 381, 382, 383, 89, 385, 352, 335, + /* 110 */ 388, 111, 373, 374, 392, 393, 394, 351, 56, 89, + /* 120 */ 404, 91, 348, 61, 385, 125, 126, 361, 406, 380, + /* 130 */ 68, 44, 45, 417, 8, 9, 414, 421, 12, 13, + /* 140 */ 14, 15, 16, 20, 89, 89, 63, 64, 65, 66, /* 150 */ 67, 89, 69, 70, 71, 72, 73, 74, 75, 76, /* 160 */ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, /* 170 */ 170, 21, 172, 111, 24, 25, 26, 27, 28, 29, - /* 180 */ 30, 31, 32, 336, 14, 15, 16, 125, 126, 120, - /* 190 */ 121, 344, 316, 193, 194, 60, 196, 197, 198, 199, + /* 180 */ 30, 31, 32, 313, 338, 20, 316, 125, 126, 120, + /* 190 */ 121, 1, 2, 193, 194, 349, 196, 197, 198, 199, /* 200 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - /* 210 */ 210, 211, 212, 213, 0, 20, 90, 8, 9, 64, - /* 220 */ 65, 12, 13, 14, 15, 16, 71, 227, 381, 353, - /* 230 */ 305, 120, 170, 318, 172, 22, 81, 82, 24, 25, - /* 240 */ 26, 27, 28, 29, 30, 31, 32, 178, 35, 20, - /* 250 */ 181, 22, 43, 56, 339, 193, 194, 308, 196, 197, + /* 210 */ 210, 211, 212, 213, 0, 21, 90, 8, 9, 373, + /* 220 */ 374, 12, 13, 14, 15, 16, 316, 227, 34, 321, + /* 230 */ 36, 385, 170, 325, 172, 22, 121, 327, 24, 25, + /* 240 */ 26, 27, 28, 29, 30, 31, 32, 178, 35, 89, + /* 250 */ 181, 360, 43, 362, 344, 193, 194, 227, 196, 197, /* 260 */ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - /* 270 */ 208, 209, 210, 211, 212, 213, 12, 13, 308, 50, - /* 280 */ 155, 68, 227, 316, 20, 88, 22, 308, 91, 364, - /* 290 */ 179, 180, 0, 308, 327, 121, 364, 33, 349, 35, + /* 270 */ 208, 209, 210, 211, 212, 213, 12, 13, 350, 351, + /* 280 */ 90, 68, 227, 227, 20, 20, 22, 60, 20, 89, + /* 290 */ 125, 126, 177, 178, 308, 308, 181, 33, 193, 35, /* 300 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 310 */ 112, 344, 114, 115, 116, 117, 118, 119, 405, 349, - /* 320 */ 56, 336, 0, 68, 111, 61, 336, 405, 349, 344, - /* 330 */ 405, 418, 68, 343, 349, 422, 351, 405, 12, 13, - /* 340 */ 418, 4, 352, 418, 422, 20, 20, 422, 22, 316, - /* 350 */ 418, 177, 178, 89, 422, 181, 19, 232, 233, 33, - /* 360 */ 375, 35, 344, 335, 379, 380, 381, 382, 383, 384, - /* 370 */ 33, 386, 89, 355, 389, 111, 348, 344, 393, 394, - /* 380 */ 395, 20, 56, 170, 47, 172, 77, 100, 51, 125, - /* 390 */ 126, 8, 9, 56, 68, 12, 13, 14, 15, 16, - /* 400 */ 415, 322, 323, 12, 13, 14, 193, 194, 308, 318, - /* 410 */ 68, 20, 308, 22, 89, 89, 383, 12, 13, 14, - /* 420 */ 15, 16, 331, 101, 33, 88, 35, 337, 91, 89, - /* 430 */ 339, 398, 399, 400, 170, 402, 172, 111, 129, 130, - /* 440 */ 336, 364, 120, 121, 122, 123, 124, 56, 344, 349, - /* 450 */ 89, 125, 126, 349, 37, 351, 308, 193, 194, 68, + /* 310 */ 112, 328, 114, 115, 116, 117, 118, 119, 20, 336, + /* 320 */ 56, 0, 336, 56, 111, 61, 322, 323, 345, 169, + /* 330 */ 344, 171, 68, 336, 404, 349, 349, 351, 12, 13, + /* 340 */ 343, 236, 237, 238, 239, 240, 20, 417, 22, 352, + /* 350 */ 0, 421, 318, 89, 89, 88, 336, 89, 91, 33, + /* 360 */ 374, 35, 68, 343, 378, 379, 380, 381, 382, 383, + /* 370 */ 100, 385, 352, 339, 388, 111, 328, 337, 392, 393, + /* 380 */ 394, 20, 56, 170, 336, 172, 20, 227, 22, 125, + /* 390 */ 126, 8, 9, 345, 68, 12, 13, 14, 15, 16, + /* 400 */ 414, 404, 316, 12, 13, 14, 193, 194, 308, 308, + /* 410 */ 101, 20, 308, 22, 417, 89, 50, 14, 421, 322, + /* 420 */ 323, 35, 101, 20, 33, 68, 35, 227, 316, 120, + /* 430 */ 121, 122, 123, 124, 170, 344, 172, 111, 308, 353, + /* 440 */ 336, 120, 121, 122, 123, 124, 355, 56, 344, 349, + /* 450 */ 349, 125, 126, 349, 68, 351, 344, 193, 194, 68, /* 460 */ 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - /* 470 */ 206, 207, 208, 209, 210, 211, 212, 213, 89, 375, - /* 480 */ 89, 320, 405, 379, 380, 381, 382, 383, 384, 385, - /* 490 */ 386, 387, 388, 20, 333, 418, 170, 349, 172, 422, - /* 500 */ 8, 9, 111, 342, 12, 13, 14, 15, 16, 92, - /* 510 */ 227, 94, 95, 308, 97, 364, 125, 126, 101, 193, - /* 520 */ 194, 20, 196, 197, 198, 199, 200, 201, 202, 203, + /* 470 */ 206, 207, 208, 209, 210, 211, 212, 213, 374, 349, + /* 480 */ 89, 337, 378, 379, 380, 381, 382, 383, 384, 385, + /* 490 */ 386, 387, 227, 320, 382, 227, 170, 120, 172, 8, + /* 500 */ 9, 0, 111, 12, 13, 14, 15, 16, 396, 397, + /* 510 */ 398, 399, 337, 401, 308, 342, 125, 126, 157, 193, + /* 520 */ 194, 0, 196, 197, 198, 199, 200, 201, 202, 203, /* 530 */ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - /* 540 */ 123, 44, 45, 8, 9, 162, 152, 12, 13, 14, - /* 550 */ 15, 16, 227, 227, 349, 316, 405, 337, 169, 336, - /* 560 */ 171, 170, 89, 172, 2, 0, 327, 227, 345, 418, - /* 570 */ 8, 9, 56, 422, 12, 13, 14, 15, 16, 56, - /* 580 */ 308, 308, 90, 344, 193, 194, 337, 196, 197, 198, + /* 540 */ 360, 316, 362, 8, 9, 162, 318, 12, 13, 14, + /* 550 */ 15, 16, 327, 227, 37, 349, 179, 180, 324, 331, + /* 560 */ 326, 170, 376, 172, 2, 64, 65, 339, 305, 344, + /* 570 */ 8, 9, 71, 0, 12, 13, 14, 15, 16, 337, + /* 580 */ 308, 90, 81, 82, 193, 194, 400, 196, 197, 198, /* 590 */ 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - /* 600 */ 209, 210, 211, 212, 213, 12, 13, 91, 214, 336, - /* 610 */ 364, 377, 89, 20, 91, 22, 227, 344, 224, 308, - /* 620 */ 368, 349, 349, 165, 351, 90, 33, 2, 35, 64, - /* 630 */ 65, 308, 249, 8, 9, 401, 71, 12, 13, 14, - /* 640 */ 15, 16, 184, 185, 14, 337, 81, 82, 375, 56, - /* 650 */ 20, 405, 379, 380, 381, 382, 383, 384, 157, 386, - /* 660 */ 349, 68, 389, 351, 418, 308, 393, 394, 422, 35, - /* 670 */ 8, 9, 349, 361, 12, 13, 14, 15, 16, 19, - /* 680 */ 8, 9, 89, 316, 12, 13, 14, 15, 16, 308, - /* 690 */ 308, 8, 9, 33, 327, 12, 13, 14, 15, 16, - /* 700 */ 227, 360, 68, 362, 111, 313, 349, 47, 316, 344, - /* 710 */ 337, 344, 52, 53, 54, 55, 56, 0, 125, 126, - /* 720 */ 355, 8, 9, 61, 337, 12, 13, 14, 15, 16, - /* 730 */ 349, 349, 12, 13, 316, 337, 316, 18, 308, 20, - /* 740 */ 20, 316, 22, 316, 61, 327, 27, 327, 88, 30, - /* 750 */ 227, 91, 90, 33, 327, 35, 313, 0, 320, 316, - /* 760 */ 98, 14, 344, 170, 344, 172, 47, 20, 49, 344, - /* 770 */ 51, 344, 308, 360, 338, 362, 56, 225, 226, 349, - /* 780 */ 342, 98, 42, 43, 124, 349, 193, 194, 68, 196, + /* 600 */ 209, 210, 211, 212, 213, 12, 13, 101, 336, 92, + /* 610 */ 336, 94, 95, 20, 97, 22, 344, 152, 101, 345, + /* 620 */ 316, 349, 101, 351, 2, 90, 33, 364, 35, 123, + /* 630 */ 8, 9, 249, 60, 12, 13, 14, 15, 16, 155, + /* 640 */ 123, 120, 121, 122, 123, 124, 374, 344, 344, 56, + /* 650 */ 378, 379, 380, 381, 382, 383, 337, 385, 355, 320, + /* 660 */ 388, 68, 316, 346, 392, 393, 349, 404, 364, 364, + /* 670 */ 8, 9, 333, 327, 12, 13, 14, 15, 16, 214, + /* 680 */ 417, 342, 89, 308, 421, 20, 382, 22, 39, 224, + /* 690 */ 344, 8, 9, 308, 325, 12, 13, 14, 15, 16, + /* 700 */ 35, 397, 398, 399, 111, 401, 8, 9, 404, 404, + /* 710 */ 12, 13, 14, 15, 16, 50, 232, 233, 125, 126, + /* 720 */ 316, 417, 417, 61, 349, 421, 421, 43, 4, 14, + /* 730 */ 316, 327, 12, 13, 349, 20, 308, 18, 376, 20, + /* 740 */ 20, 327, 22, 19, 61, 316, 27, 337, 344, 30, + /* 750 */ 316, 316, 90, 33, 309, 35, 327, 33, 344, 3, + /* 760 */ 98, 327, 400, 170, 165, 172, 47, 308, 49, 308, + /* 770 */ 51, 47, 424, 344, 90, 51, 56, 349, 344, 344, + /* 780 */ 56, 98, 308, 184, 185, 77, 193, 194, 68, 196, /* 790 */ 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - /* 800 */ 207, 208, 209, 210, 211, 212, 213, 88, 383, 89, - /* 810 */ 374, 375, 376, 349, 152, 39, 156, 60, 101, 100, - /* 820 */ 89, 316, 386, 398, 399, 400, 336, 402, 193, 157, - /* 830 */ 99, 111, 327, 343, 174, 152, 176, 120, 121, 122, - /* 840 */ 123, 124, 352, 309, 377, 125, 126, 128, 308, 344, + /* 800 */ 207, 208, 209, 210, 211, 212, 213, 88, 349, 89, + /* 810 */ 349, 4, 88, 316, 152, 91, 376, 382, 368, 100, + /* 820 */ 20, 8, 9, 349, 327, 12, 13, 14, 15, 16, + /* 830 */ 308, 111, 397, 398, 399, 152, 401, 129, 130, 0, + /* 840 */ 400, 344, 14, 44, 45, 125, 126, 128, 20, 0, /* 850 */ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - /* 860 */ 141, 142, 143, 144, 145, 146, 147, 148, 401, 150, - /* 870 */ 151, 236, 237, 238, 239, 240, 214, 215, 216, 217, - /* 880 */ 218, 219, 220, 221, 222, 223, 224, 14, 3, 349, - /* 890 */ 170, 346, 172, 20, 349, 405, 4, 214, 215, 216, - /* 900 */ 217, 218, 219, 220, 221, 222, 223, 224, 418, 0, - /* 910 */ 308, 308, 422, 193, 194, 308, 196, 197, 198, 199, + /* 860 */ 141, 142, 143, 144, 145, 146, 147, 148, 316, 150, + /* 870 */ 151, 349, 336, 13, 308, 226, 214, 215, 216, 217, + /* 880 */ 218, 219, 220, 221, 222, 223, 224, 48, 352, 317, + /* 890 */ 170, 346, 172, 20, 349, 35, 344, 214, 215, 216, + /* 900 */ 217, 218, 219, 220, 221, 222, 223, 224, 329, 60, + /* 910 */ 415, 332, 197, 193, 194, 349, 196, 197, 198, 199, /* 920 */ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - /* 930 */ 210, 211, 212, 213, 324, 18, 326, 308, 336, 316, - /* 940 */ 23, 101, 346, 425, 197, 349, 344, 377, 308, 308, - /* 950 */ 327, 349, 349, 351, 37, 38, 349, 101, 41, 20, - /* 960 */ 120, 121, 122, 123, 124, 336, 364, 344, 20, 60, - /* 970 */ 325, 401, 43, 344, 57, 58, 59, 375, 349, 123, - /* 980 */ 351, 379, 380, 381, 382, 383, 384, 416, 386, 349, - /* 990 */ 349, 389, 338, 364, 317, 393, 394, 329, 157, 158, - /* 1000 */ 332, 336, 226, 349, 375, 316, 89, 405, 379, 380, - /* 1010 */ 381, 382, 383, 384, 316, 386, 327, 352, 389, 90, - /* 1020 */ 418, 0, 393, 394, 422, 327, 0, 93, 374, 375, - /* 1030 */ 96, 12, 13, 344, 405, 125, 126, 43, 316, 316, - /* 1040 */ 386, 22, 344, 35, 127, 316, 316, 418, 22, 327, - /* 1050 */ 327, 422, 33, 43, 35, 328, 327, 327, 316, 93, - /* 1060 */ 316, 308, 96, 336, 371, 316, 344, 344, 47, 327, - /* 1070 */ 197, 327, 345, 344, 344, 56, 327, 43, 43, 162, - /* 1080 */ 163, 164, 328, 316, 167, 35, 344, 68, 344, 336, - /* 1090 */ 336, 43, 412, 344, 327, 93, 157, 344, 96, 345, - /* 1100 */ 183, 61, 349, 186, 351, 188, 189, 190, 191, 192, - /* 1110 */ 328, 344, 46, 93, 43, 43, 96, 336, 336, 0, - /* 1120 */ 228, 0, 43, 308, 90, 90, 43, 345, 375, 244, - /* 1130 */ 111, 43, 379, 380, 381, 382, 383, 384, 90, 386, - /* 1140 */ 43, 22, 389, 22, 227, 197, 393, 394, 395, 1, - /* 1150 */ 2, 336, 13, 43, 13, 89, 317, 404, 43, 344, - /* 1160 */ 43, 90, 90, 315, 349, 348, 351, 43, 43, 90, - /* 1170 */ 43, 378, 403, 90, 35, 308, 35, 419, 90, 396, - /* 1180 */ 172, 419, 419, 406, 229, 373, 372, 90, 35, 170, - /* 1190 */ 375, 172, 47, 168, 379, 380, 381, 382, 383, 384, - /* 1200 */ 90, 386, 366, 336, 389, 90, 0, 90, 393, 394, - /* 1210 */ 395, 344, 193, 194, 90, 90, 349, 90, 351, 404, - /* 1220 */ 42, 68, 172, 20, 205, 206, 207, 208, 209, 210, - /* 1230 */ 211, 308, 356, 193, 316, 316, 356, 152, 354, 20, - /* 1240 */ 246, 308, 375, 354, 316, 310, 379, 380, 381, 382, - /* 1250 */ 383, 384, 316, 386, 48, 310, 389, 316, 248, 336, - /* 1260 */ 393, 394, 395, 20, 370, 351, 320, 344, 20, 336, - /* 1270 */ 320, 404, 349, 20, 351, 363, 365, 344, 320, 363, - /* 1280 */ 320, 320, 349, 320, 351, 316, 310, 364, 320, 336, - /* 1290 */ 308, 310, 336, 336, 316, 336, 349, 364, 375, 369, - /* 1300 */ 336, 336, 379, 380, 381, 382, 383, 384, 375, 386, - /* 1310 */ 336, 336, 379, 380, 381, 382, 383, 384, 336, 386, - /* 1320 */ 336, 336, 336, 318, 370, 175, 344, 318, 405, 316, - /* 1330 */ 351, 349, 316, 351, 363, 318, 234, 349, 405, 359, - /* 1340 */ 349, 418, 349, 154, 349, 422, 359, 349, 318, 357, - /* 1350 */ 308, 418, 20, 349, 332, 422, 318, 375, 344, 359, - /* 1360 */ 308, 379, 380, 381, 382, 383, 384, 378, 386, 235, - /* 1370 */ 359, 389, 349, 411, 241, 393, 394, 349, 336, 161, - /* 1380 */ 349, 411, 349, 243, 242, 413, 344, 414, 336, 230, - /* 1390 */ 226, 349, 20, 351, 411, 344, 344, 373, 247, 245, - /* 1400 */ 410, 349, 89, 351, 377, 409, 250, 408, 89, 308, - /* 1410 */ 340, 349, 326, 318, 316, 36, 311, 375, 421, 310, - /* 1420 */ 367, 379, 380, 381, 382, 383, 384, 375, 386, 426, - /* 1430 */ 362, 379, 380, 381, 382, 383, 384, 336, 386, 421, - /* 1440 */ 0, 389, 341, 330, 330, 344, 394, 392, 330, 420, - /* 1450 */ 349, 319, 351, 421, 0, 306, 420, 420, 177, 0, - /* 1460 */ 308, 0, 42, 0, 35, 423, 424, 187, 35, 35, - /* 1470 */ 35, 187, 0, 35, 35, 187, 375, 0, 0, 187, - /* 1480 */ 379, 380, 381, 382, 383, 384, 35, 386, 336, 0, - /* 1490 */ 22, 0, 35, 341, 172, 170, 344, 0, 0, 166, - /* 1500 */ 165, 349, 46, 351, 0, 0, 0, 42, 0, 0, - /* 1510 */ 0, 149, 308, 0, 0, 0, 0, 0, 144, 35, - /* 1520 */ 0, 144, 308, 42, 0, 0, 0, 375, 0, 0, - /* 1530 */ 0, 379, 380, 381, 382, 383, 384, 0, 386, 308, - /* 1540 */ 336, 0, 0, 0, 0, 0, 0, 0, 344, 0, - /* 1550 */ 336, 0, 0, 349, 0, 351, 0, 0, 344, 0, - /* 1560 */ 22, 0, 0, 349, 0, 351, 0, 336, 56, 0, - /* 1570 */ 0, 0, 39, 42, 56, 344, 0, 43, 46, 375, - /* 1580 */ 349, 14, 351, 379, 380, 381, 382, 383, 384, 375, - /* 1590 */ 386, 161, 14, 379, 380, 381, 382, 383, 384, 308, - /* 1600 */ 386, 46, 0, 40, 39, 0, 375, 0, 0, 0, - /* 1610 */ 379, 380, 381, 382, 383, 384, 308, 386, 39, 388, - /* 1620 */ 0, 417, 62, 0, 0, 35, 39, 336, 0, 47, - /* 1630 */ 35, 47, 341, 39, 0, 344, 35, 39, 424, 47, - /* 1640 */ 349, 0, 351, 47, 336, 35, 0, 0, 0, 341, - /* 1650 */ 39, 0, 344, 35, 22, 0, 98, 349, 43, 351, - /* 1660 */ 35, 35, 43, 0, 96, 35, 375, 22, 0, 0, - /* 1670 */ 379, 380, 381, 382, 383, 384, 22, 386, 22, 22, - /* 1680 */ 49, 0, 0, 375, 308, 35, 33, 379, 380, 381, - /* 1690 */ 382, 383, 384, 35, 386, 0, 35, 22, 20, 0, - /* 1700 */ 47, 35, 308, 0, 154, 52, 53, 54, 55, 56, - /* 1710 */ 157, 22, 336, 173, 0, 0, 0, 0, 0, 90, - /* 1720 */ 344, 35, 89, 0, 89, 349, 89, 351, 0, 157, - /* 1730 */ 336, 157, 159, 39, 46, 155, 43, 99, 344, 153, - /* 1740 */ 43, 88, 231, 349, 91, 351, 46, 43, 89, 43, - /* 1750 */ 231, 375, 90, 89, 89, 379, 380, 381, 382, 383, - /* 1760 */ 384, 308, 386, 90, 90, 182, 89, 46, 89, 375, - /* 1770 */ 90, 46, 89, 379, 380, 381, 382, 383, 384, 89, - /* 1780 */ 386, 90, 90, 43, 46, 89, 43, 46, 90, 336, - /* 1790 */ 35, 90, 90, 35, 35, 35, 35, 344, 35, 2, - /* 1800 */ 225, 22, 349, 90, 351, 193, 153, 154, 231, 156, - /* 1810 */ 308, 43, 90, 160, 90, 46, 89, 46, 89, 89, - /* 1820 */ 89, 89, 22, 89, 35, 90, 35, 90, 375, 176, - /* 1830 */ 35, 308, 379, 380, 381, 382, 383, 384, 336, 386, - /* 1840 */ 89, 89, 100, 90, 195, 35, 344, 90, 35, 35, - /* 1850 */ 22, 349, 90, 351, 89, 89, 89, 113, 113, 336, - /* 1860 */ 113, 113, 89, 89, 43, 101, 35, 344, 22, 89, - /* 1870 */ 62, 35, 349, 61, 351, 35, 35, 375, 35, 35, - /* 1880 */ 35, 379, 380, 381, 382, 383, 384, 35, 386, 308, - /* 1890 */ 68, 87, 43, 35, 35, 22, 35, 22, 375, 308, - /* 1900 */ 35, 35, 379, 380, 381, 382, 383, 384, 22, 386, - /* 1910 */ 68, 35, 35, 35, 35, 35, 35, 336, 0, 35, - /* 1920 */ 0, 47, 39, 35, 39, 344, 0, 336, 35, 47, - /* 1930 */ 349, 39, 351, 0, 47, 344, 35, 39, 47, 0, - /* 1940 */ 349, 35, 351, 0, 35, 22, 21, 427, 427, 22, - /* 1950 */ 22, 308, 21, 427, 20, 427, 375, 427, 427, 427, - /* 1960 */ 379, 380, 381, 382, 383, 384, 375, 386, 308, 427, - /* 1970 */ 379, 380, 381, 382, 383, 384, 427, 386, 427, 336, - /* 1980 */ 427, 427, 427, 427, 427, 427, 427, 344, 427, 427, - /* 1990 */ 427, 427, 349, 427, 351, 427, 336, 427, 427, 427, - /* 2000 */ 427, 427, 427, 427, 344, 427, 427, 427, 427, 349, - /* 2010 */ 427, 351, 427, 427, 427, 427, 427, 308, 375, 427, - /* 2020 */ 427, 427, 379, 380, 381, 382, 383, 384, 427, 386, - /* 2030 */ 427, 427, 427, 427, 308, 375, 427, 427, 427, 379, - /* 2040 */ 380, 381, 382, 383, 384, 336, 386, 427, 427, 427, - /* 2050 */ 427, 427, 427, 344, 427, 427, 427, 427, 349, 427, - /* 2060 */ 351, 427, 336, 427, 427, 427, 427, 427, 427, 427, - /* 2070 */ 344, 427, 427, 427, 427, 349, 427, 351, 427, 427, - /* 2080 */ 427, 427, 427, 308, 375, 427, 427, 427, 379, 380, - /* 2090 */ 381, 382, 383, 384, 427, 386, 427, 427, 427, 427, - /* 2100 */ 427, 375, 427, 427, 427, 379, 380, 381, 382, 383, - /* 2110 */ 384, 336, 386, 427, 427, 427, 427, 427, 427, 344, - /* 2120 */ 427, 427, 427, 427, 349, 427, 351, 427, 427, 427, - /* 2130 */ 427, 427, 427, 427, 427, 427, 427, 308, 427, 427, - /* 2140 */ 427, 427, 427, 427, 427, 427, 427, 308, 427, 427, - /* 2150 */ 375, 427, 427, 427, 379, 380, 381, 382, 383, 384, - /* 2160 */ 427, 386, 427, 427, 427, 336, 427, 427, 427, 427, - /* 2170 */ 427, 427, 427, 344, 427, 336, 427, 427, 349, 427, - /* 2180 */ 351, 427, 427, 344, 427, 427, 427, 427, 349, 427, - /* 2190 */ 351, 427, 427, 427, 427, 427, 427, 427, 308, 427, - /* 2200 */ 427, 427, 427, 427, 375, 427, 427, 427, 379, 380, - /* 2210 */ 381, 382, 383, 384, 375, 386, 308, 427, 379, 380, - /* 2220 */ 381, 382, 383, 384, 427, 386, 336, 427, 427, 427, - /* 2230 */ 427, 427, 427, 427, 344, 427, 427, 427, 427, 349, - /* 2240 */ 427, 351, 427, 427, 336, 427, 427, 427, 427, 427, - /* 2250 */ 427, 427, 344, 427, 427, 427, 427, 349, 427, 351, - /* 2260 */ 427, 427, 427, 427, 427, 375, 427, 427, 427, 379, - /* 2270 */ 380, 381, 382, 383, 384, 308, 386, 427, 427, 427, - /* 2280 */ 427, 427, 427, 375, 427, 427, 427, 379, 380, 381, - /* 2290 */ 382, 383, 384, 427, 386, 427, 308, 427, 427, 427, - /* 2300 */ 427, 427, 427, 336, 427, 427, 427, 427, 427, 427, - /* 2310 */ 427, 344, 427, 427, 427, 427, 349, 427, 351, 427, - /* 2320 */ 427, 427, 427, 427, 336, 427, 427, 427, 427, 427, - /* 2330 */ 427, 427, 344, 427, 427, 427, 427, 349, 427, 351, - /* 2340 */ 427, 427, 375, 427, 427, 427, 379, 380, 381, 382, - /* 2350 */ 383, 384, 308, 386, 427, 427, 427, 427, 427, 427, - /* 2360 */ 427, 427, 308, 375, 427, 427, 427, 379, 380, 381, - /* 2370 */ 382, 383, 384, 427, 386, 427, 427, 427, 427, 427, - /* 2380 */ 336, 427, 427, 427, 427, 427, 427, 427, 344, 427, - /* 2390 */ 336, 427, 427, 349, 316, 351, 427, 427, 344, 427, - /* 2400 */ 427, 427, 427, 349, 427, 351, 427, 427, 427, 427, - /* 2410 */ 427, 427, 427, 427, 427, 427, 427, 427, 427, 375, - /* 2420 */ 427, 427, 344, 379, 380, 381, 382, 383, 384, 375, - /* 2430 */ 386, 427, 427, 379, 380, 381, 382, 383, 384, 427, - /* 2440 */ 386, 316, 364, 427, 427, 427, 427, 427, 427, 427, - /* 2450 */ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - /* 2460 */ 427, 383, 427, 427, 427, 427, 427, 427, 427, 344, - /* 2470 */ 427, 427, 427, 427, 427, 427, 398, 399, 400, 427, - /* 2480 */ 402, 427, 427, 405, 427, 427, 427, 427, 427, 364, - /* 2490 */ 427, 427, 427, 427, 427, 427, 418, 427, 427, 427, - /* 2500 */ 422, 427, 427, 427, 427, 427, 427, 427, 383, 427, - /* 2510 */ 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, - /* 2520 */ 427, 427, 427, 398, 399, 400, 427, 402, 427, 427, - /* 2530 */ 405, 427, 427, 427, 427, 427, 427, 427, 427, 427, - /* 2540 */ 427, 427, 427, 418, 427, 427, 427, 422, + /* 930 */ 210, 211, 212, 213, 382, 18, 308, 308, 43, 364, + /* 940 */ 23, 364, 225, 226, 0, 64, 65, 0, 338, 397, + /* 950 */ 398, 399, 71, 401, 37, 38, 336, 157, 41, 349, + /* 960 */ 316, 316, 81, 82, 308, 336, 42, 43, 411, 22, + /* 970 */ 157, 327, 327, 344, 57, 58, 59, 349, 349, 404, + /* 980 */ 351, 404, 315, 373, 374, 375, 308, 308, 344, 344, + /* 990 */ 316, 47, 417, 364, 417, 385, 421, 56, 421, 364, + /* 1000 */ 244, 327, 308, 374, 308, 349, 89, 378, 379, 380, + /* 1010 */ 381, 382, 383, 316, 385, 336, 43, 388, 344, 12, + /* 1020 */ 13, 392, 393, 344, 327, 197, 316, 349, 349, 22, + /* 1030 */ 351, 93, 91, 404, 96, 228, 348, 327, 316, 404, + /* 1040 */ 33, 344, 35, 349, 127, 349, 417, 0, 308, 327, + /* 1050 */ 421, 317, 417, 374, 344, 308, 421, 378, 379, 380, + /* 1060 */ 381, 382, 383, 56, 385, 316, 344, 388, 43, 22, + /* 1070 */ 197, 392, 393, 394, 316, 68, 327, 157, 158, 162, + /* 1080 */ 163, 164, 403, 336, 167, 327, 43, 93, 316, 349, + /* 1090 */ 96, 344, 93, 344, 93, 96, 349, 96, 351, 327, + /* 1100 */ 183, 0, 344, 186, 377, 188, 189, 190, 191, 192, + /* 1110 */ 35, 364, 43, 316, 308, 90, 344, 35, 111, 61, + /* 1120 */ 316, 374, 43, 22, 327, 378, 379, 380, 381, 382, + /* 1130 */ 383, 327, 385, 90, 43, 388, 43, 402, 19, 392, + /* 1140 */ 393, 344, 336, 248, 227, 43, 43, 341, 344, 43, + /* 1150 */ 344, 404, 33, 89, 308, 349, 13, 351, 43, 90, + /* 1160 */ 46, 1, 2, 99, 417, 395, 47, 405, 421, 90, + /* 1170 */ 418, 52, 53, 54, 55, 56, 43, 170, 35, 172, + /* 1180 */ 374, 90, 336, 90, 378, 379, 380, 381, 382, 383, + /* 1190 */ 344, 385, 90, 90, 308, 349, 90, 351, 125, 126, + /* 1200 */ 193, 194, 418, 89, 418, 90, 43, 88, 43, 229, + /* 1210 */ 91, 35, 205, 206, 207, 208, 209, 210, 211, 246, + /* 1220 */ 374, 47, 336, 90, 378, 379, 380, 381, 382, 383, + /* 1230 */ 344, 385, 366, 372, 388, 349, 43, 351, 392, 393, + /* 1240 */ 394, 43, 316, 124, 68, 371, 168, 172, 42, 403, + /* 1250 */ 356, 193, 20, 90, 172, 90, 316, 356, 316, 152, + /* 1260 */ 374, 354, 354, 308, 378, 379, 380, 381, 382, 383, + /* 1270 */ 344, 385, 316, 316, 388, 156, 316, 20, 392, 393, + /* 1280 */ 394, 310, 310, 90, 20, 370, 320, 351, 90, 403, + /* 1290 */ 364, 336, 20, 174, 320, 176, 363, 20, 320, 344, + /* 1300 */ 365, 320, 363, 320, 349, 320, 351, 316, 382, 320, + /* 1310 */ 310, 336, 336, 336, 316, 336, 310, 308, 336, 364, + /* 1320 */ 336, 370, 336, 397, 398, 399, 336, 401, 336, 374, + /* 1330 */ 404, 336, 336, 378, 379, 380, 381, 382, 383, 318, + /* 1340 */ 385, 175, 349, 417, 318, 336, 316, 421, 351, 316, + /* 1350 */ 318, 363, 234, 344, 349, 154, 369, 349, 349, 404, + /* 1360 */ 351, 359, 349, 349, 349, 20, 318, 308, 357, 359, + /* 1370 */ 332, 318, 417, 364, 235, 344, 421, 349, 410, 359, + /* 1380 */ 377, 359, 241, 374, 308, 349, 349, 378, 379, 380, + /* 1390 */ 381, 382, 383, 349, 385, 336, 161, 243, 349, 242, + /* 1400 */ 230, 372, 20, 344, 226, 344, 247, 245, 349, 89, + /* 1410 */ 351, 376, 336, 404, 410, 89, 349, 250, 326, 36, + /* 1420 */ 344, 340, 318, 311, 412, 349, 417, 351, 410, 413, + /* 1430 */ 421, 407, 409, 374, 308, 408, 419, 378, 379, 380, + /* 1440 */ 381, 382, 383, 391, 385, 316, 310, 388, 362, 319, + /* 1450 */ 374, 392, 393, 419, 378, 379, 380, 381, 382, 383, + /* 1460 */ 308, 385, 336, 367, 425, 420, 420, 330, 330, 419, + /* 1470 */ 344, 420, 330, 0, 306, 349, 0, 351, 177, 0, + /* 1480 */ 0, 42, 0, 35, 187, 35, 35, 35, 336, 187, + /* 1490 */ 0, 35, 35, 341, 187, 0, 344, 187, 422, 423, + /* 1500 */ 374, 349, 0, 351, 378, 379, 380, 381, 382, 383, + /* 1510 */ 308, 385, 35, 0, 388, 22, 0, 170, 35, 393, + /* 1520 */ 172, 0, 308, 166, 165, 0, 374, 0, 0, 0, + /* 1530 */ 378, 379, 380, 381, 382, 383, 308, 385, 336, 0, + /* 1540 */ 46, 42, 0, 0, 149, 0, 344, 144, 0, 35, + /* 1550 */ 336, 349, 0, 351, 0, 0, 0, 144, 344, 0, + /* 1560 */ 0, 0, 0, 349, 336, 351, 0, 0, 0, 0, + /* 1570 */ 0, 0, 344, 0, 0, 0, 374, 349, 0, 351, + /* 1580 */ 378, 379, 380, 381, 382, 383, 42, 385, 374, 308, + /* 1590 */ 0, 0, 378, 379, 380, 381, 382, 383, 0, 385, + /* 1600 */ 0, 0, 374, 22, 0, 0, 378, 379, 380, 381, + /* 1610 */ 382, 383, 0, 385, 0, 387, 0, 336, 416, 0, + /* 1620 */ 56, 0, 341, 39, 42, 344, 33, 0, 56, 0, + /* 1630 */ 349, 43, 351, 46, 14, 46, 14, 423, 0, 40, + /* 1640 */ 47, 39, 308, 35, 47, 52, 53, 54, 55, 56, + /* 1650 */ 0, 0, 0, 161, 308, 374, 39, 0, 0, 378, + /* 1660 */ 379, 380, 381, 382, 383, 0, 385, 0, 308, 62, + /* 1670 */ 336, 0, 39, 0, 35, 341, 39, 47, 344, 0, + /* 1680 */ 35, 88, 336, 349, 91, 351, 39, 47, 0, 35, + /* 1690 */ 344, 47, 39, 0, 0, 349, 336, 351, 0, 0, + /* 1700 */ 22, 35, 96, 0, 344, 35, 22, 98, 374, 349, + /* 1710 */ 0, 351, 378, 379, 380, 381, 382, 383, 43, 385, + /* 1720 */ 374, 35, 308, 43, 378, 379, 380, 381, 382, 383, + /* 1730 */ 35, 385, 0, 22, 374, 22, 308, 0, 378, 379, + /* 1740 */ 380, 381, 382, 383, 22, 385, 153, 154, 308, 156, + /* 1750 */ 336, 49, 35, 160, 0, 35, 0, 0, 344, 35, + /* 1760 */ 22, 20, 0, 349, 336, 351, 35, 157, 0, 176, + /* 1770 */ 22, 0, 344, 0, 159, 157, 336, 349, 154, 351, + /* 1780 */ 0, 0, 157, 0, 344, 89, 173, 90, 374, 349, + /* 1790 */ 35, 351, 378, 379, 380, 381, 382, 383, 0, 385, + /* 1800 */ 0, 89, 374, 155, 89, 308, 378, 379, 380, 381, + /* 1810 */ 382, 383, 153, 385, 374, 308, 182, 39, 378, 379, + /* 1820 */ 380, 381, 382, 383, 89, 385, 99, 43, 46, 89, + /* 1830 */ 43, 308, 90, 336, 89, 43, 90, 90, 89, 46, + /* 1840 */ 90, 344, 231, 336, 43, 46, 349, 89, 351, 89, + /* 1850 */ 89, 344, 43, 90, 89, 308, 349, 231, 351, 336, + /* 1860 */ 90, 46, 90, 46, 46, 90, 225, 344, 43, 90, + /* 1870 */ 35, 374, 349, 231, 351, 378, 379, 380, 381, 382, + /* 1880 */ 383, 374, 385, 336, 35, 378, 379, 380, 381, 382, + /* 1890 */ 383, 344, 385, 35, 35, 35, 349, 374, 351, 35, + /* 1900 */ 2, 378, 379, 380, 381, 382, 383, 22, 385, 193, + /* 1910 */ 43, 308, 89, 22, 90, 89, 46, 90, 89, 100, + /* 1920 */ 90, 374, 89, 89, 46, 378, 379, 380, 381, 382, + /* 1930 */ 383, 308, 385, 89, 35, 90, 35, 89, 195, 336, + /* 1940 */ 90, 35, 89, 35, 90, 89, 35, 344, 35, 113, + /* 1950 */ 89, 308, 349, 90, 351, 90, 113, 89, 22, 336, + /* 1960 */ 113, 89, 35, 101, 113, 89, 89, 344, 43, 22, + /* 1970 */ 61, 308, 349, 35, 351, 35, 62, 374, 35, 336, + /* 1980 */ 35, 378, 379, 380, 381, 382, 383, 344, 385, 35, + /* 1990 */ 35, 308, 349, 35, 351, 43, 68, 374, 35, 336, + /* 2000 */ 35, 378, 379, 380, 381, 382, 383, 344, 385, 87, + /* 2010 */ 22, 35, 349, 22, 351, 35, 35, 374, 68, 336, + /* 2020 */ 35, 378, 379, 380, 381, 382, 383, 344, 385, 35, + /* 2030 */ 35, 308, 349, 35, 351, 35, 22, 374, 35, 0, + /* 2040 */ 35, 378, 379, 380, 381, 382, 383, 308, 385, 47, + /* 2050 */ 39, 0, 35, 47, 39, 0, 35, 374, 39, 336, + /* 2060 */ 47, 378, 379, 380, 381, 382, 383, 344, 385, 0, + /* 2070 */ 35, 47, 349, 39, 351, 336, 0, 35, 35, 0, + /* 2080 */ 22, 21, 21, 344, 22, 22, 20, 426, 349, 426, + /* 2090 */ 351, 426, 426, 426, 426, 426, 426, 374, 308, 426, + /* 2100 */ 426, 378, 379, 380, 381, 382, 383, 426, 385, 426, + /* 2110 */ 426, 426, 426, 374, 308, 426, 426, 378, 379, 380, + /* 2120 */ 381, 382, 383, 426, 385, 426, 336, 426, 426, 426, + /* 2130 */ 426, 426, 426, 426, 344, 426, 426, 426, 426, 349, + /* 2140 */ 426, 351, 336, 426, 426, 426, 426, 426, 426, 426, + /* 2150 */ 344, 426, 426, 426, 426, 349, 426, 351, 426, 426, + /* 2160 */ 426, 426, 426, 426, 374, 308, 426, 426, 378, 379, + /* 2170 */ 380, 381, 382, 383, 426, 385, 426, 426, 426, 426, + /* 2180 */ 374, 308, 426, 426, 378, 379, 380, 381, 382, 383, + /* 2190 */ 426, 385, 426, 336, 426, 426, 426, 426, 426, 426, + /* 2200 */ 426, 344, 426, 426, 426, 426, 349, 426, 351, 336, + /* 2210 */ 426, 426, 426, 426, 426, 426, 426, 344, 426, 426, + /* 2220 */ 426, 426, 349, 426, 351, 426, 426, 426, 426, 426, + /* 2230 */ 426, 374, 426, 426, 426, 378, 379, 380, 381, 382, + /* 2240 */ 383, 426, 385, 426, 426, 426, 426, 374, 426, 426, + /* 2250 */ 426, 378, 379, 380, 381, 382, 383, 426, 385, 426, + /* 2260 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2270 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2280 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2290 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2300 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2310 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2320 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2330 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2340 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2350 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2360 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2370 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2380 */ 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + /* 2390 */ 426, 426, }; #define YY_SHIFT_COUNT (666) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (1943) +#define YY_SHIFT_MAX (2079) static const unsigned short int yy_shift_ofst[] = { /* 0 */ 917, 0, 0, 62, 62, 264, 264, 264, 326, 326, /* 10 */ 264, 264, 391, 593, 720, 593, 593, 593, 593, 593, /* 20 */ 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, /* 30 */ 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, - /* 40 */ 593, 593, 325, 325, 361, 361, 361, 1019, 1019, 473, - /* 50 */ 1019, 1019, 389, 523, 283, 340, 283, 17, 17, 19, - /* 60 */ 19, 55, 6, 283, 283, 17, 17, 17, 17, 17, - /* 70 */ 17, 17, 17, 17, 17, 9, 17, 17, 17, 24, - /* 80 */ 17, 17, 102, 17, 17, 102, 109, 17, 102, 102, - /* 90 */ 102, 17, 135, 719, 662, 683, 683, 150, 213, 213, + /* 40 */ 593, 593, 265, 265, 17, 17, 17, 1007, 1007, 268, + /* 50 */ 1007, 1007, 160, 30, 56, 200, 56, 11, 11, 87, + /* 60 */ 87, 55, 165, 56, 56, 11, 11, 11, 11, 11, + /* 70 */ 11, 11, 11, 11, 11, 10, 11, 11, 11, 18, + /* 80 */ 11, 11, 67, 11, 11, 67, 123, 11, 67, 67, + /* 90 */ 67, 11, 227, 719, 662, 683, 683, 150, 213, 213, /* 100 */ 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - /* 110 */ 213, 213, 213, 213, 213, 213, 213, 417, 155, 6, - /* 120 */ 630, 630, 757, 634, 909, 501, 501, 501, 634, 195, - /* 130 */ 195, 24, 292, 292, 102, 102, 255, 255, 287, 342, - /* 140 */ 198, 198, 198, 198, 198, 198, 198, 660, 21, 383, - /* 150 */ 565, 635, 5, 174, 125, 747, 873, 229, 497, 856, - /* 160 */ 939, 552, 776, 552, 740, 885, 885, 885, 892, 948, - /* 170 */ 955, 1145, 1025, 1178, 1203, 1203, 1178, 1085, 1085, 1203, - /* 180 */ 1203, 1203, 1219, 1219, 1243, 9, 24, 9, 1248, 1253, - /* 190 */ 9, 1248, 9, 9, 9, 1203, 9, 1219, 102, 102, - /* 200 */ 102, 102, 102, 102, 102, 102, 102, 102, 102, 1203, - /* 210 */ 1219, 255, 1243, 135, 1150, 24, 135, 1203, 1203, 1248, - /* 220 */ 135, 1102, 255, 255, 255, 255, 1102, 255, 1189, 135, - /* 230 */ 287, 135, 195, 1332, 255, 1134, 1102, 255, 255, 1134, - /* 240 */ 1102, 255, 255, 102, 1133, 1218, 1134, 1140, 1142, 1159, - /* 250 */ 955, 1164, 195, 1372, 1151, 1154, 1156, 1151, 1154, 1151, - /* 260 */ 1154, 1313, 1319, 255, 342, 1203, 135, 1379, 1219, 2548, - /* 270 */ 2548, 2548, 2548, 2548, 2548, 2548, 83, 1653, 214, 337, - /* 280 */ 126, 209, 492, 562, 625, 672, 535, 322, 713, 713, - /* 290 */ 713, 713, 713, 713, 713, 713, 717, 840, 405, 405, - /* 300 */ 69, 458, 197, 309, 85, 111, 8, 394, 170, 170, - /* 310 */ 170, 170, 929, 1021, 934, 966, 1002, 1020, 1026, 1119, - /* 320 */ 1121, 516, 841, 1034, 1035, 1048, 1071, 1072, 1079, 1083, - /* 330 */ 1148, 910, 994, 1010, 1088, 1008, 1050, 1040, 1097, 1066, - /* 340 */ 1110, 1115, 1117, 1124, 1125, 1127, 731, 1139, 1141, 1153, - /* 350 */ 1206, 1440, 1454, 1281, 1459, 1461, 1420, 1463, 1429, 1280, - /* 360 */ 1433, 1434, 1435, 1284, 1472, 1438, 1439, 1288, 1477, 1292, - /* 370 */ 1478, 1451, 1489, 1468, 1491, 1457, 1322, 1325, 1497, 1498, - /* 380 */ 1333, 1335, 1504, 1505, 1456, 1506, 1465, 1508, 1509, 1510, - /* 390 */ 1362, 1513, 1514, 1515, 1516, 1517, 1374, 1484, 1520, 1377, - /* 400 */ 1528, 1529, 1530, 1537, 1541, 1542, 1543, 1544, 1545, 1546, - /* 410 */ 1547, 1549, 1551, 1552, 1481, 1524, 1525, 1526, 1554, 1556, - /* 420 */ 1557, 1538, 1559, 1561, 1562, 1564, 1566, 1512, 1569, 1518, - /* 430 */ 1570, 1571, 1531, 1533, 1534, 1567, 1532, 1578, 1555, 1576, - /* 440 */ 1563, 1565, 1602, 1605, 1607, 1579, 1430, 1608, 1609, 1620, - /* 450 */ 1560, 1623, 1624, 1590, 1582, 1587, 1628, 1595, 1584, 1594, - /* 460 */ 1634, 1601, 1592, 1598, 1641, 1610, 1596, 1611, 1646, 1647, - /* 470 */ 1648, 1651, 1558, 1568, 1618, 1632, 1655, 1625, 1615, 1619, - /* 480 */ 1626, 1630, 1645, 1663, 1654, 1668, 1656, 1631, 1669, 1657, - /* 490 */ 1650, 1681, 1658, 1682, 1661, 1695, 1675, 1678, 1699, 1553, - /* 500 */ 1666, 1703, 1540, 1689, 1572, 1550, 1714, 1715, 1574, 1573, - /* 510 */ 1716, 1717, 1718, 1633, 1629, 1686, 1583, 1723, 1635, 1580, - /* 520 */ 1637, 1728, 1694, 1586, 1659, 1638, 1688, 1693, 1511, 1664, - /* 530 */ 1662, 1665, 1673, 1674, 1677, 1697, 1680, 1679, 1683, 1690, - /* 540 */ 1691, 1704, 1700, 1721, 1696, 1706, 1519, 1692, 1698, 1725, - /* 550 */ 1575, 1740, 1738, 1741, 1701, 1743, 1577, 1702, 1755, 1758, - /* 560 */ 1759, 1760, 1761, 1763, 1702, 1797, 1779, 1612, 1768, 1727, - /* 570 */ 1713, 1729, 1722, 1730, 1724, 1769, 1731, 1732, 1771, 1800, - /* 580 */ 1649, 1734, 1742, 1735, 1789, 1791, 1751, 1737, 1795, 1752, - /* 590 */ 1753, 1810, 1765, 1757, 1813, 1766, 1762, 1814, 1767, 1744, - /* 600 */ 1745, 1747, 1748, 1828, 1764, 1773, 1774, 1831, 1780, 1821, - /* 610 */ 1821, 1846, 1808, 1812, 1836, 1840, 1841, 1843, 1844, 1845, - /* 620 */ 1852, 1822, 1804, 1849, 1858, 1859, 1873, 1861, 1875, 1865, - /* 630 */ 1866, 1842, 1615, 1876, 1619, 1877, 1878, 1879, 1880, 1886, - /* 640 */ 1881, 1918, 1884, 1874, 1883, 1920, 1888, 1882, 1885, 1926, - /* 650 */ 1893, 1887, 1892, 1933, 1901, 1891, 1898, 1939, 1906, 1909, - /* 660 */ 1943, 1923, 1925, 1927, 1928, 1931, 1934, + /* 110 */ 213, 213, 213, 213, 213, 213, 213, 517, 881, 165, + /* 120 */ 403, 403, 573, 386, 849, 361, 361, 361, 386, 298, + /* 130 */ 298, 18, 350, 350, 67, 67, 294, 294, 270, 357, + /* 140 */ 198, 198, 198, 198, 198, 198, 198, 1119, 21, 383, + /* 150 */ 501, 105, 665, 484, 715, 828, 366, 799, 506, 800, + /* 160 */ 717, 649, 717, 924, 756, 756, 756, 807, 873, 980, + /* 170 */ 1174, 1078, 1206, 1232, 1232, 1206, 1107, 1107, 1232, 1232, + /* 180 */ 1232, 1257, 1257, 1264, 10, 18, 10, 1272, 1277, 10, + /* 190 */ 1272, 10, 10, 10, 1232, 10, 1257, 67, 67, 67, + /* 200 */ 67, 67, 67, 67, 67, 67, 67, 67, 1232, 1257, + /* 210 */ 294, 1264, 227, 1166, 18, 227, 1232, 1232, 1272, 227, + /* 220 */ 1118, 294, 294, 294, 294, 1118, 294, 1201, 227, 270, + /* 230 */ 227, 298, 1345, 294, 1139, 1118, 294, 294, 1139, 1118, + /* 240 */ 294, 294, 67, 1141, 1235, 1139, 1154, 1157, 1170, 980, + /* 250 */ 1178, 298, 1382, 1159, 1162, 1167, 1159, 1162, 1159, 1162, + /* 260 */ 1320, 1326, 294, 357, 1232, 227, 1383, 1257, 2259, 2259, + /* 270 */ 2259, 2259, 2259, 2259, 2259, 83, 1593, 214, 724, 126, + /* 280 */ 209, 491, 562, 622, 813, 535, 321, 698, 698, 698, + /* 290 */ 698, 698, 698, 698, 698, 521, 309, 13, 13, 115, + /* 300 */ 69, 599, 267, 708, 194, 377, 190, 465, 49, 49, + /* 310 */ 49, 49, 684, 944, 938, 994, 999, 1001, 947, 1047, + /* 320 */ 1101, 941, 920, 1025, 1043, 1069, 1079, 1091, 1093, 1102, + /* 330 */ 1160, 1073, 973, 895, 1103, 1075, 1082, 1058, 1106, 1114, + /* 340 */ 1115, 1133, 1163, 1165, 1193, 1198, 1064, 860, 1143, 1176, + /* 350 */ 839, 1473, 1476, 1301, 1479, 1480, 1439, 1482, 1448, 1297, + /* 360 */ 1450, 1451, 1452, 1302, 1490, 1456, 1457, 1307, 1495, 1310, + /* 370 */ 1502, 1477, 1513, 1493, 1516, 1483, 1348, 1347, 1521, 1527, + /* 380 */ 1357, 1359, 1525, 1528, 1494, 1529, 1499, 1539, 1542, 1543, + /* 390 */ 1395, 1545, 1552, 1554, 1555, 1556, 1403, 1514, 1548, 1413, + /* 400 */ 1559, 1560, 1561, 1562, 1566, 1567, 1568, 1569, 1570, 1571, + /* 410 */ 1573, 1574, 1575, 1578, 1544, 1590, 1591, 1598, 1600, 1601, + /* 420 */ 1612, 1581, 1604, 1605, 1614, 1616, 1619, 1564, 1621, 1572, + /* 430 */ 1627, 1629, 1582, 1584, 1588, 1620, 1587, 1622, 1589, 1638, + /* 440 */ 1599, 1602, 1650, 1651, 1652, 1617, 1492, 1657, 1658, 1665, + /* 450 */ 1607, 1667, 1671, 1608, 1597, 1633, 1673, 1639, 1630, 1637, + /* 460 */ 1679, 1645, 1640, 1647, 1688, 1654, 1644, 1653, 1693, 1694, + /* 470 */ 1698, 1699, 1609, 1606, 1666, 1678, 1703, 1670, 1675, 1680, + /* 480 */ 1686, 1695, 1684, 1710, 1711, 1732, 1713, 1702, 1737, 1722, + /* 490 */ 1717, 1754, 1720, 1756, 1724, 1757, 1738, 1741, 1762, 1610, + /* 500 */ 1731, 1768, 1613, 1748, 1618, 1624, 1771, 1773, 1625, 1615, + /* 510 */ 1780, 1781, 1783, 1696, 1697, 1755, 1634, 1798, 1712, 1648, + /* 520 */ 1715, 1800, 1778, 1659, 1735, 1727, 1782, 1784, 1611, 1740, + /* 530 */ 1742, 1745, 1746, 1747, 1749, 1787, 1750, 1758, 1760, 1761, + /* 540 */ 1763, 1792, 1793, 1799, 1765, 1801, 1626, 1770, 1772, 1815, + /* 550 */ 1641, 1809, 1817, 1818, 1775, 1825, 1642, 1779, 1835, 1849, + /* 560 */ 1858, 1859, 1860, 1864, 1779, 1898, 1885, 1716, 1867, 1823, + /* 570 */ 1824, 1826, 1827, 1829, 1830, 1870, 1833, 1834, 1878, 1891, + /* 580 */ 1743, 1844, 1819, 1845, 1899, 1901, 1848, 1850, 1906, 1853, + /* 590 */ 1854, 1908, 1856, 1863, 1911, 1861, 1865, 1913, 1868, 1836, + /* 600 */ 1843, 1847, 1851, 1936, 1862, 1872, 1876, 1927, 1877, 1925, + /* 610 */ 1925, 1947, 1914, 1909, 1938, 1940, 1943, 1945, 1954, 1955, + /* 620 */ 1958, 1928, 1922, 1952, 1963, 1965, 1988, 1976, 1991, 1980, + /* 630 */ 1981, 1950, 1675, 1985, 1680, 1994, 1995, 1998, 2000, 2014, + /* 640 */ 2003, 2039, 2005, 2002, 2011, 2051, 2017, 2006, 2015, 2055, + /* 650 */ 2021, 2013, 2019, 2069, 2035, 2024, 2034, 2076, 2042, 2043, + /* 660 */ 2079, 2058, 2060, 2062, 2063, 2061, 2066, }; -#define YY_REDUCE_COUNT (275) -#define YY_REDUCE_MIN (-389) -#define YY_REDUCE_MAX (2125) +#define YY_REDUCE_COUNT (274) +#define YY_REDUCE_MIN (-403) +#define YY_REDUCE_MAX (1873) static const short yy_reduce_ofst[] = { - /* 0 */ -75, 602, 629, -279, -15, 753, 815, 867, 923, 933, - /* 10 */ 273, 982, 104, 1042, 1052, 1101, 1152, 1204, 1214, 1231, - /* 20 */ 1291, 1308, 1376, 1394, 1453, 1502, 1523, 1581, 1591, 1643, - /* 30 */ 1660, 1709, 1726, 1775, 1829, 1839, 1890, 1908, 1967, 1988, - /* 40 */ 2044, 2054, 2078, 2125, -312, 33, 425, -295, 436, 490, - /* 50 */ -308, 654, -345, -68, 77, 151, 246, -316, -310, -307, - /* 60 */ -276, -285, -238, -87, -78, -313, -33, 239, 367, 418, - /* 70 */ 420, 427, 505, 623, 689, 161, 698, 722, 723, -234, - /* 80 */ 729, 730, 727, 742, 744, -244, -153, 749, 754, -10, - /* 90 */ 782, 767, 91, -124, -389, -389, -389, -164, -51, -30, - /* 100 */ -21, 100, 148, 205, 272, 311, 323, 357, 381, 382, - /* 110 */ 430, 464, 540, 603, 607, 640, 641, 28, -263, -335, - /* 120 */ 392, 443, 438, -229, -85, 234, 467, 570, 79, 18, - /* 130 */ 365, 312, 341, 413, 223, 665, 545, 596, 668, 610, - /* 140 */ 90, 220, 249, 308, 373, 387, 398, 252, 534, 518, - /* 150 */ 645, 571, 677, 693, 680, 781, 781, 839, 848, 817, - /* 160 */ 793, 769, 769, 769, 783, 758, 762, 763, 777, 781, - /* 170 */ 812, 814, 836, 876, 918, 919, 880, 884, 889, 928, - /* 180 */ 936, 941, 935, 945, 894, 946, 914, 950, 912, 911, - /* 190 */ 958, 916, 960, 961, 963, 969, 968, 976, 953, 956, - /* 200 */ 957, 959, 964, 965, 974, 975, 984, 985, 986, 978, - /* 210 */ 981, 947, 954, 1005, 930, 979, 1009, 1013, 1016, 971, - /* 220 */ 1017, 980, 988, 991, 993, 995, 987, 998, 992, 1030, - /* 230 */ 1022, 1038, 1014, 989, 1004, 962, 1000, 1023, 1028, 970, - /* 240 */ 1011, 1031, 1033, 781, 973, 972, 983, 990, 996, 999, - /* 250 */ 1024, 769, 1051, 1027, 997, 1029, 1003, 1018, 1036, 1032, - /* 260 */ 1037, 1055, 1070, 1062, 1086, 1098, 1095, 1105, 1109, 1053, - /* 270 */ 1068, 1113, 1114, 1118, 1132, 1149, + /* 0 */ 263, 629, 747, -278, -14, 679, 846, 886, 955, 1009, + /* 10 */ 272, 1059, 104, 1076, 1126, 806, 1152, 1202, 1214, 1228, + /* 20 */ 1281, 1334, 1346, 1360, 1414, 1428, 1440, 1497, 1507, 1523, + /* 30 */ 1547, 1603, 1623, 1643, 1663, 1683, 1723, 1739, 1790, 1806, + /* 40 */ 1857, 1873, 304, 926, 112, 435, 552, -295, 610, -3, + /* 50 */ -261, -154, -323, 305, 575, 577, 635, -310, -272, -312, + /* 60 */ -307, -403, -311, -284, -70, -90, 225, 346, 404, 414, + /* 70 */ 429, 434, 497, 644, 645, 339, 674, 697, 710, -342, + /* 80 */ 722, 749, -313, 758, 772, -244, -251, 797, -17, 20, + /* 90 */ 48, 804, 228, 86, -379, -379, -379, -240, -13, 100, + /* 100 */ 101, 130, 206, 375, 385, 428, 459, 461, 474, 522, + /* 110 */ 566, 628, 656, 678, 694, 696, 740, -226, -92, -72, + /* 120 */ -256, -130, 173, 4, 34, 186, 362, 440, 97, 91, + /* 130 */ 303, -234, -109, 180, 274, 536, 317, 545, 579, 234, + /* 140 */ -333, 40, 144, 175, 242, 319, 410, 450, 445, 348, + /* 150 */ 369, 495, 572, 557, 620, 620, 734, 667, 688, 727, + /* 160 */ 735, 735, 735, 770, 752, 784, 786, 762, 620, 861, + /* 170 */ 874, 866, 894, 940, 942, 901, 907, 908, 956, 957, + /* 180 */ 960, 971, 972, 915, 966, 936, 974, 933, 935, 978, + /* 190 */ 939, 981, 983, 985, 991, 989, 1000, 975, 976, 977, + /* 200 */ 979, 982, 984, 986, 990, 992, 995, 996, 998, 1006, + /* 210 */ 993, 951, 1021, 987, 997, 1026, 1030, 1033, 988, 1032, + /* 220 */ 1002, 1005, 1008, 1013, 1014, 1010, 1015, 1011, 1048, 1038, + /* 230 */ 1053, 1031, 1003, 1028, 968, 1020, 1036, 1037, 1004, 1022, + /* 240 */ 1044, 1049, 620, 1016, 1012, 1018, 1023, 1027, 1024, 1029, + /* 250 */ 735, 1061, 1035, 1045, 1017, 1039, 1046, 1034, 1051, 1050, + /* 260 */ 1052, 1081, 1067, 1092, 1129, 1104, 1112, 1136, 1096, 1086, + /* 270 */ 1137, 1138, 1142, 1130, 1168, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 10 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 20 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 30 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 40 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 50 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 60 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 70 */ 1464, 1464, 1464, 1464, 1464, 1538, 1464, 1464, 1464, 1464, - /* 80 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 90 */ 1464, 1464, 1536, 1694, 1464, 1871, 1464, 1464, 1464, 1464, - /* 100 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 110 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 120 */ 1464, 1464, 1538, 1464, 1536, 1883, 1883, 1883, 1464, 1464, - /* 130 */ 1464, 1464, 1737, 1737, 1464, 1464, 1464, 1464, 1636, 1464, - /* 140 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1729, 1464, 1952, - /* 150 */ 1464, 1464, 1464, 1735, 1906, 1464, 1464, 1464, 1464, 1589, - /* 160 */ 1898, 1875, 1889, 1876, 1873, 1937, 1937, 1937, 1892, 1464, - /* 170 */ 1902, 1464, 1722, 1699, 1464, 1464, 1699, 1696, 1696, 1464, - /* 180 */ 1464, 1464, 1464, 1464, 1464, 1538, 1464, 1538, 1464, 1464, - /* 190 */ 1538, 1464, 1538, 1538, 1538, 1464, 1538, 1464, 1464, 1464, - /* 200 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 210 */ 1464, 1464, 1464, 1536, 1731, 1464, 1536, 1464, 1464, 1464, - /* 220 */ 1536, 1911, 1464, 1464, 1464, 1464, 1911, 1464, 1464, 1536, - /* 230 */ 1464, 1536, 1464, 1464, 1464, 1913, 1911, 1464, 1464, 1913, - /* 240 */ 1911, 1464, 1464, 1464, 1925, 1921, 1913, 1929, 1927, 1904, - /* 250 */ 1902, 1889, 1464, 1464, 1943, 1939, 1955, 1943, 1939, 1943, - /* 260 */ 1939, 1464, 1605, 1464, 1464, 1464, 1536, 1496, 1464, 1724, - /* 270 */ 1737, 1639, 1639, 1639, 1539, 1469, 1464, 1464, 1464, 1464, - /* 280 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1808, 1924, - /* 290 */ 1923, 1847, 1846, 1845, 1843, 1807, 1464, 1601, 1806, 1805, - /* 300 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1799, 1800, - /* 310 */ 1798, 1797, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 320 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 330 */ 1872, 1464, 1940, 1944, 1464, 1464, 1464, 1464, 1464, 1783, - /* 340 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 350 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 360 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 370 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 380 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 390 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 400 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 410 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 420 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 430 */ 1464, 1464, 1464, 1464, 1501, 1464, 1464, 1464, 1464, 1464, - /* 440 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 450 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 460 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 470 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1573, 1572, - /* 480 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 490 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 500 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 510 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1741, 1464, 1464, - /* 520 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1905, 1464, 1464, - /* 530 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 540 */ 1464, 1464, 1464, 1783, 1464, 1922, 1464, 1882, 1878, 1464, - /* 550 */ 1464, 1874, 1782, 1464, 1464, 1938, 1464, 1464, 1464, 1464, - /* 560 */ 1464, 1464, 1464, 1464, 1464, 1867, 1464, 1464, 1840, 1825, - /* 570 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 580 */ 1793, 1464, 1464, 1464, 1464, 1464, 1633, 1464, 1464, 1464, - /* 590 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1618, - /* 600 */ 1616, 1615, 1614, 1464, 1611, 1464, 1464, 1464, 1464, 1642, - /* 610 */ 1641, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 620 */ 1464, 1464, 1464, 1557, 1464, 1464, 1464, 1464, 1464, 1464, - /* 630 */ 1464, 1464, 1549, 1464, 1548, 1464, 1464, 1464, 1464, 1464, - /* 640 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 650 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - /* 660 */ 1464, 1464, 1464, 1464, 1464, 1464, 1464, + /* 0 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 10 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 20 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 30 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 40 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 50 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 60 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 70 */ 1461, 1461, 1461, 1461, 1461, 1535, 1461, 1461, 1461, 1461, + /* 80 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 90 */ 1461, 1461, 1533, 1691, 1461, 1866, 1461, 1461, 1461, 1461, + /* 100 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 110 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 120 */ 1461, 1461, 1535, 1461, 1533, 1878, 1878, 1878, 1461, 1461, + /* 130 */ 1461, 1461, 1732, 1732, 1461, 1461, 1461, 1461, 1633, 1461, + /* 140 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1726, 1461, 1947, + /* 150 */ 1461, 1461, 1461, 1901, 1461, 1461, 1461, 1461, 1586, 1893, + /* 160 */ 1870, 1884, 1871, 1868, 1932, 1932, 1932, 1887, 1461, 1897, + /* 170 */ 1461, 1719, 1696, 1461, 1461, 1696, 1693, 1693, 1461, 1461, + /* 180 */ 1461, 1461, 1461, 1461, 1535, 1461, 1535, 1461, 1461, 1535, + /* 190 */ 1461, 1535, 1535, 1535, 1461, 1535, 1461, 1461, 1461, 1461, + /* 200 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 210 */ 1461, 1461, 1533, 1728, 1461, 1533, 1461, 1461, 1461, 1533, + /* 220 */ 1906, 1461, 1461, 1461, 1461, 1906, 1461, 1461, 1533, 1461, + /* 230 */ 1533, 1461, 1461, 1461, 1908, 1906, 1461, 1461, 1908, 1906, + /* 240 */ 1461, 1461, 1461, 1920, 1916, 1908, 1924, 1922, 1899, 1897, + /* 250 */ 1884, 1461, 1461, 1938, 1934, 1950, 1938, 1934, 1938, 1934, + /* 260 */ 1461, 1602, 1461, 1461, 1461, 1533, 1493, 1461, 1721, 1732, + /* 270 */ 1636, 1636, 1636, 1536, 1466, 1461, 1461, 1461, 1461, 1461, + /* 280 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1803, 1919, 1918, + /* 290 */ 1842, 1841, 1840, 1838, 1802, 1461, 1598, 1801, 1800, 1461, + /* 300 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1794, 1795, + /* 310 */ 1793, 1792, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 320 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 330 */ 1867, 1461, 1935, 1939, 1461, 1461, 1461, 1461, 1461, 1778, + /* 340 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 350 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 360 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 370 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 380 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 390 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 400 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 410 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 420 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 430 */ 1461, 1461, 1461, 1461, 1498, 1461, 1461, 1461, 1461, 1461, + /* 440 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 450 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 460 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 470 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1570, 1569, + /* 480 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 490 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 500 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 510 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1736, 1461, 1461, + /* 520 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1900, 1461, 1461, + /* 530 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 540 */ 1461, 1461, 1461, 1778, 1461, 1917, 1461, 1877, 1873, 1461, + /* 550 */ 1461, 1869, 1777, 1461, 1461, 1933, 1461, 1461, 1461, 1461, + /* 560 */ 1461, 1461, 1461, 1461, 1461, 1862, 1461, 1461, 1835, 1820, + /* 570 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 580 */ 1788, 1461, 1461, 1461, 1461, 1461, 1630, 1461, 1461, 1461, + /* 590 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1615, + /* 600 */ 1613, 1612, 1611, 1461, 1608, 1461, 1461, 1461, 1461, 1639, + /* 610 */ 1638, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 620 */ 1461, 1461, 1461, 1554, 1461, 1461, 1461, 1461, 1461, 1461, + /* 630 */ 1461, 1461, 1546, 1461, 1545, 1461, 1461, 1461, 1461, 1461, + /* 640 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 650 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + /* 660 */ 1461, 1461, 1461, 1461, 1461, 1461, 1461, }; /********** End of lemon-generated parsing tables *****************************/ @@ -1686,62 +1642,61 @@ static const char *const yyTokenName[] = { /* 368 */ "agg_func_opt", /* 369 */ "bufsize_opt", /* 370 */ "stream_name", - /* 371 */ "into_opt", - /* 372 */ "dnode_list", - /* 373 */ "where_clause_opt", - /* 374 */ "signed", - /* 375 */ "literal_func", - /* 376 */ "literal_list", - /* 377 */ "table_alias", - /* 378 */ "column_alias", - /* 379 */ "expression", - /* 380 */ "pseudo_column", - /* 381 */ "column_reference", - /* 382 */ "function_expression", - /* 383 */ "subquery", - /* 384 */ "star_func", - /* 385 */ "star_func_para_list", - /* 386 */ "noarg_func", - /* 387 */ "other_para_list", - /* 388 */ "star_func_para", - /* 389 */ "predicate", - /* 390 */ "compare_op", - /* 391 */ "in_op", - /* 392 */ "in_predicate_value", - /* 393 */ "boolean_value_expression", - /* 394 */ "boolean_primary", - /* 395 */ "common_expression", - /* 396 */ "from_clause_opt", - /* 397 */ "table_reference_list", - /* 398 */ "table_reference", - /* 399 */ "table_primary", - /* 400 */ "joined_table", - /* 401 */ "alias_opt", - /* 402 */ "parenthesized_joined_table", - /* 403 */ "join_type", - /* 404 */ "search_condition", - /* 405 */ "query_specification", - /* 406 */ "set_quantifier_opt", - /* 407 */ "select_list", - /* 408 */ "partition_by_clause_opt", - /* 409 */ "range_opt", - /* 410 */ "every_opt", - /* 411 */ "fill_opt", - /* 412 */ "twindow_clause_opt", - /* 413 */ "group_by_clause_opt", - /* 414 */ "having_clause_opt", - /* 415 */ "select_item", - /* 416 */ "fill_mode", - /* 417 */ "group_by_list", - /* 418 */ "query_expression_body", - /* 419 */ "order_by_clause_opt", - /* 420 */ "slimit_clause_opt", - /* 421 */ "limit_clause_opt", - /* 422 */ "query_primary", - /* 423 */ "sort_specification_list", - /* 424 */ "sort_specification", - /* 425 */ "ordering_specification_opt", - /* 426 */ "null_ordering_opt", + /* 371 */ "dnode_list", + /* 372 */ "where_clause_opt", + /* 373 */ "signed", + /* 374 */ "literal_func", + /* 375 */ "literal_list", + /* 376 */ "table_alias", + /* 377 */ "column_alias", + /* 378 */ "expression", + /* 379 */ "pseudo_column", + /* 380 */ "column_reference", + /* 381 */ "function_expression", + /* 382 */ "subquery", + /* 383 */ "star_func", + /* 384 */ "star_func_para_list", + /* 385 */ "noarg_func", + /* 386 */ "other_para_list", + /* 387 */ "star_func_para", + /* 388 */ "predicate", + /* 389 */ "compare_op", + /* 390 */ "in_op", + /* 391 */ "in_predicate_value", + /* 392 */ "boolean_value_expression", + /* 393 */ "boolean_primary", + /* 394 */ "common_expression", + /* 395 */ "from_clause_opt", + /* 396 */ "table_reference_list", + /* 397 */ "table_reference", + /* 398 */ "table_primary", + /* 399 */ "joined_table", + /* 400 */ "alias_opt", + /* 401 */ "parenthesized_joined_table", + /* 402 */ "join_type", + /* 403 */ "search_condition", + /* 404 */ "query_specification", + /* 405 */ "set_quantifier_opt", + /* 406 */ "select_list", + /* 407 */ "partition_by_clause_opt", + /* 408 */ "range_opt", + /* 409 */ "every_opt", + /* 410 */ "fill_opt", + /* 411 */ "twindow_clause_opt", + /* 412 */ "group_by_clause_opt", + /* 413 */ "having_clause_opt", + /* 414 */ "select_item", + /* 415 */ "fill_mode", + /* 416 */ "group_by_list", + /* 417 */ "query_expression_body", + /* 418 */ "order_by_clause_opt", + /* 419 */ "slimit_clause_opt", + /* 420 */ "limit_clause_opt", + /* 421 */ "query_primary", + /* 422 */ "sort_specification_list", + /* 423 */ "sort_specification", + /* 424 */ "ordering_specification_opt", + /* 425 */ "null_ordering_opt", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -2015,231 +1970,229 @@ static const char *const yyRuleName[] = { /* 263 */ "agg_func_opt ::= AGGREGATE", /* 264 */ "bufsize_opt ::=", /* 265 */ "bufsize_opt ::= BUFSIZE NK_INTEGER", - /* 266 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression", + /* 266 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression", /* 267 */ "cmd ::= DROP STREAM exists_opt stream_name", - /* 268 */ "into_opt ::=", - /* 269 */ "into_opt ::= INTO full_table_name", - /* 270 */ "stream_options ::=", - /* 271 */ "stream_options ::= stream_options TRIGGER AT_ONCE", - /* 272 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", - /* 273 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", - /* 274 */ "stream_options ::= stream_options WATERMARK duration_literal", - /* 275 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", - /* 276 */ "cmd ::= KILL CONNECTION NK_INTEGER", - /* 277 */ "cmd ::= KILL QUERY NK_STRING", - /* 278 */ "cmd ::= KILL TRANSACTION NK_INTEGER", - /* 279 */ "cmd ::= BALANCE VGROUP", - /* 280 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", - /* 281 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", - /* 282 */ "cmd ::= SPLIT VGROUP NK_INTEGER", - /* 283 */ "dnode_list ::= DNODE NK_INTEGER", - /* 284 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", - /* 285 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", - /* 286 */ "cmd ::= query_expression", - /* 287 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression", - /* 288 */ "cmd ::= INSERT INTO full_table_name query_expression", - /* 289 */ "literal ::= NK_INTEGER", - /* 290 */ "literal ::= NK_FLOAT", - /* 291 */ "literal ::= NK_STRING", - /* 292 */ "literal ::= NK_BOOL", - /* 293 */ "literal ::= TIMESTAMP NK_STRING", - /* 294 */ "literal ::= duration_literal", - /* 295 */ "literal ::= NULL", - /* 296 */ "literal ::= NK_QUESTION", - /* 297 */ "duration_literal ::= NK_VARIABLE", - /* 298 */ "signed ::= NK_INTEGER", - /* 299 */ "signed ::= NK_PLUS NK_INTEGER", - /* 300 */ "signed ::= NK_MINUS NK_INTEGER", - /* 301 */ "signed ::= NK_FLOAT", - /* 302 */ "signed ::= NK_PLUS NK_FLOAT", - /* 303 */ "signed ::= NK_MINUS NK_FLOAT", - /* 304 */ "signed_literal ::= signed", - /* 305 */ "signed_literal ::= NK_STRING", - /* 306 */ "signed_literal ::= NK_BOOL", - /* 307 */ "signed_literal ::= TIMESTAMP NK_STRING", - /* 308 */ "signed_literal ::= duration_literal", - /* 309 */ "signed_literal ::= NULL", - /* 310 */ "signed_literal ::= literal_func", - /* 311 */ "signed_literal ::= NK_QUESTION", - /* 312 */ "literal_list ::= signed_literal", - /* 313 */ "literal_list ::= literal_list NK_COMMA signed_literal", - /* 314 */ "db_name ::= NK_ID", - /* 315 */ "table_name ::= NK_ID", - /* 316 */ "column_name ::= NK_ID", - /* 317 */ "function_name ::= NK_ID", - /* 318 */ "table_alias ::= NK_ID", - /* 319 */ "column_alias ::= NK_ID", - /* 320 */ "user_name ::= NK_ID", - /* 321 */ "topic_name ::= NK_ID", - /* 322 */ "stream_name ::= NK_ID", - /* 323 */ "cgroup_name ::= NK_ID", - /* 324 */ "expression ::= literal", - /* 325 */ "expression ::= pseudo_column", - /* 326 */ "expression ::= column_reference", - /* 327 */ "expression ::= function_expression", - /* 328 */ "expression ::= subquery", - /* 329 */ "expression ::= NK_LP expression NK_RP", - /* 330 */ "expression ::= NK_PLUS expression", - /* 331 */ "expression ::= NK_MINUS expression", - /* 332 */ "expression ::= expression NK_PLUS expression", - /* 333 */ "expression ::= expression NK_MINUS expression", - /* 334 */ "expression ::= expression NK_STAR expression", - /* 335 */ "expression ::= expression NK_SLASH expression", - /* 336 */ "expression ::= expression NK_REM expression", - /* 337 */ "expression ::= column_reference NK_ARROW NK_STRING", - /* 338 */ "expression ::= expression NK_BITAND expression", - /* 339 */ "expression ::= expression NK_BITOR expression", - /* 340 */ "expression_list ::= expression", - /* 341 */ "expression_list ::= expression_list NK_COMMA expression", - /* 342 */ "column_reference ::= column_name", - /* 343 */ "column_reference ::= table_name NK_DOT column_name", - /* 344 */ "pseudo_column ::= ROWTS", - /* 345 */ "pseudo_column ::= TBNAME", - /* 346 */ "pseudo_column ::= table_name NK_DOT TBNAME", - /* 347 */ "pseudo_column ::= QSTART", - /* 348 */ "pseudo_column ::= QEND", - /* 349 */ "pseudo_column ::= QDURATION", - /* 350 */ "pseudo_column ::= WSTART", - /* 351 */ "pseudo_column ::= WEND", - /* 352 */ "pseudo_column ::= WDURATION", - /* 353 */ "function_expression ::= function_name NK_LP expression_list NK_RP", - /* 354 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", - /* 355 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", - /* 356 */ "function_expression ::= literal_func", - /* 357 */ "literal_func ::= noarg_func NK_LP NK_RP", - /* 358 */ "literal_func ::= NOW", - /* 359 */ "noarg_func ::= NOW", - /* 360 */ "noarg_func ::= TODAY", - /* 361 */ "noarg_func ::= TIMEZONE", - /* 362 */ "noarg_func ::= DATABASE", - /* 363 */ "noarg_func ::= CLIENT_VERSION", - /* 364 */ "noarg_func ::= SERVER_VERSION", - /* 365 */ "noarg_func ::= SERVER_STATUS", - /* 366 */ "noarg_func ::= CURRENT_USER", - /* 367 */ "noarg_func ::= USER", - /* 368 */ "star_func ::= COUNT", - /* 369 */ "star_func ::= FIRST", - /* 370 */ "star_func ::= LAST", - /* 371 */ "star_func ::= LAST_ROW", - /* 372 */ "star_func_para_list ::= NK_STAR", - /* 373 */ "star_func_para_list ::= other_para_list", - /* 374 */ "other_para_list ::= star_func_para", - /* 375 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", - /* 376 */ "star_func_para ::= expression", - /* 377 */ "star_func_para ::= table_name NK_DOT NK_STAR", - /* 378 */ "predicate ::= expression compare_op expression", - /* 379 */ "predicate ::= expression BETWEEN expression AND expression", - /* 380 */ "predicate ::= expression NOT BETWEEN expression AND expression", - /* 381 */ "predicate ::= expression IS NULL", - /* 382 */ "predicate ::= expression IS NOT NULL", - /* 383 */ "predicate ::= expression in_op in_predicate_value", - /* 384 */ "compare_op ::= NK_LT", - /* 385 */ "compare_op ::= NK_GT", - /* 386 */ "compare_op ::= NK_LE", - /* 387 */ "compare_op ::= NK_GE", - /* 388 */ "compare_op ::= NK_NE", - /* 389 */ "compare_op ::= NK_EQ", - /* 390 */ "compare_op ::= LIKE", - /* 391 */ "compare_op ::= NOT LIKE", - /* 392 */ "compare_op ::= MATCH", - /* 393 */ "compare_op ::= NMATCH", - /* 394 */ "compare_op ::= CONTAINS", - /* 395 */ "in_op ::= IN", - /* 396 */ "in_op ::= NOT IN", - /* 397 */ "in_predicate_value ::= NK_LP literal_list NK_RP", - /* 398 */ "boolean_value_expression ::= boolean_primary", - /* 399 */ "boolean_value_expression ::= NOT boolean_primary", - /* 400 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", - /* 401 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", - /* 402 */ "boolean_primary ::= predicate", - /* 403 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", - /* 404 */ "common_expression ::= expression", - /* 405 */ "common_expression ::= boolean_value_expression", - /* 406 */ "from_clause_opt ::=", - /* 407 */ "from_clause_opt ::= FROM table_reference_list", - /* 408 */ "table_reference_list ::= table_reference", - /* 409 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", - /* 410 */ "table_reference ::= table_primary", - /* 411 */ "table_reference ::= joined_table", - /* 412 */ "table_primary ::= table_name alias_opt", - /* 413 */ "table_primary ::= db_name NK_DOT table_name alias_opt", - /* 414 */ "table_primary ::= subquery alias_opt", - /* 415 */ "table_primary ::= parenthesized_joined_table", - /* 416 */ "alias_opt ::=", - /* 417 */ "alias_opt ::= table_alias", - /* 418 */ "alias_opt ::= AS table_alias", - /* 419 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", - /* 420 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", - /* 421 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", - /* 422 */ "join_type ::=", - /* 423 */ "join_type ::= INNER", - /* 424 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", - /* 425 */ "set_quantifier_opt ::=", - /* 426 */ "set_quantifier_opt ::= DISTINCT", - /* 427 */ "set_quantifier_opt ::= ALL", - /* 428 */ "select_list ::= select_item", - /* 429 */ "select_list ::= select_list NK_COMMA select_item", - /* 430 */ "select_item ::= NK_STAR", - /* 431 */ "select_item ::= common_expression", - /* 432 */ "select_item ::= common_expression column_alias", - /* 433 */ "select_item ::= common_expression AS column_alias", - /* 434 */ "select_item ::= table_name NK_DOT NK_STAR", - /* 435 */ "where_clause_opt ::=", - /* 436 */ "where_clause_opt ::= WHERE search_condition", - /* 437 */ "partition_by_clause_opt ::=", - /* 438 */ "partition_by_clause_opt ::= PARTITION BY expression_list", - /* 439 */ "twindow_clause_opt ::=", - /* 440 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", - /* 441 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", - /* 442 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", - /* 443 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", - /* 444 */ "sliding_opt ::=", - /* 445 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", - /* 446 */ "fill_opt ::=", - /* 447 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", - /* 448 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", - /* 449 */ "fill_mode ::= NONE", - /* 450 */ "fill_mode ::= PREV", - /* 451 */ "fill_mode ::= NULL", - /* 452 */ "fill_mode ::= LINEAR", - /* 453 */ "fill_mode ::= NEXT", - /* 454 */ "group_by_clause_opt ::=", - /* 455 */ "group_by_clause_opt ::= GROUP BY group_by_list", - /* 456 */ "group_by_list ::= expression", - /* 457 */ "group_by_list ::= group_by_list NK_COMMA expression", - /* 458 */ "having_clause_opt ::=", - /* 459 */ "having_clause_opt ::= HAVING search_condition", - /* 460 */ "range_opt ::=", - /* 461 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", - /* 462 */ "every_opt ::=", - /* 463 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", - /* 464 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", - /* 465 */ "query_expression_body ::= query_primary", - /* 466 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", - /* 467 */ "query_expression_body ::= query_expression_body UNION query_expression_body", - /* 468 */ "query_primary ::= query_specification", - /* 469 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", - /* 470 */ "order_by_clause_opt ::=", - /* 471 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", - /* 472 */ "slimit_clause_opt ::=", - /* 473 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", - /* 474 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", - /* 475 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 476 */ "limit_clause_opt ::=", - /* 477 */ "limit_clause_opt ::= LIMIT NK_INTEGER", - /* 478 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", - /* 479 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", - /* 480 */ "subquery ::= NK_LP query_expression NK_RP", - /* 481 */ "search_condition ::= common_expression", - /* 482 */ "sort_specification_list ::= sort_specification", - /* 483 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", - /* 484 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", - /* 485 */ "ordering_specification_opt ::=", - /* 486 */ "ordering_specification_opt ::= ASC", - /* 487 */ "ordering_specification_opt ::= DESC", - /* 488 */ "null_ordering_opt ::=", - /* 489 */ "null_ordering_opt ::= NULLS FIRST", - /* 490 */ "null_ordering_opt ::= NULLS LAST", + /* 268 */ "stream_options ::=", + /* 269 */ "stream_options ::= stream_options TRIGGER AT_ONCE", + /* 270 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE", + /* 271 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal", + /* 272 */ "stream_options ::= stream_options WATERMARK duration_literal", + /* 273 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER", + /* 274 */ "cmd ::= KILL CONNECTION NK_INTEGER", + /* 275 */ "cmd ::= KILL QUERY NK_STRING", + /* 276 */ "cmd ::= KILL TRANSACTION NK_INTEGER", + /* 277 */ "cmd ::= BALANCE VGROUP", + /* 278 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER", + /* 279 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list", + /* 280 */ "cmd ::= SPLIT VGROUP NK_INTEGER", + /* 281 */ "dnode_list ::= DNODE NK_INTEGER", + /* 282 */ "dnode_list ::= dnode_list DNODE NK_INTEGER", + /* 283 */ "cmd ::= DELETE FROM full_table_name where_clause_opt", + /* 284 */ "cmd ::= query_expression", + /* 285 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression", + /* 286 */ "cmd ::= INSERT INTO full_table_name query_expression", + /* 287 */ "literal ::= NK_INTEGER", + /* 288 */ "literal ::= NK_FLOAT", + /* 289 */ "literal ::= NK_STRING", + /* 290 */ "literal ::= NK_BOOL", + /* 291 */ "literal ::= TIMESTAMP NK_STRING", + /* 292 */ "literal ::= duration_literal", + /* 293 */ "literal ::= NULL", + /* 294 */ "literal ::= NK_QUESTION", + /* 295 */ "duration_literal ::= NK_VARIABLE", + /* 296 */ "signed ::= NK_INTEGER", + /* 297 */ "signed ::= NK_PLUS NK_INTEGER", + /* 298 */ "signed ::= NK_MINUS NK_INTEGER", + /* 299 */ "signed ::= NK_FLOAT", + /* 300 */ "signed ::= NK_PLUS NK_FLOAT", + /* 301 */ "signed ::= NK_MINUS NK_FLOAT", + /* 302 */ "signed_literal ::= signed", + /* 303 */ "signed_literal ::= NK_STRING", + /* 304 */ "signed_literal ::= NK_BOOL", + /* 305 */ "signed_literal ::= TIMESTAMP NK_STRING", + /* 306 */ "signed_literal ::= duration_literal", + /* 307 */ "signed_literal ::= NULL", + /* 308 */ "signed_literal ::= literal_func", + /* 309 */ "signed_literal ::= NK_QUESTION", + /* 310 */ "literal_list ::= signed_literal", + /* 311 */ "literal_list ::= literal_list NK_COMMA signed_literal", + /* 312 */ "db_name ::= NK_ID", + /* 313 */ "table_name ::= NK_ID", + /* 314 */ "column_name ::= NK_ID", + /* 315 */ "function_name ::= NK_ID", + /* 316 */ "table_alias ::= NK_ID", + /* 317 */ "column_alias ::= NK_ID", + /* 318 */ "user_name ::= NK_ID", + /* 319 */ "topic_name ::= NK_ID", + /* 320 */ "stream_name ::= NK_ID", + /* 321 */ "cgroup_name ::= NK_ID", + /* 322 */ "expression ::= literal", + /* 323 */ "expression ::= pseudo_column", + /* 324 */ "expression ::= column_reference", + /* 325 */ "expression ::= function_expression", + /* 326 */ "expression ::= subquery", + /* 327 */ "expression ::= NK_LP expression NK_RP", + /* 328 */ "expression ::= NK_PLUS expression", + /* 329 */ "expression ::= NK_MINUS expression", + /* 330 */ "expression ::= expression NK_PLUS expression", + /* 331 */ "expression ::= expression NK_MINUS expression", + /* 332 */ "expression ::= expression NK_STAR expression", + /* 333 */ "expression ::= expression NK_SLASH expression", + /* 334 */ "expression ::= expression NK_REM expression", + /* 335 */ "expression ::= column_reference NK_ARROW NK_STRING", + /* 336 */ "expression ::= expression NK_BITAND expression", + /* 337 */ "expression ::= expression NK_BITOR expression", + /* 338 */ "expression_list ::= expression", + /* 339 */ "expression_list ::= expression_list NK_COMMA expression", + /* 340 */ "column_reference ::= column_name", + /* 341 */ "column_reference ::= table_name NK_DOT column_name", + /* 342 */ "pseudo_column ::= ROWTS", + /* 343 */ "pseudo_column ::= TBNAME", + /* 344 */ "pseudo_column ::= table_name NK_DOT TBNAME", + /* 345 */ "pseudo_column ::= QSTART", + /* 346 */ "pseudo_column ::= QEND", + /* 347 */ "pseudo_column ::= QDURATION", + /* 348 */ "pseudo_column ::= WSTART", + /* 349 */ "pseudo_column ::= WEND", + /* 350 */ "pseudo_column ::= WDURATION", + /* 351 */ "function_expression ::= function_name NK_LP expression_list NK_RP", + /* 352 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP", + /* 353 */ "function_expression ::= CAST NK_LP expression AS type_name NK_RP", + /* 354 */ "function_expression ::= literal_func", + /* 355 */ "literal_func ::= noarg_func NK_LP NK_RP", + /* 356 */ "literal_func ::= NOW", + /* 357 */ "noarg_func ::= NOW", + /* 358 */ "noarg_func ::= TODAY", + /* 359 */ "noarg_func ::= TIMEZONE", + /* 360 */ "noarg_func ::= DATABASE", + /* 361 */ "noarg_func ::= CLIENT_VERSION", + /* 362 */ "noarg_func ::= SERVER_VERSION", + /* 363 */ "noarg_func ::= SERVER_STATUS", + /* 364 */ "noarg_func ::= CURRENT_USER", + /* 365 */ "noarg_func ::= USER", + /* 366 */ "star_func ::= COUNT", + /* 367 */ "star_func ::= FIRST", + /* 368 */ "star_func ::= LAST", + /* 369 */ "star_func ::= LAST_ROW", + /* 370 */ "star_func_para_list ::= NK_STAR", + /* 371 */ "star_func_para_list ::= other_para_list", + /* 372 */ "other_para_list ::= star_func_para", + /* 373 */ "other_para_list ::= other_para_list NK_COMMA star_func_para", + /* 374 */ "star_func_para ::= expression", + /* 375 */ "star_func_para ::= table_name NK_DOT NK_STAR", + /* 376 */ "predicate ::= expression compare_op expression", + /* 377 */ "predicate ::= expression BETWEEN expression AND expression", + /* 378 */ "predicate ::= expression NOT BETWEEN expression AND expression", + /* 379 */ "predicate ::= expression IS NULL", + /* 380 */ "predicate ::= expression IS NOT NULL", + /* 381 */ "predicate ::= expression in_op in_predicate_value", + /* 382 */ "compare_op ::= NK_LT", + /* 383 */ "compare_op ::= NK_GT", + /* 384 */ "compare_op ::= NK_LE", + /* 385 */ "compare_op ::= NK_GE", + /* 386 */ "compare_op ::= NK_NE", + /* 387 */ "compare_op ::= NK_EQ", + /* 388 */ "compare_op ::= LIKE", + /* 389 */ "compare_op ::= NOT LIKE", + /* 390 */ "compare_op ::= MATCH", + /* 391 */ "compare_op ::= NMATCH", + /* 392 */ "compare_op ::= CONTAINS", + /* 393 */ "in_op ::= IN", + /* 394 */ "in_op ::= NOT IN", + /* 395 */ "in_predicate_value ::= NK_LP literal_list NK_RP", + /* 396 */ "boolean_value_expression ::= boolean_primary", + /* 397 */ "boolean_value_expression ::= NOT boolean_primary", + /* 398 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression", + /* 399 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression", + /* 400 */ "boolean_primary ::= predicate", + /* 401 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP", + /* 402 */ "common_expression ::= expression", + /* 403 */ "common_expression ::= boolean_value_expression", + /* 404 */ "from_clause_opt ::=", + /* 405 */ "from_clause_opt ::= FROM table_reference_list", + /* 406 */ "table_reference_list ::= table_reference", + /* 407 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference", + /* 408 */ "table_reference ::= table_primary", + /* 409 */ "table_reference ::= joined_table", + /* 410 */ "table_primary ::= table_name alias_opt", + /* 411 */ "table_primary ::= db_name NK_DOT table_name alias_opt", + /* 412 */ "table_primary ::= subquery alias_opt", + /* 413 */ "table_primary ::= parenthesized_joined_table", + /* 414 */ "alias_opt ::=", + /* 415 */ "alias_opt ::= table_alias", + /* 416 */ "alias_opt ::= AS table_alias", + /* 417 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP", + /* 418 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP", + /* 419 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition", + /* 420 */ "join_type ::=", + /* 421 */ "join_type ::= INNER", + /* 422 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt", + /* 423 */ "set_quantifier_opt ::=", + /* 424 */ "set_quantifier_opt ::= DISTINCT", + /* 425 */ "set_quantifier_opt ::= ALL", + /* 426 */ "select_list ::= select_item", + /* 427 */ "select_list ::= select_list NK_COMMA select_item", + /* 428 */ "select_item ::= NK_STAR", + /* 429 */ "select_item ::= common_expression", + /* 430 */ "select_item ::= common_expression column_alias", + /* 431 */ "select_item ::= common_expression AS column_alias", + /* 432 */ "select_item ::= table_name NK_DOT NK_STAR", + /* 433 */ "where_clause_opt ::=", + /* 434 */ "where_clause_opt ::= WHERE search_condition", + /* 435 */ "partition_by_clause_opt ::=", + /* 436 */ "partition_by_clause_opt ::= PARTITION BY expression_list", + /* 437 */ "twindow_clause_opt ::=", + /* 438 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP", + /* 439 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP", + /* 440 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt", + /* 441 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt", + /* 442 */ "sliding_opt ::=", + /* 443 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP", + /* 444 */ "fill_opt ::=", + /* 445 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP", + /* 446 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP", + /* 447 */ "fill_mode ::= NONE", + /* 448 */ "fill_mode ::= PREV", + /* 449 */ "fill_mode ::= NULL", + /* 450 */ "fill_mode ::= LINEAR", + /* 451 */ "fill_mode ::= NEXT", + /* 452 */ "group_by_clause_opt ::=", + /* 453 */ "group_by_clause_opt ::= GROUP BY group_by_list", + /* 454 */ "group_by_list ::= expression", + /* 455 */ "group_by_list ::= group_by_list NK_COMMA expression", + /* 456 */ "having_clause_opt ::=", + /* 457 */ "having_clause_opt ::= HAVING search_condition", + /* 458 */ "range_opt ::=", + /* 459 */ "range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP", + /* 460 */ "every_opt ::=", + /* 461 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP", + /* 462 */ "query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt", + /* 463 */ "query_expression_body ::= query_primary", + /* 464 */ "query_expression_body ::= query_expression_body UNION ALL query_expression_body", + /* 465 */ "query_expression_body ::= query_expression_body UNION query_expression_body", + /* 466 */ "query_primary ::= query_specification", + /* 467 */ "query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP", + /* 468 */ "order_by_clause_opt ::=", + /* 469 */ "order_by_clause_opt ::= ORDER BY sort_specification_list", + /* 470 */ "slimit_clause_opt ::=", + /* 471 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER", + /* 472 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER", + /* 473 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 474 */ "limit_clause_opt ::=", + /* 475 */ "limit_clause_opt ::= LIMIT NK_INTEGER", + /* 476 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER", + /* 477 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER", + /* 478 */ "subquery ::= NK_LP query_expression NK_RP", + /* 479 */ "search_condition ::= common_expression", + /* 480 */ "sort_specification_list ::= sort_specification", + /* 481 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification", + /* 482 */ "sort_specification ::= expression ordering_specification_opt null_ordering_opt", + /* 483 */ "ordering_specification_opt ::=", + /* 484 */ "ordering_specification_opt ::= ASC", + /* 485 */ "ordering_specification_opt ::= DESC", + /* 486 */ "null_ordering_opt ::=", + /* 487 */ "null_ordering_opt ::= NULLS FIRST", + /* 488 */ "null_ordering_opt ::= NULLS LAST", }; #endif /* NDEBUG */ @@ -2393,42 +2346,41 @@ static void yy_destructor( case 362: /* stream_options */ case 364: /* query_expression */ case 367: /* explain_options */ - case 371: /* into_opt */ - case 373: /* where_clause_opt */ - case 374: /* signed */ - case 375: /* literal_func */ - case 379: /* expression */ - case 380: /* pseudo_column */ - case 381: /* column_reference */ - case 382: /* function_expression */ - case 383: /* subquery */ - case 388: /* star_func_para */ - case 389: /* predicate */ - case 392: /* in_predicate_value */ - case 393: /* boolean_value_expression */ - case 394: /* boolean_primary */ - case 395: /* common_expression */ - case 396: /* from_clause_opt */ - case 397: /* table_reference_list */ - case 398: /* table_reference */ - case 399: /* table_primary */ - case 400: /* joined_table */ - case 402: /* parenthesized_joined_table */ - case 404: /* search_condition */ - case 405: /* query_specification */ - case 409: /* range_opt */ - case 410: /* every_opt */ - case 411: /* fill_opt */ - case 412: /* twindow_clause_opt */ - case 414: /* having_clause_opt */ - case 415: /* select_item */ - case 418: /* query_expression_body */ - case 420: /* slimit_clause_opt */ - case 421: /* limit_clause_opt */ - case 422: /* query_primary */ - case 424: /* sort_specification */ + case 372: /* where_clause_opt */ + case 373: /* signed */ + case 374: /* literal_func */ + case 378: /* expression */ + case 379: /* pseudo_column */ + case 380: /* column_reference */ + case 381: /* function_expression */ + case 382: /* subquery */ + case 387: /* star_func_para */ + case 388: /* predicate */ + case 391: /* in_predicate_value */ + case 392: /* boolean_value_expression */ + case 393: /* boolean_primary */ + case 394: /* common_expression */ + case 395: /* from_clause_opt */ + case 396: /* table_reference_list */ + case 397: /* table_reference */ + case 398: /* table_primary */ + case 399: /* joined_table */ + case 401: /* parenthesized_joined_table */ + case 403: /* search_condition */ + case 404: /* query_specification */ + case 408: /* range_opt */ + case 409: /* every_opt */ + case 410: /* fill_opt */ + case 411: /* twindow_clause_opt */ + case 413: /* having_clause_opt */ + case 414: /* select_item */ + case 417: /* query_expression_body */ + case 419: /* slimit_clause_opt */ + case 420: /* limit_clause_opt */ + case 421: /* query_primary */ + case 423: /* sort_specification */ { - nodesDestroyNode((yypminor->yy840)); + nodesDestroyNode((yypminor->yy272)); } break; case 306: /* account_options */ @@ -2449,11 +2401,11 @@ static void yy_destructor( case 363: /* topic_name */ case 365: /* cgroup_name */ case 370: /* stream_name */ - case 377: /* table_alias */ - case 378: /* column_alias */ - case 384: /* star_func */ - case 386: /* noarg_func */ - case 401: /* alias_opt */ + case 376: /* table_alias */ + case 377: /* column_alias */ + case 383: /* star_func */ + case 385: /* noarg_func */ + case 400: /* alias_opt */ { } @@ -2474,7 +2426,7 @@ static void yy_destructor( case 320: /* exists_opt */ case 366: /* analyze_opt */ case 368: /* agg_func_opt */ - case 406: /* set_quantifier_opt */ + case 405: /* set_quantifier_opt */ { } @@ -2493,18 +2445,18 @@ static void yy_destructor( case 346: /* duration_list */ case 347: /* rollup_func_list */ case 358: /* func_list */ - case 372: /* dnode_list */ - case 376: /* literal_list */ - case 385: /* star_func_para_list */ - case 387: /* other_para_list */ - case 407: /* select_list */ - case 408: /* partition_by_clause_opt */ - case 413: /* group_by_clause_opt */ - case 417: /* group_by_list */ - case 419: /* order_by_clause_opt */ - case 423: /* sort_specification_list */ + case 371: /* dnode_list */ + case 375: /* literal_list */ + case 384: /* star_func_para_list */ + case 386: /* other_para_list */ + case 406: /* select_list */ + case 407: /* partition_by_clause_opt */ + case 412: /* group_by_clause_opt */ + case 416: /* group_by_list */ + case 418: /* order_by_clause_opt */ + case 422: /* sort_specification_list */ { - nodesDestroyList((yypminor->yy544)); + nodesDestroyList((yypminor->yy172)); } break; case 325: /* alter_db_option */ @@ -2518,28 +2470,28 @@ static void yy_destructor( } break; - case 390: /* compare_op */ - case 391: /* in_op */ + case 389: /* compare_op */ + case 390: /* in_op */ { } break; - case 403: /* join_type */ + case 402: /* join_type */ { } break; - case 416: /* fill_mode */ + case 415: /* fill_mode */ { } break; - case 425: /* ordering_specification_opt */ + case 424: /* ordering_specification_opt */ { } break; - case 426: /* null_ordering_opt */ + case 425: /* null_ordering_opt */ { } @@ -3104,231 +3056,229 @@ static const struct { { 368, -1 }, /* (263) agg_func_opt ::= AGGREGATE */ { 369, 0 }, /* (264) bufsize_opt ::= */ { 369, -2 }, /* (265) bufsize_opt ::= BUFSIZE NK_INTEGER */ - { 305, -8 }, /* (266) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ + { 305, -9 }, /* (266) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression */ { 305, -4 }, /* (267) cmd ::= DROP STREAM exists_opt stream_name */ - { 371, 0 }, /* (268) into_opt ::= */ - { 371, -2 }, /* (269) into_opt ::= INTO full_table_name */ - { 362, 0 }, /* (270) stream_options ::= */ - { 362, -3 }, /* (271) stream_options ::= stream_options TRIGGER AT_ONCE */ - { 362, -3 }, /* (272) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ - { 362, -4 }, /* (273) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ - { 362, -3 }, /* (274) stream_options ::= stream_options WATERMARK duration_literal */ - { 362, -4 }, /* (275) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ - { 305, -3 }, /* (276) cmd ::= KILL CONNECTION NK_INTEGER */ - { 305, -3 }, /* (277) cmd ::= KILL QUERY NK_STRING */ - { 305, -3 }, /* (278) cmd ::= KILL TRANSACTION NK_INTEGER */ - { 305, -2 }, /* (279) cmd ::= BALANCE VGROUP */ - { 305, -4 }, /* (280) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ - { 305, -4 }, /* (281) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ - { 305, -3 }, /* (282) cmd ::= SPLIT VGROUP NK_INTEGER */ - { 372, -2 }, /* (283) dnode_list ::= DNODE NK_INTEGER */ - { 372, -3 }, /* (284) dnode_list ::= dnode_list DNODE NK_INTEGER */ - { 305, -4 }, /* (285) cmd ::= DELETE FROM full_table_name where_clause_opt */ - { 305, -1 }, /* (286) cmd ::= query_expression */ - { 305, -7 }, /* (287) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ - { 305, -4 }, /* (288) cmd ::= INSERT INTO full_table_name query_expression */ - { 308, -1 }, /* (289) literal ::= NK_INTEGER */ - { 308, -1 }, /* (290) literal ::= NK_FLOAT */ - { 308, -1 }, /* (291) literal ::= NK_STRING */ - { 308, -1 }, /* (292) literal ::= NK_BOOL */ - { 308, -2 }, /* (293) literal ::= TIMESTAMP NK_STRING */ - { 308, -1 }, /* (294) literal ::= duration_literal */ - { 308, -1 }, /* (295) literal ::= NULL */ - { 308, -1 }, /* (296) literal ::= NK_QUESTION */ - { 349, -1 }, /* (297) duration_literal ::= NK_VARIABLE */ - { 374, -1 }, /* (298) signed ::= NK_INTEGER */ - { 374, -2 }, /* (299) signed ::= NK_PLUS NK_INTEGER */ - { 374, -2 }, /* (300) signed ::= NK_MINUS NK_INTEGER */ - { 374, -1 }, /* (301) signed ::= NK_FLOAT */ - { 374, -2 }, /* (302) signed ::= NK_PLUS NK_FLOAT */ - { 374, -2 }, /* (303) signed ::= NK_MINUS NK_FLOAT */ - { 338, -1 }, /* (304) signed_literal ::= signed */ - { 338, -1 }, /* (305) signed_literal ::= NK_STRING */ - { 338, -1 }, /* (306) signed_literal ::= NK_BOOL */ - { 338, -2 }, /* (307) signed_literal ::= TIMESTAMP NK_STRING */ - { 338, -1 }, /* (308) signed_literal ::= duration_literal */ - { 338, -1 }, /* (309) signed_literal ::= NULL */ - { 338, -1 }, /* (310) signed_literal ::= literal_func */ - { 338, -1 }, /* (311) signed_literal ::= NK_QUESTION */ - { 376, -1 }, /* (312) literal_list ::= signed_literal */ - { 376, -3 }, /* (313) literal_list ::= literal_list NK_COMMA signed_literal */ - { 316, -1 }, /* (314) db_name ::= NK_ID */ - { 344, -1 }, /* (315) table_name ::= NK_ID */ - { 336, -1 }, /* (316) column_name ::= NK_ID */ - { 351, -1 }, /* (317) function_name ::= NK_ID */ - { 377, -1 }, /* (318) table_alias ::= NK_ID */ - { 378, -1 }, /* (319) column_alias ::= NK_ID */ - { 310, -1 }, /* (320) user_name ::= NK_ID */ - { 363, -1 }, /* (321) topic_name ::= NK_ID */ - { 370, -1 }, /* (322) stream_name ::= NK_ID */ - { 365, -1 }, /* (323) cgroup_name ::= NK_ID */ - { 379, -1 }, /* (324) expression ::= literal */ - { 379, -1 }, /* (325) expression ::= pseudo_column */ - { 379, -1 }, /* (326) expression ::= column_reference */ - { 379, -1 }, /* (327) expression ::= function_expression */ - { 379, -1 }, /* (328) expression ::= subquery */ - { 379, -3 }, /* (329) expression ::= NK_LP expression NK_RP */ - { 379, -2 }, /* (330) expression ::= NK_PLUS expression */ - { 379, -2 }, /* (331) expression ::= NK_MINUS expression */ - { 379, -3 }, /* (332) expression ::= expression NK_PLUS expression */ - { 379, -3 }, /* (333) expression ::= expression NK_MINUS expression */ - { 379, -3 }, /* (334) expression ::= expression NK_STAR expression */ - { 379, -3 }, /* (335) expression ::= expression NK_SLASH expression */ - { 379, -3 }, /* (336) expression ::= expression NK_REM expression */ - { 379, -3 }, /* (337) expression ::= column_reference NK_ARROW NK_STRING */ - { 379, -3 }, /* (338) expression ::= expression NK_BITAND expression */ - { 379, -3 }, /* (339) expression ::= expression NK_BITOR expression */ - { 341, -1 }, /* (340) expression_list ::= expression */ - { 341, -3 }, /* (341) expression_list ::= expression_list NK_COMMA expression */ - { 381, -1 }, /* (342) column_reference ::= column_name */ - { 381, -3 }, /* (343) column_reference ::= table_name NK_DOT column_name */ - { 380, -1 }, /* (344) pseudo_column ::= ROWTS */ - { 380, -1 }, /* (345) pseudo_column ::= TBNAME */ - { 380, -3 }, /* (346) pseudo_column ::= table_name NK_DOT TBNAME */ - { 380, -1 }, /* (347) pseudo_column ::= QSTART */ - { 380, -1 }, /* (348) pseudo_column ::= QEND */ - { 380, -1 }, /* (349) pseudo_column ::= QDURATION */ - { 380, -1 }, /* (350) pseudo_column ::= WSTART */ - { 380, -1 }, /* (351) pseudo_column ::= WEND */ - { 380, -1 }, /* (352) pseudo_column ::= WDURATION */ - { 382, -4 }, /* (353) function_expression ::= function_name NK_LP expression_list NK_RP */ - { 382, -4 }, /* (354) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ - { 382, -6 }, /* (355) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ - { 382, -1 }, /* (356) function_expression ::= literal_func */ - { 375, -3 }, /* (357) literal_func ::= noarg_func NK_LP NK_RP */ - { 375, -1 }, /* (358) literal_func ::= NOW */ - { 386, -1 }, /* (359) noarg_func ::= NOW */ - { 386, -1 }, /* (360) noarg_func ::= TODAY */ - { 386, -1 }, /* (361) noarg_func ::= TIMEZONE */ - { 386, -1 }, /* (362) noarg_func ::= DATABASE */ - { 386, -1 }, /* (363) noarg_func ::= CLIENT_VERSION */ - { 386, -1 }, /* (364) noarg_func ::= SERVER_VERSION */ - { 386, -1 }, /* (365) noarg_func ::= SERVER_STATUS */ - { 386, -1 }, /* (366) noarg_func ::= CURRENT_USER */ - { 386, -1 }, /* (367) noarg_func ::= USER */ - { 384, -1 }, /* (368) star_func ::= COUNT */ - { 384, -1 }, /* (369) star_func ::= FIRST */ - { 384, -1 }, /* (370) star_func ::= LAST */ - { 384, -1 }, /* (371) star_func ::= LAST_ROW */ - { 385, -1 }, /* (372) star_func_para_list ::= NK_STAR */ - { 385, -1 }, /* (373) star_func_para_list ::= other_para_list */ - { 387, -1 }, /* (374) other_para_list ::= star_func_para */ - { 387, -3 }, /* (375) other_para_list ::= other_para_list NK_COMMA star_func_para */ - { 388, -1 }, /* (376) star_func_para ::= expression */ - { 388, -3 }, /* (377) star_func_para ::= table_name NK_DOT NK_STAR */ - { 389, -3 }, /* (378) predicate ::= expression compare_op expression */ - { 389, -5 }, /* (379) predicate ::= expression BETWEEN expression AND expression */ - { 389, -6 }, /* (380) predicate ::= expression NOT BETWEEN expression AND expression */ - { 389, -3 }, /* (381) predicate ::= expression IS NULL */ - { 389, -4 }, /* (382) predicate ::= expression IS NOT NULL */ - { 389, -3 }, /* (383) predicate ::= expression in_op in_predicate_value */ - { 390, -1 }, /* (384) compare_op ::= NK_LT */ - { 390, -1 }, /* (385) compare_op ::= NK_GT */ - { 390, -1 }, /* (386) compare_op ::= NK_LE */ - { 390, -1 }, /* (387) compare_op ::= NK_GE */ - { 390, -1 }, /* (388) compare_op ::= NK_NE */ - { 390, -1 }, /* (389) compare_op ::= NK_EQ */ - { 390, -1 }, /* (390) compare_op ::= LIKE */ - { 390, -2 }, /* (391) compare_op ::= NOT LIKE */ - { 390, -1 }, /* (392) compare_op ::= MATCH */ - { 390, -1 }, /* (393) compare_op ::= NMATCH */ - { 390, -1 }, /* (394) compare_op ::= CONTAINS */ - { 391, -1 }, /* (395) in_op ::= IN */ - { 391, -2 }, /* (396) in_op ::= NOT IN */ - { 392, -3 }, /* (397) in_predicate_value ::= NK_LP literal_list NK_RP */ - { 393, -1 }, /* (398) boolean_value_expression ::= boolean_primary */ - { 393, -2 }, /* (399) boolean_value_expression ::= NOT boolean_primary */ - { 393, -3 }, /* (400) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ - { 393, -3 }, /* (401) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ - { 394, -1 }, /* (402) boolean_primary ::= predicate */ - { 394, -3 }, /* (403) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ - { 395, -1 }, /* (404) common_expression ::= expression */ - { 395, -1 }, /* (405) common_expression ::= boolean_value_expression */ - { 396, 0 }, /* (406) from_clause_opt ::= */ - { 396, -2 }, /* (407) from_clause_opt ::= FROM table_reference_list */ - { 397, -1 }, /* (408) table_reference_list ::= table_reference */ - { 397, -3 }, /* (409) table_reference_list ::= table_reference_list NK_COMMA table_reference */ - { 398, -1 }, /* (410) table_reference ::= table_primary */ - { 398, -1 }, /* (411) table_reference ::= joined_table */ - { 399, -2 }, /* (412) table_primary ::= table_name alias_opt */ - { 399, -4 }, /* (413) table_primary ::= db_name NK_DOT table_name alias_opt */ - { 399, -2 }, /* (414) table_primary ::= subquery alias_opt */ - { 399, -1 }, /* (415) table_primary ::= parenthesized_joined_table */ - { 401, 0 }, /* (416) alias_opt ::= */ - { 401, -1 }, /* (417) alias_opt ::= table_alias */ - { 401, -2 }, /* (418) alias_opt ::= AS table_alias */ - { 402, -3 }, /* (419) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - { 402, -3 }, /* (420) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ - { 400, -6 }, /* (421) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ - { 403, 0 }, /* (422) join_type ::= */ - { 403, -1 }, /* (423) join_type ::= INNER */ - { 405, -12 }, /* (424) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ - { 406, 0 }, /* (425) set_quantifier_opt ::= */ - { 406, -1 }, /* (426) set_quantifier_opt ::= DISTINCT */ - { 406, -1 }, /* (427) set_quantifier_opt ::= ALL */ - { 407, -1 }, /* (428) select_list ::= select_item */ - { 407, -3 }, /* (429) select_list ::= select_list NK_COMMA select_item */ - { 415, -1 }, /* (430) select_item ::= NK_STAR */ - { 415, -1 }, /* (431) select_item ::= common_expression */ - { 415, -2 }, /* (432) select_item ::= common_expression column_alias */ - { 415, -3 }, /* (433) select_item ::= common_expression AS column_alias */ - { 415, -3 }, /* (434) select_item ::= table_name NK_DOT NK_STAR */ - { 373, 0 }, /* (435) where_clause_opt ::= */ - { 373, -2 }, /* (436) where_clause_opt ::= WHERE search_condition */ - { 408, 0 }, /* (437) partition_by_clause_opt ::= */ - { 408, -3 }, /* (438) partition_by_clause_opt ::= PARTITION BY expression_list */ - { 412, 0 }, /* (439) twindow_clause_opt ::= */ - { 412, -6 }, /* (440) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ - { 412, -4 }, /* (441) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ - { 412, -6 }, /* (442) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ - { 412, -8 }, /* (443) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ - { 359, 0 }, /* (444) sliding_opt ::= */ - { 359, -4 }, /* (445) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - { 411, 0 }, /* (446) fill_opt ::= */ - { 411, -4 }, /* (447) fill_opt ::= FILL NK_LP fill_mode NK_RP */ - { 411, -6 }, /* (448) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ - { 416, -1 }, /* (449) fill_mode ::= NONE */ - { 416, -1 }, /* (450) fill_mode ::= PREV */ - { 416, -1 }, /* (451) fill_mode ::= NULL */ - { 416, -1 }, /* (452) fill_mode ::= LINEAR */ - { 416, -1 }, /* (453) fill_mode ::= NEXT */ - { 413, 0 }, /* (454) group_by_clause_opt ::= */ - { 413, -3 }, /* (455) group_by_clause_opt ::= GROUP BY group_by_list */ - { 417, -1 }, /* (456) group_by_list ::= expression */ - { 417, -3 }, /* (457) group_by_list ::= group_by_list NK_COMMA expression */ - { 414, 0 }, /* (458) having_clause_opt ::= */ - { 414, -2 }, /* (459) having_clause_opt ::= HAVING search_condition */ - { 409, 0 }, /* (460) range_opt ::= */ - { 409, -6 }, /* (461) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ - { 410, 0 }, /* (462) every_opt ::= */ - { 410, -4 }, /* (463) every_opt ::= EVERY NK_LP duration_literal NK_RP */ - { 364, -4 }, /* (464) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ - { 418, -1 }, /* (465) query_expression_body ::= query_primary */ - { 418, -4 }, /* (466) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ - { 418, -3 }, /* (467) query_expression_body ::= query_expression_body UNION query_expression_body */ - { 422, -1 }, /* (468) query_primary ::= query_specification */ - { 422, -6 }, /* (469) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ - { 419, 0 }, /* (470) order_by_clause_opt ::= */ - { 419, -3 }, /* (471) order_by_clause_opt ::= ORDER BY sort_specification_list */ - { 420, 0 }, /* (472) slimit_clause_opt ::= */ - { 420, -2 }, /* (473) slimit_clause_opt ::= SLIMIT NK_INTEGER */ - { 420, -4 }, /* (474) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - { 420, -4 }, /* (475) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 421, 0 }, /* (476) limit_clause_opt ::= */ - { 421, -2 }, /* (477) limit_clause_opt ::= LIMIT NK_INTEGER */ - { 421, -4 }, /* (478) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ - { 421, -4 }, /* (479) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - { 383, -3 }, /* (480) subquery ::= NK_LP query_expression NK_RP */ - { 404, -1 }, /* (481) search_condition ::= common_expression */ - { 423, -1 }, /* (482) sort_specification_list ::= sort_specification */ - { 423, -3 }, /* (483) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ - { 424, -3 }, /* (484) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ - { 425, 0 }, /* (485) ordering_specification_opt ::= */ - { 425, -1 }, /* (486) ordering_specification_opt ::= ASC */ - { 425, -1 }, /* (487) ordering_specification_opt ::= DESC */ - { 426, 0 }, /* (488) null_ordering_opt ::= */ - { 426, -2 }, /* (489) null_ordering_opt ::= NULLS FIRST */ - { 426, -2 }, /* (490) null_ordering_opt ::= NULLS LAST */ + { 362, 0 }, /* (268) stream_options ::= */ + { 362, -3 }, /* (269) stream_options ::= stream_options TRIGGER AT_ONCE */ + { 362, -3 }, /* (270) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ + { 362, -4 }, /* (271) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ + { 362, -3 }, /* (272) stream_options ::= stream_options WATERMARK duration_literal */ + { 362, -4 }, /* (273) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ + { 305, -3 }, /* (274) cmd ::= KILL CONNECTION NK_INTEGER */ + { 305, -3 }, /* (275) cmd ::= KILL QUERY NK_STRING */ + { 305, -3 }, /* (276) cmd ::= KILL TRANSACTION NK_INTEGER */ + { 305, -2 }, /* (277) cmd ::= BALANCE VGROUP */ + { 305, -4 }, /* (278) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + { 305, -4 }, /* (279) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ + { 305, -3 }, /* (280) cmd ::= SPLIT VGROUP NK_INTEGER */ + { 371, -2 }, /* (281) dnode_list ::= DNODE NK_INTEGER */ + { 371, -3 }, /* (282) dnode_list ::= dnode_list DNODE NK_INTEGER */ + { 305, -4 }, /* (283) cmd ::= DELETE FROM full_table_name where_clause_opt */ + { 305, -1 }, /* (284) cmd ::= query_expression */ + { 305, -7 }, /* (285) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ + { 305, -4 }, /* (286) cmd ::= INSERT INTO full_table_name query_expression */ + { 308, -1 }, /* (287) literal ::= NK_INTEGER */ + { 308, -1 }, /* (288) literal ::= NK_FLOAT */ + { 308, -1 }, /* (289) literal ::= NK_STRING */ + { 308, -1 }, /* (290) literal ::= NK_BOOL */ + { 308, -2 }, /* (291) literal ::= TIMESTAMP NK_STRING */ + { 308, -1 }, /* (292) literal ::= duration_literal */ + { 308, -1 }, /* (293) literal ::= NULL */ + { 308, -1 }, /* (294) literal ::= NK_QUESTION */ + { 349, -1 }, /* (295) duration_literal ::= NK_VARIABLE */ + { 373, -1 }, /* (296) signed ::= NK_INTEGER */ + { 373, -2 }, /* (297) signed ::= NK_PLUS NK_INTEGER */ + { 373, -2 }, /* (298) signed ::= NK_MINUS NK_INTEGER */ + { 373, -1 }, /* (299) signed ::= NK_FLOAT */ + { 373, -2 }, /* (300) signed ::= NK_PLUS NK_FLOAT */ + { 373, -2 }, /* (301) signed ::= NK_MINUS NK_FLOAT */ + { 338, -1 }, /* (302) signed_literal ::= signed */ + { 338, -1 }, /* (303) signed_literal ::= NK_STRING */ + { 338, -1 }, /* (304) signed_literal ::= NK_BOOL */ + { 338, -2 }, /* (305) signed_literal ::= TIMESTAMP NK_STRING */ + { 338, -1 }, /* (306) signed_literal ::= duration_literal */ + { 338, -1 }, /* (307) signed_literal ::= NULL */ + { 338, -1 }, /* (308) signed_literal ::= literal_func */ + { 338, -1 }, /* (309) signed_literal ::= NK_QUESTION */ + { 375, -1 }, /* (310) literal_list ::= signed_literal */ + { 375, -3 }, /* (311) literal_list ::= literal_list NK_COMMA signed_literal */ + { 316, -1 }, /* (312) db_name ::= NK_ID */ + { 344, -1 }, /* (313) table_name ::= NK_ID */ + { 336, -1 }, /* (314) column_name ::= NK_ID */ + { 351, -1 }, /* (315) function_name ::= NK_ID */ + { 376, -1 }, /* (316) table_alias ::= NK_ID */ + { 377, -1 }, /* (317) column_alias ::= NK_ID */ + { 310, -1 }, /* (318) user_name ::= NK_ID */ + { 363, -1 }, /* (319) topic_name ::= NK_ID */ + { 370, -1 }, /* (320) stream_name ::= NK_ID */ + { 365, -1 }, /* (321) cgroup_name ::= NK_ID */ + { 378, -1 }, /* (322) expression ::= literal */ + { 378, -1 }, /* (323) expression ::= pseudo_column */ + { 378, -1 }, /* (324) expression ::= column_reference */ + { 378, -1 }, /* (325) expression ::= function_expression */ + { 378, -1 }, /* (326) expression ::= subquery */ + { 378, -3 }, /* (327) expression ::= NK_LP expression NK_RP */ + { 378, -2 }, /* (328) expression ::= NK_PLUS expression */ + { 378, -2 }, /* (329) expression ::= NK_MINUS expression */ + { 378, -3 }, /* (330) expression ::= expression NK_PLUS expression */ + { 378, -3 }, /* (331) expression ::= expression NK_MINUS expression */ + { 378, -3 }, /* (332) expression ::= expression NK_STAR expression */ + { 378, -3 }, /* (333) expression ::= expression NK_SLASH expression */ + { 378, -3 }, /* (334) expression ::= expression NK_REM expression */ + { 378, -3 }, /* (335) expression ::= column_reference NK_ARROW NK_STRING */ + { 378, -3 }, /* (336) expression ::= expression NK_BITAND expression */ + { 378, -3 }, /* (337) expression ::= expression NK_BITOR expression */ + { 341, -1 }, /* (338) expression_list ::= expression */ + { 341, -3 }, /* (339) expression_list ::= expression_list NK_COMMA expression */ + { 380, -1 }, /* (340) column_reference ::= column_name */ + { 380, -3 }, /* (341) column_reference ::= table_name NK_DOT column_name */ + { 379, -1 }, /* (342) pseudo_column ::= ROWTS */ + { 379, -1 }, /* (343) pseudo_column ::= TBNAME */ + { 379, -3 }, /* (344) pseudo_column ::= table_name NK_DOT TBNAME */ + { 379, -1 }, /* (345) pseudo_column ::= QSTART */ + { 379, -1 }, /* (346) pseudo_column ::= QEND */ + { 379, -1 }, /* (347) pseudo_column ::= QDURATION */ + { 379, -1 }, /* (348) pseudo_column ::= WSTART */ + { 379, -1 }, /* (349) pseudo_column ::= WEND */ + { 379, -1 }, /* (350) pseudo_column ::= WDURATION */ + { 381, -4 }, /* (351) function_expression ::= function_name NK_LP expression_list NK_RP */ + { 381, -4 }, /* (352) function_expression ::= star_func NK_LP star_func_para_list NK_RP */ + { 381, -6 }, /* (353) function_expression ::= CAST NK_LP expression AS type_name NK_RP */ + { 381, -1 }, /* (354) function_expression ::= literal_func */ + { 374, -3 }, /* (355) literal_func ::= noarg_func NK_LP NK_RP */ + { 374, -1 }, /* (356) literal_func ::= NOW */ + { 385, -1 }, /* (357) noarg_func ::= NOW */ + { 385, -1 }, /* (358) noarg_func ::= TODAY */ + { 385, -1 }, /* (359) noarg_func ::= TIMEZONE */ + { 385, -1 }, /* (360) noarg_func ::= DATABASE */ + { 385, -1 }, /* (361) noarg_func ::= CLIENT_VERSION */ + { 385, -1 }, /* (362) noarg_func ::= SERVER_VERSION */ + { 385, -1 }, /* (363) noarg_func ::= SERVER_STATUS */ + { 385, -1 }, /* (364) noarg_func ::= CURRENT_USER */ + { 385, -1 }, /* (365) noarg_func ::= USER */ + { 383, -1 }, /* (366) star_func ::= COUNT */ + { 383, -1 }, /* (367) star_func ::= FIRST */ + { 383, -1 }, /* (368) star_func ::= LAST */ + { 383, -1 }, /* (369) star_func ::= LAST_ROW */ + { 384, -1 }, /* (370) star_func_para_list ::= NK_STAR */ + { 384, -1 }, /* (371) star_func_para_list ::= other_para_list */ + { 386, -1 }, /* (372) other_para_list ::= star_func_para */ + { 386, -3 }, /* (373) other_para_list ::= other_para_list NK_COMMA star_func_para */ + { 387, -1 }, /* (374) star_func_para ::= expression */ + { 387, -3 }, /* (375) star_func_para ::= table_name NK_DOT NK_STAR */ + { 388, -3 }, /* (376) predicate ::= expression compare_op expression */ + { 388, -5 }, /* (377) predicate ::= expression BETWEEN expression AND expression */ + { 388, -6 }, /* (378) predicate ::= expression NOT BETWEEN expression AND expression */ + { 388, -3 }, /* (379) predicate ::= expression IS NULL */ + { 388, -4 }, /* (380) predicate ::= expression IS NOT NULL */ + { 388, -3 }, /* (381) predicate ::= expression in_op in_predicate_value */ + { 389, -1 }, /* (382) compare_op ::= NK_LT */ + { 389, -1 }, /* (383) compare_op ::= NK_GT */ + { 389, -1 }, /* (384) compare_op ::= NK_LE */ + { 389, -1 }, /* (385) compare_op ::= NK_GE */ + { 389, -1 }, /* (386) compare_op ::= NK_NE */ + { 389, -1 }, /* (387) compare_op ::= NK_EQ */ + { 389, -1 }, /* (388) compare_op ::= LIKE */ + { 389, -2 }, /* (389) compare_op ::= NOT LIKE */ + { 389, -1 }, /* (390) compare_op ::= MATCH */ + { 389, -1 }, /* (391) compare_op ::= NMATCH */ + { 389, -1 }, /* (392) compare_op ::= CONTAINS */ + { 390, -1 }, /* (393) in_op ::= IN */ + { 390, -2 }, /* (394) in_op ::= NOT IN */ + { 391, -3 }, /* (395) in_predicate_value ::= NK_LP literal_list NK_RP */ + { 392, -1 }, /* (396) boolean_value_expression ::= boolean_primary */ + { 392, -2 }, /* (397) boolean_value_expression ::= NOT boolean_primary */ + { 392, -3 }, /* (398) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + { 392, -3 }, /* (399) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + { 393, -1 }, /* (400) boolean_primary ::= predicate */ + { 393, -3 }, /* (401) boolean_primary ::= NK_LP boolean_value_expression NK_RP */ + { 394, -1 }, /* (402) common_expression ::= expression */ + { 394, -1 }, /* (403) common_expression ::= boolean_value_expression */ + { 395, 0 }, /* (404) from_clause_opt ::= */ + { 395, -2 }, /* (405) from_clause_opt ::= FROM table_reference_list */ + { 396, -1 }, /* (406) table_reference_list ::= table_reference */ + { 396, -3 }, /* (407) table_reference_list ::= table_reference_list NK_COMMA table_reference */ + { 397, -1 }, /* (408) table_reference ::= table_primary */ + { 397, -1 }, /* (409) table_reference ::= joined_table */ + { 398, -2 }, /* (410) table_primary ::= table_name alias_opt */ + { 398, -4 }, /* (411) table_primary ::= db_name NK_DOT table_name alias_opt */ + { 398, -2 }, /* (412) table_primary ::= subquery alias_opt */ + { 398, -1 }, /* (413) table_primary ::= parenthesized_joined_table */ + { 400, 0 }, /* (414) alias_opt ::= */ + { 400, -1 }, /* (415) alias_opt ::= table_alias */ + { 400, -2 }, /* (416) alias_opt ::= AS table_alias */ + { 401, -3 }, /* (417) parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + { 401, -3 }, /* (418) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ + { 399, -6 }, /* (419) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ + { 402, 0 }, /* (420) join_type ::= */ + { 402, -1 }, /* (421) join_type ::= INNER */ + { 404, -12 }, /* (422) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + { 405, 0 }, /* (423) set_quantifier_opt ::= */ + { 405, -1 }, /* (424) set_quantifier_opt ::= DISTINCT */ + { 405, -1 }, /* (425) set_quantifier_opt ::= ALL */ + { 406, -1 }, /* (426) select_list ::= select_item */ + { 406, -3 }, /* (427) select_list ::= select_list NK_COMMA select_item */ + { 414, -1 }, /* (428) select_item ::= NK_STAR */ + { 414, -1 }, /* (429) select_item ::= common_expression */ + { 414, -2 }, /* (430) select_item ::= common_expression column_alias */ + { 414, -3 }, /* (431) select_item ::= common_expression AS column_alias */ + { 414, -3 }, /* (432) select_item ::= table_name NK_DOT NK_STAR */ + { 372, 0 }, /* (433) where_clause_opt ::= */ + { 372, -2 }, /* (434) where_clause_opt ::= WHERE search_condition */ + { 407, 0 }, /* (435) partition_by_clause_opt ::= */ + { 407, -3 }, /* (436) partition_by_clause_opt ::= PARTITION BY expression_list */ + { 411, 0 }, /* (437) twindow_clause_opt ::= */ + { 411, -6 }, /* (438) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ + { 411, -4 }, /* (439) twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ + { 411, -6 }, /* (440) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ + { 411, -8 }, /* (441) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ + { 359, 0 }, /* (442) sliding_opt ::= */ + { 359, -4 }, /* (443) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + { 410, 0 }, /* (444) fill_opt ::= */ + { 410, -4 }, /* (445) fill_opt ::= FILL NK_LP fill_mode NK_RP */ + { 410, -6 }, /* (446) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ + { 415, -1 }, /* (447) fill_mode ::= NONE */ + { 415, -1 }, /* (448) fill_mode ::= PREV */ + { 415, -1 }, /* (449) fill_mode ::= NULL */ + { 415, -1 }, /* (450) fill_mode ::= LINEAR */ + { 415, -1 }, /* (451) fill_mode ::= NEXT */ + { 412, 0 }, /* (452) group_by_clause_opt ::= */ + { 412, -3 }, /* (453) group_by_clause_opt ::= GROUP BY group_by_list */ + { 416, -1 }, /* (454) group_by_list ::= expression */ + { 416, -3 }, /* (455) group_by_list ::= group_by_list NK_COMMA expression */ + { 413, 0 }, /* (456) having_clause_opt ::= */ + { 413, -2 }, /* (457) having_clause_opt ::= HAVING search_condition */ + { 408, 0 }, /* (458) range_opt ::= */ + { 408, -6 }, /* (459) range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ + { 409, 0 }, /* (460) every_opt ::= */ + { 409, -4 }, /* (461) every_opt ::= EVERY NK_LP duration_literal NK_RP */ + { 364, -4 }, /* (462) query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + { 417, -1 }, /* (463) query_expression_body ::= query_primary */ + { 417, -4 }, /* (464) query_expression_body ::= query_expression_body UNION ALL query_expression_body */ + { 417, -3 }, /* (465) query_expression_body ::= query_expression_body UNION query_expression_body */ + { 421, -1 }, /* (466) query_primary ::= query_specification */ + { 421, -6 }, /* (467) query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ + { 418, 0 }, /* (468) order_by_clause_opt ::= */ + { 418, -3 }, /* (469) order_by_clause_opt ::= ORDER BY sort_specification_list */ + { 419, 0 }, /* (470) slimit_clause_opt ::= */ + { 419, -2 }, /* (471) slimit_clause_opt ::= SLIMIT NK_INTEGER */ + { 419, -4 }, /* (472) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + { 419, -4 }, /* (473) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 420, 0 }, /* (474) limit_clause_opt ::= */ + { 420, -2 }, /* (475) limit_clause_opt ::= LIMIT NK_INTEGER */ + { 420, -4 }, /* (476) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ + { 420, -4 }, /* (477) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + { 382, -3 }, /* (478) subquery ::= NK_LP query_expression NK_RP */ + { 403, -1 }, /* (479) search_condition ::= common_expression */ + { 422, -1 }, /* (480) sort_specification_list ::= sort_specification */ + { 422, -3 }, /* (481) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ + { 423, -3 }, /* (482) sort_specification ::= expression ordering_specification_opt null_ordering_opt */ + { 424, 0 }, /* (483) ordering_specification_opt ::= */ + { 424, -1 }, /* (484) ordering_specification_opt ::= ASC */ + { 424, -1 }, /* (485) ordering_specification_opt ::= DESC */ + { 425, 0 }, /* (486) null_ordering_opt ::= */ + { 425, -2 }, /* (487) null_ordering_opt ::= NULLS FIRST */ + { 425, -2 }, /* (488) null_ordering_opt ::= NULLS LAST */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -3465,69 +3415,69 @@ static YYACTIONTYPE yy_reduce( yy_destructor(yypParser,308,&yymsp[0].minor); break; case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */ -{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy617, &yymsp[-1].minor.yy0, yymsp[0].minor.yy215); } +{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy209, &yymsp[-1].minor.yy0, yymsp[0].minor.yy59); } break; case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy617, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy209, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); } break; case 26: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy617, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy209, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); } break; case 27: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */ -{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy617, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy209, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); } break; case 28: /* cmd ::= DROP USER user_name */ -{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy209); } break; case 29: /* sysinfo_opt ::= */ -{ yymsp[1].minor.yy215 = 1; } +{ yymsp[1].minor.yy59 = 1; } break; case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */ -{ yymsp[-1].minor.yy215 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy59 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); } break; case 31: /* cmd ::= GRANT privileges ON priv_level TO user_name */ -{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy473, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy69, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209); } break; case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */ -{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy473, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy69, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209); } break; case 33: /* privileges ::= ALL */ -{ yymsp[0].minor.yy473 = PRIVILEGE_TYPE_ALL; } +{ yymsp[0].minor.yy69 = PRIVILEGE_TYPE_ALL; } break; case 34: /* privileges ::= priv_type_list */ case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35); -{ yylhsminor.yy473 = yymsp[0].minor.yy473; } - yymsp[0].minor.yy473 = yylhsminor.yy473; +{ yylhsminor.yy69 = yymsp[0].minor.yy69; } + yymsp[0].minor.yy69 = yylhsminor.yy69; break; case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */ -{ yylhsminor.yy473 = yymsp[-2].minor.yy473 | yymsp[0].minor.yy473; } - yymsp[-2].minor.yy473 = yylhsminor.yy473; +{ yylhsminor.yy69 = yymsp[-2].minor.yy69 | yymsp[0].minor.yy69; } + yymsp[-2].minor.yy69 = yylhsminor.yy69; break; case 37: /* priv_type ::= READ */ -{ yymsp[0].minor.yy473 = PRIVILEGE_TYPE_READ; } +{ yymsp[0].minor.yy69 = PRIVILEGE_TYPE_READ; } break; case 38: /* priv_type ::= WRITE */ -{ yymsp[0].minor.yy473 = PRIVILEGE_TYPE_WRITE; } +{ yymsp[0].minor.yy69 = PRIVILEGE_TYPE_WRITE; } break; case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */ -{ yylhsminor.yy617 = yymsp[-2].minor.yy0; } - yymsp[-2].minor.yy617 = yylhsminor.yy617; +{ yylhsminor.yy209 = yymsp[-2].minor.yy0; } + yymsp[-2].minor.yy209 = yylhsminor.yy209; break; case 40: /* priv_level ::= db_name NK_DOT NK_STAR */ -{ yylhsminor.yy617 = yymsp[-2].minor.yy617; } - yymsp[-2].minor.yy617 = yylhsminor.yy617; +{ yylhsminor.yy209 = yymsp[-2].minor.yy209; } + yymsp[-2].minor.yy209 = yylhsminor.yy209; break; case 41: /* cmd ::= CREATE DNODE dnode_endpoint */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy617, NULL); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy209, NULL); } break; case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */ -{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0); } +{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy0); } break; case 43: /* cmd ::= DROP DNODE NK_INTEGER */ { pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy0); } break; case 44: /* cmd ::= DROP DNODE dnode_endpoint */ -{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[0].minor.yy209); } break; case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */ { pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); } @@ -3544,31 +3494,31 @@ static YYACTIONTYPE yy_reduce( case 49: /* dnode_endpoint ::= NK_STRING */ case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50); case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51); - case 314: /* db_name ::= NK_ID */ yytestcase(yyruleno==314); - case 315: /* table_name ::= NK_ID */ yytestcase(yyruleno==315); - case 316: /* column_name ::= NK_ID */ yytestcase(yyruleno==316); - case 317: /* function_name ::= NK_ID */ yytestcase(yyruleno==317); - case 318: /* table_alias ::= NK_ID */ yytestcase(yyruleno==318); - case 319: /* column_alias ::= NK_ID */ yytestcase(yyruleno==319); - case 320: /* user_name ::= NK_ID */ yytestcase(yyruleno==320); - case 321: /* topic_name ::= NK_ID */ yytestcase(yyruleno==321); - case 322: /* stream_name ::= NK_ID */ yytestcase(yyruleno==322); - case 323: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==323); - case 359: /* noarg_func ::= NOW */ yytestcase(yyruleno==359); - case 360: /* noarg_func ::= TODAY */ yytestcase(yyruleno==360); - case 361: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==361); - case 362: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==362); - case 363: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==363); - case 364: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==364); - case 365: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==365); - case 366: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==366); - case 367: /* noarg_func ::= USER */ yytestcase(yyruleno==367); - case 368: /* star_func ::= COUNT */ yytestcase(yyruleno==368); - case 369: /* star_func ::= FIRST */ yytestcase(yyruleno==369); - case 370: /* star_func ::= LAST */ yytestcase(yyruleno==370); - case 371: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==371); -{ yylhsminor.yy617 = yymsp[0].minor.yy0; } - yymsp[0].minor.yy617 = yylhsminor.yy617; + case 312: /* db_name ::= NK_ID */ yytestcase(yyruleno==312); + case 313: /* table_name ::= NK_ID */ yytestcase(yyruleno==313); + case 314: /* column_name ::= NK_ID */ yytestcase(yyruleno==314); + case 315: /* function_name ::= NK_ID */ yytestcase(yyruleno==315); + case 316: /* table_alias ::= NK_ID */ yytestcase(yyruleno==316); + case 317: /* column_alias ::= NK_ID */ yytestcase(yyruleno==317); + case 318: /* user_name ::= NK_ID */ yytestcase(yyruleno==318); + case 319: /* topic_name ::= NK_ID */ yytestcase(yyruleno==319); + case 320: /* stream_name ::= NK_ID */ yytestcase(yyruleno==320); + case 321: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==321); + case 357: /* noarg_func ::= NOW */ yytestcase(yyruleno==357); + case 358: /* noarg_func ::= TODAY */ yytestcase(yyruleno==358); + case 359: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==359); + case 360: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==360); + case 361: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==361); + case 362: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==362); + case 363: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==363); + case 364: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==364); + case 365: /* noarg_func ::= USER */ yytestcase(yyruleno==365); + case 366: /* star_func ::= COUNT */ yytestcase(yyruleno==366); + case 367: /* star_func ::= FIRST */ yytestcase(yyruleno==367); + case 368: /* star_func ::= LAST */ yytestcase(yyruleno==368); + case 369: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==369); +{ yylhsminor.yy209 = yymsp[0].minor.yy0; } + yymsp[0].minor.yy209 = yylhsminor.yy209; break; case 52: /* cmd ::= ALTER LOCAL NK_STRING */ { pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); } @@ -3601,189 +3551,189 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); } break; case 62: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */ -{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy313, &yymsp[-1].minor.yy617, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy293, &yymsp[-1].minor.yy209, yymsp[0].minor.yy272); } break; case 63: /* cmd ::= DROP DATABASE exists_opt db_name */ -{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy293, &yymsp[0].minor.yy209); } break; case 64: /* cmd ::= USE db_name */ -{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy209); } break; case 65: /* cmd ::= ALTER DATABASE db_name alter_db_options */ -{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy617, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy209, yymsp[0].minor.yy272); } break; case 66: /* cmd ::= FLUSH DATABASE db_name */ -{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy209); } break; case 67: /* cmd ::= TRIM DATABASE db_name */ -{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[0].minor.yy209); } break; case 68: /* not_exists_opt ::= IF NOT EXISTS */ -{ yymsp[-2].minor.yy313 = true; } +{ yymsp[-2].minor.yy293 = true; } break; case 69: /* not_exists_opt ::= */ case 71: /* exists_opt ::= */ yytestcase(yyruleno==71); case 255: /* analyze_opt ::= */ yytestcase(yyruleno==255); case 262: /* agg_func_opt ::= */ yytestcase(yyruleno==262); - case 425: /* set_quantifier_opt ::= */ yytestcase(yyruleno==425); -{ yymsp[1].minor.yy313 = false; } + case 423: /* set_quantifier_opt ::= */ yytestcase(yyruleno==423); +{ yymsp[1].minor.yy293 = false; } break; case 70: /* exists_opt ::= IF EXISTS */ -{ yymsp[-1].minor.yy313 = true; } +{ yymsp[-1].minor.yy293 = true; } break; case 72: /* db_options ::= */ -{ yymsp[1].minor.yy840 = createDefaultDatabaseOptions(pCxt); } +{ yymsp[1].minor.yy272 = createDefaultDatabaseOptions(pCxt); } break; case 73: /* db_options ::= db_options BUFFER NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 74: /* db_options ::= db_options CACHEMODEL NK_STRING */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 75: /* db_options ::= db_options CACHESIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 76: /* db_options ::= db_options COMP NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_COMP, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_COMP, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 77: /* db_options ::= db_options DURATION NK_INTEGER */ case 78: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==78); -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_DAYS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 79: /* db_options ::= db_options MAXROWS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 80: /* db_options ::= db_options MINROWS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 81: /* db_options ::= db_options KEEP integer_list */ case 82: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==82); -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_KEEP, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_KEEP, yymsp[0].minor.yy172); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 83: /* db_options ::= db_options PAGES NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_PAGES, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 84: /* db_options ::= db_options PAGESIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 85: /* db_options ::= db_options PRECISION NK_STRING */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 86: /* db_options ::= db_options REPLICA NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 87: /* db_options ::= db_options STRICT NK_STRING */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_STRICT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 88: /* db_options ::= db_options VGROUPS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 89: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 90: /* db_options ::= db_options RETENTIONS retention_list */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_RETENTIONS, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_RETENTIONS, yymsp[0].minor.yy172); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 91: /* db_options ::= db_options SCHEMALESS NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 92: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_WAL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 93: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 94: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 95: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-3].minor.yy840, DB_OPTION_WAL_RETENTION_PERIOD, &t); + yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-3].minor.yy272, DB_OPTION_WAL_RETENTION_PERIOD, &t); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 96: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 97: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-3].minor.yy840, DB_OPTION_WAL_RETENTION_SIZE, &t); + yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-3].minor.yy272, DB_OPTION_WAL_RETENTION_SIZE, &t); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 98: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 99: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */ -{ yylhsminor.yy840 = setDatabaseOption(pCxt, yymsp[-2].minor.yy840, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setDatabaseOption(pCxt, yymsp[-2].minor.yy272, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 100: /* alter_db_options ::= alter_db_option */ -{ yylhsminor.yy840 = createAlterDatabaseOptions(pCxt); yylhsminor.yy840 = setAlterDatabaseOption(pCxt, yylhsminor.yy840, &yymsp[0].minor.yy95); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterDatabaseOptions(pCxt); yylhsminor.yy272 = setAlterDatabaseOption(pCxt, yylhsminor.yy272, &yymsp[0].minor.yy5); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 101: /* alter_db_options ::= alter_db_options alter_db_option */ -{ yylhsminor.yy840 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy840, &yymsp[0].minor.yy95); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy272, &yymsp[0].minor.yy5); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 102: /* alter_db_option ::= CACHEMODEL NK_STRING */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy5.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy5.val = yymsp[0].minor.yy0; } break; case 103: /* alter_db_option ::= CACHESIZE NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy5.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy5.val = yymsp[0].minor.yy0; } break; case 104: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy5.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy5.val = yymsp[0].minor.yy0; } break; case 105: /* alter_db_option ::= KEEP integer_list */ case 106: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==106); -{ yymsp[-1].minor.yy95.type = DB_OPTION_KEEP; yymsp[-1].minor.yy95.pList = yymsp[0].minor.yy544; } +{ yymsp[-1].minor.yy5.type = DB_OPTION_KEEP; yymsp[-1].minor.yy5.pList = yymsp[0].minor.yy172; } break; case 107: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = DB_OPTION_WAL; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy5.type = DB_OPTION_WAL; yymsp[-1].minor.yy5.val = yymsp[0].minor.yy0; } break; case 108: /* integer_list ::= NK_INTEGER */ -{ yylhsminor.yy544 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; +{ yylhsminor.yy172 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; case 109: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */ - case 284: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==284); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; + case 282: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==282); +{ yylhsminor.yy172 = addNodeToList(pCxt, yymsp[-2].minor.yy172, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; case 110: /* variable_list ::= NK_VARIABLE */ -{ yylhsminor.yy544 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; +{ yylhsminor.yy172 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; case 111: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */ -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; +{ yylhsminor.yy172 = addNodeToList(pCxt, yymsp[-2].minor.yy172, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; case 112: /* retention_list ::= retention */ case 132: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==132); @@ -3792,266 +3742,266 @@ static YYACTIONTYPE yy_reduce( case 185: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==185); case 190: /* col_name_list ::= col_name */ yytestcase(yyruleno==190); case 238: /* func_list ::= func */ yytestcase(yyruleno==238); - case 312: /* literal_list ::= signed_literal */ yytestcase(yyruleno==312); - case 374: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==374); - case 428: /* select_list ::= select_item */ yytestcase(yyruleno==428); - case 482: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==482); -{ yylhsminor.yy544 = createNodeList(pCxt, yymsp[0].minor.yy840); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 310: /* literal_list ::= signed_literal */ yytestcase(yyruleno==310); + case 372: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==372); + case 426: /* select_list ::= select_item */ yytestcase(yyruleno==426); + case 480: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==480); +{ yylhsminor.yy172 = createNodeList(pCxt, yymsp[0].minor.yy272); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; case 113: /* retention_list ::= retention_list NK_COMMA retention */ case 143: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==143); case 186: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==186); case 191: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==191); case 239: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==239); - case 313: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==313); - case 375: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==375); - case 429: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==429); - case 483: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==483); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, yymsp[0].minor.yy840); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; + case 311: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==311); + case 373: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==373); + case 427: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==427); + case 481: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==481); +{ yylhsminor.yy172 = addNodeToList(pCxt, yymsp[-2].minor.yy172, yymsp[0].minor.yy272); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; case 114: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */ -{ yylhsminor.yy840 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 115: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */ case 117: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==117); -{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy313, yymsp[-5].minor.yy840, yymsp[-3].minor.yy544, yymsp[-1].minor.yy544, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy293, yymsp[-5].minor.yy272, yymsp[-3].minor.yy172, yymsp[-1].minor.yy172, yymsp[0].minor.yy272); } break; case 116: /* cmd ::= CREATE TABLE multi_create_clause */ -{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy544); } +{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy172); } break; case 118: /* cmd ::= DROP TABLE multi_drop_clause */ -{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy544); } +{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy172); } break; case 119: /* cmd ::= DROP STABLE exists_opt full_table_name */ -{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy313, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy293, yymsp[0].minor.yy272); } break; case 120: /* cmd ::= ALTER TABLE alter_table_clause */ - case 286: /* cmd ::= query_expression */ yytestcase(yyruleno==286); -{ pCxt->pRootNode = yymsp[0].minor.yy840; } + case 284: /* cmd ::= query_expression */ yytestcase(yyruleno==284); +{ pCxt->pRootNode = yymsp[0].minor.yy272; } break; case 121: /* cmd ::= ALTER STABLE alter_table_clause */ -{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy840); } +{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy272); } break; case 122: /* alter_table_clause ::= full_table_name alter_table_options */ -{ yylhsminor.yy840 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 123: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy272, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy209, yymsp[0].minor.yy616); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 124: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */ -{ yylhsminor.yy840 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy840, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy617); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy272, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy209); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 125: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy272, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy209, yymsp[0].minor.yy616); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 126: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */ -{ yylhsminor.yy840 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy272, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy209, &yymsp[0].minor.yy209); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 127: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy272, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy209, yymsp[0].minor.yy616); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 128: /* alter_table_clause ::= full_table_name DROP TAG column_name */ -{ yylhsminor.yy840 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy840, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy617); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy272, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy209); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 129: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */ -{ yylhsminor.yy840 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy272, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy209, yymsp[0].minor.yy616); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 130: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */ -{ yylhsminor.yy840 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy840, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy272, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy209, &yymsp[0].minor.yy209); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 131: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */ -{ yylhsminor.yy840 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy840, &yymsp[-2].minor.yy617, yymsp[0].minor.yy840); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy272, &yymsp[-2].minor.yy209, yymsp[0].minor.yy272); } + yymsp[-5].minor.yy272 = yylhsminor.yy272; break; case 133: /* multi_create_clause ::= multi_create_clause create_subtable_clause */ case 136: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==136); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-1].minor.yy544, yymsp[0].minor.yy840); } - yymsp[-1].minor.yy544 = yylhsminor.yy544; +{ yylhsminor.yy172 = addNodeToList(pCxt, yymsp[-1].minor.yy172, yymsp[0].minor.yy272); } + yymsp[-1].minor.yy172 = yylhsminor.yy172; break; case 134: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */ -{ yylhsminor.yy840 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy313, yymsp[-8].minor.yy840, yymsp[-6].minor.yy840, yymsp[-5].minor.yy544, yymsp[-2].minor.yy544, yymsp[0].minor.yy840); } - yymsp[-9].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy293, yymsp[-8].minor.yy272, yymsp[-6].minor.yy272, yymsp[-5].minor.yy172, yymsp[-2].minor.yy172, yymsp[0].minor.yy272); } + yymsp[-9].minor.yy272 = yylhsminor.yy272; break; case 137: /* drop_table_clause ::= exists_opt full_table_name */ -{ yylhsminor.yy840 = createDropTableClause(pCxt, yymsp[-1].minor.yy313, yymsp[0].minor.yy840); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createDropTableClause(pCxt, yymsp[-1].minor.yy293, yymsp[0].minor.yy272); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 138: /* specific_cols_opt ::= */ case 169: /* tags_def_opt ::= */ yytestcase(yyruleno==169); - case 437: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==437); - case 454: /* group_by_clause_opt ::= */ yytestcase(yyruleno==454); - case 470: /* order_by_clause_opt ::= */ yytestcase(yyruleno==470); -{ yymsp[1].minor.yy544 = NULL; } + case 435: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==435); + case 452: /* group_by_clause_opt ::= */ yytestcase(yyruleno==452); + case 468: /* order_by_clause_opt ::= */ yytestcase(yyruleno==468); +{ yymsp[1].minor.yy172 = NULL; } break; case 139: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */ -{ yymsp[-2].minor.yy544 = yymsp[-1].minor.yy544; } +{ yymsp[-2].minor.yy172 = yymsp[-1].minor.yy172; } break; case 140: /* full_table_name ::= table_name */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy617, NULL); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy209, NULL); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 141: /* full_table_name ::= db_name NK_DOT table_name */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617, NULL); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createRealTableNode(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209, NULL); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 144: /* column_def ::= column_name type_name */ -{ yylhsminor.yy840 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy617, yymsp[0].minor.yy784, NULL); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy209, yymsp[0].minor.yy616, NULL); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 145: /* column_def ::= column_name type_name COMMENT NK_STRING */ -{ yylhsminor.yy840 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy617, yymsp[-2].minor.yy784, &yymsp[0].minor.yy0); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy209, yymsp[-2].minor.yy616, &yymsp[0].minor.yy0); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 146: /* type_name ::= BOOL */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BOOL); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_BOOL); } break; case 147: /* type_name ::= TINYINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_TINYINT); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_TINYINT); } break; case 148: /* type_name ::= SMALLINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_SMALLINT); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_SMALLINT); } break; case 149: /* type_name ::= INT */ case 150: /* type_name ::= INTEGER */ yytestcase(yyruleno==150); -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_INT); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_INT); } break; case 151: /* type_name ::= BIGINT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BIGINT); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_BIGINT); } break; case 152: /* type_name ::= FLOAT */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_FLOAT); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_FLOAT); } break; case 153: /* type_name ::= DOUBLE */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_DOUBLE); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_DOUBLE); } break; case 154: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy616 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); } break; case 155: /* type_name ::= TIMESTAMP */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); } break; case 156: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy616 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); } break; case 157: /* type_name ::= TINYINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UTINYINT); } +{ yymsp[-1].minor.yy616 = createDataType(TSDB_DATA_TYPE_UTINYINT); } break; case 158: /* type_name ::= SMALLINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_USMALLINT); } +{ yymsp[-1].minor.yy616 = createDataType(TSDB_DATA_TYPE_USMALLINT); } break; case 159: /* type_name ::= INT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UINT); } +{ yymsp[-1].minor.yy616 = createDataType(TSDB_DATA_TYPE_UINT); } break; case 160: /* type_name ::= BIGINT UNSIGNED */ -{ yymsp[-1].minor.yy784 = createDataType(TSDB_DATA_TYPE_UBIGINT); } +{ yymsp[-1].minor.yy616 = createDataType(TSDB_DATA_TYPE_UBIGINT); } break; case 161: /* type_name ::= JSON */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_JSON); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_JSON); } break; case 162: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy616 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); } break; case 163: /* type_name ::= MEDIUMBLOB */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); } break; case 164: /* type_name ::= BLOB */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_BLOB); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_BLOB); } break; case 165: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } +{ yymsp[-3].minor.yy616 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); } break; case 166: /* type_name ::= DECIMAL */ -{ yymsp[0].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[0].minor.yy616 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 167: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */ -{ yymsp[-3].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[-3].minor.yy616 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 168: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */ -{ yymsp[-5].minor.yy784 = createDataType(TSDB_DATA_TYPE_DECIMAL); } +{ yymsp[-5].minor.yy616 = createDataType(TSDB_DATA_TYPE_DECIMAL); } break; case 170: /* tags_def_opt ::= tags_def */ - case 373: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==373); -{ yylhsminor.yy544 = yymsp[0].minor.yy544; } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 371: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==371); +{ yylhsminor.yy172 = yymsp[0].minor.yy172; } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; case 171: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */ -{ yymsp[-3].minor.yy544 = yymsp[-1].minor.yy544; } +{ yymsp[-3].minor.yy172 = yymsp[-1].minor.yy172; } break; case 172: /* table_options ::= */ -{ yymsp[1].minor.yy840 = createDefaultTableOptions(pCxt); } +{ yymsp[1].minor.yy272 = createDefaultTableOptions(pCxt); } break; case 173: /* table_options ::= table_options COMMENT NK_STRING */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-2].minor.yy272, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 174: /* table_options ::= table_options MAX_DELAY duration_list */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-2].minor.yy272, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy172); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 175: /* table_options ::= table_options WATERMARK duration_list */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy544); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-2].minor.yy272, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy172); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 176: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-4].minor.yy840, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy544); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-4].minor.yy272, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy172); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 177: /* table_options ::= table_options TTL NK_INTEGER */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-2].minor.yy840, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-2].minor.yy272, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 178: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-4].minor.yy840, TABLE_OPTION_SMA, yymsp[-1].minor.yy544); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-4].minor.yy272, TABLE_OPTION_SMA, yymsp[-1].minor.yy172); } + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; case 179: /* alter_table_options ::= alter_table_option */ -{ yylhsminor.yy840 = createAlterTableOptions(pCxt); yylhsminor.yy840 = setTableOption(pCxt, yylhsminor.yy840, yymsp[0].minor.yy95.type, &yymsp[0].minor.yy95.val); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createAlterTableOptions(pCxt); yylhsminor.yy272 = setTableOption(pCxt, yylhsminor.yy272, yymsp[0].minor.yy5.type, &yymsp[0].minor.yy5.val); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 180: /* alter_table_options ::= alter_table_options alter_table_option */ -{ yylhsminor.yy840 = setTableOption(pCxt, yymsp[-1].minor.yy840, yymsp[0].minor.yy95.type, &yymsp[0].minor.yy95.val); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setTableOption(pCxt, yymsp[-1].minor.yy272, yymsp[0].minor.yy5.type, &yymsp[0].minor.yy5.val); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 181: /* alter_table_option ::= COMMENT NK_STRING */ -{ yymsp[-1].minor.yy95.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy5.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy5.val = yymsp[0].minor.yy0; } break; case 182: /* alter_table_option ::= TTL NK_INTEGER */ -{ yymsp[-1].minor.yy95.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy95.val = yymsp[0].minor.yy0; } +{ yymsp[-1].minor.yy5.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy5.val = yymsp[0].minor.yy0; } break; case 183: /* duration_list ::= duration_literal */ - case 340: /* expression_list ::= expression */ yytestcase(yyruleno==340); -{ yylhsminor.yy544 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy840)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 338: /* expression_list ::= expression */ yytestcase(yyruleno==338); +{ yylhsminor.yy172 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; case 184: /* duration_list ::= duration_list NK_COMMA duration_literal */ - case 341: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==341); -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, releaseRawExprNode(pCxt, yymsp[0].minor.yy840)); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; + case 339: /* expression_list ::= expression_list NK_COMMA expression */ yytestcase(yyruleno==339); +{ yylhsminor.yy172 = addNodeToList(pCxt, yymsp[-2].minor.yy172, releaseRawExprNode(pCxt, yymsp[0].minor.yy272)); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; case 187: /* rollup_func_name ::= function_name */ -{ yylhsminor.yy840 = createFunctionNode(pCxt, &yymsp[0].minor.yy617, NULL); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createFunctionNode(pCxt, &yymsp[0].minor.yy209, NULL); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 188: /* rollup_func_name ::= FIRST */ case 189: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==189); -{ yylhsminor.yy840 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 192: /* col_name ::= column_name */ -{ yylhsminor.yy840 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy617); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy209); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 193: /* cmd ::= SHOW DNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); } @@ -4063,13 +4013,13 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); } break; case 196: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy840, yymsp[0].minor.yy840, OP_TYPE_LIKE); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, OP_TYPE_LIKE); } break; case 197: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy840, yymsp[0].minor.yy840, OP_TYPE_LIKE); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, OP_TYPE_LIKE); } break; case 198: /* cmd ::= SHOW db_name_cond_opt VGROUPS */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy840, NULL, OP_TYPE_LIKE); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy272, NULL, OP_TYPE_LIKE); } break; case 199: /* cmd ::= SHOW MNODES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); } @@ -4084,7 +4034,7 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); } break; case 203: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy840, yymsp[-1].minor.yy840, OP_TYPE_EQUAL); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy272, yymsp[-1].minor.yy272, OP_TYPE_EQUAL); } break; case 204: /* cmd ::= SHOW STREAMS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); } @@ -4103,13 +4053,13 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); } break; case 210: /* cmd ::= SHOW CREATE DATABASE db_name */ -{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy209); } break; case 211: /* cmd ::= SHOW CREATE TABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy272); } break; case 212: /* cmd ::= SHOW CREATE STABLE full_table_name */ -{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy272); } break; case 213: /* cmd ::= SHOW QUERIES */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } @@ -4142,7 +4092,7 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); } break; case 223: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */ -{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy272); } break; case 224: /* cmd ::= SHOW CONSUMERS */ { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); } @@ -4151,713 +4101,711 @@ static YYACTIONTYPE yy_reduce( { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); } break; case 226: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */ -{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy840, yymsp[-1].minor.yy840, OP_TYPE_EQUAL); } +{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy272, yymsp[-1].minor.yy272, OP_TYPE_EQUAL); } break; case 227: /* db_name_cond_opt ::= */ case 232: /* from_db_opt ::= */ yytestcase(yyruleno==232); -{ yymsp[1].minor.yy840 = createDefaultDatabaseCondValue(pCxt); } +{ yymsp[1].minor.yy272 = createDefaultDatabaseCondValue(pCxt); } break; case 228: /* db_name_cond_opt ::= db_name NK_DOT */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; case 229: /* like_pattern_opt ::= */ - case 268: /* into_opt ::= */ yytestcase(yyruleno==268); - case 406: /* from_clause_opt ::= */ yytestcase(yyruleno==406); - case 435: /* where_clause_opt ::= */ yytestcase(yyruleno==435); - case 439: /* twindow_clause_opt ::= */ yytestcase(yyruleno==439); - case 444: /* sliding_opt ::= */ yytestcase(yyruleno==444); - case 446: /* fill_opt ::= */ yytestcase(yyruleno==446); - case 458: /* having_clause_opt ::= */ yytestcase(yyruleno==458); - case 460: /* range_opt ::= */ yytestcase(yyruleno==460); - case 462: /* every_opt ::= */ yytestcase(yyruleno==462); - case 472: /* slimit_clause_opt ::= */ yytestcase(yyruleno==472); - case 476: /* limit_clause_opt ::= */ yytestcase(yyruleno==476); -{ yymsp[1].minor.yy840 = NULL; } + case 404: /* from_clause_opt ::= */ yytestcase(yyruleno==404); + case 433: /* where_clause_opt ::= */ yytestcase(yyruleno==433); + case 437: /* twindow_clause_opt ::= */ yytestcase(yyruleno==437); + case 442: /* sliding_opt ::= */ yytestcase(yyruleno==442); + case 444: /* fill_opt ::= */ yytestcase(yyruleno==444); + case 456: /* having_clause_opt ::= */ yytestcase(yyruleno==456); + case 458: /* range_opt ::= */ yytestcase(yyruleno==458); + case 460: /* every_opt ::= */ yytestcase(yyruleno==460); + case 470: /* slimit_clause_opt ::= */ yytestcase(yyruleno==470); + case 474: /* limit_clause_opt ::= */ yytestcase(yyruleno==474); +{ yymsp[1].minor.yy272 = NULL; } break; case 230: /* like_pattern_opt ::= LIKE NK_STRING */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } +{ yymsp[-1].minor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } break; case 231: /* table_name_cond ::= table_name */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy617); } - yymsp[0].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy209); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; case 233: /* from_db_opt ::= FROM db_name */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy617); } +{ yymsp[-1].minor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy209); } break; case 234: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */ -{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy313, yymsp[-3].minor.yy840, yymsp[-1].minor.yy840, NULL, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy293, yymsp[-3].minor.yy272, yymsp[-1].minor.yy272, NULL, yymsp[0].minor.yy272); } break; case 235: /* cmd ::= DROP INDEX exists_opt full_table_name */ -{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy313, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy293, yymsp[0].minor.yy272); } break; case 236: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-9].minor.yy840 = createIndexOption(pCxt, yymsp[-7].minor.yy544, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), NULL, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } +{ yymsp[-9].minor.yy272 = createIndexOption(pCxt, yymsp[-7].minor.yy172, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), NULL, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; case 237: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */ -{ yymsp[-11].minor.yy840 = createIndexOption(pCxt, yymsp[-9].minor.yy544, releaseRawExprNode(pCxt, yymsp[-5].minor.yy840), releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } +{ yymsp[-11].minor.yy272 = createIndexOption(pCxt, yymsp[-9].minor.yy172, releaseRawExprNode(pCxt, yymsp[-5].minor.yy272), releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; case 240: /* func ::= function_name NK_LP expression_list NK_RP */ -{ yylhsminor.yy840 = createFunctionNode(pCxt, &yymsp[-3].minor.yy617, yymsp[-1].minor.yy544); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = createFunctionNode(pCxt, &yymsp[-3].minor.yy209, yymsp[-1].minor.yy172); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; case 241: /* sma_stream_opt ::= */ - case 270: /* stream_options ::= */ yytestcase(yyruleno==270); -{ yymsp[1].minor.yy840 = createStreamOptions(pCxt); } + case 268: /* stream_options ::= */ yytestcase(yyruleno==268); +{ yymsp[1].minor.yy272 = createStreamOptions(pCxt); } break; case 242: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */ - case 274: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==274); -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 272: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==272); +{ ((SStreamOptions*)yymsp[-2].minor.yy272)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy272); yylhsminor.yy272 = yymsp[-2].minor.yy272; } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 243: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ ((SStreamOptions*)yymsp[-2].minor.yy272)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy272); yylhsminor.yy272 = yymsp[-2].minor.yy272; } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 244: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_expression */ -{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy313, &yymsp[-2].minor.yy617, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy293, &yymsp[-2].minor.yy209, yymsp[0].minor.yy272); } break; case 245: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy313, &yymsp[-3].minor.yy617, &yymsp[0].minor.yy617, false); } +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy293, &yymsp[-3].minor.yy209, &yymsp[0].minor.yy209, false); } break; case 246: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy313, &yymsp[-5].minor.yy617, &yymsp[0].minor.yy617, true); } +{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy293, &yymsp[-5].minor.yy209, &yymsp[0].minor.yy209, true); } break; case 247: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy313, &yymsp[-3].minor.yy617, yymsp[0].minor.yy840, false); } +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy293, &yymsp[-3].minor.yy209, yymsp[0].minor.yy272, false); } break; case 248: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */ -{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy313, &yymsp[-5].minor.yy617, yymsp[0].minor.yy840, true); } +{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy293, &yymsp[-5].minor.yy209, yymsp[0].minor.yy272, true); } break; case 249: /* cmd ::= DROP TOPIC exists_opt topic_name */ -{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy293, &yymsp[0].minor.yy209); } break; case 250: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */ -{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy313, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy293, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209); } break; case 251: /* cmd ::= DESC full_table_name */ case 252: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==252); -{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy272); } break; case 253: /* cmd ::= RESET QUERY CACHE */ { pCxt->pRootNode = createResetQueryCacheStmt(pCxt); } break; case 254: /* cmd ::= EXPLAIN analyze_opt explain_options query_expression */ -{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy313, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } +{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy293, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; case 256: /* analyze_opt ::= ANALYZE */ case 263: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==263); - case 426: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==426); -{ yymsp[0].minor.yy313 = true; } + case 424: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==424); +{ yymsp[0].minor.yy293 = true; } break; case 257: /* explain_options ::= */ -{ yymsp[1].minor.yy840 = createDefaultExplainOptions(pCxt); } +{ yymsp[1].minor.yy272 = createDefaultExplainOptions(pCxt); } break; case 258: /* explain_options ::= explain_options VERBOSE NK_BOOL */ -{ yylhsminor.yy840 = setExplainVerbose(pCxt, yymsp[-2].minor.yy840, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setExplainVerbose(pCxt, yymsp[-2].minor.yy272, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 259: /* explain_options ::= explain_options RATIO NK_FLOAT */ -{ yylhsminor.yy840 = setExplainRatio(pCxt, yymsp[-2].minor.yy840, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; +{ yylhsminor.yy272 = setExplainRatio(pCxt, yymsp[-2].minor.yy272, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; case 260: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */ -{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy313, yymsp[-8].minor.yy313, &yymsp[-5].minor.yy617, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy784, yymsp[0].minor.yy844); } +{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy293, yymsp[-8].minor.yy293, &yymsp[-5].minor.yy209, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy616, yymsp[0].minor.yy232); } break; case 261: /* cmd ::= DROP FUNCTION exists_opt function_name */ -{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy293, &yymsp[0].minor.yy209); } break; case 264: /* bufsize_opt ::= */ -{ yymsp[1].minor.yy844 = 0; } +{ yymsp[1].minor.yy232 = 0; } break; case 265: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ -{ yymsp[-1].minor.yy844 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } +{ yymsp[-1].minor.yy232 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); } break; - case 266: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options into_opt AS query_expression */ -{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-5].minor.yy313, &yymsp[-4].minor.yy617, yymsp[-2].minor.yy840, yymsp[-3].minor.yy840, yymsp[0].minor.yy840); } + case 266: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name AS query_expression */ +{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-6].minor.yy293, &yymsp[-5].minor.yy209, yymsp[-2].minor.yy272, yymsp[-4].minor.yy272, yymsp[0].minor.yy272); } break; case 267: /* cmd ::= DROP STREAM exists_opt stream_name */ -{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy313, &yymsp[0].minor.yy617); } +{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy293, &yymsp[0].minor.yy209); } break; - case 269: /* into_opt ::= INTO full_table_name */ - case 407: /* from_clause_opt ::= FROM table_reference_list */ yytestcase(yyruleno==407); - case 436: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==436); - case 459: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==459); -{ yymsp[-1].minor.yy840 = yymsp[0].minor.yy840; } + case 269: /* stream_options ::= stream_options TRIGGER AT_ONCE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy272)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy272 = yymsp[-2].minor.yy272; } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 271: /* stream_options ::= stream_options TRIGGER AT_ONCE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 270: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ +{ ((SStreamOptions*)yymsp[-2].minor.yy272)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy272 = yymsp[-2].minor.yy272; } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 272: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */ -{ ((SStreamOptions*)yymsp[-2].minor.yy840)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy840 = yymsp[-2].minor.yy840; } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 271: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ +{ ((SStreamOptions*)yymsp[-3].minor.yy272)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy272)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy272); yylhsminor.yy272 = yymsp[-3].minor.yy272; } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 273: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */ -{ ((SStreamOptions*)yymsp[-3].minor.yy840)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy840)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); yylhsminor.yy840 = yymsp[-3].minor.yy840; } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 273: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ +{ ((SStreamOptions*)yymsp[-3].minor.yy272)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy272 = yymsp[-3].minor.yy272; } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 275: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */ -{ ((SStreamOptions*)yymsp[-3].minor.yy840)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy840 = yymsp[-3].minor.yy840; } - yymsp[-3].minor.yy840 = yylhsminor.yy840; - break; - case 276: /* cmd ::= KILL CONNECTION NK_INTEGER */ + case 274: /* cmd ::= KILL CONNECTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); } break; - case 277: /* cmd ::= KILL QUERY NK_STRING */ + case 275: /* cmd ::= KILL QUERY NK_STRING */ { pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 278: /* cmd ::= KILL TRANSACTION NK_INTEGER */ + case 276: /* cmd ::= KILL TRANSACTION NK_INTEGER */ { pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); } break; - case 279: /* cmd ::= BALANCE VGROUP */ + case 277: /* cmd ::= BALANCE VGROUP */ { pCxt->pRootNode = createBalanceVgroupStmt(pCxt); } break; - case 280: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ + case 278: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */ { pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); } break; - case 281: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ -{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy544); } + case 279: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */ +{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy172); } break; - case 282: /* cmd ::= SPLIT VGROUP NK_INTEGER */ + case 280: /* cmd ::= SPLIT VGROUP NK_INTEGER */ { pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); } break; - case 283: /* dnode_list ::= DNODE NK_INTEGER */ -{ yymsp[-1].minor.yy544 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } + case 281: /* dnode_list ::= DNODE NK_INTEGER */ +{ yymsp[-1].minor.yy172 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); } break; - case 285: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ -{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 283: /* cmd ::= DELETE FROM full_table_name where_clause_opt */ +{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; - case 287: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy840, yymsp[-2].minor.yy544, yymsp[0].minor.yy840); } + case 285: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_expression */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy272, yymsp[-2].minor.yy172, yymsp[0].minor.yy272); } break; - case 288: /* cmd ::= INSERT INTO full_table_name query_expression */ -{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy840, NULL, yymsp[0].minor.yy840); } + case 286: /* cmd ::= INSERT INTO full_table_name query_expression */ +{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy272, NULL, yymsp[0].minor.yy272); } break; - case 289: /* literal ::= NK_INTEGER */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 287: /* literal ::= NK_INTEGER */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 290: /* literal ::= NK_FLOAT */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 288: /* literal ::= NK_FLOAT */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 291: /* literal ::= NK_STRING */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 289: /* literal ::= NK_STRING */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 292: /* literal ::= NK_BOOL */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 290: /* literal ::= NK_BOOL */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 293: /* literal ::= TIMESTAMP NK_STRING */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 291: /* literal ::= TIMESTAMP NK_STRING */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 294: /* literal ::= duration_literal */ - case 304: /* signed_literal ::= signed */ yytestcase(yyruleno==304); - case 324: /* expression ::= literal */ yytestcase(yyruleno==324); - case 325: /* expression ::= pseudo_column */ yytestcase(yyruleno==325); - case 326: /* expression ::= column_reference */ yytestcase(yyruleno==326); - case 327: /* expression ::= function_expression */ yytestcase(yyruleno==327); - case 328: /* expression ::= subquery */ yytestcase(yyruleno==328); - case 356: /* function_expression ::= literal_func */ yytestcase(yyruleno==356); - case 398: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==398); - case 402: /* boolean_primary ::= predicate */ yytestcase(yyruleno==402); - case 404: /* common_expression ::= expression */ yytestcase(yyruleno==404); - case 405: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==405); - case 408: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==408); - case 410: /* table_reference ::= table_primary */ yytestcase(yyruleno==410); - case 411: /* table_reference ::= joined_table */ yytestcase(yyruleno==411); - case 415: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==415); - case 465: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==465); - case 468: /* query_primary ::= query_specification */ yytestcase(yyruleno==468); -{ yylhsminor.yy840 = yymsp[0].minor.yy840; } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 292: /* literal ::= duration_literal */ + case 302: /* signed_literal ::= signed */ yytestcase(yyruleno==302); + case 322: /* expression ::= literal */ yytestcase(yyruleno==322); + case 323: /* expression ::= pseudo_column */ yytestcase(yyruleno==323); + case 324: /* expression ::= column_reference */ yytestcase(yyruleno==324); + case 325: /* expression ::= function_expression */ yytestcase(yyruleno==325); + case 326: /* expression ::= subquery */ yytestcase(yyruleno==326); + case 354: /* function_expression ::= literal_func */ yytestcase(yyruleno==354); + case 396: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==396); + case 400: /* boolean_primary ::= predicate */ yytestcase(yyruleno==400); + case 402: /* common_expression ::= expression */ yytestcase(yyruleno==402); + case 403: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==403); + case 406: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==406); + case 408: /* table_reference ::= table_primary */ yytestcase(yyruleno==408); + case 409: /* table_reference ::= joined_table */ yytestcase(yyruleno==409); + case 413: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==413); + case 463: /* query_expression_body ::= query_primary */ yytestcase(yyruleno==463); + case 466: /* query_primary ::= query_specification */ yytestcase(yyruleno==466); +{ yylhsminor.yy272 = yymsp[0].minor.yy272; } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 295: /* literal ::= NULL */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 293: /* literal ::= NULL */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 296: /* literal ::= NK_QUESTION */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 294: /* literal ::= NK_QUESTION */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 297: /* duration_literal ::= NK_VARIABLE */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 295: /* duration_literal ::= NK_VARIABLE */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 298: /* signed ::= NK_INTEGER */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 296: /* signed ::= NK_INTEGER */ +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 299: /* signed ::= NK_PLUS NK_INTEGER */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } + case 297: /* signed ::= NK_PLUS NK_INTEGER */ +{ yymsp[-1].minor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); } break; - case 300: /* signed ::= NK_MINUS NK_INTEGER */ + case 298: /* signed ::= NK_MINUS NK_INTEGER */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); + yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 301: /* signed ::= NK_FLOAT */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 299: /* signed ::= NK_FLOAT */ +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 302: /* signed ::= NK_PLUS NK_FLOAT */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } + case 300: /* signed ::= NK_PLUS NK_FLOAT */ +{ yymsp[-1].minor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); } break; - case 303: /* signed ::= NK_MINUS NK_FLOAT */ + case 301: /* signed ::= NK_MINUS NK_FLOAT */ { SToken t = yymsp[-1].minor.yy0; t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z; - yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); + yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 305: /* signed_literal ::= NK_STRING */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 303: /* signed_literal ::= NK_STRING */ +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 306: /* signed_literal ::= NK_BOOL */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 304: /* signed_literal ::= NK_BOOL */ +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 307: /* signed_literal ::= TIMESTAMP NK_STRING */ -{ yymsp[-1].minor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } + case 305: /* signed_literal ::= TIMESTAMP NK_STRING */ +{ yymsp[-1].minor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); } break; - case 308: /* signed_literal ::= duration_literal */ - case 310: /* signed_literal ::= literal_func */ yytestcase(yyruleno==310); - case 376: /* star_func_para ::= expression */ yytestcase(yyruleno==376); - case 431: /* select_item ::= common_expression */ yytestcase(yyruleno==431); - case 481: /* search_condition ::= common_expression */ yytestcase(yyruleno==481); -{ yylhsminor.yy840 = releaseRawExprNode(pCxt, yymsp[0].minor.yy840); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 306: /* signed_literal ::= duration_literal */ + case 308: /* signed_literal ::= literal_func */ yytestcase(yyruleno==308); + case 374: /* star_func_para ::= expression */ yytestcase(yyruleno==374); + case 429: /* select_item ::= common_expression */ yytestcase(yyruleno==429); + case 479: /* search_condition ::= common_expression */ yytestcase(yyruleno==479); +{ yylhsminor.yy272 = releaseRawExprNode(pCxt, yymsp[0].minor.yy272); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 309: /* signed_literal ::= NULL */ -{ yylhsminor.yy840 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 307: /* signed_literal ::= NULL */ +{ yylhsminor.yy272 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 311: /* signed_literal ::= NK_QUESTION */ -{ yylhsminor.yy840 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 309: /* signed_literal ::= NK_QUESTION */ +{ yylhsminor.yy272 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 329: /* expression ::= NK_LP expression NK_RP */ - case 403: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==403); -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 327: /* expression ::= NK_LP expression NK_RP */ + case 401: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==401); +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 330: /* expression ::= NK_PLUS expression */ + case 328: /* expression ::= NK_PLUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy840)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy272)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 331: /* expression ::= NK_MINUS expression */ + case 329: /* expression ::= NK_MINUS expression */ { - SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy840), NULL)); + SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy272), NULL)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 332: /* expression ::= expression NK_PLUS expression */ + case 330: /* expression ::= expression NK_PLUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 333: /* expression ::= expression NK_MINUS expression */ + case 331: /* expression ::= expression NK_MINUS expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 334: /* expression ::= expression NK_STAR expression */ + case 332: /* expression ::= expression NK_STAR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 335: /* expression ::= expression NK_SLASH expression */ + case 333: /* expression ::= expression NK_SLASH expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 336: /* expression ::= expression NK_REM expression */ + case 334: /* expression ::= expression NK_REM expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 337: /* expression ::= column_reference NK_ARROW NK_STRING */ + case 335: /* expression ::= column_reference NK_ARROW NK_STRING */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 338: /* expression ::= expression NK_BITAND expression */ + case 336: /* expression ::= expression NK_BITAND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 339: /* expression ::= expression NK_BITOR expression */ + case 337: /* expression ::= expression NK_BITOR expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 342: /* column_reference ::= column_name */ -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy617, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy617)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 340: /* column_reference ::= column_name */ +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy209, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy209)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 343: /* column_reference ::= table_name NK_DOT column_name */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617, createColumnNode(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy617)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 341: /* column_reference ::= table_name NK_DOT column_name */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209, createColumnNode(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy209)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 344: /* pseudo_column ::= ROWTS */ - case 345: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==345); - case 347: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==347); - case 348: /* pseudo_column ::= QEND */ yytestcase(yyruleno==348); - case 349: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==349); - case 350: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==350); - case 351: /* pseudo_column ::= WEND */ yytestcase(yyruleno==351); - case 352: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==352); - case 358: /* literal_func ::= NOW */ yytestcase(yyruleno==358); -{ yylhsminor.yy840 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 342: /* pseudo_column ::= ROWTS */ + case 343: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==343); + case 345: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==345); + case 346: /* pseudo_column ::= QEND */ yytestcase(yyruleno==346); + case 347: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==347); + case 348: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==348); + case 349: /* pseudo_column ::= WEND */ yytestcase(yyruleno==349); + case 350: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==350); + case 356: /* literal_func ::= NOW */ yytestcase(yyruleno==356); +{ yylhsminor.yy272 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 346: /* pseudo_column ::= table_name NK_DOT TBNAME */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy617)))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 344: /* pseudo_column ::= table_name NK_DOT TBNAME */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy209)))); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 353: /* function_expression ::= function_name NK_LP expression_list NK_RP */ - case 354: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==354); -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy617, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy617, yymsp[-1].minor.yy544)); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 351: /* function_expression ::= function_name NK_LP expression_list NK_RP */ + case 352: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==352); +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy209, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy209, yymsp[-1].minor.yy172)); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 355: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), yymsp[-1].minor.yy784)); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + case 353: /* function_expression ::= CAST NK_LP expression AS type_name NK_RP */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), yymsp[-1].minor.yy616)); } + yymsp[-5].minor.yy272 = yylhsminor.yy272; break; - case 357: /* literal_func ::= noarg_func NK_LP NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy617, NULL)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 355: /* literal_func ::= noarg_func NK_LP NK_RP */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy209, NULL)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 372: /* star_func_para_list ::= NK_STAR */ -{ yylhsminor.yy544 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 370: /* star_func_para_list ::= NK_STAR */ +{ yylhsminor.yy172 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; - case 377: /* star_func_para ::= table_name NK_DOT NK_STAR */ - case 434: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==434); -{ yylhsminor.yy840 = createColumnNode(pCxt, &yymsp[-2].minor.yy617, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 375: /* star_func_para ::= table_name NK_DOT NK_STAR */ + case 432: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==432); +{ yylhsminor.yy272 = createColumnNode(pCxt, &yymsp[-2].minor.yy209, &yymsp[0].minor.yy0); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 378: /* predicate ::= expression compare_op expression */ - case 383: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==383); + case 376: /* predicate ::= expression compare_op expression */ + case 381: /* predicate ::= expression in_op in_predicate_value */ yytestcase(yyruleno==381); { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy198, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy392, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 379: /* predicate ::= expression BETWEEN expression AND expression */ + case 377: /* predicate ::= expression BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy840), releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy272), releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-4].minor.yy840 = yylhsminor.yy840; + yymsp[-4].minor.yy272 = yylhsminor.yy272; break; - case 380: /* predicate ::= expression NOT BETWEEN expression AND expression */ + case 378: /* predicate ::= expression NOT BETWEEN expression AND expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy840), releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy272), releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + yymsp[-5].minor.yy272 = yylhsminor.yy272; break; - case 381: /* predicate ::= expression IS NULL */ + case 379: /* predicate ::= expression IS NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), NULL)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 382: /* predicate ::= expression IS NOT NULL */ + case 380: /* predicate ::= expression IS NOT NULL */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), NULL)); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), NULL)); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 384: /* compare_op ::= NK_LT */ -{ yymsp[0].minor.yy198 = OP_TYPE_LOWER_THAN; } + case 382: /* compare_op ::= NK_LT */ +{ yymsp[0].minor.yy392 = OP_TYPE_LOWER_THAN; } break; - case 385: /* compare_op ::= NK_GT */ -{ yymsp[0].minor.yy198 = OP_TYPE_GREATER_THAN; } + case 383: /* compare_op ::= NK_GT */ +{ yymsp[0].minor.yy392 = OP_TYPE_GREATER_THAN; } break; - case 386: /* compare_op ::= NK_LE */ -{ yymsp[0].minor.yy198 = OP_TYPE_LOWER_EQUAL; } + case 384: /* compare_op ::= NK_LE */ +{ yymsp[0].minor.yy392 = OP_TYPE_LOWER_EQUAL; } break; - case 387: /* compare_op ::= NK_GE */ -{ yymsp[0].minor.yy198 = OP_TYPE_GREATER_EQUAL; } + case 385: /* compare_op ::= NK_GE */ +{ yymsp[0].minor.yy392 = OP_TYPE_GREATER_EQUAL; } break; - case 388: /* compare_op ::= NK_NE */ -{ yymsp[0].minor.yy198 = OP_TYPE_NOT_EQUAL; } + case 386: /* compare_op ::= NK_NE */ +{ yymsp[0].minor.yy392 = OP_TYPE_NOT_EQUAL; } break; - case 389: /* compare_op ::= NK_EQ */ -{ yymsp[0].minor.yy198 = OP_TYPE_EQUAL; } + case 387: /* compare_op ::= NK_EQ */ +{ yymsp[0].minor.yy392 = OP_TYPE_EQUAL; } break; - case 390: /* compare_op ::= LIKE */ -{ yymsp[0].minor.yy198 = OP_TYPE_LIKE; } + case 388: /* compare_op ::= LIKE */ +{ yymsp[0].minor.yy392 = OP_TYPE_LIKE; } break; - case 391: /* compare_op ::= NOT LIKE */ -{ yymsp[-1].minor.yy198 = OP_TYPE_NOT_LIKE; } + case 389: /* compare_op ::= NOT LIKE */ +{ yymsp[-1].minor.yy392 = OP_TYPE_NOT_LIKE; } break; - case 392: /* compare_op ::= MATCH */ -{ yymsp[0].minor.yy198 = OP_TYPE_MATCH; } + case 390: /* compare_op ::= MATCH */ +{ yymsp[0].minor.yy392 = OP_TYPE_MATCH; } break; - case 393: /* compare_op ::= NMATCH */ -{ yymsp[0].minor.yy198 = OP_TYPE_NMATCH; } + case 391: /* compare_op ::= NMATCH */ +{ yymsp[0].minor.yy392 = OP_TYPE_NMATCH; } break; - case 394: /* compare_op ::= CONTAINS */ -{ yymsp[0].minor.yy198 = OP_TYPE_JSON_CONTAINS; } + case 392: /* compare_op ::= CONTAINS */ +{ yymsp[0].minor.yy392 = OP_TYPE_JSON_CONTAINS; } break; - case 395: /* in_op ::= IN */ -{ yymsp[0].minor.yy198 = OP_TYPE_IN; } + case 393: /* in_op ::= IN */ +{ yymsp[0].minor.yy392 = OP_TYPE_IN; } break; - case 396: /* in_op ::= NOT IN */ -{ yymsp[-1].minor.yy198 = OP_TYPE_NOT_IN; } + case 394: /* in_op ::= NOT IN */ +{ yymsp[-1].minor.yy392 = OP_TYPE_NOT_IN; } break; - case 397: /* in_predicate_value ::= NK_LP literal_list NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy544)); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 395: /* in_predicate_value ::= NK_LP literal_list NK_RP */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy172)); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 399: /* boolean_value_expression ::= NOT boolean_primary */ + case 397: /* boolean_value_expression ::= NOT boolean_primary */ { - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy840), NULL)); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy272), NULL)); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 400: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ + case 398: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 401: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ + case 399: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */ { - SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy840); - SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy840); - yylhsminor.yy840 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); + SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy272); + SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy272); + yylhsminor.yy272 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 409: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ -{ yylhsminor.yy840 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy840, yymsp[0].minor.yy840, NULL); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 405: /* from_clause_opt ::= FROM table_reference_list */ + case 434: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==434); + case 457: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==457); +{ yymsp[-1].minor.yy272 = yymsp[0].minor.yy272; } break; - case 412: /* table_primary ::= table_name alias_opt */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 407: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */ +{ yylhsminor.yy272 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy272, yymsp[0].minor.yy272, NULL); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 413: /* table_primary ::= db_name NK_DOT table_name alias_opt */ -{ yylhsminor.yy840 = createRealTableNode(pCxt, &yymsp[-3].minor.yy617, &yymsp[-1].minor.yy617, &yymsp[0].minor.yy617); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 410: /* table_primary ::= table_name alias_opt */ +{ yylhsminor.yy272 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy209, &yymsp[0].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 414: /* table_primary ::= subquery alias_opt */ -{ yylhsminor.yy840 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840), &yymsp[0].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 411: /* table_primary ::= db_name NK_DOT table_name alias_opt */ +{ yylhsminor.yy272 = createRealTableNode(pCxt, &yymsp[-3].minor.yy209, &yymsp[-1].minor.yy209, &yymsp[0].minor.yy209); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 416: /* alias_opt ::= */ -{ yymsp[1].minor.yy617 = nil_token; } + case 412: /* table_primary ::= subquery alias_opt */ +{ yylhsminor.yy272 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272), &yymsp[0].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 417: /* alias_opt ::= table_alias */ -{ yylhsminor.yy617 = yymsp[0].minor.yy617; } - yymsp[0].minor.yy617 = yylhsminor.yy617; + case 414: /* alias_opt ::= */ +{ yymsp[1].minor.yy209 = nil_token; } break; - case 418: /* alias_opt ::= AS table_alias */ -{ yymsp[-1].minor.yy617 = yymsp[0].minor.yy617; } + case 415: /* alias_opt ::= table_alias */ +{ yylhsminor.yy209 = yymsp[0].minor.yy209; } + yymsp[0].minor.yy209 = yylhsminor.yy209; break; - case 419: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ - case 420: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==420); -{ yymsp[-2].minor.yy840 = yymsp[-1].minor.yy840; } + case 416: /* alias_opt ::= AS table_alias */ +{ yymsp[-1].minor.yy209 = yymsp[0].minor.yy209; } break; - case 421: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ -{ yylhsminor.yy840 = createJoinTableNode(pCxt, yymsp[-4].minor.yy708, yymsp[-5].minor.yy840, yymsp[-2].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-5].minor.yy840 = yylhsminor.yy840; + case 417: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */ + case 418: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==418); +{ yymsp[-2].minor.yy272 = yymsp[-1].minor.yy272; } break; - case 422: /* join_type ::= */ -{ yymsp[1].minor.yy708 = JOIN_TYPE_INNER; } + case 419: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */ +{ yylhsminor.yy272 = createJoinTableNode(pCxt, yymsp[-4].minor.yy156, yymsp[-5].minor.yy272, yymsp[-2].minor.yy272, yymsp[0].minor.yy272); } + yymsp[-5].minor.yy272 = yylhsminor.yy272; break; - case 423: /* join_type ::= INNER */ -{ yymsp[0].minor.yy708 = JOIN_TYPE_INNER; } + case 420: /* join_type ::= */ +{ yymsp[1].minor.yy156 = JOIN_TYPE_INNER; } break; - case 424: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ + case 421: /* join_type ::= INNER */ +{ yymsp[0].minor.yy156 = JOIN_TYPE_INNER; } + break; + case 422: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */ { - yymsp[-11].minor.yy840 = createSelectStmt(pCxt, yymsp[-10].minor.yy313, yymsp[-9].minor.yy544, yymsp[-8].minor.yy840); - yymsp[-11].minor.yy840 = addWhereClause(pCxt, yymsp[-11].minor.yy840, yymsp[-7].minor.yy840); - yymsp[-11].minor.yy840 = addPartitionByClause(pCxt, yymsp[-11].minor.yy840, yymsp[-6].minor.yy544); - yymsp[-11].minor.yy840 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy840, yymsp[-2].minor.yy840); - yymsp[-11].minor.yy840 = addGroupByClause(pCxt, yymsp[-11].minor.yy840, yymsp[-1].minor.yy544); - yymsp[-11].minor.yy840 = addHavingClause(pCxt, yymsp[-11].minor.yy840, yymsp[0].minor.yy840); - yymsp[-11].minor.yy840 = addRangeClause(pCxt, yymsp[-11].minor.yy840, yymsp[-5].minor.yy840); - yymsp[-11].minor.yy840 = addEveryClause(pCxt, yymsp[-11].minor.yy840, yymsp[-4].minor.yy840); - yymsp[-11].minor.yy840 = addFillClause(pCxt, yymsp[-11].minor.yy840, yymsp[-3].minor.yy840); + yymsp[-11].minor.yy272 = createSelectStmt(pCxt, yymsp[-10].minor.yy293, yymsp[-9].minor.yy172, yymsp[-8].minor.yy272); + yymsp[-11].minor.yy272 = addWhereClause(pCxt, yymsp[-11].minor.yy272, yymsp[-7].minor.yy272); + yymsp[-11].minor.yy272 = addPartitionByClause(pCxt, yymsp[-11].minor.yy272, yymsp[-6].minor.yy172); + yymsp[-11].minor.yy272 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy272, yymsp[-2].minor.yy272); + yymsp[-11].minor.yy272 = addGroupByClause(pCxt, yymsp[-11].minor.yy272, yymsp[-1].minor.yy172); + yymsp[-11].minor.yy272 = addHavingClause(pCxt, yymsp[-11].minor.yy272, yymsp[0].minor.yy272); + yymsp[-11].minor.yy272 = addRangeClause(pCxt, yymsp[-11].minor.yy272, yymsp[-5].minor.yy272); + yymsp[-11].minor.yy272 = addEveryClause(pCxt, yymsp[-11].minor.yy272, yymsp[-4].minor.yy272); + yymsp[-11].minor.yy272 = addFillClause(pCxt, yymsp[-11].minor.yy272, yymsp[-3].minor.yy272); } break; - case 427: /* set_quantifier_opt ::= ALL */ -{ yymsp[0].minor.yy313 = false; } + case 425: /* set_quantifier_opt ::= ALL */ +{ yymsp[0].minor.yy293 = false; } break; - case 430: /* select_item ::= NK_STAR */ -{ yylhsminor.yy840 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy840 = yylhsminor.yy840; + case 428: /* select_item ::= NK_STAR */ +{ yylhsminor.yy272 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); } + yymsp[0].minor.yy272 = yylhsminor.yy272; break; - case 432: /* select_item ::= common_expression column_alias */ -{ yylhsminor.yy840 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840), &yymsp[0].minor.yy617); } - yymsp[-1].minor.yy840 = yylhsminor.yy840; + case 430: /* select_item ::= common_expression column_alias */ +{ yylhsminor.yy272 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272), &yymsp[0].minor.yy209); } + yymsp[-1].minor.yy272 = yylhsminor.yy272; break; - case 433: /* select_item ::= common_expression AS column_alias */ -{ yylhsminor.yy840 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), &yymsp[0].minor.yy617); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 431: /* select_item ::= common_expression AS column_alias */ +{ yylhsminor.yy272 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), &yymsp[0].minor.yy209); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 438: /* partition_by_clause_opt ::= PARTITION BY expression_list */ - case 455: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==455); - case 471: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==471); -{ yymsp[-2].minor.yy544 = yymsp[0].minor.yy544; } + case 436: /* partition_by_clause_opt ::= PARTITION BY expression_list */ + case 453: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==453); + case 469: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==469); +{ yymsp[-2].minor.yy172 = yymsp[0].minor.yy172; } break; - case 440: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ -{ yymsp[-5].minor.yy840 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } + case 438: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */ +{ yymsp[-5].minor.yy272 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), releaseRawExprNode(pCxt, yymsp[-1].minor.yy272)); } break; - case 441: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ -{ yymsp[-3].minor.yy840 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } + case 439: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expression NK_RP */ +{ yymsp[-3].minor.yy272 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy272)); } break; - case 442: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-5].minor.yy840 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), NULL, yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 440: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-5].minor.yy272 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), NULL, yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; - case 443: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ -{ yymsp[-7].minor.yy840 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy840), releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), yymsp[-1].minor.yy840, yymsp[0].minor.yy840); } + case 441: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */ +{ yymsp[-7].minor.yy272 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy272), releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), yymsp[-1].minor.yy272, yymsp[0].minor.yy272); } break; - case 445: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ - case 463: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==463); -{ yymsp[-3].minor.yy840 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy840); } + case 443: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ + case 461: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==461); +{ yymsp[-3].minor.yy272 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy272); } break; - case 447: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ -{ yymsp[-3].minor.yy840 = createFillNode(pCxt, yymsp[-1].minor.yy816, NULL); } + case 445: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */ +{ yymsp[-3].minor.yy272 = createFillNode(pCxt, yymsp[-1].minor.yy186, NULL); } break; - case 448: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ -{ yymsp[-5].minor.yy840 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy544)); } + case 446: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */ +{ yymsp[-5].minor.yy272 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy172)); } break; - case 449: /* fill_mode ::= NONE */ -{ yymsp[0].minor.yy816 = FILL_MODE_NONE; } + case 447: /* fill_mode ::= NONE */ +{ yymsp[0].minor.yy186 = FILL_MODE_NONE; } break; - case 450: /* fill_mode ::= PREV */ -{ yymsp[0].minor.yy816 = FILL_MODE_PREV; } + case 448: /* fill_mode ::= PREV */ +{ yymsp[0].minor.yy186 = FILL_MODE_PREV; } break; - case 451: /* fill_mode ::= NULL */ -{ yymsp[0].minor.yy816 = FILL_MODE_NULL; } + case 449: /* fill_mode ::= NULL */ +{ yymsp[0].minor.yy186 = FILL_MODE_NULL; } break; - case 452: /* fill_mode ::= LINEAR */ -{ yymsp[0].minor.yy816 = FILL_MODE_LINEAR; } + case 450: /* fill_mode ::= LINEAR */ +{ yymsp[0].minor.yy186 = FILL_MODE_LINEAR; } break; - case 453: /* fill_mode ::= NEXT */ -{ yymsp[0].minor.yy816 = FILL_MODE_NEXT; } + case 451: /* fill_mode ::= NEXT */ +{ yymsp[0].minor.yy186 = FILL_MODE_NEXT; } break; - case 456: /* group_by_list ::= expression */ -{ yylhsminor.yy544 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); } - yymsp[0].minor.yy544 = yylhsminor.yy544; + case 454: /* group_by_list ::= expression */ +{ yylhsminor.yy172 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } + yymsp[0].minor.yy172 = yylhsminor.yy172; break; - case 457: /* group_by_list ::= group_by_list NK_COMMA expression */ -{ yylhsminor.yy544 = addNodeToList(pCxt, yymsp[-2].minor.yy544, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy840))); } - yymsp[-2].minor.yy544 = yylhsminor.yy544; + case 455: /* group_by_list ::= group_by_list NK_COMMA expression */ +{ yylhsminor.yy172 = addNodeToList(pCxt, yymsp[-2].minor.yy172, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy272))); } + yymsp[-2].minor.yy172 = yylhsminor.yy172; break; - case 461: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ -{ yymsp[-5].minor.yy840 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy840), releaseRawExprNode(pCxt, yymsp[-1].minor.yy840)); } + case 459: /* range_opt ::= RANGE NK_LP expression NK_COMMA expression NK_RP */ +{ yymsp[-5].minor.yy272 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy272), releaseRawExprNode(pCxt, yymsp[-1].minor.yy272)); } break; - case 464: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ + case 462: /* query_expression ::= query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt */ { - yylhsminor.yy840 = addOrderByClause(pCxt, yymsp[-3].minor.yy840, yymsp[-2].minor.yy544); - yylhsminor.yy840 = addSlimitClause(pCxt, yylhsminor.yy840, yymsp[-1].minor.yy840); - yylhsminor.yy840 = addLimitClause(pCxt, yylhsminor.yy840, yymsp[0].minor.yy840); + yylhsminor.yy272 = addOrderByClause(pCxt, yymsp[-3].minor.yy272, yymsp[-2].minor.yy172); + yylhsminor.yy272 = addSlimitClause(pCxt, yylhsminor.yy272, yymsp[-1].minor.yy272); + yylhsminor.yy272 = addLimitClause(pCxt, yylhsminor.yy272, yymsp[0].minor.yy272); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 466: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ -{ yylhsminor.yy840 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-3].minor.yy840 = yylhsminor.yy840; + case 464: /* query_expression_body ::= query_expression_body UNION ALL query_expression_body */ +{ yylhsminor.yy272 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy272, yymsp[0].minor.yy272); } + yymsp[-3].minor.yy272 = yylhsminor.yy272; break; - case 467: /* query_expression_body ::= query_expression_body UNION query_expression_body */ -{ yylhsminor.yy840 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy840, yymsp[0].minor.yy840); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 465: /* query_expression_body ::= query_expression_body UNION query_expression_body */ +{ yylhsminor.yy272 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy272, yymsp[0].minor.yy272); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 469: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ + case 467: /* query_primary ::= NK_LP query_expression_body order_by_clause_opt slimit_clause_opt limit_clause_opt NK_RP */ { - yymsp[-5].minor.yy840 = addOrderByClause(pCxt, yymsp[-4].minor.yy840, yymsp[-3].minor.yy544); - yymsp[-5].minor.yy840 = addSlimitClause(pCxt, yymsp[-5].minor.yy840, yymsp[-2].minor.yy840); - yymsp[-5].minor.yy840 = addLimitClause(pCxt, yymsp[-5].minor.yy840, yymsp[-1].minor.yy840); + yymsp[-5].minor.yy272 = addOrderByClause(pCxt, yymsp[-4].minor.yy272, yymsp[-3].minor.yy172); + yymsp[-5].minor.yy272 = addSlimitClause(pCxt, yymsp[-5].minor.yy272, yymsp[-2].minor.yy272); + yymsp[-5].minor.yy272 = addLimitClause(pCxt, yymsp[-5].minor.yy272, yymsp[-1].minor.yy272); } break; - case 473: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ - case 477: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==477); -{ yymsp[-1].minor.yy840 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } + case 471: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */ + case 475: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==475); +{ yymsp[-1].minor.yy272 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); } break; - case 474: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ - case 478: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==478); -{ yymsp[-3].minor.yy840 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } + case 472: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */ + case 476: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==476); +{ yymsp[-3].minor.yy272 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 475: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ - case 479: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==479); -{ yymsp[-3].minor.yy840 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } + case 473: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */ + case 477: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==477); +{ yymsp[-3].minor.yy272 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); } break; - case 480: /* subquery ::= NK_LP query_expression NK_RP */ -{ yylhsminor.yy840 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy840); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 478: /* subquery ::= NK_LP query_expression NK_RP */ +{ yylhsminor.yy272 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy272); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 484: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ -{ yylhsminor.yy840 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy840), yymsp[-1].minor.yy204, yymsp[0].minor.yy277); } - yymsp[-2].minor.yy840 = yylhsminor.yy840; + case 482: /* sort_specification ::= expression ordering_specification_opt null_ordering_opt */ +{ yylhsminor.yy272 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy272), yymsp[-1].minor.yy818, yymsp[0].minor.yy493); } + yymsp[-2].minor.yy272 = yylhsminor.yy272; break; - case 485: /* ordering_specification_opt ::= */ -{ yymsp[1].minor.yy204 = ORDER_ASC; } + case 483: /* ordering_specification_opt ::= */ +{ yymsp[1].minor.yy818 = ORDER_ASC; } break; - case 486: /* ordering_specification_opt ::= ASC */ -{ yymsp[0].minor.yy204 = ORDER_ASC; } + case 484: /* ordering_specification_opt ::= ASC */ +{ yymsp[0].minor.yy818 = ORDER_ASC; } break; - case 487: /* ordering_specification_opt ::= DESC */ -{ yymsp[0].minor.yy204 = ORDER_DESC; } + case 485: /* ordering_specification_opt ::= DESC */ +{ yymsp[0].minor.yy818 = ORDER_DESC; } break; - case 488: /* null_ordering_opt ::= */ -{ yymsp[1].minor.yy277 = NULL_ORDER_DEFAULT; } + case 486: /* null_ordering_opt ::= */ +{ yymsp[1].minor.yy493 = NULL_ORDER_DEFAULT; } break; - case 489: /* null_ordering_opt ::= NULLS FIRST */ -{ yymsp[-1].minor.yy277 = NULL_ORDER_FIRST; } + case 487: /* null_ordering_opt ::= NULLS FIRST */ +{ yymsp[-1].minor.yy493 = NULL_ORDER_FIRST; } break; - case 490: /* null_ordering_opt ::= NULLS LAST */ -{ yymsp[-1].minor.yy277 = NULL_ORDER_LAST; } + case 488: /* null_ordering_opt ::= NULLS LAST */ +{ yymsp[-1].minor.yy493 = NULL_ORDER_LAST; } break; default: break; From 6305b59a918926b67c1e100e72ff00ed120dff2f Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 25 Aug 2022 17:14:51 +0800 Subject: [PATCH 07/47] fix(query): fix valgrind report unitialized variable error --- source/util/src/thash.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/util/src/thash.c b/source/util/src/thash.c index aee84a0d55..e8234c8e4e 100644 --- a/source/util/src/thash.c +++ b/source/util/src/thash.c @@ -250,11 +250,15 @@ SHashObj *taosHashInit(size_t capacity, _hash_fn_t fn, bool update, SHashLockTyp // the max slots is not defined by user pHashObj->capacity = taosHashCapacity((int32_t)capacity); + pHashObj->size = 0; pHashObj->equalFp = memcmp; pHashObj->hashFp = fn; pHashObj->type = type; + pHashObj->lock = 0; pHashObj->enableUpdate = update; + pHashObj->freeFp = NULL; + pHashObj->callbackFp = NULL; ASSERT((pHashObj->capacity & (pHashObj->capacity - 1)) == 0); @@ -327,7 +331,7 @@ int32_t taosHashPut(SHashObj *pHashObj, const void *key, size_t keyLen, const vo // disable resize taosHashRLock(pHashObj); - int32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); + uint32_t slot = HASH_INDEX(hashVal, pHashObj->capacity); SHashEntry *pe = pHashObj->hashList[slot]; taosHashEntryWLock(pHashObj, pe); From 847c0176e0e6b1f2b4209c4599795b2c528081fb Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 25 Aug 2022 17:14:51 +0800 Subject: [PATCH 08/47] fix(query): fix valgrind report unitialized variable error --- source/client/src/clientImpl.c | 2 +- source/libs/parser/src/parInsert.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 35c09f8357..102ec9c0e0 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -1956,7 +1956,7 @@ _OVER: int32_t appendTbToReq(SHashObj* pHash, int32_t pos1, int32_t len1, int32_t pos2, int32_t len2, const char* str, int32_t acctId, char* db) { - SName name; + SName name = {0}; if (len1 <= 0) { return -1; diff --git a/source/libs/parser/src/parInsert.c b/source/libs/parser/src/parInsert.c index 4e32672697..c9115d90e1 100644 --- a/source/libs/parser/src/parInsert.c +++ b/source/libs/parser/src/parInsert.c @@ -1715,7 +1715,7 @@ static int32_t skipUsingClause(SInsertParseSyntaxCxt* pCxt) { } static int32_t collectTableMetaKey(SInsertParseSyntaxCxt* pCxt, bool isStable, int32_t tableNo, SToken* pTbToken) { - SName name; + SName name = {0}; CHECK_CODE(createSName(&name, pTbToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg)); CHECK_CODE(reserveTableMetaInCacheForInsert(&name, isStable ? CATALOG_REQ_TYPE_META : CATALOG_REQ_TYPE_BOTH, tableNo, pCxt->pMetaCache)); @@ -1730,7 +1730,7 @@ static int32_t checkTableName(const char* pTableName, SMsgBuf* pMsgBuf) { } static int32_t collectAutoCreateTableMetaKey(SInsertParseSyntaxCxt* pCxt, int32_t tableNo, SToken* pTbToken) { - SName name; + SName name = {0}; CHECK_CODE(createSName(&name, pTbToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg)); CHECK_CODE(checkTableName(name.tname, &pCxt->msg)); CHECK_CODE(reserveTableMetaInCacheForInsert(&name, CATALOG_REQ_TYPE_VGROUP, tableNo, pCxt->pMetaCache)); From 417cf3c587016c4ee652abc3622b1b4ad4e4cd40 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Thu, 25 Aug 2022 17:14:51 +0800 Subject: [PATCH 09/47] fix(query): fix valgrind report unitialized variable error --- source/libs/catalog/inc/catalogInt.h | 24 +-- source/libs/catalog/src/ctgAsync.c | 286 +++++++++++++-------------- 2 files changed, 155 insertions(+), 155 deletions(-) diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h index 777dcd0592..9b62581051 100644 --- a/source/libs/catalog/inc/catalogInt.h +++ b/source/libs/catalog/inc/catalogInt.h @@ -188,7 +188,7 @@ typedef struct SCtgTbCache { typedef struct SCtgVgCache { SRWLatch vgLock; - SDBVgInfo *vgInfo; + SDBVgInfo *vgInfo; } SCtgVgCache; typedef struct SCtgDBCache { @@ -224,7 +224,7 @@ typedef struct SCtgUserAuth { } SCtgUserAuth; typedef struct SCatalog { - uint64_t clusterId; + uint64_t clusterId; SHashObj *userCache; //key:user, value:SCtgUserAuth SHashObj *dbCache; //key:dbname, value:SCtgDBCache SCtgRentMgmt dbRent; @@ -253,9 +253,9 @@ typedef struct SCtgJob { int32_t jobResCode; int32_t taskIdx; SRWLatch taskLock; - + uint64_t queryId; - SCatalog* pCtg; + SCatalog* pCtg; SRequestConnInfo conn; void* userParam; catalogCallback userFp; @@ -279,7 +279,7 @@ typedef struct SCtgMsgCtx { void* lastOut; void* out; char* target; - SHashObj* pBatchs; + SHashObj* pBatchs; } SCtgMsgCtx; @@ -364,7 +364,7 @@ typedef struct SCtgCacheStat { uint64_t numOfMetaHit; uint64_t numOfMetaMiss; uint64_t numOfIndexHit; - uint64_t numOfIndexMiss; + uint64_t numOfIndexMiss; uint64_t numOfUserHit; uint64_t numOfUserMiss; uint64_t numOfClear; @@ -451,7 +451,7 @@ typedef struct SCtgCacheOperation { int32_t opId; void *data; bool syncOp; - tsem_t rspSem; + tsem_t rspSem; bool stopQueue; bool unLocked; } SCtgCacheOperation; @@ -466,7 +466,7 @@ typedef struct SCtgQueue { bool stopQueue; SCtgQNode *head; SCtgQNode *tail; - tsem_t reqSem; + tsem_t reqSem; uint64_t qRemainNum; } SCtgQueue; @@ -475,7 +475,7 @@ typedef struct SCatalogMgmt { int32_t jobPool; SRWLatch lock; SCtgQueue queue; - TdThread updateThread; + TdThread updateThread; SHashObj *pCluster; //key: clusterId, value: SCatalog* SCatalogStat stat; SCatalogCfg cfg; @@ -528,8 +528,8 @@ typedef struct SCtgOperation { #define CTG_META_SIZE(pMeta) (sizeof(STableMeta) + ((pMeta)->tableInfo.numOfTags + (pMeta)->tableInfo.numOfColumns) * sizeof(SSchema)) -#define CTG_TABLE_NOT_EXIST(code) (code == CTG_ERR_CODE_TABLE_NOT_EXIST) -#define CTG_DB_NOT_EXIST(code) (code == TSDB_CODE_MND_DB_NOT_EXIST) +#define CTG_TABLE_NOT_EXIST(code) (code == CTG_ERR_CODE_TABLE_NOT_EXIST) +#define CTG_DB_NOT_EXIST(code) (code == TSDB_CODE_MND_DB_NOT_EXIST) #define ctgFatal(param, ...) qFatal("CTG:%p " param, pCtg, __VA_ARGS__) #define ctgError(param, ...) qError("CTG:%p " param, pCtg, __VA_ARGS__) @@ -576,7 +576,7 @@ typedef struct SCtgOperation { } \ } while (0) - + #define CTG_ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; return _code; } } while (0) #define CTG_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; } return _code; } while (0) #define CTG_ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { terrno = code; goto _return; } } while (0) diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c index 64ca85edf4..585b33930c 100644 --- a/source/libs/catalog/src/ctgAsync.c +++ b/source/libs/catalog/src/ctgAsync.c @@ -39,7 +39,7 @@ int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, void* param) { taosMemoryFree(task.taskCtx); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - + memcpy(ctx->pName, name, sizeof(*name)); ctx->flag = CTG_FLAG_UNKNOWN_STB; @@ -69,7 +69,7 @@ int32_t ctgInitGetTbMetasTask(SCtgJob *pJob, int32_t taskIdx, void* param) { taosArrayPush(pJob->pTasks, &task); - qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%d, tbNum:%d", + qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%d, tbNum:%d", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), taosArrayGetSize(ctx->pNames), pJob->tbMetaNum); return TSDB_CODE_SUCCESS; @@ -89,7 +89,7 @@ int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, void* param) { } SCtgDbVgCtx* ctx = task.taskCtx; - + memcpy(ctx->dbFName, dbFName, sizeof(ctx->dbFName)); taosArrayPush(pJob->pTasks, &task); @@ -113,7 +113,7 @@ int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, void* param) { } SCtgDbCfgCtx* ctx = task.taskCtx; - + memcpy(ctx->dbFName, dbFName, sizeof(ctx->dbFName)); taosArrayPush(pJob->pTasks, &task); @@ -137,7 +137,7 @@ int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, void* param) { } SCtgDbInfoCtx* ctx = task.taskCtx; - + memcpy(ctx->dbFName, dbFName, sizeof(ctx->dbFName)); taosArrayPush(pJob->pTasks, &task); @@ -167,7 +167,7 @@ int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, void* param) { taosMemoryFree(task.taskCtx); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - + memcpy(ctx->pName, name, sizeof(*name)); tNameGetFullDbName(ctx->pName, ctx->dbFName); @@ -197,7 +197,7 @@ int32_t ctgInitGetTbHashsTask(SCtgJob *pJob, int32_t taskIdx, void* param) { taosArrayPush(pJob->pTasks, &task); - qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%d, tbNum:%d", + qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%d, tbNum:%d", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), taosArrayGetSize(ctx->pNames), pJob->tbHashNum); return TSDB_CODE_SUCCESS; @@ -248,7 +248,7 @@ int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, void* param) { } SCtgIndexCtx* ctx = task.taskCtx; - + strcpy(ctx->indexFName, name); taosArrayPush(pJob->pTasks, &task); @@ -272,7 +272,7 @@ int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, void* param) { } SCtgUdfCtx* ctx = task.taskCtx; - + strcpy(ctx->udfName, name); taosArrayPush(pJob->pTasks, &task); @@ -296,7 +296,7 @@ int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, void* param) { } SCtgUserCtx* ctx = task.taskCtx; - + memcpy(&ctx->user, user, sizeof(*user)); taosArrayPush(pJob->pTasks, &task); @@ -339,7 +339,7 @@ int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, void* param) { taosMemoryFree(task.taskCtx); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - + memcpy(ctx->pName, name, sizeof(*name)); taosArrayPush(pJob->pTasks, &task); @@ -368,7 +368,7 @@ int32_t ctgInitGetTbCfgTask(SCtgJob *pJob, int32_t taskIdx, void* param) { taosMemoryFree(task.taskCtx); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - + memcpy(ctx->pName, name, sizeof(*name)); taosArrayPush(pJob->pTasks, &task); @@ -387,7 +387,7 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con taosHashCleanup(pTb); CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } - + for (int32_t i = 0; i < pJob->dbVgNum; ++i) { char* dbFName = taosArrayGet(pReq->pDbVgroup, i); taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN); @@ -474,7 +474,7 @@ int32_t ctgInitTask(SCtgJob *pJob, CTG_TASK_TYPE type, void* param, int32_t *tas if (taskId) { *taskId = tid; } - + return TSDB_CODE_SUCCESS; } @@ -510,7 +510,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, const pJob->pCtg = pCtg; pJob->conn = *pConn; pJob->userParam = param; - + pJob->tbMetaNum = tbMetaNum; pJob->tbHashNum = tbHashNum; pJob->qnodeNum = qnodeNum; @@ -844,20 +844,20 @@ int32_t ctgDumpSvrVer(SCtgTask* pTask) { pJob->jobRes.pSvrVer->code = pTask->code; pJob->jobRes.pSvrVer->pRes = pTask->res; - + return TSDB_CODE_SUCCESS; } int32_t ctgCallSubCb(SCtgTask *pTask) { int32_t code = 0; - + CTG_LOCK(CTG_WRITE, &pTask->lock); - + int32_t parentNum = taosArrayGetSize(pTask->pParents); for (int32_t i = 0; i < parentNum; ++i) { SCtgMsgCtx *pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); SCtgTask* pParent = taosArrayGetP(pTask->pParents, i); - + pParent->subRes.code = pTask->code; if (TSDB_CODE_SUCCESS == pTask->code) { code = (*gCtgAsyncFps[pTask->type].cloneFp)(pTask, &pParent->subRes.res); @@ -868,22 +868,22 @@ int32_t ctgCallSubCb(SCtgTask *pTask) { SCtgMsgCtx *pParMsgCtx = CTG_GET_TASK_MSGCTX(pParent, -1); - pParMsgCtx->pBatchs = pMsgCtx->pBatchs; + pParMsgCtx->pBatchs = pMsgCtx->pBatchs; CTG_ERR_JRET(pParent->subRes.fp(pParent)); } - + _return: CTG_UNLOCK(CTG_WRITE, &pTask->lock); - CTG_RET(code); + CTG_RET(code); } int32_t ctgCallUserCb(void* param) { SCtgJob* pJob = (SCtgJob*)param; qDebug("QID:0x%" PRIx64 " ctg start to call user cb with rsp %s", pJob->queryId, tstrerror(pJob->jobResCode)); - + (*pJob->userFp)(&pJob->jobRes, pJob->userParam, pJob->jobResCode); qDebug("QID:0x%" PRIx64 " ctg end to call user cb", pJob->queryId); @@ -922,9 +922,9 @@ _return: //taosSsleep(2); //qDebug("QID:0x%" PRIx64 " ctg after sleep", pJob->queryId); - + taosAsyncExec(ctgCallUserCb, pJob, NULL); - + CTG_RET(code); } @@ -932,7 +932,7 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf int32_t code = 0; SCtgDBCache *dbCache = NULL; SCtgTask* pTask = tReq->pTask; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, tReq->msgIdx); SCtgTbMetaCtx* ctx = (SCtgTbMetaCtx*)pTask->taskCtx; @@ -958,38 +958,38 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf } case TDMT_MND_TABLE_META: { STableMetaOutput* pOut = (STableMetaOutput*)pMsgCtx->out; - + if (CTG_IS_META_NULL(pOut->metaType)) { if (CTG_FLAG_IS_STB(flag)) { char dbFName[TSDB_DB_FNAME_LEN] = {0}; tNameGetFullDbName(pName, dbFName); - + CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache)); if (NULL != dbCache) { SVgroupInfo vgInfo = {0}; CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pName, &vgInfo)); - + ctgDebug("will refresh tbmeta, supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(pName), flag); - *vgId = vgInfo.vgId; + *vgId = vgInfo.vgId; CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, pName, &vgInfo, NULL, tReq)); ctgReleaseVgInfoToCache(pCtg, dbCache); } else { SBuildUseDBInput input = {0}; - + tstrncpy(input.db, dbFName, tListLen(input.db)); input.vgVersion = CTG_DEFAULT_INVALID_VERSION; - + CTG_ERR_JRET(ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, NULL, tReq)); } return TSDB_CODE_SUCCESS; } - + ctgError("no tbmeta got, tbName:%s", tNameGetTableName(pName)); ctgRemoveTbMetaFromCache(pCtg, pName, false); - + CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST); } @@ -998,12 +998,12 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf STableMetaOutput* pLastOut = (STableMetaOutput*)pMsgCtx->out; TSWAP(pLastOut->tbMeta, pOut->tbMeta); } - + break; } case TDMT_VND_TABLE_META: { STableMetaOutput* pOut = (STableMetaOutput*)pMsgCtx->out; - + if (CTG_IS_META_NULL(pOut->metaType)) { ctgError("no tbmeta got, tbNmae:%s", tNameGetTableName(pName)); ctgRemoveTbMetaFromCache(pCtg, pName, false); @@ -1013,12 +1013,12 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf if (CTG_FLAG_IS_STB(flag)) { break; } - + if (CTG_IS_META_TABLE(pOut->metaType) && TSDB_SUPER_TABLE == pOut->tbMeta->tableType) { ctgDebug("will continue to refresh tbmeta since got stb, tbName:%s", tNameGetTableName(pName)); - + taosMemoryFreeClear(pOut->tbMeta); - + CTG_RET(ctgGetTbMetaFromMnode(pCtg, pConn, pName, NULL, tReq)); } else if (CTG_IS_META_BOTH(pOut->metaType)) { int32_t exist = 0; @@ -1029,13 +1029,13 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf stbCtx.flag = flag; stbCtx.pName = &stbName; - taosMemoryFreeClear(pOut->tbMeta); + taosMemoryFreeClear(pOut->tbMeta); CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &stbCtx, &pOut->tbMeta)); if (pOut->tbMeta) { exist = 1; } } - + if (0 == exist) { TSWAP(pMsgCtx->lastOut, pMsgCtx->out); CTG_RET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, pOut->dbFName, pOut->tbName, NULL, tReq)); @@ -1056,7 +1056,7 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf if (CTG_IS_META_BOTH(pOut->metaType)) { memcpy(pOut->tbMeta, &pOut->ctbMeta, sizeof(pOut->ctbMeta)); } - + /* else if (CTG_IS_META_CTABLE(pOut->metaType)) { SName stbName = *pName; @@ -1064,7 +1064,7 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf SCtgTbMetaCtx stbCtx = {0}; stbCtx.flag = flag; stbCtx.pName = &stbName; - + CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &stbCtx, &pOut->tbMeta)); if (NULL == pOut->tbMeta) { ctgDebug("stb no longer exist, stbName:%s", stbName.tname); @@ -1088,7 +1088,7 @@ _return: if (pTask->res || code) { ctgHandleTaskEnd(pTask, code); } - + CTG_RET(code); } @@ -1097,7 +1097,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu int32_t code = 0; SCtgDBCache *dbCache = NULL; SCtgTask* pTask = tReq->pTask; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, tReq->msgIdx); SCtgTbMetasCtx* ctx = (SCtgTbMetasCtx*)pTask->taskCtx; @@ -1125,38 +1125,38 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu } case TDMT_MND_TABLE_META: { STableMetaOutput* pOut = (STableMetaOutput*)pMsgCtx->out; - + if (CTG_IS_META_NULL(pOut->metaType)) { if (CTG_FLAG_IS_STB(flag)) { char dbFName[TSDB_DB_FNAME_LEN] = {0}; tNameGetFullDbName(pName, dbFName); - + CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache)); if (NULL != dbCache) { SVgroupInfo vgInfo = {0}; CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pName, &vgInfo)); - + ctgDebug("will refresh tbmeta, supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(pName), flag); - *vgId = vgInfo.vgId; + *vgId = vgInfo.vgId; CTG_ERR_JRET(ctgGetTbMetaFromVnode(pCtg, pConn, pName, &vgInfo, NULL, tReq)); ctgReleaseVgInfoToCache(pCtg, dbCache); } else { SBuildUseDBInput input = {0}; - + tstrncpy(input.db, dbFName, tListLen(input.db)); input.vgVersion = CTG_DEFAULT_INVALID_VERSION; - + CTG_ERR_JRET(ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, NULL, tReq)); } return TSDB_CODE_SUCCESS; } - + ctgError("no tbmeta got, tbName:%s", tNameGetTableName(pName)); ctgRemoveTbMetaFromCache(pCtg, pName, false); - + CTG_ERR_JRET(CTG_ERR_CODE_TABLE_NOT_EXIST); } @@ -1165,12 +1165,12 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu STableMetaOutput* pLastOut = (STableMetaOutput*)pMsgCtx->out; TSWAP(pLastOut->tbMeta, pOut->tbMeta); } - + break; } case TDMT_VND_TABLE_META: { STableMetaOutput* pOut = (STableMetaOutput*)pMsgCtx->out; - + if (CTG_IS_META_NULL(pOut->metaType)) { ctgError("no tbmeta got, tbNmae:%s", tNameGetTableName(pName)); ctgRemoveTbMetaFromCache(pCtg, pName, false); @@ -1180,12 +1180,12 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu if (CTG_FLAG_IS_STB(flag)) { break; } - + if (CTG_IS_META_TABLE(pOut->metaType) && TSDB_SUPER_TABLE == pOut->tbMeta->tableType) { ctgDebug("will continue to refresh tbmeta since got stb, tbName:%s", tNameGetTableName(pName)); - + taosMemoryFreeClear(pOut->tbMeta); - + CTG_RET(ctgGetTbMetaFromMnode(pCtg, pConn, pName, NULL, tReq)); } else if (CTG_IS_META_BOTH(pOut->metaType)) { int32_t exist = 0; @@ -1196,14 +1196,14 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu stbCtx.flag = flag; stbCtx.pName = &stbName; - taosMemoryFreeClear(pOut->tbMeta); + taosMemoryFreeClear(pOut->tbMeta); CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &stbCtx, &pOut->tbMeta)); if (pOut->tbMeta) { ctgDebug("use cached stb meta, tbName:%s", tNameGetTableName(pName)); exist = 1; } } - + if (0 == exist) { TSWAP(pMsgCtx->lastOut, pMsgCtx->out); CTG_RET(ctgGetTbMetaFromMnodeImpl(pCtg, pConn, pOut->dbFName, pOut->tbName, NULL, tReq)); @@ -1224,7 +1224,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu if (CTG_IS_META_BOTH(pOut->metaType)) { memcpy(pOut->tbMeta, &pOut->ctbMeta, sizeof(pOut->ctbMeta)); } - + /* else if (CTG_IS_META_CTABLE(pOut->metaType)) { SName stbName = *pName; @@ -1232,7 +1232,7 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu SCtgTbMetaCtx stbCtx = {0}; stbCtx.flag = flag; stbCtx.pName = &stbName; - + CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &stbCtx, &pOut->tbMeta)); if (NULL == pOut->tbMeta) { ctgDebug("stb no longer exist, stbName:%s", stbName.tname); @@ -1273,7 +1273,7 @@ _return: if (pTask->res && taskDone) { ctgHandleTaskEnd(pTask, code); } - + CTG_RET(code); } @@ -1282,7 +1282,7 @@ int32_t ctgHandleGetDbVgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf * int32_t code = 0; SCtgTask* pTask = tReq->pTask; SCtgDbVgCtx* ctx = (SCtgDbVgCtx*)pTask->taskCtx; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); @@ -1290,7 +1290,7 @@ int32_t ctgHandleGetDbVgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf * case TDMT_MND_USE_DB: { SUseDbOutput* pOut = (SUseDbOutput*)pTask->msgCtx.out; SDBVgInfo* pDb = NULL; - + CTG_ERR_JRET(ctgGenerateVgList(pCtg, pOut->dbVgroup->vgHash, (SArray**)&pTask->res)); CTG_ERR_JRET(cloneDbVgInfo(pOut->dbVgroup, &pDb)); @@ -1316,7 +1316,7 @@ int32_t ctgHandleGetTbHashRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf int32_t code = 0; SCtgTask* pTask = tReq->pTask; SCtgTbHashCtx* ctx = (SCtgTbHashCtx*)pTask->taskCtx; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); @@ -1330,7 +1330,7 @@ int32_t ctgHandleGetTbHashRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf } CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, pOut->dbVgroup, ctx->pName, (SVgroupInfo*)pTask->res)); - + CTG_ERR_JRET(ctgUpdateVgroupEnqueue(pCtg, ctx->dbFName, pOut->dbId, pOut->dbVgroup, false)); pOut->dbVgroup = NULL; @@ -1354,7 +1354,7 @@ int32_t ctgHandleGetTbHashsRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu int32_t code = 0; SCtgTask* pTask = tReq->pTask; SCtgTbHashsCtx* ctx = (SCtgTbHashsCtx*)pTask->taskCtx; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, tReq->msgIdx); SCtgFetch* pFetch = taosArrayGet(ctx->pFetchs, tReq->msgIdx); bool taskDone = false; @@ -1367,7 +1367,7 @@ int32_t ctgHandleGetTbHashsRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu STablesReq* pReq = taosArrayGet(ctx->pNames, pFetch->dbIdx); CTG_ERR_JRET(ctgGetVgInfosFromHashValue(pCtg, tReq, pOut->dbVgroup, ctx, pMsgCtx->target, pReq->pTables, true)); - + CTG_ERR_JRET(ctgUpdateVgroupEnqueue(pCtg, pMsgCtx->target, pOut->dbId, pOut->dbVgroup, false)); pOut->dbVgroup = NULL; @@ -1394,7 +1394,7 @@ _return: pRes->code = code; pRes->pRes = NULL; } - + if (0 == atomic_sub_fetch_32(&ctx->fetchNum, 1)) { TSWAP(pTask->res, ctx->pResList); taskDone = true; @@ -1419,9 +1419,9 @@ int32_t ctgHandleGetTbIndexRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu CTG_ERR_JRET(ctgCloneTableIndex(pOut->pIndex, &pInfo)); pTask->res = pInfo; - SCtgTbIndexCtx* ctx = pTask->taskCtx; + SCtgTbIndexCtx* ctx = pTask->taskCtx; CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pTask->pJob->pCtg, (STableIndex**)&pTask->msgCtx.out, false)); - + _return: if (TSDB_CODE_MND_DB_INDEX_NOT_EXIST == code) { @@ -1438,7 +1438,7 @@ int32_t ctgHandleGetTbCfgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1452,7 +1452,7 @@ int32_t ctgHandleGetDbCfgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1471,7 +1471,7 @@ int32_t ctgHandleGetQnodeRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1485,7 +1485,7 @@ int32_t ctgHandleGetDnodeRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1499,7 +1499,7 @@ int32_t ctgHandleGetIndexRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1513,7 +1513,7 @@ int32_t ctgHandleGetUdfRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf *p CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1525,7 +1525,7 @@ int32_t ctgHandleGetUserRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf * int32_t code = 0; SCtgTask* pTask = tReq->pTask; SCtgUserCtx* ctx = (SCtgUserCtx*)pTask->taskCtx; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; bool pass = false; SGetUserAuthRsp* pOut = (SGetUserAuthRsp*)pTask->msgCtx.out; @@ -1573,7 +1573,7 @@ int32_t ctgHandleGetSvrVerRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target)); TSWAP(pTask->res, pTask->msgCtx.out); - + _return: ctgHandleTaskEnd(pTask, code); @@ -1583,7 +1583,7 @@ _return: int32_t ctgAsyncRefreshTbMeta(SCtgTaskReq *tReq, int32_t flag, SName* pName, int32_t* vgId) { SCtgTask* pTask = tReq->pTask; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; int32_t code = 0; @@ -1603,7 +1603,7 @@ int32_t ctgAsyncRefreshTbMeta(SCtgTaskReq *tReq, int32_t flag, SName* pName, int SCtgDBCache *dbCache = NULL; char dbFName[TSDB_DB_FNAME_LEN] = {0}; tNameGetFullDbName(pName, dbFName); - + CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache)); if (dbCache) { SVgroupInfo vgInfo = {0}; @@ -1632,7 +1632,7 @@ _return: } int32_t ctgLaunchGetTbMetaTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgJob* pJob = pTask->pJob; SCtgMsgCtx *pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); @@ -1649,14 +1649,14 @@ int32_t ctgLaunchGetTbMetaTask(SCtgTask *pTask) { SCtgTbMetaCtx* pCtx = (SCtgTbMetaCtx*)pTask->taskCtx; SCtgTaskReq tReq; tReq.pTask = pTask; - tReq.msgIdx = -1; + tReq.msgIdx = -1; CTG_ERR_RET(ctgAsyncRefreshTbMeta(&tReq, pCtx->flag, pCtx->pName, &pCtx->vgId)); return TSDB_CODE_SUCCESS; } int32_t ctgLaunchGetTbMetasTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgTbMetasCtx* pCtx = (SCtgTbMetasCtx*)pTask->taskCtx; SCtgJob* pJob = pTask->pJob; @@ -1670,18 +1670,18 @@ int32_t ctgLaunchGetTbMetasTask(SCtgTask *pTask) { CTG_ERR_RET(ctgGetTbMetasFromCache(pCtg, pConn, pCtx, i, &fetchIdx, baseResIdx, pReq->pTables)); baseResIdx += taosArrayGetSize(pReq->pTables); } - + pCtx->fetchNum = taosArrayGetSize(pCtx->pFetchs); if (pCtx->fetchNum <= 0) { TSWAP(pTask->res, pCtx->pResList); - + CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0)); return TSDB_CODE_SUCCESS; } - + pTask->msgCtxs = taosArrayInit(pCtx->fetchNum, sizeof(SCtgMsgCtx)); taosArraySetSize(pTask->msgCtxs, pCtx->fetchNum); - + for (int32_t i = 0; i < pCtx->fetchNum; ++i) { SCtgFetch* pFetch = taosArrayGet(pCtx->pFetchs, i); SName* pName = ctgGetFetchName(pCtx->pNames, pFetch); @@ -1689,19 +1689,19 @@ int32_t ctgLaunchGetTbMetasTask(SCtgTask *pTask) { if (NULL == pMsgCtx->pBatchs) { pMsgCtx->pBatchs = pJob->pBatchs; } - + SCtgTaskReq tReq; tReq.pTask = pTask; - tReq.msgIdx = pFetch->fetchIdx; + tReq.msgIdx = pFetch->fetchIdx; CTG_ERR_RET(ctgAsyncRefreshTbMeta(&tReq, pFetch->flag, pName, &pFetch->vgId)); } - + return TSDB_CODE_SUCCESS; } int32_t ctgLaunchGetDbVgTask(SCtgTask *pTask) { int32_t code = 0; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgDBCache *dbCache = NULL; SCtgDbVgCtx* pCtx = (SCtgDbVgCtx*)pTask->taskCtx; @@ -1710,18 +1710,18 @@ int32_t ctgLaunchGetDbVgTask(SCtgTask *pTask) { if (NULL == pMsgCtx->pBatchs) { pMsgCtx->pBatchs = pJob->pBatchs; } - + CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, pCtx->dbFName, &dbCache)); if (NULL != dbCache) { CTG_ERR_JRET(ctgGenerateVgList(pCtg, dbCache->vgCache.vgInfo->vgHash, (SArray**)&pTask->res)); ctgReleaseVgInfoToCache(pCtg, dbCache); dbCache = NULL; - + CTG_ERR_JRET(ctgHandleTaskEnd(pTask, 0)); } else { SBuildUseDBInput input = {0}; - + tstrncpy(input.db, pCtx->dbFName, tListLen(input.db)); input.vgVersion = CTG_DEFAULT_INVALID_VERSION; @@ -1742,7 +1742,7 @@ _return: int32_t ctgLaunchGetTbHashTask(SCtgTask *pTask) { int32_t code = 0; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgDBCache *dbCache = NULL; SCtgTbHashCtx* pCtx = (SCtgTbHashCtx*)pTask->taskCtx; @@ -1751,7 +1751,7 @@ int32_t ctgLaunchGetTbHashTask(SCtgTask *pTask) { if (NULL == pMsgCtx->pBatchs) { pMsgCtx->pBatchs = pJob->pBatchs; } - + CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, pCtx->dbFName, &dbCache)); if (NULL != dbCache) { pTask->res = taosMemoryMalloc(sizeof(SVgroupInfo)); @@ -1762,17 +1762,17 @@ int32_t ctgLaunchGetTbHashTask(SCtgTask *pTask) { ctgReleaseVgInfoToCache(pCtg, dbCache); dbCache = NULL; - + CTG_ERR_JRET(ctgHandleTaskEnd(pTask, 0)); } else { SBuildUseDBInput input = {0}; - + tstrncpy(input.db, pCtx->dbFName, tListLen(input.db)); input.vgVersion = CTG_DEFAULT_INVALID_VERSION; SCtgTaskReq tReq; tReq.pTask = pTask; - tReq.msgIdx = -1; + tReq.msgIdx = -1; CTG_ERR_RET(ctgGetDBVgInfoFromMnode(pCtg, pConn, &input, NULL, &tReq)); } @@ -1786,16 +1786,16 @@ _return: } int32_t ctgLaunchGetTbHashsTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgTbHashsCtx* pCtx = (SCtgTbHashsCtx*)pTask->taskCtx; SCtgDBCache *dbCache = NULL; - SCtgJob* pJob = pTask->pJob; + SCtgJob* pJob = pTask->pJob; int32_t dbNum = taosArrayGetSize(pCtx->pNames); int32_t fetchIdx = 0; int32_t baseResIdx = 0; int32_t code = 0; - + for (int32_t i = 0; i < dbNum; ++i) { STablesReq* pReq = taosArrayGet(pCtx->pNames, i); @@ -1804,7 +1804,7 @@ int32_t ctgLaunchGetTbHashsTask(SCtgTask *pTask) { if (NULL != dbCache) { SCtgTaskReq tReq; tReq.pTask = pTask; - tReq.msgIdx = -1; + tReq.msgIdx = -1; CTG_ERR_JRET(ctgGetVgInfosFromHashValue(pCtg, &tReq, dbCache->vgCache.vgInfo, pCtx, pReq->dbFName, pReq->pTables, false)); ctgReleaseVgInfoToCache(pCtg, dbCache); @@ -1815,21 +1815,21 @@ int32_t ctgLaunchGetTbHashsTask(SCtgTask *pTask) { ctgAddFetch(&pCtx->pFetchs, i, -1, &fetchIdx, baseResIdx, 0); baseResIdx += taosArrayGetSize(pReq->pTables); - taosArraySetSize(pCtx->pResList, baseResIdx); + taosArraySetSize(pCtx->pResList, baseResIdx); } } pCtx->fetchNum = taosArrayGetSize(pCtx->pFetchs); if (pCtx->fetchNum <= 0) { TSWAP(pTask->res, pCtx->pResList); - + CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0)); return TSDB_CODE_SUCCESS; } - + pTask->msgCtxs = taosArrayInit(pCtx->fetchNum, sizeof(SCtgMsgCtx)); taosArraySetSize(pTask->msgCtxs, pCtx->fetchNum); - + for (int32_t i = 0; i < pCtx->fetchNum; ++i) { SCtgFetch* pFetch = taosArrayGet(pCtx->pFetchs, i); STablesReq* pReq = taosArrayGet(pCtx->pNames, pFetch->dbIdx); @@ -1837,10 +1837,10 @@ int32_t ctgLaunchGetTbHashsTask(SCtgTask *pTask) { if (NULL == pMsgCtx->pBatchs) { pMsgCtx->pBatchs = pJob->pBatchs; } - + SBuildUseDBInput input = {0}; strcpy(input.db, pReq->dbFName); - + input.vgVersion = CTG_DEFAULT_INVALID_VERSION; SCtgTaskReq tReq; @@ -1854,14 +1854,14 @@ _return: if (dbCache) { ctgReleaseVgInfoToCache(pCtg, dbCache); } - + return code; } int32_t ctgLaunchGetTbIndexTask(SCtgTask *pTask) { int32_t code = 0; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgTbIndexCtx* pCtx = (SCtgTbIndexCtx*)pTask->taskCtx; SArray* pRes = NULL; @@ -1874,18 +1874,18 @@ int32_t ctgLaunchGetTbIndexTask(SCtgTask *pTask) { CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pCtx->pName, &pRes)); if (pRes) { pTask->res = pRes; - + CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0)); return TSDB_CODE_SUCCESS; } - + CTG_ERR_RET(ctgGetTbIndexFromMnode(pCtg, pConn, pCtx->pName, NULL, pTask)); return TSDB_CODE_SUCCESS; } int32_t ctgLaunchGetTbCfgTask(SCtgTask *pTask) { int32_t code = 0; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgTbCfgCtx* pCtx = (SCtgTbCfgCtx*)pTask->taskCtx; SArray* pRes = NULL; @@ -1915,7 +1915,7 @@ int32_t ctgLaunchGetTbCfgTask(SCtgTask *pTask) { return TSDB_CODE_SUCCESS; } } - + CTG_ERR_JRET(ctgGetTableCfgFromVnode(pCtg, pConn, pCtx->pName, pCtx->pVgInfo, NULL, pTask)); } @@ -1926,13 +1926,13 @@ _return: if (CTG_TASK_LAUNCHED == pTask->status) { ctgHandleTaskEnd(pTask, code); } - + CTG_RET(code); } int32_t ctgLaunchGetQnodeTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgJob* pJob = pTask->pJob; SCtgMsgCtx *pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); @@ -1945,7 +1945,7 @@ int32_t ctgLaunchGetQnodeTask(SCtgTask *pTask) { } int32_t ctgLaunchGetDnodeTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgJob* pJob = pTask->pJob; SCtgMsgCtx *pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); @@ -1959,7 +1959,7 @@ int32_t ctgLaunchGetDnodeTask(SCtgTask *pTask) { int32_t ctgLaunchGetDbCfgTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgDbCfgCtx* pCtx = (SCtgDbCfgCtx*)pTask->taskCtx; SCtgJob* pJob = pTask->pJob; @@ -1975,7 +1975,7 @@ int32_t ctgLaunchGetDbCfgTask(SCtgTask *pTask) { int32_t ctgLaunchGetDbInfoTask(SCtgTask *pTask) { int32_t code = 0; - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SCtgDBCache *dbCache = NULL; SCtgDbInfoCtx* pCtx = (SCtgDbInfoCtx*)pTask->taskCtx; SCtgJob* pJob = pTask->pJob; @@ -2014,7 +2014,7 @@ _return: } int32_t ctgLaunchGetIndexTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgIndexCtx* pCtx = (SCtgIndexCtx*)pTask->taskCtx; SCtgJob* pJob = pTask->pJob; @@ -2029,7 +2029,7 @@ int32_t ctgLaunchGetIndexTask(SCtgTask *pTask) { } int32_t ctgLaunchGetUdfTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgUdfCtx* pCtx = (SCtgUdfCtx*)pTask->taskCtx; SCtgJob* pJob = pTask->pJob; @@ -2044,7 +2044,7 @@ int32_t ctgLaunchGetUdfTask(SCtgTask *pTask) { } int32_t ctgLaunchGetUserTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgUserCtx* pCtx = (SCtgUserCtx*)pTask->taskCtx; bool inCache = false; @@ -2054,7 +2054,7 @@ int32_t ctgLaunchGetUserTask(SCtgTask *pTask) { if (NULL == pMsgCtx->pBatchs) { pMsgCtx->pBatchs = pJob->pBatchs; } - + CTG_ERR_RET(ctgChkAuthFromCache(pCtg, pCtx->user.user, pCtx->user.dbFName, pCtx->user.type, &inCache, &pass)); if (inCache) { pTask->res = taosMemoryCalloc(1, sizeof(bool)); @@ -2062,7 +2062,7 @@ int32_t ctgLaunchGetUserTask(SCtgTask *pTask) { CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY); } *(bool*)pTask->res = pass; - + CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0)); return TSDB_CODE_SUCCESS; } @@ -2073,7 +2073,7 @@ int32_t ctgLaunchGetUserTask(SCtgTask *pTask) { } int32_t ctgLaunchGetSvrVerTask(SCtgTask *pTask) { - SCatalog* pCtg = pTask->pJob->pCtg; + SCatalog* pCtg = pTask->pJob->pCtg; SRequestConnInfo* pConn = &pTask->pJob->conn; SCtgJob* pJob = pTask->pJob; SCtgMsgCtx *pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); @@ -2096,7 +2096,7 @@ int32_t ctgRelaunchGetTbMetaTask(SCtgTask *pTask) { int32_t ctgGetTbCfgCb(SCtgTask *pTask) { int32_t code = 0; - + CTG_ERR_JRET(pTask->subRes.code); SCtgTbCfgCtx* pCtx = (SCtgTbCfgCtx*)pTask->taskCtx; @@ -2104,7 +2104,7 @@ int32_t ctgGetTbCfgCb(SCtgTask *pTask) { pCtx->tbType = ((STableMeta*)pTask->subRes.res)->tableType; } else if (CTG_TASK_GET_DB_VGROUP == pTask->subRes.type) { SDBVgInfo* pDb = (SDBVgInfo*)pTask->subRes.res; - + pCtx->pVgInfo = taosMemoryCalloc(1, sizeof(SVgroupInfo)); CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pTask->pJob->pCtg, pDb, pCtx->pName, pCtx->pVgInfo)); } @@ -2167,7 +2167,7 @@ SCtgAsyncFps gCtgAsyncFps[] = { int32_t ctgMakeAsyncRes(SCtgJob *pJob) { int32_t code = 0; int32_t taskNum = taosArrayGetSize(pJob->pTasks); - + for (int32_t i = 0; i < taskNum; ++i) { SCtgTask *pTask = taosArrayGet(pJob->pTasks, i); CTG_ERR_RET((*gCtgAsyncFps[pTask->type].dumpResFp)(pTask)); @@ -2180,16 +2180,16 @@ int32_t ctgSearchExistingTask(SCtgJob *pJob, CTG_TASK_TYPE type, void* param, in bool equal = false; SCtgTask* pTask = NULL; int32_t code = 0; - + CTG_LOCK(CTG_READ, &pJob->taskLock); - + int32_t taskNum = taosArrayGetSize(pJob->pTasks); for (int32_t i = 0; i < taskNum; ++i) { pTask = taosArrayGet(pJob->pTasks, i); if (type != pTask->type) { continue; } - + CTG_ERR_JRET((*gCtgAsyncFps[type].compFp)(pTask, param, &equal)); if (equal) { break; @@ -2208,7 +2208,7 @@ _return: int32_t ctgSetSubTaskCb(SCtgTask *pSub, SCtgTask *pTask) { int32_t code = 0; - + CTG_LOCK(CTG_WRITE, &pSub->lock); if (CTG_TASK_DONE == pSub->status) { pTask->subRes.code = pSub->code; @@ -2216,7 +2216,7 @@ int32_t ctgSetSubTaskCb(SCtgTask *pSub, SCtgTask *pTask) { SCtgMsgCtx *pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1); SCtgMsgCtx *pSubMsgCtx = CTG_GET_TASK_MSGCTX(pSub, -1); pMsgCtx->pBatchs = pSubMsgCtx->pBatchs; - + CTG_ERR_JRET(pTask->subRes.fp(pTask)); } else { if (NULL == pSub->pParents) { @@ -2230,7 +2230,7 @@ _return: CTG_UNLOCK(CTG_WRITE, &pSub->lock); - CTG_RET(code); + CTG_RET(code); } @@ -2242,13 +2242,13 @@ int32_t ctgLaunchSubTask(SCtgTask *pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, ctgClearSubTaskRes(&pTask->subRes); pTask->subRes.type = type; pTask->subRes.fp = fp; - + CTG_ERR_RET(ctgSearchExistingTask(pJob, type, param, &subTaskId)); if (subTaskId < 0) { CTG_ERR_RET(ctgInitTask(pJob, type, param, &subTaskId)); newTask = true; } - + SCtgTask* pSub = taosArrayGet(pJob->pTasks, subTaskId); CTG_ERR_RET(ctgSetSubTaskCb(pSub, pTask)); @@ -2267,21 +2267,21 @@ int32_t ctgLaunchSubTask(SCtgTask *pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, int32_t ctgLaunchJob(SCtgJob *pJob) { int32_t taskNum = taosArrayGetSize(pJob->pTasks); - + for (int32_t i = 0; i < taskNum; ++i) { SCtgTask *pTask = taosArrayGet(pJob->pTasks, i); qDebug("QID:0x%" PRIx64 " ctg launch [%dth] task", pJob->queryId, pTask->taskId); CTG_ERR_RET((*gCtgAsyncFps[pTask->type].launchFp)(pTask)); - + pTask->status = CTG_TASK_LAUNCHED; } if (taskNum <= 0) { qDebug("QID:0x%" PRIx64 " ctg call user callback with rsp %s", pJob->queryId, tstrerror(pJob->jobResCode)); - + taosAsyncExec(ctgCallUserCb, pJob, NULL); -#if CTG_BATCH_FETCH +#if CTG_BATCH_FETCH } else { ctgLaunchBatchs(pJob->pCtg, pJob, pJob->pBatchs); #endif From 63792daeebd604b713463fbda12eb3bd2d4a680c Mon Sep 17 00:00:00 2001 From: Xiaoyu Wang Date: Thu, 25 Aug 2022 17:18:11 +0800 Subject: [PATCH 10/47] fix: user permission error with sysinfo 0 --- source/common/src/systable.c | 2 +- source/dnode/mnode/impl/src/mndSma.c | 4 ++-- source/libs/parser/test/parInitialCTest.cpp | 24 ++++++-------------- source/libs/planner/test/planOtherTest.cpp | 4 ++-- tests/script/tsim/user/privilege_sysinfo.sim | 11 ++++----- 5 files changed, 17 insertions(+), 28 deletions(-) diff --git a/source/common/src/systable.c b/source/common/src/systable.c index 0465f1f3f4..9ca896c9ee 100644 --- a/source/common/src/systable.c +++ b/source/common/src/systable.c @@ -350,7 +350,7 @@ static const SSysTableMeta perfsMeta[] = { {TSDB_PERFS_TABLE_SUBSCRIPTIONS, subscriptionSchema, tListLen(subscriptionSchema), false}, // {TSDB_PERFS_TABLE_OFFSETS, offsetSchema, tListLen(offsetSchema)}, {TSDB_PERFS_TABLE_TRANS, transSchema, tListLen(transSchema), false}, - {TSDB_PERFS_TABLE_SMAS, smaSchema, tListLen(smaSchema), false}, + // {TSDB_PERFS_TABLE_SMAS, smaSchema, tListLen(smaSchema), false}, {TSDB_PERFS_TABLE_STREAMS, streamSchema, tListLen(streamSchema), false}, {TSDB_PERFS_TABLE_APPS, appSchema, tListLen(appSchema), false}}; // clang-format on diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index e66dabc16d..2fb934aaad 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -65,8 +65,8 @@ int32_t mndInitSma(SMnode *pMnode) { mndSetMsgHandle(pMnode, TDMT_MND_GET_INDEX, mndProcessGetSmaReq); mndSetMsgHandle(pMnode, TDMT_MND_GET_TABLE_INDEX, mndProcessGetTbSmaReq); - mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_SMAS, mndRetrieveSma); - mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_SMAS, mndCancelGetNextSma); + mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_INDEX, mndRetrieveSma); + mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_INDEX, mndCancelGetNextSma); return sdbSetTable(pMnode->pSdb, table); } diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp index 9bca6cae0a..68c4ac3706 100644 --- a/source/libs/parser/test/parInitialCTest.cpp +++ b/source/libs/parser/test/parInitialCTest.cpp @@ -568,15 +568,13 @@ TEST_F(ParserInitialCTest, createStream) { memset(&expect, 0, sizeof(SCMCreateStreamReq)); }; - auto setCreateStreamReqFunc = [&](const char* pStream, const char* pSrcDb, const char* pSql, - const char* pDstStb = nullptr, int8_t igExists = 0, - int8_t triggerType = STREAM_TRIGGER_AT_ONCE, int64_t maxDelay = 0, - int64_t watermark = 0, int8_t igExpired = STREAM_DEFAULT_IGNORE_EXPIRED) { + auto setCreateStreamReqFunc = [&](const char* pStream, const char* pSrcDb, const char* pSql, const char* pDstStb, + int8_t igExists = 0, int8_t triggerType = STREAM_TRIGGER_AT_ONCE, + int64_t maxDelay = 0, int64_t watermark = 0, + int8_t igExpired = STREAM_DEFAULT_IGNORE_EXPIRED) { snprintf(expect.name, sizeof(expect.name), "0.%s", pStream); snprintf(expect.sourceDB, sizeof(expect.sourceDB), "0.%s", pSrcDb); - if (NULL != pDstStb) { - snprintf(expect.targetStbFullName, sizeof(expect.targetStbFullName), "0.test.%s", pDstStb); - } + snprintf(expect.targetStbFullName, sizeof(expect.targetStbFullName), "0.test.%s", pDstStb); expect.igExists = igExists; expect.sql = strdup(pSql); expect.triggerType = triggerType; @@ -603,15 +601,6 @@ TEST_F(ParserInitialCTest, createStream) { tFreeSCMCreateStreamReq(&req); }); - setCreateStreamReqFunc("s1", "test", "create stream s1 as select count(*) from t1 interval(10s)"); - run("CREATE STREAM s1 AS SELECT COUNT(*) FROM t1 INTERVAL(10S)"); - clearCreateStreamReq(); - - setCreateStreamReqFunc("s1", "test", "create stream if not exists s1 as select count(*) from t1 interval(10s)", - nullptr, 1); - run("CREATE STREAM IF NOT EXISTS s1 AS SELECT COUNT(*) FROM t1 INTERVAL(10S)"); - clearCreateStreamReq(); - setCreateStreamReqFunc("s1", "test", "create stream s1 into st1 as select count(*) from t1 interval(10s)", "st1"); run("CREATE STREAM s1 INTO st1 AS SELECT COUNT(*) FROM t1 INTERVAL(10S)"); clearCreateStreamReq(); @@ -629,7 +618,8 @@ TEST_F(ParserInitialCTest, createStream) { TEST_F(ParserInitialCTest, createStreamSemanticCheck) { useDb("root", "test"); - run("CREATE STREAM s1 AS SELECT PERCENTILE(c1, 30) FROM t1 INTERVAL(10S)", TSDB_CODE_PAR_STREAM_NOT_ALLOWED_FUNC); + run("CREATE STREAM s1 INTO st1 AS SELECT PERCENTILE(c1, 30) FROM t1 INTERVAL(10S)", + TSDB_CODE_PAR_STREAM_NOT_ALLOWED_FUNC); } TEST_F(ParserInitialCTest, createTable) { diff --git a/source/libs/planner/test/planOtherTest.cpp b/source/libs/planner/test/planOtherTest.cpp index 7107f8b3c9..350ccd0d92 100644 --- a/source/libs/planner/test/planOtherTest.cpp +++ b/source/libs/planner/test/planOtherTest.cpp @@ -37,9 +37,9 @@ TEST_F(PlanOtherTest, createStream) { TEST_F(PlanOtherTest, createStreamUseSTable) { useDb("root", "test"); - run("CREATE STREAM IF NOT EXISTS s1 as SELECT COUNT(*) FROM st1 INTERVAL(10s)"); + run("CREATE STREAM IF NOT EXISTS s1 into st1 as SELECT COUNT(*) FROM st1 INTERVAL(10s)"); - run("CREATE STREAM IF NOT EXISTS s1 as SELECT COUNT(*) FROM st1 PARTITION BY TBNAME INTERVAL(10s)"); + run("CREATE STREAM IF NOT EXISTS s1 into st1 as SELECT COUNT(*) FROM st1 PARTITION BY TBNAME INTERVAL(10s)"); } TEST_F(PlanOtherTest, createSmaIndex) { diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim index 3008599427..e8348d92d4 100644 --- a/tests/script/tsim/user/privilege_sysinfo.sim +++ b/tests/script/tsim/user/privilege_sysinfo.sim @@ -133,8 +133,8 @@ sql_error show grants sql show queries sql show connections sql show apps -sql_error show transactions -#sql_error show create database d2 +sql show transactions +sql_error show create database d2 sql show create table d2.stb2; sql show create table d2.ctb2; sql show create table d2.ntb2; @@ -175,9 +175,8 @@ sql select * from performance_schema.perf_queries sql select * from performance_schema.perf_topics sql select * from performance_schema.perf_consumers sql select * from performance_schema.perf_subscriptions -#sql_error select * from performance_schema.perf_trans -#sql_error select * from performance_schema.perf_smas -#sql_error select * from information_schema.perf_streams -#sql_error select * from information_schema.perf_apps +sql select * from performance_schema.perf_trans +sql select * from performance_schema.perf_streams +sql select * from performance_schema.perf_apps #system sh/exec.sh -n dnode1 -s stop -x SIGINT From 755176d28fa233c9f802d6c541d96177fd907abd Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 17:32:27 +0800 Subject: [PATCH 11/47] fix(query): add the null ptr check. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 2 +- source/libs/executor/src/executorimpl.c | 6 +++--- source/libs/executor/src/groupoperator.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index ff0df3a7e2..708f03a3a9 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -2367,7 +2367,7 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) { SUidOrderCheckInfo *pOrderedCheckInfo = &pStatus->uidCheckInfo; int32_t code = initOrderCheckInfo(pOrderedCheckInfo, pStatus); - if (code != TSDB_CODE_SUCCESS) { + if (code != TSDB_CODE_SUCCESS || (taosHashGetSize(pStatus->pTableMap) == 0)) { return code; } diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 18773377d9..6f4c84f9c0 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -600,7 +600,7 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc if (pExpr[k].pExpr->nodeType == QUERY_NODE_COLUMN) { // it is a project query SColumnInfoData* pColInfoData = taosArrayGet(pResult->pDataBlock, outputSlotId); if (pResult->info.rows > 0 && !createNewColModel) { - colDataMergeCol(pColInfoData, pResult->info.rows, &pResult->info.capacity, pInputData->pData[0], + colDataMergeCol(pColInfoData, pResult->info.rows, (int32_t*)&pResult->info.capacity, pInputData->pData[0], pInputData->numOfRows); } else { colDataAssign(pColInfoData, pInputData->pData[0], pInputData->numOfRows, &pResult->info); @@ -638,7 +638,7 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc int32_t startOffset = createNewColModel ? 0 : pResult->info.rows; ASSERT(pResult->info.capacity > 0); - colDataMergeCol(pResColData, startOffset, &pResult->info.capacity, &idata, dest.numOfRows); + colDataMergeCol(pResColData, startOffset, (int32_t*)&pResult->info.capacity, &idata, dest.numOfRows); colDataDestroy(&idata); numOfRows = dest.numOfRows; @@ -703,7 +703,7 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc int32_t startOffset = createNewColModel ? 0 : pResult->info.rows; ASSERT(pResult->info.capacity > 0); - colDataMergeCol(pResColData, startOffset, &pResult->info.capacity, &idata, dest.numOfRows); + colDataMergeCol(pResColData, startOffset, (int32_t*)&pResult->info.capacity, &idata, dest.numOfRows); colDataDestroy(&idata); numOfRows = dest.numOfRows; diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 53709c7dcc..9d7e833b19 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -702,8 +702,8 @@ static SSDataBlock* hashPartition(SOperatorInfo* pOperator) { } SArray* groupArray = taosArrayInit(taosHashGetSize(pInfo->pGroupSet), sizeof(SDataGroupInfo)); - void* pGroupIter = NULL; - pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL); + + void* pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL); while (pGroupIter != NULL) { SDataGroupInfo* pGroupInfo = pGroupIter; taosArrayPush(groupArray, pGroupInfo); From 5b6966116d4cd1bf862d103b0b5537968ac42a46 Mon Sep 17 00:00:00 2001 From: wade zhang <95411902+gccgdb1234@users.noreply.github.com> Date: Thu, 25 Aug 2022 17:57:02 +0800 Subject: [PATCH 12/47] Update 08-cache.md --- docs/zh/07-develop/08-cache.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/zh/07-develop/08-cache.md b/docs/zh/07-develop/08-cache.md index bd9da6062d..29e28e3dde 100644 --- a/docs/zh/07-develop/08-cache.md +++ b/docs/zh/07-develop/08-cache.md @@ -20,11 +20,11 @@ create database db0 vgroups 100 buffer 16MB ## 读缓存 -在创建数据库时可以选择是否缓存该数据库中每个子表的最新数据。由参数 cachelast 设置,分为三种情况: -- 0: 不缓存 -- 1: 缓存子表最近一行数据,这将显著改善 last_row 函数的性能 -- 2: 缓存子表每一列最近的非 NULL 值,这将显著改善无特殊影响(比如 WHERE, ORDER BY, GROUP BY, INTERVAL)时的 last 函数的性能 -- 3: 同时缓存行和列,即等同于上述 cachelast 值为 1 或 2 时的行为同时生效 +在创建数据库时可以选择是否缓存该数据库中每个子表的最新数据。由参数 cachemodel 设置,分为四种情况: +- none: 不缓存 +- last_row: 缓存子表最近一行数据,这将显著改善 last_row 函数的性能 +- last_value: 缓存子表每一列最近的非 NULL 值,这将显著改善无特殊影响(比如 WHERE, ORDER BY, GROUP BY, INTERVAL)时的 last 函数的性能 +- both: 同时缓存最近的行和列,即等同于上述 cachemodel 值为 last_row 和 last_value 的行为同时生效 ## 元数据缓存 From 54b87c54e770d97c21ce27b1c88156de3ee894aa Mon Sep 17 00:00:00 2001 From: wade zhang <95411902+gccgdb1234@users.noreply.github.com> Date: Thu, 25 Aug 2022 17:58:13 +0800 Subject: [PATCH 13/47] Update 08-cache.md --- docs/en/07-develop/08-cache.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/en/07-develop/08-cache.md b/docs/en/07-develop/08-cache.md index 4892c21c9d..82a4787016 100644 --- a/docs/en/07-develop/08-cache.md +++ b/docs/en/07-develop/08-cache.md @@ -20,11 +20,11 @@ In theory, larger cache sizes are always better. However, at a certain point, it ## Read Cache -When you create a database, you can configure whether the latest data from every subtable is cached. To do so, set the *cachelast* parameter as follows: -- 0: Caching is disabled. -- 1: The latest row of data in each subtable is cached. This option significantly improves the performance of the `LAST_ROW` function -- 2: The latest non-null value in each column of each subtable is cached. This option significantly improves the performance of the `LAST` function in normal situations, such as WHERE, ORDER BY, GROUP BY, and INTERVAL statements. -- 3: Rows and columns are both cached. This option is equivalent to simultaneously enabling options 1 and 2. +When you create a database, you can configure whether the latest data from every subtable is cached. To do so, set the *cachemodel* parameter as follows: +- none: Caching is disabled. +- last_row: The latest row of data in each subtable is cached. This option significantly improves the performance of the `LAST_ROW` function +- last_value: The latest non-null value in each column of each subtable is cached. This option significantly improves the performance of the `LAST` function in normal situations, such as WHERE, ORDER BY, GROUP BY, and INTERVAL statements. +- both: Rows and columns are both cached. This option is equivalent to simultaneously enabling option last_row and last_value. ## Metadata Cache From e05169ccc6caafb0af5f5bad8cd553d507d98d04 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Thu, 25 Aug 2022 17:31:40 +0800 Subject: [PATCH 14/47] fix: free ofp large value's memory --- source/libs/tdb/src/db/tdbBtree.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 2ab5fd2e9c..4701318779 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -782,6 +782,11 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx pBt); tdbPageInsertCell(pParent, sIdx++, pNewCell, szNewCell, 0); tdbOsFree(pNewCell); + + if (TDB_CELLDECODER_FREE_VAL(&cd)) { + tdbFree(cd.pVal); + cd.pVal = NULL; + } } // move to next new page From 96f21afe8f906746788efbbfef76c3301657fc2e Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 18:27:59 +0800 Subject: [PATCH 15/47] fix(query): update the string order policy. --- source/util/src/tcompare.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index fe3065b2b7..01cdee9829 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -186,15 +186,12 @@ int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) { int32_t len1 = varDataLen(pLeft); int32_t len2 = varDataLen(pRight); - if (len1 != len2) { + int32_t minLen = MIN(len1, len2); + int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), minLen); + if (ret == 0) { return len1 > len2 ? 1 : -1; } else { - int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), len1); - if (ret == 0) { - return 0; - } else { - return ret > 0 ? 1 : -1; - } + return ret > 0 ? 1 : -1; } } From 70ea1235df5b697d902faeb480448c50c3197b19 Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Thu, 25 Aug 2022 18:33:33 +0800 Subject: [PATCH 16/47] os: fix Mac Semaphore error --- cmake/cmake.define | 2 - cmake/cmake.install | 16 + cmake/cmake.options | 6 + include/os/osSemaphore.h | 149 +++-- source/os/src/osSemaphore.c | 1209 +++++++++++++++-------------------- 5 files changed, 627 insertions(+), 755 deletions(-) diff --git a/cmake/cmake.define b/cmake/cmake.define index 376a55d396..5d64815a9a 100644 --- a/cmake/cmake.define +++ b/cmake/cmake.define @@ -2,8 +2,6 @@ cmake_minimum_required(VERSION 3.0) set(CMAKE_VERBOSE_MAKEFILE OFF) -SET(BUILD_SHARED_LIBS "OFF") - #set output directory SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/lib) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin) diff --git a/cmake/cmake.install b/cmake/cmake.install index 6dc6864975..fd1e080dda 100644 --- a/cmake/cmake.install +++ b/cmake/cmake.install @@ -1,3 +1,19 @@ +SET(PREPARE_ENV_CMD "prepare_env_cmd") +SET(PREPARE_ENV_TARGET "prepare_env_target") +ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD} + POST_BUILD + COMMAND echo "make test directory" + DEPENDS taosd + COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/cfg/ + COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/log/ + COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/data/ + COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg + COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg + COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg + COMMAND ${CMAKE_COMMAND} -E echo monitor 0 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg + COMMENT "prepare taosd environment") +ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD}) + IF (TD_LINUX) SET(TD_MAKE_INSTALL_SH "${TD_SOURCE_DIR}/packaging/tools/make_install.sh") INSTALL(CODE "MESSAGE(\"make install script: ${TD_MAKE_INSTALL_SH}\")") diff --git a/cmake/cmake.options b/cmake/cmake.options index bec64f7bf0..3baccde4d7 100644 --- a/cmake/cmake.options +++ b/cmake/cmake.options @@ -90,6 +90,12 @@ ELSE () ENDIF () ENDIF () +option( + BUILD_SHARED_LIBS + "" + OFF + ) + option( RUST_BINDINGS "If build with rust-bindings" diff --git a/include/os/osSemaphore.h b/include/os/osSemaphore.h index 7fca20d75e..2a3a2e64b6 100644 --- a/include/os/osSemaphore.h +++ b/include/os/osSemaphore.h @@ -1,75 +1,74 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * This program is free software: you can use, redistribute, and/or modify - * it under the terms of the GNU Affero General Public License, version 3 - * or later ("AGPL"), as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -#ifndef _TD_OS_SEMPHONE_H_ -#define _TD_OS_SEMPHONE_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#if defined(_TD_DARWIN_64) - -// typedef struct tsem_s *tsem_t; -typedef struct bosal_sem_t *tsem_t; - - -int tsem_init(tsem_t *sem, int pshared, unsigned int value); -int tsem_wait(tsem_t *sem); -int tsem_timewait(tsem_t *sim, int64_t nanosecs); -int tsem_post(tsem_t *sem); -int tsem_destroy(tsem_t *sem); - -#else - -#define tsem_t sem_t -#define tsem_init sem_init -int tsem_wait(tsem_t *sem); -int tsem_timewait(tsem_t *sim, int64_t nanosecs); -#define tsem_post sem_post -#define tsem_destroy sem_destroy - -#endif - -#if defined(_TD_DARWIN_64) -// #define TdThreadRwlock TdThreadMutex -// #define taosThreadRwlockInit(lock, NULL) taosThreadMutexInit(lock, NULL) -// #define taosThreadRwlockDestroy(lock) taosThreadMutexDestroy(lock) -// #define taosThreadRwlockWrlock(lock) taosThreadMutexLock(lock) -// #define taosThreadRwlockRdlock(lock) taosThreadMutexLock(lock) -// #define taosThreadRwlockUnlock(lock) taosThreadMutexUnlock(lock) - -// #define TdThreadSpinlock TdThreadMutex -// #define taosThreadSpinInit(lock, NULL) taosThreadMutexInit(lock, NULL) -// #define taosThreadSpinDestroy(lock) taosThreadMutexDestroy(lock) -// #define taosThreadSpinLock(lock) taosThreadMutexLock(lock) -// #define taosThreadSpinUnlock(lock) taosThreadMutexUnlock(lock) -#endif - -bool taosCheckPthreadValid(TdThread thread); -int64_t taosGetSelfPthreadId(); -int64_t taosGetPthreadId(TdThread thread); -void taosResetPthread(TdThread *thread); -bool taosComparePthread(TdThread first, TdThread second); -int32_t taosGetPId(); -int32_t taosGetAppName(char *name, int32_t *len); - -#ifdef __cplusplus -} -#endif - -#endif /*_TD_OS_SEMPHONE_H_*/ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef _TD_OS_SEMPHONE_H_ +#define _TD_OS_SEMPHONE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if defined(_TD_DARWIN_64) +#include +// typedef struct tsem_s *tsem_t; +typedef dispatch_semaphore_t tsem_t; + +int tsem_init(tsem_t *sem, int pshared, unsigned int value); +int tsem_wait(tsem_t *sem); +int tsem_timewait(tsem_t *sim, int64_t nanosecs); +int tsem_post(tsem_t *sem); +int tsem_destroy(tsem_t *sem); + +#else + +#define tsem_t sem_t +#define tsem_init sem_init +int tsem_wait(tsem_t *sem); +int tsem_timewait(tsem_t *sim, int64_t nanosecs); +#define tsem_post sem_post +#define tsem_destroy sem_destroy + +#endif + +#if defined(_TD_DARWIN_64) +// #define TdThreadRwlock TdThreadMutex +// #define taosThreadRwlockInit(lock, NULL) taosThreadMutexInit(lock, NULL) +// #define taosThreadRwlockDestroy(lock) taosThreadMutexDestroy(lock) +// #define taosThreadRwlockWrlock(lock) taosThreadMutexLock(lock) +// #define taosThreadRwlockRdlock(lock) taosThreadMutexLock(lock) +// #define taosThreadRwlockUnlock(lock) taosThreadMutexUnlock(lock) + +// #define TdThreadSpinlock TdThreadMutex +// #define taosThreadSpinInit(lock, NULL) taosThreadMutexInit(lock, NULL) +// #define taosThreadSpinDestroy(lock) taosThreadMutexDestroy(lock) +// #define taosThreadSpinLock(lock) taosThreadMutexLock(lock) +// #define taosThreadSpinUnlock(lock) taosThreadMutexUnlock(lock) +#endif + +bool taosCheckPthreadValid(TdThread thread); +int64_t taosGetSelfPthreadId(); +int64_t taosGetPthreadId(TdThread thread); +void taosResetPthread(TdThread *thread); +bool taosComparePthread(TdThread first, TdThread second); +int32_t taosGetPId(); +int32_t taosGetAppName(char *name, int32_t *len); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_OS_SEMPHONE_H_*/ diff --git a/source/os/src/osSemaphore.c b/source/os/src/osSemaphore.c index a7d2ba8531..a95503b5e5 100644 --- a/source/os/src/osSemaphore.c +++ b/source/os/src/osSemaphore.c @@ -1,678 +1,531 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * This program is free software: you can use, redistribute, and/or modify - * it under the terms of the GNU Affero General Public License, version 3 - * or later ("AGPL"), as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -#define ALLOW_FORBID_FUNC -#define _DEFAULT_SOURCE -#include "os.h" -#include "pthread.h" -#include "tdef.h" - -#ifdef WINDOWS - -/* - * windows implementation - */ - -#include - -bool taosCheckPthreadValid(TdThread thread) { return thread.p != NULL; } - -void taosResetPthread(TdThread* thread) { thread->p = 0; } - -int64_t taosGetPthreadId(TdThread thread) { -#ifdef PTW32_VERSION - return pthread_getw32threadid_np(thread); -#else - return (int64_t)thread; -#endif -} - -int64_t taosGetSelfPthreadId() { return GetCurrentThreadId(); } - -bool taosComparePthread(TdThread first, TdThread second) { return first.p == second.p; } - -int32_t taosGetPId() { return GetCurrentProcessId(); } - -int32_t taosGetAppName(char* name, int32_t* len) { - char filepath[1024] = {0}; - - GetModuleFileName(NULL, filepath, MAX_PATH); - char* sub = strrchr(filepath, '.'); - if (sub != NULL) { - *sub = '\0'; - } - char* end = strrchr(filepath, TD_DIRSEP[0]); - if (end == NULL) { - end = filepath; - } - - tstrncpy(name, end, TSDB_APP_NAME_LEN); - - if (len != NULL) { - *len = (int32_t)strlen(end); - } - - return 0; -} - -int32_t tsem_wait(tsem_t* sem) { - int ret = 0; - do { - ret = sem_wait(sem); - } while (ret != 0 && errno == EINTR); - return ret; -} - -int32_t tsem_timewait(tsem_t* sem, int64_t nanosecs) { - struct timespec ts, rel; - FILETIME ft_before, ft_after; - int rc; - - rel.tv_sec = 0; - rel.tv_nsec = nanosecs; - - GetSystemTimeAsFileTime(&ft_before); - // errno = 0; - rc = sem_timedwait(sem, pthread_win32_getabstime_np(&ts, &rel)); - - /* This should have timed out */ - // assert(errno == ETIMEDOUT); - // assert(rc != 0); - // GetSystemTimeAsFileTime(&ft_after); - // // We specified a non-zero wait. Time must advance. - // if (ft_before.dwLowDateTime == ft_after.dwLowDateTime && ft_before.dwHighDateTime == ft_after.dwHighDateTime) - // { - // printf("nanoseconds: %d, rc: %d, code:0x%x. before filetime: %d, %d; after filetime: %d, %d\n", - // nanosecs, rc, errno, - // (int)ft_before.dwLowDateTime, (int)ft_before.dwHighDateTime, - // (int)ft_after.dwLowDateTime, (int)ft_after.dwHighDateTime); - // printf("time must advance during sem_timedwait."); - // return 1; - // } - return rc; -} - -#elif defined(_TD_DARWIN_64) - -/* - * darwin implementation - */ - -#include - -// #define SEM_USE_PTHREAD -// #define SEM_USE_POSIX -// #define SEM_USE_SEM - -// #ifdef SEM_USE_SEM -// #include -// #include -// #include -// #include - -// static TdThread sem_thread; -// static TdThreadOnce sem_once; -// static task_t sem_port; -// static volatile int sem_inited = 0; -// static semaphore_t sem_exit; - -// static void *sem_thread_routine(void *arg) { -// (void)arg; -// setThreadName("sem_thrd"); - -// sem_port = mach_task_self(); -// kern_return_t ret = semaphore_create(sem_port, &sem_exit, SYNC_POLICY_FIFO, 0); -// if (ret != KERN_SUCCESS) { -// fprintf(stderr, "==%s[%d]%s()==failed to create sem_exit\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__); -// sem_inited = -1; -// return NULL; -// } -// sem_inited = 1; -// semaphore_wait(sem_exit); -// return NULL; -// } - -// static void once_init(void) { -// int r = 0; -// r = taosThreadCreate(&sem_thread, NULL, sem_thread_routine, NULL); -// if (r) { -// fprintf(stderr, "==%s[%d]%s()==failed to create thread\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__); -// return; -// } -// while (sem_inited == 0) { -// ; -// } -// } -// #endif - -// struct tsem_s { -// #ifdef SEM_USE_PTHREAD -// TdThreadMutex lock; -// TdThreadCond cond; -// volatile int64_t val; -// #elif defined(SEM_USE_POSIX) -// size_t id; -// sem_t *sem; -// #elif defined(SEM_USE_SEM) -// semaphore_t sem; -// #else // SEM_USE_PTHREAD -// dispatch_semaphore_t sem; -// #endif // SEM_USE_PTHREAD - -// volatile unsigned int valid : 1; -// }; - -// int tsem_init(tsem_t *sem, int pshared, unsigned int value) { -// // fprintf(stderr, "==%s[%d]%s():[%p]==creating\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// if (*sem) { -// fprintf(stderr, "==%s[%d]%s():[%p]==already initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// struct tsem_s *p = (struct tsem_s *)taosMemoryCalloc(1, sizeof(*p)); -// if (!p) { -// fprintf(stderr, "==%s[%d]%s():[%p]==out of memory\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// abort(); -// } - -// #ifdef SEM_USE_PTHREAD -// int r = taosThreadMutexInit(&p->lock, NULL); -// do { -// if (r) break; -// r = taosThreadCondInit(&p->cond, NULL); -// if (r) { -// taosThreadMutexDestroy(&p->lock); -// break; -// } -// p->val = value; -// } while (0); -// if (r) { -// fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// abort(); -// } -// #elif defined(SEM_USE_POSIX) -// static size_t tick = 0; -// do { -// size_t id = atomic_add_fetch_64(&tick, 1); -// if (id == SEM_VALUE_MAX) { -// atomic_store_64(&tick, 0); -// id = 0; -// } -// char name[NAME_MAX - 4]; -// snprintf(name, sizeof(name), "/t" PRId64, id); -// p->sem = sem_open(name, O_CREAT | O_EXCL, pshared, value); -// p->id = id; -// if (p->sem != SEM_FAILED) break; -// int e = errno; -// if (e == EEXIST) continue; -// if (e == EINTR) continue; -// fprintf(stderr, "==%s[%d]%s():[%p]==not created[%d]%s\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem, -// e, strerror(e)); -// abort(); -// } while (p->sem == SEM_FAILED); -// #elif defined(SEM_USE_SEM) -// taosThreadOnce(&sem_once, once_init); -// if (sem_inited != 1) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal resource init failed\n", taosDirEntryBaseName(__FILE__), __LINE__, -// __func__, sem); -// errno = ENOMEM; -// return -1; -// } -// kern_return_t ret = semaphore_create(sem_port, &p->sem, SYNC_POLICY_FIFO, value); -// if (ret != KERN_SUCCESS) { -// fprintf(stderr, "==%s[%d]%s():[%p]==semophore_create failed\n", taosDirEntryBaseName(__FILE__), __LINE__, -// __func__, -// sem); -// // we fail-fast here, because we have less-doc about semaphore_create for the moment -// abort(); -// } -// #else // SEM_USE_PTHREAD -// p->sem = dispatch_semaphore_create(value); -// if (p->sem == NULL) { -// fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// abort(); -// } -// #endif // SEM_USE_PTHREAD - -// p->valid = 1; - -// *sem = p; - -// return 0; -// } - -// int tsem_wait(tsem_t *sem) { -// if (!*sem) { -// fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// abort(); -// } -// struct tsem_s *p = *sem; -// if (!p->valid) { -// fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); abort(); -// } -// #ifdef SEM_USE_PTHREAD -// if (taosThreadMutexLock(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// p->val -= 1; -// if (p->val < 0) { -// if (taosThreadCondWait(&p->cond, &p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, -// __func__, -// sem); -// abort(); -// } -// } -// if (taosThreadMutexUnlock(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// return 0; -// #elif defined(SEM_USE_POSIX) -// return sem_wait(p->sem); -// #elif defined(SEM_USE_SEM) -// return semaphore_wait(p->sem); -// #else // SEM_USE_PTHREAD -// return dispatch_semaphore_wait(p->sem, DISPATCH_TIME_FOREVER); -// #endif // SEM_USE_PTHREAD -// } - -// int tsem_post(tsem_t *sem) { -// if (!*sem) { -// fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// abort(); -// } -// struct tsem_s *p = *sem; -// if (!p->valid) { -// fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); abort(); -// } -// #ifdef SEM_USE_PTHREAD -// if (taosThreadMutexLock(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// p->val += 1; -// if (p->val <= 0) { -// if (taosThreadCondSignal(&p->cond)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, -// __func__, -// sem); -// abort(); -// } -// } -// if (taosThreadMutexUnlock(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// return 0; -// #elif defined(SEM_USE_POSIX) -// return sem_post(p->sem); -// #elif defined(SEM_USE_SEM) -// return semaphore_signal(p->sem); -// #else // SEM_USE_PTHREAD -// return dispatch_semaphore_signal(p->sem); -// #endif // SEM_USE_PTHREAD -// } - -// int tsem_destroy(tsem_t *sem) { -// // fprintf(stderr, "==%s[%d]%s():[%p]==destroying\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); -// if (!*sem) { -// // fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// // abort(); -// return 0; -// } -// struct tsem_s *p = *sem; -// if (!p->valid) { -// // fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// // sem); abort(); -// return 0; -// } -// #ifdef SEM_USE_PTHREAD -// if (taosThreadMutexLock(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// p->valid = 0; -// if (taosThreadCondDestroy(&p->cond)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// if (taosThreadMutexUnlock(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// if (taosThreadMutexDestroy(&p->lock)) { -// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem); -// abort(); -// } -// #elif defined(SEM_USE_POSIX) -// char name[NAME_MAX - 4]; -// snprintf(name, sizeof(name), "/t" PRId64, p->id); -// int r = sem_unlink(name); -// if (r) { -// int e = errno; -// fprintf(stderr, "==%s[%d]%s():[%p]==unlink failed[%d]%s\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, -// sem, -// e, strerror(e)); -// abort(); -// } -// #elif defined(SEM_USE_SEM) -// semaphore_destroy(sem_port, p->sem); -// #else // SEM_USE_PTHREAD -// #endif // SEM_USE_PTHREAD - -// p->valid = 0; -// taosMemoryFree(p); - -// *sem = NULL; -// return 0; -// } -typedef struct { - pthread_mutex_t count_lock; - pthread_cond_t count_bump; - unsigned int count; -} bosal_sem_t; - -int tsem_init(tsem_t *psem, int flags, unsigned int count) { - bosal_sem_t *pnewsem; - int result; - - pnewsem = (bosal_sem_t *)malloc(sizeof(bosal_sem_t)); - if (!pnewsem) { - return -1; - } - result = pthread_mutex_init(&pnewsem->count_lock, NULL); - if (result) { - free(pnewsem); - return result; - } - result = pthread_cond_init(&pnewsem->count_bump, NULL); - if (result) { - pthread_mutex_destroy(&pnewsem->count_lock); - free(pnewsem); - return result; - } - pnewsem->count = count; - *psem = (tsem_t)pnewsem; - return 0; -} - -int tsem_destroy(tsem_t *psem) { - bosal_sem_t *poldsem; - - if (!psem) { - return EINVAL; - } - poldsem = (bosal_sem_t *)*psem; - - pthread_mutex_destroy(&poldsem->count_lock); - pthread_cond_destroy(&poldsem->count_bump); - free(poldsem); - return 0; -} - -int tsem_post(tsem_t *psem) { - bosal_sem_t *pxsem; - int result, xresult; - - if (!psem) { - return EINVAL; - } - pxsem = (bosal_sem_t *)*psem; - - result = pthread_mutex_lock(&pxsem->count_lock); - if (result) { - return result; - } - pxsem->count = pxsem->count + 1; - - xresult = pthread_cond_signal(&pxsem->count_bump); - - result = pthread_mutex_unlock(&pxsem->count_lock); - if (result) { - return result; - } - if (xresult) { - errno = xresult; - return -1; - } - return 0; -} - -int tsem_trywait(tsem_t *psem) { - bosal_sem_t *pxsem; - int result, xresult; - - if (!psem) { - return EINVAL; - } - pxsem = (bosal_sem_t *)*psem; - - result = pthread_mutex_lock(&pxsem->count_lock); - if (result) { - return result; - } - xresult = 0; - - if (pxsem->count > 0) { - pxsem->count--; - } else { - xresult = EAGAIN; - } - result = pthread_mutex_unlock(&pxsem->count_lock); - if (result) { - return result; - } - if (xresult) { - errno = xresult; - return -1; - } - return 0; -} - -int tsem_wait(tsem_t *psem) { - bosal_sem_t *pxsem; - int result, xresult; - - if (!psem) { - return EINVAL; - } - pxsem = (bosal_sem_t *)*psem; - - result = pthread_mutex_lock(&pxsem->count_lock); - if (result) { - return result; - } - xresult = 0; - - if (pxsem->count == 0) { - xresult = pthread_cond_wait(&pxsem->count_bump, &pxsem->count_lock); - } - if (!xresult) { - if (pxsem->count > 0) { - pxsem->count--; - } - } - result = pthread_mutex_unlock(&pxsem->count_lock); - if (result) { - return result; - } - if (xresult) { - errno = xresult; - return -1; - } - return 0; -} - -int tsem_timewait(tsem_t *psem, int64_t nanosecs) { - struct timespec abstim = { - .tv_sec = 0, - .tv_nsec = nanosecs, - }; - - bosal_sem_t *pxsem; - int result, xresult; - - if (!psem) { - return EINVAL; - } - pxsem = (bosal_sem_t *)*psem; - - result = pthread_mutex_lock(&pxsem->count_lock); - if (result) { - return result; - } - xresult = 0; - - if (pxsem->count == 0) { - xresult = pthread_cond_timedwait(&pxsem->count_bump, &pxsem->count_lock, &abstim); - } - if (!xresult) { - if (pxsem->count > 0) { - pxsem->count--; - } - } - result = pthread_mutex_unlock(&pxsem->count_lock); - if (result) { - return result; - } - if (xresult) { - errno = xresult; - return -1; - } - return 0; -} - -bool taosCheckPthreadValid(TdThread thread) { - int32_t ret = taosThreadKill(thread, 0); - if (ret == ESRCH) return false; - if (ret == EINVAL) return false; - // alive - return true; -} - -int64_t taosGetSelfPthreadId() { - TdThread thread = taosThreadSelf(); - return (int64_t)thread; -} - -int64_t taosGetPthreadId(TdThread thread) { return (int64_t)thread; } - -void taosResetPthread(TdThread *thread) { *thread = NULL; } - -bool taosComparePthread(TdThread first, TdThread second) { return taosThreadEqual(first, second) ? true : false; } - -int32_t taosGetPId() { return (int32_t)getpid(); } - -int32_t taosGetAppName(char *name, int32_t *len) { - char buf[PATH_MAX + 1]; - buf[0] = '\0'; - proc_name(getpid(), buf, sizeof(buf) - 1); - buf[PATH_MAX] = '\0'; - size_t n = strlen(buf); - if (len) *len = n; - if (name) tstrncpy(name, buf, TSDB_APP_NAME_LEN); - return 0; -} - -#else - -/* - * linux implementation - */ - -#include -#include - -bool taosCheckPthreadValid(TdThread thread) { return thread != 0; } - -int64_t taosGetSelfPthreadId() { - static __thread int id = 0; - if (id != 0) return id; - id = syscall(SYS_gettid); - return id; -} - -int64_t taosGetPthreadId(TdThread thread) { return (int64_t)thread; } -void taosResetPthread(TdThread* thread) { *thread = 0; } -bool taosComparePthread(TdThread first, TdThread second) { return first == second; } - -int32_t taosGetPId() { - static int32_t pid; - if (pid != 0) return pid; - pid = getpid(); - return pid; -} - -int32_t taosGetAppName(char* name, int32_t* len) { - const char* self = "/proc/self/exe"; - char path[PATH_MAX] = {0}; - - if (readlink(self, path, PATH_MAX) <= 0) { - return -1; - } - - path[PATH_MAX - 1] = 0; - char* end = strrchr(path, '/'); - if (end == NULL) { - return -1; - } - - ++end; - - tstrncpy(name, end, TSDB_APP_NAME_LEN); - - if (len != NULL) { - *len = strlen(name); - } - - return 0; -} - -int32_t tsem_wait(tsem_t* sem) { - int ret = 0; - do { - ret = sem_wait(sem); - } while (ret != 0 && errno == EINTR); - return ret; -} - -int32_t tsem_timewait(tsem_t* sem, int64_t nanosecs) { - int ret = 0; - - struct timespec tv = { - .tv_sec = 0, - .tv_nsec = nanosecs, - }; - - while ((ret = sem_timedwait(sem, &tv)) == -1 && errno == EINTR) continue; - - return ret; -} - -#endif +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define ALLOW_FORBID_FUNC +#define _DEFAULT_SOURCE +#include "os.h" +#include "pthread.h" +#include "tdef.h" + +#ifdef WINDOWS + +/* + * windows implementation + */ + +#include + +bool taosCheckPthreadValid(TdThread thread) { return thread.p != NULL; } + +void taosResetPthread(TdThread* thread) { thread->p = 0; } + +int64_t taosGetPthreadId(TdThread thread) { +#ifdef PTW32_VERSION + return pthread_getw32threadid_np(thread); +#else + return (int64_t)thread; +#endif +} + +int64_t taosGetSelfPthreadId() { return GetCurrentThreadId(); } + +bool taosComparePthread(TdThread first, TdThread second) { return first.p == second.p; } + +int32_t taosGetPId() { return GetCurrentProcessId(); } + +int32_t taosGetAppName(char* name, int32_t* len) { + char filepath[1024] = {0}; + + GetModuleFileName(NULL, filepath, MAX_PATH); + char* sub = strrchr(filepath, '.'); + if (sub != NULL) { + *sub = '\0'; + } + char* end = strrchr(filepath, TD_DIRSEP[0]); + if (end == NULL) { + end = filepath; + } + + tstrncpy(name, end, TSDB_APP_NAME_LEN); + + if (len != NULL) { + *len = (int32_t)strlen(end); + } + + return 0; +} + +int32_t tsem_wait(tsem_t* sem) { + int ret = 0; + do { + ret = sem_wait(sem); + } while (ret != 0 && errno == EINTR); + return ret; +} + +int32_t tsem_timewait(tsem_t* sem, int64_t nanosecs) { + struct timespec ts, rel; + FILETIME ft_before, ft_after; + int rc; + + rel.tv_sec = 0; + rel.tv_nsec = nanosecs; + + GetSystemTimeAsFileTime(&ft_before); + // errno = 0; + rc = sem_timedwait(sem, pthread_win32_getabstime_np(&ts, &rel)); + + /* This should have timed out */ + // assert(errno == ETIMEDOUT); + // assert(rc != 0); + // GetSystemTimeAsFileTime(&ft_after); + // // We specified a non-zero wait. Time must advance. + // if (ft_before.dwLowDateTime == ft_after.dwLowDateTime && ft_before.dwHighDateTime == ft_after.dwHighDateTime) + // { + // printf("nanoseconds: %d, rc: %d, code:0x%x. before filetime: %d, %d; after filetime: %d, %d\n", + // nanosecs, rc, errno, + // (int)ft_before.dwLowDateTime, (int)ft_before.dwHighDateTime, + // (int)ft_after.dwLowDateTime, (int)ft_after.dwHighDateTime); + // printf("time must advance during sem_timedwait."); + // return 1; + // } + return rc; +} + +#elif defined(_TD_DARWIN_64) + +/* + * darwin implementation + */ + +#include + +// #define SEM_USE_PTHREAD +// #define SEM_USE_POSIX +// #define SEM_USE_SEM + +// #ifdef SEM_USE_SEM +// #include +// #include +// #include +// #include + +// static TdThread sem_thread; +// static TdThreadOnce sem_once; +// static task_t sem_port; +// static volatile int sem_inited = 0; +// static semaphore_t sem_exit; + +// static void *sem_thread_routine(void *arg) { +// (void)arg; +// setThreadName("sem_thrd"); + +// sem_port = mach_task_self(); +// kern_return_t ret = semaphore_create(sem_port, &sem_exit, SYNC_POLICY_FIFO, 0); +// if (ret != KERN_SUCCESS) { +// fprintf(stderr, "==%s[%d]%s()==failed to create sem_exit\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__); +// sem_inited = -1; +// return NULL; +// } +// sem_inited = 1; +// semaphore_wait(sem_exit); +// return NULL; +// } + +// static void once_init(void) { +// int r = 0; +// r = taosThreadCreate(&sem_thread, NULL, sem_thread_routine, NULL); +// if (r) { +// fprintf(stderr, "==%s[%d]%s()==failed to create thread\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__); +// return; +// } +// while (sem_inited == 0) { +// ; +// } +// } +// #endif + +// struct tsem_s { +// #ifdef SEM_USE_PTHREAD +// TdThreadMutex lock; +// TdThreadCond cond; +// volatile int64_t val; +// #elif defined(SEM_USE_POSIX) +// size_t id; +// sem_t *sem; +// #elif defined(SEM_USE_SEM) +// semaphore_t sem; +// #else // SEM_USE_PTHREAD +// dispatch_semaphore_t sem; +// #endif // SEM_USE_PTHREAD + +// volatile unsigned int valid : 1; +// }; + +// int tsem_init(tsem_t *sem, int pshared, unsigned int value) { +// // fprintf(stderr, "==%s[%d]%s():[%p]==creating\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// if (*sem) { +// fprintf(stderr, "==%s[%d]%s():[%p]==already initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// struct tsem_s *p = (struct tsem_s *)taosMemoryCalloc(1, sizeof(*p)); +// if (!p) { +// fprintf(stderr, "==%s[%d]%s():[%p]==out of memory\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// abort(); +// } + +// #ifdef SEM_USE_PTHREAD +// int r = taosThreadMutexInit(&p->lock, NULL); +// do { +// if (r) break; +// r = taosThreadCondInit(&p->cond, NULL); +// if (r) { +// taosThreadMutexDestroy(&p->lock); +// break; +// } +// p->val = value; +// } while (0); +// if (r) { +// fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// abort(); +// } +// #elif defined(SEM_USE_POSIX) +// static size_t tick = 0; +// do { +// size_t id = atomic_add_fetch_64(&tick, 1); +// if (id == SEM_VALUE_MAX) { +// atomic_store_64(&tick, 0); +// id = 0; +// } +// char name[NAME_MAX - 4]; +// snprintf(name, sizeof(name), "/t" PRId64, id); +// p->sem = sem_open(name, O_CREAT | O_EXCL, pshared, value); +// p->id = id; +// if (p->sem != SEM_FAILED) break; +// int e = errno; +// if (e == EEXIST) continue; +// if (e == EINTR) continue; +// fprintf(stderr, "==%s[%d]%s():[%p]==not created[%d]%s\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem, +// e, strerror(e)); +// abort(); +// } while (p->sem == SEM_FAILED); +// #elif defined(SEM_USE_SEM) +// taosThreadOnce(&sem_once, once_init); +// if (sem_inited != 1) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal resource init failed\n", taosDirEntryBaseName(__FILE__), __LINE__, +// __func__, sem); +// errno = ENOMEM; +// return -1; +// } +// kern_return_t ret = semaphore_create(sem_port, &p->sem, SYNC_POLICY_FIFO, value); +// if (ret != KERN_SUCCESS) { +// fprintf(stderr, "==%s[%d]%s():[%p]==semophore_create failed\n", taosDirEntryBaseName(__FILE__), __LINE__, +// __func__, +// sem); +// // we fail-fast here, because we have less-doc about semaphore_create for the moment +// abort(); +// } +// #else // SEM_USE_PTHREAD +// p->sem = dispatch_semaphore_create(value); +// if (p->sem == NULL) { +// fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// abort(); +// } +// #endif // SEM_USE_PTHREAD + +// p->valid = 1; + +// *sem = p; + +// return 0; +// } + +// int tsem_wait(tsem_t *sem) { +// if (!*sem) { +// fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// abort(); +// } +// struct tsem_s *p = *sem; +// if (!p->valid) { +// fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); abort(); +// } +// #ifdef SEM_USE_PTHREAD +// if (taosThreadMutexLock(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// p->val -= 1; +// if (p->val < 0) { +// if (taosThreadCondWait(&p->cond, &p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, +// __func__, +// sem); +// abort(); +// } +// } +// if (taosThreadMutexUnlock(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// return 0; +// #elif defined(SEM_USE_POSIX) +// return sem_wait(p->sem); +// #elif defined(SEM_USE_SEM) +// return semaphore_wait(p->sem); +// #else // SEM_USE_PTHREAD +// return dispatch_semaphore_wait(p->sem, DISPATCH_TIME_FOREVER); +// #endif // SEM_USE_PTHREAD +// } + +// int tsem_post(tsem_t *sem) { +// if (!*sem) { +// fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// abort(); +// } +// struct tsem_s *p = *sem; +// if (!p->valid) { +// fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); abort(); +// } +// #ifdef SEM_USE_PTHREAD +// if (taosThreadMutexLock(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// p->val += 1; +// if (p->val <= 0) { +// if (taosThreadCondSignal(&p->cond)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, +// __func__, +// sem); +// abort(); +// } +// } +// if (taosThreadMutexUnlock(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// return 0; +// #elif defined(SEM_USE_POSIX) +// return sem_post(p->sem); +// #elif defined(SEM_USE_SEM) +// return semaphore_signal(p->sem); +// #else // SEM_USE_PTHREAD +// return dispatch_semaphore_signal(p->sem); +// #endif // SEM_USE_PTHREAD +// } + +// int tsem_destroy(tsem_t *sem) { +// // fprintf(stderr, "==%s[%d]%s():[%p]==destroying\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, sem); +// if (!*sem) { +// // fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// // abort(); +// return 0; +// } +// struct tsem_s *p = *sem; +// if (!p->valid) { +// // fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// // sem); abort(); +// return 0; +// } +// #ifdef SEM_USE_PTHREAD +// if (taosThreadMutexLock(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// p->valid = 0; +// if (taosThreadCondDestroy(&p->cond)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// if (taosThreadMutexUnlock(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// if (taosThreadMutexDestroy(&p->lock)) { +// fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem); +// abort(); +// } +// #elif defined(SEM_USE_POSIX) +// char name[NAME_MAX - 4]; +// snprintf(name, sizeof(name), "/t" PRId64, p->id); +// int r = sem_unlink(name); +// if (r) { +// int e = errno; +// fprintf(stderr, "==%s[%d]%s():[%p]==unlink failed[%d]%s\n", taosDirEntryBaseName(__FILE__), __LINE__, __func__, +// sem, +// e, strerror(e)); +// abort(); +// } +// #elif defined(SEM_USE_SEM) +// semaphore_destroy(sem_port, p->sem); +// #else // SEM_USE_PTHREAD +// #endif // SEM_USE_PTHREAD + +// p->valid = 0; +// taosMemoryFree(p); + +// *sem = NULL; +// return 0; +// } + +int tsem_init(tsem_t *psem, int flags, unsigned int count) { + *psem = dispatch_semaphore_create(count); + if (*psem == NULL) return -1; + return 0; +} + +int tsem_destroy(tsem_t *psem) { + return 0; +} + +int tsem_post(tsem_t *psem) { + if (psem == NULL || *psem == NULL) return -1; + dispatch_semaphore_signal(*psem); + return 0; +} + +int tsem_wait(tsem_t *psem) { + if (psem == NULL || *psem == NULL) return -1; + dispatch_semaphore_wait(*psem, DISPATCH_TIME_FOREVER); + return 0; +} + +int tsem_timewait(tsem_t *psem, int64_t nanosecs) { + if (psem == NULL || *psem == NULL) return -1; + dispatch_semaphore_wait(*psem, nanosecs); + return 0; +} + +bool taosCheckPthreadValid(TdThread thread) { + int32_t ret = taosThreadKill(thread, 0); + if (ret == ESRCH) return false; + if (ret == EINVAL) return false; + // alive + return true; +} + +int64_t taosGetSelfPthreadId() { + TdThread thread = taosThreadSelf(); + return (int64_t)thread; +} + +int64_t taosGetPthreadId(TdThread thread) { return (int64_t)thread; } + +void taosResetPthread(TdThread *thread) { *thread = NULL; } + +bool taosComparePthread(TdThread first, TdThread second) { return taosThreadEqual(first, second) ? true : false; } + +int32_t taosGetPId() { return (int32_t)getpid(); } + +int32_t taosGetAppName(char *name, int32_t *len) { + char buf[PATH_MAX + 1]; + buf[0] = '\0'; + proc_name(getpid(), buf, sizeof(buf) - 1); + buf[PATH_MAX] = '\0'; + size_t n = strlen(buf); + if (len) *len = n; + if (name) tstrncpy(name, buf, TSDB_APP_NAME_LEN); + return 0; +} + +#else + +/* + * linux implementation + */ + +#include +#include + +bool taosCheckPthreadValid(TdThread thread) { return thread != 0; } + +int64_t taosGetSelfPthreadId() { + static __thread int id = 0; + if (id != 0) return id; + id = syscall(SYS_gettid); + return id; +} + +int64_t taosGetPthreadId(TdThread thread) { return (int64_t)thread; } +void taosResetPthread(TdThread* thread) { *thread = 0; } +bool taosComparePthread(TdThread first, TdThread second) { return first == second; } + +int32_t taosGetPId() { + static int32_t pid; + if (pid != 0) return pid; + pid = getpid(); + return pid; +} + +int32_t taosGetAppName(char* name, int32_t* len) { + const char* self = "/proc/self/exe"; + char path[PATH_MAX] = {0}; + + if (readlink(self, path, PATH_MAX) <= 0) { + return -1; + } + + path[PATH_MAX - 1] = 0; + char* end = strrchr(path, '/'); + if (end == NULL) { + return -1; + } + + ++end; + + tstrncpy(name, end, TSDB_APP_NAME_LEN); + + if (len != NULL) { + *len = strlen(name); + } + + return 0; +} + +int32_t tsem_wait(tsem_t* sem) { + int ret = 0; + do { + ret = sem_wait(sem); + } while (ret != 0 && errno == EINTR); + return ret; +} + +int32_t tsem_timewait(tsem_t* sem, int64_t nanosecs) { + int ret = 0; + + struct timespec tv = { + .tv_sec = 0, + .tv_nsec = nanosecs, + }; + + while ((ret = sem_timedwait(sem, &tv)) == -1 && errno == EINTR) continue; + + return ret; +} + +#endif From 04ce7ffcb8b591ff28c1f28b74b10e4db1472e26 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 19:31:45 +0800 Subject: [PATCH 17/47] fix(query): fix string compare function. --- source/util/src/tcompare.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 01cdee9829..afa4fb698b 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -189,7 +189,11 @@ int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) { int32_t minLen = MIN(len1, len2); int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), minLen); if (ret == 0) { - return len1 > len2 ? 1 : -1; + if (len1 == len2) { + return 0; + } else { + return len1 > len2 ? 1 : -1; + } } else { return ret > 0 ? 1 : -1; } From 04f941982995eac77060502dc0382d89a303b3fa Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Thu, 25 Aug 2022 21:57:45 +0800 Subject: [PATCH 18/47] fix: free stream/sma obj in trans --- source/dnode/mnode/impl/src/mndTrans.c | 8 ++++++++ source/dnode/mnode/sdb/inc/sdb.h | 1 + source/dnode/mnode/sdb/src/sdb.c | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 1d8d62e534..e2ed6342a7 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -800,6 +800,11 @@ static bool mndCheckTransConflict(SMnode *pMnode, STrans *pNew) { return conflict; } + static void mndTransFreeObj(SSdb *pSdb) { + sdbFreeRowsByType(pSdb, SDB_STREAM); + sdbFreeRowsByType(pSdb, SDB_SMA); +} + int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { if (pTrans->conflict == TRN_CONFLICT_DB || pTrans->conflict == TRN_CONFLICT_DB_INSIDE) { if (strlen(pTrans->dbname1) == 0 && strlen(pTrans->dbname2) == 0) { @@ -826,6 +831,9 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); return -1; } + + mndTransFreeObj(pMnode->pSdb); + mDebug("trans:%d, prepare finished", pTrans->id); STrans *pNew = mndAcquireTrans(pMnode, pTrans->id); diff --git a/source/dnode/mnode/sdb/inc/sdb.h b/source/dnode/mnode/sdb/inc/sdb.h index f922baf329..794011b3b2 100644 --- a/source/dnode/mnode/sdb/inc/sdb.h +++ b/source/dnode/mnode/sdb/inc/sdb.h @@ -367,6 +367,7 @@ int64_t sdbGetTableVer(SSdb *pSdb, ESdbType type); */ void sdbSetApplyInfo(SSdb *pSdb, int64_t index, int64_t term, int64_t config); void sdbGetCommitInfo(SSdb *pSdb, int64_t *index, int64_t *term, int64_t *config); +void sdbFreeRowsByType(SSdb *pSdb, ESdbType type); SSdbRaw *sdbAllocRaw(ESdbType type, int8_t sver, int32_t dataLen); void sdbFreeRaw(SSdbRaw *pRaw); diff --git a/source/dnode/mnode/sdb/src/sdb.c b/source/dnode/mnode/sdb/src/sdb.c index 3db0087334..d0d79f9670 100644 --- a/source/dnode/mnode/sdb/src/sdb.c +++ b/source/dnode/mnode/sdb/src/sdb.c @@ -65,6 +65,25 @@ SSdb *sdbInit(SSdbOpt *pOption) { return pSdb; } +void sdbFreeRowsByType(SSdb *pSdb, ESdbType type) { + SHashObj *hash = pSdb->hashObjs[type]; + if (hash == NULL || !taosHashGetSize(hash)) { + return; + } + + SSdbRow **ppRow = taosHashIterate(hash, NULL); + while (ppRow != NULL) { + SSdbRow *pRow = *ppRow; + if (pRow == NULL) { + ppRow = taosHashIterate(hash, ppRow); + continue; + } + sdbFreeRow(pSdb, pRow, false); + ppRow = taosHashIterate(hash, ppRow); + } + taosHashClear(hash); +} + void sdbCleanup(SSdb *pSdb) { mDebug("start to cleanup sdb"); From 30b4023e244db796b7391055ba1bd9d42e1e281a Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 22:11:45 +0800 Subject: [PATCH 19/47] test: update the test cases. --- tests/script/tsim/parser/groupby.sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/script/tsim/parser/groupby.sim b/tests/script/tsim/parser/groupby.sim index 12a698b1cc..4ee9c530a7 100644 --- a/tests/script/tsim/parser/groupby.sim +++ b/tests/script/tsim/parser/groupby.sim @@ -557,7 +557,7 @@ if $data10 != @{slop:0.000000, intercept:1.000000}@ then return -1 endi -if $data90 != @{slop:0.000000, intercept:9.000000}@ then +if $data90 != @{slop:0.000000, intercept:17.000000}@ then return -1 endi From 5ea4c0a7c83e0ec24fbade477dea61ff0bb7a366 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 23:04:07 +0800 Subject: [PATCH 20/47] fix(query): update the uid list when tablemap is changed. --- source/dnode/vnode/src/tsdb/tsdbRead.c | 46 ++++++++++++++++++-------- tests/system-test/2-query/json_tag.py | 2 +- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c index 708f03a3a9..0a0ef11774 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead.c @@ -1887,7 +1887,7 @@ static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { if (*pLastBlockReader->rowIndex == ALL_ROWS_CHECKED_INDEX) { return false; } - + ASSERT(pLastBlockReader->lastBlockData.nRow > 0); return true; } @@ -1912,7 +1912,7 @@ int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBloc tRowMergerClear(&merge); return TSDB_CODE_SUCCESS; } - + return TSDB_CODE_SUCCESS; } @@ -1980,7 +1980,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) { } } } - + bool hasBlockLData = hasDataInLastBlock(pLastBlockReader); // no data in last block and block, no need to proceed. @@ -2313,6 +2313,20 @@ static int32_t uidComparFunc(const void* p1, const void* p2) { } } +static void extractOrderedTableUidList(SUidOrderCheckInfo *pOrderCheckInfo, SReaderStatus* pStatus) { + int32_t index = 0; + int32_t total = taosHashGetSize(pStatus->pTableMap); + + void* p = taosHashIterate(pStatus->pTableMap, NULL); + while(p != NULL) { + STableBlockScanInfo* pScanInfo = p; + pOrderCheckInfo->tableUidList[index++] = pScanInfo->uid; + p = taosHashIterate(pStatus->pTableMap, p); + } + + taosSort(pOrderCheckInfo->tableUidList, total, sizeof(uint64_t), uidComparFunc); +} + static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderStatus* pStatus) { if (pOrderCheckInfo->tableUidList == NULL) { int32_t total = taosHashGetSize(pStatus->pTableMap); @@ -2323,25 +2337,31 @@ static int32_t initOrderCheckInfo(SUidOrderCheckInfo* pOrderCheckInfo, SReaderSt return TSDB_CODE_OUT_OF_MEMORY; } - int32_t index = 0; - void* p = taosHashIterate(pStatus->pTableMap, NULL); - while(p != NULL) { - STableBlockScanInfo* pScanInfo = p; - pOrderCheckInfo->tableUidList[index++] = pScanInfo->uid; - p = taosHashIterate(pStatus->pTableMap, p); - } - - taosSort(pOrderCheckInfo->tableUidList, total, sizeof(uint64_t), uidComparFunc); + extractOrderedTableUidList(pOrderCheckInfo, pStatus); uint64_t uid = pOrderCheckInfo->tableUidList[0]; pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); } else { if (pStatus->pTableIter == NULL) { // it is the last block of a new file - ASSERT(pOrderCheckInfo->currentIndex == taosHashGetSize(pStatus->pTableMap)); +// ASSERT(pOrderCheckInfo->currentIndex == taosHashGetSize(pStatus->pTableMap)); pOrderCheckInfo->currentIndex = 0; uint64_t uid = pOrderCheckInfo->tableUidList[pOrderCheckInfo->currentIndex]; pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); + + // the tableMap has already updated + if (pStatus->pTableIter == NULL) { + void* p = taosMemoryRealloc(pOrderCheckInfo->tableUidList, taosHashGetSize(pStatus->pTableMap)*sizeof(uint64_t)); + if (p == NULL) { + return TSDB_CODE_OUT_OF_MEMORY; + } + + pOrderCheckInfo->tableUidList = p; + extractOrderedTableUidList(pOrderCheckInfo, pStatus); + + uid = pOrderCheckInfo->tableUidList[0]; + pStatus->pTableIter = taosHashGet(pStatus->pTableMap, &uid, sizeof(uid)); + } } } diff --git a/tests/system-test/2-query/json_tag.py b/tests/system-test/2-query/json_tag.py index 856d764747..d9715579ae 100644 --- a/tests/system-test/2-query/json_tag.py +++ b/tests/system-test/2-query/json_tag.py @@ -338,7 +338,7 @@ class TDTestCase: tdSql.query(f"select * from {dbname}.jsons1 where jtag->'tag1' between 1 and 30") tdSql.checkRows(3) tdSql.query(f"select * from {dbname}.jsons1 where jtag->'tag1' between 'femail' and 'beijing'") - tdSql.checkRows(2) + tdSql.checkRows(0) # test with tbname/normal column tdSql.query(f"select * from {dbname}.jsons1 where tbname = 'jsons1_1'") From 5d4d2ec14c0762bed323c0ca94bf686f5c9885ae Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Thu, 25 Aug 2022 23:22:04 +0800 Subject: [PATCH 21/47] fix(query): replace the min macro. --- source/util/src/tcompare.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index afa4fb698b..7d7a14483a 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -186,7 +186,7 @@ int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) { int32_t len1 = varDataLen(pLeft); int32_t len2 = varDataLen(pRight); - int32_t minLen = MIN(len1, len2); + int32_t minLen = TMIN(len1, len2); int32_t ret = strncmp(varDataVal(pLeft), varDataVal(pRight), minLen); if (ret == 0) { if (len1 == len2) { From 2eacdf51fa3b8af35c4d9356b62255652c61924f Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Fri, 26 Aug 2022 10:30:07 +0800 Subject: [PATCH 22/47] fix: return -1 if child table's uid not exist --- source/dnode/vnode/src/meta/metaTable.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 352b6be321..fef0ff49ac 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -532,6 +532,9 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) { SDecoder dc = {0}; rc = tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pData, &nData); + if (rc < 0) { + return -1; + } int64_t version = ((SUidIdxVal *)pData)[0].version; tdbTbGet(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pData, &nData); From b39c80940fbfd9c3bac0a86cbf6a726c1d6f6883 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 26 Aug 2022 10:38:14 +0800 Subject: [PATCH 23/47] fix: release SStreamObj when dropping --- include/common/tmsg.h | 9 --------- source/dnode/mnode/impl/src/mndSma.c | 2 +- source/dnode/mnode/impl/src/mndTrans.c | 7 ------- source/dnode/mnode/sdb/inc/sdb.h | 1 - source/dnode/mnode/sdb/src/sdb.c | 19 ------------------- 5 files changed, 1 insertion(+), 37 deletions(-) diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 47bd0d0b02..c0ea5e79c7 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -2677,15 +2677,6 @@ typedef struct { int32_t tSerializeSMDropSmaReq(void* buf, int32_t bufLen, SMDropSmaReq* pReq); int32_t tDeserializeSMDropSmaReq(void* buf, int32_t bufLen, SMDropSmaReq* pReq); -typedef struct { - int32_t vgId; - SEpSet epSet; -} SVgEpSet; - -typedef struct { - int32_t padding; -} SRSmaExecMsg; - typedef struct { int8_t version; // for compatibility(default 0) int8_t intervalUnit; // MACRO: TIME_UNIT_XXX diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 2fb934aaad..7a3b06f83a 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -38,7 +38,6 @@ static SSdbRow *mndSmaActionDecode(SSdbRaw *pRaw); static int32_t mndSmaActionInsert(SSdb *pSdb, SSmaObj *pSma); static int32_t mndSmaActionDelete(SSdb *pSdb, SSmaObj *pSpSmatb); static int32_t mndSmaActionUpdate(SSdb *pSdb, SSmaObj *pOld, SSmaObj *pNew); -static int32_t mndSmaGetVgEpSet(SMnode *pMnode, SDbObj *pDb, SVgEpSet **ppVgEpSet, int32_t *numOfVgroups); static int32_t mndProcessCreateSmaReq(SRpcMsg *pReq); static int32_t mndProcessDropSmaReq(SRpcMsg *pReq); static int32_t mndProcessGetSmaReq(SRpcMsg *pReq); @@ -840,6 +839,7 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p code = 0; _OVER: + mndReleaseStream(pMnode, pStream); mndTransDrop(pTrans); mndReleaseVgroup(pMnode, pVgroup); mndReleaseStb(pMnode, pStb); diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index e2ed6342a7..b0cec23a3f 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -800,11 +800,6 @@ static bool mndCheckTransConflict(SMnode *pMnode, STrans *pNew) { return conflict; } - static void mndTransFreeObj(SSdb *pSdb) { - sdbFreeRowsByType(pSdb, SDB_STREAM); - sdbFreeRowsByType(pSdb, SDB_SMA); -} - int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { if (pTrans->conflict == TRN_CONFLICT_DB || pTrans->conflict == TRN_CONFLICT_DB_INSIDE) { if (strlen(pTrans->dbname1) == 0 && strlen(pTrans->dbname2) == 0) { @@ -832,8 +827,6 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { return -1; } - mndTransFreeObj(pMnode->pSdb); - mDebug("trans:%d, prepare finished", pTrans->id); STrans *pNew = mndAcquireTrans(pMnode, pTrans->id); diff --git a/source/dnode/mnode/sdb/inc/sdb.h b/source/dnode/mnode/sdb/inc/sdb.h index 794011b3b2..f922baf329 100644 --- a/source/dnode/mnode/sdb/inc/sdb.h +++ b/source/dnode/mnode/sdb/inc/sdb.h @@ -367,7 +367,6 @@ int64_t sdbGetTableVer(SSdb *pSdb, ESdbType type); */ void sdbSetApplyInfo(SSdb *pSdb, int64_t index, int64_t term, int64_t config); void sdbGetCommitInfo(SSdb *pSdb, int64_t *index, int64_t *term, int64_t *config); -void sdbFreeRowsByType(SSdb *pSdb, ESdbType type); SSdbRaw *sdbAllocRaw(ESdbType type, int8_t sver, int32_t dataLen); void sdbFreeRaw(SSdbRaw *pRaw); diff --git a/source/dnode/mnode/sdb/src/sdb.c b/source/dnode/mnode/sdb/src/sdb.c index d0d79f9670..3db0087334 100644 --- a/source/dnode/mnode/sdb/src/sdb.c +++ b/source/dnode/mnode/sdb/src/sdb.c @@ -65,25 +65,6 @@ SSdb *sdbInit(SSdbOpt *pOption) { return pSdb; } -void sdbFreeRowsByType(SSdb *pSdb, ESdbType type) { - SHashObj *hash = pSdb->hashObjs[type]; - if (hash == NULL || !taosHashGetSize(hash)) { - return; - } - - SSdbRow **ppRow = taosHashIterate(hash, NULL); - while (ppRow != NULL) { - SSdbRow *pRow = *ppRow; - if (pRow == NULL) { - ppRow = taosHashIterate(hash, ppRow); - continue; - } - sdbFreeRow(pSdb, pRow, false); - ppRow = taosHashIterate(hash, ppRow); - } - taosHashClear(hash); -} - void sdbCleanup(SSdb *pSdb) { mDebug("start to cleanup sdb"); From f6c6e18554e8b35f05ff78c57de2781cf95f522d Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 26 Aug 2022 10:39:29 +0800 Subject: [PATCH 24/47] other: revert the code --- source/dnode/mnode/impl/src/mndTrans.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index b0cec23a3f..1d8d62e534 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -826,7 +826,6 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); return -1; } - mDebug("trans:%d, prepare finished", pTrans->id); STrans *pNew = mndAcquireTrans(pMnode, pTrans->id); From 0afb60dc181bfb96245f702f19428194737c80f9 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 26 Aug 2022 10:47:11 +0800 Subject: [PATCH 25/47] fix: release SSmaObj/SStreamObj when dropping sma --- source/dnode/mnode/impl/src/mndSma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 7a3b06f83a..f45e5c26b6 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -839,10 +839,11 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p code = 0; _OVER: - mndReleaseStream(pMnode, pStream); mndTransDrop(pTrans); mndReleaseVgroup(pMnode, pVgroup); mndReleaseStb(pMnode, pStb); + mndReleaseStream(pMnode, pStream); + mndReleaseSma(pMnode, pSma); return code; } From c2c41d89d5bbd5fadd5f4ea78e80ac6e3b031daf Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 26 Aug 2022 10:58:40 +0800 Subject: [PATCH 26/47] fix: release SSmaObj/SStreamObj when dropping sma --- source/dnode/mnode/impl/src/mndSma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index f45e5c26b6..59eb94a3c9 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -840,10 +840,9 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p _OVER: mndTransDrop(pTrans); + mndReleaseStream(pMnode, pStream); mndReleaseVgroup(pMnode, pVgroup); mndReleaseStb(pMnode, pStb); - mndReleaseStream(pMnode, pStream); - mndReleaseSma(pMnode, pSma); return code; } @@ -963,6 +962,7 @@ _OVER: } mndReleaseDb(pMnode, pDb); + mndReleaseSma(pMnode, pSma); return code; } From de55d16b60f1782a655b44b66cf4cbf878dc8d55 Mon Sep 17 00:00:00 2001 From: dapan1121 Date: Fri, 26 Aug 2022 10:59:48 +0800 Subject: [PATCH 27/47] enh: downgrade value type to speed up filter --- source/libs/scalar/inc/sclInt.h | 2 + source/libs/scalar/src/scalar.c | 85 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/source/libs/scalar/inc/sclInt.h b/source/libs/scalar/inc/sclInt.h index d423b92da7..36d2c5a49c 100644 --- a/source/libs/scalar/inc/sclInt.h +++ b/source/libs/scalar/inc/sclInt.h @@ -45,6 +45,8 @@ typedef struct SScalarCtx { #define SCL_IS_CONST_CALC(_ctx) (NULL == (_ctx)->pBlockList) //#define SCL_IS_NULL_VALUE_NODE(_node) ((QUERY_NODE_VALUE == nodeType(_node)) && (TSDB_DATA_TYPE_NULL == ((SValueNode *)_node)->node.resType.type) && (((SValueNode *)_node)->placeholderNo <= 0)) #define SCL_IS_NULL_VALUE_NODE(_node) ((QUERY_NODE_VALUE == nodeType(_node)) && (TSDB_DATA_TYPE_NULL == ((SValueNode *)_node)->node.resType.type)) +#define SCL_IS_COMPARISON_OPERATOR(_opType) ((_opType) >= OP_TYPE_GREATER_THAN && (_opType) < OP_TYPE_IS_NOT_UNKNOWN) +#define SCL_DOWNGRADE_DATETYPE(_type) ((_type) == TSDB_DATA_TYPE_BIGINT || TSDB_DATA_TYPE_DOUBLE == (_type) || (_type) == TSDB_DATA_TYPE_UBIGINT) #define sclFatal(...) qFatal(__VA_ARGS__) #define sclError(...) qError(__VA_ARGS__) diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index 6634a29f40..cd1f6624bd 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -9,6 +9,7 @@ #include "scalar.h" #include "tudf.h" #include "ttime.h" +#include "tcompare.h" int32_t scalarGetOperatorParamNum(EOperatorType type) { if (OP_TYPE_IS_NULL == type || OP_TYPE_IS_NOT_NULL == type || OP_TYPE_IS_TRUE == type || OP_TYPE_IS_NOT_TRUE == type @@ -219,6 +220,82 @@ void sclFreeParamList(SScalarParam *param, int32_t paramNum) { taosMemoryFree(param); } +void sclDowngradeValueType(SValueNode *valueNode) { + switch (valueNode->node.resType.type) { + case TSDB_DATA_TYPE_BIGINT: { + int8_t i8 = valueNode->datum.i; + if (i8 == valueNode->datum.i) { + valueNode->node.resType.type = TSDB_DATA_TYPE_TINYINT; + *(int8_t*)&valueNode->typeData = i8; + break; + } + int16_t i16 = valueNode->datum.i; + if (i16 == valueNode->datum.i) { + valueNode->node.resType.type = TSDB_DATA_TYPE_SMALLINT; + *(int16_t*)&valueNode->typeData = i16; + break; + } + int32_t i32 = valueNode->datum.i; + if (i32 == valueNode->datum.i) { + valueNode->node.resType.type = TSDB_DATA_TYPE_INT; + *(int32_t*)&valueNode->typeData = i32; + break; + } + break; + } + case TSDB_DATA_TYPE_UBIGINT:{ + uint8_t u8 = valueNode->datum.i; + if (u8 == valueNode->datum.i) { + int8_t i8 = valueNode->datum.i; + if (i8 == valueNode->datum.i) { + valueNode->node.resType.type = TSDB_DATA_TYPE_TINYINT; + *(int8_t*)&valueNode->typeData = i8; + } else { + valueNode->node.resType.type = TSDB_DATA_TYPE_UTINYINT; + *(uint8_t*)&valueNode->typeData = u8; + } + break; + } + uint16_t u16 = valueNode->datum.i; + if (u16 == valueNode->datum.i) { + int16_t i16 = valueNode->datum.i; + if (i16 == valueNode->datum.i) { + valueNode->node.resType.type = TSDB_DATA_TYPE_SMALLINT; + *(int16_t*)&valueNode->typeData = i16; + } else { + valueNode->node.resType.type = TSDB_DATA_TYPE_USMALLINT; + *(uint16_t*)&valueNode->typeData = u16; + } + break; + } + uint32_t u32 = valueNode->datum.i; + if (u32 == valueNode->datum.i) { + int32_t i32 = valueNode->datum.i; + if (i32 == valueNode->datum.i) { + valueNode->node.resType.type = TSDB_DATA_TYPE_INT; + *(int32_t*)&valueNode->typeData = i32; + } else { + valueNode->node.resType.type = TSDB_DATA_TYPE_UINT; + *(uint32_t*)&valueNode->typeData = u32; + } + break; + } + break; + } + case TSDB_DATA_TYPE_DOUBLE: { + float f = valueNode->datum.d; + if (FLT_EQUAL(f, valueNode->datum.d)) { + valueNode->node.resType.type = TSDB_DATA_TYPE_FLOAT; + *(float*)&valueNode->typeData = f; + break; + } + break; + } + default: + break; + } +} + int32_t sclInitParam(SNode* node, SScalarParam *param, SScalarCtx *ctx, int32_t *rowNum) { switch (nodeType(node)) { case QUERY_NODE_LEFT_VALUE: { @@ -675,6 +752,10 @@ EDealRes sclRewriteNonConstOperator(SNode** pNode, SScalarCtx *ctx) { return DEAL_RES_ERROR; } } + + if (SCL_IS_COMPARISON_OPERATOR(node->opType) && SCL_DOWNGRADE_DATETYPE(valueNode->node.resType.type)) { + sclDowngradeValueType(valueNode); + } } if (node->pRight && (QUERY_NODE_VALUE == nodeType(node->pRight))) { @@ -692,6 +773,10 @@ EDealRes sclRewriteNonConstOperator(SNode** pNode, SScalarCtx *ctx) { return DEAL_RES_ERROR; } } + + if (SCL_IS_COMPARISON_OPERATOR(node->opType) && SCL_DOWNGRADE_DATETYPE(valueNode->node.resType.type)) { + sclDowngradeValueType(valueNode); + } } if (node->pRight && (QUERY_NODE_NODE_LIST == nodeType(node->pRight))) { From 4c6a511ccf63548acb0a128c9f8353b98429aa25 Mon Sep 17 00:00:00 2001 From: Cary Xu Date: Fri, 26 Aug 2022 11:02:20 +0800 Subject: [PATCH 28/47] fix: release SSmaObj/SStreamObj when dropping sma --- source/dnode/mnode/impl/src/mndSma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c index 59eb94a3c9..8638cc5118 100644 --- a/source/dnode/mnode/impl/src/mndSma.c +++ b/source/dnode/mnode/impl/src/mndSma.c @@ -961,8 +961,8 @@ _OVER: mError("sma:%s, failed to drop since %s", dropReq.name, terrstr()); } - mndReleaseDb(pMnode, pDb); mndReleaseSma(pMnode, pSma); + mndReleaseDb(pMnode, pDb); return code; } From 3633281ab2ec75a9cbd1037bd84b350c6b78a1b7 Mon Sep 17 00:00:00 2001 From: danielclow <106956386+danielclow@users.noreply.github.com> Date: Fri, 26 Aug 2022 11:21:11 +0800 Subject: [PATCH 29/47] doc: reuploading doc updates to 3.0 branch --- docs/en/13-operation/02-planning.mdx | 50 +- docs/en/13-operation/03-tolerance.md | 20 +- docs/en/13-operation/17-diagnose.md | 109 +- docs/en/14-reference/12-config/index.md | 1307 +++++++---------- .../13-schemaless/13-schemaless.md | 114 +- docs/en/20-third-party/01-grafana.mdx | 17 +- docs/en/20-third-party/06-statsd.md | 14 +- docs/en/20-third-party/10-hive-mq-broker.md | 4 +- docs/en/27-train-faq/01-faq.md | 185 ++- 9 files changed, 767 insertions(+), 1053 deletions(-) diff --git a/docs/en/13-operation/02-planning.mdx b/docs/en/13-operation/02-planning.mdx index c1baf92dbf..2dffa7bb87 100644 --- a/docs/en/13-operation/02-planning.mdx +++ b/docs/en/13-operation/02-planning.mdx @@ -1,40 +1,32 @@ --- +sidebar_label: Resource Planning title: Resource Planning --- It is important to plan computing and storage resources if using TDengine to build an IoT, time-series or Big Data platform. How to plan the CPU, memory and disk resources required, will be described in this chapter. -## Memory Requirement of Server Side +## Server Memory Requirements -By default, the number of vgroups created for each database is the same as the number of CPU cores. This can be configured by the parameter `maxVgroupsPerDb`. Each vnode in a vgroup stores one replica. Each vnode consumes a fixed amount of memory, i.e. `blocks` \* `cache`. In addition, some memory is required for tag values associated with each table. A fixed amount of memory is required for each cluster. So, the memory required for each DB can be calculated using the formula below: +Each database creates a fixed number of vgroups. This number is 2 by default and can be configured with the `vgroups` parameter. The number of replicas can be controlled with the `replica` parameter. Each replica requires one vnode per vgroup. Altogether, the memory required by each database depends on the following configuration options: + +- vgroups +- replica +- buffer +- pages +- pagesize +- cachesize + +For more information, see [Database](../../taos-sql/database). + +The memory required by a database is therefore greater than or equal to: ``` -Database Memory Size = maxVgroupsPerDb * replica * (blocks * cache + 10MB) + numOfTables * (tagSizePerTable + 0.5KB) +vgroups * replica * (buffer + pages * pagesize + cachesize) ``` -For example, assuming the default value of `maxVgroupPerDB` is 64, the default value of `cache` is 16M, the default value of `blocks` is 6, there are 100,000 tables in a DB, the replica number is 1, total length of tag values is 256 bytes, the total memory required for this DB is: 64 \* 1 \* (16 \* 6 + 10) + 100000 \* (0.25 + 0.5) / 1000 = 6792M. +However, note that this requirement is spread over all dnodes in the cluster, not on a single physical machine. The physical servers that run dnodes meet the requirement together. If a cluster has multiple databases, the memory required increases accordingly. In complex environments where dnodes were added after initial deployment in response to increasing resource requirements, load may not be balanced among the original dnodes and newer dnodes. In this situation, the actual status of your dnodes is more important than theoretical calculations. -In the real operation of TDengine, we are more concerned about the memory used by each TDengine server process `taosd`. - -``` - taosd_memory = vnode_memory + mnode_memory + query_memory -``` - -In the above formula: - -1. "vnode_memory" of a `taosd` process is the memory used by all vnodes hosted by this `taosd` process. It can be roughly calculated by firstly adding up the total memory of all DBs whose memory usage can be derived according to the formula for Database Memory Size, mentioned above, then dividing by number of dnodes and multiplying the number of replicas. - -``` - vnode_memory = (sum(Database Memory Size) / number_of_dnodes) * replica -``` - -2. "mnode_memory" of a `taosd` process is the memory consumed by a mnode. If there is one (and only one) mnode hosted in a `taosd` process, the memory consumed by "mnode" is "0.2KB \* the total number of tables in the cluster". - -3. "query_memory" is the memory used when processing query requests. Each ongoing query consumes at least "0.2 KB \* total number of involved tables". - -Please note that the above formulas can only be used to estimate the minimum memory requirement, instead of maximum memory usage. In a real production environment, it's better to reserve some redundance beyond the estimated minimum memory requirement. If memory is abundant, it's suggested to increase the value of parameter `blocks` to speed up data insertion and data query. - -## Memory Requirement of Client Side +## Client Memory Requirements For the client programs using TDengine client driver `taosc` to connect to the server side there is a memory requirement as well. @@ -56,10 +48,10 @@ So, at least 3GB needs to be reserved for such a client. The CPU resources required depend on two aspects: -- **Data Insertion** Each dnode of TDengine can process at least 10,000 insertion requests in one second, while each insertion request can have multiple rows. The difference in computing resource consumed, between inserting 1 row at a time, and inserting 10 rows at a time is very small. So, the more the number of rows that can be inserted one time, the higher the efficiency. Inserting in batch also imposes requirements on the client side which needs to cache rows to insert in batch once the number of cached rows reaches a threshold. +- **Data Insertion** Each dnode of TDengine can process at least 10,000 insertion requests in one second, while each insertion request can have multiple rows. The difference in computing resource consumed, between inserting 1 row at a time, and inserting 10 rows at a time is very small. So, the more the number of rows that can be inserted one time, the higher the efficiency. If each insert request contains more than 200 records, a single core can process more than 1 million records per second. Inserting in batch also imposes requirements on the client side which needs to cache rows to insert in batch once the number of cached rows reaches a threshold. - **Data Query** High efficiency query is provided in TDengine, but it's hard to estimate the CPU resource required because the queries used in different use cases and the frequency of queries vary significantly. It can only be verified with the query statements, query frequency, data size to be queried, and other requirements provided by users. -In short, the CPU resource required for data insertion can be estimated but it's hard to do so for query use cases. In real operation, it's suggested to control CPU usage below 50%. If this threshold is exceeded, it's a reminder for system operator to add more nodes in the cluster to expand resources. +In short, the CPU resource required for data insertion can be estimated but it's hard to do so for query use cases. If possible, ensure that CPU usage remains below 50%. If this threshold is exceeded, it's a reminder for system operator to add more nodes in the cluster to expand resources. ## Disk Requirement @@ -77,6 +69,6 @@ To increase performance, multiple disks can be setup for parallel data reading o ## Number of Hosts -A host can be either physical or virtual. The total memory, total CPU, total disk required can be estimated according to the formulae mentioned previously. Then, according to the system resources that a single host can provide, assuming all hosts have the same resources, the number of hosts can be derived easily. +A host can be either physical or virtual. The total memory, total CPU, total disk required can be estimated according to the formulae mentioned previously. If the number of data replicas is not 1, the required resources are multiplied by the number of replicas. -**Quick Estimation for CPU, Memory and Disk** Please refer to [Resource Estimate](https://www.taosdata.com/config/config.html). +Then, according to the system resources that a single host can provide, assuming all hosts have the same resources, the number of hosts can be derived easily. diff --git a/docs/en/13-operation/03-tolerance.md b/docs/en/13-operation/03-tolerance.md index d4d48d7fcd..ba9d5d75e3 100644 --- a/docs/en/13-operation/03-tolerance.md +++ b/docs/en/13-operation/03-tolerance.md @@ -1,6 +1,5 @@ --- -sidebar_label: Fault Tolerance -title: Fault Tolerance & Disaster Recovery +title: Fault Tolerance and Disaster Recovery --- ## Fault Tolerance @@ -11,22 +10,21 @@ When a data block is received by TDengine, the original data block is first writ There are 2 configuration parameters related to WAL: -- walLevel: - - 0:wal is disabled - - 1:wal is enabled without fsync - - 2:wal is enabled with fsync -- fsync:This parameter is only valid when walLevel is set to 2. It specifies the interval, in milliseconds, of invoking fsync. If set to 0, it means fsync is invoked immediately once WAL is written. +- wal_level: Specifies the WAL level. 1 indicates that WAL is enabled but fsync is disabled. 2 indicates that WAL and fsync are both enabled. The default value is 1. +- wal_fsync_period: This parameter is only valid when wal_level is set to 2. It specifies the interval, in milliseconds, of invoking fsync. If set to 0, it means fsync is invoked immediately once WAL is written. -To achieve absolutely no data loss, walLevel should be set to 2 and fsync should be set to 1. There is a performance penalty to the data ingestion rate. However, if the concurrent data insertion threads on the client side can reach a big enough number, for example 50, the data ingestion performance will be still good enough. Our verification shows that the drop is only 30% when fsync is set to 3,000 milliseconds. +To achieve absolutely no data loss, set wal_level to 2 and wal_fsync_period to 0. There is a performance penalty to the data ingestion rate. However, if the concurrent data insertion threads on the client side can reach a big enough number, for example 50, the data ingestion performance will be still good enough. Our verification shows that the drop is only 30% when wal_fsync_period is set to 3000 milliseconds. ## Disaster Recovery -TDengine uses replication to provide high availability and disaster recovery capability. +TDengine uses replication to provide high availability. -A TDengine cluster is managed by mnode. To ensure the high availability of mnode, multiple replicas can be configured by the system parameter `numOfMnodes`. The data replication between mnode replicas is performed in a synchronous way to guarantee metadata consistency. +A TDengine cluster is managed by mnodes. You can configure up to three mnodes to ensure high availability. The data replication between mnode replicas is performed in a synchronous way to guarantee metadata consistency. -The number of replicas for time series data in TDengine is associated with each database. There can be many databases in a cluster and each database can be configured with a different number of replicas. When creating a database, parameter `replica` is used to configure the number of replications. To achieve high availability, `replica` needs to be higher than 1. +The number of replicas for time series data in TDengine is associated with each database. There can be many databases in a cluster and each database can be configured with a different number of replicas. When creating a database, the parameter `replica` is used to specify the number of replicas. To achieve high availability, set `replica` to 3. The number of dnodes in a TDengine cluster must NOT be lower than the number of replicas for any database, otherwise it would fail when trying to create a table. As long as the dnodes of a TDengine cluster are deployed on different physical machines and the replica number is higher than 1, high availability can be achieved without any other assistance. For disaster recovery, dnodes of a TDengine cluster should be deployed in geographically different data centers. + +Alternatively, you can use taosX to synchronize the data from one TDengine cluster to another cluster in a remote location. For more information, see [taosX](../../reference/taosX). diff --git a/docs/en/13-operation/17-diagnose.md b/docs/en/13-operation/17-diagnose.md index 2b474fddba..d01d12e831 100644 --- a/docs/en/13-operation/17-diagnose.md +++ b/docs/en/13-operation/17-diagnose.md @@ -13,110 +13,59 @@ Diagnostic steps: 1. If the port range to be diagnosed is being occupied by a `taosd` server process, please first stop `taosd. 2. On the server side, execute command `taos -n server -P -l ` to monitor the port range starting from the port specified by `-P` parameter with the role of "server". 3. On the client side, execute command `taos -n client -h -P -l ` to send a testing package to the specified server and port. - --l : The size of the testing package, in bytes. The value range is [11, 64,000] and default value is 1,000. Please note that the package length must be same in the above 2 commands executed on server side and client side respectively. + +-l : The size of the testing package, in bytes. The value range is [11, 64,000] and default value is 1,000. +Please note that the package length must be same in the above 2 commands executed on server side and client side respectively. Output of the server side for the example is below: ```bash -# taos -n server -P 6000 -12/21 14:50:13.522509 0x7f536f455200 UTL work as server, host:172.27.0.7 startPort:6000 endPort:6011 pkgLen:1000 - -12/21 14:50:13.522659 0x7f5352242700 UTL TCP server at port:6000 is listening -12/21 14:50:13.522727 0x7f5351240700 UTL TCP server at port:6001 is listening +# taos -n server -P 6030 -l 1000 +network test server is initialized, port:6030 +request is received, size:1000 +request is received, size:1000 ... ... ... -12/21 14:50:13.523954 0x7f5342fed700 UTL TCP server at port:6011 is listening -12/21 14:50:13.523989 0x7f53437ee700 UTL UDP server at port:6010 is listening -12/21 14:50:13.524019 0x7f53427ec700 UTL UDP server at port:6011 is listening -12/21 14:50:22.192849 0x7f5352242700 UTL TCP: read:1000 bytes from 172.27.0.8 at 6000 -12/21 14:50:22.192993 0x7f5352242700 UTL TCP: write:1000 bytes to 172.27.0.8 at 6000 -12/21 14:50:22.237082 0x7f5351a41700 UTL UDP: recv:1000 bytes from 172.27.0.8 at 6000 -12/21 14:50:22.237203 0x7f5351a41700 UTL UDP: send:1000 bytes to 172.27.0.8 at 6000 -12/21 14:50:22.237450 0x7f5351240700 UTL TCP: read:1000 bytes from 172.27.0.8 at 6001 -12/21 14:50:22.237576 0x7f5351240700 UTL TCP: write:1000 bytes to 172.27.0.8 at 6001 -12/21 14:50:22.281038 0x7f5350a3f700 UTL UDP: recv:1000 bytes from 172.27.0.8 at 6001 -12/21 14:50:22.281141 0x7f5350a3f700 UTL UDP: send:1000 bytes to 172.27.0.8 at 6001 -... -... -... -12/21 14:50:22.677443 0x7f5342fed700 UTL TCP: read:1000 bytes from 172.27.0.8 at 6011 -12/21 14:50:22.677576 0x7f5342fed700 UTL TCP: write:1000 bytes to 172.27.0.8 at 6011 -12/21 14:50:22.721144 0x7f53427ec700 UTL UDP: recv:1000 bytes from 172.27.0.8 at 6011 -12/21 14:50:22.721261 0x7f53427ec700 UTL UDP: send:1000 bytes to 172.27.0.8 at 6011 +request is received, size:1000 +request is received, size:1000 ``` Output of the client side for the example is below: ```bash # taos -n client -h 172.27.0.7 -P 6000 -12/21 14:50:22.192434 0x7fc95d859200 UTL work as client, host:172.27.0.7 startPort:6000 endPort:6011 pkgLen:1000 +taos -n client -h v3s2 -P 6030 -l 1000 +network test client is initialized, the server is v3s2:6030 +request is sent, size:1000 +response is received, size:1000 +request is sent, size:1000 +response is received, size:1000 +... +... +... +request is sent, size:1000 +response is received, size:1000 +request is sent, size:1000 +response is received, size:1000 -12/21 14:50:22.192472 0x7fc95d859200 UTL server ip:172.27.0.7 is resolved from host:172.27.0.7 -12/21 14:50:22.236869 0x7fc95d859200 UTL successed to test TCP port:6000 -12/21 14:50:22.237215 0x7fc95d859200 UTL successed to test UDP port:6000 -... -... -... -12/21 14:50:22.676891 0x7fc95d859200 UTL successed to test TCP port:6010 -12/21 14:50:22.677240 0x7fc95d859200 UTL successed to test UDP port:6010 -12/21 14:50:22.720893 0x7fc95d859200 UTL successed to test TCP port:6011 -12/21 14:50:22.721274 0x7fc95d859200 UTL successed to test UDP port:6011 +total succ: 100/100 cost: 16.23 ms speed: 5.87 MB/s ``` The output needs to be checked carefully for the system operator to find the root cause and resolve the problem. -## Startup Status and RPC Diagnostic - -`taos -n startup -h ` can be used to check the startup status of a `taosd` process. This is a common task which should be performed by a system operator, especially in the case of a cluster, to determine whether `taosd` has been started successfully. - -`taos -n rpc -h ` can be used to check whether the port of a started `taosd` can be accessed or not. If `taosd` process doesn't respond or is working abnormally, this command can be used to initiate a rpc communication with the specified fqdn to determine whether it's a network problem or whether `taosd` is abnormal. - -## Sync and Arbitrator Diagnostic - -```bash -taos -n sync -P 6040 -h -taos -n sync -P 6042 -h -``` - -The above commands can be executed in a Linux shell to check whether the port for sync is working well and whether the sync module on the server side is working well. Additionally, `-P 6042` is used to check whether the arbitrator is configured properly and is working well. - -## Network Speed Diagnostic - -`taos -n speed -h -P 6030 -N 10 -l 10000000 -S TCP` - -From version 2.2.0.0 onwards, the above command can be executed in a Linux shell to test network speed. The command sends uncompressed packages to a running `taosd` server process or a simulated server process started by `taos -n server` to test the network speed. Parameters can be used when testing network speed are as below: - --n:When set to "speed", it means testing network speed. --h:The FQDN or IP of the server process to be connected to; if not set, the FQDN configured in `taos.cfg` is used. --P:The port of the server process to connect to, the default value is 6030. --N:The number of packages that will be sent in the test, range is [1,10000], default value is 100. --l:The size of each package in bytes, range is [1024, 1024 \* 1024 \* 1024], default value is 1024. --S:The type of network packages to send, can be either TCP or UDP, default value is TCP. - -## FQDN Resolution Diagnostic - -`taos -n fqdn -h ` - -From version 2.2.0.0 onward, the above command can be executed in a Linux shell to test the resolution speed of FQDN. It can be used to try to resolve a FQDN to an IP address and record the time spent in this process. The parameters that can be used for this purpose are as below: - --n:When set to "fqdn", it means testing the speed of resolving FQDN. --h:The FQDN to be resolved. If not set, the `FQDN` parameter in `taos.cfg` is used by default. - ## Server Log -The parameter `debugFlag` is used to control the log level of the `taosd` server process. The default value is 131. For debugging and tracing, it needs to be set to either 135 or 143 respectively. +The parameter `debugFlag` is used to control the log level of the `taosd` server process. The default value is 131. For debugging and tracing, it needs to be set to either 135 or 143 respectively. -Once this parameter is set to 135 or 143, the log file grows very quickly especially when there is a huge volume of data insertion and data query requests. If all the logs are stored together, some important information may be missed very easily and so on the server side, important information is stored in a different place from other logs. - -- The log at level of INFO, WARNING and ERROR is stored in `taosinfo` so that it is easy to find important information -- The log at level of DEBUG (135) and TRACE (143) and other information not handled by `taosinfo` are stored in `taosdlog` +Once this parameter is set to 135 or 143, the log file grows very quickly especially when there is a huge volume of data insertion and data query requests. Ensure that the disk drive on which logs are stored has sufficient space. ## Client Log -An independent log file, named as "taoslog+" is generated for each client program, i.e. a client process. The default value of `debugFlag` is also 131 and only logs at level of INFO/ERROR/WARNING are recorded. As stated above, for debugging and tracing, it needs to be changed to 135 or 143 respectively, so that logs at DEBUG or TRACE level can be recorded. +An independent log file, named as "taoslog+" is generated for each client program, i.e. a client process. The parameter `debugFlag` is used to control the log level. The default value is 131. For debugging and tracing, it needs to be set to either 135 or 143 respectively. + +The default value of `debugFlag` is also 131 and only logs at level of INFO/ERROR/WARNING are recorded. As stated above, for debugging and tracing, it needs to be changed to 135 or 143 respectively, so that logs at DEBUG or TRACE level can be recorded. The maximum length of a single log file is controlled by parameter `numOfLogLines` and only 2 log files are kept for each `taosd` server process. -Log files are written in an async way to minimize the workload on disk, but the trade off for performance is that a few log lines may be lost in some extreme conditions. +Log files are written in an async way to minimize the workload on disk, but the trade off for performance is that a few log lines may be lost in some extreme conditions. You can configure asynclog to 0 when needed for troubleshooting purposes to ensure that no log information is lost. diff --git a/docs/en/14-reference/12-config/index.md b/docs/en/14-reference/12-config/index.md index cb7daf3c47..532e16de5c 100644 --- a/docs/en/14-reference/12-config/index.md +++ b/docs/en/14-reference/12-config/index.md @@ -1,16 +1,13 @@ --- -sidebar_label: Configuration title: Configuration Parameters description: "Configuration parameters for client and server in TDengine" --- -In this chapter, all the configuration parameters on both server and client side are described thoroughly. - ## Configuration File on Server Side On the server side, the actual service of TDengine is provided by an executable `taosd` whose parameters can be configured in file `taos.cfg` to meet the requirements of different use cases. The default location of `taos.cfg` is `/etc/taos`, but can be changed by using `-c` parameter on the CLI of `taosd`. For example, the configuration file can be put under `/home/user` and used like below -```bash +``` taosd -c /home/user ``` @@ -24,8 +21,6 @@ taosd -C TDengine CLI `taos` is the tool for users to interact with TDengine. It can share same configuration file as `taosd` or use a separate configuration file. When launching `taos`, parameter `-c` can be used to specify the location where its configuration file is. For example `taos -c /home/cfg` means `/home/cfg/taos.cfg` will be used. If `-c` is not used, the default location of the configuration file is `/etc/taos`. For more details please use `taos --help` to get. -From version 2.0.10.0 below commands can be used to show the configuration parameters of the client side. - ```bash taos -C ``` @@ -36,6 +31,11 @@ taos --dump-config # Configuration Parameters +:::note +The parameters described in this document by the effect that they have on the system. + +::: + :::note `taosd` needs to be restarted for the parameters changed in the configuration file to take effect. @@ -45,19 +45,19 @@ taos --dump-config ### firstEp -| Attribute | Description | -| ------------- | ---------------------------------------------------------------------------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | -------------------------------------------------------------- | +| Applicable | Server and Client | | Meaning | The end point of the first dnode in the cluster to be connected to when `taosd` or `taos` is started | -| Default Value | localhost:6030 | +| Default | localhost:6030 | ### secondEp -| Attribute | Description | -| ------------- | ---------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ------------------------------------------------------------------------------------- | +| Applicable | Server and Client | | Meaning | The end point of the second dnode to be connected to if the firstEp is not available when `taosd` or `taos` is started | -| Default Value | None | +| Default | None | ### fqdn @@ -65,35 +65,28 @@ taos --dump-config | ------------- | ------------------------------------------------------------------------ | | Applicable | Server Only | | Meaning | The FQDN of the host where `taosd` will be started. It can be IP address | -| Default Value | The first hostname configured for the host | -| Note | It should be within 96 bytes | +| Default Value | The first hostname configured for the host | +| Note | It should be within 96 bytes | | ### serverPort -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | +| Attribute | Description | +| -------- | ----------------------------------------------------------------------------------------------------------------------- | +| Applicable | Server Only | | Meaning | The port for external access after `taosd` is started | | Default Value | 6030 | :::note -TDengine uses 13 continuous ports, both TCP and UDP, starting with the port specified by `serverPort`. You should ensure, in your firewall rules, that these ports are kept open. Below table describes the ports used by TDengine in details. - +- Ensure that your firewall rules do not block TCP port 6042 on any host in the cluster. Below table describes the ports used by TDengine in details. ::: - | Protocol | Default Port | Description | How to configure | | :------- | :----------- | :----------------------------------------------- | :--------------------------------------------------------------------------------------------- | -| TCP | 6030 | Communication between client and server | serverPort | -| TCP | 6035 | Communication among server nodes in cluster | serverPort+5 | -| TCP | 6040 | Data syncup among server nodes in cluster | serverPort+10 | -| TCP | 6041 | REST connection between client and server | Please refer to [taosAdapter](../taosadapter/) | -| TCP | 6042 | Service Port of Arbitrator | The parameter of Arbitrator | -| TCP | 6043 | Service Port of TaosKeeper | The parameter of TaosKeeper | -| TCP | 6044 | Data access port for StatsD | refer to [taosAdapter](../taosadapter/) | -| UDP | 6045 | Data access for statsd | refer to [taosAdapter](../taosadapter/) | -| TCP | 6060 | Port of Monitoring Service in Enterprise version | | -| UDP | 6030-6034 | Communication between client and server | serverPort | -| UDP | 6035-6039 | Communication among server nodes in cluster | serverPort | +| TCP | 6030 | Communication between client and server. In a multi-node cluster, communication between nodes. serverPort | +| TCP | 6041 | REST connection between client and server | Prior to 2.4.0.0: serverPort+11; After 2.4.0.0 refer to [taosAdapter](/reference/taosadapter/) | +| TCP | 6043 | Service Port of TaosKeeper | The parameter of TaosKeeper | +| TCP | 6044 | Data access port for StatsD | Configurable through taosAdapter parameters. +| UDP | 6045 | Data access for statsd | Configurable through taosAdapter parameters. +| TCP | 6060 | Port of Monitoring Service in Enterprise version | | ### maxShellConns @@ -104,104 +97,109 @@ TDengine uses 13 continuous ports, both TCP and UDP, starting with the port spec | Value Range | 10-50000000 | | Default Value | 5000 | -### maxConnections - -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The maximum number of connections allowed by a database | -| Value Range | 1-100000 | -| Default Value | 5000 | -| Note | The maximum number of worker threads on the client side is maxConnections/100 | - -### rpcForceTcp - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------- | -| Applicable | Server and Client | -| Meaning | TCP is used by force | -| Value Range | 0: disabled 1: enabled | -| Default Value | 0 | -| Note | It's suggested to configure to enable if network is not good enough | - ## Monitoring Parameters ### monitor -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The switch for monitoring inside server. The workload of the hosts, including CPU, memory, disk, network, TTP requests, are collected and stored in a system builtin database `LOG` | -| Value Range | 0: monitoring disabled, 1: monitoring enabled | -| Default Value | 1 | +| Attribute | Description | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Applicable | Server only | +| Meaning | The switch for monitoring inside server. The main object of monitoring is to collect information about load on physical nodes, including CPU usage, memory usage, disk usage, and network bandwidth. Monitoring information is sent over HTTP to the taosKeeper service specified by `monitorFqdn` and `monitorProt`. +| Value Range | 0: monitoring disabled, 1: monitoring enabled | +| Default | 1 | + +### monitorFqdn + +| Attribute | Description | +| -------- | -------------------------- | +| Applicable | Server Only | +| Meaning | FQDN of taosKeeper monitoring service | +| Default | None | + +### monitorPort + +| Attribute | Description | +| -------- | --------------------------- | +| Applicable | Server Only | +| Meaning | Port of taosKeeper monitoring service | +| Default Value | 6043 | ### monitorInterval -| Attribute | Description | -| ------------- | ------------------------------------------ | -| Applicable | Server Only | +| Attribute | Description | +| -------- | -------------------------------------------- | +| Applicable | Server Only | | Meaning | The interval of collecting system workload | | Unit | second | -| Value Range | 1-600 | -| Default Value | 30 | +| Value Range | 1-200000 | +| Default Value | 30 | ### telemetryReporting -| Attribute | Description | -| ------------- | ---------------------------------------------------------------------------- | -| Applicable | Server Only | +| Attribute | Description | +| -------- | ---------------------------------------- | +| Applicable | Server Only | | Meaning | Switch for allowing TDengine to collect and report service usage information | | Value Range | 0: Not allowed; 1: Allowed | -| Default Value | 1 | +| Default Value | 1 | ## Query Parameters -### queryBufferSize +### queryPolicy -| Attribute | Description | -| ------------- | ---------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The total memory size reserved for all queries | -| Unit | MB | -| Default Value | None | -| Note | It can be estimated by "maximum number of concurrent queries" _ "number of tables" _ 170 | +| Attribute | Description | +| -------- | ----------------------------- | +| Applicable | Client only | +| Meaning | Execution policy for query statements | +| Unit | None | +| Default | 1 | +| Notes | 1: Run queries on vnodes and not on qnodes | -### ratioOfQueryCores +2: Run subtasks without scan operators on qnodes and subtasks with scan operators on vnodes. + +3: Only run scan operators on vnodes; run all other operators on qnodes. + +### querySmaOptimize + +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Client only | +| 含义 | SMA index optimization policy | +| Unit | None | +| Default Value | 0 | +| Notes | + +0: Disable SMA indexing and perform all queries on non-indexed data. + +1: Enable SMA indexing and perform queries from suitable statements on precomputation results.| -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Maximum number of query threads | -| Default Value | 1 | -| Note | value range: float number between [0, 2] 0: only 1 query thread; >0: the times of the number of cores | ### maxNumOfDistinctRes -| Attribute | Description | -| ------------- | -------------------------------------------- | -| Applicable | Server Only | +| Attribute | Description | +| -------- | -------------------------------- | --- | +| Applicable | Server Only | | Meaning | The maximum number of distinct rows returned | | Value Range | [100,000 - 100,000,000] | | Default Value | 100,000 | -| Note | After version 2.3.0.0 | ## Locale Parameters ### timezone -| Attribute | Description | -| ------------- | ------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ------------------------------ | +| Applicable | Server and Client | | Meaning | TimeZone | | Default Value | TimeZone configured in the host | :::info -To handle the data insertion and data query from multiple timezones, Unix Timestamp is used and stored in TDengine. The timestamp generated from any timezones at same time is same in Unix timestamp. To make sure the time on client side can be converted to Unix timestamp correctly, the timezone must be set properly. +To handle the data insertion and data query from multiple timezones, Unix Timestamp is used and stored in TDengine. The timestamp generated from any timezones at same time is same in Unix timestamp. Note that Unix timestamps are converted and recorded on the client side. To make sure the time on client side can be converted to Unix timestamp correctly, the timezone must be set properly. -On Linux system, TDengine clients automatically obtain timezone from the host. Alternatively, the timezone can be configured explicitly in configuration file `taos.cfg` like below. +On Linux system, TDengine clients automatically obtain timezone from the host. Alternatively, the timezone can be configured explicitly in configuration file `taos.cfg` like below. For example: ``` -timezone UTC-7 +timezone UTC-8 timezone GMT-8 timezone Asia/Shanghai ``` @@ -239,11 +237,11 @@ To avoid the problems of using time strings, Unix timestamp can be used directly | Default Value | Locale configured in host | :::info -A specific type "nchar" is provided in TDengine to store non-ASCII characters such as Chinese, Japanese, and Korean. The characters to be stored in nchar type are firstly encoded in UCS4-LE before sending to server side. To store non-ASCII characters correctly, the encoding format of the client side needs to be set properly. +A specific type "nchar" is provided in TDengine to store non-ASCII characters such as Chinese, Japanese, and Korean. The characters to be stored in nchar type are firstly encoded in UCS4-LE before sending to server side. Note that the correct encoding is determined by the user. To store non-ASCII characters correctly, the encoding format of the client side needs to be set properly. The characters input on the client side are encoded using the default system encoding, which is UTF-8 on Linux, or GB18030 or GBK on some systems in Chinese, POSIX in docker, CP936 on Windows in Chinese. The encoding of the operating system in use must be set correctly so that the characters in nchar type can be converted to UCS4-LE. -The locale definition standard on Linux is: \_., for example, in "zh_CN.UTF-8", "zh" means Chinese, "CN" means China mainland, "UTF-8" means charset. On Linux and Mac OSX, the charset can be set by locale in the system. On Windows system another configuration parameter `charset` must be used to configure charset because the locale used on Windows is not POSIX standard. Of course, `charset` can also be used on Linux to specify the charset. +The locale definition standard on Linux is: \_., for example, in "zh_CN.UTF-8", "zh" means Chinese, "CN" means China mainland, "UTF-8" means charset. The charset indicates how to display the characters. On Linux and Mac OSX, the charset can be set by locale in the system. On Windows system another configuration parameter `charset` must be used to configure charset because the locale used on Windows is not POSIX standard. Of course, `charset` can also be used on Linux to specify the charset. ::: @@ -256,849 +254,566 @@ The locale definition standard on Linux is: \_., f | Default Value | charset set in the system | :::info -On Linux, if `charset` is not set in `taos.cfg`, when `taos` is started, the charset is obtained from system locale. If obtaining charset from system locale fails, `taos` would fail to start. So on Linux system, if system locale is set properly, it's not necessary to set `charset` in `taos.cfg`. For example: +On Linux, if `charset` is not set in `taos.cfg`, when `taos` is started, the charset is obtained from system locale. If obtaining charset from system locale fails, `taos` would fail to start. + +So on Linux system, if system locale is set properly, it's not necessary to set `charset` in `taos.cfg`. For example: ``` locale zh_CN.UTF-8 ``` -On a Linux system, if the charset contained in `locale` is not consistent with that set by `charset`, the later setting in the configuration file takes precedence. - -```title="Effective charset is GBK" -locale zh_CN.UTF-8 -charset GBK -``` - -```title="Effective charset is UTF-8" -charset GBK -locale zh_CN.UTF-8 -``` - On Windows system, it's not possible to obtain charset from system locale. If it's not set in configuration file `taos.cfg`, it would be default to CP936, same as set as below in `taos.cfg`. For example ``` charset CP936 ``` +Refer to the documentation for your operating system before changing the charset. + +On a Linux system, if the charset contained in `locale` is not consistent with that set by `charset`, the later setting in the configuration file takes precedence. + +``` +locale zh_CN.UTF-8 +charset GBK +``` + +The charset that takes effect is GBK. + +``` +charset GBK +locale zh_CN.UTF-8 +``` + +The charset that takes effect is UTF-8. + ::: ## Storage Parameters ### dataDir -| Attribute | Description | -| ------------- | ------------------------------------------- | +| Attribute | Description | +| -------- | ------------------------------------------ | | Applicable | Server Only | | Meaning | All data files are stored in this directory | | Default Value | /var/lib/taos | -### cache - -| Attribute | Description | -| ------------- | ----------------------------- | -| Applicable | Server Only | -| Meaning | The size of each memory block | -| Unit | MB | -| Default Value | 16 | - -### blocks - -| Attribute | Description | -| ------------- | -------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The number of memory blocks of size `cache` used by each vnode | -| Default Value | 6 | - -### days - -| Attribute | Description | -| ------------- | ----------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The time range of the data stored in single data file | -| Unit | day | -| Default Value | 10 | - -### keep - -| Attribute | Description | -| ------------- | -------------------------------------- | -| Applicable | Server Only | -| Meaning | The number of days for data to be kept | -| Unit | day | -| Default Value | 3650 | - -### minRows - -| Attribute | Description | -| ------------- | ------------------------------------------ | -| Applicable | Server Only | -| Meaning | minimum number of rows in single data file | -| Default Value | 100 | - -### maxRows - -| Attribute | Description | -| ------------- | ------------------------------------------ | -| Applicable | Server Only | -| Meaning | maximum number of rows in single data file | -| Default Value | 4096 | - -### walLevel - -| Attribute | Description | -| ------------- | ---------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | WAL level | -| Value Range | 0: wal disabled
1: wal enabled without fsync
2: wal enabled with fsync | -| Default Value | 1 | - -### fsync - -| Attribute | Description | -| ------------- | --------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The waiting time for invoking fsync when walLevel is 2 | -| Unit | millisecond | -| Value Range | 0: no waiting time, fsync is performed immediately once WAL is written;
maximum value is 180000, i.e. 3 minutes | -| Default Value | 3000 | - -### update - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------------ | -| Applicable | Server Only | -| Meaning | If it's allowed to update existing data | -| Value Range | 0: not allowed
1: a row can only be updated as a whole
2: a part of columns can be updated | -| Default Value | 0 | -| Note | Not available from version 2.0.8.0 | - -### cacheLast - -| Attribute | Description | -| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Whether to cache the latest rows of each sub table in memory | -| Value Range | 0: not cached
1: the last row of each sub table is cached
2: the last non-null value of each column is cached
3: identical to both 1 and 2 are set | -| Default Value | 0 | - ### minimalTmpDirGB -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ------------------------------------------------ | +| Applicable | Server and Client | | Meaning | When the available disk space in tmpDir is below this threshold, writing to tmpDir is suspended | -| Unit | GB | -| Default Value | 1.0 | +| Unit | GB | +| Default Value | 1.0 | ### minimalDataDirGB -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------ | -| Applicable | Server Only | -| Meaning | hen the available disk space in dataDir is below this threshold, writing to dataDir is suspended | -| Unit | GB | -| Default Value | 2.0 | - -### vnodeBak - -| Attribute | Description | -| ------------- | --------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Whether to backup the corresponding vnode directory when a vnode is deleted | -| Value Range | 0: not backed up, 1: backup | -| Default Value | 1 | +| Attribute | Description | +| -------- | ------------------------------------------------ | +| Applicable | Server Only | +| Meaning | When the available disk space in dataDir is below this threshold, writing to dataDir is suspended | +| Unit | GB | +| Default Value | 2.0 | ## Cluster Parameters -### numOfMnodes +### supportVnodes -| Attribute | Description | -| ------------- | ------------------------------ | -| Applicable | Server Only | -| Meaning | The number of management nodes | -| Default Value | 3 | - -### replica - -| Attribute | Description | -| ------------- | -------------------------- | -| Applicable | Server Only | -| Meaning | The number of replications | -| Value Range | 1-3 | -| Default Value | 1 | - -### quorum - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------ | -| Applicable | Server Only | -| Meaning | The number of required confirmations for data replication in case of multiple replications | -| Value Range | 1,2 | -| Default Value | 1 | - -### role - -| Attribute | Description | -| ------------- | --------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The role of the dnode | -| Value Range | 0: both mnode and vnode
1: mnode only
2: dnode only | -| Default Value | 0 | - -### balance - -| Attribute | Description | -| ------------- | ------------------------ | -| Applicable | Server Only | -| Meaning | Automatic load balancing | -| Value Range | 0: disabled, 1: enabled | -| Default Value | 1 | - -### balanceInterval - -| Attribute | Description | -| ------------- | ----------------------------------------------- | -| Applicable | Server Only | -| Meaning | The interval for checking load balance by mnode | -| Unit | second | -| Value Range | 1-30000 | -| Default Value | 300 | - -### arbitrator - -| Attribute | Description | -| ------------- | -------------------------------------------------- | -| Applicable | Server Only | -| Meaning | End point of arbitrator, format is same as firstEp | -| Default Value | None | +| Attribute | Description | +| -------- | --------------------------- | +| Applicable | Server Only | +| Meaning | Maximum number of vnodes per dnode | +| Value Range | 0-4096 | +| Default Value | 256 | ## Time Parameters -### precision - -| Attribute | Description | -| ------------- | ------------------------------------------------- | -| Applicable | Server only | -| Meaning | Time precision used for each database | -| Value Range | ms: millisecond; us: microsecond ; ns: nanosecond | -| Default Value | ms | - -### rpcTimer - -| Attribute | Description | -| ------------- | ------------------ | -| Applicable | Server and Client | -| Meaning | rpc retry interval | -| Unit | milliseconds | -| Value Range | 100-3000 | -| Default Value | 300 | - -### rpcMaxTime - -| Attribute | Description | -| ------------- | ---------------------------------- | -| Applicable | Server and Client | -| Meaning | maximum wait time for rpc response | -| Unit | second | -| Value Range | 100-7200 | -| Default Value | 600 | - ### statusInterval -| Attribute | Description | -| ------------- | ----------------------------------------------- | -| Applicable | Server Only | +| Attribute | Description | +| -------- | --------------------------- | +| Applicable | Server Only | | Meaning | the interval of dnode reporting status to mnode | | Unit | second | -| Value Range | 1-10 | -| Default Value | 1 | +| Value Range | 1-10 | +| Default Value | 1 | ### shellActivityTimer -| Attribute | Description | -| ------------- | ------------------------------------------------------ | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | --------------------------------- | +| Applicable | Server and Client | | Meaning | The interval for taos shell to send heartbeat to mnode | -| Unit | second | -| Value Range | 1-120 | -| Default Value | 3 | - -### tableMetaKeepTimer - -| Attribute | Description | -| ------------- | -------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The expiration time for metadata in cache, once it's reached the client would refresh the metadata | -| Unit | second | -| Value Range | 1-8640000 | -| Default Value | 7200 | - -### maxTmrCtrl - -| Attribute | Description | -| ------------- | ------------------------ | -| Applicable | Server and Client | -| Meaning | Maximum number of timers | -| Unit | None | -| Value Range | 8-2048 | -| Default Value | 512 | - -### offlineThreshold - -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The expiration time for dnode online status, once it's reached before receiving status from a node, the dnode becomes offline | -| Unit | second | -| Value Range | 5-7200000 | -| Default Value | 86400\*10 (i.e. 10 days) | +| Unit | second | +| Value Range | 1-120 | +| Default Value | 3 | ## Performance Optimization Parameters -### numOfThreadsPerCore - -| Attribute | Description | -| ------------- | ------------------------------------------- | -| Applicable | Server and Client | -| Meaning | The number of consumer threads per CPU core | -| Default Value | 1.0 | - -### ratioOfQueryThreads - -| Attribute | Description | -| ------------- | --------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Maximum number of query threads | -| Value Range | 0: Only one query thread
1: Same as number of CPU cores
2: two times of CPU cores | -| Default Value | 1 | -| Note | This value can be a float number, 0.5 means half of the CPU cores | - -### maxVgroupsPerDb - -| Attribute | Description | -| ------------- | ------------------------------------ | -| Applicable | Server Only | -| Meaning | Maximum number of vnodes for each DB | -| Value Range | 0-8192 | -| Default Value | | - -### maxTablesPerVnode - -| Attribute | Description | -| ------------- | -------------------------------------- | -| Applicable | Server Only | -| Meaning | Maximum number of tables in each vnode | -| Default Value | 1000000 | - -### minTablesPerVnode - -| Attribute | Description | -| ------------- | -------------------------------------- | -| Applicable | Server Only | -| Meaning | Minimum number of tables in each vnode | -| Default Value | 1000 | - -### tableIncStepPerVnode - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | When minTablesPerVnode is reached, the number of tables are allocated for a vnode each time | -| Default Value | 1000 | - -### maxNumOfOrderedRes - -| Attribute | Description | -| ------------- | ------------------------------------------- | -| Applicable | Server and Client | -| Meaning | Maximum number of rows ordered for a STable | -| Default Value | 100,000 | - -### mnodeEqualVnodeNum - -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The number of vnodes whose system resources consumption are considered as equal to single mnode | -| Default Value | 4 | - ### numOfCommitThreads -| Attribute | Description | -| ------------- | ----------------------------------------- | -| Applicable | Server Only | +| Attribute | Description | +| -------- | ---------------------- | +| Applicable | Server Only | | Meaning | Maximum of threads for committing to disk | -| Default Value | | +| Default Value | | ## Compression Parameters -### comp - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Whether data is compressed | -| Value Range | 0: uncompressed, 1: One phase compression, 2: Two phase compression | -| Default Value | 2 | - -### tsdbMetaCompactRatio - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------- | -| Meaning | The threshold for percentage of redundant in meta file to trigger compression for meta file | -| Value Range | 0: no compression forever, [1-100]: The threshold percentage | -| Default Value | 0 | - ### compressMsgSize -| Attribute | Description | -| ------------- | -------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The threshold for message size to compress the message.. | +| Attribute | Description | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Applicable | Server Only | +| Meaning | The threshold for message size to compress the message. | Set the value to 64330 bytes for good message compression. | | Unit | bytes | | Value Range | 0: already compress; >0: compress when message exceeds it; -1: always uncompress | -| Default Value | -1 | +| Default Value | -1 | ### compressColData -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The threshold for size of column data to trigger compression for the query result | +| Attribute | Description | +| -------- | --------------------------------------------------------------------------------------- | +| Applicable | Server Only | +| Meaning | The threshold for size of column data to trigger compression for the query result | | Unit | bytes | | Value Range | 0: always compress; >0: only compress when the size of any column data exceeds the threshold; -1: always uncompress | -| Default Value | -1 | -| Note | available from version 2.3.0.0 | - -### lossyColumns - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | The floating number types for lossy compression | -| Value Range | "": lossy compression is disabled
float: only for float
double: only for double
float \| double: for both float and double | -| Default Value | "" , i.e. disabled | - -### fPrecision - -| Attribute | Description | -| ------------- | ----------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Compression precision for float type | -| Value Range | 0.1 ~ 0.00000001 | -| Default Value | 0.00000001 | -| Note | The fractional part lower than this value will be discarded | - -### dPrecision - -| Attribute | Description | -| ------------- | ----------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Compression precision for double type | -| Value Range | 0.1 ~ 0.0000000000000001 | -| Default Value | 0.0000000000000001 | -| Note | The fractional part lower than this value will be discarded | - -## Continuous Query Parameters - -### stream - -| Attribute | Description | -| ------------- | ---------------------------------- | -| Applicable | Server Only | -| Meaning | Whether to enable continuous query | -| Value Range | 0: disabled
1: enabled | -| Default Value | 1 | - -### minSlidingTime - -| Attribute | Description | -| ------------- | -------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Minimum sliding time of time window | -| Unit | millisecond or microsecond , depending on time precision | -| Value Range | 10-1000000 | -| Default Value | 10 | - -### minIntervalTime - -| Attribute | Description | -| ------------- | --------------------------- | -| Applicable | Server Only | -| Meaning | Minimum size of time window | -| Unit | millisecond | -| Value Range | 1-1000000 | -| Default Value | 10 | - -### maxStreamCompDelay - -| Attribute | Description | -| ------------- | ------------------------------------------------ | -| Applicable | Server Only | -| Meaning | Maximum delay before starting a continuous query | -| Unit | millisecond | -| Value Range | 10-1000000000 | -| Default Value | 20000 | - -### maxFirstStreamCompDelay - -| Attribute | Description | -| ------------- | -------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Maximum delay time before starting a continuous query the first time | -| Unit | millisecond | -| Value Range | 10-1000000000 | -| Default Value | 10000 | - -### retryStreamCompDelay - -| Attribute | Description | -| ------------- | --------------------------------------------- | -| Applicable | Server Only | -| Meaning | Delay time before retrying a continuous query | -| Unit | millisecond | -| Value Range | 10-1000000000 | -| Default Value | 10 | - -### streamCompDelayRatio - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------ | -| Applicable | Server Only | -| Meaning | The delay ratio, with time window size as the base, for continuous query | -| Value Range | 0.1-0.9 | -| Default Value | 0.1 | - -:::info -To prevent system resource from being exhausted by multiple concurrent streams, a random delay is applied on each stream automatically. `maxFirstStreamCompDelay` is the maximum delay time before a continuous query is started the first time. `streamCompDelayRatio` is the ratio for calculating delay time, with the size of the time window as base. `maxStreamCompDelay` is the maximum delay time. The actual delay time is a random time not bigger than `maxStreamCompDelay`. If a continuous query fails, `retryStreamComDelay` is the delay time before retrying it, also not bigger than `maxStreamCompDelay`. - -::: - -## HTTP Parameters - -### http - -| Attribute | Description | -| ------------- | ------------------------------ | -| Applicable | Server Only | -| Meaning | Whether to enable http service | -| Value Range | 0: disabled, 1: enabled | -| Default Value | 1 | - -### httpEnableRecordSql - -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------- | -| Applicable | Server Only | -| Meaning | Whether to record the SQL invocation through REST interface | -| Default Value | 0: false; 1: true | -| Note | The resulting files, i.e. httpnote.0/httpnote.1, are located under logDir | - -### httpMaxThreads - -| Attribute | Description | -| ------------- | -------------------------------------------- | -| Applicable | Server Only | -| Meaning | The number of threads for RESTFul interface. | -| Default Value | 2 | - -### restfulRowLimit - -| Attribute | Description | -| ------------- | ------------------------------------------------------------ | -| Applicable | Server Only | -| Meaning | Maximum number of rows returned each time by REST interface. | -| Default Value | 10240 | -| Note | Maximum value is 10,000,000 | - -### httpDBNameMandatory - -| Attribute | Description | -| ------------- | ---------------------------------------- | -| Applicable | Server Only | -| Meaning | Whether database name is required in URL | -| Value Range | 0:not required, 1: required | -| Default Value | 0 | -| Note | From version 2.3.0.0 | +| Default Value | -1 | ## Log Parameters ### logDir -| Attribute | Description | -| ------------- | ----------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | -------------------------------------------------- | +| Applicable | Server and Client | | Meaning | The directory for writing log files | | Default Value | /var/log/taos | ### minimalLogDirGB -| Attribute | Description | -| ------------- | -------------------------------------------------------------------------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | -------------------------------------------- | +| Applicable | Server and Client | | Meaning | When the available disk space in logDir is below this threshold, writing to log files is suspended | -| Unit | GB | -| Default Value | 1.0 | +| Unit | GB | +| Default Value | 1.0 | ### numOfLogLines -| Attribute | Description | -| ------------- | ------------------------------------------ | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ---------------------------- | +| Applicable | Server and Client | | Meaning | Maximum number of lines in single log file | -| Default Value | 10,000,000 | +| Default Value | 10000000 | ### asyncLog -| Attribute | Description | -| ------------- | ---------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server and Client | | Meaning | The mode of writing log file | | Value Range | 0: sync way; 1: async way | -| Default Value | 1 | +| Default Value | 1 | ### logKeepDays -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ----------------------------------------------------------------------------------- | +| Applicable | Server and Client | | Meaning | The number of days for log files to be kept | -| Unit | day | -| Default Value | 0 | +| Unit | day | +| Default Value | 0 | | Note | When it's bigger than 0, the log file would be renamed to "taosdlog.xxx" in which "xxx" is the timestamp when the file is changed last time | ### debugFlag -| Attribute | Description | -| ------------- | --------------------------------------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| Applicable | Server and Client | | Meaning | Log level | | Value Range | 131: INFO/WARNING/ERROR; 135: plus DEBUG; 143: plus TRACE | | Default Value | 131 or 135, depending on the module | -### mDebugFlag - -| Attribute | Description | -| ------------- | ------------------ | -| Applicable | Server Only | -| Meaning | Log level of mnode | -| Value Range | same as debugFlag | -| Default Value | 135 | - -### dDebugFlag - -| Attribute | Description | -| ------------- | ------------------ | -| Applicable | Server and Client | -| Meaning | Log level of dnode | -| Value Range | same as debugFlag | -| Default Value | 135 | - -### sDebugFlag - -| Attribute | Description | -| ------------- | ------------------------ | -| Applicable | Server and Client | -| Meaning | Log level of sync module | -| Value Range | same as debugFlag | -| Default Value | 135 | - -### wDebugFlag - -| Attribute | Description | -| ------------- | ----------------------- | -| Applicable | Server and Client | -| Meaning | Log level of WAL module | -| Value Range | same as debugFlag | -| Default Value | 135 | - -### sdbDebugFlag - -| Attribute | Description | -| ------------- | ---------------------- | -| Applicable | Server and Client | -| Meaning | logLevel of sdb module | -| Value Range | same as debugFlag | -| Default Value | 135 | - -### rpcDebugFlag - -| Attribute | Description | -| ------------- | ----------------------- | -| Applicable | Server and Client | -| Meaning | Log level of rpc module | -| Value Range | Same as debugFlag | -| Default Value | | - ### tmrDebugFlag -| Attribute | Description | -| ------------- | ------------------------- | +| Attribute | Description | +| -------- | -------------------- | | Applicable | Server and Client | | Meaning | Log level of timer module | -| Value Range | Same as debugFlag | -| Default Value | | - -### cDebugFlag - -| Attribute | Description | -| ------------- | ------------------- | -| Applicable | Client Only | -| Meaning | Log level of Client | -| Value Range | Same as debugFlag | -| Default Value | | - -### jniDebugFlag - -| Attribute | Description | -| ------------- | ----------------------- | -| Applicable | Client Only | -| Meaning | Log level of jni module | -| Value Range | Same as debugFlag | -| Default Value | | - -### odbcDebugFlag - -| Attribute | Description | -| ------------- | ------------------------ | -| Applicable | Client Only | -| Meaning | Log level of odbc module | -| Value Range | Same as debugFlag | -| Default Value | | +| Value Range | same as debugFlag | +| Default Value | | ### uDebugFlag -| Attribute | Description | -| ------------- | -------------------------- | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | ---------------------- | +| Applicable | Server and Client | | Meaning | Log level of common module | -| Value Range | Same as debugFlag | -| Default Value | | | +| Value Range | same as debugFlag | +| Default Value | | -### mqttDebugFlag +### rpcDebugFlag -| Attribute | Description | -| ------------- | ------------------------ | -| Applicable | Server Only | -| Meaning | Log level of mqtt module | -| Value Range | Same as debugFlag | -| Default Value | | +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server and Client | +| Meaning | Log level of rpc module | +| Value Range | same as debugFlag | +| Default Value | | -### monitorDebugFlag +### jniDebugFlag -| Attribute | Description | -| ------------- | ------------------------------ | -| Applicable | Server Only | -| Meaning | Log level of monitoring module | -| Value Range | Same as debugFlag | -| Default Value | | +| Attribute | Description | +| -------- | ------------------ | +| Applicable | Client Only | +| Meaning | Log level of jni module | +| Value Range | same as debugFlag | +| Default Value | | ### qDebugFlag -| Attribute | Description | -| ------------- | ------------------------- | +| Attribute | Description | +| -------- | -------------------- | | Applicable | Server and Client | -| Meaning | Log level of query module | -| Value Range | Same as debugFlag | -| Default Value | | +| Meaning | Log level of query module | +| Value Range | same as debugFlag | +| Default Value | | + +### cDebugFlag + +| Attribute | Description | +| -------- | --------------------- | +| Applicable | Client Only | +| Meaning | Log level of Client | +| Value Range | same as debugFlag | +| Default Value | | + +### dDebugFlag + +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server Only | +| Meaning | Log level of dnode | +| Value Range | same as debugFlag | +| Default Value | 135 | ### vDebugFlag -| Attribute | Description | -| ------------- | ------------------ | -| Applicable | Server and Client | +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server Only | | Meaning | Log level of vnode | -| Value Range | Same as debugFlag | -| Default Value | | +| Value Range | same as debugFlag | +| Default Value | | + +### mDebugFlag + +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server Only | +| Meaning | Log level of mnode module | +| Value Range | same as debugFlag | +| Default Value | 135 | + +### wDebugFlag + +| Attribute | Description | +| -------- | ------------------ | +| Applicable | Server Only | +| Meaning | Log level of WAL module | +| Value Range | same as debugFlag | +| Default Value | 135 | + +### sDebugFlag + +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server and Client | +| Meaning | Log level of sync module | +| Value Range | same as debugFlag | +| Default Value | 135 | ### tsdbDebugFlag -| Attribute | Description | -| ------------- | ------------------------ | -| Applicable | Server Only | -| Meaning | Log level of TSDB module | -| Value Range | Same as debugFlag | -| Default Value | | +| Attribute | Description | +| -------- | ------------------- | +| Applicable | Server Only | +| Meaning | Log level of TSDB module | +| Value Range | same as debugFlag | +| Default Value | | -### cqDebugFlag +### tqDebugFlag | Attribute | Description | -| ------------- | ------------------------------------ | -| Applicable | Server and Client | -| Meaning | Log level of continuous query module | -| Value Range | Same as debugFlag | -| Default Value | | +| -------- | ----------------- | +| Applicable | Server only | +| Meaning | Log level of TQ module | +| Value Range | same as debugFlag | +| Default Value | | -## Client Only +### fsDebugFlag -### maxSQLLength +| Attribute | Description | +| -------- | ----------------- | +| Applicable | Server only | +| Meaning | Log level of FS module | +| Value Range | same as debugFlag | +| Default Value | | + +### udfDebugFlag | Attribute | Description | -| ------------- | -------------------------------------- | -| Applicable | Client Only | -| Meaning | Maximum length of single SQL statement | -| Unit | bytes | -| Value Range | 65480-1048576 | -| Default Value | 1048576 | +| -------- | ------------------ | +| Applicable | Server Only | +| Meaning | Log level of UDF module | +| Value Range | same as debugFlag | +| Default Value | | -### tscEnableRecordSql +### smaDebugFlag -| Attribute | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| Meaning | Whether to record SQL statements in file | -| Value Range | 0: false, 1: true | -| Default Value | 0 | -| Note | The generated files are named as "tscnote-xxxx.0/tscnote-xxx.1" in which "xxxx" is the pid of the client, and located at same place as client log | +| Attribute | Description | +| -------- | ------------------ | +| Applicable | Server Only | +| Meaning | Log level of SMA module | +| Value Range | same as debugFlag | +| Default Value | | -### maxBinaryDisplayWidth +### idxDebugFlag -| Attribute | Description | -| ------------- | --------------------------------------------------------------------------------------------------- | -| Meaning | Maximum display width of binary and nchar in taos shell. Anything beyond this limit would be hidden | -| Value Range | 5 - | -| Default Value | 30 | +| Attribute | Description | +| -------- | -------------------- | +| Applicable | Server Only | +| Meaning | Log level of index module | +| Value Range | same as debugFlag | +| Default Value | | -:::info -If the length of value exceeds `maxBinaryDisplayWidth`, then the actual display width is max(column name, maxBinaryDisplayLength); otherwise the actual display width is max(length of column name, length of column value). This parameter can also be changed dynamically using `set max_binary_display_width ` in TDengine CLI `taos`. +### tdbDebugFlag -::: +| Attribute | Description | +| -------- | ------------------ | +| Applicable | Server Only | +| Meaning | Log level of TDB module | +| Value Range | same as debugFlag | +| Default Value | | -### maxWildCardsLength +## Schemaless Parameters -| Attribute | Description | -| ------------- | ----------------------------------------------------- | -| Meaning | The maximum length for wildcard string used with LIKE | -| Unit | bytes | -| Value Range | 0-16384 | -| Default Value | 100 | -| Note | From version 2.1.6.1 | +### smlChildTableName -### clientMerge +| Attribute | Description | +| -------- | ------------------------- | +| Applicable | Client only | +| Meaning | Custom subtable name for schemaless writes | +| Type | String | +| Default Value | None | -| Attribute | Description | -| ------------- | --------------------------------------------------- | -| Meaning | Whether to filter out duplicate data on client side | -| Value Range | 0: false; 1: true | -| Default Value | 0 | -| Note | From version 2.3.0.0 | +### smlTagName -### maxRegexStringLen +| Attribute | Description | +| -------- | ------------------------------------ | +| Applicable | Client only | +| Meaning | Default tag for schemaless writes without tag value specified | +| Type | String | +| Default Value | _tag_null | + +### smlDataFormat | Attribute | Description | -| ------------- | ------------------------------------ | -| Meaning | Maximum length of regular expression | -| Value Range | [128, 16384] | -| Default Value | 128 | -| Note | From version 2.3.0.0 | +| -------- | ----------------------------- | +| Applicable | Client only | +| Meaning | Whether schemaless columns are consistently ordered | +| Value Range | 0: not consistent; 1: consistent. | +| Default | 1 | ## Other Parameters ### enableCoreFile -| Attribute | Description | -| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Attribute | Description | +| -------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | Applicable | Server and Client | | Meaning | Whether to generate core file when server crashes | | Value Range | 0: false, 1: true | | Default Value | 1 | | Note | The core file is generated under root directory `systemctl start taosd` is used to start, or under the working directory if `taosd` is started directly on Linux Shell. | + +### udf + +| Attribute | Description | +| -------- | ------------------ | +| Applicable | Server Only | +| Meaning | Whether the UDF service is enabled | +| Value Range | 0: disable UDF; 1: enabled UDF | +| Default Value | 1 | + +## Parameter Comparison of TDengine 2.x and 3.0 +| # | **Parameter** | **In 2.x** | **In 3.0** | +| --- | :-----------------: | --------------- | --------------- | +| 1 | firstEp | Yes | Yes | +| 2 | secondEp | Yes | Yes | +| 3 | fqdn | Yes | Yes | +| 4 | serverPort | Yes | Yes | +| 5 | maxShellConns | Yes | Yes | +| 6 | monitor | Yes | Yes | +| 7 | monitorFqdn | No | Yes | +| 8 | monitorPort | No | Yes | +| 9 | monitorInterval | Yes | Yes | +| 10 | monitorMaxLogs | No | Yes | +| 11 | monitorComp | No | Yes | +| 12 | telemetryReporting | Yes | Yes | +| 13 | telemetryInterval | No | Yes | +| 14 | telemetryServer | No | Yes | +| 15 | telemetryPort | No | Yes | +| 16 | queryPolicy | No | Yes | +| 17 | querySmaOptimize | No | Yes | +| 18 | queryBufferSize | Yes | Yes | +| 19 | maxNumOfDistinctRes | Yes | Yes | +| 20 | minSlidingTime | Yes | Yes | +| 21 | minIntervalTime | Yes | Yes | +| 22 | countAlwaysReturnValue | Yes | Yes | +| 23 | dataDir | Yes | Yes | +| 24 | minimalDataDirGB | Yes | Yes | +| 25 | supportVnodes | No | Yes | +| 26 | tempDir | Yes | Yes | +| 27 | minimalTmpDirGB | Yes | Yes | +| 28 | compressMsgSize | Yes | Yes | +| 29 | compressColData | Yes | Yes | +| 30 | smlChildTableName | Yes | Yes | +| 31 | smlTagName | Yes | Yes | +| 32 | smlDataFormat | No | Yes | +| 33 | statusInterval | Yes | Yes | +| 34 | shellActivityTimer | Yes | Yes | +| 35 | transPullupInterval | No | Yes | +| 36 | mqRebalanceInterval | No | Yes | +| 37 | ttlUnit | No | Yes | +| 38 | ttlPushInterval | No | Yes | +| 39 | numOfTaskQueueThreads | No | Yes | +| 40 | numOfRpcThreads | No | Yes | +| 41 | numOfCommitThreads | Yes | Yes | +| 42 | numOfMnodeReadThreads | No | Yes | +| 43 | numOfVnodeQueryThreads | No | Yes | +| 44 | numOfVnodeStreamThreads | No | Yes | +| 45 | numOfVnodeFetchThreads | No | Yes | +| 46 | numOfVnodeWriteThreads | No | Yes | +| 47 | numOfVnodeSyncThreads | No | Yes | +| 48 | numOfQnodeQueryThreads | No | Yes | +| 49 | numOfQnodeFetchThreads | No | Yes | +| 50 | numOfSnodeSharedThreads | No | Yes | +| 51 | numOfSnodeUniqueThreads | No | Yes | +| 52 | rpcQueueMemoryAllowed | No | Yes | +| 53 | logDir | Yes | Yes | +| 54 | minimalLogDirGB | Yes | Yes | +| 55 | numOfLogLines | Yes | Yes | +| 56 | asyncLog | Yes | Yes | +| 57 | logKeepDays | Yes | Yes | +| 58 | debugFlag | Yes | Yes | +| 59 | tmrDebugFlag | Yes | Yes | +| 60 | uDebugFlag | Yes | Yes | +| 61 | rpcDebugFlag | Yes | Yes | +| 62 | jniDebugFlag | Yes | Yes | +| 63 | qDebugFlag | Yes | Yes | +| 64 | cDebugFlag | Yes | Yes | +| 65 | dDebugFlag | Yes | Yes | +| 66 | vDebugFlag | Yes | Yes | +| 67 | mDebugFlag | Yes | Yes | +| 68 | wDebugFlag | Yes | Yes | +| 69 | sDebugFlag | Yes | Yes | +| 70 | tsdbDebugFlag | Yes | Yes | +| 71 | tqDebugFlag | No | Yes | +| 72 | fsDebugFlag | Yes | Yes | +| 73 | udfDebugFlag | No | Yes | +| 74 | smaDebugFlag | No | Yes | +| 75 | idxDebugFlag | No | Yes | +| 76 | tdbDebugFlag | No | Yes | +| 77 | metaDebugFlag | No | Yes | +| 78 | timezone | Yes | Yes | +| 79 | locale | Yes | Yes | +| 80 | charset | Yes | Yes | +| 81 | udf | Yes | Yes | +| 82 | enableCoreFile | Yes | Yes | +| 83 | arbitrator | Yes | No | +| 84 | numOfThreadsPerCore | Yes | No | +| 85 | numOfMnodes | Yes | No | +| 86 | vnodeBak | Yes | No | +| 87 | balance | Yes | No | +| 88 | balanceInterval | Yes | No | +| 89 | offlineThreshold | Yes | No | +| 90 | role | Yes | No | +| 91 | dnodeNopLoop | Yes | No | +| 92 | keepTimeOffset | Yes | No | +| 93 | rpcTimer | Yes | No | +| 94 | rpcMaxTime | Yes | No | +| 95 | rpcForceTcp | Yes | No | +| 96 | tcpConnTimeout | Yes | No | +| 97 | syncCheckInterval | Yes | No | +| 98 | maxTmrCtrl | Yes | No | +| 99 | monitorReplica | Yes | No | +| 100 | smlTagNullName | Yes | No | +| 101 | keepColumnName | Yes | No | +| 102 | ratioOfQueryCores | Yes | No | +| 103 | maxStreamCompDelay | Yes | No | +| 104 | maxFirstStreamCompDelay | Yes | No | +| 105 | retryStreamCompDelay | Yes | No | +| 106 | streamCompDelayRatio | Yes | No | +| 107 | maxVgroupsPerDb | Yes | No | +| 108 | maxTablesPerVnode | Yes | No | +| 109 | minTablesPerVnode | Yes | No | +| 110 | tableIncStepPerVnode | Yes | No | +| 111 | cache | Yes | No | +| 112 | blocks | Yes | No | +| 113 | days | Yes | No | +| 114 | keep | Yes | No | +| 115 | minRows | Yes | No | +| 116 | maxRows | Yes | No | +| 117 | quorum | Yes | No | +| 118 | comp | Yes | No | +| 119 | walLevel | Yes | No | +| 120 | fsync | Yes | No | +| 121 | replica | Yes | No | +| 122 | partitions | Yes | No | +| 123 | quorum | Yes | No | +| 124 | update | Yes | No | +| 125 | cachelast | Yes | No | +| 126 | maxSQLLength | Yes | No | +| 127 | maxWildCardsLength | Yes | No | +| 128 | maxRegexStringLen | Yes | No | +| 129 | maxNumOfOrderedRes | Yes | No | +| 130 | maxConnections | Yes | No | +| 131 | mnodeEqualVnodeNum | Yes | No | +| 132 | http | Yes | No | +| 133 | httpEnableRecordSql | Yes | No | +| 134 | httpMaxThreads | Yes | No | +| 135 | restfulRowLimit | Yes | No | +| 136 | httpDbNameMandatory | Yes | No | +| 137 | httpKeepAlive | Yes | No | +| 138 | enableRecordSql | Yes | No | +| 139 | maxBinaryDisplayWidth | Yes | No | +| 140 | stream | Yes | No | +| 141 | retrieveBlockingModel | Yes | No | +| 142 | tsdbMetaCompactRatio | Yes | No | +| 143 | defaultJSONStrType | Yes | No | +| 144 | walFlushSize | Yes | No | +| 145 | keepTimeOffset | Yes | No | +| 146 | flowctrl | Yes | No | +| 147 | slaveQuery | Yes | No | +| 148 | adjustMaster | Yes | No | +| 149 | topicBinaryLen | Yes | No | +| 150 | telegrafUseFieldNum | Yes | No | +| 151 | deadLockKillQuery | Yes | No | +| 152 | clientMerge | Yes | No | +| 153 | sdbDebugFlag | Yes | No | +| 154 | odbcDebugFlag | Yes | No | +| 155 | httpDebugFlag | Yes | No | +| 156 | monDebugFlag | Yes | No | +| 157 | cqDebugFlag | Yes | No | +| 158 | shortcutFlag | Yes | No | +| 159 | probeSeconds | Yes | No | +| 160 | probeKillSeconds | Yes | No | +| 161 | probeInterval | Yes | No | +| 162 | lossyColumns | Yes | No | +| 163 | fPrecision | Yes | No | +| 164 | dPrecision | Yes | No | +| 165 | maxRange | Yes | No | +| 166 | range | Yes | No | diff --git a/docs/en/14-reference/13-schemaless/13-schemaless.md b/docs/en/14-reference/13-schemaless/13-schemaless.md index 8b6a26ae52..816ebe0047 100644 --- a/docs/en/14-reference/13-schemaless/13-schemaless.md +++ b/docs/en/14-reference/13-schemaless/13-schemaless.md @@ -3,7 +3,8 @@ title: Schemaless Writing description: "The Schemaless write method eliminates the need to create super tables/sub tables in advance and automatically creates the storage structure corresponding to the data, as it is written to the interface." --- -In IoT applications, data is collected for many purposes such as intelligent control, business analysis, device monitoring and so on. Due to changes in business or functional requirements or changes in device hardware, the application logic and even the data collected may change. To provide the flexibility needed in such cases and in a rapidly changing IoT landscape, TDengine provides a series of interfaces for the schemaless writing method. These interfaces eliminate the need to create super tables and subtables in advance by automatically creating the storage structure corresponding to the data as the data is written to the interface. When necessary, schemaless writing will automatically add the required columns to ensure that the data written by the user is stored correctly. +In IoT applications, data is collected for many purposes such as intelligent control, business analysis, device monitoring and so on. Due to changes in business or functional requirements or changes in device hardware, the application logic and even the data collected may change. Schemaless writing automatically creates storage structures for your data as it is being written to TDengine, so that you do not need to create supertables in advance. When necessary, schemaless writing +will automatically add the required columns to ensure that the data written by the user is stored correctly. The schemaless writing method creates super tables and their corresponding subtables. These are completely indistinguishable from the super tables and subtables created directly via SQL. You can write data directly to them via SQL statements. Note that the names of tables created by schemaless writing are based on fixed mapping rules for tag values, so they are not explicitly ideographic and they lack readability. @@ -19,12 +20,12 @@ With the following formatting conventions, schemaless writing uses a single stri measurement,tag_set field_set timestamp ``` -where : +where: - measurement will be used as the data table name. It will be separated from tag_set by a comma. -- tag_set will be used as tag data in the format `=,=`, i.e. multiple tags' data can be separated by a comma. It is separated from field_set by space. -- field_set will be used as normal column data in the format of `=,=`, again using a comma to separate multiple normal columns of data. It is separated from the timestamp by a space. -- The timestamp is the primary key corresponding to the data in this row. +- `tag_set` will be used as tags, with format like `=,=` Enter a space between `tag_set` and `field_set`. +- `field_set`will be used as data columns, with format like `=,=` Enter a space between `field_set` and `timestamp`. +- `timestamp` is the primary key timestamp corresponding to this row of data All data in tag_set is automatically converted to the NCHAR data type and does not require double quotes ("). @@ -37,16 +38,18 @@ In the schemaless writing data line protocol, each data item in the field_set ne | **Serial number** | **Postfix** | **Mapping type** | **Size (bytes)** | | -------- | -------- | ------------ | -------------- | -| 1 | none or f64 | double | 8 | -| 2 | f32 | float | 4 | -| 3 | i8/u8 | TinyInt/UTinyInt | 1 | -| 4 | i16/u16 | SmallInt/USmallInt | 2 | -| 5 | i32/u32 | Int/UInt | 4 | -| 6 | i64/i/u64/u | Bigint/Bigint/UBigint/UBigint | 8 | +| 1 | None or f64 | double | 8 | +| 2 | f32 | float | 4 | +| 3 | i8/u8 | TinyInt/UTinyInt | 1 | +| 4 | i16/u16 | SmallInt/USmallInt | 2 | +| 5 | i32/u32 | Int/UInt | 4 | +| 6 | i64/i/u64/u | BigInt/BigInt/UBigInt/UBigInt | 8 | - `t`, `T`, `true`, `True`, `TRUE`, `f`, `F`, `false`, and `False` will be handled directly as BOOL types. -For example, the following data rows indicate that the t1 label is "3" (NCHAR), the t2 label is "4" (NCHAR), and the t3 label is "t3" to the super table named `st` labeled "t3" (NCHAR), write c1 column as 3 (BIGINT), c2 column as false (BOOL), c3 column is "passit" (BINARY), c4 column is 4 (DOUBLE), and the primary key timestamp is 1626006833639000000 in one row. +For example, the following data rows indicate that the t1 label is "3" (NCHAR), the t2 label is "4" (NCHAR), and the t3 label +is "t3" to the super table named `st` labeled "t3" (NCHAR), write c1 column as 3 (BIGINT), c2 column as false (BOOL), c3 column +is "passit" (BINARY), c4 column is 4 (DOUBLE), and the primary key timestamp is 1626006833639000000 in one row. ```json st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000 @@ -65,18 +68,22 @@ Schemaless writes process row data according to the following principles. ``` Note that tag_key1, tag_key2 are not the original order of the tags entered by the user but the result of using the tag names in ascending order of the strings. Therefore, tag_key1 is not the first tag entered in the line protocol. -The string's MD5 hash value "md5_val" is calculated after the ranking is completed. The calculation result is then combined with the string to generate the table name: "t_md5_val". "t*" is a fixed prefix that every table generated by this mapping relationship has. +The string's MD5 hash value "md5_val" is calculated after the ranking is completed. The calculation result is then combined with the string to generate the table name: "t_md5_val". "t_" is a fixed prefix that every table generated by this mapping relationship has. +You can configure smlChildTableName to specify table names, for example, `smlChildTableName=tname`. You can insert `st,tname=cpul,t1=4 c1=3 1626006833639000000` and the cpu1 table will be automatically created. Note that if multiple rows have the same tname but different tag_set values, the tag_set of the first row is used to create the table and the others are ignored. 2. If the super table obtained by parsing the line protocol does not exist, this super table is created. -If the subtable obtained by the parse line protocol does not exist, Schemaless creates the sub-table according to the subtable name determined in steps 1 or 2. +3. If the subtable obtained by the parse line protocol does not exist, Schemaless creates the sub-table according to the subtable name determined in steps 1 or 2. 4. If the specified tag or regular column in the data row does not exist, the corresponding tag or regular column is added to the super table (only incremental). -5. If there are some tag columns or regular columns in the super table that are not specified to take values in a data row, then the values of these columns are set to NULL. +5. If there are some tag columns or regular columns in the super table that are not specified to take values in a data row, then the values of these columns are set to + NULL. 6. For BINARY or NCHAR columns, if the length of the value provided in a data row exceeds the column type limit, the maximum length of characters allowed to be stored in the column is automatically increased (only incremented and not decremented) to ensure complete preservation of the data. 7. Errors encountered throughout the processing will interrupt the writing process and return an error code. -8. In order to improve the efficiency of writing, it is assumed by default that the order of the fields in the same Super is the same (the first data contains all fields, and the following data is in this order). If the order is different, the parameter smlDataFormat needs to be configured to be false. Otherwise, the data is written in the same order, and the data in the library will be abnormal. +8. It is assumed that the order of field_set in a supertable is consistent, meaning that the first record contains all fields and subsequent records store fields in the same order. If the order is not consistent, set smlDataFormat to false. Otherwise, data will be written out of order and a database error will occur. :::tip -All processing logic of schemaless will still follow TDengine's underlying restrictions on data structures, such as the total length of each row of data cannot exceed 16k bytes. See [TAOS SQL Boundary Limits](/taos-sql/limit) for specific constraints in this area. +All processing logic of schemaless will still follow TDengine's underlying restrictions on data structures, such as the total length of each row of data cannot exceed +16KB. See [TAOS SQL Boundary Limits](/taos-sql/limit) for specific constraints in this area. + ::: ## Time resolution recognition @@ -85,75 +92,74 @@ Three specified modes are supported in the schemaless writing process, as follow | **Serial** | **Value** | **Description** | | -------- | ------------------- | ------------------------------- | -| 1 | SML_LINE_PROTOCOL | InfluxDB Line Protocol | -| 2 | SML_TELNET_PROTOCOL | OpenTSDB Text Line Protocol | -| 3 | SML_JSON_PROTOCOL | JSON protocol format | +| 1 | SML_LINE_PROTOCOL | InfluxDB Line Protocol | +| 2 | SML_TELNET_PROTOCOL | OpenTSDB file protocol | +| 3 | SML_JSON_PROTOCOL | OpenTSDB JSON protocol | -In the SML_LINE_PROTOCOL parsing mode, the user is required to specify the time resolution of the input timestamp. The available time resolutions are shown in the following table. +In InfluxDB line protocol mode, you must specify the precision of the input timestamp. Valid precisions are described in the following table. -| **Serial Number** | **Time Resolution Definition** | **Meaning** | +| **No.** | **Precision** | **Description** | | -------- | --------------------------------- | -------------- | -| 1 | TSDB_SML_TIMESTAMP_NOT_CONFIGURED | Not defined (invalid) | -| 2 | TSDB_SML_TIMESTAMP_HOURS | hour | -| 3 | TSDB_SML_TIMESTAMP_MINUTES | MINUTES -| 4 | TSDB_SML_TIMESTAMP_SECONDS | SECONDS -| 5 | TSDB_SML_TIMESTAMP_MILLI_SECONDS | milliseconds -| 6 | TSDB_SML_TIMESTAMP_MICRO_SECONDS | microseconds -| 7 | TSDB_SML_TIMESTAMP_NANO_SECONDS | nanoseconds | +| 1 | TSDB_SML_TIMESTAMP_NOT_CONFIGURED | Not defined (invalid) | +| 2 | TSDB_SML_TIMESTAMP_HOURS | Hours | +| 3 | TSDB_SML_TIMESTAMP_MINUTES | Minutes | +| 4 | TSDB_SML_TIMESTAMP_SECONDS | Seconds | +| 5 | TSDB_SML_TIMESTAMP_MILLI_SECONDS | Milliseconds | +| 6 | TSDB_SML_TIMESTAMP_MICRO_SECONDS | Microseconds | +| 7 | TSDB_SML_TIMESTAMP_NANO_SECONDS | Nanoseconds | -In SML_TELNET_PROTOCOL and SML_JSON_PROTOCOL modes, the time precision is determined based on the length of the timestamp (in the same way as the OpenTSDB standard operation), and the user-specified time resolution is ignored at this point. +In OpenTSDB file and JSON protocol modes, the precision of the timestamp is determined from its length in the standard OpenTSDB manner. User input is ignored. -## Data schema mapping rules +## Data Model Mapping -This section describes how data for line protocols are mapped to data with a schema. The data measurement in each line protocol is mapped as follows: -- The tag name in tag_set is the name of the tag in the data schema -- The name in field_set is the column's name. - -The following data is used as an example to illustrate the mapping rules. +This section describes how data in line protocol is mapped to a schema. The data measurement in each line is mapped to a +supertable name. The tag name in tag_set is the tag name in the schema, and the name in field_set is the column name in the schema. The following example shows how data is mapped: ```json st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000 ``` -The row data mapping generates a super table: `st`, which contains three labels of type NCHAR: t1, t2, t3. Five data columns are ts (timestamp), c1 (bigint), c3 (binary), c2 (bool), c4 (bigint). The mapping becomes the following SQL statement. +This row is mapped to a supertable: `st` contains three NCHAR tags: t1, t2, and t3. Five columns are created: ts (timestamp), c1 (bigint), c3 (binary), c2 (bool), and c4 (bigint). The following SQL statement is generated: ```json create stable st (_ts timestamp, c1 bigint, c2 bool, c3 binary(6), c4 bigint) tags(t1 nchar(1), t2 nchar(1), t3 nchar(2)) ``` -## Data schema change handling +## Processing Schema Changes -This section describes the impact on the data schema for different line protocol data writing cases. +This section describes the impact on the schema caused by different data being written. -When writing to an explicitly identified field type using the line protocol, subsequent changes to the field's type definition will result in an explicit data schema error, i.e., will trigger a write API report error. As shown below, the +If you use line protocol to write to a specific tag field and then later change the field type, a schema error will ocur. This triggers an error on the write API. This is shown as follows: ```json -st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4 1626006833639000000 -st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4i 1626006833640000000 +st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4 1626006833639000000 +st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4i 1626006833640000000 ``` -The data type mapping in the first row defines column c4 as DOUBLE, but the data in the second row is declared as BIGINT by the numeric suffix, which triggers a parsing error with schemaless writing. +The first row defines c4 as a double. However, in the second row, the suffix indicates that the value of c4 is a bigint. This causes schemaless writing to throw an error. -If the line protocol before the column declares the data column as BINARY, the subsequent one requires a longer binary length, which triggers a super table schema change. +An error also occurs if data input into a binary column exceeds the defined length of the column. ```json -st,t1=3,t2=4,t3=t3 c1=3i64,c5="pass" 1626006833639000000 -st,t1=3,t2=4,t3=t3 c1=3i64,c5="passit" 1626006833640000000 +st,t1=3,t2=4,t3=t3 c1=3i64,c5="pass" 1626006833639000000 +st,t1=3,t2=4,t3=t3 c1=3i64,c5="passit" 1626006833640000000 ``` -The first line of the line protocol parsing will declare column c5 is a BINARY(4) field. The second line data write will parse column c5 as a BINARY column. But in the second line, c5's width is 6 so you need to increase the width of the BINARY field to be able to accommodate the new string. +The first row defines c5 as a binary(4). but the second row writes 6 bytes to it. This means that the length of the binary column must be expanded to contain the data. ```json -st,t1=3,t2=4,t3=t3 c1=3i64 1626006833639000000 -st,t1=3,t2=4,t3=t3 c1=3i64,c6="passit" 1626006833640000000 +st,t1=3,t2=4,t3=t3 c1=3i64 1626006833639000000 +st,t1=3,t2=4,t3=t3 c1=3i64,c6="passit" 1626006833640000000 ``` -The second line of data has an additional column c6 of type BINARY(6) compared to the first row. Then a column c6 of type BINARY(6) is automatically added at this point. +The preceding data includes a new entry, c6, with type binary(6). When this occurs, a new column c6 with type binary(6) is added automatically. -## Write integrity +## Write Integrity -TDengine provides idempotency guarantees for data writing, i.e., you can repeatedly call the API to write data with errors. However, it does not give atomicity guarantees for writing multiple rows of data. During the process of writing numerous rows of data in one batch, some data will be written successfully, and some data will fail. +TDengine guarantees the idempotency of data writes. This means that you can repeatedly call the API to perform write operations with bad data. However, TDengine does not guarantee the atomicity of multi-row writes. In a multi-row write, some data may be written successfully and other data unsuccessfully. -## Error code +##: Error Codes -If it is an error in the data itself during the schemaless writing process, the application will get `TSDB_CODE_TSC_LINE_SYNTAX_ERROR` error message, which indicates that the error occurred in writing. The other error codes are consistent with the TDengine and can be obtained via the `taos_errstr()` to get the specific cause of the error. +The TSDB_CODE_TSC_LINE_SYNTAX_ERROR indicates an error in the schemaless writing component. +This error occurs when writing text. For other errors, schemaless writing uses the standard TDengine error codes +found in taos_errstr. diff --git a/docs/en/20-third-party/01-grafana.mdx b/docs/en/20-third-party/01-grafana.mdx index 5dbeb31a23..e0fbefd5a8 100644 --- a/docs/en/20-third-party/01-grafana.mdx +++ b/docs/en/20-third-party/01-grafana.mdx @@ -6,9 +6,7 @@ title: Grafana import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -TDengine can be quickly integrated with the open-source data visualization system [Grafana](https://www.grafana.com/) to build a data monitoring and alerting system. The whole process does not require any code development. And you can visualize the contents of the data tables in TDengine on a dashboard. - -You can learn more about using the TDengine plugin on [GitHub](https://github.com/taosdata/grafanaplugin/blob/master/README.md). +TDengine can be quickly integrated with the open-source data visualization system [Grafana](https://www.grafana.com/) to build a data monitoring and alerting system. The whole process does not require any code development. And you can visualize the contents of the data tables in TDengine on a dashboard. You can learn more about using the TDengine plugin on [GitHub](https://github.com/taosdata/grafanaplugin/blob/master/README.md). ## Prerequisites @@ -65,7 +63,6 @@ Restart Grafana service and open Grafana in web-browser, usually - Follow the installation steps in [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) with the [``grafana-cli`` command-line tool](https://grafana.com/docs/grafana/latest/administration/cli/) for plugin installation. @@ -76,7 +73,7 @@ grafana-cli plugins install tdengine-datasource sudo -u grafana grafana-cli plugins install tdengine-datasource ``` -Alternatively, you can manually download the .zip file from [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) or [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) and unpack it into your grafana plugins directory. +You can also download zip files from [GitHub](https://github.com/taosdata/grafanaplugin/releases/tag/latest) or [Grafana](https://grafana.com/grafana/plugins/tdengine-datasource/?tab=installation) and install manually. The commands are as follows: ```bash GF_VERSION=3.2.2 @@ -131,7 +128,7 @@ docker run -d \ grafana/grafana ``` -You can setup a zero-configuration stack for TDengine + Grafana by [docker-compose](https://docs.docker.com/compose/) and [Grafana provisioning](https://grafana.com/docs/grafana/latest/administration/provisioning/) file: +You can setup a zero-configuration stack for TDengine + Grafana by [docker-compose](https://docs.docker.com/compose/) and [Grafana provisioning](https://grafana.com/docs/grafana/latest/administration/provisioning/) file: 1. Save the provisioning configuration file to `tdengine.yml`. @@ -196,7 +193,7 @@ Go back to the main interface to create a dashboard and click Add Query to enter As shown above, select the `TDengine` data source in the `Query` and enter the corresponding SQL in the query box below for query. -- INPUT SQL: enter the statement to be queried (the result set of the SQL statement should be two columns and multiple rows), for example: `select avg(mem_system) from log.dn where ts >= $from and ts < $to interval($interval)`, where, from, to and interval are built-in variables of the TDengine plugin, indicating the range and time interval of queries fetched from the Grafana plugin panel. In addition to the built-in variables, custom template variables are also supported. +- INPUT SQL: Enter the desired query (the results being two columns and multiple rows), such as `select _wstart, avg(mem_system) from log.dnodes_info where ts >= $from and ts < $to interval($interval)`. In this statement, $from, $to, and $interval are variables that Grafana replaces with the query time range and interval. In addition to the built-in variables, custom template variables are also supported. - ALIAS BY: This allows you to set the current query alias. - GENERATE SQL: Clicking this button will automatically replace the corresponding variables and generate the final executed statement. @@ -208,7 +205,11 @@ Follow the default prompt to query the average system memory usage for the speci ### Importing the Dashboard -You can install TDinsight dashboard in data source configuration page (like `http://localhost:3000/datasources/edit/1/dashboards`) as a monitoring visualization tool for TDengine cluster. The dashboard is published in Grafana as [Dashboard 15167 - TDinsight](https://grafana.com/grafana/dashboards/15167). Check the [TDinsight User Manual](/reference/tdinsight/) for the details. +You can install TDinsight dashboard in data source configuration page (like `http://localhost:3000/datasources/edit/1/dashboards`) as a monitoring visualization tool for TDengine cluster. Ensure that you use TDinsight for 3.x. + +![TDengine Database Grafana plugine import dashboard](./import_dashboard.webp) + +A dashboard for TDengine 2.x has been published on Grafana: [Dashboard 15167 - TDinsight](https://grafana.com/grafana/dashboards/15167)) 。 Check the [TDinsight User Manual](/reference/tdinsight/) for the details. For more dashboards using TDengine data source, [search here in Grafana](https://grafana.com/grafana/dashboards/?dataSource=tdengine-datasource). Here is a sub list: diff --git a/docs/en/20-third-party/06-statsd.md b/docs/en/20-third-party/06-statsd.md index 1cddbcf63d..32b1bbb97a 100644 --- a/docs/en/20-third-party/06-statsd.md +++ b/docs/en/20-third-party/06-statsd.md @@ -1,6 +1,6 @@ --- sidebar_label: StatsD -title: StatsD writing +title: StatsD Writing --- import StatsD from "../14-reference/_statsd.mdx" @@ -12,8 +12,8 @@ You can write StatsD data to TDengine by simply modifying the configuration file ## Prerequisites To write StatsD data to TDengine requires the following preparations. -- The TDengine cluster has been deployed and is working properly -- taosAdapter is installed and running properly. Please refer to the [taosAdapter manual](/reference/taosadapter) for details. +1. The TDengine cluster is deployed and functioning properly +2. taosAdapter is installed and running properly. Please refer to the taosAdapter manual for details. - StatsD has been installed. To install StatsD, please refer to [official documentation](https://github.com/statsd/statsd) ## Configuration steps @@ -39,8 +39,12 @@ $ echo "foo:1|c" | nc -u -w0 127.0.0.1 8125 Use the TDengine CLI to verify that StatsD data is written to TDengine and can read out correctly. ``` -Welcome to the TDengine shell from Linux, Client Version:3.0.0.0 -Copyright (c) 2022 by TAOS Data, Inc. All rights reserved. +taos> show databases; + name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | +==================================================================================================================================================================================================================================================================================== + log | 2022-04-20 07:19:50.260 | 11 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ms | 0 | ready | + statsd | 2022-04-20 09:54:51.220 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready | +Query OK, 2 row(s) in set (0.003142s) taos> use statsd; Database changed. diff --git a/docs/en/20-third-party/10-hive-mq-broker.md b/docs/en/20-third-party/10-hive-mq-broker.md index 333e00fa0e..828a62ac5b 100644 --- a/docs/en/20-third-party/10-hive-mq-broker.md +++ b/docs/en/20-third-party/10-hive-mq-broker.md @@ -1,6 +1,6 @@ --- sidebar_label: HiveMQ Broker -title: HiveMQ Broker writing +title: HiveMQ Broker Writing --- -[HiveMQ](https://www.hivemq.com/) is an MQTT broker that provides community and enterprise editions. HiveMQ is mainly for enterprise emerging machine-to-machine M2M communication and internal transport, meeting scalability, ease of management, and security features. HiveMQ provides an open-source plug-in development kit. MQTT data can be saved to TDengine via TDengine extension for HiveMQ. Please refer to the [HiveMQ extension - TDengine documentation](https://github.com/huskar-t/hivemq-tdengine-extension/blob/b62a26ecc164a310104df57691691b237e091c89/README_EN.md) for details on how to use it. \ No newline at end of file +[HiveMQ](https://www.hivemq.com/) is an MQTT broker that provides community and enterprise editions. HiveMQ is mainly for enterprise emerging machine-to-machine M2M communication and internal transport, meeting scalability, ease of management, and security features. HiveMQ provides an open-source plug-in development kit. MQTT data can be saved to TDengine via TDengine extension for HiveMQ. For more information, see [HiveMQ TDengine Extension](https://github.com/huskar-t/hivemq-tdengine-extension/blob/b62a26ecc164a310104df57691691b237e091c89/README_EN.md). diff --git a/docs/en/27-train-faq/01-faq.md b/docs/en/27-train-faq/01-faq.md index c10bca1d05..733b418474 100644 --- a/docs/en/27-train-faq/01-faq.md +++ b/docs/en/27-train-faq/01-faq.md @@ -1,114 +1,163 @@ --- -sidebar_label: FAQ title: Frequently Asked Questions --- ## Submit an Issue -If the tips in FAQ don't help much, please submit an issue on [GitHub](https://github.com/taosdata/TDengine) to describe your problem. In your description please include the TDengine version, hardware and OS information, the steps to reproduce the problem and any other relevant information. It would be very helpful if you can package the contents in `/var/log/taos` and `/etc/taos` and upload. These two are the default directories used by TDengine. If you have changed the default directories in your configuration, please package the files in your configured directories. We recommended setting `debugFlag` to 135 in `taos.cfg`, restarting `taosd`, then reproducing the problem and collecting the logs. If you don't want to restart, an alternative way of setting `debugFlag` is executing `alter dnode debugFlag 135` command in TDengine CLI `taos`. During normal running, however, please make sure `debugFlag` is set to 131. +If your issue could not be resolved by reviewing this documentation, you can submit your issue on GitHub and receive support from the TDengine Team. When you submit an issue, attach the following directories from your TDengine deployment: + +1. The directory containing TDengine logs (`/var/log/taos` by default) +2. The directory containing TDengine configuration files (`/etc/taos` by default) + +In your GitHub issue, provide the version of TDengine and the operating system and environment for your deployment, the operations that you performed when the issue occurred, and the time of occurrence and affected tables. + +To obtain more debugging information, open `taos.cfg` and set the `debugFlag` parameter to `135`. Then restart TDengine Server and reproduce the issue. The debug-level logs generated help the TDengine Team to resolve your issue. If it is not possible to restart TDengine Server, you can run the following command in the TDengine CLI to set the debug flag: + +``` + alter dnode 'debugFlag' '135'; +``` + +You can run the `SHOW DNODES` command to determine the dnode ID. + +When debugging information is no longer needed, set `debugFlag` to 131. ## Frequently Asked Questions -### 1. How to upgrade to TDengine 2.0 from older version? +### 1. What are the best practices for upgrading a previous version of TDengine to version 3.0? -version 2.x is not compatible with version 1.x. With regard to the configuration and data files, please perform the following steps before upgrading. Please follow data integrity, security, backup and other relevant SOPs, best practices before removing/deleting any data. +TDengine 3.0 is not compatible with the configuration and data files from previous versions. Before upgrading, perform the following steps: -1. Delete configuration files: `sudo rm -rf /etc/taos/taos.cfg` -2. Delete log files: `sudo rm -rf /var/log/taos/` -3. Delete data files if the data doesn't need to be kept: `sudo rm -rf /var/lib/taos/` -4. Install latest 2.x version -5. If the data needs to be kept and migrated to newer version, please contact professional service at TDengine for assistance. +1. Run `sudo rm -rf /etc/taos/taos.cfg` to delete your configuration file. +2. Run `sudo rm -rf /var/log/taos/` to delete your log files. +3. Run `sudo rm -rf /var/lib/taos/` to delete your data files. +4. Install TDengine 3.0. +5. For assistance in migrating data to TDengine 3.0, contact [TDengine Support](https://tdengine.com/support). -### 2. How to handle "Unable to establish connection"? +### 4. How can I resolve the "Unable to establish connection" error? -When the client is unable to connect to the server, you can try the following ways to troubleshoot and resolve the problem. +This error indicates that the client could not connect to the server. Perform the following troubleshooting steps: -1. Check the network +1. Check the network. - - Check if the hosts where the client and server are running are accessible to each other, for example by `ping` command. - - Check if the TCP/UDP on port 6030-6042 are open for access if firewall is enabled. If possible, disable the firewall for diagnostics, but please ensure that you are following security and other relevant protocols. - - Check if the FQDN and serverPort are configured correctly in `taos.cfg` used by the server side. - - Check if the `firstEp` is set properly in the `taos.cfg` used by the client side. + - For machines deployed in the cloud, verify that your security group can access ports 6030 and 6031 (TCP and UDP). + - For virtual machines deployed locally, verify that the hosts where the client and server are running are accessible to each other. Do not use localhost as the hostname. + - For machines deployed on a corporate network, verify that your NAT configuration allows the server to respond to the client. -2. Make sure the client version and server version are same. +2. Verify that the client and server are running the same version of TDengine. -3. On server side, check the running status of `taosd` by executing `systemctl status taosd` . If your server is started using another way instead of `systemctl`, use the proper method to check whether the server process is running normally. +3. On the server, run `systemctl status taosd` to verify that taosd is running normally. If taosd is stopped, run `systemctl start taosd`. -4. If using connector of Python, Java, Go, Rust, C#, node.JS on Linux to connect to the server, please make sure `libtaos.so` is in directory `/usr/local/taos/driver` and `/usr/local/taos/driver` is in system lib search environment variable `LD_LIBRARY_PATH`. +4. Verify that the client is configured with the correct FQDN for the server. -5. If using connector on Windows, please make sure `C:\TDengine\driver\taos.dll` is in your system lib search path. We recommend putting `taos.dll` under `C:\Windows\System32`. +5. If the server cannot be reached with the `ping` command, verify that network and DNS or hosts file settings are correct. For a TDengine cluster, the client must be able to ping the FQDN of every node in the cluster. -6. Some advanced network diagnostics tools +6. Verify that your firewall settings allow all hosts in the cluster to communicate on ports 6030 and 6041 (TCP and UDP). You can run `ufw status` (Ubuntu) or `firewall-cmd --list-port` (CentOS) to check the configuration. - - On Linux system tool `nc` can be used to check whether the TCP/UDP can be accessible on a specified port - Check whether a UDP port is open: `nc -vuz {hostIP} {port} ` - Check whether a TCP port on server side is open: `nc -l {port}` - Check whether a TCP port on client side is open: `nc {hostIP} {port}` +7. If you are using the Python, Java, Go, Rust, C#, or Node.js connector on Linux to connect to the server, verify that `libtaos.so` is in the `/usr/local/taos/driver` directory and `/usr/local/taos/driver` is in the `LD_LIBRARY_PATH` environment variable. - - On Windows system `Test-NetConnection -ComputerName {fqdn} -Port {port}` on PowerShell can be used to check whether the port on server side is open for access. +8. If you are using Windows, verify that `C:\TDengine\driver\taos.dll` is in the `PATH` environment variable. If possible, move `taos.dll` to the `C:\Windows\System32` directory. -7. TDengine CLI `taos` can also be used to check network, please refer to [TDengine CLI](/reference/taos-shell). +9. On Linux systems, you can use the `nc` tool to check whether a port is accessible: + - To check whether a UDP port is open, run `nc -vuz {hostIP} {port}`. + - To check whether a TCP port on the server side is open, run `nc -l {port}`. + - To check whether a TCP port on client side is open, run `nc {hostIP} {port}`. -### 3. How to handle "Unexpected generic error in RPC" or "Unable to resolve FQDN" ? +10. On Windows systems, you can run `Test-NetConnection -ComputerName {fqdn} -Port {port}` in PowerShell to check whether a port on the server side is accessible. -This error is caused because the FQDN can't be resolved. Please try following ways: +11. You can also use the TDengine CLI to diagnose network issues. For more information, see [Problem Diagnostics](https://docs.tdengine.com/operation/diagnose/). -1. Check whether the FQDN is configured properly on the server side -2. If DSN server is configured in the network, please check whether it works; otherwise, check `/etc/hosts` to see whether the FQDN is configured with correct IP -3. If the network configuration on the server side is OK, try to ping the server from the client side. -4. If TDengine has been used before with an old hostname then the hostname has been changed, please check `/var/lib/taos/taos/dnode/dnodeEps.json`. Before setting up a new TDengine cluster, it's better to cleanup the directories configured. +### 5. How can I resolve the "Unable to resolve FQDN" error? -### 4. "Invalid SQL" is returned even though the Syntax is correct +Clients and dnodes must be able to resolve the FQDN of each required node. You can confirm your configuration as follows: -"Invalid SQL" is returned when the length of SQL statement exceeds maximum allowed length or the syntax is not correct. +1. Verify that the FQDN is configured properly on the server. +2. If your network has a DNS server, verify that it is operational. +3. If your network does not have a DNS server, verify that the FQDNs in the `hosts` file are correct. +4. On the client, use the `ping` command to test your connection to the server. If you cannot ping an FQDN, TDengine cannot reach it. +5. If TDengine has been previously installed and the `hostname` was modified, open `dnode.json` in the `data` folder and verify that the endpoint configuration is correct. The default location of the dnode file is `/var/lib/taos/dnode`. Ensure that you clean up previous installations before reinstalling TDengine. +6. Confirm whether FQDNs are preconfigured in `/etc/hosts` and `/etc/hostname`. -### 5. Whether validation queries are supported? +### 6. What is the most effective way to write data to TDengine? -It's suggested to use a builtin database named as `log` to monitor. +Writing data in batches provides higher efficiency in most situations. You can insert one or more data records into one or more tables in a single SQL statement. - +### 9. Why are table names not fully displayed? -### 6. Can I delete a record? +The number of columns in the TDengine CLI terminal display is limited. This can cause table names to be cut off, and if you use an incomplete name in a statement, the "Table does not exist" error will occur. You can increase the display size with the `maxBinaryDisplayWidth` parameter or the SQL statement `set max_binary_display_width`. You can also append `\G` to your SQL statement to bypass this limitation. -From version 2.6.0.0 Enterprise version, deleting data can be supported. +### 10. How can I migrate data? -### 7. How to create a table of over 1024 columns? +In TDengine, the `hostname` uniquely identifies a machine. When you move data files to a new machine, you must configure the new machine to have the same `host name` as the original machine. -From version 2.1.7.0, at most 4096 columns can be defined for a table. +:::note -### 8. How to improve the efficiency of inserting data? +The data structure of previous versions of TDengine is not compatible with version 3.0. To migrate from TDengine 1.x or 2.x to 3.0, you must export data from your older deployment and import it back into TDengine 3.0. -Inserting data in batch is a good practice. Single SQL statement can insert data for one or multiple tables in batch. +::: -### 9. JDBC Error: the executed SQL is not a DML or a DDL? +### 11. How can I temporary change the log level from the TDengine Client? -Please upgrade to latest JDBC driver, for details please refer to [Java Connector](/reference/connector/java) - -### 10. Failed to connect with error "invalid timestamp" - -The most common reason is that the time setting is not aligned on the client side and the server side. On Linux system, please use `ntpdate` command. On Windows system, please enable automatic sync in system time setting. - -### 11. Table name is not shown in full - -There is a display width setting in TDengine CLI `taos`. It can be controlled by configuration parameter `maxBinaryDisplayWidth`, or can be set using SQL command `set max_binary_display_width`. A more convenient way is to append `\G` in a SQL command to bypass this limitation. - -### 12. How to change log level temporarily? - -Below SQL command can be used to adjust log level temporarily +To change the log level for debugging purposes, you can use the following command: ```sql -ALTER LOCAL flag_name flag_value; +ALTER LOCAL local_option + +local_option: { + 'resetLog' + | 'rpcDebugFlag' value + | 'tmrDebugFlag' value + | 'cDebugFlag' value + | 'uDebugFlag' value + | 'debugFlag' value +} ``` - - flag_name can be: debugFlag,cDebugFlag,tmrDebugFlag,uDebugFlag,rpcDebugFlag - - flag_value can be: 131 (INFO/WARNING/ERROR), 135 (plus DEBUG), 143 (plus TRACE) - +Use `resetlog` to remove all logs generated on the local client. Use the other parameters to specify a log level for a specific component. -### 13. What to do if go compilation fails? +For each parameter, you can set the value to `131` (error and warning), `135` (error, warning, and debug), or `143` (error, warning, debug, and trace). -From version 2.3.0.0, a new component named `taosAdapter` is introduced. Its' developed in Go. If you want to compile from source code and meet go compilation problems, try to do below steps to resolve Go environment problems. +### Why do TDengine components written in Go fail to compile? -```sh -go env -w GO111MODULE=on -go env -w GOPROXY=https://goproxy.cn,direct -``` +TDengine includes taosAdapter, an independent component written in Go. This component provides the REST API as well as data access for other products such as Prometheus and Telegraf. +When using the develop branch, you must run `git submodule update --init --recursive` to download the taosAdapter repository and then compile it. + +TDengine Go components require Go version 1.14 or later. + +### 13. How can I query the storage space being used by my data? + +The TDengine data files are stored in `/var/lib/taos` by default. Log files are stored in `/var/log/taos`. + +To see how much space your data files occupy, run `du -sh /var/lib/taos/vnode --exclude='wal'`. This excludes the write-ahead log (WAL) because its size is relatively fixed while writes are occurring, and it is written to disk and cleared when you shut down TDengine. + +If you want to see how much space is occupied by a single database, first determine which vgroup is storing the database by running `show vgroups`. Then check `/var/lib/taos/vnode` for the files associated with the vgroup ID. + +### 15. How is timezone information processed for timestamps? + +TDengine uses the timezone of the client for timestamps. The server timezone does not affect timestamps. The client converts Unix timestamps in SQL statements to UTC before sending them to the server. When you query data on the server, it provides timestamps in UTC to the client, which converts them to its local time. + +Timestamps are processed as follows: + +1. The client uses its system timezone unless it has been configured otherwise. +2. A timezone configured in `taos.cfg` takes precedence over the system timezone. +3. A timezone explicitly specified when establishing a connection to TDengine through a connector takes precedence over `taos.cfg` and the system timezone. For example, the Java connector allows you to specify a timezone in the JDBC URL. +4. If you use an RFC 3339 timestamp (2013-04-12T15:52:01.123+08:00), or an ISO 8601 timestamp (2013-04-12T15:52:01.123+0800), the timezone specified in the timestamp is used instead of the timestamps configured using any other method. + +### 16. Which network ports are required by TDengine? + +See [serverPort](https://docs.tdengine.com/reference/config/#serverport) in Configuration Parameters. + +Note that ports are specified using 6030 as the default first port. If you change this port, all other ports change as well. + +### 17. Why do applications such as Grafana fail to connect to TDengine over the REST API? + +In TDengine, the REST API is provided by taosAdapter. Ensure that taosAdapter is running before you connect an application to TDengine over the REST API. You can run `systemctl start taosadapter` to start the service. + +Note that the log path for taosAdapter must be configured separately. The default path is `/var/log/taos`. You can choose one of eight log levels. The default is `info`. You can set the log level to `panic` to disable log output. You can modify the taosAdapter configuration file to change these settings. The default location is `/etc/taos/taosadapter.toml`. + +For more information, see [taosAdapter](https://docs.tdengine.com/reference/taosadapter/). + +### 18. How can I resolve out-of-memory (OOM) errors? + +OOM errors are thrown by the operating system when its memory, including swap, becomes insufficient and it needs to terminate processes to remain operational. Most OOM errors in TDengine occur for one of the following reasons: free memory is less than the value of `vm.min_free_kbytes` or free memory is less than the size of the request. If TDengine occupies reserved memory, an OOM error can occur even when free memory is sufficient. + +TDengine preallocates memory to each vnode. The number of vnodes per database is determined by the `vgroups` parameter, and the amount of memory per vnode is determined by the `buffer` parameter. To prevent OOM errors from occurring, ensure that you prepare sufficient memory on your hosts to support the number of vnodes that your deployment requires. Configure an appropriately sized swap space. If you continue to receive OOM errors, your SQL statements may be querying too much data for your system. TDengine Enterprise Edition includes optimized memory management that increases stability for enterprise customers. From 984b2d5e88c29d891b7801886f332deb5f181d40 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Fri, 26 Aug 2022 14:41:52 +0800 Subject: [PATCH 30/47] docs: add taostools uninstall (#16433) --- docs/en/13-operation/01-pkg-install.md | 41 ++++++++++++++++++++-- docs/zh/17-operation/01-pkg-install.md | 48 +++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/docs/en/13-operation/01-pkg-install.md b/docs/en/13-operation/01-pkg-install.md index b6cc0582bc..53da672daa 100644 --- a/docs/en/13-operation/01-pkg-install.md +++ b/docs/en/13-operation/01-pkg-install.md @@ -35,6 +35,22 @@ TDengine is removed successfully! ``` +Apt-get package of taosTools can be uninstalled as below: + +``` +$ sudo apt remove taostools +Reading package lists... Done +Building dependency tree +Reading state information... Done +The following packages will be REMOVED: + taostools +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +After this operation, 68.3 MB disk space will be freed. +Do you want to continue? [Y/n] +(Reading database ... 147973 files and directories currently installed.) +Removing taostools (2.1.2) ... +``` + @@ -48,6 +64,14 @@ TDengine is removed successfully! ``` +Deb package of taosTools can be uninstalled as below: + +``` +$ sudo dpkg -r taostools +(Reading database ... 147973 files and directories currently installed.) +Removing taostools (2.1.2) ... +``` + @@ -59,6 +83,13 @@ $ sudo rpm -e tdengine TDengine is removed successfully! ``` +RPM package of taosTools can be uninstalled as below: + +``` +sudo rpm -e taostools +taosToole is removed successfully! +``` + @@ -67,10 +98,16 @@ tar.gz package of TDengine can be uninstalled as below: ``` $ rmtaos -Nginx for TDengine is running, stopping it... TDengine is removed successfully! +``` -taosKeeper is removed successfully! +tar.gz package of taosTools can be uninstalled as below: + +``` +$ rmtaostools +Start to uninstall taos tools ... + +taos tools is uninstalled successfully! ``` diff --git a/docs/zh/17-operation/01-pkg-install.md b/docs/zh/17-operation/01-pkg-install.md index 671dc00cee..6d93c1697b 100644 --- a/docs/zh/17-operation/01-pkg-install.md +++ b/docs/zh/17-operation/01-pkg-install.md @@ -47,7 +47,7 @@ lrwxrwxrwx 1 root root 13 Feb 22 09:34 log -> /var/log/taos/ -卸载命令如下: +TDengine 卸载命令如下: ``` $ sudo apt-get remove tdengine @@ -65,10 +65,26 @@ TDengine is removed successfully! ``` +taosTools 卸载命令如下: + +``` +$ sudo apt remove taostools +Reading package lists... Done +Building dependency tree +Reading state information... Done +The following packages will be REMOVED: + taostools +0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded. +After this operation, 68.3 MB disk space will be freed. +Do you want to continue? [Y/n] +(Reading database ... 147973 files and directories currently installed.) +Removing taostools (2.1.2) ... +``` + -卸载命令如下: +TDengine 卸载命令如下: ``` $ sudo dpkg -r tdengine @@ -78,28 +94,52 @@ TDengine is removed successfully! ``` +taosTools 卸载命令如下: + +``` +$ sudo dpkg -r taostools +(Reading database ... 147973 files and directories currently installed.) +Removing taostools (2.1.2) ... +``` + -卸载命令如下: +卸载 TDengine 命令如下: ``` $ sudo rpm -e tdengine TDengine is removed successfully! ``` +卸载 taosTools 命令如下: + +``` +sudo rpm -e taostools +taosToole is removed successfully! +``` + -卸载命令如下: +卸载 TDengine 命令如下: ``` $ rmtaos TDengine is removed successfully! ``` +卸载 taosTools 命令如下: + +``` +$ rmtaostools +Start to uninstall taos tools ... + +taos tools is uninstalled successfully! +``` + 在 C:\TDengine 目录下,通过运行 unins000.exe 卸载程序来卸载 TDengine。 From 04e5c75bbae1c008a630187f21acb113f2bfc0ee Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Fri, 26 Aug 2022 14:51:30 +0800 Subject: [PATCH 31/47] fix: cleanup memory with streamLoadTasks --- source/libs/stream/src/streamMeta.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c index 20a2f7d332..1442ed2e05 100644 --- a/source/libs/stream/src/streamMeta.c +++ b/source/libs/stream/src/streamMeta.c @@ -265,6 +265,8 @@ int32_t streamLoadTasks(SStreamMeta* pMeta) { } } + tdbFree(pKey); + tdbFree(pVal); if (tdbTbcClose(pCur) < 0) { return -1; } From bdf0a41b39773ffd84ace27a23085992d9f93c42 Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Fri, 26 Aug 2022 14:52:17 +0800 Subject: [PATCH 32/47] os: fix Mac access error --- include/os/os.h | 1 + source/os/src/osDir.c | 2 ++ source/os/src/osFile.c | 2 ++ source/os/src/osSysinfo.c | 1 + source/util/src/tlog.c | 3 +-- 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/os/os.h b/include/os/os.h index b036002f8a..71966061a1 100644 --- a/include/os/os.h +++ b/include/os/os.h @@ -79,6 +79,7 @@ extern "C" { #include #include +#include "taoserror.h" #include "osAtomic.h" #include "osDef.h" #include "osDir.h" diff --git a/source/os/src/osDir.c b/source/os/src/osDir.c index b755a35815..30aaa01dae 100644 --- a/source/os/src/osDir.c +++ b/source/os/src/osDir.c @@ -133,6 +133,7 @@ int32_t taosMulMkDir(const char *dirname) { code = mkdir(temp, 0755); #endif if (code < 0 && errno != EEXIST) { + terrno = TAOS_SYSTEM_ERROR(errno); return code; } *pos = TD_DIRSEP[0]; @@ -146,6 +147,7 @@ int32_t taosMulMkDir(const char *dirname) { code = mkdir(temp, 0755); #endif if (code < 0 && errno != EEXIST) { + terrno = TAOS_SYSTEM_ERROR(errno); return code; } } diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c index f9797f6319..fab933755a 100644 --- a/source/os/src/osFile.c +++ b/source/os/src/osFile.c @@ -313,6 +313,7 @@ TdFilePtr taosOpenFile(const char *path, int32_t tdFileOptions) { assert(!(tdFileOptions & TD_FILE_EXCL)); fp = fopen(path, mode); if (fp == NULL) { + terrno = TAOS_SYSTEM_ERROR(errno); return NULL; } } else { @@ -335,6 +336,7 @@ TdFilePtr taosOpenFile(const char *path, int32_t tdFileOptions) { fd = open(path, access, S_IRWXU | S_IRWXG | S_IRWXO); #endif if (fd == -1) { + terrno = TAOS_SYSTEM_ERROR(errno); return NULL; } } diff --git a/source/os/src/osSysinfo.c b/source/os/src/osSysinfo.c index 3aa3f4f29e..19e9568bbe 100644 --- a/source/os/src/osSysinfo.c +++ b/source/os/src/osSysinfo.c @@ -595,6 +595,7 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) { #else struct statvfs info; if (statvfs(dataDir, &info)) { + terrno = TAOS_SYSTEM_ERROR(errno); return -1; } else { diskSize->total = info.f_blocks * info.f_frsize; diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 2e8239c68f..a2d65d6a54 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -429,7 +429,7 @@ static inline int32_t taosBuildLogHead(char *buffer, const char *flags) { } static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *buffer, int32_t len) { - if ((dflag & DEBUG_FILE) && tsLogObj.logHandle && tsLogObj.logHandle->pFile != NULL) { + if ((dflag & DEBUG_FILE) && tsLogObj.logHandle && tsLogObj.logHandle->pFile != NULL && osLogSpaceAvailable()) { taosUpdateLogNums(level); if (tsAsyncLog) { taosPushLogBuffer(tsLogObj.logHandle, buffer, len); @@ -451,7 +451,6 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b } void taosPrintLog(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) { - if (!osLogSpaceAvailable()) return; if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return; char buffer[LOG_MAX_LINE_BUFFER_SIZE]; From b4344c2600ecaea735ffef4f808008aa7e4b3d7e Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Fri, 26 Aug 2022 15:01:23 +0800 Subject: [PATCH 33/47] os: fix Mac access error --- packaging/deb/DEBIAN/prerm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/deb/DEBIAN/prerm b/packaging/deb/DEBIAN/prerm index 4953102842..65f261db2c 100644 --- a/packaging/deb/DEBIAN/prerm +++ b/packaging/deb/DEBIAN/prerm @@ -1,6 +1,6 @@ #!/bin/bash -if [ $1 -eq "abort-upgrade" ]; then +if [ "$1"x = "abort-upgrade"x ]; then exit 0 fi From ee032bc54576c99aaad6a4fff2988f43818643fb Mon Sep 17 00:00:00 2001 From: wade zhang <95411902+gccgdb1234@users.noreply.github.com> Date: Fri, 26 Aug 2022 15:16:56 +0800 Subject: [PATCH 34/47] Update 24-show.md --- docs/zh/12-taos-sql/24-show.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/12-taos-sql/24-show.md b/docs/zh/12-taos-sql/24-show.md index 14b51fb4c1..b4aafdaa0a 100644 --- a/docs/zh/12-taos-sql/24-show.md +++ b/docs/zh/12-taos-sql/24-show.md @@ -195,7 +195,7 @@ SHOW STREAMS; SHOW SUBSCRIPTIONS; ``` -显示当前数据库下的所有的订阅关系 +显示当前系统内所有的订阅关系 ## SHOW TABLES From b39d6b41f45a9c59bdbd75feab7243eceeb0d0e2 Mon Sep 17 00:00:00 2001 From: wade zhang <95411902+gccgdb1234@users.noreply.github.com> Date: Fri, 26 Aug 2022 15:18:02 +0800 Subject: [PATCH 35/47] Update 24-show.md --- docs/en/12-taos-sql/24-show.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/12-taos-sql/24-show.md b/docs/en/12-taos-sql/24-show.md index 6b56161322..c9adb0cf78 100644 --- a/docs/en/12-taos-sql/24-show.md +++ b/docs/en/12-taos-sql/24-show.md @@ -194,7 +194,7 @@ Shows information about streams in the system. SHOW SUBSCRIPTIONS; ``` -Shows all subscriptions in the current database. +Shows all subscriptions in the system. ## SHOW TABLES From 08af4ee654a032916b9f1f0c1e460a63065bedd5 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Fri, 26 Aug 2022 15:37:18 +0800 Subject: [PATCH 36/47] feat: update taostools e8bfca6 for3.0 (#16434) * feat: update taos-tools for 3.0 [TD-14141] * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools for 3.0 * feat: update taos-tools 8e3b3ee * fix: remove submodules * feat: update taos-tools c529299 * feat: update taos-tools 9dc2fec for 3.0 * fix: optim upx * feat: update taos-tools f4e456a for 3.0 * feat: update taos-tools 2a2def1 for 3.0 * feat: update taos-tools c9cc20f for 3.0 * feat: update taostoosl 8a5e336 for 3.0 * feat: update taostools 3c7dafe for 3.0 * feat: update taos-tools 2d68404 for 3.0 * feat: update taos-tools 57bdfbf for 3.0 * fix: jenkinsfile2 to upgrade pip * feat: update taostoosl 11d23e5 for 3.0 * feat: update taostools 43924b8 for 3.0 * feat: update taostools 53a0103 for 3.0 * feat: update taostoosl d237772 for 3.0 * feat: update taos-tools 6bde102 for 3.0 * feat: upate taos-tools 2af2222 for 3.0 * feat: update taos-tools 833b721 for 3.0 * feat: update taostools e8bfca6 for 3.0 --- cmake/taostools_CMakeLists.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in index 2d9b00eee7..9547323acf 100644 --- a/cmake/taostools_CMakeLists.txt.in +++ b/cmake/taostools_CMakeLists.txt.in @@ -2,7 +2,7 @@ # taos-tools ExternalProject_Add(taos-tools GIT_REPOSITORY https://github.com/taosdata/taos-tools.git - GIT_TAG 833b721 + GIT_TAG e8bfca6 SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools" BINARY_DIR "" #BUILD_IN_SOURCE TRUE From 083ce4e67dec147a4c4df0b43acb5785ea386923 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Fri, 26 Aug 2022 15:43:20 +0800 Subject: [PATCH 37/47] fix: use sizeof(SBlockL) from aBlockL array's element size --- source/dnode/vnode/src/tsdb/tsdbCache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index b9f3897674..61c6877555 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -476,7 +476,7 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) { if (code) goto _err; if (!state->aBlockL) { - state->aBlockL = taosArrayInit(0, sizeof(SBlockIdx)); + state->aBlockL = taosArrayInit(0, sizeof(SBlockL)); } else { taosArrayClear(state->aBlockL); } From ab85eeaaaa438d37008a83d360306032e6f8dba5 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Fri, 26 Aug 2022 16:15:08 +0800 Subject: [PATCH 38/47] fix(query): restrict using JSON type as input in string functions TD-18664 --- source/libs/function/src/builtins.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index ed82e4cb50..864424846e 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -303,7 +303,7 @@ static int32_t translateInOutStr(SFunctionNode* pFunc, char* pErrBuf, int32_t le } SExprNode* pPara1 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0); - if (!IS_VAR_DATA_TYPE(pPara1->resType.type)) { + if (!IS_STR_DATA_TYPE(pPara1->resType.type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -317,7 +317,7 @@ static int32_t translateTrimStr(SFunctionNode* pFunc, char* pErrBuf, int32_t len } SExprNode* pPara1 = (SExprNode*)nodesListGetNode(pFunc->pParameterList, 0); - if (!IS_VAR_DATA_TYPE(pPara1->resType.type)) { + if (!IS_STR_DATA_TYPE(pPara1->resType.type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -546,7 +546,7 @@ static int32_t translateApercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t // param2 if (3 == numOfParams) { uint8_t para3Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 2))->resType.type; - if (!IS_VAR_DATA_TYPE(para3Type)) { + if (!IS_STR_DATA_TYPE(para3Type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -593,7 +593,7 @@ static int32_t translateApercentileImpl(SFunctionNode* pFunc, char* pErrBuf, int // param2 if (3 == numOfParams) { uint8_t para3Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 2))->resType.type; - if (!IS_VAR_DATA_TYPE(para3Type)) { + if (!IS_STR_DATA_TYPE(para3Type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -1388,7 +1388,7 @@ static int32_t translateSample(SFunctionNode* pFunc, char* pErrBuf, int32_t len) } // set result type - if (IS_VAR_DATA_TYPE(colType)) { + if (IS_STR_DATA_TYPE(colType)) { pFunc->node.resType = (SDataType){.bytes = pCol->resType.bytes, .type = colType}; } else { pFunc->node.resType = (SDataType){.bytes = tDataTypes[colType].bytes, .type = colType}; @@ -1431,7 +1431,7 @@ static int32_t translateTail(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { } // set result type - if (IS_VAR_DATA_TYPE(colType)) { + if (IS_STR_DATA_TYPE(colType)) { pFunc->node.resType = (SDataType){.bytes = pCol->resType.bytes, .type = colType}; } else { pFunc->node.resType = (SDataType){.bytes = tDataTypes[colType].bytes, .type = colType}; @@ -1514,7 +1514,7 @@ static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len) for (int32_t i = 1; i < 3; ++i) { nodeType = nodeType(nodesListGetNode(pFunc->pParameterList, i)); paraType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, i))->resType.type; - if (!IS_VAR_DATA_TYPE(paraType) || QUERY_NODE_VALUE != nodeType) { + if (!IS_STR_DATA_TYPE(paraType) || QUERY_NODE_VALUE != nodeType) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -1682,7 +1682,8 @@ static int32_t translateLength(SFunctionNode* pFunc, char* pErrBuf, int32_t len) return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); } - if (!IS_VAR_DATA_TYPE(((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type)) { + uint8_t paraType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type; + if (!IS_STR_DATA_TYPE(paraType)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -1714,7 +1715,7 @@ static int32_t translateConcatImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t for (int32_t i = 0; i < numOfParams; ++i) { SNode* pPara = nodesListGetNode(pFunc->pParameterList, i); uint8_t paraType = ((SExprNode*)pPara)->resType.type; - if (!IS_VAR_DATA_TYPE(paraType) && !IS_NULL_TYPE(paraType)) { + if (!IS_STR_DATA_TYPE(paraType) && !IS_NULL_TYPE(paraType)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } if (TSDB_DATA_TYPE_NCHAR == paraType) { @@ -1770,7 +1771,7 @@ static int32_t translateSubstr(SFunctionNode* pFunc, char* pErrBuf, int32_t len) uint8_t para0Type = pPara0->resType.type; uint8_t para1Type = pPara1->resType.type; - if (!IS_VAR_DATA_TYPE(para0Type) || !IS_INTEGER_TYPE(para1Type)) { + if (!IS_STR_DATA_TYPE(para0Type) || !IS_INTEGER_TYPE(para1Type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -1802,7 +1803,7 @@ static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) { uint8_t para2Type = pFunc->node.resType.type; int32_t para2Bytes = pFunc->node.resType.bytes; - if (IS_VAR_DATA_TYPE(para2Type)) { + if (IS_STR_DATA_TYPE(para2Type)) { para2Bytes -= VARSTR_HEADER_SIZE; } if (para2Bytes <= 0 || para2Bytes > 4096) { // cast dst var type length limits to 4096 bytes @@ -1859,7 +1860,7 @@ static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); } - if (!IS_VAR_DATA_TYPE(((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type)) { + if (!IS_STR_DATA_TYPE(((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -1878,7 +1879,7 @@ static int32_t translateTimeTruncate(SFunctionNode* pFunc, char* pErrBuf, int32_ uint8_t para1Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type; uint8_t para2Type = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 1))->resType.type; - if ((!IS_VAR_DATA_TYPE(para1Type) && !IS_INTEGER_TYPE(para1Type) && TSDB_DATA_TYPE_TIMESTAMP != para1Type) || + if ((!IS_STR_DATA_TYPE(para1Type) && !IS_INTEGER_TYPE(para1Type) && TSDB_DATA_TYPE_TIMESTAMP != para1Type) || !IS_INTEGER_TYPE(para2Type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } @@ -1911,7 +1912,7 @@ static int32_t translateTimeDiff(SFunctionNode* pFunc, char* pErrBuf, int32_t le for (int32_t i = 0; i < 2; ++i) { uint8_t paraType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, i))->resType.type; - if (!IS_VAR_DATA_TYPE(paraType) && !IS_INTEGER_TYPE(paraType) && TSDB_DATA_TYPE_TIMESTAMP != paraType) { + if (!IS_STR_DATA_TYPE(paraType) && !IS_INTEGER_TYPE(paraType) && TSDB_DATA_TYPE_TIMESTAMP != paraType) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } } From 0fbb4d7f9ad337fa4231a1d5cd47e6013a9bf7a9 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Fri, 26 Aug 2022 16:15:08 +0800 Subject: [PATCH 39/47] fix(query): restrict using JSON type as input in string functions TD-18664 --- source/libs/function/src/builtins.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c index 864424846e..b7cd02befd 100644 --- a/source/libs/function/src/builtins.c +++ b/source/libs/function/src/builtins.c @@ -1682,8 +1682,7 @@ static int32_t translateLength(SFunctionNode* pFunc, char* pErrBuf, int32_t len) return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName); } - uint8_t paraType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type; - if (!IS_STR_DATA_TYPE(paraType)) { + if (!IS_STR_DATA_TYPE(((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type)) { return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName); } From 551354f644c95abae1999e9025f9f4738ba19ef6 Mon Sep 17 00:00:00 2001 From: afwerar <1296468573@qq.com> Date: Fri, 26 Aug 2022 16:21:56 +0800 Subject: [PATCH 40/47] os: fix Mac access error --- packaging/tools/make_install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh index 6a95ace99e..f554942ce3 100755 --- a/packaging/tools/make_install.sh +++ b/packaging/tools/make_install.sh @@ -381,8 +381,7 @@ function install_header() { ${install_main_dir}/include || ${csudo}cp -f ${source_dir}/include/client/taos.h ${source_dir}/include/common/taosdef.h ${source_dir}/include/util/taoserror.h ${source_dir}/include/libs/function/taosudf.h \ ${install_main_2_dir}/include && - ${csudo}chmod 644 ${install_main_dir}/include/* ||: - ${csudo}chmod 644 ${install_main_2_dir}/include/* + ${csudo}chmod 644 ${install_main_dir}/include/* || ${csudo}chmod 644 ${install_main_2_dir}/include/* fi } From 1e9f869ab55466f2f752084edbf714036bce0053 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Fri, 26 Aug 2022 16:35:15 +0800 Subject: [PATCH 41/47] doc: add missing webp files --- docs/en/20-third-party/import_dashboard.webp | Bin 0 -> 6484 bytes docs/en/20-third-party/import_dashboard1.webp | Bin 0 -> 42100 bytes docs/en/20-third-party/import_dashboard2.webp | Bin 0 -> 265258 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/en/20-third-party/import_dashboard.webp create mode 100644 docs/en/20-third-party/import_dashboard1.webp create mode 100644 docs/en/20-third-party/import_dashboard2.webp diff --git a/docs/en/20-third-party/import_dashboard.webp b/docs/en/20-third-party/import_dashboard.webp new file mode 100644 index 0000000000000000000000000000000000000000..164e3f4690a5a55f937a3c29e1e8ca026648e6b1 GIT binary patch literal 6484 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 literal 0 HcmV?d00001 diff --git a/docs/en/20-third-party/import_dashboard1.webp b/docs/en/20-third-party/import_dashboard1.webp new file mode 100644 index 0000000000000000000000000000000000000000..d4fb374ce8bb75c8a0fbdbb9cab5b30eb29ab06d GIT binary patch literal 42100 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 H@`L>k8agvt literal 0 HcmV?d00001 diff --git a/docs/en/20-third-party/import_dashboard2.webp b/docs/en/20-third-party/import_dashboard2.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f74dc96be20ab64b5fb555aaccdaa1c1139b35c GIT binary patch literal 265258 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

Me4QTtQ_O#G(9 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 Date: Fri, 26 Aug 2022 17:13:32 +0800 Subject: [PATCH 42/47] doc: fix broken links --- docs/en/13-operation/03-tolerance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/13-operation/03-tolerance.md b/docs/en/13-operation/03-tolerance.md index ba9d5d75e3..21a5a90282 100644 --- a/docs/en/13-operation/03-tolerance.md +++ b/docs/en/13-operation/03-tolerance.md @@ -27,4 +27,4 @@ The number of dnodes in a TDengine cluster must NOT be lower than the number of As long as the dnodes of a TDengine cluster are deployed on different physical machines and the replica number is higher than 1, high availability can be achieved without any other assistance. For disaster recovery, dnodes of a TDengine cluster should be deployed in geographically different data centers. -Alternatively, you can use taosX to synchronize the data from one TDengine cluster to another cluster in a remote location. For more information, see [taosX](../../reference/taosX). +Alternatively, you can use taosX to synchronize the data from one TDengine cluster to another cluster in a remote location. However, taosX is only available in TDengine enterprise version, for more information please contact tdengine.com. From 290ff9294f3dba654fe35324b567e5fca52e5e51 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Fri, 26 Aug 2022 17:47:51 +0800 Subject: [PATCH 43/47] doc: correct wrong description about TTL --- docs/en/12-taos-sql/03-table.md | 2 +- docs/zh/12-taos-sql/03-table.md | 43 ++++++++++++++++++--------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/docs/en/12-taos-sql/03-table.md b/docs/en/12-taos-sql/03-table.md index bf32cf171b..5a2c8ed6ee 100644 --- a/docs/en/12-taos-sql/03-table.md +++ b/docs/en/12-taos-sql/03-table.md @@ -57,7 +57,7 @@ table_option: { 3. MAX_DELAY: specifies the maximum latency for pushing computation results. The default value is 15 minutes or the value of the INTERVAL parameter, whichever is smaller. Enter a value between 0 and 15 minutes in milliseconds, seconds, or minutes. You can enter multiple values separated by commas (,). Note: Retain the default value if possible. Configuring a small MAX_DELAY may cause results to be frequently pushed, affecting storage and query performance. This parameter applies only to supertables and takes effect only when the RETENTIONS parameter has been specified for the database. 4. ROLLUP: specifies aggregate functions to roll up. Rolling up a function provides downsampled results based on multiple axes. This parameter applies only to supertables and takes effect only when the RETENTIONS parameter has been specified for the database. You can specify only one function to roll up. The rollup takes effect on all columns except TS. Enter one of the following values: avg, sum, min, max, last, or first. 5. SMA: specifies functions on which to enable small materialized aggregates (SMA). SMA is user-defined precomputation of aggregates based on data blocks. Enter one of the following values: max, min, or sum This parameter can be used with supertables and standard tables. -6. TTL: specifies the time to live (TTL) for the table. If the period specified by the TTL parameter elapses without any data being written to the table, TDengine will automatically delete the table. Note: The system may not delete the table at the exact moment that the TTL expires. Enter a value in days. The default value is 0. Note: The TTL parameter has a higher priority than the KEEP parameter. If a table is marked for deletion because the TTL has expired, it will be deleted even if the time specified by the KEEP parameter has not elapsed. This parameter can be used with standard tables and subtables. +6. TTL: specifies the time to live (TTL) for the table. If TTL is specified when creatinga table, after the time period for which the table has been existing is over TTL, TDengine will automatically delete the table. Please be noted that the system may not delete the table at the exact moment that the TTL expires but guarantee there is such a system and finally the table will be deleted. The unit of TTL is in days. The default value is 0, i.e. never expire. ## Create Subtables diff --git a/docs/zh/12-taos-sql/03-table.md b/docs/zh/12-taos-sql/03-table.md index a93b010c4c..9c33c45efc 100644 --- a/docs/zh/12-taos-sql/03-table.md +++ b/docs/zh/12-taos-sql/03-table.md @@ -10,27 +10,27 @@ description: 对表的各种管理操作 ```sql CREATE TABLE [IF NOT EXISTS] [db_name.]tb_name (create_definition [, create_definitionn] ...) [table_options] - + CREATE TABLE create_subtable_clause - + CREATE TABLE [IF NOT EXISTS] [db_name.]tb_name (create_definition [, create_definitionn] ...) [TAGS (create_definition [, create_definitionn] ...)] [table_options] - + create_subtable_clause: { create_subtable_clause [create_subtable_clause] ... | [IF NOT EXISTS] [db_name.]tb_name USING [db_name.]stb_name [(tag_name [, tag_name] ...)] TAGS (tag_value [, tag_value] ...) } - + create_definition: col_name column_definition - + column_definition: type_name [comment 'string_value'] - + table_options: table_option ... - + table_option: { COMMENT 'string_value' | WATERMARK duration[,duration] @@ -54,12 +54,13 @@ table_option: { 需要注意的是转义字符中的内容必须是可打印字符。 **参数说明** + 1. COMMENT:表注释。可用于超级表、子表和普通表。 -2. WATERMARK:指定窗口的关闭时间,默认值为 5 秒,最小单位毫秒,范围为0到15分钟,多个以逗号分隔。只可用于超级表,且只有当数据库使用了RETENTIONS参数时,才可以使用此表参数。 -3. MAX_DELAY:用于控制推送计算结果的最大延迟,默认值为 interval 的值(但不能超过最大值),最小单位毫秒,范围为1毫秒到15分钟,多个以逗号分隔。注:不建议 MAX_DELAY 设置太小,否则会过于频繁的推送结果,影响存储和查询性能,如无特殊需求,取默认值即可。只可用于超级表,且只有当数据库使用了RETENTIONS参数时,才可以使用此表参数。 -4. ROLLUP:Rollup 指定的聚合函数,提供基于多层级的降采样聚合结果。只可用于超级表。只有当数据库使用了RETENTIONS参数时,才可以使用此表参数。作用于超级表除TS列外的其它所有列,但是只能定义一个聚合函数。 聚合函数支持 avg, sum, min, max, last, first。 -5. SMA:Small Materialized Aggregates,提供基于数据块的自定义预计算功能。预计算类型包括MAX、MIN和SUM。可用于超级表/普通表。 -6. TTL:Time to Live,是用户用来指定表的生命周期的参数。如果在持续的TTL时间内,都没有数据写入该表,则TDengine系统会自动删除该表。这个TTL的时间只是一个大概时间,我们系统不保证到了时间一定会将其删除,而只保证存在这样一个机制。TTL单位是天,默认为0,表示不限制。用户需要注意,TTL优先级高于KEEP,即TTL时间满足删除机制时,即使当前数据的存在时间小于KEEP,此表也会被删除。只可用于子表和普通表。 +2. WATERMARK:指定窗口的关闭时间,默认值为 5 秒,最小单位毫秒,范围为 0 到 15 分钟,多个以逗号分隔。只可用于超级表,且只有当数据库使用了 RETENTIONS 参数时,才可以使用此表参数。 +3. MAX_DELAY:用于控制推送计算结果的最大延迟,默认值为 interval 的值(但不能超过最大值),最小单位毫秒,范围为 1 毫秒到 15 分钟,多个以逗号分隔。注:不建议 MAX_DELAY 设置太小,否则会过于频繁的推送结果,影响存储和查询性能,如无特殊需求,取默认值即可。只可用于超级表,且只有当数据库使用了 RETENTIONS 参数时,才可以使用此表参数。 +4. ROLLUP:Rollup 指定的聚合函数,提供基于多层级的降采样聚合结果。只可用于超级表。只有当数据库使用了 RETENTIONS 参数时,才可以使用此表参数。作用于超级表除 TS 列外的其它所有列,但是只能定义一个聚合函数。 聚合函数支持 avg, sum, min, max, last, first。 +5. SMA:Small Materialized Aggregates,提供基于数据块的自定义预计算功能。预计算类型包括 MAX、MIN 和 SUM。可用于超级表/普通表。 +6. TTL:Time to Live,是用户用来指定表的生命周期的参数。如果创建表时指定了这个参数,当该表的存在时间超过 TTL 指定的时间后,TDengine 自动删除该表。这个 TTL 的时间只是一个大概时间,系统不保证到了时间一定会将其删除,而只保证存在这样一个机制且最终一定会删除。TTL 单位是天,默认为 0,表示不限制,到期时间为表创建时间加上 TTL 时间。 ## 创建子表 @@ -89,7 +90,7 @@ CREATE TABLE [IF NOT EXISTS] tb_name1 USING stb_name TAGS (tag_value1, ...) [IF ```sql ALTER TABLE [db_name.]tb_name alter_table_clause - + alter_table_clause: { alter_table_options | ADD COLUMN col_name column_type @@ -97,10 +98,10 @@ alter_table_clause: { | MODIFY COLUMN col_name column_type | RENAME COLUMN old_col_name new_col_name } - + alter_table_options: alter_table_option ... - + alter_table_option: { TTL value | COMMENT 'string_value' @@ -110,6 +111,7 @@ alter_table_option: { **使用说明** 对普通表可以进行如下修改操作 + 1. ADD COLUMN:添加列。 2. DROP COLUMN:删除列。 3. MODIFY COLUMN:修改列定义,如果数据列的类型是可变长类型,那么可以使用此指令修改其宽度,只能改大,不能改小。 @@ -143,15 +145,15 @@ ALTER TABLE tb_name RENAME COLUMN old_col_name new_col_name ```sql ALTER TABLE [db_name.]tb_name alter_table_clause - + alter_table_clause: { alter_table_options | SET TAG tag_name = new_tag_value } - + alter_table_options: alter_table_option ... - + alter_table_option: { TTL value | COMMENT 'string_value' @@ -159,6 +161,7 @@ alter_table_option: { ``` **使用说明** + 1. 对子表的列和标签的修改,除了更改标签值以外,都要通过超级表才能进行。 ### 修改子表标签值 @@ -169,7 +172,7 @@ ALTER TABLE tb_name SET TAG tag_name=new_tag_value; ## 删除表 -可以在一条SQL语句中删除一个或多个普通表或子表。 +可以在一条 SQL 语句中删除一个或多个普通表或子表。 ```sql DROP TABLE [IF EXISTS] [db_name.]tb_name [, [IF EXISTS] [db_name.]tb_name] ... @@ -179,7 +182,7 @@ DROP TABLE [IF EXISTS] [db_name.]tb_name [, [IF EXISTS] [db_name.]tb_name] ... ### 显示所有表 -如下SQL语句可以列出当前数据库中的所有表名。 +如下 SQL 语句可以列出当前数据库中的所有表名。 ```sql SHOW TABLES [LIKE tb_name_wildchar]; From 04a7869936ea6ee132fb1b8604459ab715c2f238 Mon Sep 17 00:00:00 2001 From: wenzhouwww Date: Fri, 26 Aug 2022 17:54:23 +0800 Subject: [PATCH 44/47] docs : update_docker update docs about docker start TDengine and taosadapter --- docs/zh/14-reference/11-docker/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/14-reference/11-docker/index.md b/docs/zh/14-reference/11-docker/index.md index 743fc2d32f..a71f2c1912 100644 --- a/docs/zh/14-reference/11-docker/index.md +++ b/docs/zh/14-reference/11-docker/index.md @@ -32,7 +32,7 @@ taos> show databases; Query OK, 2 rows in database (0.033802s) ``` -因为运行在容器中的 TDengine 服务端使用容器的 hostname 建立连接,使用 taos shell 或者各种连接器(例如 JDBC-JNI)从容器外访问容器内的 TDengine 比较复杂,所以上述方式是访问容器中 TDengine 服务的最简单的方法,适用于一些简单场景。如果在一些复杂场景下想要从容器化使用 taos shell 或者各种连接器访问容器中的 TDengine 服务,请参考下一节。 +因为运行在容器中的 TDengine 服务端使用容器的 hostname 建立连接,使用 TDengine CLI 或者各种连接器(例如 JDBC-JNI)从容器外访问容器内的 TDengine 比较复杂,所以上述方式是访问容器中 TDengine 服务的最简单的方法,适用于一些简单场景。如果在一些复杂场景下想要从容器化使用 taos shell 或者各种连接器访问容器中的 TDengine 服务,请参考下一节。 ## 在 host 网络上启动 TDengine From 54b079e006fa5363613e4621eda8c6e0cbecf5cc Mon Sep 17 00:00:00 2001 From: jiajingbin Date: Fri, 26 Aug 2022 18:17:05 +0800 Subject: [PATCH 45/47] test: add fast_write_example for 3.0 --- docs/examples/python/fast_write_example.py | 180 +++++++++++++++++++++ docs/examples/python/mockdatasource.py | 49 ++++++ docs/examples/python/sql_writer.py | 90 +++++++++++ 3 files changed, 319 insertions(+) create mode 100644 docs/examples/python/fast_write_example.py create mode 100644 docs/examples/python/mockdatasource.py create mode 100644 docs/examples/python/sql_writer.py diff --git a/docs/examples/python/fast_write_example.py b/docs/examples/python/fast_write_example.py new file mode 100644 index 0000000000..c9d606388f --- /dev/null +++ b/docs/examples/python/fast_write_example.py @@ -0,0 +1,180 @@ +# install dependencies: +# recommend python >= 3.8 +# pip3 install faster-fifo +# + +import logging +import math +import sys +import time +import os +from multiprocessing import Process +from faster_fifo import Queue +from mockdatasource import MockDataSource +from queue import Empty +from typing import List + +logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format="%(asctime)s [%(name)s] - %(message)s") + +READ_TASK_COUNT = 1 +WRITE_TASK_COUNT = 1 +TABLE_COUNT = 1000 +QUEUE_SIZE = 1000000 +MAX_BATCH_SIZE = 3000 + +read_processes = [] +write_processes = [] + + +def get_connection(): + """ + If variable TDENGINE_FIRST_EP is provided then it will be used. If not, firstEP in /etc/taos/taos.cfg will be used. + You can also override the default username and password by supply variable TDENGINE_USER and TDENGINE_PASSWORD + """ + import taos + firstEP = os.environ.get("TDENGINE_FIRST_EP") + if firstEP: + host, port = firstEP.split(":") + else: + host, port = None, 0 + user = os.environ.get("TDENGINE_USER", "root") + password = os.environ.get("TDENGINE_PASSWORD", "taosdata") + return taos.connect(host=host, port=int(port), user=user, password=password) + + +# ANCHOR: read + +def run_read_task(task_id: int, task_queues: List[Queue]): + table_count_per_task = TABLE_COUNT // READ_TASK_COUNT + data_source = MockDataSource(f"tb{task_id}", table_count_per_task) + try: + for batch in data_source: + for table_id, rows in batch: + # hash data to different queue + i = table_id % len(task_queues) + # block putting forever when the queue is full + task_queues[i].put_many(rows, block=True, timeout=-1) + except KeyboardInterrupt: + pass + + +# ANCHOR_END: read + +# ANCHOR: write +def run_write_task(task_id: int, queue: Queue): + from sql_writer import SQLWriter + log = logging.getLogger(f"WriteTask-{task_id}") + writer = SQLWriter(get_connection) + lines = None + try: + while True: + try: + # get as many as possible + lines = queue.get_many(block=False, max_messages_to_get=MAX_BATCH_SIZE) + writer.process_lines(lines) + except Empty: + time.sleep(0.01) + except KeyboardInterrupt: + pass + except BaseException as e: + log.debug(f"lines={lines}") + raise e + + +# ANCHOR_END: write + +def set_global_config(): + argc = len(sys.argv) + if argc > 1: + global READ_TASK_COUNT + READ_TASK_COUNT = int(sys.argv[1]) + if argc > 2: + global WRITE_TASK_COUNT + WRITE_TASK_COUNT = int(sys.argv[2]) + if argc > 3: + global TABLE_COUNT + TABLE_COUNT = int(sys.argv[3]) + if argc > 4: + global QUEUE_SIZE + QUEUE_SIZE = int(sys.argv[4]) + if argc > 5: + global MAX_BATCH_SIZE + MAX_BATCH_SIZE = int(sys.argv[5]) + + +# ANCHOR: monitor +def run_monitor_process(): + log = logging.getLogger("DataBaseMonitor") + conn = get_connection() + conn.execute("DROP DATABASE IF EXISTS test") + conn.execute("CREATE DATABASE test") + conn.execute("CREATE STABLE test.meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) " + "TAGS (location BINARY(64), groupId INT)") + + def get_count(): + res = conn.query("SELECT count(*) FROM test.meters") + rows = res.fetch_all() + return rows[0][0] if rows else 0 + + last_count = 0 + while True: + time.sleep(10) + count = get_count() + log.info(f"count={count} speed={(count - last_count) / 10}") + last_count = count + + +# ANCHOR_END: monitor +# ANCHOR: main +def main(): + set_global_config() + logging.info(f"READ_TASK_COUNT={READ_TASK_COUNT}, WRITE_TASK_COUNT={WRITE_TASK_COUNT}, " + f"TABLE_COUNT={TABLE_COUNT}, QUEUE_SIZE={QUEUE_SIZE}, MAX_BATCH_SIZE={MAX_BATCH_SIZE}") + + monitor_process = Process(target=run_monitor_process) + monitor_process.start() + time.sleep(3) # waiting for database ready. + + task_queues: List[Queue] = [] + # create task queues + for i in range(WRITE_TASK_COUNT): + queue = Queue(max_size_bytes=QUEUE_SIZE) + task_queues.append(queue) + + # create write processes + for i in range(WRITE_TASK_COUNT): + p = Process(target=run_write_task, args=(i, task_queues[i])) + p.start() + logging.debug(f"WriteTask-{i} started with pid {p.pid}") + write_processes.append(p) + + # create read processes + for i in range(READ_TASK_COUNT): + queues = assign_queues(i, task_queues) + p = Process(target=run_read_task, args=(i, queues)) + p.start() + logging.debug(f"ReadTask-{i} started with pid {p.pid}") + read_processes.append(p) + + try: + monitor_process.join() + except KeyboardInterrupt: + monitor_process.terminate() + [p.terminate() for p in read_processes] + [p.terminate() for p in write_processes] + [q.close() for q in task_queues] + + +def assign_queues(read_task_id, task_queues): + """ + Compute target queues for a specific read task. + """ + ratio = WRITE_TASK_COUNT / READ_TASK_COUNT + from_index = math.floor(read_task_id * ratio) + end_index = math.ceil((read_task_id + 1) * ratio) + return task_queues[from_index:end_index] + + +if __name__ == '__main__': + main() +# ANCHOR_END: main diff --git a/docs/examples/python/mockdatasource.py b/docs/examples/python/mockdatasource.py new file mode 100644 index 0000000000..852860aec0 --- /dev/null +++ b/docs/examples/python/mockdatasource.py @@ -0,0 +1,49 @@ +import time + + +class MockDataSource: + samples = [ + "8.8,119,0.32,LosAngeles,0", + "10.7,116,0.34,SanDiego,1", + "9.9,111,0.33,Hollywood,2", + "8.9,113,0.329,Compton,3", + "9.4,118,0.141,San Francisco,4" + ] + + def __init__(self, tb_name_prefix, table_count): + self.table_name_prefix = tb_name_prefix + "_" + self.table_count = table_count + self.max_rows = 10000000 + self.current_ts = round(time.time() * 1000) - self.max_rows * 100 + # [(tableId, tableName, values),] + self.data = self._init_data() + + def _init_data(self): + lines = self.samples * (self.table_count // 5 + 1) + data = [] + for i in range(self.table_count): + table_name = self.table_name_prefix + str(i) + data.append((i, table_name, lines[i])) # tableId, row + return data + + def __iter__(self): + self.row = 0 + return self + + def __next__(self): + """ + next 1000 rows for each table. + return: {tableId:[row,...]} + """ + # generate 1000 timestamps + ts = [] + for _ in range(1000): + self.current_ts += 100 + ts.append(str(self.current_ts)) + # add timestamp to each row + # [(tableId, ["tableName,ts,current,voltage,phase,location,groupId"])] + result = [] + for table_id, table_name, values in self.data: + rows = [table_name + ',' + t + ',' + values for t in ts] + result.append((table_id, rows)) + return result diff --git a/docs/examples/python/sql_writer.py b/docs/examples/python/sql_writer.py new file mode 100644 index 0000000000..758167376b --- /dev/null +++ b/docs/examples/python/sql_writer.py @@ -0,0 +1,90 @@ +import logging +import taos + + +class SQLWriter: + log = logging.getLogger("SQLWriter") + + def __init__(self, get_connection_func): + self._tb_values = {} + self._tb_tags = {} + self._conn = get_connection_func() + self._max_sql_length = self.get_max_sql_length() + self._conn.execute("USE test") + + def get_max_sql_length(self): + rows = self._conn.query("SHOW variables").fetch_all() + for r in rows: + name = r[0] + if name == "maxSQLLength": + return int(r[1]) + return 1024 * 1024 + + def process_lines(self, lines: str): + """ + :param lines: [[tbName,ts,current,voltage,phase,location,groupId]] + """ + for line in lines: + ps = line.split(",") + table_name = ps[0] + value = '(' + ",".join(ps[1:-2]) + ') ' + if table_name in self._tb_values: + self._tb_values[table_name] += value + else: + self._tb_values[table_name] = value + + if table_name not in self._tb_tags: + location = ps[-2] + group_id = ps[-1] + tag_value = f"('{location}',{group_id})" + self._tb_tags[table_name] = tag_value + self.flush() + + def flush(self): + """ + Assemble INSERT statement and execute it. + When the sql length grows close to MAX_SQL_LENGTH, the sql will be executed immediately, and a new INSERT statement will be created. + In case of "Table does not exit" exception, tables in the sql will be created and the sql will be re-executed. + """ + sql = "INSERT INTO " + sql_len = len(sql) + buf = [] + for tb_name, values in self._tb_values.items(): + q = tb_name + " VALUES " + values + if sql_len + len(q) >= self._max_sql_length: + sql += " ".join(buf) + self.execute_sql(sql) + sql = "INSERT INTO " + sql_len = len(sql) + buf = [] + buf.append(q) + sql_len += len(q) + sql += " ".join(buf) + self.execute_sql(sql) + self._tb_values.clear() + + def execute_sql(self, sql): + try: + self._conn.execute(sql) + except taos.Error as e: + error_code = e.errno & 0xffff + # Table does not exit + if error_code == 9731: + self.create_tables() + else: + self.log.error("Execute SQL: %s", sql) + raise e + except BaseException as baseException: + self.log.error("Execute SQL: %s", sql) + raise baseException + + def create_tables(self): + sql = "CREATE TABLE " + for tb in self._tb_values.keys(): + tag_values = self._tb_tags[tb] + sql += "IF NOT EXISTS " + tb + " USING meters TAGS " + tag_values + " " + try: + self._conn.execute(sql) + except BaseException as e: + self.log.error("Execute SQL: %s", sql) + raise e From 24cf2e0ed6f80662132485b41c59ff8c6be37411 Mon Sep 17 00:00:00 2001 From: jiajingbin Date: Fri, 26 Aug 2022 18:32:52 +0800 Subject: [PATCH 46/47] test: add fast_write_example for 3.0 --- .../03-insert-data/05-high-volume.md | 444 ++++++++++++++++++ .../03-insert-data/05-high-volume.md | 440 +++++++++++++++++ 2 files changed, 884 insertions(+) create mode 100644 docs/en/07-develop/03-insert-data/05-high-volume.md create mode 100644 docs/zh/07-develop/03-insert-data/05-high-volume.md diff --git a/docs/en/07-develop/03-insert-data/05-high-volume.md b/docs/en/07-develop/03-insert-data/05-high-volume.md new file mode 100644 index 0000000000..1a4813f74e --- /dev/null +++ b/docs/en/07-develop/03-insert-data/05-high-volume.md @@ -0,0 +1,444 @@ +--- +sidebar_label: High Performance Writing +title: High Performance Writing +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +This chapter introduces how to write data into TDengine with high throughput. + +## How to achieve high performance data writing + +To achieve high performance writing, there are a few aspects to consider. In the following sections we will describe these important factors in achieving high performance writing. + +### Application Program + +From the perspective of application program, you need to consider: + +1. The data size of each single write, also known as batch size. Generally speaking, higher batch size generates better writing performance. However, once the batch size is over a specific value, you will not get any additional benefit anymore. When using SQL to write into TDengine, it's better to put as much as possible data in single SQL. The maximum SQL length supported by TDengine is 1,048,576 bytes, i.e. 1 MB. It can be configured by parameter `maxSQLLength` on client side, and the default value is 65,480. + +2. The number of concurrent connections. Normally more connections can get better result. However, once the number of connections exceeds the processing ability of the server side, the performance may downgrade. + +3. The distribution of data to be written across tables or sub-tables. Writing to single table in one batch is more efficient than writing to multiple tables in one batch. + +4. Data Writing Protocol. + - Prameter binding mode is more efficient than SQL because it doesn't have the cost of parsing SQL. + - Writing to known existing tables is more efficient than wirting to uncertain tables in automatic creating mode because the later needs to check whether the table exists or not before actually writing data into it + - Writing in SQL is more efficient than writing in schemaless mode because schemaless writing creats table automatically and may alter table schema + +Application programs need to take care of the above factors and try to take advantage of them. The application progam should write to single table in each write batch. The batch size needs to be tuned to a proper value on a specific system. The number of concurrent connections needs to be tuned to a proper value too to achieve the best writing throughput. + +### Data Source + +Application programs need to read data from data source then write into TDengine. If you meet one or more of below situations, you need to setup message queues between the threads for reading from data source and the threads for writing into TDengine. + +1. There are multiple data sources, the data generation speed of each data source is much slower than the speed of single writing thread. In this case, the purpose of message queues is to consolidate the data from multiple data sources together to increase the batch size of single write. +2. The speed of data generation from single data source is much higher than the speed of single writing thread. The purpose of message queue in this case is to provide buffer so that data is not lost and multiple writing threads can get data from the buffer. +3. The data for single table are from multiple data source. In this case the purpose of message queues is to combine the data for single table together to improve the write efficiency. + +If the data source is Kafka, then the appication program is a consumer of Kafka, you can benefit from some kafka features to achieve high performance writing: + +1. Put the data for a table in single partition of single topic so that it's easier to put the data for each table together and write in batch +2. Subscribe multiple topics to accumulate data together. +3. Add more consumers to gain more concurrency and throughput. +4. Incrase the size of single fetch to increase the size of write batch. + +### Tune TDengine + +TDengine is a distributed and high performance time series database, there are also some ways to tune TDengine to get better writing performance. + +1. Set proper number of `vgroups` according to available CPU cores. Normally, we recommend 2 \* number_of_cores as a starting point. If the verification result shows this is not enough to utilize CPU resources, you can use a higher value. +2. Set proper `minTablesPerVnode`, `tableIncStepPerVnode`, and `maxVgroupsPerDb` according to the number of tables so that tables are distributed even across vgroups. The purpose is to balance the workload among all vnodes so that system resources can be utilized better to get higher performance. + +For more performance tuning tips, please refer to [Performance Optimization](../../../operation/optimize) and [Configuration Parameters](../../../reference/config). + +## Sample Programs + +This section will introduce the sample programs to demonstrate how to write into TDengine with high performance. + +### Scenario + +Below are the scenario for the sample programs of high performance wrting. + +- Application program reads data from data source, the sample program simulates a data source by generating data +- The speed of single writing thread is much slower than the speed of generating data, so the program starts multiple writing threads while each thread establish a connection to TDengine and each thread has a message queue of fixed size. +- Application program maps the received data to different writing threads based on table name to make sure all the data for each table is always processed by a specific writing thread. +- Each writing thread writes the received data into TDengine once the message queue becomes empty or the read data meets a threshold. + +![Thread Model of High Performance Writing into TDengine](highvolume.webp) + +### Sample Programs + +The sample programs listed in this section are based on the scenario described previously. If your scenarios is different, please try to adjust the code based on the principles described in this chapter. + +The sample programs assume the source data is for all the different sub tables in same super table (meters). The super table has been created before the sample program starts to writing data. Sub tables are created automatically according to received data. If there are multiple super tables in your case, please try to adjust the part of creating table automatically. + + + + +**Program Inventory** + +| Class | Description | +| ---------------- | ----------------------------------------------------------------------------------------------------- | +| FastWriteExample | Main Program | +| ReadTask | Read data from simulated data source and put into a queue according to the hash value of table name | +| WriteTask | Read data from Queue, compose a wirte batch and write into TDengine | +| MockDataSource | Generate data for some sub tables of super table meters | +| SQLWriter | WriteTask uses this class to compose SQL, create table automatically, check SQL length and write data | +| StmtWriter | Write in Parameter binding mode (Not finished yet) | +| DataBaseMonitor | Calculate the writing speed and output on console every 10 seconds | + +Below is the list of complete code of the classes in above table and more detailed description. + +

+FastWriteExample +The main Program is responsible for: + +1. Create message queues +2. Start writing threads +3. Start reading threads +4. Otuput writing speed every 10 seconds + +The main program provides 4 parameters for tuning: + +1. The number of reading threads, default value is 1 +2. The number of writing threads, default alue is 2 +3. The total number of tables in the generated data, default value is 1000. These tables are distributed evenly across all writing threads. If the number of tables is very big, it will cost much time to firstly create these tables. +4. The batch size of single write, default value is 3,000 + +The capacity of message queue also impacts performance and can be tuned by modifying program. Normally it's always better to have a larger message queue. A larger message queue means lower possibility of being blocked when enqueueing and higher throughput. But a larger message queue consumes more memory space. The default value used in the sample programs is already big enoug. + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/FastWriteExample.java}} +``` + +
+ +
+ReadTask + +ReadTask reads data from data source. Each ReadTask is associated with a simulated data source, each data source generates data for a group of specific tables, and the data of any table is only generated from a single specific data source. + +ReadTask puts data in message queue in blocking mode. That means, the putting operation is blocked if the message queue is full. + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/ReadTask.java}} +``` + +
+ +
+WriteTask + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/WriteTask.java}} +``` + +
+ +
+ +MockDataSource + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/MockDataSource.java}} +``` + +
+ +
+ +SQLWriter + +SQLWriter class encapsulates the logic of composing SQL and writing data. Please be noted that the tables have not been created before writing, but are created automatically when catching the exception of table doesn't exist. For other exceptions caught, the SQL which caused the exception are logged for you to debug. + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/SQLWriter.java}} +``` + +
+ +
+ +DataBaseMonitor + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/DataBaseMonitor.java}} +``` + +
+ +**Steps to Launch** + +
+Launch Java Sample Program + +You need to set environment variable `TDENGINE_JDBC_URL` before launching the program. If TDengine Server is setup on localhost, then the default value for user name, password and port can be used, like below: + +``` +TDENGINE_JDBC_URL="jdbc:TAOS://localhost:6030?user=root&password=taosdata" +``` + +**Launch in IDE** + +1. Clone TDengine repolitory + ``` + git clone git@github.com:taosdata/TDengine.git --depth 1 + ``` +2. Use IDE to open `docs/examples/java` directory +3. Configure environment variable `TDENGINE_JDBC_URL`, you can also configure it before launching the IDE, if so you can skip this step. +4. Run class `com.taos.example.highvolume.FastWriteExample` + +**Launch on server** + +If you want to launch the sample program on a remote server, please follow below steps: + +1. Package the sample programs. Execute below command under directory `TDengine/docs/examples/java` : + ``` + mvn package + ``` +2. Create `examples/java` directory on the server + ``` + mkdir -p examples/java + ``` +3. Copy dependencies (below commands assume you are working on a local Windows host and try to launch on a remote Linux host) + - Copy dependent packages + ``` + scp -r .\target\lib @:~/examples/java + ``` + - Copy the jar of sample programs + ``` + scp -r .\target\javaexample-1.0.jar @:~/examples/java + ``` +4. Configure environment variable + Edit `~/.bash_profile` or `~/.bashrc` and add below: + + ``` + export TDENGINE_JDBC_URL="jdbc:TAOS://localhost:6030?user=root&password=taosdata" + ``` + + If your TDengine server is not deployed on localhost or doesn't use default port, you need to change the above URL to correct value in your environment. + +5. Launch the sample program + + ``` + java -classpath lib/*:javaexample-1.0.jar com.taos.example.highvolume.FastWriteExample + ``` + +6. The sample program doesn't exit unless you press CTRL + C to terminate it. + Below is the output of running on a server of 16 cores, 64GB memory and SSD hard disk. + + ``` + root@vm85$ java -classpath lib/*:javaexample-1.0.jar com.taos.example.highvolume.FastWriteExample 2 12 + 18:56:35.896 [main] INFO c.t.e.highvolume.FastWriteExample - readTaskCount=2, writeTaskCount=12 tableCount=1000 maxBatchSize=3000 + 18:56:36.011 [WriteThread-0] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.015 [WriteThread-0] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.021 [WriteThread-1] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.022 [WriteThread-1] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.031 [WriteThread-2] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.032 [WriteThread-2] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.041 [WriteThread-3] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.042 [WriteThread-3] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.093 [WriteThread-4] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.094 [WriteThread-4] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.099 [WriteThread-5] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.100 [WriteThread-5] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.100 [WriteThread-6] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.101 [WriteThread-6] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.103 [WriteThread-7] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.104 [WriteThread-7] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.105 [WriteThread-8] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.107 [WriteThread-8] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.108 [WriteThread-9] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.109 [WriteThread-9] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.156 [WriteThread-10] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.157 [WriteThread-11] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.158 [WriteThread-10] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.158 [ReadThread-0] INFO com.taos.example.highvolume.ReadTask - started + 18:56:36.158 [ReadThread-1] INFO com.taos.example.highvolume.ReadTask - started + 18:56:36.158 [WriteThread-11] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:46.369 [main] INFO c.t.e.highvolume.FastWriteExample - count=18554448 speed=1855444 + 18:56:56.946 [main] INFO c.t.e.highvolume.FastWriteExample - count=39059660 speed=2050521 + 18:57:07.322 [main] INFO c.t.e.highvolume.FastWriteExample - count=59403604 speed=2034394 + 18:57:18.032 [main] INFO c.t.e.highvolume.FastWriteExample - count=80262938 speed=2085933 + 18:57:28.432 [main] INFO c.t.e.highvolume.FastWriteExample - count=101139906 speed=2087696 + 18:57:38.921 [main] INFO c.t.e.highvolume.FastWriteExample - count=121807202 speed=2066729 + 18:57:49.375 [main] INFO c.t.e.highvolume.FastWriteExample - count=142952417 speed=2114521 + 18:58:00.689 [main] INFO c.t.e.highvolume.FastWriteExample - count=163650306 speed=2069788 + 18:58:11.646 [main] INFO c.t.e.highvolume.FastWriteExample - count=185019808 speed=2136950 + ``` + +
+ +

^XlGsS=*C#S+&u*$qj2pa&{Anuee%ix>^OE% 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 z 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

+ + +**Program Inventory** + +Sample programs in Python uses multi-process and cross-process message queues. + +| Function/CLass | Description | +| ---------------------------- | --------------------------------------------------------------------------- | +| main Function | Program entry point, create child processes and message queues | +| run_monitor_process Function | Create database, super table, calculate writing speed and output to console | +| run_read_task Function | Read data and distribute to message queues | +| MockDataSource Class | Simulate data source, return next 1,000 rows of each table | +| run_write_task Function | Read as much as possible data from message queue and write in batch | +| SQLWriter Class | Write in SQL and create table utomatically | +| StmtWriter Class | Write in parameter binding mode (not finished yet) | + +
+main function + +`main` function is responsible for creating message queues and fork child processes, there are 3 kinds of child processes: + +1. Monitoring process, initializes database and calculating writing speed +2. Reading process (n), reads data from data source +3. Writing process (m), wirtes data into TDengine + +`main` function provides 5 parameters: + +1. The number of reading tasks, default value is 1 +2. The number of writing tasks, default value is 1 +3. The number of tables, default value is 1,000 +4. The capacity of message queue, default value is 1,000,000 bytes +5. The batch size in single write, default value is 3000 + +```python +{{#include docs/examples/python/fast_write_example.py:main}} +``` + +
+ +
+run_monitor_process + +Monitoring process initilizes database and monitoring writing speed. + +```python +{{#include docs/examples/python/fast_write_example.py:monitor}} +``` + +
+ +
+ +run_read_task function + +Reading process reads data from other data system and distributes to the message queue allocated for it. + +```python +{{#include docs/examples/python/fast_write_example.py:read}} +``` + +
+ +
+ +MockDataSource + +Below is the simulated data source, we assume table name exists in each generated data. + +```python +{{#include docs/examples/python/mockdatasource.py}} +``` + +
+ +
+run_write_task function + +Writing process tries to read as much as possible data from message queue and writes in batch. + +```python +{{#include docs/examples/python/fast_write_example.py:write}} +``` + +
+ +
+ +SQLWriter class encapsulates the logic of composing SQL and writing data. Please be noted that the tables have not been created before writing, but are created automatically when catching the exception of table doesn't exist. For other exceptions caught, the SQL which caused the exception are logged for you to debug. This class also checks the SQL length, if the SQL length is closed to `maxSQLLength` the SQL will be executed immediately. To improve writing efficiency, it's better to increase `maxSQLLength` properly. + +SQLWriter + +```python +{{#include docs/examples/python/sql_writer.py}} +``` + +
+ +**Steps to Launch** + +
+ +Launch Sample Program in Python + +1. Prerequisities + + - TDengine client driver has been installed + - Python3 has been installed, the the version >= 3.8 + - TDengine Python connector `taospy` has been installed + +2. Install faster-fifo to replace python builtin multiprocessing.Queue + + ``` + pip3 install faster-fifo + ``` + +3. Click the "Copy" in the above sample programs to copy `fast_write_example.py` 、 `sql_writer.py` and `mockdatasource.py`. + +4. Execute the program + + ``` + python3 fast_write_example.py + ``` + + Below is the output of running on a server of 16 cores, 64GB memory and SSD hard disk. + + ``` + root@vm85$ python3 fast_write_example.py 8 8 + 2022-07-14 19:13:45,869 [root] - READ_TASK_COUNT=8, WRITE_TASK_COUNT=8, TABLE_COUNT=1000, QUEUE_SIZE=1000000, MAX_BATCH_SIZE=3000 + 2022-07-14 19:13:48,882 [root] - WriteTask-0 started with pid 718347 + 2022-07-14 19:13:48,883 [root] - WriteTask-1 started with pid 718348 + 2022-07-14 19:13:48,884 [root] - WriteTask-2 started with pid 718349 + 2022-07-14 19:13:48,884 [root] - WriteTask-3 started with pid 718350 + 2022-07-14 19:13:48,885 [root] - WriteTask-4 started with pid 718351 + 2022-07-14 19:13:48,885 [root] - WriteTask-5 started with pid 718352 + 2022-07-14 19:13:48,886 [root] - WriteTask-6 started with pid 718353 + 2022-07-14 19:13:48,886 [root] - WriteTask-7 started with pid 718354 + 2022-07-14 19:13:48,887 [root] - ReadTask-0 started with pid 718355 + 2022-07-14 19:13:48,888 [root] - ReadTask-1 started with pid 718356 + 2022-07-14 19:13:48,889 [root] - ReadTask-2 started with pid 718357 + 2022-07-14 19:13:48,889 [root] - ReadTask-3 started with pid 718358 + 2022-07-14 19:13:48,890 [root] - ReadTask-4 started with pid 718359 + 2022-07-14 19:13:48,891 [root] - ReadTask-5 started with pid 718361 + 2022-07-14 19:13:48,892 [root] - ReadTask-6 started with pid 718364 + 2022-07-14 19:13:48,893 [root] - ReadTask-7 started with pid 718365 + 2022-07-14 19:13:56,042 [DataBaseMonitor] - count=6676310 speed=667631.0 + 2022-07-14 19:14:06,196 [DataBaseMonitor] - count=20004310 speed=1332800.0 + 2022-07-14 19:14:16,366 [DataBaseMonitor] - count=32290310 speed=1228600.0 + 2022-07-14 19:14:26,527 [DataBaseMonitor] - count=44438310 speed=1214800.0 + 2022-07-14 19:14:36,673 [DataBaseMonitor] - count=56608310 speed=1217000.0 + 2022-07-14 19:14:46,834 [DataBaseMonitor] - count=68757310 speed=1214900.0 + 2022-07-14 19:14:57,280 [DataBaseMonitor] - count=80992310 speed=1223500.0 + 2022-07-14 19:15:07,689 [DataBaseMonitor] - count=93805310 speed=1281300.0 + 2022-07-14 19:15:18,020 [DataBaseMonitor] - count=106111310 speed=1230600.0 + 2022-07-14 19:15:28,356 [DataBaseMonitor] - count=118394310 speed=1228300.0 + 2022-07-14 19:15:38,690 [DataBaseMonitor] - count=130742310 speed=1234800.0 + 2022-07-14 19:15:49,000 [DataBaseMonitor] - count=143051310 speed=1230900.0 + 2022-07-14 19:15:59,323 [DataBaseMonitor] - count=155276310 speed=1222500.0 + 2022-07-14 19:16:09,649 [DataBaseMonitor] - count=167603310 speed=1232700.0 + 2022-07-14 19:16:19,995 [DataBaseMonitor] - count=179976310 speed=1237300.0 + ``` + +
+ +:::note +Don't establish connection to TDengine in the parent process if using Python connector in multi-process way, otherwise all the connections in child processes are blocked always. This is a known issue. + +::: + +
+
diff --git a/docs/zh/07-develop/03-insert-data/05-high-volume.md b/docs/zh/07-develop/03-insert-data/05-high-volume.md new file mode 100644 index 0000000000..b8647b6ad7 --- /dev/null +++ b/docs/zh/07-develop/03-insert-data/05-high-volume.md @@ -0,0 +1,440 @@ +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; + +# 高效写入 + +本节介绍如何高效地向 TDengine 写入数据。 + +## 高效写入原理 {#principle} + +### 客户端程序的角度 {#application-view} + +从客户端程序的角度来说,高效写入数据要考虑以下几个因素: + +1. 单次写入的数据量。一般来讲,每批次写入的数据量越大越高效(但超过一定阈值其优势会消失)。使用 SQL 写入 TDengine 时,尽量在一条 SQL 中拼接更多数据。目前,TDengine 支持的一条 SQL 的最大长度为 1,048,576(1M)个字符。可通过配置客户端参数 maxSQLLength(默认值为 65480)进行修改。 +2. 并发连接数。一般来讲,同时写入数据的并发连接数越多写入越高效(但超过一定阈值反而会下降,取决于服务端处理能力)。 +3. 数据在不同表(或子表)之间的分布,即要写入数据的相邻性。一般来说,每批次只向同一张表(或子表)写入数据比向多张表(或子表)写入数据要更高效; +4. 写入方式。一般来讲: + - 参数绑定写入比 SQL 写入更高效。因参数绑定方式避免了 SQL 解析。(但增加了 C 接口的调用次数,对于连接器也有性能损耗)。 + - SQL 写入不自动建表比自动建表更高效。因自动建表要频繁检查表是否存在 + - SQL 写入比无模式写入更高效。因无模式写入会自动建表且支持动态更改表结构 + +客户端程序要充分且恰当地利用以上几个因素。在单次写入中尽量只向同一张表(或子表)写入数据,每批次写入的数据量经过测试和调优设定为一个最适合当前系统处理能力的数值,并发写入的连接数同样经过测试和调优后设定为一个最适合当前系统处理能力的数值,以实现在当前系统中的最佳写入速度。 + +### 数据源的角度 {#datasource-view} + +客户端程序通常需要从数据源读数据再写入 TDengine。从数据源角度来说,以下几种情况需要在读线程和写线程之间增加队列: + +1. 有多个数据源,单个数据源生成数据的速度远小于单线程写入的速度,但数据量整体比较大。此时队列的作用是把多个数据源的数据汇聚到一起,增加单次写入的数据量。 +2. 单个数据源生成数据的速度远大于单线程写入的速度。此时队列的作用是增加写入的并发度。 +3. 单张表的数据分散在多个数据源。此时队列的作用是将同一张表的数据提前汇聚到一起,提高写入时数据的相邻性。 + +如果写应用的数据源是 Kafka, 写应用本身即 Kafka 的消费者,则可利用 Kafka 的特性实现高效写入。比如: + +1. 将同一张表的数据写到同一个 Topic 的同一个 Partition,增加数据的相邻性 +2. 通过订阅多个 Topic 实现数据汇聚 +3. 通过增加 Consumer 线程数增加写入的并发度 +4. 通过增加每次 fetch 的最大数据量来增加单次写入的最大数据量 + +### 服务器配置的角度 {#setting-view} + +从服务器配置的角度来说,也有很多优化写入性能的方法。 + +如果总表数不多(远小于核数乘以1000), 且无论怎么调节客户端程序,taosd 进程的 CPU 使用率都很低,那么很可能是因为表在各个 vgroup 分布不均。比如:数据库总表数是 1000 且 minTablesPerVnode 设置的也是 1000,那么所有的表都会分布在 1 个 vgroup 上。此时如果将 minTablesPerVnode 和 tablelncStepPerVnode 都设置成 100, 则可将表分布至 10 个 vgroup。(假设 maxVgroupsPerDb 大于等于 10)。 + +如果总表数比较大(比如大于500万),适当增加 maxVgroupsPerDb 也能显著提高建表的速度。maxVgroupsPerDb 默认值为 0, 自动配置为 CPU 的核数。 如果表的数量巨大,也建议调节 maxTablesPerVnode 参数,以免超过单个 vnode 建表的上限。 + +更多调优参数,请参考[性能优化](../../../operation/optimize)和[配置参考](../../../reference/config)部分。 + +## 高效写入示例 {#sample-code} + +### 场景设计 {#scenario} + +下面的示例程序展示了如何高效写入数据,场景设计如下: + +- TDengine 客户端程序从其它数据源不断读入数据,在示例程序中采用生成模拟数据的方式来模拟读取数据源 +- 单个连接向 TDengine 写入的速度无法与读数据的速度相匹配,因此客户端程序启动多个线程,每个线程都建立了与 TDengine 的连接,每个线程都有一个独占的固定大小的消息队列 +- 客户端程序将接收到的数据根据所属的表名(或子表名)HASH 到不同的线程,即写入该线程所对应的消息队列,以此确保属于某个表(或子表)的数据一定会被一个固定的线程处理 +- 各个子线程在将所关联的消息队列中的数据读空后或者读取数据量达到一个预定的阈值后将该批数据写入 TDengine,并继续处理后面接收到的数据 + +![TDengine 高效写入示例场景的线程模型](highvolume.webp) + +### 示例代码 {#code} + +这一部分是针对以上场景的示例代码。对于其它场景高效写入原理相同,不过代码需要适当修改。 + +本示例代码假设源数据属于同一张超级表(meters)的不同子表。程序在开始写入数据之前已经在 test 库创建了这个超级表。对于子表,将根据收到的数据,由应用程序自动创建。如果实际场景是多个超级表,只需修改写任务自动建表的代码。 + + + + +**程序清单** + +| 类名 | 功能说明 | +| ---------------- | --------------------------------------------------------------------------- | +| FastWriteExample | 主程序 | +| ReadTask | 从模拟源中读取数据,将表名经过 hash 后得到 Queue 的 index,写入对应的 Queue | +| WriteTask | 从 Queue 中获取数据,组成一个 Batch,写入 TDengine | +| MockDataSource | 模拟生成一定数量 meters 子表的数据 | +| SQLWriter | WriteTask 依赖这个类完成 SQL 拼接、自动建表、 SQL 写入、SQL 长度检查 | +| StmtWriter | 实现参数绑定方式批量写入(暂未完成) | +| DataBaseMonitor | 统计写入速度,并每隔 10 秒把当前写入速度打印到控制台 | + + +以下是各类的完整代码和更详细的功能说明。 + +
+FastWriteExample +主程序负责: + +1. 创建消息队列 +2. 启动写线程 +3. 启动读线程 +4. 每隔 10 秒统计一次写入速度 + +主程序默认暴露了 4 个参数,每次启动程序都可调节,用于测试和调优: + +1. 读线程个数。默认为 1。 +2. 写线程个数。默认为 3。 +3. 模拟生成的总表数。默认为 1000。将会平分给各个读线程。如果总表数较大,建表需要花费较长,开始统计的写入速度可能较慢。 +4. 每批最多写入记录数量。默认为 3000。 + +队列容量(taskQueueCapacity)也是与性能有关的参数,可通过修改程序调节。一般来讲,队列容量越大,入队被阻塞的概率越小,队列的吞吐量越大,但是内存占用也会越大。 示例程序默认值已经设置地足够大。 + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/FastWriteExample.java}} +``` + +
+ +
+ReadTask + +读任务负责从数据源读数据。每个读任务都关联了一个模拟数据源。每个模拟数据源可生成一点数量表的数据。不同的模拟数据源生成不同表的数据。 + +读任务采用阻塞的方式写消息队列。也就是说,一旦队列满了,写操作就会阻塞。 + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/ReadTask.java}} +``` + +
+ +
+WriteTask + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/WriteTask.java}} +``` + +
+ +
+ +MockDataSource + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/MockDataSource.java}} +``` + +
+ +
+ +SQLWriter + +SQLWriter 类封装了拼 SQL 和写数据的逻辑。注意,所有的表都没有提前创建,而是在 catch 到表不存在异常的时候,再以超级表为模板批量建表,然后重新执行 INSERT 语句。对于其它异常,这里简单地记录当时执行的 SQL 语句到日志中,你也可以记录更多线索到日志,已便排查错误和故障恢复。 + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/SQLWriter.java}} +``` + +
+ +
+ +DataBaseMonitor + +```java +{{#include docs/examples/java/src/main/java/com/taos/example/highvolume/DataBaseMonitor.java}} +``` + +
+ +**执行步骤** + +
+执行 Java 示例程序 + +执行程序前需配置环境变量 `TDENGINE_JDBC_URL`。如果 TDengine Server 部署在本机,且用户名、密码和端口都是默认值,那么可配置: + +``` +TDENGINE_JDBC_URL="jdbc:TAOS://localhost:6030?user=root&password=taosdata" +``` + +**本地集成开发环境执行示例程序** + +1. clone TDengine 仓库 + ``` + git clone git@github.com:taosdata/TDengine.git --depth 1 + ``` +2. 用集成开发环境打开 `docs/examples/java` 目录。 +3. 在开发环境中配置环境变量 `TDENGINE_JDBC_URL`。如果已配置了全局的环境变量 `TDENGINE_JDBC_URL` 可跳过这一步。 +4. 运行类 `com.taos.example.highvolume.FastWriteExample`。 + +**远程服务器上执行示例程序** + +若要在服务器上执行示例程序,可按照下面的步骤操作: + +1. 打包示例代码。在目录 TDengine/docs/examples/java 下执行: + ``` + mvn package + ``` +2. 远程服务器上创建 examples 目录: + ``` + mkdir -p examples/java + ``` +3. 复制依赖到服务器指定目录: + - 复制依赖包,只用复制一次 + ``` + scp -r .\target\lib @:~/examples/java + ``` + - 复制本程序的 jar 包,每次更新代码都需要复制 + ``` + scp -r .\target\javaexample-1.0.jar @:~/examples/java + ``` +4. 配置环境变量。 + 编辑 `~/.bash_profile` 或 `~/.bashrc` 添加如下内容例如: + + ``` + export TDENGINE_JDBC_URL="jdbc:TAOS://localhost:6030?user=root&password=taosdata" + ``` + + 以上使用的是本地部署 TDengine Server 时默认的 JDBC URL。你需要根据自己的实际情况更改。 + +5. 用 java 命令启动示例程序,命令模板: + + ``` + java -classpath lib/*:javaexample-1.0.jar com.taos.example.highvolume.FastWriteExample + ``` + +6. 结束测试程序。测试程序不会自动结束,在获取到当前配置下稳定的写入速度后,按 CTRL + C 结束程序。 + 下面是一次实际运行的日志输出,机器配置 16核 + 64G + 固态硬盘。 + + ``` + root@vm85$ java -classpath lib/*:javaexample-1.0.jar com.taos.example.highvolume.FastWriteExample 2 12 + 18:56:35.896 [main] INFO c.t.e.highvolume.FastWriteExample - readTaskCount=2, writeTaskCount=12 tableCount=1000 maxBatchSize=3000 + 18:56:36.011 [WriteThread-0] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.015 [WriteThread-0] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.021 [WriteThread-1] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.022 [WriteThread-1] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.031 [WriteThread-2] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.032 [WriteThread-2] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.041 [WriteThread-3] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.042 [WriteThread-3] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.093 [WriteThread-4] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.094 [WriteThread-4] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.099 [WriteThread-5] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.100 [WriteThread-5] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.100 [WriteThread-6] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.101 [WriteThread-6] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.103 [WriteThread-7] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.104 [WriteThread-7] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.105 [WriteThread-8] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.107 [WriteThread-8] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.108 [WriteThread-9] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.109 [WriteThread-9] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.156 [WriteThread-10] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.157 [WriteThread-11] INFO c.taos.example.highvolume.WriteTask - started + 18:56:36.158 [WriteThread-10] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:36.158 [ReadThread-0] INFO com.taos.example.highvolume.ReadTask - started + 18:56:36.158 [ReadThread-1] INFO com.taos.example.highvolume.ReadTask - started + 18:56:36.158 [WriteThread-11] INFO c.taos.example.highvolume.SQLWriter - maxSQLLength=1048576 + 18:56:46.369 [main] INFO c.t.e.highvolume.FastWriteExample - count=18554448 speed=1855444 + 18:56:56.946 [main] INFO c.t.e.highvolume.FastWriteExample - count=39059660 speed=2050521 + 18:57:07.322 [main] INFO c.t.e.highvolume.FastWriteExample - count=59403604 speed=2034394 + 18:57:18.032 [main] INFO c.t.e.highvolume.FastWriteExample - count=80262938 speed=2085933 + 18:57:28.432 [main] INFO c.t.e.highvolume.FastWriteExample - count=101139906 speed=2087696 + 18:57:38.921 [main] INFO c.t.e.highvolume.FastWriteExample - count=121807202 speed=2066729 + 18:57:49.375 [main] INFO c.t.e.highvolume.FastWriteExample - count=142952417 speed=2114521 + 18:58:00.689 [main] INFO c.t.e.highvolume.FastWriteExample - count=163650306 speed=2069788 + 18:58:11.646 [main] INFO c.t.e.highvolume.FastWriteExample - count=185019808 speed=2136950 + ``` + +
+ +
+ + +**程序清单** + +Python 示例程序中采用了多进程的架构,并使用了跨进程的消息队列。 + +| 函数或类 | 功能说明 | +| ------------------------ | -------------------------------------------------------------------- | +| main 函数 | 程序入口, 创建各个子进程和消息队列 | +| run_monitor_process 函数 | 创建数据库,超级表,统计写入速度并定时打印到控制台 | +| run_read_task 函数 | 读进程主要逻辑,负责从其它数据系统读数据,并分发数据到为之分配的队列 | +| MockDataSource 类 | 模拟数据源, 实现迭代器接口,每次批量返回每张表的接下来 1000 条数据 | +| run_write_task 函数 | 写进程主要逻辑。每次从队列中取出尽量多的数据,并批量写入 | +| SQLWriter类 | SQL 写入和自动建表 | +| StmtWriter 类 | 实现参数绑定方式批量写入(暂未完成) | + + +
+main 函数 + +main 函数负责创建消息队列和启动子进程,子进程有 3 类: + +1. 1 个监控进程,负责数据库初始化和统计写入速度 +2. n 个读进程,负责从其它数据系统读数据 +3. m 个写进程,负责写数据库 + +main 函数可以接收 5 个启动参数,依次是: + +1. 读任务(进程)数, 默认为 1 +2. 写任务(进程)数, 默认为 1 +3. 模拟生成的总表数,默认为 1000 +4. 队列大小(单位字节),默认为 1000000 +5. 每批最多写入记录数量, 默认为 3000 + +```python +{{#include docs/examples/python/fast_write_example.py:main}} +``` + +
+ +
+run_monitor_process + +监控进程负责初始化数据库,并监控当前的写入速度。 + +```python +{{#include docs/examples/python/fast_write_example.py:monitor}} +``` + +
+ +
+ +run_read_task 函数 + +读进程,负责从其它数据系统读数据,并分发数据到为之分配的队列。 + +```python +{{#include docs/examples/python/fast_write_example.py:read}} +``` + +
+ +
+ +MockDataSource + +以下是模拟数据源的实现,我们假设数据源生成的每一条数据都带有目标表名信息。实际中你可能需要一定的规则确定目标表名。 + +```python +{{#include docs/examples/python/mockdatasource.py}} +``` + +
+ +
+run_write_task 函数 + +写进程每次从队列中取出尽量多的数据,并批量写入。 + +```python +{{#include docs/examples/python/fast_write_example.py:write}} +``` + +
+ +
+ +SQLWriter 类封装了拼 SQL 和写数据的逻辑。所有的表都没有提前创建,而是在发生表不存在错误的时候,再以超级表为模板批量建表,然后重新执行 INSERT 语句。对于其它错误会记录当时执行的 SQL, 以便排查错误和故障恢复。这个类也对 SQL 是否超过最大长度限制做了检查,如果接近 SQL 最大长度限制(maxSQLLength),将会立即执行 SQL。为了减少 SQL 此时,建议将 maxSQLLength 适当调大。 + +SQLWriter + +```python +{{#include docs/examples/python/sql_writer.py}} +``` + +
+ +**执行步骤** + +
+ +执行 Python 示例程序 + +1. 前提条件 + + - 已安装 TDengine 客户端驱动 + - 已安装 Python3, 推荐版本 >= 3.8 + - 已安装 taospy + +2. 安装 faster-fifo 代替 python 内置的 multiprocessing.Queue + + ``` + pip3 install faster-fifo + ``` + +3. 点击上面的“查看源码”链接复制 `fast_write_example.py` 、 `sql_writer.py` 和 `mockdatasource.py` 三个文件。 + +4. 执行示例程序 + + ``` + python3 fast_write_example.py + ``` + + 下面是一次实际运行的输出, 机器配置 16核 + 64G + 固态硬盘。 + + ``` + root@vm85$ python3 fast_write_example.py 8 8 + 2022-07-14 19:13:45,869 [root] - READ_TASK_COUNT=8, WRITE_TASK_COUNT=8, TABLE_COUNT=1000, QUEUE_SIZE=1000000, MAX_BATCH_SIZE=3000 + 2022-07-14 19:13:48,882 [root] - WriteTask-0 started with pid 718347 + 2022-07-14 19:13:48,883 [root] - WriteTask-1 started with pid 718348 + 2022-07-14 19:13:48,884 [root] - WriteTask-2 started with pid 718349 + 2022-07-14 19:13:48,884 [root] - WriteTask-3 started with pid 718350 + 2022-07-14 19:13:48,885 [root] - WriteTask-4 started with pid 718351 + 2022-07-14 19:13:48,885 [root] - WriteTask-5 started with pid 718352 + 2022-07-14 19:13:48,886 [root] - WriteTask-6 started with pid 718353 + 2022-07-14 19:13:48,886 [root] - WriteTask-7 started with pid 718354 + 2022-07-14 19:13:48,887 [root] - ReadTask-0 started with pid 718355 + 2022-07-14 19:13:48,888 [root] - ReadTask-1 started with pid 718356 + 2022-07-14 19:13:48,889 [root] - ReadTask-2 started with pid 718357 + 2022-07-14 19:13:48,889 [root] - ReadTask-3 started with pid 718358 + 2022-07-14 19:13:48,890 [root] - ReadTask-4 started with pid 718359 + 2022-07-14 19:13:48,891 [root] - ReadTask-5 started with pid 718361 + 2022-07-14 19:13:48,892 [root] - ReadTask-6 started with pid 718364 + 2022-07-14 19:13:48,893 [root] - ReadTask-7 started with pid 718365 + 2022-07-14 19:13:56,042 [DataBaseMonitor] - count=6676310 speed=667631.0 + 2022-07-14 19:14:06,196 [DataBaseMonitor] - count=20004310 speed=1332800.0 + 2022-07-14 19:14:16,366 [DataBaseMonitor] - count=32290310 speed=1228600.0 + 2022-07-14 19:14:26,527 [DataBaseMonitor] - count=44438310 speed=1214800.0 + 2022-07-14 19:14:36,673 [DataBaseMonitor] - count=56608310 speed=1217000.0 + 2022-07-14 19:14:46,834 [DataBaseMonitor] - count=68757310 speed=1214900.0 + 2022-07-14 19:14:57,280 [DataBaseMonitor] - count=80992310 speed=1223500.0 + 2022-07-14 19:15:07,689 [DataBaseMonitor] - count=93805310 speed=1281300.0 + 2022-07-14 19:15:18,020 [DataBaseMonitor] - count=106111310 speed=1230600.0 + 2022-07-14 19:15:28,356 [DataBaseMonitor] - count=118394310 speed=1228300.0 + 2022-07-14 19:15:38,690 [DataBaseMonitor] - count=130742310 speed=1234800.0 + 2022-07-14 19:15:49,000 [DataBaseMonitor] - count=143051310 speed=1230900.0 + 2022-07-14 19:15:59,323 [DataBaseMonitor] - count=155276310 speed=1222500.0 + 2022-07-14 19:16:09,649 [DataBaseMonitor] - count=167603310 speed=1232700.0 + 2022-07-14 19:16:19,995 [DataBaseMonitor] - count=179976310 speed=1237300.0 + ``` + +
+ +:::note +使用 Python 连接器多进程连接 TDengine 的时候,有一个限制:不能在父进程中建立连接,所有连接只能在子进程中创建。 +如果在父进程中创建连接,子进程再创建连接就会一直阻塞。这是个已知问题。 + +::: + +
+
+ + From 83272a0ac56ed71cbf1f2b0c64c6e9a3eb00be27 Mon Sep 17 00:00:00 2001 From: "wenzhouwww@live.cn" Date: Fri, 26 Aug 2022 18:38:04 +0800 Subject: [PATCH 47/47] docs: updagte taos shell as TDengine CLI for 3.0 version ,include in taos.cfg --- docs/en/10-deployment/01-deploy.md | 2 +- docs/en/14-reference/11-docker/index.md | 2 +- docs/en/14-reference/12-config/index.md | 2 +- docs/zh/07-develop/03-insert-data/01-sql-writing.mdx | 2 +- docs/zh/07-develop/04-query-data/index.mdx | 4 ++-- docs/zh/10-deployment/01-deploy.md | 4 ++-- docs/zh/10-deployment/03-k8s.md | 2 +- docs/zh/14-reference/11-docker/index.md | 6 +++--- docs/zh/17-operation/08-export.md | 2 +- examples/JDBC/JDBCDemo/README-jdbc-windows.md | 2 +- examples/nodejs/README-win.md | 2 +- packaging/cfg/taos.cfg | 2 +- packaging/docker/README.md | 6 +++--- tests/script/tsim/query/crash_sql.sim | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/en/10-deployment/01-deploy.md b/docs/en/10-deployment/01-deploy.md index bfbb547bd4..b20bbb5f59 100644 --- a/docs/en/10-deployment/01-deploy.md +++ b/docs/en/10-deployment/01-deploy.md @@ -114,7 +114,7 @@ The above process can be repeated to add more dnodes in the cluster. Any node that is in the cluster and online can be the firstEp of new nodes. Nodes use the firstEp parameter only when joining a cluster for the first time. After a node has joined the cluster, it stores the latest mnode in its end point list and no longer makes use of firstEp. -However, firstEp is used by clients that connect to the cluster. For example, if you run `taos shell` without arguments, it connects to the firstEp by default. +However, firstEp is used by clients that connect to the cluster. For example, if you run `TDengine CLI` without arguments, it connects to the firstEp by default. Two dnodes that are launched without a firstEp value operate independently of each other. It is not possible to add one dnode to the other dnode and form a cluster. It is also not possible to form two independent clusters into a new cluster. ::: diff --git a/docs/en/14-reference/11-docker/index.md b/docs/en/14-reference/11-docker/index.md index b3c3cddd9a..be1d72ff9c 100644 --- a/docs/en/14-reference/11-docker/index.md +++ b/docs/en/14-reference/11-docker/index.md @@ -72,7 +72,7 @@ Next, ensure the hostname "tdengine" is resolvable in `/etc/hosts`. echo 127.0.0.1 tdengine |sudo tee -a /etc/hosts ``` -Finally, the TDengine service can be accessed from the taos shell or any connector with "tdengine" as the server address. +Finally, the TDengine service can be accessed from the TDengine CLI or any connector with "tdengine" as the server address. ```shell taos -h tdengine -P 6030 diff --git a/docs/en/14-reference/12-config/index.md b/docs/en/14-reference/12-config/index.md index 532e16de5c..9cb2ef5125 100644 --- a/docs/en/14-reference/12-config/index.md +++ b/docs/en/14-reference/12-config/index.md @@ -344,7 +344,7 @@ The charset that takes effect is UTF-8. | Attribute | Description | | -------- | --------------------------------- | | Applicable | Server and Client | -| Meaning | The interval for taos shell to send heartbeat to mnode | +| Meaning | The interval for TDengine CLI to send heartbeat to mnode | | Unit | second | | Value Range | 1-120 | | Default Value | 3 | diff --git a/docs/zh/07-develop/03-insert-data/01-sql-writing.mdx b/docs/zh/07-develop/03-insert-data/01-sql-writing.mdx index 214cbdaa96..2920fa35a4 100644 --- a/docs/zh/07-develop/03-insert-data/01-sql-writing.mdx +++ b/docs/zh/07-develop/03-insert-data/01-sql-writing.mdx @@ -23,7 +23,7 @@ import PhpStmt from "./_php_stmt.mdx"; ## SQL 写入简介 -应用通过连接器执行 INSERT 语句来插入数据,用户还可以通过 TAOS Shell,手动输入 INSERT 语句插入数据。 +应用通过连接器执行 INSERT 语句来插入数据,用户还可以通过 TDengine CLI,手动输入 INSERT 语句插入数据。 ### 一次写入一条 下面这条 INSERT 就将一条记录写入到表 d1001 中: diff --git a/docs/zh/07-develop/04-query-data/index.mdx b/docs/zh/07-develop/04-query-data/index.mdx index c083c30c2c..92cb1906d9 100644 --- a/docs/zh/07-develop/04-query-data/index.mdx +++ b/docs/zh/07-develop/04-query-data/index.mdx @@ -52,7 +52,7 @@ Query OK, 2 row(s) in set (0.001100s) ### 示例一 -在 TAOS Shell,查找加利福尼亚州所有智能电表采集的电压平均值,并按照 location 分组。 +在 TDengine CLI,查找加利福尼亚州所有智能电表采集的电压平均值,并按照 location 分组。 ``` taos> SELECT AVG(voltage), location FROM meters GROUP BY location; @@ -65,7 +65,7 @@ Query OK, 2 rows in database (0.005995s) ### 示例二 -在 TAOS shell, 查找 groupId 为 2 的所有智能电表的记录条数,电流的最大值。 +在 TDengine CLI, 查找 groupId 为 2 的所有智能电表的记录条数,电流的最大值。 ``` taos> SELECT count(*), max(current) FROM meters where groupId = 2; diff --git a/docs/zh/10-deployment/01-deploy.md b/docs/zh/10-deployment/01-deploy.md index 8d8a2eb6d8..7629ed464e 100644 --- a/docs/zh/10-deployment/01-deploy.md +++ b/docs/zh/10-deployment/01-deploy.md @@ -71,7 +71,7 @@ serverPort 6030 ## 启动集群 -按照《立即开始》里的步骤,启动第一个数据节点,例如 h1.taosdata.com,然后执行 taos,启动 taos shell,从 shell 里执行命令“SHOW DNODES”,如下所示: +按照《立即开始》里的步骤,启动第一个数据节点,例如 h1.taosdata.com,然后执行 taos,启动 TDengine CLI,从 shell 里执行命令“SHOW DNODES”,如下所示: ``` taos> show dnodes; @@ -115,7 +115,7 @@ SHOW DNODES; 任何已经加入集群在线的数据节点,都可以作为后续待加入节点的 firstEp。 firstEp 这个参数仅仅在该数据节点首次加入集群时有作用,加入集群后,该数据节点会保存最新的 mnode 的 End Point 列表,不再依赖这个参数。 -接下来,配置文件中的 firstEp 参数就主要在客户端连接的时候使用了,例如 taos shell 如果不加参数,会默认连接由 firstEp 指定的节点。 +接下来,配置文件中的 firstEp 参数就主要在客户端连接的时候使用了,例如 TDengine CLI 如果不加参数,会默认连接由 firstEp 指定的节点。 两个没有配置 firstEp 参数的数据节点 dnode 启动后,会独立运行起来。这个时候,无法将其中一个数据节点加入到另外一个数据节点,形成集群。无法将两个独立的集群合并成为新的集群。 ::: diff --git a/docs/zh/10-deployment/03-k8s.md b/docs/zh/10-deployment/03-k8s.md index 5d512700b6..ff2d670ec2 100644 --- a/docs/zh/10-deployment/03-k8s.md +++ b/docs/zh/10-deployment/03-k8s.md @@ -366,7 +366,7 @@ kubectl scale statefulsets tdengine --replicas=1 ``` -在 taos shell 中的所有数据库操作将无法成功。 +在 TDengine CLI 中的所有数据库操作将无法成功。 ``` taos> show dnodes; diff --git a/docs/zh/14-reference/11-docker/index.md b/docs/zh/14-reference/11-docker/index.md index 743fc2d32f..d712e9aba8 100644 --- a/docs/zh/14-reference/11-docker/index.md +++ b/docs/zh/14-reference/11-docker/index.md @@ -32,7 +32,7 @@ taos> show databases; Query OK, 2 rows in database (0.033802s) ``` -因为运行在容器中的 TDengine 服务端使用容器的 hostname 建立连接,使用 taos shell 或者各种连接器(例如 JDBC-JNI)从容器外访问容器内的 TDengine 比较复杂,所以上述方式是访问容器中 TDengine 服务的最简单的方法,适用于一些简单场景。如果在一些复杂场景下想要从容器化使用 taos shell 或者各种连接器访问容器中的 TDengine 服务,请参考下一节。 +因为运行在容器中的 TDengine 服务端使用容器的 hostname 建立连接,使用 TDengine CLI 或者各种连接器(例如 JDBC-JNI)从容器外访问容器内的 TDengine 比较复杂,所以上述方式是访问容器中 TDengine 服务的最简单的方法,适用于一些简单场景。如果在一些复杂场景下想要从容器化使用 TDengine CLI 或者各种连接器访问容器中的 TDengine 服务,请参考下一节。 ## 在 host 网络上启动 TDengine @@ -75,7 +75,7 @@ docker run -d \ echo 127.0.0.1 tdengine |sudo tee -a /etc/hosts ``` -最后,可以从 taos shell 或者任意连接器以 "tdengine" 为服务端地址访问 TDengine 服务。 +最后,可以从 TDengine CLI 或者任意连接器以 "tdengine" 为服务端地址访问 TDengine 服务。 ```shell taos -h tdengine -P 6030 @@ -354,7 +354,7 @@ test-docker_td-2_1 /tini -- /usr/bin/entrypoi ... Up test-docker_td-3_1 /tini -- /usr/bin/entrypoi ... Up ``` -4. 用 taos shell 查看 dnodes +4. 用 TDengine CLI 查看 dnodes ```shell diff --git a/docs/zh/17-operation/08-export.md b/docs/zh/17-operation/08-export.md index ecc3b2f110..44247e28bd 100644 --- a/docs/zh/17-operation/08-export.md +++ b/docs/zh/17-operation/08-export.md @@ -7,7 +7,7 @@ description: 如何导出 TDengine 中的数据 ## 按表导出 CSV 文件 -如果用户需要导出一个表或一个 STable 中的数据,可在 taos shell 中运行: +如果用户需要导出一个表或一个 STable 中的数据,可在 TDengine CLI 中运行: ```sql select * from >> data.csv; diff --git a/examples/JDBC/JDBCDemo/README-jdbc-windows.md b/examples/JDBC/JDBCDemo/README-jdbc-windows.md index 17c5c8df00..5a781f40f7 100644 --- a/examples/JDBC/JDBCDemo/README-jdbc-windows.md +++ b/examples/JDBC/JDBCDemo/README-jdbc-windows.md @@ -129,7 +129,7 @@ https://www.taosdata.com/cn/all-downloads/ 192.168.236.136 td01 ``` -配置完成后,在命令行内使用taos shell连接server端 +配置完成后,在命令行内使用TDengine CLI连接server端 ```shell C:\TDengine>taos -h td01 diff --git a/examples/nodejs/README-win.md b/examples/nodejs/README-win.md index 75fec69413..e496be2f87 100644 --- a/examples/nodejs/README-win.md +++ b/examples/nodejs/README-win.md @@ -35,7 +35,7 @@ Python 2.7.18 下载地址:https://www.taosdata.com/cn/all-downloads/,选择一个合适的windows-client下载(client应该尽量与server端的版本保持一致) -使用client的taos shell连接server +使用client的TDengine CLI连接server ```shell >taos -h node5 diff --git a/packaging/cfg/taos.cfg b/packaging/cfg/taos.cfg index aae2e7c856..87f465fdb9 100644 --- a/packaging/cfg/taos.cfg +++ b/packaging/cfg/taos.cfg @@ -38,7 +38,7 @@ # The interval of dnode reporting status to mnode # statusInterval 1 -# The interval for taos shell to send heartbeat to mnode +# The interval for TDengine CLI to send heartbeat to mnode # shellActivityTimer 3 # The minimum sliding window time, milli-second diff --git a/packaging/docker/README.md b/packaging/docker/README.md index e41182f471..cb27d3bca6 100644 --- a/packaging/docker/README.md +++ b/packaging/docker/README.md @@ -47,7 +47,7 @@ taos> show databases; Query OK, 1 row(s) in set (0.002843s) ``` -Since TDengine use container hostname to establish connections, it's a bit more complex to use taos shell and native connectors(such as JDBC-JNI) with TDengine container instance. This is the recommended way to expose ports and use TDengine with docker in simple cases. If you want to use taos shell or taosc/connectors smoothly outside the `tdengine` container, see next use cases that match you need. +Since TDengine use container hostname to establish connections, it's a bit more complex to use TDengine CLI and native connectors(such as JDBC-JNI) with TDengine container instance. This is the recommended way to expose ports and use TDengine with docker in simple cases. If you want to use TDengine CLI or taosc/connectors smoothly outside the `tdengine` container, see next use cases that match you need. ### Start with host network @@ -87,7 +87,7 @@ docker run -d \ This command starts a docker container with TDengine server running and maps the container's TCP ports from 6030 to 6049 to the host's ports from 6030 to 6049 with TCP protocol and UDP ports range 6030-6039 to the host's UDP ports 6030-6039. If the host is already running TDengine server and occupying the same port(s), you need to map the container's port to a different unused port segment. (Please see TDengine 2.0 Port Description for details). In order to support TDengine clients accessing TDengine server services, both TCP and UDP ports need to be exposed by default(unless `rpcForceTcp` is set to `1`). -If you want to use taos shell or native connectors([JDBC-JNI](https://www.taosdata.com/cn/documentation/connector/java), or [driver-go](https://github.com/taosdata/driver-go)), you need to make sure the `TAOS_FQDN` is resolvable at `/etc/hosts` or with custom DNS service. +If you want to use TDengine CLI or native connectors([JDBC-JNI](https://www.taosdata.com/cn/documentation/connector/java), or [driver-go](https://github.com/taosdata/driver-go)), you need to make sure the `TAOS_FQDN` is resolvable at `/etc/hosts` or with custom DNS service. If you set the `TAOS_FQDN` to host's hostname, it will works as using `hosts` network like previous use case. Otherwise, like in `-e TAOS_FQDN=tdengine`, you can add the hostname record `tdengine` into `/etc/hosts` (use `127.0.0.1` here in host path, if use TDengine client/application in other hosts, you should set the right ip to the host eg. `192.168.10.1`(check the real ip in host with `hostname -i` or `ip route list default`) to make the TDengine endpoint resolvable): @@ -391,7 +391,7 @@ test_td-1_1 /usr/bin/entrypoint.sh taosd Up 6030/tcp, 6031/tcp, test_td-2_1 /usr/bin/entrypoint.sh taosd Up 6030/tcp, 6031/tcp, 6032/tcp, 6033/tcp, 6034/tcp, 6035/tcp, 6036/tcp, 6037/tcp, 6038/tcp, 6039/tcp, 6040/tcp, 6041/tcp, 6042/tcp ``` -Check dnodes with taos shell: +Check dnodes with TDengine CLI: ```bash $ docker-compose exec td-1 taos -s "show dnodes" diff --git a/tests/script/tsim/query/crash_sql.sim b/tests/script/tsim/query/crash_sql.sim index 169f2e7272..79a9165e66 100644 --- a/tests/script/tsim/query/crash_sql.sim +++ b/tests/script/tsim/query/crash_sql.sim @@ -76,7 +76,7 @@ sql insert into ct4 values ( '2022-05-21 01:01:01.000', NULL, NULL, NULL, NULL, print ================ start query ====================== -print ================ SQL used to cause taosd or taos shell crash +print ================ SQL used to cause taosd or TDengine CLI crash sql_error select sum(c1) ,count(c1) from ct4 group by c1 having sum(c10) between 0 and 1 ; #system sh/exec.sh -n dnode1 -s stop -x SIGINT